Files
nocal/docs/ROADMAP.md
Bernardo Magri 295acbc125 feat: add Linux OAuth adapters
Add a bounded libcurl transport with verified TLS, no redirects or retries, sanitized failures, binary-safe requests, and resolved-address enforcement for cleartext loopback traffic.

Add shell-free xdg-open launching and a one-shot IPv4 loopback callback receiver with strict HTTP/query parsing, deadlines, fixed callback path, and RAII cleanup. Token parsing, Secret Service, and Graph remain follow-up phases.
2026-07-18 11:33:06 +01:00

98 lines
4.4 KiB
Markdown

# Roadmap
## Foundation — current milestone
- C++20 domain model and deterministic six-week month layout
- Responsive, theme-native ANSI month view with keyboard navigation
- Appointment focus, dense-day traversal, and full-frame detail reader
- Validated add/edit/delete forms with confirmation and failure rollback
- Guarded atomic `.ics` persistence, advisory locking, and round-trip tests
- Bounded session undo/redo, exact external-change detection, and backup recovery
- Windowed recurrence expansion, compatible RDATE, EXDATE, IANA TZID, and
multi-day segment cues
- Occurrence-aware appointment search with exact result-to-grid navigation
- Session calendar toggles shared by month rendering, focus, and search
- Read-only 42-day agenda with bounded recurrence and exact return navigation
- Configurable week start with Monday-default CLI and consistent grid queries
- Explicit atomic import/export with validation, collision refusal, and backups
- Meson build, Nix development shell, desktop entry, and Hyprland launcher
- Seeded sample data when explicitly requested, never silent data mutation
## 0.1 — complete local calendar
- Advanced recurrence rule editing and detached RECURRENCE-ID overrides
- Embedded VTIMEZONE support
- Screen-reader-friendly linear view and full Unicode display-width handling
## 0.2 — durable cache and provider boundary — in progress
Completed cache foundation:
- Provider-neutral SQLite WAL cache in a private local file
- Versioned, all-or-nothing schema migrations
- Raw provider payload retention, inactive calendars, and event tombstones
- Per-calendar/window opaque cursors committed atomically with pulled pages
- Normalized event instances for immutable snapshots
- Reserved transactional outbox and conflict records for later remote writes
Completed HTTP/OAuth boundary:
- Generic injected HTTP transport and deterministic fakes, with retries left to
provider operations
- Public-desktop OAuth authorization code design with PKCE `S256`, system
browser, and loopback redirect
- Multitenant Microsoft account audience and delegated least-privilege
`Calendars.Read`; tenant policy may still require administrator consent or
block user consent
- No client secret in the open-source desktop binary
Completed concrete Linux adapters:
- libcurl transport with verified TLS, bounded responses/timeouts, no automatic
redirects/retries, and cleartext HTTP only for loopback tests
- Shell-free `xdg-open` launcher and one-shot `127.0.0.1` callback receiver
advertising `http://localhost:<dynamic-port>/nocal/oauth/callback`
- Mobile/Desktop public-client registration at
`http://localhost/nocal/oauth/callback`; Microsoft ignores localhost ports,
while literal HTTP `127.0.0.1` needs a manifest edit and IPv6 loopback is not
supported
Next provider-boundary slices:
- Token JSON parsing and a Secret Service adapter isolated off the render thread
because synchronous libsecret calls may block
- OAuth secrets in Secret Service, never SQLite
- Generic `SyncProvider` contract and observable sync status
## 0.3 — CalDAV
- Discovery and incremental sync for Nextcloud and standards-compliant servers
- ETag-aware writes, offline mutation queue, conflict UI
- TLS and failure-path integration tests
## 0.4 — hosted providers
- Google Calendar adapter with incremental synchronization
- Microsoft 365 read-only discovery and Graph delta synchronization, followed by
ETag-aware remote writes after the conflict boundary is proven
- Account/calendar management UI and per-calendar ANSI identity
The cache, generic HTTP/OAuth boundary, and concrete Linux adapters are
prerequisites, not usable Microsoft 365 integration. There is still no token
parser, Secret Service backend, Graph call, or account UI. The immediate sequence is token parsing plus an
off-render-thread Secret Service adapter, then read-only Microsoft Graph
discovery and delta synchronization.
## 1.0 — distribution quality
- Stable configuration/data format and documented recovery procedures
- Nomarchy package, Hyprland defaults, man page, shell completions
- Performance budgets exercised against large and adversarial calendars
- Fuzzed iCalendar parser, accessibility review, translations
## Quality gates
Every milestone requires clean warning-enabled builds, unit and integration
tests, sanitizer runs, terminal-state recovery after signals/errors, no network
access without explicit account setup, and no loss of unknown calendar data.