13
Every meeting, recallable

Picaku

An AI meeting assistant. Record a meeting, get its summary, decisions and action items, then chat with everything you have ever discussed.

PythonTypeScript ragfastapipgvectorllm
click to turn
Scoped, then global

Chunks from six meetings in one vector store. A scoped thread filters before it searches. Illustrative, from the documented RAG design.

Sync answers first
recordclient-sideoffline queue transcribeWhisperor on-device POST /syncsaves raw text200 OK at onceclient clears copy BACKGROUND TASK extractLLM → strict JSONsummary · decisionsaction items embedONNX MiniLM, 384-dchunks + summaries→ pgvectoredits re-embed email draftLangGraph · on requestsaved as a Gmail draftnever sends chatWHERE user_id = meAND note_id, if scopedTHEN the vector searchlast 10 messages,read from the database

The sync endpoint saves the raw transcript and returns 200 at once. Extraction and embedding run behind it, so a client never waits on a model.

Division of labour

No single model runs the pipeline. Whisper transcribes. A reasoning model, routed through OpenRouter, turns the transcript into strict JSON — title, a summary scaled to the meeting’s length, decisions, action items — and answers chat.

Embeddings run inside the backend on ONNX Runtime: 384 dimensions, no paid embedding API. Torch was removed from the production image entirely, and the new vectors were parity-checked against the old ones at cosine 1.0.

A meeting note — summary and key decisions, extracted
running A meeting note — summary and key decisions, extracted

Why the model stays in the cloud

Elsewhere on this site a phone runs the model. This one wrote down why it can’t: a model large enough to return valid structured JSON every time does not fit in a phone’s memory once the OS has taken its share, and one that fits is not reliable enough. The transcript leaves the device for sync and embedding anyway.

Scope belongs to the thread

A note has one long-lived thread, and its scope is fixed when the thread is created. A later message that omits the note id inherits it — a client resuming a thread by id alone used to silently widen it to every note.

Short-term memory is the last ten messages, read from the database rather than from the history a client uploads. Both clients had been echoing the question back, so the model saw it twice.

Drafts, never sends

A LangGraph agent writes the follow-up email and saves it as a Gmail draft. It runs only when asked — drafting every meeting automatically flooded inboxes — checks that the meeting has real content first, and never sends anything.

Status, honestly

In production on FastAPI, Supabase Postgres with pgvector, and Google sign-in. A Flutter client is in progress against on-device speech models served from Picaku’s own CDN.

The repository is private, so there is no source link here.

Outcome

Picaku

Chapter 14
ValoBot

Valorant esports intelligence — live match, team and player data from VLR.gg, paired with CYPHER, an analyst grounded in it.

continue
13 — Picaku
scroll · drag · ← →