Voor context over hoe mijn brein werkt, zie Werken met een AuDHD-brein.
Dit is de stack die mijn dagelijkse werk structureert: taskwarrior voor task management, timewarrior voor time tracking, en vit als vim-style interface. Samen vormen ze een keyboard-first, terminal-native productiviteitssysteem.
Geen Electron apps. Geen cloud sync die je data naar Silicon Valley stuurt. Gewoon plain text, lokaal, en razendsnel.
Waarom Deze Stack?
Ik heb jarenlang geworsteld met task management. Todoist, Things, Notion, Obsidian plugins — allemaal geprobeerd, allemaal uiteindelijk verlaten. Het probleem was altijd hetzelfde: te veel frictie.
Taskwarrior lost dit op:
- Snelheid: Task toevoegen in < 1 seconde
- Keyboard-only: Geen muis nodig
- Scriptbaar: Integratie met alles
- Offline: Werkt altijd, overal
- Plain text: Je data is van jou
Installatie
macOS
brew install task timewarrior vit
Linux (Debian/Ubuntu)
sudo apt install taskwarrior timewarrior
pip install vit # of via package manager
Arch Linux
sudo pacman -S task timew vit
Na installatie, run één keer task om de config aan te maken:
task version
# Maakt ~/.taskrc en ~/.task/ aan
Taskwarrior Basics
Tasks Toevoegen
# Simpele task
task add "Review pull request"
# Met tags
task add "Fix login bug" +urgent +backend
# Met due date
task add "Oplevering rapport" due:friday
# Met project
task add "API endpoint schrijven" project:acme.api
# Alles samen
task add "Deploy naar productie" project:acme.api +urgent due:tomorrow priority:H
Tasks Bekijken
task list # Alle pending tasks
task # Zelfde als task list (of task next)
task all # Inclusief completed en deleted
task completed # Alleen afgeronde tasks
task +urgent # Gefilterd op tag
task project:acme # Gefilterd op project
Tasks Beheren
task 1 done # Markeer als klaar
task 1 delete # Verwijderen
task 1 modify +tag # Tag toevoegen
task 1 modify due:monday # Due date wijzigen
task 1 edit # Open in $EDITOR
task 1 info # Alle details
Task Starten/Stoppen
task 1 start # Markeer als "bezig"
task 1 stop # Niet meer bezig
task +ACTIVE # Bekijk actieve tasks
Projecten
Projecten in taskwarrior gebruiken een hiërarchische notatie met punten:
# Project structuur
task add "Iets" project:klant.project.subproject
# Voorbeelden
task add "API ontwerpen" project:acme.api
task add "Tests schrijven" project:acme.api.backend
task add "UI bouwen" project:acme.api.frontend
Projecten Bekijken
# Alle tasks in een project (inclusief subprojecten)
task project:acme list
# Alleen specifiek project
task project:acme.api list
# Project summary
task projects
Context (Project Focus)
Contexts filteren automatisch je view:
# Context definiëren
task context define werk "project:acme or project:byteherder"
task context define acme "project:acme"
# Context activeren
task context acme
# Nu toont 'task list' alleen acme tasks
# Context bekijken
task context show
# Context uitzetten
task context none
Dit is precies wat mijn p functie doet — zie mijn time-system scripts voor de volledige implementatie.
Dependencies
Tasks kunnen van elkaar afhankelijk zijn:
# Task 2 depends on task 1
task 2 modify depends:1
# Meerdere dependencies
task 3 modify depends:1,2
# Bij aanmaken
task add "Deploy" depends:1,2
Blocked Tasks
# Bekijk wat geblokkeerd is
task blocked
# Bekijk wat unblocked is (klaar om te doen)
task unblocked
# Bekijk de dependency chain
task 1 info
# Toont: "blocking: 2, 3" en "blocked by: (none)"
Voorbeeld Workflow
task add "Database schema ontwerpen" # Task 1
task add "API endpoints bouwen" depends:1 # Task 2
task add "Frontend integratie" depends:2 # Task 3
task add "Tests schrijven" depends:1 # Task 4
task add "Documentatie" depends:2,3,4 # Task 5
task list
# ID Dep Description
# 1 Database schema ontwerpen
# 2 1 API endpoints bouwen [blocked]
# 3 2 Frontend integratie [blocked]
# 4 1 Tests schrijven [blocked]
# 5 2-4 Documentatie [blocked]
task 1 done
# Nu zijn task 2 en 4 unblocked
task list
# ID Dep Description
# 2 API endpoints bouwen
# 3 2 Frontend integratie [blocked]
# 4 Tests schrijven
# 5 2-4 Documentatie [blocked]
Tags
Tags zijn flexibele labels:
# Toevoegen
task add "Iets" +urgent +backend +review
# Filteren
task +urgent list
task +backend +review list # AND
task +backend or +frontend # OR
task -urgent # NOT (exclude)
# Tag verwijderen
task 1 modify -urgent
Handige Tag Conventies
+next # Volgende om te doen
+urgent # Hoge prioriteit
+waiting # Wacht op iemand anders
+review # Moet gereviewd worden
+blocked # Handmatig blocked (naast depends)
+quick # < 15 minuten
Prioriteiten
# Drie levels: H(igh), M(edium), L(ow)
task add "Critical fix" priority:H
task add "Nice to have" priority:L
# Wijzigen
task 1 modify priority:M
# Filteren
task priority:H list
Due Dates
Taskwarrior begrijpt natuurlijke taal:
# Specifiek
task add "Meeting" due:2026-01-30
task add "Deadline" due:2026-01-30T14:00
# Relatief
task add "Binnenkort" due:tomorrow
task add "Deze week" due:friday
task add "Over een week" due:1week
task add "Eind van de maand" due:eom
task add "Over 3 dagen" due:3d
# Recurring (herhalend)
task add "Weekly review" due:monday recur:weekly
task add "Standup" due:tomorrow recur:daily until:2026-12-31
Bekijken op Due Date
task due:today list # Vandaag
task due.before:friday # Voor vrijdag
task overdue # Te laat
task +OVERDUE # Zelfde
Reports
Taskwarrior heeft ingebouwde reports:
task list # Standaard lijst
task next # Volgende tasks (slim gesorteerd)
task ready # Klaar om te doen (unblocked, niet waiting)
task blocked # Geblokkeerd door dependencies
task waiting # Wacht op iets
task recurring # Herhalende tasks
task completed # Afgerond
task all # Alles
Custom Reports
In ~/.taskrc:
# Minimale lijst
report.minimal.columns=id,description
report.minimal.labels=ID,Description
report.minimal.filter=status:pending
# Dan: task minimal
Timewarrior Integratie
Timewarrior tracked tijd automatisch wanneer je tasks start/stopt.
Handmatige Tracking
timew start "coding" +projectX # Start tracking
timew stop # Stop
timew # Huidige status
timew summary # Vandaag
timew summary :week # Deze week
timew summary :month # Deze maand
Taskwarrior Hook
Maak automatische integratie:
# ~/.task/hooks/on-modify.timewarrior
#!/usr/bin/env python3
import json
import subprocess
import sys
old = json.loads(sys.stdin.readline())
new = json.loads(sys.stdin.readline())
if 'start' in new and 'start' not in old:
project = new.get('project', 'untagged')
tags = new.get('tags', [])
subprocess.run(['timew', 'start', project] + tags)
if 'start' in old and 'start' not in new:
subprocess.run(['timew', 'stop'])
print(json.dumps(new))
chmod +x ~/.task/hooks/on-modify.timewarrior
Nu start task 1 start automatisch time tracking!
Timewarrior Reports
timew summary :day # Vandaag
timew summary :week # Deze week
timew summary 2026-01-20 - today # Range
timew tags # Alle tags
timew summary :week project:acme # Gefilterd
Tijd Corrigeren
# Huidige tracking aanpassen
timew modify start -30min # Startte 30 min eerder
# Historische entry aanpassen
timew summary :ids # Vind ID
timew modify @1 start 09:00 # Pas start aan
timew delete @1 # Verwijder entry
Vit: Vim Interface voor Taskwarrior
Vit is een TUI met vim keybindings. Perfect als je vim-muscle-memory hebt.
Opstarten
vit # Standaard view
vit project:acme # Gefilterde view
Navigatie
| Key | Actie |
|---|---|
j / k | Omhoog / omlaag |
gg | Naar begin |
G | Naar eind |
Ctrl+d / Ctrl+u | Half page down/up |
/ | Zoeken |
n / N | Volgende/vorige match |
Task Acties
| Key | Actie |
|---|---|
a | Add task |
e | Edit task (in $EDITOR) |
m | Modify (inline) |
d | Done |
D | Delete |
s | Start/stop |
u | Undo |
Enter | Task info |
Modify Voorbeelden
Druk m en type:
project:acme # Zet project
+urgent # Voeg tag toe
-waiting # Verwijder tag
due:friday # Zet due date
depends:1 # Voeg dependency toe
priority:H # Zet prioriteit
Views Wisselen
| Key | View |
|---|---|
1 | next |
2 | list |
3 | completed |
4 | blocked |
5-9 | Custom reports |
Command Mode
| Key | Actie |
|---|---|
: | Task command direct typen |
:q | Quit |
:!command | Shell command |
Voorbeeld: :project:acme +urgent filtert live.
Vit Config
~/.vit/config.ini:
[vit]
default_keybindings = vi
[report]
default_report = next
[color]
color = on
Mijn Dagelijkse Workflow
Ik heb al mijn aliassen, functies en scripts gebundeld in een herbruikbare collectie: time-system
# Installeren
git clone https://github.com/kapott/time-system.git
cd time-system && ./install.sh
source ~/.zshrc
Project-Gebaseerde Workflow
De scripts verwachten een twee-niveau directory structuur voor projecten:
~/Documents/Git/ # TASKFUNC_PROJECTS_DIR
├── clientA/
│ ├── project1/
│ └── project2/
├── clientB/
│ └── projectX/
Dagelijkse Flow
# Ochtend
p # Selecteer client/project met fzf
# -> cd naar directory
# -> zet taskwarrior context
# -> toont pending tasks
vit # Bekijk taken in TUI
# Werken
tstart # Kies taak met fzf, start timer
# ... werk ...
tstop # Stop taak + timer
# Tussendoor
tadd "Nieuwe taak" # Voegt toe aan huidig project (of inbox zonder scope)
tpl # Lijst taken voor huidig project
tnext # Wat is volgende?
# Eind van dag
dayend # Samenvatting: afgerond, tijd bijgehouden, nog actief
Belangrijkste Commando’s
| Commando | Beschrijving |
|---|---|
p | Selecteer project, cd naar dir, zet scope |
tstart [id] | Start taak + timer (fzf als geen id) |
tstop | Stop huidige taak + timer |
tadd <desc> | Voeg taak toe aan huidig project |
tdone [id] | Rond taak af (fzf als geen id) |
tpl | Lijst taken voor huidig project |
tctxn | Wis project scope |
weekstart | Wekelijkse review |
dayreview | Dagelijkse review |
dayend | Eind van dag samenvatting |
twcurrent | Huidige tracking status |
Zie de volledige command reference voor alle aliassen en functies.
Backup
Tasks leven in ~/.task/:
# Simple backup
cp -r ~/.task ~/.task-backup-$(date +%Y%m%d)
# Of met git
cd ~/.task && git init && git add -A && git commit -m "Backup"
Geavanceerde Features
UDAs (User Defined Attributes)
Custom velden:
# In ~/.taskrc
uda.estimate.type=duration
uda.estimate.label=Est
# Gebruik
task add "Grote klus" estimate:2h
task estimate.over:1h list
Urgency Tuning
Taskwarrior berekent urgency automatisch. Tune het:
# ~/.taskrc
urgency.user.tag.urgent.coefficient=5.0
urgency.user.tag.quick.coefficient=2.0
urgency.blocking.coefficient=8.0
urgency.blocked.coefficient=-5.0
Taskd: Sync Server
Als je taskwarrior op meerdere machines gebruikt (laptop, desktop, server), wil je synchronisatie. Daarvoor is er taskd — de officiële taskwarrior sync server.
Waarom Taskd?
- Multi-device sync: Zelfde tasks op al je machines
- Conflict resolution: Taskwarrior handelt merge conflicts af
- Offline-first: Werkt lokaal, synct wanneer mogelijk
- Self-hosted: Je data blijft van jou
Alternatieven
Voordat je taskd opzet, overweeg de alternatieven:
| Optie | Complexiteit | Voordeel |
|---|---|---|
| Syncthing | Laag | Simpel, sync hele ~/.task folder |
| Git | Laag | Versiebeheer, maar geen echte sync |
| Taskd | Medium | Officieel, proper merge handling |
| Taskchampion Sync Server | Medium | Nieuwer, voor Taskwarrior 3.x |
Voor de meeste mensen is Syncthing de makkelijkste optie. Taskd is voor als je proper sync wilt met conflict resolution.
Taskd Server Installeren
Via Package Manager
# Debian/Ubuntu
sudo apt install taskd
# Arch
sudo pacman -S taskd
# macOS (als server, unusual)
brew install taskd
Docker (aanbevolen)
# docker-compose.yml
version: '3'
services:
taskd:
image: andir/taskd
ports:
- "53589:53589"
volumes:
- ./taskd-data:/var/taskd
environment:
- CERT_CN=taskd.example.com
- CERT_ORGANIZATION=MyOrg
docker-compose up -d
Server Configuratie
Als je taskd handmatig installeert:
# Data directory aanmaken
export TASKDDATA=/var/taskd
sudo mkdir -p $TASKDDATA
sudo chown $USER:$USER $TASKDDATA
# Initialiseren
taskd init
# PKI setup (certificaten)
cd /usr/share/taskd/pki # of waar je pki scripts staan
./generate
# Certificaten kopiëren
cp client.cert.pem $TASKDDATA
cp client.key.pem $TASKDDATA
cp server.cert.pem $TASKDDATA
cp server.key.pem $TASKDDATA
cp server.crl.pem $TASKDDATA
cp ca.cert.pem $TASKDDATA
# Server configureren
taskd config --force client.cert $TASKDDATA/client.cert.pem
taskd config --force client.key $TASKDDATA/client.key.pem
taskd config --force server.cert $TASKDDATA/server.cert.pem
taskd config --force server.key $TASKDDATA/server.key.pem
taskd config --force server.crl $TASKDDATA/server.crl.pem
taskd config --force ca.cert $TASKDDATA/ca.cert.pem
taskd config --force server localhost:53589
taskd config --force log /var/log/taskd.log
taskd config --force pid.file /var/run/taskd.pid
Organisaties, Groepen en Gebruikers
Taskd heeft een hiërarchische structuur:
# Organisaties aanmaken
taskd add org Werk
taskd add org Thuis
taskd add org Freelance
# Groepen binnen organisaties (optioneel)
taskd add group Werk backend-team
taskd add group Werk devops-team
# Gebruikers per organisatie
taskd add user Werk tom
taskd add user Werk jan
taskd add user Thuis tom
# Output: New user key: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
# BEWAAR DEZE KEY!
Belangrijke Nuance: Geen Gedeelde Taken
Hier zit een veelvoorkomend misverstand: taskd is niet bedoeld voor het delen van taken tussen gebruikers.
Elke gebruiker heeft een eigen, gescheiden task database. Tom’s taken zijn onzichtbaar voor Jan — ook al zitten ze in dezelfde organisatie.
Waar taskd wél voor is:
- Tom synct zijn eigen tasks tussen laptop, desktop en telefoon
- Jan doet hetzelfde met zijn eigen devices
- Ze delen de server infrastructuur, niet de data
Waar taskd níét voor is:
- Gedeelde projecten
- Team task management
- Taken toewijzen aan collega’s
Workarounds voor team tasks:
| Optie | Hoe | Nadeel |
|---|---|---|
| Gedeelde account | Iedereen gebruikt dezelfde credentials | Geen audit trail, wie deed wat? |
| Export/import | task export | ssh collega task import | Handmatig, geen echte sync |
| Andere tool | Vikunja, Kanboard, Plane | Niet taskwarrior |
Mijn advies: Gebruik taskwarrior voor persoonlijke taken, en een dedicated tool voor teamwork. Probeer niet om taskd iets te laten doen waar het niet voor ontworpen is.
Client Certificaten Genereren
cd /usr/share/taskd/pki
./generate.client username
# Dit maakt:
# - username.cert.pem
# - username.key.pem
Kopieer naar je client machine:
ca.cert.pemusername.cert.pemusername.key.pem
Taskwarrior Client Configureren
Op elke machine waar je wilt syncen:
# Certificaten in ~/.task plaatsen
cp ca.cert.pem ~/.task/
cp username.cert.pem ~/.task/
cp username.key.pem ~/.task/
# Configureren in ~/.taskrc
task config taskd.certificate ~/.task/username.cert.pem
task config taskd.key ~/.task/username.key.pem
task config taskd.ca ~/.task/ca.cert.pem
task config taskd.server taskd.example.com:53589
task config taskd.credentials 'MyOrg/username/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
Server Starten
# Foreground (voor testen)
taskdctl start
# Als systemd service
sudo systemctl enable taskd
sudo systemctl start taskd
Synchroniseren
# Eerste sync (push alles naar server)
task sync init
# Normale sync
task sync
Automatische Sync
Je kunt sync automatiseren met hooks of cron:
# ~/.task/hooks/on-exit-sync (automatisch na elke task actie)
#!/bin/bash
task sync
chmod +x ~/.task/hooks/on-exit-sync
Of conservatiever met cron:
# Elke 30 minuten syncen
*/30 * * * * /usr/bin/task sync >> /tmp/tasksync.log 2>&1
Sync Status Checken
task sync # Sync en toon status
task diagnostics | grep -A5 Sync # Bekijk sync config
Troubleshooting Taskd
“Certificate fails validation”
# Check of certificaten correct zijn
openssl verify -CAfile ~/.task/ca.cert.pem ~/.task/username.cert.pem
“Could not connect to server”
# Check of server draait
nc -zv taskd.example.com 53589
# Check firewall
sudo ufw allow 53589/tcp
“Sync conflict”
Taskwarrior handelt de meeste conflicts automatisch af. Bij problemen:
task sync # Bekijk conflict meldingen
task list # Check of data klopt
Syncthing als Alternatief
Als taskd te complex is, werkt Syncthing prima:
# Installeer Syncthing op beide machines
# Sync de ~/.task folder
# Done
# Nadeel: geen echte merge, laatste write wint
# Voordeel: werkt voor alles, niet alleen taskwarrior
Voor mijn setup gebruik ik Syncthing voor ~/.task. Simpel en werkt.
Troubleshooting
“No matches”
# Check je context
task context show
# Clear context
task context none
Task verdwenen?
task all # Bekijk alles
task status:completed # Check completed
task status:deleted # Check deleted
Undo
task undo # Laatste actie terugdraaien
Conclusie
Taskwarrior + timewarrior + vit is niet de makkelijkste setup. Er is een leercurve. Maar als je eenmaal gewend bent, is het onverslaanbaar qua snelheid en flexibiliteit.
De combinatie van:
- CLI voor snelle acties
- Vit voor overzicht
- Timewarrior voor tracking
- Scripts voor je eigen workflow
…geeft je een systeem dat precies doet wat jij wilt, zonder concessies.
Begin klein. Leer de basics. Voeg complexity toe als je het nodig hebt.
En als het niet werkt voor jou — geen probleem. Maar voor mij is dit de setup die blijft.
task add "Taskwarrior leren" +next due:today
task 1 start
Succes.
