Workwarrior is a profile-based productivity system that integrates TaskWarrior, TimeWarrior, JRNL, and Hledger under a unified shell workflow. Each profile is isolated, with its own configuration, data stores, services, and aliases.
Goals
- Fast, terminal-first workflows
- Clean separation between work contexts
- Extensible services for repeated tasks
- Simple backup/restore and portability
- Profile lifecycle management (create, list, info, delete, backup)
- Shell integration (aliases + global functions)
- Question templates for consistent capture
- Service registry with profile-specific overrides
- Tests for core properties and integrations
Prerequisites (optional but recommended)
- TaskWarrior - task management
- TimeWarrior - time tracking
- JRNL - journaling
- Hledger - ledger accounting
- Bugwarrior - issue synchronization (optional)
- Python 3 - used by Questions Service
The installer will check for these and warn if missing, but will continue.
Quick Install
git clone <repo-url> ~/workwarrior
cd ~/workwarrior
./install.sh
source ~/.bashrcThis installs workwarrior to ~/ww and adds the ww command to your shell.
Install Options
./install.sh # Interactive install
./install.sh --non-interactive # Automated (no prompts)
./install.sh --force # Reinstall/upgradeUninstall
./uninstall.sh # Remove (keeps profiles)
./uninstall.sh --purge # Remove everything-
Create a profile:
ww profile create work
-
Activate the profile:
p-work
-
Use global helpers:
j "Daily log entry" l balance task add "My first task" i pull # Sync issues (if configured)
-
Questions service:
q q new journal q journal daily_reflection
Using the ww command:
ww profile create <name> # Create a new profile
ww profile list # List all profiles
ww profile info <name> # Show profile details
ww profile delete <name> # Delete a profile
ww profile backup <name> # Backup a profile
ww groups list # List profile groups
ww groups create <name> ... # Create a group with profiles
ww groups show <name> # Show profiles in a group
ww models list # List configured models
ww models providers # List model providers
ww models show <name> # Show model details
ww find <term> # Search across profiles
ww extensions taskwarrior list --status active # List Taskwarrior extensions
ww service list # List available services
ww shortcut list # List available shortcuts
ww shortcut info <key> # Show shortcut details
ww shortcut add <key> ... # Add or update a user shortcut
ww shortcut remove <key> # Remove a user shortcut override
ww version # Show version
ww help # Show helpNotes:
- Use
ww groups ...(plural).ww group ...is not supported. - You can run
help <command>as a shortcut forww help <command>(e.g.,help groups). - Standalone commands are available without
ww:extensions,models,groups,journals,ledgers,find,services,tasks,times. - Run
ww help standaloneto see the full list.
Global shell functions:
j [journal-name] <entry> # Write to journal
l [args] # Access default ledger
i [args] # Bugwarrior issue sync
list [args] # List management
task [args] # TaskWarrior
timew [args] # TimeWarriorIssues service (Bugwarrior):
i pull # Sync issues from external services
i pull --dry-run # Test configuration
i custom # Configure services (GitHub, Jira, etc.)
i uda # List bugwarrior UDAsSee services/custom/README-issues.md for complete issues service documentation.
Direct script access:
scripts/create-ww-profile.sh <profile-name>
scripts/manage-profiles.sh list|info|delete|backupSome commands support scope flags to run without activating a profile:
list --global # Use global list workspace
list --profile work # Use a specific profile without activation
j --profile work "Entry" # Write to a profile journal directly
l --global balance # Use global ledger
task --global add "Item" # Use global TaskWarrior data
timew --profile work summary # Use a specific profile's TimeWarrior dataNotes:
j customopens custom journal configuration for the active or targeted profile.l customopens custom ledger configuration for the active or targeted profile.i customopens issues service configuration for the active or targeted profile.j custom,l custom, andi customare not available for--global.- Issues service (
i) requires a profile and does not support--global.
When a profile is active, these are set:
WARRIOR_PROFILE– active profile nameWORKWARRIOR_BASE– active profile base directoryTASKRC– path to profile.taskrcTASKDATA– path to profile.taskTIMEWARRIORDB– path to profile.timewarrior
workwarrior/
├── lib/ # Core libraries
├── scripts/ # CLI entrypoints
├── services/ # Services registry (global)
├── profiles/ # User profiles (created at runtime)
├── resources/ # Templates and supporting files
├── tests/ # Property and integration tests
└── .kiro/ # Specs and requirements
Services live in services/<category>/. Profile-specific overrides can be added under <profile>/services/<category>/ and take precedence when a profile is active.
See services/README.md for the registry overview and service development patterns.
docs/service-development.md– how to build and register servicesdocs/usage-examples.md– practical workflows and CLI usagedocs/search-guides/– tool-specific search guidesdocs/setups/– setup notes for integrated toolsdocs/archive/– archived historical references
Implementation status is tracked in IMPLEMENTATION_STATUS.md.