Skip to content

arcavenai/ThreeDoors

Β 
Β 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

369 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

ThreeDoors πŸšͺπŸšͺπŸšͺ

Go Version License Built with Bubbletea

What is ThreeDoors?

ThreeDoors is a radical rethinking of task management that reduces decision friction by showing you only three tasks at a time. Instead of overwhelming you with an endless list, ThreeDoors presents three carefully selected "doors" β€” choose one, take action, and move forward.

The Problem

Traditional task lists create choice paralysis. Staring at 50+ tasks makes it hard to start anything. You spend more time reorganizing and re-prioritizing than actually doing the work.

The ThreeDoors Solution

  • Three doors, one choice β€” Reduces cognitive load by limiting options
  • Refresh when needed β€” Don't like your options? Roll again
  • Quick search β€” Press / to find something specific
  • Mood-aware tracking β€” Log your emotional state to understand work patterns
  • Pattern learning β€” Over time, learn which tasks you avoid and why
  • Avoidance detection β€” Automatically surfaces tasks you keep skipping
  • Values alignment β€” Keep your goals front-and-center while working

Features

Core Task Management

  • πŸšͺ Three Doors Display β€” View three randomly selected tasks, avoiding recently shown ones
  • πŸ”„ Refresh Mechanism β€” Re-roll doors when nothing appeals
  • βœ… Task Status Workflow β€” Complete, block, defer, expand, fork, or flag tasks for rework
  • βž• Quick Add β€” Add tasks inline with :add or press a; supports context capture with :add --why
  • 🏷️ Inline Tagging β€” Tag tasks as you add them: Design homepage #creative #deep-work @work
  • πŸ“‚ Task Categorization β€” Classify by type (creative, technical, administrative, physical), effort (quick-win, medium, deep-work), and location (home, work, errands, anywhere)
  • πŸ”— Cross-Reference Linking β€” Link related tasks together; browse and navigate links from detail view

Search & Commands

  • πŸ” Quick Search β€” Press / for live task search with fuzzy filtering
  • ⌨️ Command Palette β€” Press : for vi-style commands (:add, :mood, :stats, :health, :dashboard, :goals, :help)

Analytics & Insights

  • πŸ“Š Session Metrics β€” Automatic tracking of door selections, bypasses, and timing data
  • πŸ“ˆ Daily Completion Tracking β€” Track completions per day with streak counting
  • πŸ“‹ Insights Dashboard β€” View trends, streaks, mood correlations, and avoidance patterns (:dashboard)
  • 😊 Mood Correlation Analysis β€” Discover how your emotional state affects task selection
  • 🚨 Avoidance Detection β€” Tasks bypassed 10+ times trigger an intervention prompt offering breakdown, deferral, or archival
  • 🧠 Pattern Analysis β€” Identifies door position bias, task type preferences, and procrastination patterns

Apple Notes Integration

  • 🍎 Bidirectional Sync β€” Read and write tasks from Apple Notes
  • πŸ”Œ Provider Architecture β€” Switch between text file and Apple Notes backends via config.yaml
  • 🩺 Health Check β€” Run :health to verify provider connectivity, file access, and disk space

Sync & Offline-First

  • πŸ’Ύ Write-Ahead Log (WAL) β€” Crash-safe task persistence with atomic writes
  • πŸ“‘ Offline Queue β€” Local change queue with replay when connectivity returns
  • πŸ”„ Sync Status Indicator β€” Visual sync state per provider in the TUI

Calendar Awareness

  • πŸ“… Local Calendar Reader β€” Reads from macOS Calendar.app (AppleScript), .ics files, and CalDAV caches
  • ⏰ Free Block Detection β€” Computes available time blocks between calendar events

Enrichment Database

  • πŸ—ƒοΈ SQLite Storage β€” Pure-Go SQLite (no CGO) for task metadata, cross-references, learning patterns, and feedback history
  • πŸ•ΈοΈ Cross-Reference Graph β€” Track relationships between tasks across providers

LLM Task Decomposition (Spike)

  • πŸ€– Task Breakdown β€” Decompose complex tasks into stories using Claude or local Ollama
  • πŸ“ Git Integration β€” Write generated story specs directly to git repos

User Experience

  • πŸ‘‹ First-Run Onboarding β€” Guided welcome flow with keybinding tutorial, values/goals setup, and optional task import
  • 🎯 Values & Goals Display β€” Persistent footer showing your values as you work
  • 😊 Mood Logging β€” Capture emotional state anytime with presets or custom text
  • πŸ’¬ Door Feedback β€” Rate doors as blocked, not-now, or needs-breakdown to improve selection
  • πŸ’‘ Session Improvement Prompt β€” On quit, optionally share improvement suggestions
  • ➑️ Contextual Next Steps β€” After completing or adding a task, see relevant next actions

Distribution

  • 🍺 Homebrew β€” Install via brew install arcaven/tap/threedoors
  • πŸ” Signed & Notarized β€” macOS binaries are code-signed and Apple-notarized
  • πŸ’» Cross-Platform Binaries β€” Pre-built for macOS (ARM & Intel) and Linux (x86_64)
  • πŸš€ GitHub Releases β€” Automatic releases on every merge to main

Key Bindings

Three Doors View

Key Action
a / Left Select left door
w / Up Select center door
d / Right Select right door
s / Down Refresh doors (re-roll)
n Send feedback on selected door
/ Open quick search
: Open command palette
m Log mood
q / Ctrl+C Quit

Task Detail View

Key Action
c Mark complete
i Mark in progress
b Mark blocked (prompts for reason)
e Expand task (break down)
f Fork task (clone/split)
p Procrastinate (defer)
r Flag for rework
l Link to another task
x Browse cross-references
m Log mood
Esc Return to doors

Search Mode

Key Action
Type Live filter tasks
j / Down Next result
k / Up Previous result
Enter Open selected task
Esc Exit search

Command Palette

Command Action
:add <task> Add a new task
:add --why Add task with context (why it matters)
:mood [mood] Log mood (or open selector)
:tag Open task categorization editor
:stats Flash session statistics
:health Run system health check
:dashboard Open insights dashboard
:insights Show full insights dashboard
:insights mood Flash mood & productivity insights
:insights avoidance Flash avoidance patterns
:goals Open values & goals setup
:goals edit Edit existing values & goals
:help Show all commands
:quit Exit application

Getting Started

Option 1: Homebrew (macOS)

brew install arcaven/tap/threedoors

Option 2: Download Pre-built Binary

Download the latest release from GitHub Releases. Binaries are available for:

Platform Binary
macOS (Apple Silicon) threedoors-darwin-arm64
macOS (Intel) threedoors-darwin-amd64
Linux (x86_64) threedoors-linux-amd64
chmod +x threedoors-*
mv threedoors-darwin-arm64 /usr/local/bin/threedoors   # adjust for your platform

Option 3: Install with go install

go install github.com/arcaven/ThreeDoors/cmd/threedoors@latest

Option 4: Build from Source

Prerequisites: Go 1.25.4+, Git, Make (optional)

git clone https://github.com/arcaven/ThreeDoors.git
cd ThreeDoors
make build
# Binary at bin/threedoors

Usage

  1. Launch the app:
    threedoors
  2. First run starts the onboarding wizard β€” learn key bindings, set your values/goals, and optionally import existing tasks.
  3. Select a door with a (left), w (center), or d (right).
  4. Re-roll doors with s if nothing appeals.
  5. Act on a task using status keys: c (complete), b (blocked), i (in progress), p (procrastinate).
  6. Add tasks with :add Buy groceries #quick-win @errands.
  7. Log your mood with m.
  8. Search with / to find a specific task.
  9. View insights with :dashboard to see trends and patterns.

Data Directory

All data is stored locally in ~/.threedoors/:

~/.threedoors/
β”œβ”€β”€ tasks.yaml          # Active tasks (YAML format)
β”œβ”€β”€ config.yaml         # Provider configuration
β”œβ”€β”€ values.json         # Your values & goals
β”œβ”€β”€ completed.txt       # Completed task log
β”œβ”€β”€ sessions.jsonl      # Session metrics (JSON Lines)
β”œβ”€β”€ patterns.json       # Cached pattern analysis
β”œβ”€β”€ enrichment.db       # SQLite enrichment database
β”œβ”€β”€ improvements.txt    # Your improvement suggestions
└── onboarding.lock     # First-run marker

Development

Tech Stack

  • Language: Go 1.25.4+
  • TUI Framework: Bubbletea + Lipgloss
  • Database: modernc.org/sqlite (pure Go, no CGO)
  • Architecture: Model-View-Update (MVU) with provider pattern
  • Build System: Make
  • CI/CD: GitHub Actions (lint, test, build, sign, notarize, release, Homebrew update)

Project Structure

ThreeDoors/
β”œβ”€β”€ cmd/threedoors/           # Entry point
β”œβ”€β”€ internal/
β”‚   β”œβ”€β”€ tasks/                # Task domain: models, providers, sync, analytics
β”‚   β”œβ”€β”€ tui/                  # Bubbletea views (13 views) and UI components
β”‚   β”œβ”€β”€ calendar/             # Local calendar readers (AppleScript, ICS, CalDAV)
β”‚   β”œβ”€β”€ enrichment/           # SQLite enrichment database
β”‚   β”œβ”€β”€ intelligence/llm/     # LLM backends (Claude, Ollama) & task decomposition
β”‚   β”œβ”€β”€ dist/                 # macOS code signing, notarization, pkg building
β”‚   └── ci/                   # CI validation tests
β”œβ”€β”€ Formula/                  # Homebrew formula
β”œβ”€β”€ scripts/                  # Analysis & build scripts
β”œβ”€β”€ docs/                     # PRD, architecture, stories, research
└── Makefile

Make Targets

make build          # Build the application
make run            # Build and run
make test           # Run tests
make lint           # Run golangci-lint
make fmt            # Format with gofumpt
make clean          # Remove build artifacts
make sign           # Code-sign binary (requires APPLE_SIGNING_IDENTITY)
make pkg            # Build macOS .pkg installer
make release-local  # Build + sign + pkg

Code Style

We use gofumpt (stricter than gofmt) and golangci-lint. See CLAUDE.md for full coding standards.

make fmt    # Format code
make lint   # Run linter (must pass with zero warnings)

Philosophy

  1. Progress Over Perfection β€” Taking action on imperfect tasks beats perfect planning
  2. Reduce Friction β€” Every interaction should feel effortless
  3. Learn from Behavior β€” Track patterns to help users understand their work habits
  4. Emotional Context Matters β€” Mood affects productivity; acknowledge and track it
  5. Power Users Welcome β€” Vi-style commands without sacrificing simplicity
  6. Local-First β€” Your data stays on your machine, no accounts, no telemetry

Data & Privacy

  • All data is local β€” Stored in ~/.threedoors/
  • No telemetry β€” Session metrics stay on your machine
  • No accounts β€” No sign-ups, no servers, no tracking
  • Offline-first β€” Works without network; syncs when available

Contributing

Before contributing:

  1. Read the PRD and Architecture docs
  2. Check current status in the epic list
  3. Open an issue to discuss significant changes

To contribute:

  1. Fork the project
  2. Create your feature branch (git checkout -b feature/AmazingFeature)
  3. Follow coding standards (make lint && make fmt)
  4. Write tests for new functionality
  5. Commit your changes
  6. Push and open a Pull Request

Code Quality Requirements:

  • gofumpt formatting
  • golangci-lint passes with zero warnings
  • Unit tests for new logic
  • No //nolint without justification

Documentation

License

Distributed under the MIT License. See LICENSE for more information.

Acknowledgments

Built with the Charm ecosystem:

Links


"Progress over perfection. Three doors. One choice. Move forward." πŸšͺ✨

About

ThreeDoors is task enablement reimagined from todo lists to something that works with human factors

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages

  • Go 97.8%
  • Shell 1.3%
  • Other 0.9%