← Khaled Messai

Crescent

2026 · a game engine a model can pilot

I want a world where people can speak a game into existence. You sit down with a model, you talk about the game you want, and the game comes into being. Crescent is the tooling to get there.

01

A tree is a page of text

A tree can be described analytically, and there are good tools that do it. They are native applications, which a model can't get into. So this one is a page of text. Each sheet below was written by a small language model that had read nothing but the tool's README. The tree beside it is grown from that text, here, in your browser. Change a line. Then plant it.

name: wind_bent_coastal_pine
like: pine
siblings: 3
height: [9, 12]
age: old
trunk:
lean: 12
lean_toward: 90
sweep: 0.5
clear: 0.35
crown:
shape: flat
width: 0.8
density: 0.4
gaps: 0.7
branches:
gnarl: 0.4
wind:
from: 270
strength: 0.8
foliage:
kind: needle
leaf_cm: 8
colour: '#2f4a2c'
amount: 1
bark:
texture: pine_plated

Drag a number. Pick a word. Click a line to type.

It will stand on the far shore of the lake, on every page.

Growing…

Wind bent coastal pinePlate I · drag to turn

02

The game speaks JSON

Bandwidth doesn't matter in 2026. So everything the game and its players say to each other is plain JSON, and a new game needs no message format of its own. That means a model can sit down at any Crescent game and play it, one command at a time: look, walk, talk, buy. This is a real session, replayed.

A recorded session, replayed.
task board70.7bartender150alchemist180.3gear vendor180.3you
The tavernat 250, 250

03

So a test can play it

If a model can play the game, it can write the test that plays it. This file is one of about a hundred that run before a change lands. It starts the real game server, joins as a player, walks to the alchemist, buys a potion and checks the gold.

economy-buy.scenariopassed · 2.5 s
  1. # name: economy-buy
  2. # description: Verify buying from vendor deducts gold and adds item
  3. ticks 5;913 ms
  4. log Interact with Alchemist;·
  5. select vendor first type=Alchemist;4 ms
  6. send interact {"targetId": $vendor.id};15 ms
  7. wait shop_data 5000;·
  8. log Shop data received;·
  9. log Move close to vendor before buying;·
  10. send move {"x": $vendor.x, "y": $vendor.y};7 ms
  11. ticks 3;571 ms
  12. log Buy a health potion;·
  13. send buy_item {"vendorId": $vendor.id, "itemType": "HealthPotion"};9 ms
  14. wait gold_update 5000;·
  15. assert last.gold == 30;1 ms
  16. log Economy buy verified — gold deducted from 50 to 30;·
14 steps, 1 assertion, against the real server over a real socket.