--- title: Kith emoji: 🧑 colorFrom: red colorTo: yellow sdk: gradio sdk_version: 6.17.3 python_version: "3.12" app_file: app.py pinned: false license: apache-2.0 short_description: Relationship memory built on small open models thumbnail: https://huggingface.co/spaces/build-small-hackathon/kith-ai/resolve/main/assets/brand-images/kith-ai-brand-1.jpeg models: - CohereLabs/cohere-transcribe-03-2026 - openbmb/MiniCPM4.1-8B tags: - build-small-hackathon - backyard-ai - track:backyard - openbmb - minicpm - sponsor:openbmb - achievement:offbrand - achievement:fieldnotes - off-brand - best-demo - gradio - zerogpu --- # Kith 🧑 ![Kith β€” the thoughtful thing to do today](assets/brand-images/kith-ai-brand-1.jpeg) **A relationship memory built entirely on small open models β€” remember the people in your life, and surface the thoughtful thing to do today.** Record a conversation β†’ a 2B model transcribes it β†’ an 8B model extracts the people in it and what matters about them β†’ it's kept in a local SQLite file you own β†’ Kith surfaces the thoughtful thing to do today: the birthday in five days, the photos you promised, the friend you've lost touch with. The data Kith handles is your most intimate β€” family, health, friendships β€” so it's built on **small, open models under the hackathon's 32B cap**, and your memory lives in a **local file you own, not a cloud account or database.** Small isn't the limitation here; it's the point. ## How it works ![Small models. A memory that's yours β€” Ears 2B β†’ Brain 8B β†’ Your file β†’ Today](assets/brand-images/kith-ai-brand-5.jpeg) ``` πŸŽ™ record / upload (browser mic, decoded + resampled to 16kHz in-browser) β†’ πŸ‘‚ Cohere Transcribe (2B, Apache-2.0) β€” speechβ†’text, on ZeroGPU β†’ 🧠 MiniCPM 4.1-8B (OpenBMB) β€” extracts people / signals / commitments / decisions as strict JSON β†’ πŸ—„ SQLite β€” a local file you own, no cloud database β†’ 🧑 the Today feed β€” thoughtful / owed / reconnect / remember cards ``` ![Be the friend who remembers β€” Rose's birthday, you owe Daniel the photos, call Mom](assets/brand-images/kith-ai-brand-3.jpeg) - **Custom UI over `gr.Server()`** β€” the whole screen is hand-written HTML/CSS/JS in Kith's design language (Fraunces, cream + terracotta), talking to Gradio API routes via `@gradio/client`. No default Gradio widgets anywhere. - **Grounded extraction** β€” every memory carries a verbatim source quote, verified against the transcript; tap any card to see exactly what was said. An item with no real quote is dropped, not shown. - **No diarization needed** β€” Cohere Transcribe is pure audioβ†’text; MiniCPM infers "me vs. them" from conversational context. - **Your memory, yours** β€” conversations become rows in a local SQLite file, with dismiss + "start fresh" controls. No cloud database, no account. ![Your memory lives in a file you own β€” no cloud, no account](assets/brand-images/kith-ai-brand-4.jpeg) ## Models (all small, all open) | Role | Model | Size | Runtime | |---|---|---|---| | Ears | [CohereLabs/cohere-transcribe-03-2026](https://huggingface.co/CohereLabs/cohere-transcribe-03-2026) | ~2B | on ZeroGPU | | Brain | [openbmb/MiniCPM4.1-8B](https://huggingface.co/openbmb/MiniCPM4.1-8B) | 8B | OpenBMB hosted MiniCPM endpoint | The whole design is built behind one `extract()` seam (`brain.py`) with a `KITH_BRAIN` switch β€” `gpu` / `hosted` / `local` (CPU GGUF via llama.cpp) β€” so the brain can move fully on-device without touching the rest of the app. ## Running it Space secrets: `HF_TOKEN` (the ASR model is gated β€” the token's account must have accepted access on its model page) and `OPENBMB_API_KEY` (the MiniCPM endpoint). Space variable `KITH_BRAIN=hosted`. Locally on a CPU dev box: `pip install -r requirements.txt gradio spaces && KITH_BRAIN=hosted python app.py`; set `KITH_SKIP_ASR=1` to skip the gated ASR weights during UI work. ## How I built it Kith is a single Gradio `gr.Server()` app, designed around one clean **ingestion seam**: a conversation becomes a row of text, and everything downstream is source-agnostic. 1. **Ears** β€” Cohere Transcribe 2B runs on ZeroGPU; the browser decodes and resamples any clip to 16 kHz in-page (WebAudio), so the server never needs ffmpeg. 2. **Brain** β€” MiniCPM 4.1-8B turns the transcript into strict JSON (people / signals / commitments / decisions), behind one `extract()` seam with a `KITH_BRAIN` switch (`gpu` / `hosted` / `local`). 3. **Grounding** β€” every extracted fact must carry a **verbatim quote** that is verified against the transcript; if there's no real quote, the fact is dropped, not shown. Tap a card to see the source sentence. 4. **Memory** β€” a local SQLite file: people are upserted (so the same person accrues memory across conversations), with dismiss + "start fresh" controls. 5. **The feed** β€” four rules surface what matters today: *thoughtful* (a dated event soon), *owed* (a promise you made), *reconnect* (someone gone quiet), *remember* (a fresh, undated signal). 6. **The face** β€” a hand-written HTML/CSS/JS page over `gr.Server()` in Kith's design language, with a conversation-history sidebar and a responsive desktop/phone layout. No default Gradio widgets. **Tech used:** Gradio (`gr.Server`) Β· Cohere Transcribe 2B (ASR) Β· MiniCPM 4.1-8B, OpenBMB (extraction) Β· Hugging Face ZeroGPU Β· SQLite Β· `@gradio/client` Β· WebAudio API Β· Fraunces + Inter. ## Why it fits Build Small - **Every model is small + open, well under 32B** β€” a 2B ASR and an 8B extractor. Small isn't the constraint; for an app about your most private relationships, small + open + a memory you own *is* the pitch. - **OpenBMB MiniCPM is the brain** β€” the whole "what matters about this person" step is MiniCPM doing grounded, schema-constrained extraction. - **Off-Brand** β€” a fully hand-written `gr.Server()` UI, no stock Gradio look. - **Field Notes** β€” an honest writeup of what an 8B can and can't do at this task (see the repo's spike notes). ## Demo video ▢️ **[Watch the Kith demo on YouTube](https://www.youtube.com/watch?v=7l51vC20esM)** ## Social post πŸ“£ **[Read the launch post on X](https://x.com/ooi_yee_fei/status/2066884944480387503)**