From 0962529d4865415ac91046d338b374be521fe5a2 Mon Sep 17 00:00:00 2001 From: Mohamed Boudra Date: Sat, 23 May 2026 12:17:51 +0800 Subject: [PATCH] Make the web app installable (#1144) * feat(app): make web app installable * fix: restore CI for import and shortcut tests --- docs/development.md | 14 +++++++++ packages/app/public/apple-touch-icon.png | Bin 0 -> 8394 bytes packages/app/public/index.html | 6 ++++ packages/app/public/manifest.json | 27 ++++++++++++++++++ packages/app/public/pwa-icon-192.png | Bin 0 -> 9214 bytes packages/app/public/pwa-icon-512.png | Bin 0 -> 33314 bytes packages/app/src/components/ui/shortcut.tsx | 2 +- .../src/server/agent/import-sessions.test.ts | 2 ++ .../src/server/session.workspaces.test.ts | 3 ++ 9 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 packages/app/public/apple-touch-icon.png create mode 100644 packages/app/public/manifest.json create mode 100644 packages/app/public/pwa-icon-192.png create mode 100644 packages/app/public/pwa-icon-512.png diff --git a/docs/development.md b/docs/development.md index 861dbe782..cf4cb2f42 100644 --- a/docs/development.md +++ b/docs/development.md @@ -187,6 +187,20 @@ Point Playwright MCP at the running Expo web target. Under `npm run dev` (macOS/ Do NOT use browser history (back/forward). Always navigate by clicking UI elements or using `browser_navigate` with the full URL — the app uses client-side routing and browser history breaks state. +## App web deploys + +`packages/app` exports a single-page Expo web app and deploys the `dist/` +directory to Cloudflare Pages with `npm run deploy:web --workspace=@getpaseo/app`. + +PWA install metadata lives in `packages/app/public/manifest.json` and is linked +from `packages/app/public/index.html`. Keep the install icons in `public/` so +Cloudflare serves them from stable root URLs after `expo export`. + +Do not add service-worker caching casually. Paseo is a live control surface for +agents, and an aggressive service worker can strand installed users on stale web +code. If offline behavior becomes a product requirement, add it deliberately +with an update strategy and test the installed-app upgrade path. + ## Expo troubleshooting ```bash diff --git a/packages/app/public/apple-touch-icon.png b/packages/app/public/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1f9b10425f6a1fa88d8a1a52c4da2dc1bd73df0f GIT binary patch literal 8394 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 + + + + + + %WEB_TITLE%