默认使用本地 Local 集合,跨设备同步需自备标准 CalDAV 服务器;GUI 需通过 --features gui 单独编译安装;macOS 二进制由第三方 Martin Stut 提供,非官方发布
cargo install cfait
cargo install cfait --features gui --bin cfait-guiREADME 未说明硬件要求;提供 Linux、FreeBSD、Android、Windows、macOS 及 Cargo 安装包,Android 版可从 F-Droid 或 Google Play 获取
离线优先的终端、桌面与手机待办管理器,用键盘快速记录并同步到 CalDAV
用 Rust 写的命令行待办工具,通过 CalDAV 同步任务,让你在终端里管理 TODO 列表。
核心能力
- 用一行语法创建任务,如 @时间 !优先级 @@地点
- 支持层级标签、阻塞依赖与父子任务树
- 可开始/暂停任务计时并设置预计时长与周期目标
- 动态别名即时定义并保存复用
- 内置每日笔记与 [[wiki]] 页面,经 CalDAV VJOURNAL 同步
容易踩的坑
- v1.2.1最新正式版2026-10-18 · 2026-10-18 00:03 UTC
[1.2.1] - 2026-10-18
🚀 Features
- (cli) Add --edit flag to create tasks from the external editor ( https://github.com/trougnouf/cfait/issues/93 )
- (tui) Left-click switches pane focus and selects the clicked row ( https://github.com/trougnouf/cfait/issues/105 )
- (release) Add aarch64 linux builds and aarch64 to the AUR package (https://github.com/trougnouf/cfait/issues/104)
- Add is:flat/is:doc keyword for flat-document task descriptions
🐛 Bug Fixes
- (gui) Adapt tag colors to the theme's light/dark variant so they stay readable on light themes ( https://git.disroot.org/trougnouf/cfait/issues/22 )
- (tui) Wrap markdown tables to the pane width so box-drawn borders stay aligned ( https://github.com/trougnouf/cfait/issues/103 )
- (tui) Show journal key hints in the bottom bar and re-anchor the wiki index selection so Enter works
- (android) Only style hash lines with a trailing space as markdown headers ( https://github.com/trougnouf/cfait/issues/103 )
- (gui) Strip child shadow lines from description previews (https://git.disroot.org/trougnouf/cfait/issues/23)
- Store prose-only descriptions on plain tasks; journal pages keep shadow lines (https://git.disroot.org/trougnouf/cfait/issues/23)
- (tui) Apply external editor text when creating a journal entry
📚 Documentation
- (readme) Remove GitLab mirror release links, uploads are not publicly downloadable
- Move the reference resolution note after the token table so it no longer breaks the table ( https://github.com/trougnouf/cfait/issues/103 )
- Explain item types (tasks, notes, pages, journal entries) in SPECS, ? help, and CLI
🧪 Testing
- (gui) Prove the markdown highlighter handles the syntax reference table ( https://github.com/trougnouf/cfait/issues/103 )
⚙️ Miscellaneous Tasks
- Update dependencies
- (i18n) Remove space in vi parser_is_page token so the parser can split arguments
- (journal) Show sub-pages as links in document editors, full tree in the tree editor
- (i18n) Remove stale help_metadata_note translations breaking android lint
- v1.2.02026-10-12 · 2026-10-12 14:22 UTC
查看更新说明
[1.2.0] - 2026-10-12
🚀 Features
- (parser) Accept compound durations like 2h20m and anchor dateless rem: to now (suggested by wunter8)
- (sync) Prefer a reachable local (LAN) address over the primary CalDAV URL
- (trash) Restore a deleted sub-tree to its place in the tree
- (journal) Group task-parented pages under dimmed context rows and add a header yank button
- (journal) Group context rows under common task ancestors, align rows and highlight yank state
- (journal) Merge context rows into an ancestor trie and unyank by pressing yank again
🐛 Bug Fixes
- (sync) Send strong entity-tags in If-Match so weak-etag servers stop conflict-copying every save ( https://codeberg.org/trougnouf/cfait/issues/102 )
- (markdown) Dim uid round-trip comments in raw editors instead of dropping or rendering them plain
- (markdown) Keep extracted tasks at their typed position via uid-tagged shadow lines
- (gui) Submit the journal title input instead of leaking Enter to the selected task
- (gui) Move the selection highlight to the right-clicked task so the highlighted row always reflects the context menu target
- (store) Resolve uid-prefix references before fuzzy summary matches
- (journal) Reuse the link yank icon and offer a child-of-yanked button in the header
🧪 Testing
- (sync) Expect the quoted strong entity-tag form in If-Match mocks ( https://codeberg.org/trougnouf/cfait/issues/102 )
⚙️ Miscellaneous Tasks
- Update dependencies
- v1.1.92026-10-09 · 2026-10-09 12:42 UTC
查看更新说明
[1.1.9] - 2026-10-09
🚀 Features
- (view) Show start date and recurrence in cfait view and task details ( https://github.com/trougnouf/cfait/issues/84 )
- (extractor) Serialize journals as is:page and scope subtask extraction by journal context
- Show today/tomorrow/yesterday relative dates in task lists ( https://git.disroot.org/trougnouf/cfait/issues/11 )
- (cli) Add cfait login command
- (tui) Add :settings/:config to edit config.toml in $EDITOR and reload
- Add :delete-all command with confirmation dialog ( https://github.com/trougnouf/cfait/issues/86 https://github.com/trougnouf/cfait/issues/6 )
- Watch data and cache dirs for cross-instance change detection
- (adapter) Honor TZID on DUE, DTSTART and EXDATE
- (editors) Word navigation and deletion in GUI/TUI text editors ( https://git.disroot.org/trougnouf/cfait/issues/12 )
- (client) Add a 120s backstop timeout for HTTP requests
- (client) Merge the 120s HTTP backstop timeout (chore/http-timeout)
- (android) Save task without leaving the detail screen
- (tui) Auto-complete smart-input tokens with a navigable suggestion popup
- (cli) Print version with --version and -V ( https://github.com/trougnouf/cfait/issues/90 )
- (i18n) Localize task intent descriptions shown in undo and redo
- (cli) Include the commit hash in --version output
- (aliases) Warn about useless alias values and enforce integrity in cli
- (gui) Hint at Nextcloud /remote.php/dav URL in onboarding and 404 errors
- (gui) Describe recurrence on hover of the repeat icon
- (cli) Add collection default subcommand to pick the active collection
- (journal) Hint that a VJOURNAL-capable collection can be created from cfait
- (cli) Add --plain flag to tree command for copy without UIDs
- (cli) Add --fields to list/search for scriptable field output ( https://github.com/trougnouf/cfait/issues/92 )
- Add copy-link action to tasks ( https://github.com/trougnouf/cfait/issues/77 )
- (search) Add is:recurrent filter for recurring and non-recurring tasks (suggested by montherlant)
- (config) Add date_format setting for explicit typed-date digit order ( https://github.com/trougnouf/cfait/issues/85 )
- (hierarchy) Add parent: token, resolve re-parent sync conflicts toward the newest move
- (gui) Cycle through autocomplete suggestions with repeated tab presses (suggested by Michael)
- (gui) Highlight the applied suggestion chip and let clicks join the tab cycle
- Celebrate completed tasks with confetti (GUI, Android) and a terminal bell (TUI), behind the per-device celebrate_completions setting (https://github.com/trougnouf/cfait/discussions/98)
- (gui) Randomize confetti launch style per burst, from a single party-popper point to spread along the bottom edge (https://github.com/trougnouf/cfait/discussions/98)
- (android) Randomize confetti launch style per burst and add air drag so some bursts stay in one screen region instead of always covering it (https://github.com/trougnouf/cfait/discussions/98)
🐛 Bug Fixes
- (parser) Fall back to rec: format for RRULEs the prettifier can't represent
- (mobile) Use setOnlyAlertOnce so already-fired alarms don't re-alert (reported by montherlant)
- (journal) Fall back to walk_or_create_wiki_path for missing links in gui, tui, and android
- (editor) Keep journal sub-pages out of the parent's markdown buffer
- (gui) Always yield at least one span per line to avoid iced layout cache panic
- (store) Snapshot referencing tasks so undoing a delete restores them ( https://github.com/trougnouf/cfait/issues/86 https://github.com/trougnouf/cfait/issues/6 )
- (gui) Fill delete-all dialog list width so the scrollbar sits at the right edge ( https://github.com/trougnouf/cfait/issues/86 https://github.com/trougnouf/cfait/issues/6 )
- (android) Stop journal tab from blanking the task list on return
- (android) Stop journal tab from blanking the task list on return
- (store) Undo of start-timer and delete no longer
- v1.1.82026-09-15 · 2026-09-15 11:05 UTC
查看更新说明
[1.1.8] - 2026-09-15
🚀 Features
- (android) Custom label, more colors, collection color, rename widget
- Remote collection import/export with VJOURNAL support; move sidebar tab toggles to advanced settings
- (widget) Respect fold/unfold state in task list widget; switch off journal tab on task open
- (gui) Add tooltip and feedback to version copy button in about page ( https://github.com/trougnouf/cfait/issues/78 )
- (android) Fix entry widget custom color cycling, add collection filter and quick-add to list widget, sync after widget actions
- (android) Add list auto-indent to create-task description field (suggested by wunter8)
- Add author Benoit Brummer (Trougnouf) to about and CLI
- (ci) Mirror releases to GitLab as fallback when disroot is down ( https://codeberg.org/trougnouf/cfait/issues/101 )
🐛 Bug Fixes
- Restore nested VTODO comp-filter so sync works with SOGo
- Gate duration formatter on goal type in list badge
- (android) Fix widget config not applied and per-instance prefs overwriting
- (android) Make widget config changes actually trigger recomposition
- (android) Quick-add widget after journal and auto-switch tab from action bar
- (android) Guard widget receivers and fix search widget collection picker
- (android) Prevent widget layout bleed-over between TaskList and TaskEntry
- Move offline refresh I/O off the iced main thread and add edit-generation guard against async store wipes in GUI and TUI ( https://github.com/trougnouf/cfait/issues/78 )
- (parser) Preserve dependencies/relations across title edits and resolve dep: with colons in summary
- (parser) Fix tag alias resolution and retain trigger tags on expansion
📚 Documentation
- Clarify sorting settings explanations in GUI
- Document data_dir config setting in SPECS.md
- (i18n) Complete fr.json with missing keys
- Clarify alias documentation ( https://github.com/trougnouf/cfait/issues/81 / https://github.com/trougnouf/cfait/issues/82 )
🎨 Styling
- (tui) Replace hardcoded colors for light themes
⚙️ Miscellaneous Tasks
- (android) Re-enable widgets
- (android) Ensure config activity finishes even if widget update fails
- (i18n) Replace enfant with sous-tâche/sous-page in fr.json
- (android) Localize widget strings and fix text contrast on dark backgrounds
- (android) Fix widget opacity string crash and add force_sync shortcut to tooltip
- v1.1.72026-09-08 · 2026-09-08 23:33 UTC
查看更新说明
[1.1.7] - 2026-09-08
🚀 Features
- (android) Add quick settings tile for one-tap launch (requested by montherlant)
- (android) Add task-list home screen widget
- (android) Deep-link widget rows to the tapped task
- Aggregate subtree time in duration badge
- (android) Add checkbox toggles, tree indentation, and background customization to widget
- Sign release artifacts with GPG
- Add native Linux tarball to rolling release
- Add openSUSE RPM spec and OBS service file
- Allow config to specify data directory
- (android) Color checkboxes by calendar and fix widget refresh after toggle
- (android) Add task entry (quick-add) home-screen widget
- (android) Add journal and search modes to entry widget with per-instance settings
🐛 Bug Fixes
- (android) Update widgets after in-app mutations
- (goals) Dedup overlapping cascade sessions via interval subtraction
- (goals) Aggregate subtree time and dedup cascade sessions
- Add --passphrase '' to gpg signing in CI
- Count goals double-counted midnight-spanning sessions
- (android) Use Color instead of int for Glance color providers
- (android) Use Glance state to force widget refresh after checkbox toggle
- Use children_index for move tree checkbox visibility
- Delete task tree before cleaning up references
🚜 Refactor
- (android) Switch widget from snapshot file to live API
📚 Documentation
- Fix vertical bar inside Markdown table cell
- Fix vertical bar inside Markdown table cell ( https://codeberg.org/trougnouf/cfait/pulls/98 )
⚡ Performance
- (sync) Skip companion-event cleanup on delete when events disabled; compact journal once per sync
🧪 Testing
- (sync) Pin no-conflict-copy on failed move with pending update
⚙️ Miscellaneous Tasks
- (android) Fix widget config layout
- (android) Fix widget config crash and text color logic
- (android) Use Glance default loading layout for widget
- (android) Disable widgets for release
用户点评
登录用户的真实使用记录,可按版本和硬件筛选还没有人点评。第一个说出真实体验的人最有价值。
Cfait is built for people who want keyboard-centric efficiency.
You can use it comfortably from the command line (TUI), on your desktop (GUI), or on the go with the native Android app. Because it is built entirely offline-first, you can manage your tasks perfectly without ever connecting to a server.
If you do want to sync your tasks across devices, Cfait connects seamlessly to any standard CalDAV server (Nextcloud, Radicale, Baikal, ...) without locking your data inside a proprietary walled garden. Backed by a shared Rust core, it starts instantly and handles thousands of tasks without stuttering.
✨ Highlights
- ⚡ Think it, type it: No clicking through menus. Type
Buy green tea @tomorrow !1 @@dharma_cityto create a high-priority task, due tomorrow, at a specific location. - 🧠 Deep organization: Go beyond flat lists with hierarchical tags (
#gardening:kiwai), blocking dependencies, and parent/child task trees. - ⏱️ Time & goals: Start/pause tasks to track time spent. Set estimated durations (
~2h) or recurring habit goals (#read:book:=goal:5/y). - 🪄 Dynamic aliases: Define shortcuts on the fly. Typing
#hiking:=#exercise,@@outsideapplies the alias instantly and saves it for future use. - 📝 Daily notes & wiki pages: Keep a date-anchored journal and link to wiki pages with
[[My Page]]— create a hierarchical knowledge base alongside your tasks, synced via the same CalDAVVJOURNALcomponents.
📸 Glimpse
| Desktop (GUI & TUI) | Mobile (Android) |
|---|---|
The Graphical Interface in v1.1.0 (history) The Terminal Interface in v1.1.6 (history) | The Android client in v1.1.0 (history) |
📖 Documentation & usage
Cfait is designed to keep you in flow. Instead of a massive wiki, the app is entirely self-documenting.
- Everyday usage: Press
?(in the TUI/GUI) or navigate to the Help tab (Android) to open the interactive syntax guide and keyboard shortcut cheat sheet. - Configuration: The CLI/TUI configuration file (
~/.config/cfait/config.toml) is completely self-documenting. Open it in any text editor to see all available options, headless daemon setup, and UI tweaks. - Under the hood: Want to see the exact sorting algorithms, how we handle CalDAV merge conflicts, or how our Markdown subtask extraction works? Read our SPECS.md — it is the ultimate, up-to-date source of truth for Cfait's architecture.
🚀 Installation
We offer both Stable and Rolling releases. We highly encourage users to try the rolling release to get the latest features and report bugs!
(Note: On our releases page, the "Rolling" tag stays pinned at the very top. To find the latest stable version, scroll past it and click "Downloads" on the numbered release).
- 🐧 Linux: Available on Flathub, the AUR (
yay -S cfait), or via.deb/.tar.gzon our Releases page. - 👺 FreeBSD: Available in Ports/Packages, install with
pkg install cfait - 📱 Android: Get it on F-Droid, Google Play, or download the APK.
- 🪟 Windows: Check the Releases page for binaries.
- 🍎 MacOS: Download pre-compiled binaries provided by Martin Stut on https://static.stut.de/cfait-macos/
- ⚙️ Rust (Cargo):
cargo install cfait(TUI) orcargo install cfait --features gui --bin cfait-gui(GUI).
🔐 Verifying release artifacts
Releases are signed with OpenPGP key 7745 6F7B 3D26 A53C D5ED F0BC 8C37 73BC C31F 2452 (Benoit Brummer). Retrieve it and verify with gpg --keyserver keys.openpgp.org --recv-keys 77456F7B3D26A53CD5EDF0BC8C3773BCC31F2452, then gpg --verify <file>.sig <file>.
☁️ CalDAV providers
You can use the default Local collection entirely offline. But if you want to sync, Cfait works with standard CalDAV servers. We recommend:
- Self-hosted: Radicale (lightweight and feature-complete, runs on anything including Raspberry Pi) or Nextcloud.
- Free & managed: Disroot offers a privacy-focused platform with free nextcloud-based CalDAV access.
🛡️ Privacy Policy
Cfait does not collect data; data is stored on your device and on your CalDAV server.
🤗 Community & support
Have a question, found a bug, or want to contribute?
- 🗨️ Chat: Join us on Matrix at #Cfait:matrix.org.
- 🐛 Bugs / ✨ Features: Open an issue.
- 🛠️ Contribute code: Check out our CONTRIBUTING.md to get started!
- 🌐 Translate: Help translate Cfait into your language on Codeberg Translate.
If Cfait helps you stay on top of your life, consider supporting development:
- 💳 Liberapay: https://liberapay.com/trougnouf
- 💳 Ko-fi: https://ko-fi.com/trougnouf
- 🏦 Bank (SEPA):
BE77 9731 6116 6342 - ₿ Bitcoin:
bc1qc3z9ctv34v0ufxwpmq875r89umnt6ggeclp979 - Ł Litecoin:
ltc1qv0xcmeuve080j7ad2cj2sd9d22kgqmlxfxvhmg - Ξ Ethereum:
0x0A5281F3B6f609aeb9D71D7ED7acbEc5d00687CB
The Graphical Interface in v1.1.0 (
The Terminal Interface in v1.1.6 (
The Android client in v1.1.0 (