Honeylog

Consent-first, on-device memory journal for Bee.

Inspiration

Bee is always listening, but almost nothing on the market is always remembering responsibly. Users want a second brain for their day — what did I promise at lunch, where did I park. Every product that delivers this ships raw audio and transcripts to the cloud. That trade is fine for a smart speaker; it is not fine for a wearable that clips to your collar and hears everything.

The question that drove Honeylog: can a wearable build a useful memory of your day without ever sending the day anywhere? Not privacy mode as a checkbox — actually on-device, actually yours, actually searchable.

What I learned

Retrieval beats capture. Transcription is solved-ish at tiny model sizes. The hard part is deciding what deserves to be remembered: a day of ambient audio is 200,000+ words, and if you keep all of it, recall collapses.

Privacy claims must be measurable. "We don't upload audio" is a slogan. "This device transmits at most (E) bits per day under (\epsilon)-differential privacy, and here is the budget" is a claim you can verify.

Recency is not relevance. My first ranking was pure time-decay. It was bad. Users wanted people and promises over ambient chatter, regardless of age.

How I built it

Bee audio -> VAD -> Whisper-tiny -> moment extraction
          -> on-device embedding -> salience score
          -> SQLite + sqlite-vec (local)
          -> optional sync: salience buckets only -> AWS

Each moment is scored by relevance × recency × category prior:

$$ s(q,m) = \cos(e_q,e_m)\cdot\gamma^{\Delta t(m)}\cdot\pi_{c(m)} $$

with (\gamma \approx 0.94) per day and priors boosting people, commitments, and locations. Only salience buckets sync, under a daily budget of (\epsilon = 0.8), (\delta = 10^{-6}) — shown honestly in the dashboard.

Storage turned out to be easy: at 384-dim int8 embeddings and 64 MB, Honeylog holds ~170,000 moments, over two years of dense use. Ranking is where the design effort belongs.

Challenges

Battery. Whisper-tiny cut a 6-hour day to 4. VAD gating plus int8 quantization recovered ~90 minutes.

Embedding drift. Changing models broke old vectors. Fixed with versioned vector tables and a background re-index (~40k moments in two minutes).

Consent as UX. Users wanted to redact a single moment without wiping the day. Fixed with per-moment tombstones included in the sync delta.

Noise at (\epsilon = 0.8). Smoothed over a 7-day window rather than hiding the jitter.

Next

A promise ledger that surfaces commitments when they're due, a pluggable salience scorer, and eventually the whole pipeline running on the wearable itself.

Built With

Share this project:

Updates

Submission history