Skip to main content

game.json metadata reference

game.json is an optional file at the top level of a game's folder. It describes the game: its name, its text, its controls, its category and a few technical settings. The file is read by the platform and is never served to players.

Ground rules​

  • Every field is optional. A game with no game.json at all can still be published; the platform then fills in what it can from the game's page. See If a field is left out.
  • Unknown fields are errors. A field name the platform does not recognise is rejected with a message naming it, so a typing mistake never passes silently.
  • Wrong values are errors. A value of the wrong type, or outside its limits, is rejected with a message naming the field.
  • The file must be valid JSON.
  • Text is plain text. Text fields are shown exactly as written. HTML and Markdown in them are not interpreted. Spaces at the start and end are trimmed before lengths are checked.

Field reference​

FieldTypeRequiredLimitsMeaning
slugstringNo2 to 60 characters; see Slug rulesThe game's permanent identifier. It forms the page address and the name of the subdomain the game is served from.
titlestringNo1 to 80 charactersThe game's name, shown everywhere the game appears.
taglinestringNoUp to 120 charactersOne line shown under the title, on the front page, in the release history and in search results.
descriptionstringNoUp to 1,200 charactersA few sentences shown on the game's page and on the front page. Also used for search-engine and link-preview descriptions.
instructionsstringNoUp to 2,000 charactersThe "How to play" paragraph on the game's page.
controlsarray of objectsNoUp to 16 entries; see Controls entriesThe list shown in the "Controls" panel, grouped by input.
categorystringNoOne of the fifteen category identifiersThe game's single category.
tagsarray of stringsNoUp to 12 tags; each 1 to 24 characters, made of lowercase letters, digits and hyphens, and starting with a letter or digitShort labels shown on the game's page. Each links to the list of games with that tag, and search matches them.
developerstringNoUp to 80 charactersThe credit shown on the game's page as "Made by".
releaseDatestringNoA real calendar date written YYYY-MM-DDThe day the game is to be released, in the site's time zone. Each day holds one game.
draftbooleanNotrue or falsetrue holds the game back as a draft even though it passes validation.
entrystringNoUp to 240 characters; must name a file in the folderThe entry HTML file, for when it cannot be detected.
themeColorstringNo# followed by six hexadecimal digits, such as #101820A colour associated with the game. It is stored with the game; the public pages currently take their colours from the game's category, not from this value.
orientationstringNoany, landscape or portraitThe screen shape the game is made for.
inputsarray of stringsNoUp to 4 entries; each one of keyboard, mouse, touch, gamepadThe kinds of input the game supports, shown as "Plays with".
aspectRatiostringNoTwo numbers of one or two digits separated by a colon, such as 16:9The shape of the player frame on the game's page.
permissionsobjectNoSee PermissionsAbilities the game needs inside its sandbox.
noteworthybooleanNotrue or falsetrue marks the game as an editor's pick.

Tags are trimmed and converted to lower case before they are checked, so Pixel-Art is stored as pixel-art.

Three of these fields are editorial: releaseDate, draft and noteworthy. Release days and editor's picks are decided by the One Game a Day team, so a developer would normally leave them out.

Controls entries​

Each entry in controls is an object with three fields, all required:

FieldTypeLimitsMeaning
inputstringOne of keyboard, mouse, touch, gamepadWhich group the control is listed under.
keysstring1 to 60 charactersThe key, button or gesture, for example Arrow keys or Tap.
actionstring1 to 80 charactersWhat it does, for example Move.

On the game's page the entries are grouped in the order keyboard, mouse, touch, gamepad. Within a group they keep the order of the file.

Permissions​

Every field of permissions is optional. An unknown field inside it is an error.

FieldTypeLimitsMeaning
networkarray of stringsUp to 12 entries; each an https origin with no path, such as https://api.example.comOther websites the game may load from and connect to.
pointerLockbooleanAllows the game to capture the mouse pointer.
modalsbooleanAllows alert, confirm and prompt dialogs.
formsbooleanAllows form submission.
downloadsbooleanAllows the game to offer a file download, such as a save file.
popupsbooleanAllows the game to open links in a new tab.

Write network origins without a trailing slash. Sandbox and permissions explains what each permission unlocks and which are granted automatically.

Category identifiers​

IdentifierShown as
actionAction
adventureAdventure
arcadeArcade
puzzlePuzzle
strategyStrategy
simulationSimulation
sandboxSandbox
rhythmRhythm
shooterShooter
platformerPlatformer
racingRacing
sportsSports
rpgRPG
cardCard & Board
casualCasual

Slug rules​

A slug must:

  • Be 2 to 60 characters long.
  • Use only lowercase letters a to z and digits 0 to 9, in groups separated by single hyphens. It cannot begin or end with a hyphen, and cannot contain two hyphens in a row.
  • Not be one of the reserved words: admin, api, games, game, g, play, releases, category, categories, search, favorites, library, about, privacy, media, assets, static, new, index, sitemap, robots, www, mail, docs, status, cdn.

Choose the slug with care. It is the game's identity on the platform. A different slug is a different game, with a different address and separate saved data for players.

If a field is left out​

FieldWhat the platform uses instead
slugThe folder's name, lower-cased, with every run of other characters turned into a hyphen.
titleThe text of the page's title tag, up to the first dash, bar, colon or middle dot that has a space on each side. If the page has no title, the slug.
taglineThe rest of the page's title after that separator. Otherwise empty.
descriptionThe page's description meta tag, or its og:description tag, with a leading repeat of the title removed. Otherwise empty.
instructionsEmpty. The game's page has no "How to play" section.
controlsNone. The game's page has no "Controls" panel.
categoryA guess from words in the page's title and description. If nothing matches, arcade.
tagsA guess from words in the page's title and description, at most eight. Possibly none.
developerEmpty. The game's page has no "Made by" line.
releaseDateNothing is scheduled by the file. The team assigns a day.
draftfalse.
entryThe entry file is detected; see Game package format.
themeColorThe page's theme-color meta tag, if it is a #rrggbb value. Otherwise none.
orientationlandscape if the entry page asks the browser to lock landscape or tells the player to rotate their device; portrait if it asks to lock portrait; otherwise any.
inputsDetected from the event handling in the entry page.
aspectRatio16:9.
permissionsNo network origins. pointerLock, forms and downloads are switched on if the entry page uses them. modals and popups stay off.
noteworthyfalse.

Automatic detection reads the entry HTML file only. A game whose code lives in separate script files should state inputs, orientation and any permissions it needs explicitly.

Guesses are a fallback, not a substitute. A game presents best when its game.json gives at least title, tagline, description, instructions, controls, category, tags and inputs.

How the fields are used​

  • Orientation. A landscape game shows "Best on: Wide screens (landscape)" on its page, asks phone players holding the device upright to turn it, and requests a landscape lock in full screen. A portrait game shows "Best on: Tall screens (portrait)" and nothing more.
  • Aspect ratio. The player frame takes this shape on the game's page, limited by the height of the window. In full screen and in the full-window phone view the frame fills the available space whatever the ratio, so a game must still cope with other shapes.
  • Inputs. The first three are also shown as chips beside the game when it is featured on the front page.

A real example​

This is the metadata supplied with the launch game Void Drifter:

{
"slug": "void-drifter",
"title": "Void Drifter",
"tagline": "The Last Survivor",
"description": "A space roguelite about staying alive one more minute. Pilot the last ship through waves of hostile drones, harvest glowing crystals to evolve your hull mid-run, and dash through the gaps the swarm leaves behind. Every run reshapes your build.",
"instructions": "Keep moving, keep collecting. Crystals dropped by destroyed enemies evolve your ship — pick upgrades that fit how you fly. Dash is your escape: save it for when the swarm closes in. Losing focus pauses combat, and auto-aim can be switched on in Settings for keyboard-only play.",
"category": "shooter",
"tags": ["roguelite", "space", "survival", "single-player", "offline"],
"controls": [
{ "input": "keyboard", "keys": "W A S D / Arrow keys", "action": "Move" },
{ "input": "mouse", "keys": "Move the pointer", "action": "Aim (firing is automatic)" },
{ "input": "keyboard", "keys": "Space", "action": "Dash" },
{ "input": "touch", "keys": "Left joystick", "action": "Move" },
{ "input": "touch", "keys": "DASH button", "action": "Dash" }
],
"inputs": ["keyboard", "mouse", "touch"],
"releaseDate": "2026-10-08"
}

An example with every field​

This invented example uses every field the schema accepts, each with a valid value. Most games need far fewer.

{
"slug": "lantern-run",
"title": "Lantern Run",
"tagline": "Keep the light alive",
"description": "A side-scrolling platformer about carrying one lantern through a cave that is slowly going dark. Jump between ledges, relight the braziers and reach the surface before the flame goes out.",
"instructions": "Run and jump to the right. Touch a brazier to relight your lantern and set a checkpoint. If the flame goes out you return to the last brazier you lit.",
"controls": [
{ "input": "keyboard", "keys": "Arrow keys", "action": "Run" },
{ "input": "keyboard", "keys": "Space", "action": "Jump" },
{ "input": "touch", "keys": "Left and right buttons", "action": "Run" },
{ "input": "touch", "keys": "Tap the right side", "action": "Jump" },
{ "input": "gamepad", "keys": "Left stick, A button", "action": "Run and jump" }
],
"category": "platformer",
"tags": ["pixel-art", "single-player", "offline"],
"developer": "Example Studio",
"releaseDate": "2026-11-03",
"draft": false,
"entry": "index.html",
"themeColor": "#101820",
"orientation": "landscape",
"inputs": ["keyboard", "touch", "gamepad"],
"aspectRatio": "16:9",
"permissions": {
"network": ["https://api.example.com"],
"pointerLock": false,
"modals": false,
"forms": false,
"downloads": false,
"popups": false
},
"noteworthy": false
}

Later changes​

The details in game.json are applied when a game is imported. If the team afterwards edits a game's details on the site, those edits are kept: a later game.json no longer overwrites them. See Publishing workflow.