jistchat Try the live demo

Case study

Chat that translates the way people actually talk

A live multilingual chat app that translates each message in context — preserving tone, dialect, and intent instead of going word-for-word. Built solo, end to end, by directing AI coding agents through a documented engineering process.

Screenshot / GIF: a translated conversation
(replace this block with <img src="screenshots/hero.png" alt="…">)

In short: A working product, not a prototype. Real accounts, real-time translated chat, and the unglamorous essentials done properly — authentication, row-level security, GDPR deletion, a context-aware translation engine. Built by one person acting as PM/architect and directing AI agents through a staging-first, documentation-driven process. Try it, then read on for the how and why.

The problem

Real-time cross-language chat is either robotic or not real-time

People increasingly need to talk across languages in real time — partners in cross-language relationships, families spread across countries, support teams and their customers. Today's options force a bad trade: real-time tools (Google Translate, DeepL) translate literally and flatten tone, idiom, and register, while anything more natural isn't built into the flow of a live conversation. You end up with technically-correct translation that still feels wrong — sounding like a robot to the person you're closest to.

The solution

Translation that carries tone, not just words

jistchat translates every message into each reader's language with context. The engine is told the speaker's dialect, formality, and the nature of the conversation, so "let's grab dinner, love" lands warmly in the other language instead of stiffly. Under the hood, the chat app is the first client of its own translation API: text plus a small context object go in; a natural translation plus structured inferences (detected language, dialect, register, intent, formality) come back.

The landscape

Where jistchat fits

People already cross language barriers today — just painfully. The alternatives fall into a few camps:

The low-tech status quo

Meeting & call translators — Transync AI, JotMe

Real-time translation bolted onto Zoom/Teams/Meet with bilingual subtitles and voice playback. Built for business meetings, not personal messaging.

Translation engines & APIs — Lara, Soniox

High-quality translation and speech models sold as APIs. Less rivals than a preview of jistchat's own Phase-2 ambition — and, candidly, potential build-vs-buy options underneath it.

The direct competitor — cross-language chat apps — Intent

The closest match: real-time in-app message translation for relationships, family, and travel, plus voice/video call translation with voice cloning. This is the head-to-head.

Where jistchat fits: it's the only one combining in-flow personal chat, a context- and profile-aware engine (it learns how each person speaks over time), and a deliberate B2B-API business model underneath. The consumer app is the wedge; the engine is the business.

~ = partial / inconsistent. Competitor columns are my read of the category, not a claim about any single product. Researched July 2026.
Shared languageGoogle / DeepLGeneral LLMMeeting translatorsChat app (Intent)jistchat
Real-time, inside a personal chat~
Carries tone, dialect & register~~~
Learns how you speak over time~

The strategy

A consumer app as the wedge; the API as the business

The chat app is deliberately step one — a distribution vehicle and a data flywheel. Every real conversation generates the linguistic signal and corrections that make the translation engine better. Step two is the actual business: opening that engine as a B2B translation API for the products that need exactly this — dating, gaming, support, healthcare, legal/immigration. Every architectural choice is made as if that API already has external customers, which is why the structure is heavier than a weekend project: it's built to become a platform, not just an app.

How it works

System architecture

The chat app is a client of its own translation engine. The frontend owns the conversation layer (realtime, message flow, context assembly) and talks to Supabase for chat data, auth, and realtime — and to the translation API for translation. The translation engine is a standalone, versioned, token-authenticated API that knows nothing about rooms, users, or messages. Because the chat app already consumes it exactly as an external customer would, opening it as a B2B product is a lift-and-ship, not a rewrite.

jistchat system architecture The chat app frontend is a client of jistchat's standalone versioned translation API, which calls OpenAI. In Phase 2 other apps use the same API. Supabase is the shared database and also handles sign-in and live updates. jistchat — system architecture The chat app is one client of the translation engine. Conversation logic lives in the app + database — not in the API. Chat app (frontend) the live chat interface tells the API who's speaking & how B2B API customers Phase 2 — other apps, same API jistchat Translation API /api/v1 · versioned · secured by login reads tone, dialect & register, then translates in context the product — knows nothing about chat OpenAI the AI model Supabase — shared database conversations, messages & profiles sign-in, live updates, per-row access rules signed-in calls Phase 2 learns each user's style over time sign-in, live updates & data Built by jistchat External service Planned (Phase 2)

Engineering rigor

Why this isn't "vibe-coded"

A real system with the boring-but-essential parts done properly:

Token-authenticated API

Every backend call requires a verified user token (local JWKS verification) — not an open endpoint.

Row-level security

The database itself enforces who can read what; messages are visible only to members of the conversation.

GDPR data deletion

A two-phase erasure flow (soft-delete → grace period → hard delete) that anonymizes reusable data rather than destroying it.

Multi-tenant from day one

Tenant scoping on every table, so opening the B2B API later isn't a migration nightmare.

Staging-first migrations

Schema changes run and verify on a staging database before production; every migration is a versioned, replayable file.

A data flywheel

Every translation logs structured events and updates a per-user linguistic profile, building the corpus that improves quality over time.

Process

How I built it with AI

The interesting part isn't that I used AI to code — it's how. I ran the project like a small engineering org with AI agents as the team and myself as the PM/architect making the calls.

Documentation-driven

A living /docs/ set — architecture, a phased roadmap, an append-only decisions log (every non-trivial choice, with alternatives and tradeoffs), verification checklists, a parking lot. The AI keeps these in sync in the same change as the code, so the project never drifts from its own documentation.

Plan before code

Real changes start with a scoped plan and a decision — tradeoffs surfaced before implementation, with approval gates on anything irreversible. Judgment stays with me; execution is delegated.

A multi-agent toolchain

Strategy & architecture in one agent (Claude, desktop "Cowork"), line-level edits in an IDE agent (Cursor), and routine execution in an always-on agent on a server (Hermes). Split by which interface fits the task.

Model-tier awareness

Heavier reasoning (architecture, schema, gnarly debugging) routed to a stronger model; routine work to a faster one — a deliberate cost/quality tradeoff.

Screenshot: the decisions log / roadmap
(replace with <img src="screenshots/docs.png" alt="…">)
The append-only decisions log and phased roadmap that anchor the build.

Judgment

Selected decisions & tradeoffs

A few representative calls (the full log is in the repo):

Token verification method

Chose local JWKS verification over a per-call network check — the scale-correct path for a high-volume API — behind a single auth helper, so the method can change without touching call sites.

"Sending domain now, rebrand later"

Stood up email + domain on a cheap placeholder instead of waiting for a final brand: a domain change later is config, not a rewrite, and the only sticky cost (email reputation) is cheapest to incur early.

One tenant per user (for now)

A simpler identity model that's correct for the consumer app, with the path to full multi-tenancy documented as a known one-way door.

Current status

Live and open for signups

Working today at app.jistchat.com: real accounts (email magic-link auth), multi-conversation chat (direct + group), context-aware translation, per-user linguistic profiles, row-level security, and GDPR deletion. Honest scope: it's demo-grade, not yet mobile-native, and the B2B API is designed-for but not yet opened. Next up: corrections capture (thumbs up/down + inline edits to grow the training corpus), then the public API.

Built with

Tech stack

ReactViteTailwind Supabase — PostgresRealtimeAuth & RLS Vercel serverlessOpenAIResend