THE QUICK START

A good place
to start.

Pick a home for your tools. Connect your agents. Bring your feedback with you.

01 / SELF-HOST

Your server. One command.

Use Node 22 or later. The CLI selects Docker when its daemon is available, and prepares Node dependencies otherwise.

YOUR TERMINAL
npx @dupes/cli up feedback

Open localhost:3000. The public CLI stores data in feedback-data/ (the source checkout uses data/). Your initial admin password stays there. Sign in at /admin. Back up the database and keep credentials private.

This is the prepared public install command. Package publication is pending; the private preview can use the prepared CLI tarball instead.

Complete repository README →
02 / HOSTED

Keep your server time for other things.

Public hosted access is coming. Join the waitlist for availability. In local development, the hosted CLI uses your private platform URL and key.

YOUR TERMINAL
dupe up feedback --hosted --name "My workspace"

The result is saved to a private file with the instance URL, admin key and MCP endpoint.

Join the hosted waitlist
03 / THE CLI

One small command.

YOUR TERMINAL
dupe list
dupe up feedback
dupe mcp feedback --client codex

After npm ci, use npx dupe or the repository's CLI entry point. The CLI is Apache-2.0; Feedback and Forms are AGPL-3.0.

04 / FOR AGENTS

Read requests. Ship. Close the loop.

Provision a hosted workspace using authenticated POST /v1/instances. It returns the instance URL, admin API key and MCP endpoint.

YOUR TERMINAL
POST /v1/instances
Authorization: Bearer $DUPES_PLATFORM_API_KEY

{"app":"feedback","name":"My workspace"}

Keep your instance key in FEEDBACK_API_KEY. Print configuration for your agent with:

YOUR TERMINAL
dupe mcp feedback --client codex --url "$INSTANCE_URL"

MCP tools list/search posts, find top requests, update status and post a linked changelog. Instance MCP manages feedback; provisioning currently uses REST.

05 / BRING YOUR FEEDBACK

Import from Canny.

Use your own Canny API key. You're responsible for having the right to move your users' data. The importer runs on your own server; your key and data aren't sent to Dupes.

YOUR TERMINAL
dupe import canny
# set CANNY_API_KEY privately first

dupe import canny --fixture fixtures/canny.json

Boards, tags/categories, users, posts, votes, comments and changelog migrate together. Back up and stop the service before a real migration. Reimport after local merges is refused.

Import details and API versions →
06 / FORMS

A conversation, on your terms.

A free, self-hostable alternative to Typeform. Build one-question-at-a-time forms with hidden fields, branching, calculations, CSV exports and signed webhooks.

YOUR TERMINAL
npx @dupes/cli up forms
# or: dupe up forms --hosted --name "My forms"

Package publication is pending. Forms is being validated in the private preview. The public CLI uses forms-data/; sign in at /admin with the private admin-api-key file. Provision with {"app":"forms","name":"My forms"} and use FORMS_API_KEY for its five MCP tools.

YOUR TERMINAL
dupe import typeform --form FORM_ID
# set TYPEFORM_API_KEY privately first
dupe mcp forms --client codex --url "$INSTANCE_URL"

The importer retains supported jump conditions, nested logic and variable calculations. Unsupported question or logic types are rejected before saving. Imported forms stay in draft until you publish. Existing response history is not imported.