com.matthiasn.lotti CC-BY-SA-4.0 GPL-3.0-only Lotti A smart journal and life management app

Lotti is a comprehensive life management and journaling application that helps you track your goals, habits, and daily activities while maintaining your privacy. It features:

Read the multi-part blog series with video walkthroughs exploring everything Lotti can do — from task management to AI-powered insights. Learn how to take control of your productivity while keeping your data private! See Substack link.

Matthias Nehlsen https://github.com/matthiasn/lotti https://github.com/matthiasn/lotti/issues https://matthiasnehlsen.substack.com/p/meet-lotti com.matthiasn.lotti.desktop com.matthiasn.lotti

Enhanced agent observations with priority and category fields. Task agents can flag critical grievances and excellence notes for self-correction across wakes and prominent surfacing in 1-on-1 ritual sessions. New high-priority feedback GenUI card renders grievances and excellence notes inline in evolution chat.

Outbox priority queue: user-initiated actions now sync before bulk operations during large resyncs. Three priority levels (high/normal/low) ensure responsive UX. Sync health reporter logs periodic outbox and sequence counters when domain logging is enabled.

Simplified audio recording modal: removed Checklist Updates and Task Summary checkboxes. These prompts now always use category defaults when configured. New system setup no longer populates these automatic prompts on categories. Removed automatic task summary infrastructure (scheduled refreshes, smart triggers, countdown UI); summaries are now agent-managed on demand.

Agent template settings UX: sticky 1-on-1 review button in bottom bar when form is clean, Save/Cancel only when dirty. Full-height directive text areas, clearer profile selector label, and delete action moved to Stats tab. Restored the 1-on-1 review chat FAB so the interactive conversation is always reachable from the review page.

Voice transcription in evolution chat: mic button with batch and realtime recording modes. Transcript populates the text field for editing before sending.

Vector search testing UI: toggle between full-text and vector search on the tasks page with timing feedback. Controlled by a feature flag.

Split agent template directives into separate general and report directive fields for cleaner evolution. Agent reports now support a structured TLDR field shown in collapsed view with full report expandable below.

Meta-improver agent: recursive self-improvement layer that evaluates and improves template-improver agents. Runs monthly rituals focused on improver effectiveness, directive churn, acceptance rates, and session trends. Includes evolution session feedback extraction, directive churn detection, and recursion depth policy enforcement (capped at depth 2).

Agent no longer proposes redundant changes that match the current state. Checklist items, estimates, priorities, due dates, statuses, and titles are filtered at proposal time with corrective feedback to the LLM. Cross-device sync of confirmed/rejected change sets now works reliably.

Inference Profiles: named configuration bundles grouping model assignments per capability slot. Profiles replace direct model references on agent templates and instances. Includes profile management UI, two-page agent creation modal, and six seeded default profiles.

Agent now learns from past user decisions: confirmed, rejected, and deferred proposals are fed back into the wake context, so the agent avoids repeating rejected suggestions and builds on confirmed preferences. Also fixed redundant label assignment proposals for tasks that already have 3 or more labels.

Agent sync now uses file-attachment pattern (same as journal entities), preventing failures when agent payloads exceed Matrix's 60KB text event limit. Existing inline messages remain backward-compatible.

Domain-specific logging with PII-safe sanitization and per-domain toggles in Settings > Advanced > Logging Domains. Defensive fixes for agent wake orchestrator reliability. Agent UI refinements: Beamer-native back navigation, responsive token usage table, improved report controls with countdown timer.

Checklist user sovereignty: track who last toggled each checklist item (user or agent) and prevent the AI agent from overriding user-set states without a substantive reason citing post-dated evidence.

Aggregate token usage tracking per template with tabbed detail page (Settings / Stats / Reports) showing per-model summaries across all instances and per-instance breakdowns with lifecycle badges.

Added token usage section on agent detail page showing aggregated input, output, thinking, and cached token counts per model with grand totals.

Added bulk-delete button for old AI task summaries with a confirmation dialog showing the count of summaries to be deleted.

Task-agent linked task context now uses latest linked task-agent reports instead of legacy summaries. Persisted throttle-state refresh now routes through update notifications, and MTTR chart loading de-duplicates linked task lookups with concurrent resolution.

Settings > Agents page with Templates and Instances tabs, kind and lifecycle filters. Expandable TLDR agent report on task detail page. Agent default model changed to Gemini 3 Flash. Report format aligned with task summary structure.

Alibaba Cloud (Qwen) as AI inference provider with 5 models including text, vision, reasoning, audio, and image generation variants via DashScope API. Qwen3 Omni Flash for audio transcription.

Outbox payload size tracking: records total payload size (JSON message + file attachment bytes) for each outbox item, displays size in the outbox monitor, adds daily volume aggregation for sync analytics, and visualizes 30-day outbox throughput in a bar chart.

Fix task agent automatic trigger broken after throttle optimization: fixed deferred drain silently dropping when deadline expired, added safety-net periodic timer for stuck queue recovery, and fixed startup hydration race cancelling deferred drain timers. Fix agent template model selection not persisted when editing.

Evolution chat: multi-turn GenUI conversation for reviewing agent template performance and approving rewritten directives. Evolution dashboard with mini charts (success rate, wake history, version performance, MTTR trend). MTTR now measures true task resolution time. Labels in agent reports. Fix assign_task_labels crash and countdown timer digit jitter.

Agent tools for task language, status, and label assignment. Correction examples and label context injection into agent prompts. Defer-first 120s throttle for bursty edit coalescing. Standardized report structure. ASR re-trigger for parent task notification.

Agent throttle gate: 5-minute cooldown between automatic agent wakes to reduce token consumption during rapid task mutations. "Run Now" button and countdown timer on task agent chip. Throttle deadline persists across app restarts.

Fix reference image selection not rendering in cover art generation modal.

Agent templates: full-stack feature for reusable agent templates with database, service, state, and UI layers. Template evolution workflow with LLM-assisted 1-on-1 review of performance metrics and directive rewriting. Inference provider resolver and settings navigation for templates.

Provider filter for category prompt selection. Collapsible text entries in linked-entry context. Agent cross-device sync via Matrix with zone-based transaction isolation. Desktop crash-on-exit fix via graceful service disposal. Reference image grid overflow fix.

Agent cross-device sync via Matrix. Agent entities and links synchronize across devices with wake subscription restoration. Sync maintenance UI supports agent re-sync steps. Zone-based transaction isolation buffers outbox messages until commit, with nested transaction and rollback support.

Agent running-state feedback with reactive spinner indicators on task page and agent detail page. Tool call arguments and results now persisted and viewable in expandable activity log cards. Conversation view groups messages by wake cycle. Post-execution drain timer ensures signals during execution are not lost.

Task Agent: persistent AI agents that maintain task summary reports and perform incremental metadata updates via tool calls (estimates, due dates, priorities, checklist items, titles). Gated behind feature flag with dedicated agent database, wake orchestration, fail-closed category enforcement, and agent detail inspection page with activity log and lifecycle controls.

Real-Time Transcription: Live transcription via Mistral Voxtral WebSocket API with ~2s latency, showing subtitles as you speak. Mode toggle in both AI chat and journal audio recorder. Native WAV-to-M4A conversion on iOS and macOS.

Checklist Layout & AI Context: Swipe backgrounds now extend edge-to-edge for a polished look. Archived checklist items are now properly marked in AI prompts, so the AI understands they are not active work.

Archive Swipe Gesture: Swipe right on checklist items to archive them, preserving historical context without marking as completed. Archived items are excluded from completion metrics and hidden in Open filter mode. Swipe left to delete (unchanged).

Flutter 3.41.1 Upgrade: Upgraded to Flutter 3.41.1 (Dart 3.11.0).

WAL Mode & Read Pools: Enabled SQLite WAL mode, busy_timeout (5s), and synchronous=NORMAL for all databases, preventing lock errors during multi-isolate access. Added a read pool of 4 isolates to JournalDb for offloading heavy reads. Added background and directory provider parameters to database constructors, preparing for actor-based sync.

Sync Throughput: Removed artificial 200ms per-message delay from outbox enqueueing and reduced idle threshold from 3s to 1.2s, so sync resumes sooner after user interaction.

Notification-Driven Streams: Replaced Drift table-watcher streams with notification-driven streams for all entity types, eliminating redundant DB polling and preparing for isolate-based sync. Fixed sync deserialization so unknown enum values from newer devices are logged and skipped instead of retried indefinitely. Fixed config flag init order, late-subscriber tag replay, and theming sync race condition during controller initialization.

Native M4A Audio: Removed M4A-to-WAV conversion for Mistral transcription. All providers now accept M4A natively, eliminating the FFmpeg dependency and file size quota issues. Updated Voxtral model to reflect Transcribe V2 capabilities (13 languages, up to 1 GB / 3 hours per file).

Sync Verification Follow-up: SAS emoji verification now updates reliably on both devices, refreshes device keys on completion, and triggers a sync rescan so synchronization resumes immediately without restarting apps. Post-verification trust status now refreshes automatically for a short window so stale "unverified device" indicators clear without manual refresh, and desktop provisioning auto-advances from the QR step to the final status page once trust state is updated. The legacy manual Matrix setup wizard has been removed from Settings; provisioning is now the single onboarding path while keeping emoji/SAS verification in the provisioned flow. Disconnect now shows an explicit confirmation dialog and closes the status modal after successful deletion. Logging performance has also been improved by batching routine log file writes instead of forcing a disk flush for every line.

Matrix Provisioning Wizard: New sync onboarding flow that lets a desktop device paste or scan a Base64-encoded provisioning bundle, log in, join the sync room, rotate the password, and display a QR code with updated credentials for a mobile device to scan and complete setup. Also includes flexible ratings model improvements where session ratings are now driven by a catalog registry instead of hardcoded questions. Sync room creation now enforces encryption in the initial createRoom request and names rooms with the creating username for easier administration.

DailyOS Migration and Navigation Fixes: The old Calendar tab has been removed and replaced by the DailyOS tab. The classic calendar day view has been removed and the /calendar route now always opens DailyOS. Tapping a time recording no longer navigates to a session rating instead of the parent task. Session ratings and timer entries now inherit their parent task's category, and the old calendar/DailyOS feature toggles were replaced with a single DailyOS page flag.

Task Time Fix: When multiple linked entries overlap in time (for example a gym trip that contains a fitness workout), the task progress view previously summed their durations independently, inflating the displayed time. It now merges overlapping time ranges into their union — the same algorithm that already powers the accurate Time Budget view — so task progress and budget views show consistent, correct durations.

Collapsible Linked Entries: Image and audio entries linked to a task can now be individually collapsed and expanded. When collapsed, a compact preview shows a thumbnail or mic icon with duration alongside the date for quick identification without scrolling past large media. The "Linked Entries" section header also collapses the entire section with a smooth animated transition. Collapse state is saved per link and synced across devices.

Session Ratings: When you stop a timer that ran for at least one minute, Lotti can now prompt you with a quick rating modal to capture how productive, energized, and focused the session felt, plus a challenge-skill balance check. Ratings are persisted as journal entities linked to the time entry with full sync support. The feature is behind a new "Enable Session Ratings" toggle in Settings, disabled by default.

Czech Language Support: Lotti is now available in Czech (čeština) with full coverage of all ~1360 UI strings. Platform locale declarations for iOS, macOS, and Windows have also been updated to include all supported languages (Czech, Spanish, French) that were previously missing from the native manifests.

AI Prompt Optimization: Single-speaker audio transcriptions no longer include an unnecessary "Speaker 1:" prefix - speaker labels now only appear when multiple voices are detected. Checklist generation is now snappy regardless of the AI model: when models like Gemini Flash split items across multiple function calls, they are coalesced into a single batch write for instant UI updates instead of incremental per-item rendering. Image analysis now returns URLs as proper Markdown links and automatically infers https:// when the browser hides the protocol.

Automatic Image Analysis Fix: Images imported via the photo library or camera roll now correctly trigger automatic AI image analysis when configured on the category. Previously, only clipboard paste and drag-and-drop imports triggered analysis, requiring users to manually open each imported image. Screenshots also now trigger automatic analysis.

Gamey Design System: A brand-new vibrant visual theme that transforms the app with playful gradients, glow effects, and animations. The Gamey theme includes a full color palette with feature-specific colors, a gradient system with reward tiers (gold/silver/bronze) and neon effects, glow effects at multiple intensity levels, and spring-based animation utilities. A complete set of themed widgets - cards, FAB, settings cards, icon badges, progress bars - all adapt automatically when the Gamey theme is active. The existing theme infrastructure is untouched; the Gamey theme layers on top via GameyThemeBuilder.apply().

Bug Fixes: Fixed double-tap on Gamey FAB, proper dropdown behavior in theme selection, localized task status labels, correct parameter passing in settings cards, and reliable animation state handling.

Cover Art Reference Images: When generating AI cover art for a task, you can now select up to 3 images linked to that task as visual references. The AI uses these images to match the color palette, lighting mood, aesthetic, and materials in the generated cover art. For example, if your woodworking task has photos of your project, the generated cover art will incorporate those textures and atmosphere. A new selection step appears before generation - tap images to select them, or skip to generate without references. If a task has no linked images, this step is automatically skipped.

Bug Fixes: Deleting an image that's used as task cover art now properly clears the reference. Button layout in the image generation modal no longer overflows on smaller screens.

Daily OS No-Budget Display: Categories without budgeted time now display a cleaner, more compact UI. Instead of showing redundant "0m / 0m" with "0m left" badge plus a separate warning line, categories with no budget now show a single right-aligned "No time budgeted" badge. When time has been tracked against an unbudgeted category, the display shows "Xm / 0m" alongside the badge instead of confusing negative remaining time. All status badges are now consistently right-aligned across budget cards for visual harmony.

Daily OS Timeline Drag-and-Drop: Planned time blocks can now be moved and resized with intuitive touch gestures. Long-press a block to enter drag mode - drag the body to reschedule the entire block, or drag the top/bottom edges to adjust start/end times. Blocks stay within their visible timeline section and snap to a 5-minute grid. Small blocks use move-only mode to avoid cramped resize handles. Visual feedback includes elevated styling, real-time time labels, and duration indicators. Blocks overlapping compressed regions must be expanded first before dragging.

Audio Transcription Speaker Fix: When transcribing recordings with multiple speakers, the AI no longer hallucinates speaker names. Previously, the model might guess identities like "John:" or "Sarah:" based on voice characteristics or training data. Now speakers are correctly labeled as "Speaker 1:", "Speaker 2:", etc. The speech dictionary is used strictly for spelling corrections of domain-specific terms, not for identifying who is speaking.

Daily OS Header Visual Refinements: The time history header now has a cleaner, more polished design. The selected day indicator compactly wraps just the weekday abbreviation and day number instead of extending down over the stream chart. Weekend days use the same compact styling for visual consistency. Vertical dividers between days have been removed for a cleaner look, and the chart is better positioned below the day labels. Selection boxes are wider for improved touch targets and visual balance.

Daily OS Quick Task Creation: Each time budget row now has a "+" button that instantly creates a task with the category pre-assigned and due date set to the selected day. Tap the button and you're taken directly to the task detail screen for immediate editing. This reduces friction when planning tasks during your daily review - no need to navigate to the tasks screen, create a task, then assign a category and due date separately.

Daily OS Time History Header: A new horizontally scrollable header replaces the arrow-based day navigation. Tap through days to see a timeline of your productivity, with a sticky month label showing the visible months and selectable day segments with visual selection highlighting. The header supports infinite scroll to load more history (14 days at a time) and includes a Today button for quick navigation back to the current day. Day labels and budget status indicators are visible at a glance. Performance improvements avoid full stacked-height recomputation on each history load unless the scale changes. The stream chart now scales to the maximum daily total with a 6-hour minimum.

Daily OS Timeline Past Task Indicators: Tasks completed on a different day than the one you're viewing now show a faded checkmark (45% opacity) instead of a hollow circle. This makes it clear at a glance whether a task was completed on the viewed day (full checkmark) or later (faded checkmark). Also removes the italic text styling for completed tasks and now shows P2 (Medium) priority badges alongside all other priorities.

Daily OS Time Budgets UI Redesign: Slim two-row header design takes up significantly less vertical space. The first row shows category name with a circular task completion indicator and expand/collapse toggle. The second row displays time recorded vs planned, a fixed-width progress bar (now using consistent green/red colors instead of category colors), and status text. Progress bars align in columns for a cleaner table-like appearance.

Focus Mode Auto-Collapse: When you're inside a planned time block, the matching category's budget card stays expanded while other categories automatically collapse. This helps you focus on the current activity without manual toggling. You can still manually expand or collapse any category as needed.

Bug Fixes: Fixed a Riverpod state management issue in the focus mode provider that could cause stale data. Added proper error handling when refreshing budget data after a timer stops.

Voice Task Priority: Set task priority via voice during audio recordings. Say things like "priority P1", "this is urgent", or "low priority task" and the AI updates your task priority automatically. Maps spoken terms to priority levels (urgent/critical→P0, high/important→P1, medium/normal→P2, low/minor→P3). Only sets priority when not already explicitly set, preserving your manual edits.

Daily OS Timeline: Double-tap planned blocks to edit start/end times. This provides a more intuitive alternative to the existing long-press gesture, opening the same edit modal for adjusting time range, category, and notes.

Daily OS Smart Timeline Folding: The timeline now intelligently compresses inactive periods to reduce vertical scrolling. Gaps larger than 4 hours between entry clusters are automatically folded, displaying at 8px per hour instead of 40px with a distinctive zigzag edge pattern. Tap any compressed region to expand it. Hours before 6 AM and after 10 PM are folded by default when empty, and a 1-hour buffer around each entry keeps context visible. Days with sparse activity see up to 60% less scrolling.

Daily OS Overlap Fix: Time entries within the same category no longer double-count when they overlap. For example, a 1.5-hour "Gym Trip" containing a 45-minute "Fitness Entry" now correctly reports 1.5 hours total instead of 2.25 hours. Uses a time range union algorithm to calculate actual time coverage.

Visual Nesting: Same-category entries that fully contain another now nest visually in the timeline. Child entries render inset inside their parent block, reducing visual clutter. Different-category overlapping entries still display in separate lanes.

Daily OS Priority System: Tasks now display Linear-style priority badges (P0 red, P1 orange, P3 gray) in both list and grid views. P2 (Medium) is hidden to reduce visual noise. Tasks without tracked time are sorted by priority first (P0→P1→P2→P3), then by urgency, then alphabetically.

Future Date Filtering: When viewing a future date, only tasks specifically due on that day are shown. Overdue tasks no longer clutter future planning views - they remain visible on today's view for review and rescheduling.

Timeline Improvements: Entry heights now accurately reflect their actual duration based on calendar scaling (removed artificial 20dp minimum).

Daily OS Due Task Visibility: Time budget cards now show tasks that are due today or overdue, even if you haven't tracked any time on them yet. This ensures important deadlines don't fall through the cracks. Due tasks display visual badges indicating urgency - red for overdue items and orange for tasks due today. Categories with due tasks but no planned time budget show a warning banner prompting you to allocate time. Tasks are intelligently sorted with tracked-time tasks first, then due tasks by urgency.

View Preference Persistence: Your preferred task view mode (list or grid) is now saved per category and persists across app restarts. The default view has changed from grid to list for better readability of task details and due date badges.

Daily OS Task Visualization: Time budget cards now show which tasks contributed time to each category. Each task displays its time spent and completion status (checkmark for tasks completed today). Switch between grid view with task thumbnails and compact list view using the toggle button. The collapsible task section header shows the total task count and combined time. Tasks are sorted by time spent with zero-time completed tasks at the end.

Daily OS Timeline Overlap Handling: Overlapping time entries now display in separate visual lanes instead of stacking on top of each other. Uses a greedy lane assignment algorithm that places non-overlapping entries in the same lane for full-width display, while overlapping entries get their own adjacent lanes with equal widths and a small gap for visual separation. Useful when tracking multiple concurrent activities like a meeting while taking notes.

Daily OS Architecture Refactor: Unified data controller for consistent real-time updates. Consolidated day plan, timeline data, and budget progress into a single atomic state that updates together when any underlying data changes. Uses ref.keepAlive() with a manual StreamSubscription to prevent Riverpod 3's automatic pausing behavior. Fixes the auto-update failure where the timeline and budget progress bars wouldn't refresh when time entries were created or synced.

Day Plan Timeline Fix: Fixed a crash that occurred when calendar entries crossed midnight (e.g., a work session starting at 23:00 and ending at 01:00 the next day). The timeline view now correctly handles overnight entries by treating them as ending at midnight for display purposes. Added defensive bounds checking to prevent the RangeError that caused blank/grey screens on days with late-night entries.

Daily Operating System: New time management feature for planning and tracking your day. (WIP)

Task Time Tracking Fix: Audio recording duration no longer counts toward time spent on tasks. This prevents double-counting when recording meetings (e.g., a 1-hour meeting recording would previously add 1 hour to task progress, even if you also logged a 1-hour time entry for the same meeting). Only actual logged work entries now contribute to task progress calculations.

Localization: Added missing translations to German, Spanish, French, and Romanian localization files.

OpenAI Onboarding FTUE: Added first-time user experience for OpenAI providers with one-click setup. Automatically creates 4 models (GPT-5.2 for reasoning, GPT-5 Nano for fast tasks, GPT-4o Transcribe for audio, and GPT Image 1.5 for image generation), configures 9 optimized prompts with appropriate model assignments, and creates a test category with all prompts enabled. Follows the same streamlined pattern as Gemini FTUE.

Audio Format Simplification: M4A audio files are now sent directly to most providers labeled as mp3, reducing processing overhead. Only Mistral requires actual WAV conversion.

Code Modularity Refactor: Extracted focused services from large modules for better testability and maintainability. MetadataService handles metadata creation with vector clock integration. GeolocationService manages geolocation addition with race condition prevention. ExifDataExtractor provides pure functions for EXIF timestamp and GPS coordinate extraction. AudioMetadataExtractor handles audio file metadata parsing and duration extraction. Media import is now separated into audio_import, media_import, and image_import with single responsibilities each.

Voxtral Token Streaming: Upgraded local Voxtral transcription from chunk-level to true token-by-token streaming. Text now appears progressively as it's generated instead of waiting for full 60-second chunks to complete. Tokens are batched in groups of 6 for smooth display without excessive network overhead. The streaming behavior is configurable via Settings → Flags. Non-streaming mode is available for approximately 20% faster processing when real-time progress display isn't needed.

Mistral Cloud Provider: Added a new cloud transcription option using Mistral's Voxtral API. Supports the voxtral-small-2507 model for high-accuracy cloud transcription with automatic audio format conversion from M4A to WAV for API compatibility. Uses FFmpegKit on iOS/Android/macOS and system FFmpeg on Linux/Windows. The Voxtral model is auto-created when adding a Mistral provider.

Audio Transcription Improvements: Improved context handling to prevent previous transcripts from bleeding into new ones. Now uses task summary instead of full task JSON for cleaner context. Added explicit instructions that context is for terminology only. Transcriptions now include paragraph breaks on small pauses or topic changes for better readability.

Voxtral Streaming Transcription: Audio transcription now streams progressively as each 60-second chunk completes. Each chunk's transcription is sent as a Server-Sent Event (SSE), providing real-time visual feedback instead of waiting for the entire audio to process. Particularly useful for longer recordings where you can see progress as it happens. AI streaming responses are now enabled by default for new installations - existing users can enable this in Settings → Flags.

Voxtral Local Transcription: Added a new local AI transcription service using Mistral's Voxtral model. Supports up to 30 minutes of audio transcription (compared to 5 minutes for Gemma 3N) with 9 languages and automatic language detection. Features context-aware transcription with speech dictionary support for improved accuracy on technical terms and proper nouns. Two model options available: Voxtral Mini 3B (~9.5GB VRAM) for local/edge deployment and Voxtral Small 24B (~55GB VRAM) for higher accuracy. Runs locally on Apple Silicon (MPS) or NVIDIA GPUs (CUDA) with full privacy - no data leaves your device.

Gemini Setup Dialog Reset Fix: Fixed the reset functionality not working properly. Migrated storage from SharedPreferences to SettingsDb (SQLite) for improved reliability. The reset now takes effect immediately without requiring an app restart. Also localized the reset dialog strings for internationalization support.

What's New Modal Improvements: Added a "Done" button on the last page for clearer completion flow. The "Skip" button is now hidden on the last page, replaced with "Done" on the right. Button labels now use proper localization (l10n) for internationalization support.

Cover Art Display: Reverted to BoxFit.cover for better display on mobile devices.

Dialog Stability Fix: Fixed Gemini setup dialogs disappearing when resizing the app window. Both the Gemini setup prompt modal and FTUE setup dialog now survive widget tree rebuilds during window resize.

Task Estimate Fix: Fixed the task estimate field not appearing on Linux and fresh installs. The estimate chip was incorrectly hidden when no labels were defined in the app. Now the estimate and "Add Label" controls always appear, regardless of whether any labels exist.

Gemini FTUE Streamlined: Simplified the first-time user experience by reducing default prompts from 18 to 9 with optimized model assignments. Gemini Pro handles complex reasoning tasks (Checklists, Coding Prompts, Image Prompts), Gemini Flash handles fast processing (Audio Transcription, Task Summary, Image Analysis), and Nano Banana Pro handles Cover Art generation with reasoning mode enabled for reliable image output. The Gemini Setup Modal is now dismissible by tapping outside for a temporary skip - it will reappear on next app start, while "Don't Show Again" still permanently dismisses it.

Flatpak Fixes: Resolved several console warnings in the Flatpak version. Fixed keyring access error by adding D-Bus permission for org.freedesktop.secrets, enabling secure storage to work properly. Fixed cursor theme warning by exposing host cursor theme paths. Removed invalid fontconfig overrides that caused "Cannot load default config file" errors. Added Flatpak-specific icon path to eliminate application icon warnings.

Cover Art Fixes: Fixed image cropping on mobile where sides were cut off - now displays full 16:9 cover art without side cropping. Also fixed cover art set/unset not persisting after database sync. The vector clock counter could fall behind synced data, causing updates to be silently rejected. Added auto-catch-up logic that detects stale counters and recovers automatically.

Voice-Controlled Task Properties: Set time estimates and due dates via voice during audio recordings. Say things like "this will take about 2 hours" or "due by Friday" and the AI will update your task properties automatically. Converts natural language durations to task estimates and resolves relative dates to absolute due dates. Only sets values when not already set, preserving your manual edits.

Gemini Quick Start: Automatic setup prompt for new users without AI providers configured. Modal appears after What's New is dismissed (no overlapping dialogs). One-click Gemini setup with pre-configured models and prompts. Explains available AI features including audio transcription, image analysis, smart checklists, and task summaries. "Don't Show Again" option persists dismissal permanently. Also notes that other providers like Ollama for local inference are available in Settings.

Upgraded to Flutter 3.38.6.

What's New Modal: Editorial magazine-style release notes viewer. Features 21:9 hero banner images with glassmorphism version badges, multi-release navigation with animated indicator dots, and smart "seen" tracking that only marks releases you actually viewed. Includes version filtering to only show releases matching or older than your installed app version, image precaching for smooth transitions, "Skip" button to dismiss all releases, and "View past releases" option to review previous updates. Responsive design adapts to bottom sheet on mobile or centered dialog on desktop.

Linked Tasks Section: New dedicated UI for viewing and managing task-to-task relationships. Features bidirectional link display with directional indicators (↳ LINKED FROM, ↗ LINKED TO), minimal Linear-style text links with status circles, searchable "Link existing task" modal powered by FTS5, "Create new linked task" for quick subtask creation, and "Manage links" mode for unlinking. Tasks are filtered out from the generic Linked Entries section to avoid duplication.

Calendar Auto-Refresh Fix: Fixed calendar not updating when returning from creating a time recording. Improved visibility change handling to track transitions from invisible to visible, triggering full provider rebuild only when needed. More efficient than the previous onResume approach with zero CPU overhead when staying on the calendar page.

Scroll Performance Optimizations: Significant improvements to reduce jank during scrolling. Added cacheExtent to key scrollable views (Entry Details, Tasks List), converted Labels Modal to sliver-based lazy loading architecture, and added RepaintBoundary isolation for task cards, linked entries, and checklist items. Fixed memory leaks in editor widgets where ScrollControllers were being recreated on every build. These optimizations target smooth 60/120fps scrolling, especially beneficial for tasks with many checklist items.

High CPU Usage Fix (#2578): Resolved infinite rebuild loop in calendar controllers causing 160%+ CPU usage when idle. Removed ref.onResume with invalidateSelf pattern which created a rebuild cycle. Calendar updates are handled correctly by existing visibility and stream listeners.

Entry Actions Menu Redesign: Restyled to match the FAB addition menu with Nano Banana Pro styling. Features unified list design with subtle horizontal dividers (removed card-based layout), clean icons without gradient containers, and consistent visual language across all modal menus.

Calendar View Stale Data Fix: Fixed calendar not updating after adding or modifying entries. Root cause was Riverpod 3's auto-pause feature pausing providers when widgets are not visible. Added ref.onResume() callbacks to calendar providers that invalidate themselves when resuming, ensuring fresh data is always fetched when returning to the calendar view.

FAB Addition Menu Redesign: Modernized the add entry bottom sheet with Nano Banana Pro styling. Features unified dark background (no separate cards), clean white icons without gradient containers, subtle horizontal dividers between items, and edge-to-edge tap effects. Also fixed missing API Key field for OpenAI Compatible provider type (#2570) - authentication section now displays correctly for remote OpenAI-compatible endpoints.

AI Cover Art Generation: Generate task cover art directly from audio descriptions using Gemini's Nano Banana Pro model. Trigger from audio entry action menu when linked to a task. Full task context (title, checklists, labels, summaries) included in prompt. Review modal with accept, edit, and regenerate options. Cover art display updated to 16:9 aspect ratio at full resolution for consistency with generated images.

Cross-Checklist Drag-and-Drop Fix: Restored ability to move items between checklists. Fixed regression from checklist redesign where drag gestures were being intercepted. Now uses unified drag system with item-level drop regions for position-aware drops, enabling both within-list reordering and cross-checklist moves via long-press.

Nano Banana Checklist Redesign: Major UI rewrite with card-based architecture. Features modular widget structure, animated chevron rotation, filter tabs with underline indicator, and three display modes (expanded, collapsed, sorting). Progress ring now hidden when empty in expanded mode. Add input moved to bottom of checklist body with click-to-edit title functionality.

Image Card Thumbnails: Now display as uniform squares with center crop for consistent visual presentation. Portrait images are cropped from vertical center, landscape images from horizontal center. Also updated Gemini AI models to latest versions.

Due Date Visibility Refinements: Improved UX for completed and rejected tasks. Due dates are now hidden on task cards for completed/rejected tasks since they're no longer relevant. In the entry details view, due dates show grayed-out styling instead of red/orange urgency colors for completed/rejected tasks.

Visual Mnemonics: Tasks can now have cover art images for memorable visual representation. Set any linked image as a task's cover art via the action menu. Features include cover art thumbnails on task cards (with filter toggle), a cinematic 2:1 collapsible SliverAppBar in task details, glass effect overlay buttons, and horizontal crop adjustment for positioning.

Riverpod 3 Migration: Upgraded to Riverpod 3.x with comprehensive codebase migration. Updated all providers to new syntax, added ref.mounted checks after async gaps, converted family providers to constructor-based parameters, and added ref.onDispose cleanup handlers. Fixed disposed ref access errors in autoDispose providers and checklist item resolution.

Task Due Dates: Tasks now support due date assignment with a date picker in the details header. Features include color-coded status indicators (red for overdue, orange for due today), due date display on task cards with filter toggle, and tappable text that toggles between absolute and relative date formats. Card layout updated with creation date on left, due date on right.

Habit Settings Fix: Fixed habit settings page opening empty for existing habits. Changed ref.watch() to ref.read() for habitByIdProvider in controller build to prevent rebuilds when stream data changes, preserving form state. Edit flow now loads cached habit data synchronously.

Habits Page State Refactor: Migrated habits page state management from Bloc to Riverpod. HabitsCubit replaced with HabitsController notifier using keepAlive for app-wide state persistence. Created Freezed-based HabitsState with chart calculation helpers. Updated HabitsTabPage, app bar, streaks, filter, search, and chart widgets to use Riverpod. Fixed search TextEditingController lifecycle and chart touch state handling.

Audio Player State Refactor: Migrated audio player state management from Bloc to Riverpod. AudioPlayerCubit replaced with AudioPlayerController notifier using keepAlive for app-wide state persistence. Updated AudioPlayerWidget to Consumer pattern and RecorderController to use ProviderContainer injection.

Habit Settings State Refactor: Migrated habit settings state management from Bloc to Riverpod. HabitSettingsCubit replaced with HabitSettingsController notifier using family provider pattern with habitId as key. Added habitByIdProvider and habitDashboardsProvider. Updated HabitDetailsPage, CreateHabitPage, and related widgets to use Riverpod providers.

Theming State Refactor: Migrated theming state management from Bloc to Riverpod. ThemingCubit replaced with ThemingController notifier and enableTooltipsProvider. Theme state now uses keepAlive for app-wide persistence. MyBeamerApp updated to ConsumerStatefulWidget pattern.

Sync Outbox State Refactor: Migrated sync outbox state management from Bloc to Riverpod. OutboxCubit replaced with outboxConnectionStateProvider and outboxPendingCountProvider. OutboxBadgeIcon now uses Riverpod providers for consistency with the codebase.

Task Sorting and Date Display: Tasks can now be sorted by date (newest first) or by priority using a new segmented button in the filter modal. Optionally display creation dates on task cards with a subtle bottom-right placement. Both preferences persist across sessions.

Dashboard State Refactor: Migrated dashboard list state from Bloc to Riverpod for consistency with the codebase. Dashboard filtering and sorting now uses dedicated Riverpod providers with case-insensitive sorting for better UX.

Labels for All Entry Types: Labels can now be assigned to any journal entry, not just tasks. Features include labels display on journal cards, edit capability in detail views, a new "Labels" action in the triple-dot menu, and a unified label selection modal with search and create functionality.

Twi Language Support: Added Twi (Akan) as a supported language for task summarization. Twi is spoken by approximately 9 million people in Ghana. Enables AI-generated task summaries in Twi with Ghana flag in the language selection UI.

Image Prompt Generation: New AI response type that transforms audio recordings and task context into detailed prompts for AI image generators like Midjourney, DALL-E 3, and Stable Diffusion. Features visual metaphor guidelines, multiple style options, and a convenient copy-to-clipboard button.

Task Summary Goal Section: AI task summaries now include a succinct Goal section after the TLDR. This 1-3 sentence description captures the desired outcome or essential purpose of the task, helping maintain focus on the "why" behind the work.

Single-User Multi-Device Sync: New room discovery feature allows Device B to find and join existing sync rooms without invitation. Includes confidence indicators, smart navigation, and bounded concurrency for faster discovery. Also fixes QR scanner restart after invite failures.

Calendar Privacy Filtering: Calendar view now respects category visibility settings from the Tasks page. Selected categories show colored boxes with text; unselected categories show colored boxes only (text hidden for privacy).

Checklist Correction UX: Corrections now use a delayed-save pattern with a cancel option. A 5-second countdown snackbar lets you discard accidental corrections before they're saved as AI learning examples.

Task Summary Link Extraction: AI summaries now include a Links section that automatically extracts and displays all URLs from task entries with succinct titles (e.g., "Linear: APP-123", "Lotti PR #456"). Links are deduplicated and formatted as clickable Markdown.

Upgraded to Flutter 3.38.5 with dependency updates. Sync refactoring: OutboxService.enqueueMessage() improved with Dart 3 pattern matching, extracted helper methods, and expanded test coverage (60 → 77 tests).

Gemini Thinking Support: All Gemini 2.5+ models (including Flash) now display AI reasoning in the Thoughts tab. Plus new usage statistics tracking shows token counts and processing duration for each AI response.

Sync: Live scans now process strictly after the last marker. The Matrix look-behind tail and its flag have been removed to eliminate redundant work.

Checklist Deletion Fix: Empty card containers no longer appear after deleting a checklist. The checklist ID is now properly removed from the parent task, and defensive UI filtering handles any existing stale references.

Sync Catch-Up Concurrency Fix: Prevents concurrent catch-up execution from multiple sources. External forceRescan calls now skip catch-up when an internal retry-driven catch-up is already in flight. Fixes timeout failures that occurred when connectivity triggers ran concurrently with scheduled catch-up retries.

Sync Catch-Up Fix: All catch-up paths now wait for the Matrix SDK to complete server sync before processing. Fixes issue where catch-up after extended offline periods would miss entries. Includes automatic follow-up for slow networks.

Sync Gap Detection Fix: Prevents false positive gap detection during reconnection. Covered vector clocks are now processed before gap detection, and live scan signals are deferred during catch-up to ensure in-order event processing.

Nested AI Responses: Generated prompts from audio entries now display directly beneath them in an expandable section. Includes smooth collapse/expand animation and swipe-to-delete with confirmation.

Sync Backfill Improvements: EntryLink support ensures all sync message types are tracked and can be recovered. Ghost missing entry resolution handles cases where different message types share the same sequence counter.

Add prompt type for creating prompts, for example for feeding into Claude Code, Codex and similar tools, or ChatGPT, Gemini, Claude in research mode.

Sync Backfill: Request missing journal entries from connected devices during sync to ensure complete synchronization across all your devices.

Automatically create Gemini prompts.

Multiple improvements and simplifications in Sync code.

Automatic Image Analysis: Drop, paste, or import images to a task and they're analyzed automatically. Smart Task Summaries: Your first task summary is created immediately when you add meaningful content (image analysis, audio transcription, or text). No more manual checkbox clicks—just work naturally and let the AI keep up.

Checklist Correction Examples: The AI now learns from your manual corrections. When you fix a checklist item title (like "test flight" to "TestFlight"), Lotti remembers and uses these examples to improve future AI suggestions for both checklist updates and audio transcription.

Speech Dictionary per Category: Teach the AI your domain-specific terms. Add names, places, and technical words to a category's dictionary, and transcriptions automatically use the correct spellings. Select misrecognized text and add corrections via the editor context menu.

Smarter AI checklist updates: Say "I did the shopping" and the AI marks the right item complete. Mention "fix the typo in iPhone" and it corrects transcription errors. The AI now understands what you mean, not just what you type.

Improved task search field width and layout for better use of available space.

Office ProjectManagement Calendar Lotti application interface https://raw.githubusercontent.com/matthiasn/lotti/8a5b9ef0f9d8e7132638f497107bc33215819c0d/flatpak/screenshot.png