LegacyOS: oral knowledge, searchable
Elders' recordings transcribed with Whisper and made answerable, with every answer citing who said it and when.
- Organisation
- Merciven (MVP)
- My role
- Designed and built it
- When
- 2025
- Stack
- Whisper, Claude, PostgreSQL, pgvector
Problem statement
Knowledge about crafts, farming and family history lives in elders' memories and is lost when they die. Recordings help, but nobody listens back through hours of audio to find one answer.
Objectives & goals
- Transcribe recordings in local accents
- Answer questions in plain language
- Cite the speaker and timestamp for every answer
- Say "I don't know" rather than invent
Process
- DiscoverSpoke with families and community archivists about what they wanted to keep.
- DefineChose retrieval with citations over a chatbot, and made consent a required field.
- BuildWhisper transcription, chunking, pgvector retrieval, Claude answers from retrieved passages only.
- ProveTests for retrieval, citations and refusal on uncovered questions.
Who it's for
Asks what grandma said about the family land.
Needs exact quotes with timestamps.
Challenges
- Models fill gaps with plausible fiction
- Recordings need consent before they're stored
- Long, rambling speech has to be cut into answerable chunks
What I built
Answers name the speaker, recording and timestamp.
Below a relevance threshold, it says the recordings don't cover the question.
A recording can't be stored without a consent reference.
HNSW index on embeddings in Postgres.
Flow
- Record
- Whisper transcript
- Chunk by speaker and time
- Embed into pgvector
- Retrieve
- Claude answers from passages
- Cite speaker and timestamp
Output
$ python -m legacyos "Which colour of aso oke was for chiefs?" ... Alaari, the deep red, was for chiefs and important ceremonies. [Elder A (fictional), Weaving recording 1 at 00:00:12]
Results
Tools & languages
The code
Runs offline with a small TF-IDF embedding; uses Claude when an API key is set. Includes the pgvector schema. 3 tests.
The repository is private. I'm happy to share it with a hiring team or walk you through it on a call.
Samples are written with synthetic data. No client code or client data is used.