74 lines
3.8 KiB
Markdown
74 lines
3.8 KiB
Markdown
# Illusory IOTAM
|
|
|
|
A SaaS platform that lets users run specific Android applications on hosted Docker-Android instances — instead of on their own device. Users get a unique link, install a PWA, and are streamed a live Android session from the cloud.
|
|
|
|
Currently in alpha. Greenfield. Subject to change.
|
|
|
|
---
|
|
|
|
## How It Works
|
|
|
|
1. Admin generates a unique link and assigns it to a user (or a slot).
|
|
2. User opens that link in their browser — served by `apps/front`.
|
|
3. User is shown a loading screen for good UX purposes
|
|
4. User is prompted to install the PWA.
|
|
5. User opens the PWA — they are routed into a live stream of their assigned Android instance.
|
|
6. Admin manages the entire fleet from `apps/main` (the dashboard), which communicates with `apps/orchestrator` running on each VPS to control Docker-Android containers.
|
|
|
|
---
|
|
|
|
## Implementation Checklist
|
|
|
|
### Foundation
|
|
|
|
- [x] Monorepo setup (Turborepo + pnpm)
|
|
- [x] Shared packages: `@pkg/logic`, `@pkg/db`, `@pkg/logger`, `@pkg/result`, `@pkg/keystore`, `@pkg/settings`
|
|
- [x] PostgreSQL with Drizzle ORM
|
|
- [x] Redis (Valkey) via `@pkg/keystore`
|
|
- [x] OpenTelemetry end-to-end (logs, traces, metrics → SigNoz)
|
|
- [x] Auth system (Better Auth — email/password, magic link, 2FA/TOTP, sessions)
|
|
- [x] User management (roles, bans, account operations)
|
|
- [x] Notifications system (priority, archiving, bulk ops)
|
|
- [x] Admin dashboard shell (`apps/main` — SvelteKit)
|
|
- [x] Background task tracking schema (task table)
|
|
|
|
### Device Management (Orchestrator + Admin)
|
|
|
|
- [ ] Device schema — DB model for a device (host VPS, container ID, status, assigned session, etc.)
|
|
- [ ] Device domain in `@pkg/logic` — controller + repository + errors
|
|
- [ ] Orchestrator command interface — secured Hono routes the admin dashboard calls:
|
|
- [ ] `POST /devices/:id/start` — start a Docker-Android container
|
|
- [ ] `POST /devices/:id/stop` — stop a container
|
|
- [ ] `POST /devices/:id/restart` — restart a container
|
|
- [ ] `GET /devices` — list all devices and their current status
|
|
- [ ] `GET /devices/:id` — page to view the device in more detail (info, live stream feed with ws-scrcpy)
|
|
- [ ] Device allocation logic — mark a device as in-use for a user session
|
|
- [ ] Device release logic — free up a device when a session ends
|
|
- [ ] Admin dashboard: Devices page — list fleet, show status, trigger start/stop/restart
|
|
- [ ] Internal API key auth between `apps/main` and `apps/orchestrator`
|
|
|
|
### Link Management (Admin + Front App)
|
|
|
|
- [ ] Link schema — DB model (unique token, expiry, status, linked device ID)
|
|
- [ ] Link domain in `@pkg/logic` — controller + repository + errors
|
|
- [ ] Admin dashboard: Links page — generate links, view detail, configure linked device, revoke, delete
|
|
- [ ] `apps/front`: validate incoming link token on request
|
|
- [ ] `apps/front`: return appropriate error page for invalid/expired/revoked links
|
|
- [ ] Front: keep on checking for link status change, if it gets revoked, we cutoff the connection
|
|
|
|
### PWA & User Session Flow (`apps/front`)
|
|
|
|
- [ ] `apps/front`: serve static PWA shell (HTML + manifest + service worker)
|
|
- [ ] `apps/front`: wait/loading page — just for show with a 3-5s duration
|
|
- [ ] `apps/front`: PWA install prompt flow (beforeinstallprompt handling)
|
|
- [ ] `apps/front`: session binding — tie the PWA launch to the user's allocated device
|
|
- [ ] `apps/front`: route/proxy authenticated PWA requests to the Android instance stream
|
|
|
|
### Android Streaming (scrcpy + ws-scrcpy)
|
|
|
|
- [ ] Docker-Android image setup and validation on VPS
|
|
- [ ] ws-scrcpy WebSocket server running per container, exposed via orchestrator
|
|
- [ ] `apps/front`: scrcpy client embedded in PWA — renders the Android stream in browser
|
|
- [ ] Input forwarding (touch/keyboard events → scrcpy → Android container)
|
|
- [ ] Session timeout + stream teardown on inactivity
|