Monorepo skeleton for the phase 1 personal sync project.
apps/server: backend serviceapps/web: web-first app for PC and H5, also reused by Electron rendererapps/desktop: Electron shell, preload bridge, desktop-only runtime wiringpackages/shared: shared domain typespackages/api-contracts: HTTP and WebSocket contractspackages/client-sdk: shared client access layerpackages/platform: shared runtime bridge abstraction for Web and Electronpackages/ui: shared UI primitivespackages/config: shared TypeScript config referencespnpm installpnpm dev:serverpnpm dev:webpackages/api-contractsapps/server/prismapackages/client-sdk over HTTP/WebSocket and isolate desktop-only abilities behind packages/platformBuild the integrated image:
docker build -t personal-sync .
Run it with the server env file and a mounted storage directory:
docker run --rm \
-p 3000:3000 \
--env-file .env \
-v "$(pwd)/apps/server/runtime-storage:/workspace/apps/server/runtime-storage" \
personal-sync
The container serves both frontend and backend on the same port:
/api and /ws go to the server.Local development stays unchanged: run pnpm dev:server and pnpm dev:web, and Vite will continue proxying /api and /ws to the local server.