Parent
Part of #478 — PWA first-class excellence/hardening.
Product opportunity
The manifest already declares display: standalone, window-controls-overlay in display_override, shortcuts, launch_handler, handle_links, a share target, protocol handler and Edge side-panel metadata. These declarations should become a coherent installed WorldScript experience, not merely manifest decoration.
A well-designed installed PWA can combine web deployment with an app-like window, deep links, shortcuts and selective OS integration while retaining instant update/zero-installer advantages.
Capability philosophy
Use progressive enhancement:
normal browser tab = complete baseline product
installed PWA = enhanced shell
supported Chromium desktop = additional OS/window integration
mobile installed PWA = touch/mobile shell
Never hide core writing features behind installation.
Window Controls Overlay
Where supported, evaluate integrating WorldScript chrome into the title-bar overlay.
Requirements:
- use
window-controls-overlay only after runtime feature detection;
- respect
env(titlebar-area-*) geometry;
- never place essential controls under draggable/window-control regions;
- preserve keyboard/accessibility semantics;
- high contrast/theme/reduced-transparency modes remain readable;
- fall back to normal standalone chrome cleanly.
Potential benefit: more vertical manuscript space and a genuinely app-like shell.
Launch handling / single-window preference
The manifest currently uses launch_handler.client_mode = navigate-existing.
Productize this:
App shortcuts
The manifest already defines shortcuts for Templates, Manuscript, Characters, AI Writer, New Scene and Start Writing Session.
Audit them as product entry points:
- cold start to correct destination;
- warm existing-window navigation;
- offline behavior;
- unsaved-current-project handling;
- accessibility/focus after launch;
- invalid/stale query fallback.
Consider whether a small number of higher-value dynamic-ish workflows should replace lower-value shortcuts; manifest shortcuts themselves are static, so avoid pretending they can reflect live project state.
Link handling and protocol handler
handle_links: preferred and web+worldscript can enable deep app entry.
Define an allowlisted route grammar for safe intents such as:
open view
open project by local logical ID (only if already present/authorized)
open capture inbox
start writing session
Do not allow protocol/deep links to trigger:
- arbitrary file access;
- plugin installation;
- AI provider calls;
- secret/token changes;
- destructive project mutation;
- arbitrary external URL navigation.
Badging API — small but useful
Where supported, use app icon badging only for meaningful local state, e.g.:
- pending Capture Inbox items;
- possibly completed long-running local task requiring attention.
Do not badge ordinary autosaves or create notification spam. Clear badge deterministically when the state is handled.
Notifications — conservative admission
Do not request notification permission at startup.
Potential justified cases only after explicit user opt-in:
- a long local export/model download/task completes while app is backgrounded;
- a user-configured writing-session timer completes.
No marketing/push requirement is introduced by this issue. Prefer in-app status when the app is foregrounded.
Edge side panel / compact companion mode
The manifest already declares an Edge side-panel preferred width. Evaluate whether a compact reference/capture companion is genuinely useful:
- notes/research/codex lookup;
- capture inbox;
- character quick reference;
- no full manuscript editing if ergonomics are poor.
Do not contort the entire app to fit 480px merely because the manifest has metadata.
Display-mode-aware UX
Use matchMedia('(display-mode: standalone)') / supported signals to adjust only shell behavior:
- installation help/status;
- external-link behavior;
- title-bar spacing;
- shortcut/launch messaging;
- app-like navigation affordances.
Do not fork business logic by display mode.
Install UX
- contextual install affordance after demonstrated engagement, not immediate nagging;
- explain benefits honestly: offline shell, app window, shortcuts, supported OS integrations;
- hide custom install button when browser cannot provide install prompt;
- never imply installation is required for project safety;
- support users who prefer normal browser tabs.
Tests
Acceptance criteria
Non-goals
- recreating every native OS integration;
- requiring PWA installation;
- notification spam;
- making deep links a privileged command channel;
- forking core app logic by display mode.
Parent
Part of #478 — PWA first-class excellence/hardening.
Product opportunity
The manifest already declares
display: standalone,window-controls-overlayindisplay_override, shortcuts,launch_handler,handle_links, a share target, protocol handler and Edge side-panel metadata. These declarations should become a coherent installed WorldScript experience, not merely manifest decoration.A well-designed installed PWA can combine web deployment with an app-like window, deep links, shortcuts and selective OS integration while retaining instant update/zero-installer advantages.
Capability philosophy
Use progressive enhancement:
Never hide core writing features behind installation.
Window Controls Overlay
Where supported, evaluate integrating WorldScript chrome into the title-bar overlay.
Requirements:
window-controls-overlayonly after runtime feature detection;env(titlebar-area-*)geometry;Potential benefit: more vertical manuscript space and a genuinely app-like shell.
Launch handling / single-window preference
The manifest currently uses
launch_handler.client_mode = navigate-existing.Productize this:
App shortcuts
The manifest already defines shortcuts for Templates, Manuscript, Characters, AI Writer, New Scene and Start Writing Session.
Audit them as product entry points:
Consider whether a small number of higher-value dynamic-ish workflows should replace lower-value shortcuts; manifest shortcuts themselves are static, so avoid pretending they can reflect live project state.
Link handling and protocol handler
handle_links: preferredandweb+worldscriptcan enable deep app entry.Define an allowlisted route grammar for safe intents such as:
Do not allow protocol/deep links to trigger:
Badging API — small but useful
Where supported, use app icon badging only for meaningful local state, e.g.:
Do not badge ordinary autosaves or create notification spam. Clear badge deterministically when the state is handled.
Notifications — conservative admission
Do not request notification permission at startup.
Potential justified cases only after explicit user opt-in:
No marketing/push requirement is introduced by this issue. Prefer in-app status when the app is foregrounded.
Edge side panel / compact companion mode
The manifest already declares an Edge side-panel preferred width. Evaluate whether a compact reference/capture companion is genuinely useful:
Do not contort the entire app to fit 480px merely because the manifest has metadata.
Display-mode-aware UX
Use
matchMedia('(display-mode: standalone)')/ supported signals to adjust only shell behavior:Do not fork business logic by display mode.
Install UX
Tests
Acceptance criteria
Non-goals