Docs
Everything you need to wire Shipnoted into your product. Replace the host below with your own once deployed.
Quickstart
- Sign in and create a project. You get a public changelog, feedback board and roadmap at
/p/your-slugstraight away. - Write a release (or let AI draft one) and publish it.
- Add the widget or the components to your app.
Widget
One script tag. It renders in a shadow root, so your CSS cannot break it and it cannot break yours.
<script src="https://shipnoted.com/widget.js" data-project="your-slug" async></script>Options, all optional:
data-position="left"moves the button to the bottom-left.data-label="Updates"changes the button text.data-trigger="#my-button"opens it from your own element and hides the floating button.data-feedback="false"hides the “Share an idea” tab.
window.Shipnoted.open() // open the panel
window.Shipnoted.close()
window.Shipnoted.unread() // number of unread releasesComponents
For React and shadcn/ui projects, install the source files instead. They use your own tokens, so they match your app.
npx shadcn@latest add https://shipnoted.com/r/whats-new.json
npx shadcn@latest add https://shipnoted.com/r/changelog.json
npx shadcn@latest add https://shipnoted.com/r/feedback-board.jsonimport { WhatsNew } from "@/components/whats-new"
<WhatsNew project="your-slug" />Set NEXT_PUBLIC_SHIPNOTED_URL to your Shipnoted host, or pass baseUrl to a component.
Verified users
On Pro and Team, your own backend can tell Shipnoted who is signed in. Their votes and ideas then count as one verified person on every device, carry a “Verified” mark, and the person is emailed when their request ships, with no form to fill in.
Sign a short JWT on your server with the identify secret from Install & connect. It must be HS256 and carry sub (your id for the person) and exp (at most 30 days away); email and name are optional.
import { SignJWT } from "jose"
const token = await new SignJWT({ email: user.email, name: user.name })
.setProtectedHeader({ alg: "HS256" })
.setSubject(user.id)
.setExpirationTime("1h")
.sign(new TextEncoder().encode(process.env.SHIPNOTED_IDENTIFY_SECRET))Then pass it to whichever surface you use:
<!-- the widget -->
<script src="https://shipnoted.com/widget.js" data-project="your-slug" data-user-token="TOKEN" async></script>
<script>Shipnoted.identify("TOKEN")</script>
// the components
<FeedbackBoard project="your-slug" userToken={token} />
// the hosted board
https://shipnoted.com/p/your-slug/feedback?sn_token=TOKEN- An invalid, forged or expired token gets a 401 (
code: "bad_token"); the widget then carries on anonymously. - Keep the secret on your server. Rotating it invalidates every token signed with the old one.
- On the Free plan the token is ignored and visitors stay anonymous.
GitHub
On Pro, connect a repository from Install & connect. Add a webhook in GitHub with the payload URL and secret shown there, content type application/json, and the Pull requests and Releases events.
- Each merged pull request is queued.
- When you publish a GitHub release, Shipnoted drafts notes from the queue and links the requests they answer. The draft is never published automatically.
- Deliveries are verified with the
X-Hub-Signature-256header and listed in your dashboard.
REST API
Pro and Team. Create a key under Install & connect and send it as a bearer token. 120 requests a minute.
# list releases
curl -H "Authorization: Bearer snk_..." https://shipnoted.com/api/v1/your-slug/releases
# publish one (add "email": true to email subscribers)
curl -X POST -H "Authorization: Bearer snk_..." -H "content-type: application/json" \
-d '{"title":"Faster boards","body":"- Boards open 3x faster","tags":["improved"],"publish":true}' \
https://shipnoted.com/api/v1/your-slug/releases
# top requests
curl -H "Authorization: Bearer snk_..." "https://shipnoted.com/api/v1/your-slug/feedback?sort=top"
# move a request along
curl -X POST -H "Authorization: Bearer snk_..." -H "content-type: application/json" \
-d '{"id":"f_...","status":"planned"}' https://shipnoted.com/api/v1/your-slug/feedback
# AI draft from a list of changes (created unpublished)
curl -X POST -H "Authorization: Bearer snk_..." -H "content-type: application/json" \
-d '{"items":[{"title":"feat: dark mode"},{"title":"fix: crash on save"}]}' https://shipnoted.com/api/v1/your-slug/draftMCP server
Let your coding agent read feedback and draft or publish releases.
claude mcp add shipnoted \
-e SHIPNOTED_API_KEY=snk_... \
-e SHIPNOTED_URL=https://shipnoted.com \
-e SHIPNOTED_PROJECT=your-slug \
-- npx -y shipnoted-mcpTools: list_releases, draft_release, publish_release, top_feedback, set_feedback_status.
Limits
- Free: 1 project, 100 subscribers, 3 AI drafts a month, badge shown.
- Pro: 2,500 subscribers, 60 AI drafts, no badge, custom domain, scheduling, GitHub, API, MCP.
- Team: 5 projects, unlimited teammates, 15,000 subscribers, 300 AI drafts.