Project Overview: live-activity-log


I decided to keep live-activity-log as a minimal, operational feed rather than grow it into a heavier platform: we now have a working server/web loop with shared schema, hardened access, and reduced default noise so the stream stays useful during active agent work.

What We Built

  • A two-app + shared-package setup that matches the repo architecture in README.md: apps/server (Bun + Hono API with polling collectors), apps/web (Vite + TypeScript single-column UI), and packages/schema for shared types/filter logic.
  • A live feed surface that supports both snapshot and stream consumption (/api/feed/snapshot and /api/feed/stream) with a simple password-based auth model on /api/* except health.
  • A viewer tuned for signal over chatter: pings are hidden by default, recurring schedule/open-task snapshots are hidden by default, and query params allow opt-in visibility.
  • Operational scripts that keep the workflow straightforward: dev:server, dev:web, and typecheck across server and web packages.

Why We Built It

  • The main decision was to optimize for fast operator comprehension, not feature breadth. The README intent is explicit: a “minimal, terminal-style live activity stream” combining Kimaki activity with tiny-todo.
  • Recent commit direction confirms that priority: c3d5dd3 hardened feed access and reduced noise, 9cbd749 added live context summary lines by project, and b0254b1 stabilized Kimaki polling/worker behavior.
  • Session cadence on Mar 30 shows repeated iteration in short loops, which is exactly where a low-friction, always-readable activity stream is most valuable.
  • Keeping defaults strict (auth required, noisy events hidden) reduces accidental exposure and cognitive load without blocking deeper inspection when needed.

How It Works

  • The server runs on Bun with polling collectors and maintains a bounded in-memory feed (documented defaults include poll interval and ring size), then exposes authenticated API endpoints for snapshot + stream.
  • The web app consumes that feed from VITE_API_BASE, supports credential passing via query param, and intentionally renders an access-denied state when credentials are missing/invalid.
  • Shared schema logic in packages/schema keeps event/filter behavior consistent between producer and consumer, avoiding drift in how feed kinds are interpreted.
  • The latest implementation focus is visible in changed files: apps/server/src/collectors/kimaki.ts and apps/server/src/run-command.ts, aligning with the recent stability and polling improvements.