Cfait
Powerful, fast and elegant CalDAV task manager
Benoit Brummer (Trougnouf) ✓ Verified
com.trougnouf.CfaitCfait is designed for speed and stability using Rust. It puts you in control of your data with a local-first approach that syncs seamlessly across your devices via CalDAV.
Key Features:
- Syncs Everywhere: Compatible with Nextcloud, iCloud, Radicale, and other standard CalDAV servers.
- Offline First: Optimistic UI updates mean you never wait for a server response.
- Smart Input: Typing "Buy cat food !1 @tomorrow" automatically sets priority and due date.
- Productivity: GTD Workflow, Sub-tasks, Dependencies, and Tags.
Screenshots
Observed history
| App | Change | Version | When ↓ |
|---|---|---|---|
| updated | 1.2.0 | 12 Oct 2026 |
Upstream releases
Release notes supplied by the developer. These dates are not Flathub package publication times.
1.2.012 Oct 2026
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
1.1.99 Oct 2026
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 hard-deletes ancestors/children
- (store) Sidebar has_children false-negative when a sibling sorts between a key and its children
- (tui) Convert char-count cursor to byte offset before slicing input buffer
- (gui) Demote no-ops instead of panicking when the row above is a group header
- (config) Treat an empty config file as missing so the app re-onboards
- (config) Don't delete the keyring credential when the keyring is unreadable
- (tui) Restore the terminal on any exit path via a Drop guard
- (tui) Use the DST-safe date conversion in the date picker
- (tui) Skip auto-refresh when the interval is zero
- (parser) Capture the full RHS of the spaced alias form
- (parser) Convert two-token duration units and saturate on overflow
- (parser) Keep the DAILY interval when rewriting blocked weekdays
- (adapter) Tolerate malformed and lowercase ICS input
- (adapter) Treat property and parameter names as case-insensitive
- (adapter) Scope relations and alarms to the master component
- (cli) Exit non-zero when cfait sync leaves remote calendars unfetched
- (tui) Guard stale journal pointer and session timestamps
- Guard non-ASCII uid truncation and session timestamp prefill
- (cli) Propagate background sync failures and report partial imports
- Skip task creation for pure alias and goal definitions in tui and gui
- (cli) Surface argument and export errors that were silently ignored
- Make trash operations disk-based and report failures
- (gui) Report invalid snooze and session input instead of guessing
- (gui) Convert caret column to byte offset for description link lookup
- (tui) Guard rendering panics on short terminals and fix blocked-row width
- (gui) Sync journal editing uid and report empty wiki links and bad dates
- (tui) Give the help modal its own scroll offset and speed up goal panels
- (gui) Dedupe journal daily-note loading and keep sidebar mode valid when clearing filters
- (tui) Keep the calendar list when a network fetch fails
- (gui) Support undo and redo in the journal editor
- (parser) Do not panic on multibyte month tokens
- (extractor) Start a new numbered block when the list number decreases
- (adapter) Parse alarms from the unfolded ICS so folded lines survive
- (storage) Match import component markers at line starts only
- (merge) Respect deletions of unmapped properties in 3-way merge
- (gui) Keep the minute timer tick running when a running task is hidden by filters
- (gui) Never make a disabled calendar the active one after a load
- (gui) Ctrl+Delete in journal mode now deletes the visible page, not a stale main-list selection
- (cli) Make done idempotent, honor list query, apply add aliases retroactively, drop complete, wrap help
- (android) Run blocking FFI syncs and edits off the main thread
- (android) Fire overdue alarms instead of dropping them
- (android) Stop recreating the activity on notification and widget taps
- (android) Guard widget config FFI calls and color palette indices
- (android) Report unknown calendar sync mode as failure
- (android) Give feedback when background operations fail
- (android) Localize user-facing errors and labels
- (i18n) Use automatic plural selection for count messages
- (tui) Repair keyboard nav, post-migration refresh, and alarm prune
- (android) Await cache load in background workers and centralize intent extras
- (android) Await cache load in widget callbacks and offload calendar reads
- (android) Restart live session timer when logged time changes
- (android) Preserve unsaved edits when changing sessions or links
- (recurrence) Increment sequence on advance instead of resetting to 1
- (android) Keep the Done notification action from un-completing an already done task
- (sync) Retry task move with overwrite when the destination already exists
- (android) Count running not paused tasks in the widget active badge
- (android) Show the collection picker in search mode of the entry widget config
- (ics) Stop double-unescaping text properties in the vtodo parse path
- (client) Match companion events by exact uid so cleanup can't delete other tasks' events
- (client) Degrade to cached tasks instead of erroring when the cache file is unreadable
- (store) Complete the root before descendants so recurring resets can't undo tree completion
- (store) Skip history snapshots when resetting descendants on recurring completion
- (mobile) Keep description-extracted subtasks in the parent's target collection
- (tui) Never drop persist batches when the action channel is full
- Honour col: on description-extracted tasks across tui, gui, and mobile
- (android) Mask sign bit of hash-based icon colors to avoid negative indices
- (android) Render the advanced-settings error status that was written but never shown
- (alarm) Anchor relative reminders on all-day and fuzzy dates so they actually fire
- (journal) Treat same-calendar moves as no-ops so tasks don't vanish on replay
- (tui) Keep recovery calendar hidden when showing all calendars
- (android) Migrate text fields to state-based TextFieldState so cursor handle can scroll beyond visible text ( https://git.disroot.org/trougnouf/cfait/issues/13 )
- (matcher) Route prefix stripping through byte-safe extract_prefix
- (sync) Keep all unsynced cached tasks when matching server hrefs
- (logging) Fall back to terminal logging when the log file cannot be created
- (android) Keep post-action navigation on the main thread and avoid duplicate home entries
- (android) Fix stale home screen refreshes and auto-scroll, and move per-keystroke FFI off the main thread
- (android) Guard stale suggestion taps, coalesce background syncs, and move screen FFI off the main thread
- (gui) Log persist failures, surface event deletion failures, and fix migration loading state
- (parser) Cap brace expansion depth to prevent stack overflow on nested input
- (tui) Bump edit generation when wiki links create pages from the relationship browser
- (tui) Fill the whole main pane in journal mode instead of leaving a blank details strip
- (ics) Escape semicolons, commas, and newlines in serialized categories, summaries, and alarm descriptions
- (tree) Resolve a numbered dependency to the last parallel sibling, not all members sharing its number
- (deps) Stop dropping explicit dep: tokens when creating description subtasks
- (i18n) Translate the completed-group toggle labels in the gui and tui
- (gui) Render indented list bullets in inline descriptions like the expanded view
- (gui) Route settings success messages through the green info banner
- (i18n) Translate the sidebar goal and journal tooltips and help examples in gui and tui
- (android) Resave journal edits that land while a save is in flight
- (recycle) Start next occurrence with fresh time tracking
- (store) Clamp alias priority consistently in retroactive sync
- (sync) Keep pause percent when saving the tree editor
- (parser) Treat word-attached quotes as literals so an inch mark no longer pairs with a later quote
- (gui) Stop background worker debounce starvation and self-heal failed syncs
- (gui) Keep Settings/Help open when a background sync completes
- (alarms) Show auto-reminders in-app and stop re-firing after restart
- (journal) Keep sub-pages out of the main task list
- (help) Only list the maximize-editor shortcut in the GUI help
- (gui) Localize the editor context banner strings
- (gui) Stop duplicating the time range in the session input placeholder
- (gui) Restore the missing spacing in the settings form
- Localize the journal date headers
- (tui) Actually move the task when Move is picked from the action menu
- (tui) Fall back to the daily entry when the journal page pointer is stale
- (gui) Hide the move action when the picker would have no targets
- (gui) Reject bare + wiki links instead of panicking in journal mode
- (gui) Don't open the move modal when no calendar is a valid target
- (i18n) Localize leftover hardcoded strings in header, delete-all and journal views
- (store) Allow unchecking completed tasks in the tree editor
- (android) Keep cross-collection parents visible when focusing a collection
- (gui) Keep daily layout for date-bound journal entries and dedupe repasted sub-pages
- (gui) Save remote collection color changes immediately
- (sync) Prune deleted tasks from the calendar caches once their Delete is pushed
- (gui) Keep editor cursor relative to line text on tab indent
- Scope dep:/rel:/parent: reference resolution to visible collections, surface ambiguous references as a GUI error banner, and offer short-UID autocomplete suggestions; also re-tag minted lines in the journal editor so typing doesn't accumulate duplicates
- (sync) Rescue any deterministic 4xx rejection, persist the queue head's failure reason in journal.json, and surface it in the GUI unsynced tooltip ( https://github.com/trougnouf/cfait/issues/96 )
- (sync) Rescue rejected 412 creations instead of assuming success, retry ghost updates as creations, and stop parking on deterministic conflict-fetch failures ( https://github.com/trougnouf/cfait/issues/96 )
- (journal) Merge duplicate same-calendar deletes so stalled producers cannot pile up the queue ( https://github.com/trougnouf/cfait/issues/96 )
- (android) Write journal entries to a VJOURNAL-capable collection instead of the active tab ( https://github.com/trougnouf/cfait/issues/96 )
- (gui) Keyboard-friendly context menu and layout-safe hotkeys
- (gui) Actually wire Tab into the suggestion cycle
- (gui) Dispatch applied suggestions to tasks::handle so Tab actually completes words
- (sync) Resolve 412s against our own previous edit chain by SEQUENCE instead of duplicating the task
- (sync) Record the server-agreed state per pushed task and etag-match it as the 412 merge base
- (gui) Debias confetti bursts with splitmix64 seeding and widen the randomized speed, drag, and spin ranges (https://github.com/trougnouf/cfait/discussions/98)
Other:
- (release) Split build-windows from publish
- Store settings as collection properties with VEVENT fallback ( https://github.com/trougnouf/cfait/issues/91 )
Refactor:
- (tui) Deduplicate GPX, journal-calendar, and external-editor logic
- (android) Dedupe journal date navigation into selectJournalDate
- (client) Remove dead calendar discovery fallbacks and url correction plumbing
- (mobile) Drop unused get_next_global_alarm_time FFI surface
- (mobile) Drop unused get_all_tags, get_all_locations, and yank_task FFI stubs
- (tui) Extract shared goal and journal page deletion helpers
- (tui) Drop unused Ok(None) variant from run_editor_cli
- (gui) Dedupe journal header and drop dead editor closures
- Name pending-refresh etag and dedupe gui task handlers
- (gui) Extract shared helpers for task row labels and description text
- (gui) Dedupe scroll-snap and cursor-offset logic in view update
- (gui) Dedupe settings form widgets and localize hardcoded labels
- (gui) Dedupe ics import and form resets in settings update
- (gui) Dedupe sidebar goal rows and clear-all button
- (gui) Tidy state helpers and default construction
- (gui) Dedupe local disk load and move it to the blocking pool
- (gui) Dedupe help section headers and card styles
- (gui) Dedupe modal, sidebar and journal view helpers in view/mod.rs
- (gui) Dedupe undo, focus, alarm and batch helpers in update/tasks.rs
- (gui) Dedupe relation rows and markdown helpers in task_row.rs
- (gui) Dedupe focus, search and navigation boilerplate in update handlers
- (gui) Dedupe settings form rows into numeric_row, pick_row and add_cancel_buttons
- (gui) Extract ringing-task validity and placeholder helpers in update dispatcher, dedupe highlighter formats
- (gui) Dedupe cmd shortcuts and navigation keys across captured and normal hotkey paths
- (gui) Extract with_timeout, offline_fallback and flush_and_load in async ops
- (gui) Normalize stale headers and remove dead icon constants
- (gui) Drop stale dev comments, hoist rusty-dark theme helper, serve --help before config load
- (parser) Remove unreachable done: datetime branch and add completion round-trip test
- (tui) Share calendar fetch helper and one controller in the network actor
- (tui) Dedupe journal target uid resolution into a state helper
- (tui) Extract yank, navigation and move-target logic into state helpers
- (tui) Build goal sidebar entries via a shared helper
- (parser) Dedupe recurrence time and start/due assignment in smart input
- (recurrence) Reuse to_date_naive and Ord for exdate handling
- (adapter) Dedupe ics insertion and related-to routing
- (storage) Name recovery calendar, centralize system-calendar checks, dedupe interval merging
- (tui) Share calendar-merge and cached-task-load helpers in the network actor
- (client) Share companion event directory derivation
- (controller) Dedup trash purging and drop dead config flag
- (gui) Remove eight dead message variants and the help_expanded_sections field
- (merge) Sort merged alarms by uid so merge output is deterministic
- (gui) Guard truncate_chars against small limits and drop a dead style mode
- (core) Dedupe hex color parsing and take &Path in the journal loader
- (gui) Drop the dead non-gui cfg branch in settings
- (store) Reuse the shared month-name helper in the journal tree
- (tui) Drop dead cursor-movement branches in normal mode
Documentation:
- (cli) Simplify non-interactive help, drop -n/-w and replace extras
- (specs) List :delete-all among the smart commands in SPECS.md ( https://github.com/trougnouf/cfait/issues/86 https://github.com/trougnouf/cfait/issues/6 )
- Localize the journal calendar weekday header in all three clients
- Specify incremental remote fetch
- Correct alarm firing grace period comment
Performance:
- (model) Strip inline data: URI payloads from task descriptions
- (client) Per-calendar timeout and cache fallback in get_all_tasks
- (store) Batch relation-index rebuilds via insert_many
- (store) Cut filter() cost with search memo, plain short-circuit, O(N) ancestry maps
- (store) Compute goal progress and history in a single store scan
- (gui) Use the single-scan goal stats in the sidebar and detail panel
- (tui) Redraw only on state change or once per second instead of every tick
- (android) Avoid redundant FFI and notification work in widgets and refreshes
- (android) Move store FFI calls off the main thread
- (android) Hoist regex and formatter compilation out of hot paths
- (android) Memoize task row description spans and session placeholder example
- (android) Count ICS tasks without allocating split lists and off the main thread
- (android) Stop re-reading the keyring on every task refresh
- (android) Keep settings disk IO off the main thread
- (android) Keep advanced settings disk IO off the main thread
- (android) Keep home screen store calls off the main thread
- (android) Move remaining settings and task detail store calls off the main thread
- (store) Compute the local date once in filter instead of per task
- (mobile) Score goal progress and history in a single store scan
- (mobile) Only save config in dispatch when the expanded sidebar state changed
- (tui) Index journal entries by date once instead of re-scanning every task per calendar day
- (tui) Look up calendar colors via a per-frame map instead of a per-row scan
- (sync) Peek journal front read-only to skip a full fsync per action
- Skip descendant walks in get_aggregated_time_seconds for tasks without time data
- (gui) Load cached disk data on the blocking pool in the connect path
- (mobile) Precompute subtree time in one store pass and reuse filter's location counts
- (mobile) Read calendar colors directly in get_view_tasks to avoid a blocking store lock
- (gui) Collect journal month dates in one pass instead of scanning per day
Styling:
- (android) Replace fully-qualified names with imports in ui screens
- (android) Replace fully-qualified names with imports in HomeScreen
- (android) Replace fully-qualified names with imports in Shared
- (android) Replace fully-qualified names with imports in MainActivity
- (android) Replace fully-qualified names with imports in CfaitApplication
- (android) Replace fully-qualified names with imports in TaskListWidget
- (android) Replace fully-qualified names with imports in workers
- (android) Replace fully-qualified names with imports in remaining files
- (tui) Localise the wiki-link fallback search message
- (tui) Replace stale refactor note above the modal popups with an accurate one
Testing:
- (adapter) Add robustness tests for malformed input, TZID and case
- (tui) Cover suggestion refresh, navigation, apply and undo paths
- (store) Lock in auto-heal of recurring history snapshots mislinked as sub-tasks
Miscellaneous Tasks:
- (mobile) Add data dir migration to external storage ( https://github.com/trougnouf/cfait/issues/83 )
- (mobile) Replace data dir migration with config-only switch ( https://github.com/trougnouf/cfait/issues/83 )
- Remove unused string
- (mobile) Switch external storage to Android/media for file-manager visibility ( https://github.com/trougnouf/cfait/issues/83 )
- (android) Stop ghost-clear from skipping legitimately empty lists
- (sync) Make the cross-instance file watcher apply external changes and suppress its own writes
- (watch) Coalesce reloads during in-flight loads, surface failures
- (sync) Serialize journal syncs across processes with a bounded flock
- (android) Remove dead ACTION_CANCEL branch and unused OUTPUT_COUNT
- Regenerate Android bindings
- Update dependencies
- (tui) Dispatch :commands in task edit mode, matching create mode
- (android) Respect error color in tag alias status banner
- (android) Silence compiler warnings and migrate to PrimaryScrollableTabRow
- (android) Replace deprecated ClickableText with LinkAnnotation links
- Clarify action_bar_position wording
- Silence android build warnings in tui sync strategy and journal lock
- Silence remaining android target warnings in system stubs and locking tests
- (model) Only autocomplete [[wiki links]] while they are still open
- (config) Namespace keyring passwords by server host
- (gui) Journal editing, sync indicator, and search bar polish
- (i18n) Select plural subkeys explicitly since rust_i18n returns the key itself for plural parents
- (android) Pass fallback error to migration_failed toast, template needs a param
- (android) Let the description editor keep its newline key
- Update Rust toolchain to 1.99.0
- (journal) Make the is:note token the single source of truth for page note state
- (cli) Accept -c short flag for import collection target ( https://github.com/trougnouf/cfait/issues/97 )
- (cli) Accept -c short flag for export collection target
- (i18n) Restore the parent: parser token in the Spanish locale
- (i18n) Rm English-default and accent-duplicate parser tokens from the German locale
1.1.815 Sept 2026
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
1.1.79 Sept 2026
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

