尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
A single social + gaming + apps platform
rmhstudios.com is one large, high-performance web platform: a social feed
(RMHarks), ~20 browser games (several multiplayer/3D), a suite of full apps, a
blog/news/library system, a coin economy with Stripe memberships, and a scoped
developer API — served by a React SSR tier with Node realtime hubs and a Go
worker fleet behind it. It features a dynamic, animated UI (7 themes + accent
presets, 32 locales) alongside real-time multiplayer.檢視完整 README ↗A single social + gaming + apps platform
rmhstudios.com is one large, high-performance web platform: a social feed (RMHarks), ~20 browser games (several multiplayer/3D), a suite of full apps, a blog/news/library system, a coin economy with Stripe memberships, and a scoped developer API — served by a React SSR tier with Node realtime hubs and a Go worker fleet behind it. It features a dynamic, animated UI (7 themes + accent presets, 32 locales) alongside real-time multiplayer.
/secret/ games), plus Temple of Joy, Neon Driftway, House Always Wins, Laundry Sort, Cookgame, Versecraft, and more/api/v1), documented at docs.rmhstudios.com with an OpenAPI 3.1 spec at /api/v1/openapi.json.liquid-glass is the default theme).howler/tone for audio and @react-three/fiber / @react-three/rapier for 3D physics.go-services/) — built with Bazel (+ gazelle)Production is a hybrid runtime (Docker Compose on a VPS behind
Apache/Cloudflare). Node runs the web SSR tier, every user-facing realtime
hub, and three background workers; Go runs the background-worker supervisor,
the status dashboard, and the asset streamer. All container ports bind to
127.0.0.1; Apache is the only front door. See
docs/architecture.md for the full picture.
Node services (server/)
| Service | Port | Role |
|---|---|---|
web (Nitro SSR) | 7005 (blue/green spare 7015) | React SSR app + API routes |
socket | 7001 | Games realtime hub (Socket.IO); also hosts RMHMusic |
rmhbox | 7676 | Party-game lobby hub (Socket.IO) |
rmhtube | 7003 | Watch-together hub (Socket.IO) |
ladder-worker | — | RMHLadder job-discovery cron (node-cron) |
homes-worker | — | RMHHomes listings-scraper cron (node-cron) |
jobs | — | Durable async backbone (pg-boss): progression, event reminders, weekly digest |
Go services (go-services/)
| Service | Port | Role |
|---|---|---|
supervisor | 9090 (metrics) | Runs six background workers as goroutines: discord-bot, recap, doctrine-worker, vibe-worker, bot-worker, streak-saver |
status | 7008 | Standalone health dashboard (/, /api/status); survives outages |
assets | 7007 | Range-aware S3/R2 streaming for /library /music /models /sprites |
The earlier full-Go realtime topology (a
gatewayfronting Gogamehub/rmhbox/rmhtube/rmhmusichubs with a Redis backplane, plus its Helm/k3s charts) was removed in the rewrite — it never served production traffic and duplicated the Node hubs. Recover it from git history (tagpre-rewrite-go-realtime) if it is ever revived.
Build & test the Go fleet (from the repo root):
make gazelle # regenerate Bazel BUILD files after adding Go files
make test # bazel test //go-services/... (+ vitest)
make build # bazel build //go-services/cmd/...
In production the Go binaries are compiled by the root Dockerfile's
go-builder stage (plain go build ./cmd/...) into the rmhstudios-app-full
image — Bazel is the CI unit-test gate, not the production build. docker-compose.yml
runs everything from two images built off that one Dockerfile (rmhstudios-app
slim for the Node services, rmhstudios-app-full for the Go services +
Chromium/git). MinIO provides the S3-compatible bucket the assets service
streams from locally.
├── app/ # TanStack Start routes (file-based routing)
│ ├── routes/ # All page and API routes
│ │ ├── _site/ # Public site routes (home, news, blog, profiles, etc.)
│ │ ├── api/ # Server API routes
│ │ ├── rmhbox/ # RMHBox minigame routes
│ │ ├── altair/ # Altair game routes
│ │ └── ... # Other game/app routes
│ └── globals.css # Global styles and theme definitions
├── components/ # React components organized by feature (~860 files)
├── lib/ # Utility functions, schemas, and shared logic (~950 files; *.server.ts = server-only)
├── server/ # Node service tier (Nitro plugins, WebSocket hubs, cron/async workers)
├── go-services/ # Go worker fleet: supervisor + status + assets (Bazel + gazelle)
├── stores/ # Zustand state management
├── hooks/ # Custom React hooks
├── prisma/ # Database schema (234 models) and migrations
├── data/ # Static JSON (RMHBox content packs, library metadata)
├── scripts/ # Utility scripts (seeding, i18n pipeline, OG/icon gen, ladder/news pipelines)
├── public/ # Static assets (images, sprites, music)
├── deploy/ # Apache vhosts, blue/green hotswap, Postgres/backups, Terraform DNS, runbooks
├── testing/ # Vitest test files
├── docker-compose.yml # Container topology (Node + Go services + Redis + MinIO)
└── deploy.sh # Deployment script (blue/green web hotswap)
pnpm (required).Create a .env file in the root of the project. See .env.example for all available variables. Minimum required:
# Database Configuration
DATABASE_URL=postgresql://postgres:password@localhost:5432/rmhstudios
# Better Auth Configuration
BETTER_AUTH_SECRET=generate_a_secure_random_string
BETTER_AUTH_URL=http://localhost:7005/
# Socket Server
VITE_SOCKET_URL=http://localhost:7001
SOCKET_CORS_ORIGIN=http://localhost:7005
Clone the repository and install dependencies:
git clone https://github.com/stickms/rmhstudios.com.git
cd rmhstudios.com
pnpm install
Setup the database:
pnpm run db:push
Run the development server (runs Vite plus the socket/rmhbox/rmhtube hubs and the ladder/homes/jobs workers concurrently):
pnpm dev
Open http://localhost:7005 in your browser.
The application is deployed to a VPS with Docker Compose behind
Apache/Cloudflare. The web container deploys blue/green with a health-gated
port flip (deploy/hotswap-web.sh). Full pipeline details:
docs/architecture.md.
To create a production build:
pnpm build
This compiles the Vite/Nitro app, builds the globe's WebAssembly assets through the Vite plugin, and bundles the WebSocket servers via esbuild. The pinned npm compiler also works on the ARM64 deployment runner; no native SDK is needed.
Deployment:
Pushing to main triggers .github/workflows/deploy.yml, which builds
the two images on a native ARM64 runner, pushes them to GHCR, then POSTs
an HMAC-signed request to the VPS webhook receiver (webhook-server.cjs).
That runs ./deploy.sh production <sha>, which pulls those images →
prisma migrate → compose up → blue/green web hotswap. deploy.sh can
also be run manually on the VPS. See
deploy/README.md for setup.
WebAssembly activation requires the updated Apache CSP to be installed and
reloaded once on the host. deploy.sh warns if the permission is missing;
the globe uses JavaScript until it is applied. Follow the
WebAssembly deployment instructions.
CLAUDE.md (or AGENTS.md) — repo-wide conventions, plus per-directory guides in app/, components/, lib/, server/, and go-services/.docs/README.md — reference docs, runbooks, design docs, and known-stale docs.design.md — what the design is and why (start here) · docs/design-language.md — the build contract: tokens, primitives, definition of done · Page consistency: docs/page-consistency.md · Runtime & deploy: docs/architecture.md