尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗A lightweight real-time text bridge between two paired devices. No account and no database.
client/ is a Next.js + TypeScript frontend. server/ is a small Node.js + ws relay. Rooms and their latest text live only in server memory and disappear after the room expires or the server restarts.
Requires Node.js 20+.
npm run install:all
npm run dev
Open http://localhost:3000. The WebSocket server runs on port 8080.
These run in CI (.github/workflows/ci.yml) on every push to main and every pull request:
npm run format:check # Prettier, whole repo (npm run format to fix)
npm --prefix server run typecheck # server source and tests
npm --prefix server test # server integration tests
npm --prefix client run lint # ESLint (Next.js rules)
npm --prefix client run typecheck
npm run build
server/src/realtime.ts: room, relay, rate-limit and heartbeat logic (createRealtimeServer)server/src/index.ts: reads environment variables and starts the serverclient/hooks/useRoomSocket.ts: WebSocket connection, reconnects and room stateclient/hooks/usePeerTransfer.ts: WebRTC negotiation and file transferclient/components/: UI pieces composed by client/app/page.tsxclient/lib/: message types and file helpersCopy .env.example to client/.env.local:
NEXT_PUBLIC_WS_URL=ws://localhost:8080
Production must use a secure wss:// endpoint.
Server environment variables (all optional):
| Variable | Purpose |
|---|---|
ALLOWED_ORIGINS | Comma-separated frontend origins allowed to connect, e.g. https://derashare.vercel.app. Unset allows any origin, which is only appropriate for local development. |
TRUST_PROXY | Set to 1 behind a reverse proxy (Render, Railway) so rate limits use the client IP from x-forwarded-for. |
MAX_ROOMS | Maximum concurrent rooms. Defaults to 10000. |
TURN_URLS | Comma-separated TURN URLs, e.g. turn:turn.example.com:3478,turns:turn.example.com:5349. |
TURN_SECRET | Shared secret for coturn's use-auth-secret mode. Each device gets credentials that expire after 12 hours. |
TURN_USERNAME / TURN_CREDENTIAL | Fixed credentials instead of TURN_SECRET, e.g. from a hosted TURN provider. |
Without TURN, files only transfer when the two devices can reach each other directly. That usually works on the same Wi-Fi and often fails between mobile networks. After 20 seconds without a connection the app says file sharing is unavailable; text keeps working through the server either way.
Deploy client/ to Vercel. Deploy server/ to a persistent Node.js host that supports WebSockets, such as Render or Railway. Set NEXT_PUBLIC_WS_URL on the frontend to the public WebSocket server URL, and set ALLOWED_ORIGINS on the server to the frontend URL.
The server exposes GET /health for host health checks.