DOCS
Everything you need to build and submit a game to CHESSWORLD.GAMES.
Overview
CHESSWORLD.GAMES is a browser-based game platform built by the Zenith chess engine team. It exists as both a creative outlet and an entry point for new contributors — if you want to join the team, building a game here is your first step.
The platform is intentionally modular. You build your game in an isolated directory, use whatever technology stack you prefer, and submit it for review. You never need to touch the core website code.
The Challenge
Before joining the Zenith team, every developer completes one challenge:
Create your own mini game. Not a clone. Not a tutorial project. Your game. Your rules. Your idea.
Your game must:
- Have a clear set of rules
- Be playable (even if simple)
- Demonstrate your approach to logic and structure
- Be related to chess in some way
There are no restrictions on genre, complexity, or language/framework — as long as it runs in a browser and integrates with the platform structure described below.
We're not judging polish. We're looking for clarity of thought, code structure, documentation practices, problem-solving approach, and creativity.
Adding a Game
Adding your game requires zero modifications to the core site. Here is the full process:
Clone the repo
git clone https://github.com/alaishach/game.chessworld.git
cd game.chessworld Create your branch
Always create a branch named after your game. Never commit directly to main.
git checkout -b game/your-game-name Create your game folder
All game files live inside /games/your-game-name/. The folder name must match your branch name exactly.
mkdir games/your-game-name Add your required files
Your folder must include: game.json, description.md, rules.md, thumbnail.png, and README.md. PRs missing any of these will be sent back.
Test locally
Temporarily add your game folder name to games.registry.json and run the dev server. Do not commit this change. Revert it before pushing.
npm install
npm run dev Open a Pull Request
Push your branch and open a PR on GitHub. A maintainer will review your code. If approved, it gets merged to main and added to the registry when it goes live.
File Structure
Your game folder is entirely self-contained. Files marked required must be present for your PR to be accepted.
games/
└── your-game-name/
├── game.json ← platform manifest (required)
├── description.md ← shown above the game iframe (required)
├── rules.md ← shown below the game iframe (required)
├── thumbnail.png ← 16:9 preview screenshot (required)
├── README.md ← dev notes for reviewers (required)
├── index.html ← your game entry point
├── src/
│ ├── main.js
│ └── style.css
└── assets/ If you use a build step, include build instructions in your README.md and commit the built output. Your final output must be servable as static files.
description.md and rules.md. Any other filename will be ignored.game.json Manifest
Every game requires a game.json file. This is how the platform discovers, displays, and validates your game.
{
"title": "Your Game Title",
"description": "A short 1-2 sentence description for the games listing page.",
"author": "your-github-username",
"version": "1.0.0",
"thumbnail": "thumbnail.png",
"entry": "index.html",
"tags": ["strategy", "singleplayer"],
"rating": "E",
"chessRelation": "One sentence on how your game connects to chess.",
"changelog": [
{
"version": "1.0.0",
"date": "2026-04-01",
"notes": "Initial release."
}
]
} titleYesDisplay name of your gamedescriptionYesShort description shown on the games listing page (1–2 sentences)authorYesYour GitHub username — links to your GitHub profile on the game pageversionYesSemantic version. Start at 1.0.0 and increment on each approved updatethumbnailYesPreview image filename relative to your game folder. 16:9 ratio requiredentryYesYour game's entry point file (usually index.html)tagsYesArray of descriptive tags e.g. "strategy", "2-player", "puzzle"chessRelationNoOne sentence explaining how your game connects to chesschangelogYesArray of version entries. Must have at least one. Each entry requires version, date (YYYY-MM-DD), and notesMarkdown Files
Two markdown files are required in every game folder. They are parsed by the platform and rendered automatically on your game's page.
description.md — rendered above the iframe
# Your Game Title
A paragraph describing what your game is and why it's worth playing.
You can use multiple paragraphs, **bold**, *italics*, and inline `code`. rules.md — rendered below the iframe
## Rules
- Rule one
- Rule two
- Rule three
## Controls
| Action | How |
|--------|-----|
| Select | Click a piece |
| Move | Click a valid square |
| Restart| Click the Restart button | API Routes
Because the platform runs on Astro SSR, your game can include server-side API routes. Place them inside your game folder under an api/ subdirectory and they will be mounted automatically.
games/your-game-name/
└── api/
└── score.ts API routes must export a handler function using Astro's standard endpoint format:
import type { APIRoute } from 'astro';
export const POST: APIRoute = async ({ request }) => {
const body = await request.json();
// your logic here
return new Response(JSON.stringify({ ok: true }), {
headers: { 'Content-Type': 'application/json' },
});
}; your-game-name-score.ts, not just score.ts.Database Options
Games that need to persist data (leaderboards, saved states, etc.) are responsible for their own storage. The platform does not provide a shared database.
Recommended options that work well on Netlify edge/functions:
- Upstash Redis — serverless Redis, free tier available, ideal for leaderboards and counters
- PlanetScale / Turso — serverless MySQL/SQLite, good for relational data
- Supabase — Postgres with a generous free tier and a simple REST API
- localStorage — for single-player games where data only needs to persist per browser
README.md. The platform maintainer will add them to Netlify before your game goes live.Commit Standards
All commits must follow the Conventional Commits format. PRs with non-conforming commit histories will be asked to rebase before merge.
type(scope): short description
# Examples
feat(pawn-push): add difficulty selector
fix(pawn-push): correct pawn promotion logic
docs(pawn-push): update rules.md controls table
style(pawn-push): adjust board colour contrast
refactor(pawn-push): extract move validation to helper
chore(pawn-push): update game.json version to 1.1.0 featA new feature or mechanicfixA bug fixdocsDocumentation changes onlystyleVisual/CSS changes with no logic changerefactorCode restructure with no behaviour changechoreMaintenance tasks (version bumps, asset updates)The scope should always be your game folder name. Keep the subject line under 72 characters and written in the imperative mood ("add", "fix", "update" — not "added" or "fixes").
Quality Standards
There is no minimum complexity requirement, but every submission is reviewed against these criteria before merge:
- Playable end-to-end — the game must have a clear start, a win/lose/end condition, and a way to restart
- No console errors — open the browser console during a full playthrough; it must be clean
- Mobile-usable — the game does not need to be mobile-first, but it must not be broken on a phone screen
- Accessible thumbnail — the
thumbnail.pngmust be a real screenshot at 16:9 ratio, minimum 800×450px - Accurate manifest — the
game.jsondescription, rating, and tags must accurately reflect the actual game - Readable code — reviewers will read your source. Variable names, structure, and comments should make intent clear
Content Ratings
Every game must declare a content rating in game.json. Be honest — mislabelled ratings are grounds for immediate removal.
Size Limits
Keep your game folder lean. Large assets slow the platform for everyone.
node_modules/. Bundle your JS and commit the output. If you use a CDN, link it — don't copy the source into your folder. What Not To Do
These are the most common reasons PRs get rejected or games get removed.
Modifying files outside your game folder. You own /games/your-game-name/ and nothing else. Changes to src/, public/, config files, or any other game's folder will cause your PR to be closed immediately.
Committing changes to games.registry.json. The registry is managed by the maintainer. If your PR includes a registry change, it will be reverted before merge.
Pushing directly to main. All contributions go through a pull request. Direct pushes to main are blocked by branch protection.
Submitting a clone or tutorial project. Ports of existing games, Chess.com clones, and tutorial-following projects will not be accepted. The challenge requires original work.
Missing required files. PRs missing game.json, description.md, rules.md, thumbnail.png, or README.md will be sent back with a checklist comment rather than closed outright.
Non-conventional commits. PRs with messy commit histories will be asked to rebase and squash before merge. See Commit Standards.
Submission
When your game is ready, push your branch and open a pull request against main on GitHub.
git push origin game/your-game-name In your PR description, include:
- A brief description of what your game is and how it works
- A note on how it connects to chess
- Any environment variables the platform maintainer needs to set
- Any known issues or limitations
A maintainer will review your PR. Feedback will be left as review comments. Address each comment and push new commits — do not force-push during review as it makes it hard to track changes.
Updating Your Game
After your game is live, updates follow the same process: branch, change, PR. A few additional rules apply:
- Increment the
versionfield ingame.jsonfollowing semver — patch for bug fixes, minor for new features - Add a new entry to the
changelogarray describing what changed - Do not change your game's folder name — it is part of the public URL and changing it would break existing links
Breaking changes — anything that resets player progress or significantly alters the rules — should be noted prominently in the changelog entry and in your PR description.
Game Removal
Games can be removed in two ways:
- Voluntary: Open a PR that removes your game folder and sets a note in the PR description. The maintainer will handle the registry update.
- Involuntary: Games that violate content standards, contain malicious code, or have been abandoned and broken for more than 90 days may be removed by the maintainer without notice.
If your game is removed involuntarily, you will be notified via a GitHub issue on your PR with the reason.
SSR APIs
The platform exposes a small set of server-side utilities available to all games via import. These are provided by the platform and should not be reimplemented in your game folder.
Reading the game registry
import { getRegistry } from '@/lib/registry';
const games = await getRegistry();
// returns: string[] of registered game folder names Reading a game manifest
import { getManifest } from '@/lib/registry';
const manifest = await getManifest('pawn-push');
// returns: parsed game.json object, or null if not found Reading markdown content
import { getGameContent } from '@/lib/content';
const description = await getGameContent('pawn-push', 'description');
const rules = await getGameContent('pawn-push', 'rules');
// returns: rendered HTML string from the markdown file .astro files and server-side .ts endpoint files. They cannot be called from client-side scripts. If you need game data on the client, fetch it from one of your own API routes.