Cfait
Take control of your TODO list
Install / Use
/learn @trougnouf/CfaitREADME
Cfait is a task manager / TODO list for people who want speed, efficiency, and ownership of their data.
It connects to any standard CalDAV server (Radicale, Xandikos, Baikal, Nextcloud, iCloud, etc.) so your tasks aren't locked inside a proprietary walled garden. It's written in Rust, meaning it starts instantly and handles large lists without stuttering.
You can use it comfortably from the command line (TUI), on your desktop (GUI), or on the go with the native Android app. It's built "offline-first," so you can keep working without an internet connection and Cfait will sync your changes the next time you go online.
<strong>Table of contents</strong>
- ✨ features
- 📸 screenshots
- 🚀 installation
- ⌨️ Smart input syntax
- 🔍 Search & filtering
- 📊 Task sorting
- 📅 Calendar events for tasks
- 💾 Export & backup
- 🎮 Keybindings and TUI configuration
- 🤗 Support
- 🪩 Mirrors
- 🛡️ Privacy policy
- ⚖️ License
- ☁️ CalDAV providers
<a name="features"></a>
✨ features
- Smart Input: Type your tasks naturally.
Buy cookies @tomorrow @@bakery !1is parsed instantly into a high-priority task due tomorrow at the bakery. - Hierarchical Tags & Locations: Organize deeply with tags like
#dev:cfaitor#cooking:cookies, and locations like@@home:officeor@@store:aldi:downtown. - Dependencies: Block tasks until others are done. You can create parent/child tasks or loose dependencies <small>(RFC9253)</small> (or manually block with
#blocked). - Recurrence: Powerful repetition rules for habits and recurrent tasks.
- Inline Aliases: Define shortcuts on the fly; typing
#gardening:=#fun,@@homeor@@aldi:=#groceries,#shoppingapplies the alias immediately and saves it for future use (retroactive). - Time Tracking & Progress: Start and pause tasks to automatically track the time spent. By combining this with an estimated duration (
~2h), Cfait automatically calculates and visualizes your progress (e.g.[1h / ~2h]). - Cross-Platform: Runs on Linux, Android, Windows, and MacOS.
<a name="screenshots"></a>
📸 screenshots
| Desktop (GUI & TUI) | Mobile (Android) |
| :---: | :---: |
|
<br>The Graphical Interface in v0.5.2 <small>(history)</small><br><br>
<br>The Terminal Interface in v0.5.0 <small>(history)</small> |
<br>The Android client in v0.5.2 <small>(history and more)</small> |
<a name="installation"></a>
🚀 installation
Configuration
Self-documenting config file. See also: https://codeberg.org/trougnouf/cfait/wiki/Configuration
<a name="linux"></a>
🐧 Linux
- Flatpak: Available on Flathub
- Arch Linux (AUR):
yay -S cfait(orcfait-git) - Debian/Ubuntu/Mint: Download the
.debfile from the releases page. (Req. Ubuntu 24.04+ / Mint 22+ / Debian 13+) - Generic: Download the pre-compiled
.tar.gzbinary tarball from the releases page. (Req.glibc 2.39, e.g. Fedora 40+)
<a name="android"></a>
📱 Android
- <a href="https://f-droid.org/packages/com.trougnouf.cfait/">F-Droid</a>
- <a href="https://play.google.com/store/apps/details?id=com.trougnouf.cfait">Google Play</a>
- APK: Download the latest universal APK from the releases page.
<a name="windows"></a>
🪟 Windows
- Download the
.ziparchive from the releases page. Contains bothcfait.exe(TUI) andcfait-gui.exe(GUI).
<a name="macos"></a>
🍎 MacOS
- Download pre-compiled binaries provided by Martin Stut on https://static.stut.de/cfait-macos/
<a name="from-source-rust"></a>
⚙️ From Source (Rust)
Desktop (TUI/GUI)
Requires Rust (latest stable version recommended).
# Install TUI only
cargo install cfait
# Install GUI
cargo install cfait --features gui --bin cfait-gui
Replace cfait with . to build locally.
Add --debug to build in debug mode. (Much faster compilation, much slower execution.)
Android
Requires Android NDK and cargo-ndk.
# Set up Android NDK environment variables
export ANDROID_NDK_HOME=/path/to/android-ndk
export ANDROID_NDK_ROOT=/path/to/android-ndk
# Build native libraries for Android architectures (these are the release libs that go into the APK)
cargo ndk -t aarch64-linux-android -t x86_64-linux-android \
-o ./android/app/src/main/jniLibs build --release --lib --features mobile
# Build a host (local) library for UniFFI bindgen to read
# NOTE: The UniFFI metadata extractor can fail on release builds that are stripped or
# use aggressive LTO. To reliably generate Kotlin bindings, build the host library in
# debug mode and let uniffi-bindgen read `target/debug/libcfait.so`.
cargo build --lib --features mobile
# Generate Kotlin bindings using the host/debug library
# This does NOT change the Android release libs you built above (those are still packaged
# into the APK). The debug host library is used only locally so bindgen can extract metadata.
cargo run --features mobile --bin uniffi-bindgen generate \
--library target/debug/libcfait.so \
--language kotlin --out-dir ./android/app/src/main/java --config uniffi.toml
# Build APK using Gradle (packages the release native libraries built earlier)
cd android
./gradlew assembleRelease
The APK will be in android/app/build/outputs/apk/release/.
<a name="smart-input-syntax"></a>
⌨️ smart input syntax
You don't need to click through menus to set the due/start date, length, priority, recurrence, tags, location,... Just type.
The clients are self-documenting; the most up-to-date documentation should be provided in the built-in help.
Basics
| Property | Syntax | Description |
| :--- | :--- | :--- |
| Priority | !1 | 1 is highest (critical), 9 is lowest. 5 is normal. |
| Due Date | @ / due: | When the task must be finished. |
| Start Date | ^ / start: | When you plan to start (hides from "active" views until then). |
| Recurrence | @ / rec: | How often the task repeats. |
| Duration | ~ / est: | Estimated time (~30m, ~1h, ~1h-2h). |
| Tag | # | Categories. Use : for hierarchy (e.g. #gardening:tree_planting). |
| Location | @@ / loc: | Where the task happens. Supports hierarchy like tags (e.g. @@home:office, @@store:aldi:downtown). |
| Reminder | rem: | Set an notification. (e.g. rem:10m, rem:8am, rem:tomorrow 9:00). |
| Calendar Event | +cal / -cal | Override calendar event creation (per-task). +cal forces event creation, -cal prevents it. |
You can also type url: (e.g. url:https://trougnouf.com), geo: (e.g. geo:53.046070, -121.105264), and desc: (e.g. desc:"a description" or desc:{une description})
Escaping: If you need to use special characters literally in your task summary (like #, @, !), prefix them with a backslash: \#not-a-tag \@not-a-date.
Date & Time Formats
You can use absolute ISO dates or natural language relative offsets.
- Keywords:
today,tomorrow - Offsets:
1d(days),1w(weeks),1mo(months),1y(years).@2d= Due in 2 days.^1w= Start in 1 week.^@tomorrow= Start and Due tomorrow.- The word "in" is optional:
@2 weeksworks the same as@in 2 weeks
- Weekdays:
@friday,@monday, etc. (or with "next":@next friday)- Both forms work identically - they always go to the next occurrence of that weekday
- Next period:
@next week,@next month,@next year- Goes to the next occurrence of that time period
Recurrence
Recurrence rules determine when the next task is crea
