Skip to content

Repository files navigation

Boucle

Boucle is a self-hosted chief-of-staff loop. It turns captures into tickets, runs recurring agent work, and keeps project and meeting context in a local Markdown brain.

The workflow is capture → tickets → loops → brain. SQLite stores tickets, conversations, schedules, and cost records. Markdown files remain the source of truth for project and meeting context.

The Boucle queue: capture box, activity heatmap, and project cards

Architecture

Capability Implementation Local state
Chat and tools Selected OpenAI-compatible HTTP provider with a local tool relay Conversations and messages in SQLite
Embeddings Selected provider embedding endpoint with lexical fallback Model-scoped vectors in SQLite
Transcription Selected provider audio transcription endpoint Audio is sent for transcription, then the text enters capture
Agent loops Vibe, Codex, or Claude CLI with Boucle's MCP tools Schedules, runner overrides, transcripts, and reported costs
Brain Markdown project and meeting notes with hybrid search Files under BOUCLE_BRAIN_DIR

Providers

BOUCLE_PROVIDER Services Chat and tools Embeddings Transcription
mistral or unset Mistral Yes Yes Yes
openai OpenAI, Ollama, OpenRouter, vLLM, and compatible gateways Yes When the endpoint exists When the endpoint exists

Mistral is the default provider. Vibe is the default loop runner. Provider and runner selection are independent.

Runner Binary Session cost
vibe vibe Reported by Vibe
codex codex n/a when the Codex session does not expose cost
claude claude Reported by Claude's JSON result

Quickstart

Use Node 23.6 or later (24 LTS recommended) and pnpm. The bundled demo needs one Mistral API key.

git clone https://github.com/lorisalx/boucle.git
cd boucle
cp .env.example .env
chmod 600 .env

Set the key in .env:

MISTRAL_API_KEY=replace_with_your_key

Install, build, and start Boucle:

pnpm install
pnpm --dir web install
pnpm --dir web build
node src/server.ts

Open http://localhost:4419.

Extensions

Boucle is extensible without forking. An extension is a plain TypeScript module — a directory with an index.ts that default-exports a manifest — loaded with dynamic import() at startup: no build step, no bundler. It can add agent tools, HTTP routes, web pages, runners, providers, and event handlers. Drop one in $BOUCLE_EXTENSIONS_DIR (default $XDG_DATA_HOME/boucle/extensions) and restart; boucle ext list shows what loaded. Extensions run in-process with full privileges, so only install ones you trust. See Extensions and the bundled extensions/hello-world/ template.

Documentation

About

Self-hosted chief-of-staff loop: capture, tickets, agent loops, and a Markdown brain. Pluggable LLM providers (Mistral, OpenAI-compatible), agent runners (Vibe, Codex, Claude), Apache-2.0.

Resources

Stars

3 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages