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:

1

Clone the repo

git clone https://github.com/alaishach/game.chessworld.git
cd game.chessworld
2

Create your branch

Always create a branch named after your game. Never commit directly to main.

git checkout -b game/your-game-name
3

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
4

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.

5

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
6

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.

File naming is enforced. Markdown files must be named exactly 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."
    }
  ]
}
FieldRequiredDescription
titleYesDisplay name of your game
descriptionYesShort description shown on the games listing page (1–2 sentences)
authorYesYour GitHub username — links to your GitHub profile on the game page
versionYesSemantic version. Start at 1.0.0 and increment on each approved update
thumbnailYesPreview image filename relative to your game folder. 16:9 ratio required
entryYesYour game's entry point file (usually index.html)
tagsYesArray of descriptive tags e.g. "strategy", "2-player", "puzzle"
ratingYes"E" (Everyone), "T" (Teen), or "M" (Mature). See Content Ratings
chessRelationNoOne sentence explaining how your game connects to chess
changelogYesArray of version entries. Must have at least one. Each entry requires version, date (YYYY-MM-DD), and notes

Markdown 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 |
Both files are required. The platform supports: headings, bold, italic, inline code, unordered/ordered lists, tables, and horizontal rules.

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' },
  });
};
Scope your routes carefully. Your API routes share a namespace with the rest of the platform. Prefix all route filenames with your game name to avoid conflicts — e.g. 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
Do not hardcode credentials. Store API keys and connection strings in environment variables. Document the variable names your game needs in your 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 mechanic
fixA bug fix
docsDocumentation changes only
styleVisual/CSS changes with no logic change
refactorCode restructure with no behaviour change
choreMaintenance 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.png must be a real screenshot at 16:9 ratio, minimum 800×450px
  • Accurate manifest — the game.json description, 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.

E
Everyone

Suitable for all ages. No violence, no mature themes, no suggestive content. Abstract strategy, puzzles, and most chess variants will fall here.

T
Teen

May contain mild violence, mild language, or themes not suitable for young children. Capture mechanics with graphic feedback, competitive taunting, or dark themes qualify.

M
Mature

Contains content suitable for ages 17+. Strong violence, strong language, or adult themes. M-rated games are accepted but must be clearly labelled and will display a content warning on the game page.

Size Limits

Keep your game folder lean. Large assets slow the platform for everyone.

Total folder 50 MB Hard limit. PRs exceeding this will not be merged.
thumbnail.png 500 KB Compress with Squoosh or similar before committing.
Single asset 5 MB No individual file should exceed 5 MB. Audio and video are discouraged — link externally if needed.
Dependencies Do not commit 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.

Rejected

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.

Rejected

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.

Rejected

Pushing directly to main. All contributions go through a pull request. Direct pushes to main are blocked by branch protection.

Rejected

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.

Warning

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.

Warning

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.

Review turnaround is typically within a week. If your PR has been open for more than two weeks with no response, ping in the GitHub discussion.

Updating Your Game

After your game is live, updates follow the same process: branch, change, PR. A few additional rules apply:

  • Increment the version field in game.json following semver — patch for bug fixes, minor for new features
  • Add a new entry to the changelog array 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
These APIs are only available in .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.