Each milestone is a GitHub issue. A milestone is done when every acceptance item is shown working on a running instance, not when the code exists.
M0 — Foundation
Status: done.
api/Go module,web/panel,edge/,sdk/js,sdk/goskeletons with their check commands.openapi/openapi.yamlwith health and version, linted; generated strict server.- Goose migrations, sqlc, River set up;
deploy/compose.yamlstarts Postgres and the server. - CI: every check command runs on pull requests.
Accept: docker compose up serves /healthz and an empty panel; CI is green.
M1 — Core model and panel sign-in
Status: done.
- Workspaces, members, roles, per-inbox access; sign-in with e-mailed code and passkeys.
- Inboxes and channels (settings only), contacts, conversations, messages, notes, events, attachments in object storage.
- Workspace API keys;
/v1endpoints for all of the above; usage counters.
Accept: through the API alone, create an inbox, a contact and a conversation, add messages and a note, assign and close it.
M2 — Agent panel
Status: done.
- Conversation list with filters and search, thread view, composer (reply/note, canned replies, attachments), contact sidebar, assignment, status, labels.
- Settings screens for M1 objects. Realtime updates over WebSocket. Turkish and English.
Accept: two members answer and hand over a conversation in the panel and see each other’s changes live.
M3 — E-mail channel
Status: done.
/ingress/email, the Cloudflare Email Worker inedge/, threading, quote stripping, HTML sanitizing, attachments, raw message storage.- Outbound SMTP, thread headers, loop protection, SES bounce/complaint ingress.
Accept: a mail to the support address opens a conversation, the panel reply arrives in the sender’s mailbox in the same thread, their reply joins the conversation, an auto-reply does not loop.
M4 — Web widget: live chat and embedded threads
Status: done.
/client/v1, contact sessions, identity tokens, anonymous visitors, allowed origins.<yuva-chat>launcher and embedded layouts, presence, typing, read receipts, business hours,live/asyncmodes, e-mail continuity.sdk/go: identity token signing.
Accept: on a test page an anonymous visitor chats live with a member; a signed-in user of a host app sees their earlier conversations; after leaving, the visitor gets the reply by e-mail.
M5 — Mobile SDKs, feedback and webhooks
Status: done.
sdk/swiftandsdk/kotlin: client, conversation list, thread, composer, feedback form.- Feedback kind and metadata;
apichannel for server-side forms. - Standard Webhooks delivery with retries and a delivery log; contact deletion by external id.
sdk/go: webhook verification.
Accept: in a sample iOS and Android app a user sends feedback, a member answers in the panel, the host backend receives the webhook and the app shows the reply.
M6 — Member notifications
Status: done.
- PWA install, Web Push, per-member notification preferences, e-mail fallback.
Accept: a new conversation in a live inbox notifies a member’s phone within seconds.
M7 — First internal rollout
Status: in progress.
- Our own instance; an existing in-app feedback form moved from e-mail to Yuva; e-mail channels for the products that already receive support mail.
Accept: one week of real support handled only in Yuva.
M8 — First public release (0.0.1)
Status: in progress; ships as v0.0.1 (see CHANGELOG.md).
- Docker image, install guide, configuration reference, upgrade notes, backup guide.
- Security review of authentication, client sessions, ingress and attachment handling.
Accept: a fresh install from the guide works on a clean host.