Inspiration

Most decisions in a small software project are made out loud and never reach a document. A week later the code shows what changed but not why, and an old decision gets undone without anyone noticing. Bee already hears those conversations; we wanted it to remember the decisions and speak up when you change your mind.

What it does

Try it live, nothing to install: the demo (read-only, no sign-in).

Why reads the owner's real Bee recordings (in Spanish, 3 to 20 October 2026) and writes a daily log in English: each decision, why it was made, a short quote (kept private), pending items and open questions, with up to three public GitHub commits linked to each decision. Four real work days are public in the demo.

  • It filters before it stores. Bee listens all day, so speech outside work hours is cut off and each work-hours segment gets a work-or-personal check. Personal speech is never stored or analyzed; the page shows only "N personal conversations ignored".
  • It acts inside Bee. When a new decision directly contradicts an earlier one, Why writes a Bee todo ("You changed your mind about X: old -> new. Confirm?") with an alarm 10 minutes later, and the page shows a Changed badge with the old decision's commits as "work that may need undoing". (None of the published real days contains a change of mind, so this path is shown by tests and approved examples, not by the demo data.) A decision with a concrete next step becomes a Bee todo, which Why completes when a matching public commit lands; the demo's 7 October follow-up is a real todo in the owner's Bee app.
  • You can ask it. "What did I decide about ...?" by voice or text; the answer cites its decisions, Amazon Polly speaks it, and an unknown topic gets "I couldn't find that", never an invented answer. An Alexa skill, "Why decisions", answers from the public copy.
  • Coding agents can ask it. Five read-only MCP tools (why_check_change, why_explain_commit, why_search, why_ask, why_open_followups) let Claude Code or any MCP client check a planned change against past decisions. One command connects to the public demo endpoint; ask it to "build an iOS version of the mobile app" and it answers conflicts with the real decision of 20 October to build for Android only, with its reason.

How we built it

  • Collection on the owner's PC. Bee's API sits behind a private certificate authority and its token lives in the OS credential store, so a Windows scheduled task runs the bee CLI every 5 minutes with a least-privilege IAM user. The Bee token never reaches AWS.
  • Amazon Nova 2 Lite on Bedrock does every model job: the work filter, extraction with a forced tool call validated by a zod schema, the reversal judge, name review before publishing, and cited answers.
  • Serverless on AWS, defined in one CDK stack checked by cdk-nag: Lambda behind CloudFront, DynamoDB with its own KMS key (raw transcripts expire after 30 days), Cognito with TOTP MFA for the owner, S3, Polly, CloudWatch and SNS. No servers, containers or load balancers.
  • Public by IAM, not just by code. Only approved days are published, as a filtered copy: emails, phones, card numbers and credential links redacted; names of people, clients and client projects replaced by a role by a model review that fails closed; verbatim quotes never published. The demo, Alexa and MCP functions run under roles that can only read PUB# keys.
  • Domain rules as tests. The work filter, reversal and follow-up rules are approved examples in domain/ that run in the test suite: 314 tests pass, no AWS needed.

Challenges we ran into

  • A Bee conversation stayed CAPTURING for more than 20 hours and kept absorbing new recordings, so "wait until it ends" never fired. We split conversations into sessions at 20-minute gaps and reported it upstream (bee-cli issue 21).
  • bee todos create has no idempotency key, so a crash after a create could duplicate an alert. Why saves the todo as "creating" first and adopts a matching todo on the next run.
  • The first extraction prompt recorded status updates as decisions; a stricter prompt, a glossary of names and a cap of three commits per decision fixed what the owner's review found.
  • CloudFront with origin access control rejects x-amz-content-sha256 in an origin request policy and overwrites Authorization: one failed deploy.
  • On Apple Watch, starting to listen sometimes switched back to mute by itself, silently losing capture.
  • Our own privacy bug, caught in the preview before anything was published: on real days the batch name review came back cut off or with the texts merged into one, and the old code then kept the texts unchanged. It now works in small batches, falls back to one text at a time, and fails closed; verbatim quotes are no longer published.

Accomplishments that we're proud of

  • It runs on real Bee data every 5 minutes, not on a mocked feed.
  • Privacy is enforced by IAM and by a mandatory preview, not by trusting a model.
  • It closes the loop inside the app the owner already checks: alerts and follow-ups as Bee todos that close themselves.
  • It is honest about its quality. On a synthetic bench of 12 invented cases, the agent change check found every conflict (precision 1.00, recall 1.00) with an overall accuracy of 0.83. Extraction accuracy on a real day is not measured yet: a local labeling tool and npm run accuracy are ready, and no number is claimed until the owner labels a day.

What we learned

  • With an always-on wearable, the filter is the product: what you throw away matters as much as what you keep.
  • Make alerts rare: only a direct contradiction is a reversal; a refinement or a repeat is linked without an alert.
  • Put the privacy guarantee where a mistake can't undo it: an IAM condition, a second deterministic redaction pass after the model.

What's next

Label real days and publish the measured accuracy, record a real change of mind for the demo, and move collection to the cloud if Bee offers a stable token and a publicly trusted endpoint.

Built With

Share this project:

Updates

Submission history