A Flutter front-end for Taskwarrior, targeting Android and Linux desktop.
- Task list with built-in tabs: Next, Waiting, Projects, Tags
- Custom tabs with configurable filters, sort order, and grouping
- Task detail view with annotations, dependencies, and recurrence fields
- Create and edit tasks (description, project, tags, priority, due, scheduled, wait, recurrence)
- Swipe actions: mark done, delete
- Bulk select: mark multiple tasks done or delete them
- Search and filter bar
- Undo support for done/delete actions
- Export tasks to JSON (copy or share)
- Taskd sync server support
- Due-date and scheduled-date notifications (Android)
- Google Calendar sync
- Light / dark / system theme
- Flutter 3.38+ / Dart 3.10+
- For Android: Android SDK, a connected device or emulator
- For Linux: standard Flutter Linux desktop toolchain (
clang,cmake,ninja,libgtk-3-dev)
flutter build apk --release
# or for a split-ABI build:
flutter build apk --release --split-per-abiInstall with adb install build/app/outputs/flutter-apk/app-release.apk.
The APK bundles its own Taskwarrior binary (arm64-v8a and armeabi-v7a), so no separate installation is needed on the device.
flutter build linux --releaseThe output is a directory, not a single file:
build/linux/x64/release/bundle/
├── wui_android ← executable
├── lib/ ← shared libraries (.so plugin files)
└── data/ ← Flutter assets and ICU data
Copy the entire bundle/ directory to the target machine. The executable uses $ORIGIN/lib as its library search path, so all three subdirectories must stay together.
Open ⋮ → Settings inside the app.
The app ships a bundled Taskwarrior binary and extracts it on first launch. No setup is needed unless you want to use a different binary.
| Setting | Default | Notes |
|---|---|---|
| Binary path | bundled binary | Leave empty to use the bundled one |
| Data directory | from .taskrc |
Override data.location |
| Taskrc path | ~/.taskrc |
Path to your .taskrc file |
| Home directory | from environment | Affects ~ expansion in .taskrc |
On Linux the app uses the system task binary by default ($PATH). Configure paths as above if your setup differs from the defaults.
Optional. Leave empty to use the values already in your .taskrc.
| Setting | Example |
|---|---|
| Server | task.example.com:53589 |
| Credentials | Organisation/User/Key |
See Google Cloud setup below first.
| Setting | Platform | Notes |
|---|---|---|
| Enable sync toggle | both | Must be on for the sync menu item to appear |
| credentials.json path | Linux only | Full path to the downloaded OAuth file |
| Calendar name | both | Leave empty to use the primary calendar |
| Task filter | both | Taskwarrior filter for tasks to sync (default: status:pending) |
| Sign in button | both | Triggers the OAuth flow |
Once signed in, use ⋮ → Sync calendar from the task list to push tasks to Google Calendar.
What gets synced:
- Tasks that have a
dueorscheduleddate (tasks with neither are skipped) - Event date:
dueif set, otherwisescheduled - If both are set: event is anchored to
due, and a popup reminder fires at thescheduledtime - Priority H → red event, Priority M → yellow event
- Tasks completed or deleted in Taskwarrior → event deleted from calendar
Both platforms share the same Google Cloud project. You only need to do this once.
- Go to console.cloud.google.com
- Create a new project (e.g.
WUI)
- Navigate to APIs & Services → Library
- Search for Google Calendar API and click Enable
- Go to APIs & Services → OAuth consent screen
- Choose External and click Create
- Fill in App name (e.g.
WUI), user support email, and developer contact email - Under Scopes, add
https://www.googleapis.com/auth/calendar - Under Test users, add the Google account(s) you will sign in with
- Save
Until the app is verified by Google, only accounts listed as test users can sign in. The sign-in screen will show an "unverified app" warning — click Advanced → Go to WUI (unsafe) to proceed.
- Go to APIs & Services → Credentials → Create Credentials → OAuth client ID
- Application type: Desktop app
- Name it (e.g.
WUI Linux) - Click Create, then Download JSON
- Save the file somewhere on your Linux machine (e.g.
~/.config/wui/credentials.json) - Enter that path in Settings → Google Calendar → credentials.json path
- Go to APIs & Services → Credentials → Create Credentials → OAuth client ID
- Application type: Android
- Package name:
com.clobrano.wui_android - SHA-1 certificate fingerprint — run the following on your machine and paste the SHA1 value:
For a release build, use your release keystore instead.
keytool -list -v \ -keystore ~/.android/debug.keystore \ -alias androiddebugkey \ -storepass android -keypass android \ | grep SHA1
- Click Create — no file to download, the credential is registered by package name + SHA-1
The app schedules local notifications for tasks with upcoming due or scheduled dates:
- Due tasks channel (
wui_due, high importance): fires at 09:00 on the due date - Scheduled tasks channel (
wui_scheduled, default importance): fires at 09:00 on the scheduled date
Both channels can be configured independently in Android → App Info → Notifications.
The required permissions (POST_NOTIFICATIONS, SCHEDULE_EXACT_ALARM) are requested on first launch.
If you also use wui (the terminal UI), you can reuse the same Google Cloud project:
- Linux: point both apps at the same
credentials.json. Each app stores its own token file separately (~/.local/share/wui_android/calendar_token.jsonvs~/.config/wui/token.json), so they authenticate independently but use the same OAuth app. - Android: the Android OAuth client is registered separately in the same project and uses the native sign-in flow — no shared file needed.