Shipnoted

Docs

Everything you need to wire Shipnoted into your product. Replace the host below with your own once deployed.

Quickstart

  1. Sign in and create a project. You get a public changelog, feedback board and roadmap at /p/your-slug straight away.
  2. Write a release (or let AI draft one) and publish it.
  3. 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:

window.Shipnoted.open()    // open the panel
window.Shipnoted.close()
window.Shipnoted.unread()  // number of unread releases

Components

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.json
import { 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

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.

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/draft

MCP 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-mcp

Tools: list_releases, draft_release, publish_release, top_feedback, set_feedback_status.

Limits