# LUK Project Plan This document outlines planned improvements across the LUK applications (Mail, Calendar, Sync, Tasks). --- ## Bug Fixes ### Tasks App - Table Not Displaying (FIXED) **Priority:** Critical **File:** `src/tasks/app.py` The tasks app was not showing the task table due to a CSS grid layout issue. The grid layout with mixed `dock` and `grid` positioning caused the main content area to have 0 height. **Fix:** Changed from grid layout to horizontal layout with docked header/footer. --- ## Sync App ### Performance Improvements #### 1. Parallelize Message Downloads **Priority:** High **Files:** `src/services/microsoft_graph/mail.py`, `src/services/microsoft_graph/client.py` Currently, message downloads are sequential (`for` loop with `await`). This is a significant bottleneck. **Current code pattern:** ```python for msg_id in message_ids: content = await client.get_message(msg_id) await save_to_maildir(content) ``` **Proposed changes:** 1. Increase semaphore limit in `client.py` from 2 to 5 concurrent HTTP requests 2. Batch parallel downloads using `asyncio.gather()` with batches of 5-10 messages 3. Batch sync state writes every N messages instead of after each message (currently an I/O bottleneck in archive sync) **Example implementation:** ```python BATCH_SIZE = 5 async def fetch_batch(batch_ids): return await asyncio.gather(*[client.get_message(id) for id in batch_ids]) for i in range(0, len(message_ids), BATCH_SIZE): batch = message_ids[i:i + BATCH_SIZE] results = await fetch_batch(batch) for content in results: await save_to_maildir(content) # Write sync state every batch instead of every message save_sync_state() ``` #### 2. Optimize Maildir Writes **Priority:** Medium **File:** `src/utils/mail_utils/maildir.py` The `save_mime_to_maildir_async` function is a potential bottleneck. Consider: - Batching file writes - Using thread pool for I/O operations --- ### CLI Improvements #### 3. Default to TUI Mode **Priority:** Medium **File:** `src/cli/sync.py` Currently `luk sync` requires subcommands. Change to: - `luk sync` → Opens TUI (interactive mode) by default - `luk sync --once` / `luk sync -1` → One-shot sync - `luk sync --daemon` / `luk sync -d` → Daemon mode - `luk sync status` → Show sync status --- ### UI Consistency #### 4. Navigation and Styling **Priority:** Low **File:** `src/cli/sync_dashboard.py` - Add `j`/`k` keybindings for list navigation (vim-style) - Use `border: round` in TCSS for consistency with other apps - Add `.border_title` styling for list containers #### 5. Notifications Toggle **Priority:** Low **Files:** `src/cli/sync_dashboard.py`, `src/utils/notifications.py` Add a UI switch to enable/disable desktop notifications during sync. --- ## Inter-Process Communication (IPC) ### Overview **Priority:** High **Goal:** Enable real-time updates between apps when data changes: - Mail app refreshes when sync downloads new messages - Tasks app refreshes when syncing or when tasks are added from mail app - Calendar app reloads when sync updates events ### Platform Options #### macOS Options 1. **Distributed Notifications (NSDistributedNotificationCenter)** - Native macOS IPC mechanism - Simple pub/sub model - Lightweight, no server needed - Python: Use `pyobjc` (`Foundation.NSDistributedNotificationCenter`) - Example: `CFNotificationCenterPostNotification()` 2. **Unix Domain Sockets** - Works on both macOS and Linux - Requires a listener process (daemon or embedded in sync) - More complex but more flexible - Can send structured data (JSON messages) 3. **Named Pipes (FIFO)** - Simple, works on both platforms - One-way communication - Less suitable for bidirectional messaging 4. **File-based Signaling** - Write a "dirty" file that apps watch via `watchdog` or `fsevents` - Simple but has latency - Works cross-platform #### Linux Options 1. **D-Bus** - Standard Linux IPC - Python: Use `dbus-python` or `pydbus` - Powerful but more complex - Not available on macOS by default 2. **Unix Domain Sockets** - Same as macOS, fully compatible - Recommended for cross-platform compatibility 3. **systemd Socket Activation** - If running as a systemd service - Clean integration with Linux init ### Recommended Approach Use **Unix Domain Sockets** for cross-platform compatibility: ```python # Socket path SOCKET_PATH = Path.home() / ".cache" / "luk" / "ipc.sock" # Message types class IPCMessage: MAIL_UPDATED = "mail.updated" TASKS_UPDATED = "tasks.updated" CALENDAR_UPDATED = "calendar.updated" # Sync daemon sends notifications async def notify_mail_updated(folder: str): await send_ipc_message({"type": IPCMessage.MAIL_UPDATED, "folder": folder}) # Mail app listens async def listen_for_updates(): async for message in ipc_listener(): if message["type"] == IPCMessage.MAIL_UPDATED: self.load_messages() ``` **Implementation files:** - `src/utils/ipc.py` - IPC client/server utilities - `src/cli/sync_daemon.py` - Add notification sending - `src/mail/app.py` - Add listener for mail updates - `src/tasks/app.py` - Add listener for task updates - `src/calendar/app.py` - Add listener for calendar updates --- ## Calendar App ### Visual Improvements #### 1. Current Time Hour Line Styling **Priority:** High **File:** `src/calendar/widgets/WeekGrid.py` The current time indicator hour line should have a subtle contrasting background color to make it more visible. #### 2. Cursor Hour Header Highlighting **Priority:** Medium **File:** `src/calendar/widgets/WeekGrid.py` The hour header at cursor position should have a brighter background, similar to how the day header is highlighted when selected. --- ### Layout Improvements #### 3. Responsive Detail Panel **Priority:** Medium **Files:** `src/calendar/app.py`, `src/calendar/widgets/` When the terminal is wider than X characters (e.g., 120), show a side-docked detail panel for the selected event instead of a modal/overlay. #### 4. Sidebar Mini-Calendar **Priority:** Medium **Files:** `src/calendar/app.py`, `src/calendar/widgets/MonthCalendar.py` When the sidebar is toggled on, display a mini-calendar in the top-left corner showing: - Current day highlighted - The week(s) currently visible in the main WeekGrid pane - Click/navigate to jump to a specific date **Implementation:** - Reuse existing `MonthCalendar` widget in compact mode - Add reactive property to sync selected week with main pane - Add to sidebar composition when toggled --- ### Microsoft Graph Integration #### 5. Calendar Invites Sidebar **Priority:** Medium **Files:** `src/calendar/app.py`, `src/services/microsoft_graph/calendar.py` Display a list of pending calendar invites from Microsoft Graph API in a sidebar panel: - List pending invites (meeting requests) - Show invite details (organizer, time, subject) - Accept/Decline/Tentative actions - No sync needed - fetch on-demand from API **API Endpoints:** - `GET /me/calendar/events?$filter=responseStatus/response eq 'notResponded'` - `POST /me/events/{id}/accept` - `POST /me/events/{id}/decline` - `POST /me/events/{id}/tentativelyAccept` **UI:** - Toggle with keybinding (e.g., `i` for invites) - Sidebar shows list of pending invites - Detail view shows full invite info - Action buttons/keys for response --- ### Search Feature #### 6. Calendar Search **Priority:** Medium **Files:** `src/calendar/app.py`, `src/services/khal/client.py` (if khal supports search) Add search functionality if the underlying backend (khal) supports it: - `/` keybinding to open search input - Search by event title, description, location - Display search results in a modal or replace main view - Navigate to selected event **Check:** Does `khal search` command exist? --- ### Help System #### 7. Help Toast (Keep Current Implementation) **Priority:** Low **File:** `src/calendar/app.py` The `?` key shows a help toast using `self.notify()`. This pattern should be implemented in other apps (Mail, Tasks, Sync) for consistency. --- ## Mail App ### Layout Fixes #### 1. Remove Envelope Icon/Checkbox Gap **Priority:** High **File:** `src/mail/widgets/EnvelopeListItem.py` There's a 1-character space between the envelope icon and checkbox that should be removed for tighter layout. --- ### Theme Improvements #### 2. Replace Hardcoded RGB Colors **Priority:** High **File:** `src/mail/email_viewer.tcss` Multiple hardcoded RGB values should use Textual theme variables for better theming support: | Line | Current | Replacement | |------|---------|-------------| | 6 | `border: round rgb(117, 106, 129)` | `border: round $border` | | 46 | `background: rgb(55, 53, 57)` | `background: $surface` | | 52, 57 | RGB label colors | Theme variables | | 69 | `background: rgb(64, 62, 65)` | `background: $panel` | | 169, 225, 228, 272, 274 | Various RGB colors | Theme variables | --- ### Keybindings #### 3. Add Refresh Keybinding **Priority:** Medium **File:** `src/mail/app.py` Add `r` keybinding to refresh/reload the message list. #### 4. Add Mark Read/Unread Action **Priority:** Medium **Files:** `src/mail/app.py`, `src/mail/actions/` (new file) Add action to toggle read/unread status on selected message(s). --- ### Search Feature #### 5. Mail Search **Priority:** Medium **Files:** `src/mail/app.py`, backend integration Add search functionality if the underlying mail backend supports it: - `/` keybinding to open search input - Search by subject, sender, body - Display results in message list - Check: Does himalaya or configured backend support search? --- ### UI Enhancements #### 6. Folder Message Counts **Priority:** Medium **Files:** `src/mail/app.py`, `src/mail/widgets/` Display total message count next to each folder name (e.g., "Inbox (42)"). #### 7. Sort Setting in Config/UI **Priority:** Low **Files:** `src/mail/config.py`, `src/mail/app.py` Add configurable sort order (date, sender, subject) with UI toggle. --- ### Message Display #### 8. URL Compression in Markdown View **Priority:** Medium **Files:** `src/mail/widgets/ContentContainer.py`, `src/mail/screens/LinkPanel.py` Compress long URLs in the markdown view to ~50 characters with a nerdfont icon. The `_shorten_url` algorithm in `LinkPanel.py` can be reused. **Considerations:** - Cache processed markdown to avoid re-processing on scroll - Store URL mapping for click handling #### 9. Remove Emoji from Border Title **Priority:** Low **File:** `src/mail/widgets/ContentContainer.py` or `EnvelopeHeader.py` Remove the envelope emoji prefix before message ID in border titles. #### 10. Enhance Subject Styling **Priority:** Medium **File:** `src/mail/widgets/EnvelopeHeader.py` - Move subject line to the top of the header - Make it bolder/brighter for better visual hierarchy --- ## Tasks App ### Search Feature #### 1. Task Search **Priority:** Medium **Files:** `src/tasks/app.py`, `src/services/dstask/client.py` Add search functionality: - `/` keybinding to open search input - Search by task summary, notes, project, tags - Display matching tasks - Check: dstask likely supports filtering which can be used for search **Implementation:** - Add search input widget (TextInput) - Filter tasks locally or via dstask command - Update table to show only matching tasks - Clear search with Escape --- ### Help System #### 2. Implement Help Toast **Priority:** Low **File:** `src/tasks/app.py` Add `?` keybinding to show help toast (matching Calendar app pattern). **Note:** This is already implemented in the current code. --- ## Cross-App Improvements ### 1. Consistent Help System Implement `?` key help toast in all apps using `self.notify()`: - Mail: `src/mail/app.py` - Tasks: `src/tasks/app.py` (already has it) - Sync: `src/cli/sync_dashboard.py` ### 2. Consistent Navigation Add vim-style `j`/`k` navigation to all list views across apps. ### 3. Consistent Border Styling Use `border: round` and `.border_title` styling consistently in all TCSS files. ### 4. Consistent Search Interface Implement `/` keybinding for search across all apps with similar UX: - `/` opens search input - Enter executes search - Escape clears/closes search - Results displayed in main view or filtered list --- ## Implementation Priority ### Phase 1: Critical/High Priority 1. ~~Tasks App: Fix table display~~ (DONE) 2. ~~Sync: Parallelize message downloads~~ (DONE - connection pooling + batch size increase) 3. ~~Mail: Replace hardcoded RGB colors~~ (DONE - already using theme variables) 4. ~~Mail: Remove envelope icon/checkbox gap~~ (DONE) 5. ~~Calendar: Current time hour line styling~~ (DONE - added surface background) 6. ~~IPC: Implement cross-app refresh notifications~~ (DONE) ### Phase 2: Medium Priority 1. Sync: Default to TUI mode 2. Calendar: Cursor hour header highlighting 3. Calendar: Responsive detail panel 4. Calendar: Sidebar mini-calendar 5. Calendar: Calendar invites sidebar 6. Mail: Add refresh keybinding 7. Mail: Add mark read/unread action 8. Mail: Folder message counts 9. Mail: URL compression in markdown view 10. Mail: Enhance subject styling 11. Mail: Search feature 12. Tasks: Search feature 13. Calendar: Search feature ### Phase 3: Low Priority 1. Sync: UI consistency (j/k navigation, borders) 2. Sync: Notifications toggle 3. Calendar: Help toast (already implemented, replicate to other apps) 4. Mail: Remove emoji from border title 5. Mail: Sort setting in config/UI 6. Cross-app: Consistent help, navigation, and styling --- ## Technical Notes ### IPC Implementation Details For macOS-first with Linux compatibility: ```python # src/utils/ipc.py import asyncio import json from pathlib import Path SOCKET_PATH = Path.home() / ".cache" / "luk" / "ipc.sock" class IPCServer: """Server for sending notifications to listening apps.""" async def broadcast(self, message: dict): """Send message to all connected clients.""" pass class IPCClient: """Client for receiving notifications in apps.""" async def listen(self, callback): """Listen for messages and call callback.""" pass ``` ### Backend Search Capabilities | Backend | Search Support | |---------|---------------| | dstask | Filter by project/tag, summary search via shell | | himalaya | Check `himalaya search` command | | khal | Check `khal search` command | | Microsoft Graph | Full text search via `$search` parameter | --- ## Notes - All UI improvements should be tested with different terminal sizes - Theme changes should be tested with multiple Textual themes - Performance improvements should include before/after benchmarks - New keybindings should be documented in each app's help toast - IPC should gracefully handle missing socket (apps work standalone) - Search should be responsive and not block UI --- ## Library Updates & Python Version Review ### Priority: Medium (Scheduled Review) Periodically review the latest releases of heavily-used libraries to identify: - Bug fixes that address issues we've encountered - New features that could improve the codebase - Deprecation warnings that need to be addressed - Security updates ### Key Libraries to Review | Library | Current Use | Review Focus | |---------|-------------|--------------| | **Textual** | All TUI apps | New widgets, performance improvements, theming changes, CSS features | | **aiohttp** | Microsoft Graph API client | Async improvements, connection pooling | | **msal** | Microsoft authentication | Token caching, auth flow improvements | | **rich** | Console output (via Textual) | New formatting options | | **orjson** | Fast JSON parsing | Performance improvements | | **pyobjc** (macOS) | Notifications | API changes, compatibility | ### Textual Changelog Review Checklist When reviewing Textual releases, check for: 1. **New widgets** - Could replace custom implementations 2. **CSS features** - New selectors, pseudo-classes, properties 3. **Theming updates** - New theme variables, design token changes 4. **Performance** - Rendering optimizations, memory improvements 5. **Breaking changes** - Deprecated APIs, signature changes 6. **Worker improvements** - Background task handling ### Python Version Upgrade #### Current Status - Check `.python-version` and `pyproject.toml` for current Python version - Evaluate upgrade to Python 3.13 or 3.14 when stable #### Python 3.13 Features to Consider - Improved error messages - Type system enhancements (`typing` module improvements) - Performance optimizations (PEP 709 - inline comprehensions) #### Python 3.14 Considerations - **Status:** Currently in alpha/beta (as of Dec 2024) - **Expected stable release:** October 2025 - **Recommendation:** Wait for stable release before adopting - **Pre-release testing:** Can test compatibility in CI/CD before adoption #### Upgrade Checklist 1. [ ] Review Python release notes for breaking changes 2. [ ] Check library compatibility (especially `pyobjc`, `textual`, `msal`) 3. [ ] Update `.python-version` (mise/pyenv) 4. [ ] Update `pyproject.toml` `requires-python` field 5. [ ] Run full test suite 6. [ ] Test on both macOS and Linux (if applicable) 7. [ ] Update CI/CD Python version ### Action Items 1. **Quarterly Review** - Schedule quarterly reviews of library changelogs 2. **Dependabot/Renovate** - Consider adding automated dependency update PRs 3. **Changelog Reading** - Before updating, read changelogs for breaking changes 4. **Test Coverage** - Ensure adequate test coverage before major updates