Nuxt3 + Prisma + Socket.IO + ConoHaVPS Collaborative scheduling & signage platform replacing physical whiteboards.
| Category | Highlights |
|---|---|
| Realtime | WebSocket (Socket.IO) roombased sync (<1s P95) |
| GoogleSync | Bidirectional with incrementalSync & Webhooks |
| Offline Kiosk | PWA + IndexedDB (24h cache) keeps screens alive without WiFi |
| Multilanguage | ja / en / vi / zhHans / fil / ne / ptBR |
| RBAC | ADMIN / MEMBER / DEVICE roles; OAuth2& MagicLink auth |
| IaC | Terraform (ConoHa provider) onecommand infra spinup |
| CI/CD | GitHubActions Dockerbuild SSH deploy + Watchtower |
flowchart TD
Browser & Kiosk -->|HTTPS/WSS| Nginx_LB
subgraph DockerSwarm / VPS
Nginx_LB --> Nuxt_App_1
Nginx_LB --> Nuxt_App_2
Nuxt_App_1 -- Prisma --> Postgres
Nuxt_App_2 -- Prisma --> Postgres
end
Postgres -- WALObjectStorage
# 1. Clone & install deps $ git clone git@github.com:watchout/wbs.git && cd wbs $ pnpm install # 2. Copy env template & fill credentials $ cp .env.sample .env.local # edit .env.local with your DATABASE_URL, OAuth client info and JWT_SECRET # 3. Start the Socket.IO server $ pnpm dev # 4. Prisma studio (optional) $ pnpm prisma:studio
- Node20
- pnpm
- Docker24 (for Postgres/Redis)
- Terraform1.7 (if provisioning infra)
| Script | What it does |
|---|---|
pnpm dev |
Start Socket.IO server (dev mode) |
pnpm build |
NuxtSSG/SSR build |
pnpm lint |
ESLint + Stylelint + Prettier check |
pnpm test |
Vitest unit tests |
pnpm e2e |
Playwright e2e |
pnpm prisma:migrate |
DB migration (Postgres) |
pnpm prisma:generate |
Generate Prisma client |
pnpm prisma:studio |
GUI DB browser |
# Build & run multiservice stack $ docker compose up --build # Nuxt: http://localhost:3000 # Postgres: localhost:5432 (user/pass in compose)
# 1. Provision VPS + LB + ObjectStorage $ cd infra $ terraform init && terraform apply -auto-approve # 2. Firsttime remote bootstrap (SSH) $ ./scripts/bootstrap_vps.sh # installs docker + watchtower # 3. Build & push image via CI (automated)
Hint: default domains & IPs are output by Terraform (
terraform output).
| Key | Description |
|---|---|
DATABASE_URL |
Postgres connection string |
GOOGLE_CLIENT_ID / GOOGLE_CLIENT_SECRET |
OAuth2 creds |
JWT_SECRET |
32byte secret for session tokens |
APP_BASE_URL |
e.g. https://wbs.example.com (used for Socket.IO CORS) |
See .env.sample for full list.
For a full list of functional requirements, see:
- Unit Vitest (90% line coverage target)
- E2E Playwright on Chrome & AndroidWebView
- Load k6 (
scripts/k6_schedule_sync.js, 200rps for 15min) - Lighthouse PWA score 80
- Fork featurebranch PR (ConventionalCommits)
pnpm lint && pnpm testmust pass- Reviewers: any
@watchout/coremember - Once merged, GitHubActions autodeploys to staging
MIT License