How Bitloops Works
Bitloops now follows a daemon-first architecture.
High-Level Flow
- The fastest default onboarding path is
bitloops init --install-default-daemonfrom inside the repository or subproject you want to capture. - That command bootstraps the default daemon service if needed, creates or updates
.bitloops.local.toml, and installs hooks. - If you want to bootstrap the daemon separately,
bitloops startlaunches the global daemon and, on a fresh machine, can prompt to create the default daemon config. - During that first default-config bootstrap,
bitloops startalso owns the first interactive telemetry consent prompt unless you pass an explicit telemetry flag. bitloops enableandbitloops disabletoggle capture in the nearest discovered project policy.- If telemetry consent later becomes unresolved for an existing daemon config, interactive
bitloops initandbitloops enablecan prompt again. - Hooks and the slim CLI resolve the nearest project policy locally.
- The CLI parses or compiles requests locally, then the daemon receives mutations and queries over the local GraphQL transport.
- The daemon stores durable data in configured backends and serves the dashboard and DevQL.
Components
- Global daemon service:
com.bitloops.daemon - Thin CLI: lifecycle, hooks, DevQL, dashboard launcher
- Repo policy:
.bitloops.tomland optional.bitloops.local.toml - Global daemon config:
config.tomlin the platform config directory
Default Storage Categories
- Config directory: daemon config
- Data directory: SQLite, DuckDB, blob storage
- Cache directory: embedding downloads, dashboard bundle
- State directory: daemon runtime metadata, daemon runtime SQLite, and hook scratch files
- Repo runtime directory:
<config root>/stores/runtime/runtime.sqlite
This separation keeps configured relational, event, and blob stores machine-scoped by default while preserving repo-scoped runtime state for active workflow data.