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
KeyActie
j / kOmhoog / omlaag
ggNaar begin
GNaar eind
Ctrl+d / Ctrl+uHalf page down/up
/Zoeken
n / NVolgende/vorige match

Task Acties

KeyActie
aAdd task
eEdit task (in $EDITOR)
mModify (inline)
dDone
DDelete
sStart/stop
uUndo
EnterTask 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

KeyView
1next
2list
3completed
4blocked
5-9Custom reports

Command Mode

KeyActie
:Task command direct typen
:qQuit
:!commandShell 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

CommandoBeschrijving
pSelecteer project, cd naar dir, zet scope
tstart [id]Start taak + timer (fzf als geen id)
tstopStop huidige taak + timer
tadd <desc>Voeg taak toe aan huidig project
tdone [id]Rond taak af (fzf als geen id)
tplLijst taken voor huidig project
tctxnWis project scope
weekstartWekelijkse review
dayreviewDagelijkse review
dayendEind van dag samenvatting
twcurrentHuidige 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:

OptieComplexiteitVoordeel
SyncthingLaagSimpel, sync hele ~/.task folder
GitLaagVersiebeheer, maar geen echte sync
TaskdMediumOfficieel, proper merge handling
Taskchampion Sync ServerMediumNieuwer, 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:

OptieHoeNadeel
Gedeelde accountIedereen gebruikt dezelfde credentialsGeen audit trail, wie deed wat?
Export/importtask export | ssh collega task importHandmatig, geen echte sync
Andere toolVikunja, Kanboard, PlaneNiet 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.pem
  • username.cert.pem
  • username.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.