Repository source: docs/plans/backlog/offline_support_extended_roadmap.md
Extended Offline Parity Roadmap
Status: Partially delivered; reconciled against implementation on 2026-10-15. Product direction and backlog. Each selected slice requires its own Feature Development Process (FDP) record before implementation.
Goal
Deliver the closest practical offline equivalent of the forum while keeping state honest, private data private, and every unavailable or pending action understandable. “Parity” has three distinct meanings:
Read parity: public information and navigation available from an explicitly bounded saved snapshot.
Prepare parity: a person can prepare work locally without claiming it was sent or accepted.
Action parity: a person can deliberately queue selected actions and inspect their eventual server outcome.
Full parity is not an unconditional promise. Personalized, privileged, or irreversible features need a separate security and revocation design before they can leave the online-only boundary.
Current baseline
Parity matrix
| Area | Target offline experience | Current state | Safety/decision gate |
|---|---|---|---|
| Board | Browse saved threads; filter/sort; clearly show snapshot bounds | Partial, delivered | Broaden coverage only within public size/privacy budget |
| Thread and replies | Read complete saved threads and follow saved links | Partial, delivered | Missing/deleted/hidden content must say why it is unavailable |
| Tags | Browse saved tags and saved results | Delivered | Keep index derived only from the snapshot |
| Profiles | Read selected public summaries | Not started | Deletion, revocation, visibility, and identity boundary |
| Search and feeds | Search/browse only saved public content | Not started | Local index size, stale-result disclosure, unavailable global search |
| Tools and diagnostics | Open a minimal offline-help/health surface | Partial, delivered; Outbox is cached separately | Never cache operator or personalized tools |
| Compose | Create, retain, edit, export, and discard local drafts | Partial; capture from an open compose page | Shared-device privacy and clear retention rules |
| Reactions | Queue eligible reactions and reconcile an outcome | Thread/reply Like queue delivered; signed at click time | Identity, idempotency, moderation semantics |
| Threads and replies | Queue signed content with clear status and foreground automatic delivery | Initial delivery delivered | Durable signing, conflicts, parent availability, server idempotency |
| Account, invitations, moderation, administration | Remain online unless separately designed | Intentionally online | Authentication, privilege, revocation, and audit guarantees |
Delivery sequence
0. Trust and convenience foundation
Outcome: A reader understands what is saved, what is missing, and how to recover without developer tools.
1. Maximum safe public read parity
Outcome: All suitable public reading tasks work from a bounded snapshot; unsupported routes say so plainly instead of failing ambiguously.
2. Local preparation
Outcome: Offline work is useful before it is networked, but never appears submitted.
3. Shared Outbox and queued low-risk actions
Outcome: Every queued user action appears in one honest, controllable Outbox rather than being hidden behind individual screens.
The Outbox is a first-class offline screen that displays all queued actions across the device: reactions, flags (if approved), replies, threads, and any future eligible action. It must show, for each item:
action type, target, local creation time, last attempted time, and a safe summary of what will be sent;
state:
draft,queued,waiting for connection,sending,accepted,rejected,conflicted,cancelled, orneeds attention;a concise server result or recovery explanation, without claiming success before confirmation;
item controls appropriate to the state: open/edit draft, retry, cancel, export, or discard; and
filtered counts and an accessible status summary so people can identify work that still needs attention.
Delivered in the initial Outbox release:
Remaining hardening before broadening action types:
After those foundations:
4. Queued replies and threads
Outcome: A person can deliberately submit composed content after reconnection and follow its result from the Outbox.
5. Synchronization maturity
Outcome: Offline use scales without turning a browser cache into an unbounded mirror of the site.
Non-negotiable constraints
Never cache private/member-only pages, account data, private keys, identities, authenticated API responses, or operational data in the public offline cache.
Never present a local draft or queued item as a server-accepted action.
Preserve complete prior saved data when refresh or synchronization fails.
Make snapshot age, scope, and missing-content reasons visible.
Treat deletion, moderation, authorization changes, and account revocation as core queue/reconciliation cases, not edge cases.
How to choose the next FDP slice
Prioritize the smallest item that removes a common source of uncertainty:
Verify the current snapshot lifecycle in a real browser, including a new publication triggering refresh (still unobserved in the asset-refresh record). Then finish accurate completion/retained-copy feedback and confirmed clearing on Tools → Offline Reading, protecting or warning about pending Outbox work.
Add explicit unavailable-route treatment and saved-content coverage clarity.
Finish draft restore/edit/export and their shared-device privacy lifecycle.
Harden the existing Outbox's idempotency and target/authorization reconciliation before adding action types; the shared Outbox, signed Likes, and initial reply/thread delivery already exist.
Consider broader synchronization only when those guarantees are proven.
See the main roadmap for implementation evidence links and the recommended next slice. The compact update bundle is delivered; general delta synchronization remains future work.