LoomAssist is a local-first desktop calendar app for students and developers. All data and AI inference run on-device. Nothing leaves your machine β even when you connect a cloud calendar, sync runs directly device β provider, never through a LoomAssist server.
- π― GPA Projection β per-course slider on Courses; preview the finishing grade if remaining work scores X%. Aggregates onto a Home-page grade widget too.
- β° Procrastination Radar β
/schedule/procrastination-radarflags assignments due within 7 days that have no linked study or focus block; surfaces as a wellness toast on the calendar. - π Exam Cluster Detection β three or more exam-type events within a 5-day window trip a banner via the existing
/schedule/analyzewarnings. Reuses the wellness-warning surface β no new top-level UI. - π Class-Prep Auto-Blocking β new
event_typeandprep_minutesfields onEvent. For events taggedlecture, the prep buffer expands busy windows backward in the free-slot search and renders as a leading prep block on the grid. - β‘ Energy Mapping β new
PomodoroSessiontable +/pomodoro-sessions/energy-maproute +EnergyMappingWidgeton the home page. Hour-of-day Γ day-of-week completion rate, read-only. - π Sleep Window Guardrail β configurable wind-down time in Settings (localStorage-backed, no schema change). Events that end past it raise a soft warning during create / drag / resize via the existing notification system.
- βΊ Mark as Missed β opt-in
Event.missed_atflag set from the EventEditor footer on past non-recurring events. Calendar sidebar lists what's marked; the newMissedEventsModalwalks per-row reschedule viafindFreeSlots. Auto-clears on a regular Save. - π Class-Day Takeaway Prompt β when a lecture event ends, a dismissible
TakeawayToastcaptures a two-line takeaway. NewPOST /journal/textroute +JournalEntry.event_idindexed FK persist the entry tagged to the originating event. One prompt per event; no re-prompt after explicit dismiss.
- βοΈ Optional Cloud Identity β sign in with Google Β· Apple Β· Microsoft Β· email. Identity-only β your email + display name are stored on Supabase and nothing else ever leaves the device. Local mode stays first-class; sign-in is always optional.
- π Direct Calendar Sync β connect Google Calendar (OAuth) and any CalDAV server (iCloud, Fastmail, Nextcloud, generic) for two-way sync. OAuth tokens and CalDAV passwords live in the macOS Keychain, never SQLite.
- π§ͺ Sync Review Queue β every ambiguous match (fuzzy duplicates, two-sided edits, push rejections) is routed to a triage surface at
/calendar/sync-review. Approve, merge field-by-field, replace local, or reject-and-remember. Never silently merges. - β§ Sync Merge Modal β three-column field diff (Local Β· Incoming Β· live Result preview) with per-field accept toggles.
β΅saves,Esccloses. - β» Sync Center Popover β top-bar status surface with per-connection rows: status pill, last-synced timestamp, sync-now / pause / resume actions, and a thin progress bar while a cycle is in flight. SSE-driven, reconnects with backoff.
- πͺ Onboarding Wizard β a 4-step first-launch flow (Welcome β Account β Connect β Subscribe). Every step has a working Skip; the wizard never blocks the local-mode app.
- πͺͺ Source Badge β synced events show a monochrome provider glyph + "synced 2m ago" in the QuickPeek hover card and in the Event Editor metadata cluster. The event pill itself stays untouched.
- βοΈ Settings β Account & Connections β new Account settings page with display-name edit and non-destructive sign-out. Connections page lists every linked provider; per-connection detail surfaces subscribed calendars, sync direction, pause/resume, and a non-destructive disconnect (events become local-only, never deleted; provider events untouched).
- π§ Drag-to-Create Conflict Edge β drag-selecting on a busy range now shows a 2px warning left edge before the event is created.
- π Today-Line Freshness β Day/Week views show a small "synced 3m ago" pill in the top-right when at least one connection exists. Hidden in local-only mode.
- π Bell Panel Collapse β three or more sync notifications from the same connection collapse into a single summary row.
- ποΈ Settings Two-Pane Layout β Settings sidebar groups Account / App with section anchors; smooth-scroll to Appearance, Keybindings, Data, LAN Sync, etc.
- βοΈ Cloud Identity (optional) β Supabase Auth with Google Β· Apple Β· Microsoft Β· email/password. Identity is email + display name + provider IDs only. No event data ever traverses a LoomAssist server.
- π Direct Calendar Sync β two-way sync with Google Calendar (OAuth) + any CalDAV server (iCloud, Fastmail, Nextcloud, generic). Tokens live in the macOS Keychain.
- π§ͺ Sync Review Queue β fuzzy duplicates (title β₯ 0.85 token-set ratio + start within 15 min + duration within 15 min) and two-sided edits become explicit decisions, never silent merges.
- β§ Sync Merge Modal β three-column field-by-field diff with per-field accept toggles and a live result preview.
- β» Sync Center β top-bar popover with per-connection status, last-synced freshness, sync-now / pause / resume, and an animated progress indicator during cycles. SSE-driven.
- πͺ Onboarding Wizard β first-launch 4-step setup (welcome β optional account β optional connection β calendar pick). Skip on every step.
- πͺͺ Source Badge β provenance glyph + connection name + freshness in QuickPeek + Event Editor only. Pill anatomy is sacred β never tinted by source.
- π Today-Line Freshness β small monochrome "synced 3m ago" pill in time-grid views, hidden when no connections exist.
- π‘οΈ Non-Destructive Disconnect β disconnecting a provider keeps every local event; provider events are untouched. Events simply lose their sync metadata.
- ποΈ Voice-to-Intent β Faster-Whisper + Ollama transcribes speech and creates, moves, cancels, or resizes events from natural language
- π Five Calendar Views β Month, Week, Day, Year, and Agenda. Ctrl/Cmd+scroll cycles view granularity; plain scroll navigates dates in month and agenda views
- ποΈ Year View β Click a month name to jump to that month view; click a day to jump to day view. Scroll to navigate years
- π Advanced Recurring Events β Weekly schedules with per-day times, skip-date exceptions, and per-occurrence description overrides
- π Location & Travel Time β Each event stores a location and optional travel time. The free-slot finder blocks the commute buffer automatically
- π Smart Scheduler β Find up to 5 free slots in a rolling window; all slots land on :00/:15/:30/:45 boundaries. Slot duration is configurable
- π© Conflict-Aware Drag Preview β real-time red/green tint while dragging over busy or free slots
- π‘ Smart Conflict Resolution β AI suggests up to 3 rescheduling alternatives with rationale when a conflict is detected
- π€ Adaptive Reminders β Ollama infers reminder lead time from the event title; "Suggested" pill distinguishes AI from user-set reminders
- π₯ Quick-Capture Inbox β
Ikey drops unscheduled items into an inbox; AI proposes a time slot and calendar - ποΈ Voice-Driven Editing β natural language event edits (move, cancel, resize) with confirmation toasts and undo support
- π Local Semantic Search β sentence-transformers cosine similarity; toggle on the top bar, results show similarity %
- ποΈ Time-Blocking Autopilot β auto-schedules tasks by deadline and estimated duration; review and accept proposals before they're applied
- π Cross-Event Dependencies β link events with time offsets; cascade moves recompute and update all dependents in one step
- π Task Board β Kanban grouping by status, priority, timeline, or due date. "Plan week" button launches the autopilot
- π― Focus Mode β Fullscreen Pomodoro session with today's events in a Kanban rail
- π Voice Journal β 60-second audio recordings with Whisper transcription, mood selector, and mood timeline chart
- π Course Manager β track courses, assignments, weighted grades, and syllabus events all in one place
- π iCal Subscription URLs β auto-refreshing read-only calendar feeds with configurable interval and status badges
- ποΈ Event Templates & Time Block Templates β save reusable single events or full week schedules and apply them in one click
- β Per-Event Checklists β sub-tasks stored in the event; progress chip shown on the calendar grid
- β±οΈ Duration Tracking β Clock in/out on any event; the Stats panel shows planned vs. actual time with delta highlighting
- π Study Block Generator β AI-assisted session scheduling from a subject and deadline date
- π Weekly Review β Ollama-powered narrative summary of the past and upcoming week, including journal reflections
- π Appointment Scheduling β Generate a shareable availability link; recipients confirm, decline, or counter-propose. Accepted slots auto-create events
- π₯ ICS Import / Export β Bulk-import
.icscalendars with duplicate prevention viaexternal_uid. Export individual timelines - π Syllabus PDF Scanner β AI extracts deadlines and events from uploaded PDFs and assigns them to a course
- π½ Collapsible Sidebar Filters β Toggle filters via a chevron-controlled dropdown. Timelines, templates, and Smart Scheduler live in the same sidebar
- βͺ Global Undo/Redo β 50-step stack (Cmd/Ctrl+Z / Shift+Z), including cascade moves
β οΈ Wellness Warnings β Ollama detects over-scheduled days and surfaces reminders for meals, breaks, and commute time- π In-App Notifications β Bell panel with info, success, warning, error, and progress types; actionable cards; auto-dismiss; unread badge
- ποΈ Quick-Peek Hover Card β Rich event preview (time, timeline, description, checklist) on mouse-over without opening the editor
- π₯οΈ macOS Menu-Bar Tray β next event and Pomodoro state visible from the menu bar at all times
- π Encrypted Local Backup β AES-256-GCM with scrypt key derivation; atomic encrypted restore with automatic pre-restore safety backup
- π‘ LAN Multi-Device Sync β mDNS discovery, OTP pairing, and last-write-wins sync with tombstone deletes
- π Structured Logging β JSON log pipeline with rotating backend logs, batched frontend shipping, crash snapshots, and a log viewer
- πΎ Sync Status Indicator β Live timestamp in the top bar; turns red on connection failure
- π±οΈ Multi-Select & Bulk Delete β Drag across the grid to select; Delete/Backspace removes all selected events
- π¨οΈ Print Week View β Print-optimized layout opens in a new tab
- π Light / Dark Mode β Toggle from Settings; persisted to localStorage
- β¨οΈ Configurable Keybinds β Rebind any shortcut from Settings with live key-capture UI
- π― GPA Projection β Per-course slider on Courses showing current weighted grade and projected finish if remaining work scores X%
- β° Procrastination Radar β Assignments due within 7 days with no linked study/focus block surface as wellness toasts
- π Exam Cluster Warnings β Three or more exam-type events within a 5-day window trip a warning banner with rebalance affordance
- π Class-Prep Auto-Blocking β Opt-in
prep_minuteson lecture events expands busy windows so the prep buffer is honored by the slot finder - β‘ Energy Mapping β Pomodoro completion rate by hour-of-day on the home page; read-only insight, no scheduling action
- π Sleep Window β Configurable wind-down time in Settings; events that end past it surface a soft warning during create / drag / resize
- βΊ Mark as Missed β Opt-in flag on past events; the calendar sidebar lists what's marked and a modal walks you through rescheduling each via the existing free-slot finder
- π Class-Day Takeaway Prompt β When a lecture ends, a dismissible toast captures a two-line takeaway that lands in the journal tagged with the event
| Layer | Technology |
|---|---|
| Framework | FastAPI 0.135 |
| ORM / DB | SQLModel 0.0.37 (Pydantic + SQLAlchemy) |
| Database | SQLite (loom.sqlite3) |
| Speech-to-Text | Faster-Whisper 1.2 (base.en, int8, CPU) |
| Local LLM | Ollama + Llama 3.2 |
| Embeddings | sentence-transformers (all-MiniLM-L6-v2) |
| PDF parsing | PyPDF 6.9 |
| HTTP client | httpx 0.28 |
| Encryption | cryptography 47 (AES-256-GCM + scrypt) |
| mDNS | zeroconf 0.148 |
| Cloud auth (v2.2) | Supabase Auth REST (httpx β no SDK) |
| CalDAV (v2.2) | caldav 2 + vobject |
| Fuzzy matching (v2.2) | rapidfuzz 4 (token_set_ratio) |
| Python | 3.13 |
| Layer | Technology |
|---|---|
| Desktop shell | Tauri v2 (Rust) |
| UI Framework | React 19 + TypeScript 6 |
| Build tool | Vite 8 |
| Calendar UI | FullCalendar v6 (@fullcalendar/react) |
| Styling | CSS Modules + CSS custom properties |
| Routing | React Router v7 |
| Testing | Vitest + @testing-library/react |
cd backend-api
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
python3 -m uvicorn main:app --reloadcd frontend-ui
npm install
npm run tauri devcd backend-api && source venv/bin/activate && python3 seed_demo.pyPopulates 4 calendars, 25 events, 13 tasks, 6 journal entries, 7 inbox items, 2 courses, 14 assignments, and 5 event templates across a realistic two-week window. Re-running the script resets everything cleanly.
| Shortcut | Action |
|---|---|
N |
New event |
T |
Jump to today |
1 |
Month view |
2 |
Week view |
3 |
Day view |
4 |
Year view |
5 |
Agenda view |
[ / ] |
Previous / Next period |
B |
Toggle sidebar |
/ |
Focus search bar |
F |
Toggle Focus Mode |
I |
Toggle Inbox panel |
Delete |
Delete selected event(s) |
Ctrl+Z |
Undo |
Ctrl+Shift+Z |
Redo |
Escape |
Close modal / dismiss dropdown |
Ctrl/Cmd+Scroll |
Zoom view granularity |
Scroll |
Navigate prev/next period (month/agenda views) |
All shortcuts are rebindable from Settings β Keyboard Shortcuts.
- FullCalendar interactive grid
- Local AI intent extraction (Ollama)
- Global search & filtering
- Custom timeline color picking
- ICS import / duplicate prevention
- Syllabus PDF scanning
- Hidable sidebar
- Timeline export (JSON/ICS)
- Global undo/redo stack
- Markdown links & @mention tagging
- Reminders & browser notifications
- Database backup, restore, & timezone handling
- Drag-and-drop rescheduling & resizing
- All-day and multi-day event support
- Per-day different times on recurring events
- Skip individual recurring event occurrences
- Per-event task checklists
- Event templates
- Full React 19 + TypeScript rewrite (replaced vanilla JS)
- Task Board β Kanban grouping by timeline, due date, priority, status
- Focus Mode β fullscreen Pomodoro with today's events rail
- Wellness warnings via Ollama
- Usage statistics panel
- Daily agenda startup overlay
- Sync status indicator
- Unified search + quick-add bar
- Timeline rename and conditional delete
- Multi-select and bulk delete
- Print week view
- App drawer navigation strip
- In-app notification panel (bell, badge, progress, actionable cards)
- Appointment scheduling via shareable availability link
- Quick-peek hover card
- Structured full-stack logging (rotating JSON logs, crash snapshots)
- Year view
- Scroll-wheel date navigation
- Collapsible sidebar filter dropdown
- Activity heatmap with busy-level legend bar
- Duration tracking (clock in/out, planned vs. actual stats)
- Study block generator
- Weekly review
- Time block templates
- Find free time (15-min aligned slots)
- Event location field + travel time
- Light / Dark mode toggle
- Configurable keybinds
- Adaptive AI reminders
- Conflict-aware drag preview
- Smart conflict resolution with AI suggestions
- Quick-capture inbox with AI time proposals
- Voice-driven event editing (move, cancel, resize)
- Local semantic search with sentence-transformers
- Time-blocking autopilot
- Course manager with weighted grade tracking
- iCal subscription URL auto-refresh
- Cross-event dependencies with cascade moves
- macOS menu-bar tray
- Voice journal with Whisper + mood tracking
- AES-256-GCM encrypted local backup
- LAN multi-device sync with mDNS + OTP pairing
- Optional cloud identity via Supabase Auth (Google Β· Apple Β· Microsoft Β· email)
- Two-way Google Calendar sync (OAuth 2.0, incremental sync tokens, paginated initial pull)
- CalDAV sync β iCloud preset + generic CalDAV (Fastmail, Nextcloud, anything CalDAV)
- macOS Keychain storage for OAuth tokens & CalDAV passwords (Tauri
keyringcrate) - Sync Review queue with
incoming_duplicate/bidirectional_conflict/push_rejectedkinds - Sync Merge modal β three-column field-by-field diff with per-field accept + live preview
- Sync Center top-bar popover (SSE-driven, reconnect with backoff)
- Onboarding wizard (4 steps, Skip on every step)
- Provenance badge in QuickPeek + Event Editor (pill anatomy untouched)
- Settings β Account + Settings β Connections + Connection detail page
- Non-destructive disconnect (events stay local-only; provider untouched)
- Drag-to-create conflict warning edge
- Today-line synced freshness label
- Bell panel
collapseKeyto coalesce noisy sync notifications - Sync Review keyboard shortcuts (
j/k/Enter/r) viauseShortcuts - Sleep/wake refresh β fires
/sync/runon window focus when stale > 60s - Settings two-pane navigation with section anchors
- GPA projection slider on Courses + aggregate grade widget on Home
- Procrastination Radar β wellness toast for assignments due within 7 days with no linked study/focus block
- Exam Cluster detection β three-or-more-exams-in-five-days banner via
/schedule/analyze - Class-prep auto-blocking β
event_type+prep_minuteson Event; prep buffer expands free-slot search and renders as a leading prep block - Energy Mapping widget on the home page β hour-of-day Γ day-of-week Pomodoro completion rate
- Sleep window guardrail β soft warning for events past a configurable wind-down time
- Mark-as-missed flag on past events + sidebar listing +
MissedEventsModalper-row reschedule - Class-day takeaway prompt β
TakeawayToastafter lecture end βPOST /journal/texttagged withevent_id
- Microsoft Graph (Outlook) connection
- Tray-mode background sync (5-min cycles when window is closed)
- Bulk-merge UI beyond approve-all / reject-all
- One-key capture (Ctrl+L) β premium audio capture
- AI study guide / cheat sheet generator β premium
- Mobile app (iOS/Android)
LoomAssist/
βββ backend-api/
β βββ database/
β β βββ database.py # DB engine, session, run_migrations()
β β βββ models.py # SQLModel table definitions (13 tables)
β βββ services/
β β βββ scraper.py # PDF/syllabus scraper
β β βββ embedder.py # sentence-transformers embedding + cosine search
β β βββ event_resolver.py # Fuzzy event matching for voice editing
β β βββ exam_cluster.py # Exam-window detector (Feature 3)
β β βββ auth/
β β β βββ supabase.py # Supabase Auth REST client (v2.2)
β β βββ sync/ # v2.2 cloud sync
β β βββ google.py # Google Calendar REST + OAuth
β β βββ caldav.py # iCloud / generic CalDAV via the caldav lib
β β βββ dedup.py # Pure-function fuzzy matcher (the Β§10 Q5 thresholds)
β β βββ ics_normalize.py # iCal β event payload conversion
β β βββ runner.py # 5-min asyncio loop; broadcasts SSE events
β β βββ keychain_bridge.py # Frontend-Keychain β runner token bridge
β βββ tests/ # pytest unit + integration tests (run each file in isolation)
β βββ main.py # FastAPI app β all routes (3500+ lines)
β βββ seed_demo.py # Demo data seed script
β βββ loom.sqlite3 # Local SQLite database
βββ frontend-ui/
β βββ src/
β β βββ src/ # React source root
β β βββ components/
β β β βββ calendar/ # DragShader, YearView, EventPill, TodayLineFreshness, ExamClusterBanner, ProcrastinationToast, TakeawayToast (v2.3), β¦
β β β βββ connections/ # ProviderPickerModal, CalDAVCredentialsModal, SubscribeDrawerModal (v2.2)
β β β βββ focus/ # PomodoroPanel, KanbanBoard, β¦
β β β βββ home/ # EnergyMappingWidget, GradeWidget, UpNextWidget, WeeklyReviewWidget (v2.3)
β β β βββ inbox/ # InboxPanel
β β β βββ journal/ # JournalRecorder
β β β βββ modals/ # EventEditorModal, AutopilotReviewModal, SyllabusModal, SyncMergeModal (v2.2), MissedEventsModal (v2.3), β¦
β β β βββ topbar/ # AccountAvatar, SyncCenter (v2.2)
β β β βββ shared/ # AppDrawer, TopBar, SourceBadge (v2.2), Icon, β¦
β β βββ contexts/ # ModalContext, UndoContext, CalendarNavContext, AccountContext (v2.2), SyncContext (v2.2)
β β βββ hooks/ # useShortcuts, useReminders
β β βββ lib/ # eventUtils, keybindConfig, keychain (v2.2 β wraps Tauri keyring commands), gradeProjection / missedEvents / sleepWindow / takeawayDismissals / eventClassification (v2.3)
β β βββ pages/ # CalendarPage, TaskBoardPage, FocusPage, InboxPage,
β β β # CoursesPage, JournalPage, SettingsPage,
β β β # SignInPage / OnboardingPage / AccountSettingsPage (v2.2),
β β β # ConnectionsSettingsPage / ConnectionDetailPage / SyncReviewPage (v2.2)
β β βββ store/ # notifications pub/sub (collapseKey grouping in v2.2)
β β βββ styles/ # tokens.css (design system)
β β βββ api.ts # Typed API client (all HTTP calls)
β β βββ types.ts # TypeScript interfaces for all models
β βββ src-tauri/ # Rust desktop wrapper (Tauri v2)
β β βββ Cargo.toml # +keyring crate (v2.2 β macOS Keychain access)
β β βββ src/lib.rs # Menu-bar tray, window management, keychain_set/get/delete commands (v2.2)
β βββ package.json
βββ CLAUDE.md
βββ .gitignore
βββ LICENSE
βββ README.md