Project
Roadmap & Scope
What shipped in v0, what's deliberately out of scope, and where Chatpack is heading.
What's in v0
| Feature | Status |
|---|---|
| 1:1 conversations (find-or-create) | ✅ Done (M1) |
| Text messages: send, list, edit, delete | ✅ Done (M1) |
| Participant-only permissions + hooks | ✅ Done (M1) |
Durable read-state (last_read) | ✅ Done (M1) |
| In-memory storage adapter | ✅ Done (M1) |
| HTTP handler (Next.js App Router) | ✅ Done (M2) |
| Real-time delivery (SSE) | ✅ Done (M3) |
| SSE reconnect gap-fill | ✅ Done (M3) |
| Drizzle/Postgres adapter | ✅ Done (M4) |
| Launch polish + npm release | ✅ Done (M5) |
| Typing / presence / read-tick plugins | ✅ Done (v0.next) |
Unread counts (unreadCount) | ✅ Done (v0.next) |
| Redis transport (multi-node SSE) | ✅ Done (v0.next) |
| Browser client + React hooks | ✅ Done (v0.next) |
| Client polling fallback | ✅ Done (v0.next) |
| Reactions + quote-replies | ✅ Done (v0.next) |
| Participant-scoped ranked message search | ✅ Done (v0.next) |
| Post-persistence message mutation hook | ✅ Done (v0.next) |
@chatpack/cli init + starter templates | ✅ Done (v1.next) |
| Group chats: membership, roles, admin | ✅ Done (v0.next) |
File attachments (@chatpack/file) | ✅ Done (v0.next) |
| Invite links + join requests | ✅ Done (v0.next) |
| Public channels (browsable directory) | ✅ Done (v0.next) |
| Moderation: blocks, mutes, reports, bans | ✅ Done (v1.next) |
| Multi-node presence | ✅ Done (v1.next) |
| Mentions (validated, supplied ids) | ✅ Done (v1.next) |
| Message forwarding (copy + provenance) | ✅ Done (v1.next) |
Typed @chatpack/ui block catalog | ✅ Done (v1.next) |
Deliberately not in scope yet
- Group features beyond membership, roles, invites, and visibility - groups
ship with
admin/member, a name, a 256-participant cap, admin-gated management (ADR 0017), shareable invite links with an optional approval queue (ADR 0019), and a public/private flag that puts a group in a browsable directory (ADR 0020). Per-group permission grants and channel-wide roles beyondadmin/memberare not part of it. A public channel is discoverable, not readable: browsing the directory grants no read access, so reading still means joining. - Message formatting -
bodyremains opaque text. Applications choose plain text, Markdown, or another syntax and own safe parsing and rendering; Chatpack does not parse Markdown or return rendered HTML. See ADR 0022. - A mention inbox, and notifying the people mentioned - mentions ship as
validated storage (ADR 0023): a message carries
the ids it names, and every id must be a current participant. There is no
"mentions of me" feed and nothing is sent to anyone.
afterMessageMutationhands youmentionsnext torecipientIds; delivery is your app's. - Resolving
@namesout of message text - Chatpack has no users table and never parsesbody(ADR 0022), so your composer supplies the ids.bodyandmentionscan legitimately disagree, and keeping them in step is the app's job. - Push notification providers - applications can start their own delivery
work from
afterMessageMutation, but Chatpack does not ship providers. - Reusable React UI package -
@chatpack/uiprovides the typed React block catalog with client-backed actions, realtime state, group/moderation blocks, and Filepack attachment references.chatpack initstill generates editable application-owned UI source when a host wants full control. - Non-participant search access - the initial search implementation scopes
storage results to participant conversations; dynamic
canReadaccess for support/admin users needs a separate design. - Moderation beyond the core suite - Chatpack provides optional blocks, mutes, reports, and bans. User identity, notifications, host-session revocation, and moderation UI remain application-owned.
Full scope and reasoning in docs/MVP.md.
Stability
Everything is 0.x until the public API stabilizes - expect minor breaking
changes before 1.0. Releases are managed with Changesets; each package has a
CHANGELOG.md.
The longer arc
The vision (see docs/ARCHITECTURE.md) is BetterAuth-shaped: the obvious open-source default for chat infrastructure - small core, adapter-driven, extensible via plugins, friendly to both human developers and AI builders.