> For AI agents: the complete documentation index is available at /llms.txt, the full documentation bundle is available at /llms-full.txt.

# Releases

What changed in the engine, newest first. Each date is when the work reached the main branch.

## 8 November 2026

- **Closing the editor asks about unsaved changes.** The window's close button and Cmd+Q used to quit at once and lose what was not saved. They now ask first, as File > Quit does. See [Unsaved changes](/guide/editor/interface.md#unsaved-changes).

## 7 November 2026

- **Web games on SDL3 too.** A game in a browser reads the keyboard, mouse and gamepads through SDL3, as on the desktop.
- **A second graphics device, on SDL GPU.** `--gpu sdl-metal` draws the editor and games through Metal on a Mac, with the same pictures as the default device. It is a preview: the default stays as it is, and GPU timings are not available on it yet. See [Command line](/reference/command-line.md).

## 5 November 2026

- **SDL3 for windows, input and gamepads.** The editor and games on the desktop run on SDL3, with its database of thousands of game controllers, so more gamepads work without setup. Nothing to change in a game: key, button and stick names are the same.
- **Room for big physics scenes.** A project can set how many bodies a Jolt world holds, under Physics in Project Settings, so a game of tens of thousands of bodies no longer loses contacts and lets them fall through each other. See [How many bodies a Jolt world holds](/guide/features/physics-engines.md#how-many-bodies-a-jolt-world-holds).
- **Crowds of animated characters cost less.** Skinned meshes are posed by the GPU, and copies of one character are drawn together: Feature Tour's 48 puppets spend a fifth of the GPU time they did. Web games too. See [Animation](/guide/features/animation.md).
- **Automatic levels of detail.** Every imported model gets up to three simpler versions at import, and a mesh far away is drawn with one whose shape is less than a pixel off. Nothing to set up. See [Level of detail](/guide/features/rendering.md#level-of-detail).
- **Shadows are cached.** Shadow maps keep what did not move and draw again only what did, so a still room's lamps cost little: the Night Market level of Feature Tour spends about a seventh of the shadow time it did. Web games too. See [Shadows](/guide/features/rendering.md#shadows).

## 29 October 2026

- **Exported macOS games are signed.** Each export seals the app, so a changed file is caught, and the game no longer looks damaged to a Mac that downloads it. Pick a Developer ID certificate in **Preferences > Export**, or pass `sign` to `export`, to put your name on it. See [Signing a macOS game](/guide/editor/export.md#signing-a-macos-game).

## 28 October 2026

- **Updating a game to a newer editor** has a page of its own: what the editor changes when it opens an older project, and what to do yourself. An export also warns when the web runtime from `make web` is older than the engine's source. See [Updating a game](/guide/editor/updating.md).
- **New projects can start as Git repositories.** The new project form has **Make it a Git repository**, ticked by default: the project gets `git init`, a `.gitignore` that leaves out what the editor makes again, and a `README.md` with the Cairn name on top and how to open the game. `project.create` takes `"git": true`. See [The project hub](/guide/editor/hub.md#git).
- **A sample copy goes where you say.** **Open a copy** on a sample opens the new project form with the sample's name filled in, so you choose its name, its folder and Git before it is copied.
- **Scenes inside scenes.** Any scene can be placed inside another, many times, and each copy works like an entity. Make a fence, an enemy or a pause menu once as a scene of its own, place it wherever it goes, and change it in its own scene: every copy follows, apart from what a copy changed for itself. Prefabs are these scenes now, and the editor brings old `.cairnprefab` files over. See [Placing scenes](/guide/editor/placing-scenes.md).
- **Open a placed scene from its copy.** The card of a placed copy has Open, and the viewport shows the way back, such as **Main > Coin**.
- **Game UI switch.** The viewport can hide the game's UI while you edit, so a HUD or a menu does not cover the level. See [Viewport](/guide/editor/viewport.md).
- Agents change every copy with one command: `entity.update` with `"file"` changes the placed scene's file without opening it. `scene.place`, `scene.uses` and `entity.save_as_scene` are new, and the `prefab.*` commands still work. See [Commands](/agents/commands.md).
- `Game.Quit()` ends a game from a script: a built game closes, and in the editor play mode stops. See [Quit the game](/scripting/recipes.md#quit-the-game).
- **The name is the logo.** Cairn has no picture logo any more, only its name in a stencil wordmark: in the editor, the hub, the app icon, web games' loading screen and this site.
- **History that says what changed.** Each step names its entity and what changed on it: "Create Coin", "Edit Coin: position, scale", "Edit Coin: added Rigidbody, added Box Collider", "Move Coin under Map". See [Console and history](/guide/editor/console-and-history.md).
- **Colliders you can see while sizing them.** The selected entity's colliders are outlined in the viewport even with the Colliders view off. See [Viewport](/guide/editor/viewport.md).
- **Scripts in the hierarchy.** A row whose entity has a script shows a script icon; click it to open the script. See [Hierarchy](/guide/editor/hierarchy.md).
- **Search in Add component.** The menu opens with a search box: type part of a name and press Enter to add the first match. See [Inspector](/guide/editor/inspector.md).

## 27 October 2026

- **Cairn.app.** The editor installs on macOS as an app in Applications, with the runtime, the CLI, the templates, the samples and the Claude Code skill inside, and needs nothing else to make, play and export games.
- A Claude Code skill, `cairn-game`, ships beside the editor. Copy it into a game's folder and Claude Code builds the game through the open editor: commands, scripts, play-testing and screenshots. It reads this site, where every page is now also plain Markdown, listed in [llms.txt](https://cairn.safi-studio.com/llms.txt). See [Agent overview](/agents/index.md).
- A web game starts on its own once it has downloaded, with no Play button. While it loads, the page shows the CAIRN name, the game's name, one progress bar for the engine and the game, and links to safi-studio.com and the docs. Sound comes on at the player's first click, touch or key press. See [Exporting a game](/guide/editor/export.md).

## 26 October 2026

### Web export

- The runtime compiles to WebAssembly and draws with WebGL2, so a game runs in current Chrome, Edge, Firefox and Safari.
- The Export window and the `export` command take a new platform, **web**. It writes a folder with `index.html`, the runtime and the game's pack, plus a zip that itch.io takes as it is.
- The page shows the game's name and a Play button while the pack downloads, and starts the game on the click so it may play sound. Saves are kept in the browser's storage.
- Zombie Survival and Feature Tour both play in Chrome. Play [Zombie Survival on itch.io](https://abdulkader-safi.itch.io/zombi-survival-web-export-test), or read [the blog post](/blog/zombie-survival-web-export.md) about it.
- See [Exporting a game](/guide/editor/export.md).

### Rendering

- **Frustum culling.** The camera and each shadow view draw only what they can see. A render test checks that culling changes no pixel. See [Rendering](/guide/features/rendering.md).
- **Level of detail.** An LOD component swaps a mesh for a simpler one by distance from the camera, and hides it past a cull distance. Every pass, shadows included, draws the same level.
- **Instancing.** Draws are grouped by mesh and materials, and each group is one instanced call per submesh.

### Loading and speed

- **Background loading.** In a game, images and models are read on worker threads, and turned into GPU resources a few milliseconds at a time each frame.
- **No whole-scene walks every frame.** Audio, UI and physics find their entities by component, so scenes of tens of thousands of entities stop paying for the hierarchy every frame.
- Scenes with many bodies are faster: contact events are built only for entities with scripts, shadow maps cull too, and a game that falls behind catches up less at a time.

### Physics

- **Box3D**, a second physics library beside Jolt. A project picks one in its settings, and can switch both ways at any time. Every physics test runs on both.
- **Ball Pit**, a sample that pours up to 20,000 balls into a box, to time the two against each other.
- See [Physics engines](/guide/features/physics-engines.md).

### This site

- A blog and this releases page.
- The setup and download pages are gone: the engine is closed source.

## 25 October 2026

- **The engine is called Cairn.** It was Safi Studio. The editor opens projects made under the old name and brings them over: new file extensions, and the hidden folder becomes `.cairn`.
- **A redesigned editor.** A new theme with Roboto and Go Mono, an icon set, and new versions of the top bar, viewport, hierarchy, assets panel, inspector, console, history, settings and dialogs.
- The project hub in the new design. See [The project hub](/guide/editor/hub.md).
- **Play in a window.** The arrow after Step plays the open scene in the runtime program, in a window or full screen, unsaved changes included.
- On macOS the window's title bar is merged into the editor's top bar.
- Every page of this site has a search title, a description and a share picture.

## 24 October 2026

### TypeScript scripting

- A project is written in Lua or TypeScript, picked when it is made. The editor compiles TypeScript to Lua with TypeScriptToLua, so the game only ever runs Lua.
- Errors point at the line in the `.ts` file, not the Lua it became.
- The editor compiles when a TypeScript project opens and watches its scripts after that. A build with an error writes nothing, so the game keeps the last Lua that compiled.
- Code editors get completion from `api.d.ts`, written from the same bindings as the Lua reference.
- An exported TypeScript game ships compiled Lua, with no TypeScript and no Node.js inside.
- Opening a project never runs its code: settings that would make the compiler load code are switched off.
- The first-game template and Feature Tour come in TypeScript too, and a new twin-stick shooter sample, Zombie Survival.
- See [TypeScript](/scripting/typescript.md).

## 17 October 2026

- **Feature Tour**, a sample of six levels joined by portals: a garden, a workshop of 252 crates, a night market with 16 lights, a foundry with about 10,000 particles, 48 animated puppets, and an arcade of 400 scripted squares.
- Left on its title screen for six seconds, Feature Tour starts a benchmark: an autopilot walks every level. It is what to run before and after an optimisation.
- An event listener now goes away with its entity.

## 16 October 2026

### Performance stats

- F3 opens a Performance window in the editor, and an overlay over a game run from a project.
- It shows frame times, CPU time per system, GPU time per render pass, and the process's CPU, memory and threads.
- `--stats-log FILE` writes every sample to a CSV file, so two runs can be compared.
- An exported game has no overlay.
- See [Performance](/guide/editor/performance.md).

## 9 October 2026

### Editor

- A history panel: click an entry to undo or redo up to it.
- A material editor in the inspector, and Apply, Revert and Unpack buttons for prefabs.
- A project settings window: name, icon, start scene, input actions, layers, gravity and bus volumes.
- Icons in the viewport for lights, cameras, sounds and particle systems, with lines that show a light's reach or a camera's view when selected.
- A camera preview in the viewport's corner when a camera is selected.
- Zoom, orbit and pan in the viewport. Layers by name.
- Rename, copy and paste entities. Rename, move and delete asset files.
- Drag entities to reorder siblings, and the gizmo moves the whole selection.
- A right-click New menu in the Assets panel, and New Script in the inspector.

### Scripting

- `require` for sharing code between scripts, events between scripts, named colours and debug lines.
- Script fields can point at entities and assets.

### Projects

- New projects start with a sky.
- The tutorial's game is a template.
- Imported meshes are reordered so the GPU draws them with fewer cache misses.
- Prefab files are parsed once, not once per instance, which was most of the cost of placing many.

### This site

- A tutorial that builds a game, a Lua course, an editor tour and key concepts.
- Guides for cameras, lights, rigid bodies, joints, debugging and troubleshooting.

## 8 October 2026

- Entities can be switched off, and everything under them with them.
- Shorter Lua: components are fields of their entity (`entity.Rigidbody`), things read often are properties (`entity.Forward`, `Time.Delta`), and new helpers such as `entity:LookAt` and `camera:ScreenToRay`.
- Completion and hover text in code editors, from definitions the editor writes into each project.

## 7 October 2026

The engine's milestones landed together this day, along with the first editor tools for making projects.

### Editor

- A project hub to make and open projects, with templates: third person and top-down shooter.
- An asset browser with thumbnails. Files open in the program the system uses for them.
- Click to select in the viewport, F to frame the selection from any panel, and assets dropped into the viewport land under the mouse.
- A theme and the engine's own font.

### Scripting and agents

- Lua 5.4 scripting with a generated API reference, play mode and hot reload: save a script while the game runs and the new code is in use at once.
- The agent command interface: everything the editor does is a JSON command. A headless editor, a command server and a CLI. See [Agents](/agents/index.md).
- Screenshots from any point of view, through a command.

### Physics, input and audio

- Physics on Jolt: rigid bodies, colliders, contact and trigger callbacks, shape casts and overlaps.
- A character controller that walks up steps and slopes and pushes things.
- Collision layers, mesh colliders, joints, and a debug view of every collider.
- Input actions mapped to keys, buttons and sticks in the project file.
- Audio with music and effects buses, 3D sound sources and script control.

### Prefabs, scenes and saves

- Prefabs, with overrides, apply and revert.
- Scene switching, additive loading and entities that persist across scenes.
- Saved games and player settings.

### Animation, UI and particles

- Tweens from Lua.
- Skeletons and clips imported from glTF, animator state machines and skinned meshes.
- Particles, in-game UI, fonts and text in the world.

### Export and samples

- Export a project as a standalone game: the runtime and one pack file, with no editor inside.
- Two sample games made only through agent commands: a 3D Tetris and a third-person coin level.

### Rendering

- PBR materials with point and spot lights, and image-based lighting from an HDR sky.
- Cascaded shadow maps for the sun, and shadows for point and spot lights.
- A depth prepass, ground-truth ambient occlusion, bloom and FXAA.

### This site

- The documentation site.

## 6 October 2026

The first day.

- A window and a Vulkan device through nvrhi, logging, a crash handler and unit tests.
- An entity component system, transforms, and scenes saved as YAML.
- A forward renderer, a camera, built-in meshes and screenshots.
- glTF import, materials and textures, and projects.
- Golden-image render tests.
- The editor shell: hierarchy, inspector, undo, gizmos, a fly camera and a grid.
- HDR rendering with ACES tonemapping and exposure.
