Everything you need to run your board
The complete command reference and how-to guide for collecting feedback, triaging it, and shipping a roadmap — natively in Telegram and Discord, with a web dashboard for admins.
Your community’s best ideas are scattered across chat — and lost.
Getting started
Three steps and your community has a working feedback board.
- Step 1
Add the bot
Invite it to your Discord server or Telegram group. A board is created automatically — no setup wizard.
- Step 2
Members post ideas
People share requests with /suggest and upvote what they want. In a Telegram DM, plain text becomes a new idea.
- Step 3
Admins manage it
Triage from chat with admin commands, or run /dashboard for a one-time link into the web dashboard.
Member commands
Available to every member of the community — no account required.
/suggest text:… In a Telegram DM, plain text becomes a new idea| Command | What it does |
|---|---|
/suggest | Post a new feature request or idea to the board. |
/bug | Report a bug as a tracked board item. |
/feedback | Share general feedback that admins can triage. |
/top | See the most-upvoted suggestions. |
/trending | See ideas gaining votes fastest right now. |
/roadmap | View what’s planned, in progress, and shipped. |
/search | Find existing suggestions before posting a duplicate. |
/stats | Show board activity and totals. |
/mysuggestions | List the suggestions you’ve posted. |
/following | List the items you follow for status updates. |
/changelog | Read what the team has recently shipped. |
/comment <id> <text> | Add a comment to a suggestion. |
/report <id> [reason] | Flag a suggestion for an admin to review. |
/help | Show the full command list in chat. |
Admin commands
Run these from a community you administer. <id> is the suggestion id shown on each card.
Telegram
Run these in the group — you must be a group admin.
| Command | What it does |
|---|---|
Status buttons on a card | Move a suggestion through Planned / In progress / Done (admin-only). |
/review | Show the queue of suggestions awaiting triage. |
/announce <title> | <body> | Publish a changelog entry (note the “|” separator). |
/merge <sourceId> <targetId> | Merge a duplicate into another suggestion. |
/delete <suggestionId> | Delete a suggestion. |
/assign <suggestionId> <telegramUserId|clear> | Assign an item to a member (or clear it). |
/ban · /unban · /mute · /unmute <telegramUserId> | Member moderation. |
/warn <telegramUserId> [reason] | Warn a member — 3 warns auto-bans. |
/unwarn <telegramUserId> | Clear a member’s warnings. |
/warns <telegramUserId> | List a member’s warnings. |
/blockword <word> · /unblockword <word> · /blocklist | Manage the banned-words filter. |
/reports | List suggestions members have reported. |
/dashboard | DM yourself a one-time web-dashboard login link. |
Discord
Admin = server owner, or anyone with Administrator or Manage Server. These commands are hidden from ordinary members — they never appear in a normal member’s slash-command picker. If you granted someone admin in the dashboard but they aren’t a Discord admin, they can still do everything from the web dashboard, or the server owner can re-enable specific commands for their role under Server Settings → Integrations.
| Command | What it does |
|---|---|
Status buttons on a card | Change a suggestion’s status (admin-only). |
/review | Suggestions awaiting review. |
/announce title:<t> body:<b> | Publish a changelog entry. |
/merge source:<id> target:<id> | Merge duplicates. |
/remove id:<id> | Delete a suggestion. |
/assign id:<id> member:@user | Assign to a member (omit member to clear). |
/moderate action:<BAN|UNBAN|MUTE|UNMUTE> member:@user | Member moderation. |
/dashboard | Get an ephemeral, one-time web-dashboard login link. |
The admin model
You don’t assign board admins inside the bot — it mirrors the chat’s own admin list.
Community admins — automatic
- Telegram: the group creator and any administrator gain bot-admin powers for that group’s board.
- Discord: the server owner, or anyone with Administrator or Manage Server.
- Telegram DM: each person is the admin of their own personal board.
To add an admin, simply make them an admin of your group or give them Manage Server on Discord — the status buttons and admin commands appear for them automatically. Powers are strictly per-community.
The platform owner
The operator of the whole deployment. They see every community and cross-community analytics in the dashboard’s Platform section, pass every authorization check, and can create back-office sub-accounts scoped to specific communities.
Bot-admin follows your Telegram/Discord admin status automatically. Removing someone’s platform admin auto-revokes their bot-admin role and dashboard access on their next interaction. Manually-assigned roles (owner, moderator) are never touched by this sync.
Web dashboard
Three ways to sign in, then triage everything from one place.
Bot magic-link
Run /dashboard in a server or group you admin. The bot sends a private, single-use login link (valid 10 min) — no password.
Continue with Discord
Sign in with Discord OAuth from /login. You land scoped to the Discord servers you administer.
Email + password
The platform owner’s account — the only sign-in that sees the cross-community Platform section.
What you can do there
- Triage the review queue, suggestions, and audit log.
- Move items across the roadmap — reflected in the bots’ /roadmap.
- Edit community settings and publish changelog entries.
- Billing: see your plan, upgrade, or open the Stripe portal.
- Integrations: Slack, Discord, GitHub, Linear, Jira.
- Exports + scoped API keys, and a shareable public board.
Moderation playbook
Reach for the right tool fast. Every admin action is written to the audit log.
| Situation | Do this |
|---|---|
| Spam or abuse from a member | /warn (3 = auto-ban), or /ban / /mute. |
| Already protected by default | Every community ships with a platform blocklist (slurs, harassment, explicit threats) plus threat detection — active from day one, nothing to configure. |
| Repeated bad words | /blockword <term> — admins are exempt from the filter. |
| A default term is wrong for your community | /unblockword <term> — excludes just that one platform default for you; everything else stays on. |
| What /ban actually does | Blocks them, HIDES their existing posts from the public board (hidden, never deleted), keeps a record of the content, and survives them deleting their account. /unban reverses all of it. |
| Duplicate suggestions | /merge <dup> <canonical> — votes consolidate. |
| Off-topic or bad item | /delete on Telegram, /remove on Discord. |
| A member flagged something | It appears in /reports — act with the above. |
| You shipped a feature | /announce so it lands in /changelog and notifies followers. |
Self-hosting
The whole stack is yours to host — your data stays on your infrastructure.
The bot, web dashboard, and API ship as a Docker Compose stack. Deduplication and summaries run on a self-hosted local model by default — zero per-call cost — with OpenAI as an optional upgrade. Quickstart:
- Clone the repository.
- Copy
stack.env.exampletostack.env, run./scripts/generate-secrets.sh, and fill in your domain + bot credentials. - Bring it up:
docker compose -f docker-compose.prod.yml --env-file stack.env up -d --build. Migrations run automatically and Caddy handles HTTPS. - Create your first admin:
… run --rm worker node apps/worker/dist/create-owner.js [email protected], then sign in.
Want to self-host? Contact us for access and the full setup guide.
Embed the board anywhere
Drop your public board into your product, docs, or marketing site with one script tag.
Your public board is embeddable — add a single script tag to any page and it renders inline (submit, vote, roadmap), styled to match. Enable it under Settings → Embeddable widget (Scale plan), where you also set the domains allowed to embed it and, optionally, SSO so board actions carry your real end-user.
<script src="https://quillboard.xyz/widget.js" data-board="your-board-slug" async></script>
Optional attributes: data-height (px) and data-sso (a signed JWT identifying the current user).
SSO (attribute votes/comments to your real users)
Your backend signs a short-lived HS256 JWT with the board's shared secret (Settings → Embeddable widget) and exchanges it for a session cookie:
POST https://quillboard.xyz/v1/boards/your-board-slug/sso
Content-Type: application/json
{ "token": "<HS256 JWT signed with your board secret>" }JWT claims: subject (required — your stable user id), exp (required, ≤ 24h out), and optional email, name, segment (weighted voting), company + companyId (B2B grouping). The response sets a signed cookie; the widget never sees an admin session. Pass the JWT as data-sso and the widget performs the exchange for you.
Read-only API
Pull a community's suggestions, roadmap, stats and changelog into your own tools (Pro+).
Create a scoped, read-only API key under Settings → API keys. Each key is bound to one community, so no community id is needed in the path. Authenticate with X-Api-Key: <key> (or Authorization: Bearer <key>). Rate limited to 60 requests/minute.
Endpoints
GET /v1/public/suggestions— list suggestions. Query:query, status, type, sort, cursor, category, tag. Returns{ items, nextCursor }.GET /v1/public/roadmap—{ planned, inProgress, completed }.GET /v1/public/stats— community totals.GET /v1/public/changelog— recent published entries.
Each suggestion returns public fields only (id, type, status, title, body, category, tags, voteScore, commentCount, followerCount, targetDate, createdAt) — never author identity or internal ML fields.
Example
curl -H "X-Api-Key: qb_your_key" \ "https://quillboard.xyz/v1/public/suggestions?status=PLANNED&sort=top"
Ready to open your first board?
Add the bot in two clicks — your board is live in minutes.