Skip to content

technoashu/kaya

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

109 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Kaya

Real-time German ⇄ English translator built for migrant caregivers in German eldercare. Medical vocabulary, dialect handling, confidence labels, on-device patient sessions.

GrowthX AI Weekender — Revenue track

free signup (~30s) · 30 voice minutes free for life · DE ⇄ EN

Judges — skip signup, use the demo account: kayacare.app/app/signin/ · email demo@kayacare.app · password kaya2025 First action that shows it all: open the translator, type AZ reduziert — see the eldercare glossary fire, the confidence label, and how Kaya reads it as "The patient looks unwell" while Google Translate says "Working hours reduced".

Submission evidence: SUBMISSION.md · Reproduce numbers: rubric-counts.sql

Verified metrics (queried 2026-04-26 via Supabase REST API): Signups: 18 (public.users) · Waitlist: 15 subscribers, all active, zero unsubscribed (public.waitlist) · Translation events: 49 (public.translation_events) · Translations completed: 25 · Glossary-hit rate: 40% (10 of 25 translations matched the curated 88-term eldercare glossary) · Thumbs-down: 9 · Thumbs-up: 8 · Paid conversions: 1 · Revenue: €5 (~$5.40 USD) via Paddle live checkout, HMAC-signed webhook verified end-to-end (audit: evidence/transaction-audit-verified.md). Live product: kayacare.app/app. Reproduce every number with rubric-counts.sql in the Supabase SQL editor — or pull via REST API directly per the curl examples in evidence/data-flywheel-signals.md.


the killer demo — AZ reduziert

Two German words from a real handover. Type them into Google Translate and Kaya. Same input, two different worlds.

Google Translate Kaya
Output "Working hours reduced" "The patient looks unwell"
Why Reads AZ as Arbeitszeit (working hours) — a non-clinical mistranslation Knows AZ = Allgemeinzustand (general condition) — a clinical handover term

A caregiver typing this mid-shift on Google Translate would miss a deteriorating patient. Kaya catches it because the glossary is built for the actual job.

Side-by-side: Google Translate says "Working hours reduced" / Kaya says "The patient looks unwell"

Side-by-side, same input, two different worlds. Reproducible: paste AZ reduziert into translate.google.com and kayacare.app/app/translator/. 30 seconds to verify yourself.

Kaya solo: AZ reduziert → "The patient looks unwell" with confidence label


the numbers (queried from production, 2026-04-26)

Metric Value Source
Signups 17 public.users
Waitlist subscribers (active) 15 public.waitlist where unsubscribed_at is null
Translation events captured 47 public.translation_events
Translations completed 23 event_type = 'translated'
Thumbs-down feedback (data flywheel input) 9 event_type = 'thumbs_down'
Thumbs-up feedback 8 event_type = 'thumbs_up'
Paddle checkout Live /api/paddle-webhook

All numbers verifiable against the schema in waitlist/supabase/. Run the queries yourself — see rubric-counts.sql.

Supabase auth.users — 17 signups with email + created_at columns visible

SQL: 47 translation events, 23 translations, 9 thumbs_downs, 8 thumbs_ups

SQL: 15 active waitlist subscribers (unsubscribed_at is null)


the moat — data flywheel in motion

Schema: translation_events table — append-only, 5 indexes, RLS-locked. Every translation tagged with engine, confidence_tier, event_type, input/output language.

Loop in motion: 9 thumbs_down + 8 thumbs_up captured in the first 24h of telemetry — roughly 1:1 user signal, discriminating feedback (not random clicks). Every single thumbs_down marked confident by the engine. Confidence-tier alone doesn't catch every miscalibration — only the human-in-the-loop signal does. Google and DeepL don't see this stream because their users aren't caregivers.

Glossary improvement cadence (publicly auditable):

  • Pass #1 (commit e59d337) — audit-driven: 5 missing handover abbreviations (RR, HF, AF, AZ, EZ) + 3 ADL terms.
  • Pass #2 (commit 91c22ec) — data-driven from production thumbs_down events: 7 pain qualifiers (stechend, drückend, brennend, pulsierend, dumpf, krampfartig, ziehend) + 6 dementia behavioral terms (Hinlauftendenz, Weglauftendenz, Tag-Nacht-Umkehr, Aggressivität, Apathie, Antriebslos).
  • Live proof of pass #1 working: the AZ reduziert demo above. The audit-pass commit ships in production translations.

Glossary version-controlled in waitlist/api/_lib/translate-prompt.js.


product polish — Practice mode scores on concrete clinical facts

Generic translation accuracy is L3 territory. Practice mode goes further — scoring on the specific facts that matter on a shift: patient identifiers, times, dosages, severity qualifiers.

Practice mode scoring Mr Schmidt fell this morning — Patient identifier: Mr Schmidt, Time of incident: this morning

Same approach with medication timing — "Die Tablette nehmen Sie bitte nach dem Essen" → score on the instruction AND the timing (after meals), with bonus contextual learning (nach dem Essen vs auf nüchternen Magen):

Practice tablet timing 10/10 — instruction + timing + bonus context


product polish — patient session UX

The dashboard separates patient-context actions (Translate, sits with the active session banner + minutes meter) from independent skill-building (Practice anytime, separate section). Resume tiles let caregivers pick up past patients (initials only — no PII server-side, on-device only).

Dashboard with active session banner, Translate, minutes meter, Practice Anytime, resume tiles K MR ASH


doc map (for judges)

doc what it covers
SUBMISSION.md Rubric evidence first — pain, SOM, right-to-win, why-now, moat, current state with screenshots.
PROJECT.md Master state — what's live, what's next, GTM moves, roadmap.
POC.md POC scope + checklist (✅ / 🟡 / ⬜) per feature.
API.md Every endpoint in /waitlist/api/* + cross-cutting patterns.
TELEMETRY.md What we measure — tables, views, event categories, SQL queries.
PIPELINE.md Engineering decision log (STT, translation, glossary, TTS, payment, telemetry).
DESIGN.md Design system + page inventory.
RESEARCH.md Persona, pain evidence, SOM math, open research questions.
COMPETITORS.md Per-competitor teardowns (Care to Translate, Google Translate, DeepL).
POC-USER-STORIES.md Screen-by-screen user flows.
learnings.md Per-session retrospectives.
CLAUDE.md Engineering process rulebook.
evidence/ Screenshots: AZ reduziert demo, practice scoring, dashboard, SQL counts.

verifiable evidence (run yourself)

Schema is open-source at waitlist/supabase/. Paste rubric-counts.sql into the Supabase SQL editor for a one-shot reproduction of every number above.

Operational queries the founder runs daily are in waitlist/supabase/monitoring.sql. Canonical SQL one-liners in TELEMETRY.md answer:

  • Signup + first-use counts (lifetime + last 4 days)
  • Signin drop-off funnel (8 steps)
  • Paid users (founding members)
  • Unmatched Paddle transactions
  • Practice attempt totals per user
  • pipeline_health heartbeat across every event source

stack at a glance

  • STT: Groq Whisper-large-v3-turbo
  • Translation primary: Gemini 2.5 Flash-Lite (with eldercare glossary in system prompt)
  • Translation fallbacks: Groq Llama-3.3 70B → MyMemory → Helsinki-NLP
  • TTS: Sarvam (primary, Indic voices) → ElevenLabs (English fallback) → Web Speech API
  • Auth + DB: Supabase (EU region) — email + password, RLS-scoped tables, service-role server-side
  • Email: Resend (EU region) via custom SMTP
  • Payments: Paddle (live, €5 founding-member one-time) — HMAC-signed webhook
  • Telemetry: translation_events + ui_events + derived views + pipeline_health heartbeat
  • Hosting: Vercel Edge Functions
  • Frontend: Vanilla HTML / CSS / JS — no build step, no framework, mobile-web-first

quick links

About

Kaya — real-time German translator built for healthcare professionals (GrowthX AI Weekender, Revenue track)

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors