A modern Minecraft server status website built with Vite, React, TypeScript, Tailwind, and shadcn-style UI components.
- Vite
- React
- TypeScript
- Tailwind CSS
- shadcn-style component setup
- Docker / Docker Compose
From the project root:
docker compose up --build -dApp URL:
Useful commands:
# Follow logs
docker compose logs -f web
# Stop
docker compose down
# Rebuild after dependency/config changes
docker compose up --build -dServer entries are loaded at runtime from:
public/servers.json
Because it is fetched at runtime (not bundled into the JavaScript), you can edit
this file and simply refresh the browser — no rebuild required. In a deployed
build the same file is served from dist/servers.json, so you can edit it live
on the host as well.
Each server uses this shape:
{
"id": "survival",
"name": "Emerald Survival",
"address": "play.example.net",
"description": "Community-focused survival world.",
"artwork": "crystal"
}id: unique string keyname: display nameaddress: Minecraft server hostname queried for statusdescription: card subtitleartwork: one ofcrystal,neon,sunset
A starter template is available at public/servers.sample.json — copy it to servers.json and replace the addresses with your own:
cp public/servers.sample.json public/servers.jsonBuild the static site:
# In Docker (uses the container's own node_modules)
docker compose run --rm web npm run build
# Or directly, if dependencies are installed on the host
npm run buildThe output lands in dist/. Copy that folder to any static web host.
The build uses a relative base (base: "./" in vite.config.ts) and resolves
servers.json relative to its own bundle URL at runtime. That means the same
dist/ folder works unchanged whether it is served from:
- a domain root —
https://example.com/ - a subpath —
https://example.com/status/ - a different subdomain —
https://mc.example.com/apps/mc/
No rebuild is needed when the URL changes — just drop dist/ wherever it needs to live.
To change the server list on a live deployment, edit dist/servers.json on the
host and refresh the browser — no rebuild required.
Note: this works because the app is a single page with no client-side routing. If client-side routes are added later, the host will also need a rewrite rule that serves
index.htmlfor unknown paths under the app's base.
- The UI fetches status from
https://api.mcsrvstat.us/2/<address>. - Status auto-refreshes every 60 seconds.
- Manual refresh is available via the Refresh Status button.