- Nuxt v4 (
app/directory — all source underapp/) - Tailwind CSS v4 (no
tailwind.config.js;@import "tailwindcss"in CSS) - shadcn-vue (New York style, neutral base, CSS variables, dark theme)
- Solar icons via
@nuxt/icon(<Icon name="solar:..." />) - crossws — WebSocket signaling built into Nuxt/Nitro (h3
defineWebSocketHandler) - Bun (lockfile:
bun.lock) - TypeScript, Composition API with
<script setup lang="ts">
| Command | Script |
|---|---|
| Dev server | bun run dev → nuxt dev — 0.0.0.0:3000 |
| Build | bun run build → nuxt build |
| Preview | bun run preview |
| Typecheck | npx nuxt typecheck (no script in package.json) |
No tests, no linting, no formatter.
server/routes/ws.ts— WebSocket signaling handler (crossws via h3)app/— all application codepages/index.vue— single-page app orchestrating the full session flowcomponents/— auto-imported by Nuxt +ui/subdir for shadcncomposables/—useSession,useSignaling,useWebRTC,useFileTransferlayouts/default.vue— wrapper onlylib/utils.ts—cn()helperassets/css/main.css— Tailwind v4 + Diringo custom theme tokens
ecosystem.config.js— PM2 config for VPS deployment
@/→app/@/components/ui/→app/components/ui/@/lib/→app/lib/
- Frontend-only prototype — no backend, no database, no auth. All data is ephemeral (in-memory sessions).
- WebSocket signaling lives in
server/routes/ws.tsusingdefineWebSocketHandlerfrom h3. Session state is in-memory (Map<string, Session>). - Session codes are 6-char alphanumeric, generated server-side.
- WebRTC uses Google STUN + metered.ca free TURN (configured via
NUXT_PUBLIC_TURN_*env vars). - File transfer uses 64KB chunks over
RTCDataChannel. No server-side file storage. - Auto-imports active — Nuxt auto-imports components under
app/components/and composables underapp/composables/. - shadcn components live in
app/components/ui/<name>/with barrelindex.ts+.vuefile. Add vianpx shadcn-vue@latest add <name>. - MCP servers:
shadcnVue(local) andnuxt(remote) — configured inopencode.json. - Dark theme default — CSS variables in
main.css,.darkclass variant via@custom-variant. - PM2 is used for production deployment (
pm2.config.js). Behind Nginx/Caddy reverse proxy for SSL. - Env vars:
NUXT_PUBLIC_TURN_USERNAME,NUXT_PUBLIC_TURN_CREDENTIALfor TURN relay credentials.
- All transfers should be streamed, not buffered in browser memory.