Paperkite is an open-source browser where anyone viewing the same webpage can talk to each other in real time. Open a page, land in its chat room, no accounts, no invites. Bring an AI agent into the conversation, or run the whole chat backend yourself.
This repository holds three projects:
| Directory | What it is | Stack |
|---|---|---|
browser/ |
The Paperkite desktop browser | Electron, TypeScript, React |
chat-service/ |
The chat backend the browser talks to | Go |
website/ |
The marketing site, protocol docs, and live status page | Next.js |
- Live per-page chat. Every tab hashes its URL into a room. Anyone else on that URL right now can talk to you there.
- Private servers.
chat-serviceis a small, stateless Go service. Run your own instance and point the browser at it instead of a shared one. - AI agents. Chat with Claude, GPT, Gemini, or a local Ollama model about the page you're on, from a panel next to the tab.
- MCP client and server. Add any Model Context Protocol server to the browser for your agents to use. Paperkite also exposes the page, room, and chat as MCP tools of its own.
- Live audio translation. Whisper-powered, with support for swapping in custom models.
- Whole-page translation. Open-source or commercial models, your choice.
- Fully open source. MIT licensed, browser, protocol, and server alike.
See chat-service/PROTOCOL.md for the wire
protocol, or the same thing rendered at website/'s
/protocol page.
Run the chat backend, then the browser, in two terminals:
# terminal 1: chat-service
cd chat-service
CHAT_JWT_SECRET=dev-secret make run
# terminal 2: browser
cd browser
npm install
npm startThe browser defaults to http://localhost:8080, matching chat-service's
default HTTP port. Change the server it talks to from Settings → Chat
Servers if you're pointing at something else.
Requires Go 1.23+.
cd chat-service
make build # go build ./...
CHAT_JWT_SECRET=dev-secret make run # go run ./cmd/server, HTTP :8080, gRPC :50051
make test # unit + integration testsmake proto regenerates the protobuf/gRPC code from
proto/chat/chat.proto and requires protoc plus the Go gRPC plugins on
your PATH. You only need this if you're editing the .proto file, the
generated code is already checked into gen/.
To run it in Docker instead:
cd chat-service
make docker # builds paperkite-chat-service:local
docker run -p 8080:8080 -p 50051:50051 -e CHAT_JWT_SECRET=dev-secret paperkite-chat-service:localRunning your own server long-term? cmd/ops is a small daemon that
auto-deploys new releases for you (CI notifies it, it downloads,
health-checks, and rolls back on failure) instead of you manually
swapping binaries. See
chat-service/packaging/README.md.
Requires Node 20+.
cd browser
npm install
npm start # run in dev mode
npm run package # package the app for your current platform
npm run make # package and build platform installers (.zip, .exe, .deb, .rpm)Packaged installers land in browser/out/make/. See
browser/packaging/README.md for install
commands per platform and the current package manager story (Homebrew,
apt).
Requires Node 20+.
cd website
npm install
npm run devThis is a monorepo with three independently-versioned projects, so a release is scoped by which one you're actually releasing, not "cut a release for the whole repo." Each project keeps its own Keep a Changelog file and semver version. The flow, for whichever project changed:
make browser-bump-patch # or chat-service- / website-, or -minor / -major
# review CHANGELOG.md, then commit
git commit -am "browser: v1.0.1"
make browser-tag # creates the tag, prints the push command
git push origin browser-v1.0.1 # this is what actually kicks off CIbump-* only touches files (bumps package.json for browser/website, a
plain VERSION file for chat-service, and moves the changelog's
[Unreleased] section under a dated heading), no git side effects.
tag creates a local annotated <project>-vX.Y.Z tag but never pushes,
pushing is the deliberate step that triggers a release. Each make <project>-* target can also be run directly inside that project's
directory (cd browser && make bump-patch).
Pushing a tag triggers the matching workflow, which builds only that project, since the tag prefix is what tells CI what changed:
browser-v*→release-browser.ymlbuilds Windows/Linux installers and attaches them to a GitHub Release (created automatically from the tag). macOS isn't built by CI right now (no Apple Developer credentials for signing yet) - Mac users build from source instead. Seebrowser/packaging/README.md.chat-service-v*→release-chat-service.ymlcross-compiles binaries for linux/darwin/windows (amd64 + arm64), attaches them to a GitHub Release, pushes a multi-arch Docker image toghcr.io/<owner>/paperkite-chat-service, and, ifOPS_WEBHOOK_URLis configured, notifies a runningcmd/opsdaemon to deploy it (download, health-checked swap, automatic rollback on failure). Seechat-service/packaging/README.md.website-v*isn't wired to a workflow, the site deploys however you've set up hosting (Vercel, etc.); the tag just keeps its version/changelog consistent with the other two.
MIT, see LICENSE. Each project also carries its own copy of the same license. Contributions and forks welcome.