Getting Started
Everything you need to capture your dev story, generate summaries, and share your work with the world.
Quick Start
Up and running in under 5 minutes.
1 Install the Desktop App
Download the Tauri desktop app for your platform. Terminal Biographer supports Windows, macOS, and Linux.
$ git clone https://github.com/dangerous-media/terminal-biographer.git
$ cd terminal-biographer
2 Start the Server
The FastAPI server handles event capture, summarization, and the API. Launch it with one command:
# Server starts on http://localhost:7749
# PID tracked automatically for restart/stop
--restart to restart or --stop to shut down. Use --status to check if the server is running.
3 Open the UI
Launch the Tauri desktop app, or open the web UI directly at http://localhost:7749. You’ll see your daily timeline, capture status, and summary controls.
$ cd app && cargo tauri dev
Capture Sources
Terminal Biographer watches your workflow from multiple entry points.
Terminal
Shell commands from bash, zsh, PowerShell, and cmd are captured automatically when the capture hook is active. Each command logs the command text, timestamp, working directory, and exit code.
event: terminal_command
cmd: “git push origin main”
cwd: “/home/dev/my-project”
timestamp: “2026-04-02T14:32:01Z”
VS Code
File open, save, and close events are tracked via the VS Code extension. We capture file paths and timestamps, not file contents.
AI Chats
Conversations from Claude, ChatGPT, Gemini, and other AI tools can be captured two ways:
- Desktop: The capture hook monitors configured AI chat applications and logs conversation excerpts.
- Mobile: Use the Android Share Sheet to share any text from any AI app directly into your daily log.
Git
Git commits, branch changes, merges, and pushes are captured via a post-commit hook. Install it in any repository you want to track:
$ cp tools/dwl/hooks/post-commit .git/hooks/
$ chmod +x .git/hooks/post-commit
Summaries
Two engines, three formats, zero manual effort.
Template Summarizer (Free)
The default summarizer uses pattern detection and heuristic templates to generate structured summaries. No API calls, no cost, fully offline.
- Groups events by source and project
- Detects key activities (deployments, bug fixes, refactors)
- Generates ops report, blog post, and LinkedIn post formats
$ DWL_SUMMARIZER=template python -m tools.dwl.summarize –date 2026-04-02
Claude Summarizer (Premium)
The premium tier sends your encrypted events to the Anthropic API, which generates natural-language narratives with personality, technical insight, and storytelling structure.
$ DWL_SUMMARIZER=claude python -m tools.dwl.summarize –date 2026-04-02
Output Formats
Both summarizers produce three formats:
- Ops Report — Detailed technical breakdown of your day, suitable for standups and engineering logs.
- Blog Post — Narrative-style post with a catchy title, suitable for dev blogs and personal sites.
- LinkedIn Post — Concise hook + value + proof + CTA format optimized for social engagement.
Auto-Summarize
By default, Terminal Biographer runs auto-summarization at 23:59 daily. Disable with DWL_AUTO_SUMMARIZE=false in your environment.
Sharing
One-click share cards with built-in analytics.
Share Cards
Every summary can be shared via a unique public link. Share cards render beautifully on any device and include your summary content, date, and event count.
Public Links
Each share generates a unique URL. You control which summaries are public — nothing is shared unless you explicitly click “Share”. You can revoke any link at any time.
Analytics Dashboard
For every shared summary, you can see:
- Total & unique views — How many people saw your content.
- Platform breakdown — Desktop vs mobile, OS, browser.
- Referrer sources — Where your traffic came from (LinkedIn, Twitter, direct, etc.).
- Timeline — When views happened, charted over time.
Mobile
Your dev log, in your pocket.
Android App
The Android app uses the same unified UI as the desktop app, built with Tauri v2. It connects to your Supabase cloud sync (or local server via LAN) to display your daily timeline, summaries, and share controls.
$ cd app && cargo tauri android build –debug
Share Sheet Receiver
The killer mobile feature: share text from any Android app directly into your daily log. Select text in Claude, ChatGPT, a browser, or a note-taking app, tap “Share”, and choose Terminal Biographer. The content is added to today’s events instantly.
Sync
Mobile and desktop stay in sync via encrypted Supabase cloud sync. Changes propagate within 5 minutes. Both devices use the same encryption passphrase for seamless decryption.
Self-Hosting
Run Terminal Biographer on your own infrastructure.
Requirements
- Python 3.10+
- pip (package manager)
- Optional: Docker for containerized deployment
Setup
$ git clone https://github.com/dangerous-media/terminal-biographer.git
$ cd terminal-biographer
$ pip install -r requirements.txt
# Configure environment
$ cp .env.example .env
# Edit .env with your settings:
# DWL_API_KEY=your-secret-key
# DWL_SUMMARIZER=template
# DWL_AUTO_SUMMARIZE=true
# Start the server
$ python tools/dwl/start_server.py
Docker
$ docker run -p 7749:7749 -v tb-data:/app/logs terminal-biographer
Cloud Sync (Optional)
To enable multi-device sync with your self-hosted setup, you’ll need a Supabase project:
DWL_SYNC_ENABLED=true
SUPABASE_URL=https://your-project.supabase.co
SUPABASE_SERVICE_KEY=your-service-key
DWL_SYNC_PASSPHRASE=your-encryption-passphrase
Run the Supabase schema migrations from tools/dwl/sql/ to set up the required tables and RLS policies.
Encryption
How Terminal Biographer keeps your data safe.
AES-256-GCM
Terminal Biographer uses AES-256-GCM (Galois/Counter Mode) for all encryption. This is the same standard used by governments and financial institutions. It provides both confidentiality and integrity verification.
How It Works
- Key derivation: Your encryption key is derived from your passphrase using PBKDF2 with a unique salt. This happens entirely on your device.
- Encryption at rest: Every event log, summary, and daily digest is encrypted before being written to disk. Files are stored as encrypted JSONL.
- Encryption in transit: If cloud sync is enabled, data is encrypted on your device before being sent to Supabase. The server only ever sees ciphertext.
- Unique IVs: Each encryption operation uses a random 12-byte initialization vector (IV), ensuring that identical plaintext produces different ciphertext.
Key Management
from tools.dwl.crypto import read_encrypted_jsonl, decrypt_file_content
# Read events from an encrypted JSONL file
events = read_encrypted_jsonl(“logs/events/2026-04-02.jsonl.enc”, key)
# Decrypt a single file
content = decrypt_file_content(“logs/summaries/2026-04-02.json.enc”, key)
Web Crypto API
The browser-based UI uses the Web Crypto API for client-side encryption/decryption. Your passphrase never leaves the browser — all crypto operations happen locally in the WebView.