Changelog
Notes for 0.6.0.
Series
0.6
Highlights
- Water and terrain: oceans, lakes, rivers and sculptable terrain, plus procedural trees and grass (first versions, still improving).
- A Profiler tab, a Presentation view (F11) and Play controls users of other editors expect: speed, Eject (F8) and Simulate.
- Camera shots and blends: argus run --shots plays a shot list, so recordings get cinematic moves with no script.
- More export targets: Linux packages (tarball, AppImage), web builds, and early macOS, iOS and Android output.
- Agents can drive the editor without being locked out of Play, capture and the UI tools.
Migration
No breaking changes.
Known
- The installer and engine are not code-signed yet, so Windows SmartScreen warns on first run: choose More info, then Run anyway.
- Exported games that use your own shaders or screen effects are refused at export with a clear message; they still work in the editor. A fix is coming in the next release.
- Beaches and waterfalls are first versions and look rough up close.
Sections
added
- {"area":"editor","text":"An editor started from a shell with --agent-owned (or the AGENT_OWNED variable set to 1) never counts as a person being present, so agents are not locked out of Play, capture and the UI tools."}
- {"area":"editor","text":"Help > Report a bug opens the same review step as the launcher and sends only when you press Send; Help > Request a feature opens the roadmap page."}
- {"area":"editor","text":"Play has the controls users of other editors expect: a speed menu (0.1x to 4x) and Eject (F8) over the viewport, Simulate (Alt+S) in the Play menu, and a status line that says Paused, the speed or Ejected. While ejected you can fly a free camera, click live entities, and move one for the rest of the Play."}
- {"area":"editor","text":"The editor has a Presentation view (View > Presentation view, F11): the viewport fills the window with a slow orbit or a chosen camera, plus a clock and a live agent-activity feed, so you can watch a game being built."}
- {"area":"editor","text":"A new Profiler tab in the bottom drawer (Window > Profiler) shows what the running game is bound by: a frame-time strip (a hitch towers over ordinary frames, drawn against the 16.7 ms budget line) with clickable spikes, a timeline of the selected frame (phases, each script behaviour, GPU passes when recorded) and a flame graph, with Capture now, a before/after Compare against a saved capture, and a Spikes chip on the status bar. Play now records its input under
.argus/profileso a capture can be replayed against an edited project."} - {"area":"editor","text":"Opening a shader in the Content Browser shows a code panel with syntax colours, sliders and pickers made from its header, red underlines with the fix hint, a cost meter, and a live preview (sphere, cube, plane, capsule or the selected entity's mesh, with a time scrubber), and a shader saved from the panel or changed on disk shows up in the viewport without a restart; a shader material opens the same controls."}
- {"area":"editor","text":"Asset generation is now a project setting, off by default: Project Settings has an Asset generation section (concept images and the 3D model generator, each an Enabled checkbox and a provider), project.settings.get/set edit /assets/generation/* and /assets/concept/*, and the asset library refuses to generate in a project that has not opted in. The Content Browser has a Generate button that stays disabled, saying why, while generation is off for the project."}
- {"area":"editor","text":"The Content Browser's Generate panel: prompt and class, reuse-first search, concept drafts with change-only edits and approval, the 3D model with its gate verdict per profile, import into the project, cost confirmation before every paid step, progress with Cancel, retry with feedback and pending approvals."}
- {"area":"editor","text":"Library tab in the bottom drawer: search the asset library by text, class and the project's style, see provenance, gate verdicts and every score, rate an asset, import it for free, or start the Generate panel from what you typed. The Generate panel shows the round and running cost of concept edits (no cap), prices a step before it runs when the project does not ask first, and reads the library's structured refusals."}
- {"area":"editor","text":"On an HD project, the shader panel's live preview and the agent's shader preview now draw with HD, shader measure reports how HD draws a shader (passes, pipelines, ray-traced hits, what is not drawn yet), and editing a shader while an HD scene runs updates it in place, keeping the last good version when an edit fails."}
- {"area":"engine","text":"The engine now has an Android app shell: a GameActivity library that runs a game from an APK, keeps its saves and logs in the app's private storage, and pauses and resumes when the app goes to the background. The export tooling can build a debug APK and a Play bundle with 16 KB page alignment and Vulkan 1.1 required."}
- {"area":"engine","text":"Exporting a project with --target macos writes a Mac .app folder (engine, game files, Info.plist and icon) and --target ios writes the Xcode project inputs; both still need a Mac to sign, build and ship, so neither is a finished app yet."}
- {"area":"engine","text":"Three or more copies of one sound looping in the centre at once (say every car's engine) are warned about once as audio-loops-stacked, naming the behaviour; a sound played with at: an entity that has no physics body is now placed on it instead of playing centred."}
- {"area":"engine","text":"Scenes can turn on an optional bloom glow for bright areas in the standard renderer with meta.render.bloom; it is off unless asked for."}
- {"area":"engine","text":"Cameras can show or hide layers, take a priority, draw to the screen, an overlay or a viewport, blend in over a set time, and carry a camera rig."}
- {"area":"engine","text":"Scenes can declare camera shots (holds, paths, orbits and follow shots with cuts and blends), and argus run --shots plays a shot list, so recordings get cinematic camera moves with no script."}
- {"area":"engine","text":"Car paint, wheel and tyre materials: material files take flakeColor, flakeDensity, flakeSize, flakeSparkle, clearcoatOrangePeel, clearcoatOrangePeelScale, flipColor, flipStrength, anisotropyPattern and anisotropyAxis, and the carPaint preset is upgraded and joined by wheelAluminium, wheelGlossBlack and tyreRubber."}
- {"area":"engine","text":"New engine deploy web <folder> checks an exported web folder against its manifest, writes the cache headers and the Cloudflare upload configuration, and prints the command that uploads it. It never uploads anything itself."}
- {"area":"engine","text":"A Linux export can also write a ready-to-distribute tarball (export --package tar) with the game, a desktop menu entry, icons and licence notices, and an AppImage (--package appimage) when appimagetool is installed. The AppImage is reported as not built, with its folder left behind, when the tool is missing."}
- {"area":"engine","text":"Exporting a game can now run your own signing command on the game's engine and on the finished executable (export --sign-cmd), so Windows builds can be code-signed. The export checks the signed file still starts and reads back, and fails with a clear message if the command fails."}
- {"area":"engine","text":"The export report now lists the image bytes an export carries by GPU format (for example BC7, ASTC 4x4, PNG), including the textures inside GLB models, and the CLI prints a textures line when the export has any."}
- {"area":"engine","text":"A virtual-geometry mesh can carry its own low-triangle ray-tracing proxy, so ray-traced shadows, reflections and global illumination hit a light trunk-and-crown shape instead of millions of leaf triangles."}
- {"area":"engine","text":"HD leaves and grass lit from behind now pass light in their own colour when a thin material takes its base colour's hue (new diffuse transmission tint), and a thin_foliage preset sets up a two-sided back-lit leaf."}
- {"area":"engine","text":"Virtual-geometry meshes can carry per-vertex wind weights (glTF COLOR_1: stem, branch, twig, phase), so trunks, branches and twigs sway separately; set the new virtualGeometry.wind.branch to use them."}
- {"area":"engine","text":"HD materials gain car-paint layers: metallic flakes that fade to an averaged tint instead of shimmering, a clear-coat orange-peel normal, a two-tone colour that shifts toward grazing angles, and radial or circular brushing for machined wheel faces. Set them with the flat extras.surface keys (flakeColor, flakeDensity, flakeSize, flakeSparkle, clearcoatOrangePeel, clearcoatOrangePeelScale, flipColor, flipStrength, anisotropyPattern, anisotropyAxis); they look the same in raster, virtual geometry and ray-traced reflections, and a scene that sets none draws exactly as before."}
- {"area":"engine","text":"HD scenes can now scale their ray-traced indirect light: a global multiplier in the environment, a per-light multiplier, and giVolume boxes that fade the bounce light in or out as the camera walks into a room (or only inside the box), like the usual editor's Indirect Lighting Intensity and post-process volumes; at their defaults nothing changes."}
- {"area":"engine","text":"HD can draw GPU ground cover: grass, wildflowers and mats generated every frame from a density raster and a seed, with wind, a level-of-detail fade, back-lit leaf shading, a dark carpet under the grass and an upscaler reactive mark; a frame without it is unchanged."}
- {"area":"engine","text":"Distant-tree impostors can now be baked at 96 pixels per view (any multiple of 16, not only powers of two), a sharper look than 64 pixels at about a fifth of the memory of 128 (8 by 8 views at 96 pixels is about 236 MB for 25 trees)."}
- {"area":"engine","text":"HD rendering can drive a VR headset: both eyes are drawn in one pass, and per-eye GPU time is reported. Experimental, behind the
hdfeature."} - {"area":"engine","text":"Rivers from a terrain's waterways component are now drawn in the high-detail renderer: clear water that takes its colour from depth, mirrors the sky and the valley, ripples that run downstream at the river's own speed, foam at rapids and where streams join, and a soft edge at the banks. A scene without rivers pays nothing for them, and the quality tier thins the river mesh at the lower settings."}
- {"area":"engine","text":"A terrain with rivers and lakes now makes real water: add a waterways component to the terrain entity and bodies with buoyancy float in its lakes and are carried downstream by its rivers, following the terrain when it moves or is reloaded."}
- {"area":"engine","text":"A scene_capture example renders a scene's real terrain with plants, ground cover, fixed cameras, a fixed exposure and a held wind clock through the HD renderer."}
- {"area":"engine","text":"The HD scene capture tool can draw ground cover, hold a fixed exposure and pin the wind clock for still captures."}
- {"area":"engine","text":"Ray-traced reflections and GI now shade terrain with its real layers (the same blend the camera sees), and a terrain preset can turn virtual geometry off without losing the cell seams or the ray-traced terrain."}
- {"area":"engine","text":"Underwater now has soft, broken light shafts and drifting motes, and a camera at the waterline sees the sky, clouds and a wave-following water line with a thin meniscus above the water."}
- {"area":"engine","text":"HD VR rendering can draw each eye foveated: a sharp central window and a coarser periphery, blended smoothly. Experimental, off by default, behind the
hdfeature; a 25 degree window saves roughly a fifth of the GPU time per frame on the reference scenes."} - {"area":"engine","text":"A scene can now have lakes: a
watercomponent on an entity is a box or ellipse of water at the entity's height, flat or with small waves of its own. It is drawn, floating bodies float on it, and where water overlaps the highest level wins."} - {"area":"engine","text":"At the Ultra graphics preset the sea and lakes now reflect scene objects through ray tracing: user-shader, terrain and foliage objects, including ones off screen, appear in the water shaded as they are on land. New quality setting
water.rtReflections(Ultra on, the other presets off; it needs ray tracing and its reflections on). With it off nothing changes. The open sea also costs a little less while the camera is in the air."} - {"area":"engine","text":"A scene's sea can now have a shore:
meta.environment.ocean.bathymetrynames a 16-bit height picture of the ground under the water, andshoretunes the surf, run-up, wet sand, caustics and foam. Floating bodies feel the same shoaled waves the picture shows."} - {"area":"engine","text":"A rough sea now throws spray: droplets and a thin mist come off breaking crests and drift downwind. It appears from about Beaufort 7 and can be scaled or switched off with the sea's
look.spray. Spray is a quality knob,water.spray(optional, default false): on at Ultra only, off at Low, Medium and High. Off, the sea throws none whateverlook.spraysays."} - {"area":"engine","text":"A scene's sea can be painted:
meta.environment.ocean.waveMaskis a greyscale picture over a rectangle that calms a harbour or roughens a patch of sea. The waves, foam and floating bodies all follow it."} - {"area":"engine","text":"HD draws waterfalls: a streaky falling sheet, foam and outflow at the plunge pool, and mist that follows the waterways mist setting and the mist quality knob."}
- {"area":"engine","text":"At the Ultra graphics preset, swaying trees near the camera now cast ray-traced shadows, reflections and light bounces from their exact wind-bent shape. New quality setting
rayTracing.windDeform(Ultra on, the other presets off, at no cost when off, where the trees keep the cheaper stem-sway approximation). Also fixes a crash in very dense forests when the deformed-tree data outgrew the GPU's buffer binding limit."} - {"area":"engine","text":"The standard renderer can now draw with 2x, 8x and 16x multisampling where the GPU supports it, and thin cut-out edges such as fences and foliage are anti-aliased too. Headset views now default to 8x when the standard renderer draws them (falling back to 4x where 8x is unsupported)."}
- {"area":"engine","text":"argus run --save-replay records a session's input in a small file; --replay re-renders it later at any size and from another camera, with the same trajectory, for after-action review and trailers."}
- {"area":"engine","text":"Vehicles gain a
kartpreset (a light, quick, high-grip arcade vehicle) and an optionaldriftblock: hold the handbrake input while steering and the rear grip drops, a yaw assist holds a slide angle that steering and counter-steering adjust, and releasing pays a boost by how long the drift lasted. Games readctx.vehicle.drifting,driftAngle,driftCharge,driftTierandboosting. Vehicles without adriftblock drive exactly as before. (API since 0.6.0)"} - {"area":"engine","text":"Layers: a project can name its layers and say which ones ignore each other, and any entity can take a
layer(a child inherits its parent's). Prefabs can override the layer per instance."} - {"area":"engine","text":"Collision layers are enforced at run time: layers that ignore each other neither collide nor fire triggers, children inherit their parent's layer, casts take an optional layers list, and an undeclared layer name is reported once."}
- {"area":"engine","text":"A model-view element now draws its model: up to four per screen, each at most 512 pixels on its longest side, lit and framed from the model's size, turning with simulation time so the same tick gives the same pixels. The picture is drawn on the GPU into the UI atlas, only when something changed, and costs nothing on screens without one."}
- {"area":"engine","text":"A UI screen can now show a 3D model with a model-view element, for example a model-view with an asset path and a spin speed, sized like any other box. This is the first part of render-to-texture UI: authoring, validation and the request that the renderer fills."}
- {"area":"engine","text":"A particles component can name a material file with a shader, so particle sprites draw with a glow, a dissolve or any additive or blended surface; the shader reads the particle's age, random number and colour."}
- {"area":"engine","text":"A scene can run full-screen effect shaders (outline, posterize, vignette and the like, written as kind: post shader files) before or after the tonemap in the standard renderer; none by default."}
- {"area":"engine","text":"The F3 stats overlay in the game window gains two rows: what the last frames are bound by with the top finding, and a strip of the last 48 frame costs."}
- {"area":"engine","text":"The engine now keeps an always-on flight recorder: a fixed 8 MiB ring of the last few seconds of timed spans (each sim phase, each script behaviour call, the render stages) on one clock. It allocates nothing after start and can be turned off with
ARGUS_PROFILE=off; exported games built without default features do not carry it."} - {"area":"engine","text":"The flight recorder now has a GPU track. Both renderers time their passes with GPU timestamps (the standard renderer: shadows, opaque, sky, particles, tonemap, anti-aliasing, overlay, text, UI) and each finished frame lands on its own frame in a capture and in the Perfetto export, placed on the CPU clock by a windowed estimate whose error bound is printed on the track's name and stored in the capture header (
gpu_align). GPU timing runs every frame while its own CPU cost stays under 50 microseconds and drops to one frame in four (gpu_sampled: 1/4) when it does not; a software adapter (lavapipe) starts at one frame in four because timestamps slow a software renderer down. On an adapter without timestamp queries the passes are simply not timed, and the F3 overlay says so."} - {"area":"engine","text":"Set
ARGUS_PROFILE_DIR=<folder>and a frame that is far slower than its neighbours saves the last few seconds there as a.argusprofcapture plus a.trace.jsonyou can open in ui.perfetto.dev.argus profile-trace <capture>converts any saved capture to a trace; the newest 8 captures are kept."} - {"area":"engine","text":"Projects have an export app id (export.appId in the project file): one reverse-DNS id used for the Android application id and the Apple bundle id. Left out, it is derived from the project's application id (dev.studio.my-game becomes dev.studio.my_game). An invalid id is reported by the project rule project-export-app-id (code 41)."}
- {"area":"engine","text":"A project can force the graphics backend with render.backend (\"auto\", \"vulkan\" or \"dx12\" on Windows); a forced backend that cannot start stops the game with a clear error instead of silently using another one, and the WGPU_BACKEND environment variable still overrides it."}
- {"area":"engine","text":"A road component builds a track from a .road.json file: ribbon, kerbs, walls, trimesh colliders and gate triggers, with no terrain needed. The engine ships no track layouts; you write the file."}
- {"area":"engine","text":"A scene can now have a sea (meta.environment.ocean) and bodies that float on it (the buoyancy component). Floating bodies rock on the waves, and a replay of the same scene gives the same result every time. The HD renderer draws the waves; the standard renderer draws a flat blue plane."}
- {"area":"engine","text":"Shader files can say kind raw or kind pass (own entry points, own full-screen or compute pass) when the project sets render.shaders.raw to true; without it they are refused with shader-raw-disabled. docs/SHADERS.md lists what a raw shader gives up."}
- {"area":"engine","text":"Twelve example shader looks (marble, lava, force field, wet stone, rim light, flag wave beside the six originals) in docs/examples/shaders, all within the default cost caps."}
- {"area":"engine","text":"A scene's .material.json with a shader now loads as a shader material in the standard renderer: the file's params and textures are checked against the shader, and its pipelines are built behind the scene load so the first frame already draws it."}
- {"area":"engine","text":"Material files accept shader, params and castShadows, and a shader file (*.shader.wgsl, asset kind shader) has a header that is checked with the line and column of any fault; docs/SHADERS.md has the format."}
- {"area":"engine","text":"Export compiles every shader a project's materials use and packs it with a per-scene pre-warm list, so a shipped game never validates or compiles a shader while playing; a broken shader now stops the export with its error code and line."}
- {"area":"engine","text":"Scenes can now hold a terrain: a recipe of ops (base shape, noise, stamps, pad flattening, shoreline, masks, material rules) that the engine evaluates deterministically into a heightfield, checked by eight new terrain rules, with an opt-in terrain toolset for agents and a heightfield collider shape."}
- {"area":"engine","text":"Terrains can now generate drainage: a stream-power erosion op makes real valleys and ridges, and ops route the water and extract rivers and lakes (with their centrelines, levels and outlines as data) from the ground, deterministically on every machine."}
- {"area":"engine","text":"Navigation can now bake a navmesh straight from a terrain heightfield (opt-in, off unless the terrain feature is built in), tile by tile. Tile builds are faster on open ground, tiles that are fully underwater are skipped, and the walkable slope you declare is now honoured."}
- {"area":"engine","text":"Terrain now collides: characters walk and cars drive across it, tyres take their grip from the surface layer under each wheel, and character sweeps against terrain are much cheaper."}
- {"area":"engine","text":"Games can now be played by touch. A control map can bind a region of the screen as a virtual stick, a look drag, a button or a tap, alongside keys, mouse and gamepad, and menus and other UI respond to a single finger as a pointer. Touch screens on Windows work the same way."}
- {"area":"engine","text":"
argus project migrate --dry-run [--json] <project>reports what upgrading a project to this Talos would change: the schema steps, the fields they move, the rule findings in every scene, prefab and material file, and which files would be rewritten. It writes nothing. Applying an upgrade is not available yet, and the command says so if you leave out--dry-run."} - {"area":"engine","text":"A project's
argus.project.jsoncan now recordsavedWith, the version of Talos that last saved it. The editor writes it from Talos 0.6; Talos 0.5 reads it but never writes it, so 0.5 patches stay interchangeable. Two warnings go with it:project-engine-saved-withfor a value that is not a version, andproject-engine-saved-with-newerwhen a project was saved by a later Talos than the one reading it. A project saved by 0.6 does not open in 0.5."} - {"area":"engine","text":"Surface shaders now draw in the standard renderer: a material can name a shader, its parameters pack into one shared buffer, and a pipeline that is still compiling draws as a plain material of the shader's average colour."}
- {"area":"engine","text":"Behaviours now run in web builds: a scene exported with the web target plays its scripted entities in the browser, using the page's own JavaScript engine. A host whose Content-Security-Policy forbids 'unsafe-eval' still shows the scene, without behaviours."}
- {"area":"engine","text":"Scenes with a third-person character, a follow camera and screens now start in web builds: the character controller, the camera rig and the UI screens work in the browser. The web player does not take keyboard or mouse input yet."}
- {"area":"engine","text":"engine export --target web now writes a static folder you can put on any web host: a page that says so in a browser without WebGPU, the runtime and your scenes' assets, all under content-hash names, the behaviors as JavaScript, and a manifest listing each scene's files. The download (runtime plus the first scene) is held to 8 MB gzipped; over that the export fails and writes nothing."}
- {"area":"engine","text":"Web builds now take keyboard, mouse and gamepad input: the page forwards them to the engine, so the scene's input bindings work in the browser, and a click on the canvas locks the pointer for camera look. Touch works the same way."}
- {"area":"engine","text":"A scene exported for the web can now use textures and meshes: the web runtime takes every file the scene lists, not only the scene and a font."}
- {"area":"engine","text":"A wheel can name the other entities it is drawn with (a tyre and a hub cap beside an empty wheel mount, as a prefab kart has them) in its new visuals list, and they now spin, steer and follow the suspension with it."}
- {"area":"engine","text":"On the HD renderer, a user shader's surface now draws for opaque and cut-out lit and unlit materials, where HD used to draw the flat grey fallback; anything HD still cannot draw from a shader says so once."}
- {"area":"engine","text":"A shader's surface can now set transmission (0 to 1) so thin things like leaves and cloth glow when lit from behind; shaders that do not set it look exactly as before. The shader tools also report whether a shader uses screen derivatives or screen inputs, and what an HD project would downgrade."}
- {"area":"engine","text":"POST /step runs input, whole ticks and an entity read as one request (the events of POST /input, the ticks of POST /time {step}, the entities of GET /entity/{id}), so a client that steps a paused world makes one round trip per step instead of three; it needs both the input and the time capability, and critic.play uses it when the engine has it."}
- {"area":"engine","text":"On the HD renderer, screen effects now draw (before the tonemap on the upscaled image, after it on the finished colour) and a particle emitter with a shader material draws with that shader; a pass at afterOpaque or beforeTonemap is skipped with a warning."}
- {"area":"engine","text":"An exported HD game now draws its own surface shaders (opaque and cut-out, lit and unlit), the same as an exported standard game: the export packs them for HD, and the game builds their pipelines while it loads. A shader HD cannot draw yet (stylized, blended or additive, depth-reading, or one with a vertex function) is refused at export with its name and the reason, and a shader HD draws with a gap, such as ray-traced reflections still seeing its fallback colours, exports with a warning that says which."}
- {"area":"engine","text":"On the HD renderer, user shaders that shade themselves (stylized), blend or add, or read the depth now draw their own surface in HD's forward and transparency passes, lit and shadowed like HD's built-in transparent materials, where HD used to draw the flat grey fallback."}
- {"area":"engine","text":"On the HD renderer, reflections, global illumination and ray-traced shadows now see a custom shader's colours, pattern and cut-out holes (a bake made when the material loads) instead of flat grey."}
- {"area":"agent","text":"New projects tell your AI where the guides are as plain files on Windows and Linux, notes.read returns the exact docsDir, and a team-build playbook (scope floor by genre, sound table, orchestration) ships with the engine's docs."}
- {"area":"agent","text":"A tested
character-selectrecipe shows real 3D models on a select screen: a turntable stage behind the screen, Left and Right to cycle between four distinct models, and the pick kept with the save and used by the next scene."} - {"area":"agent","text":"Tools and scripts can now make plants: a foliage toolset (off until asked for) lists species and templates, writes a plant recipe, cooks it into meshes, draws a contact sheet and reports triangle counts and bounds. Every refusal names the parameter and its allowed range."}
- {"area":"agent","text":"The checker reports layer and camera mistakes: unknown layer names, invalid layer tables, cameras that hide everything, and cameras with the same priority."}
- {"area":"agent","text":"A new recipe, make-your-own-sounds, shows an agent how to synthesise its own sound effects with a small script that needs only Node (blip, whoosh, a seamless engine loop, explosion, jingle) and import them like any asset; an agent whose game needs a sound the starter kit lacks can make its own, or add a kit."}
- {"area":"agent","text":"Play is held by one agent at a time: a second play.start is refused busy naming the holder and since when, and a hold whose holder disconnected or went idle for 10 minutes is recovered by the next caller, so agents no longer need their own lock files."}
- {"area":"agent","text":"A new opt-in
profiletoolset (tools.enable {\"toolsets\": [\"profile\"]}, about 600 tokens, not in the default list) gives an agentprofile.explain,profile.blame,profile.capture(save, list, read, export a Perfetto trace, withredactto hash script and scene names) andprofile.diff."} - {"area":"agent","text":"The opt-in shaders toolset gains shader.measure (static cost, desktop and web caps, variants, pre-warm estimate)."}
- {"area":"agent","text":"The opt-in shaders toolset gains shader.preview (a contact sheet of a material: four turntable angles, three moments, day, backlit and night rigs, or an eight-frame time strip; HD alongside when available) and shader.measure (static cost, desktop and web caps, variants, pre-warm estimate)."}
- {"area":"agent","text":"A shaders toolset (opt-in): shader.write checks a shader and its material and answers errors by line and column, and shader.library lists the models, prelude functions, a GLSL cheat sheet and six examples. Materials that name a shader are now checked against it on scene writes and in builds."}
- {"area":"agent","text":"docs/SHADERS.md is now one guide to the whole shader system (surface, particle and screen-effect shaders, materials, hot reload, tools, export and pre-warm, limits and measured numbers), served to agents as the shaders document; its examples are compiled by a test."}
- {"area":"agent","text":"An agent can now search, generate, gate and import models in the user's saved asset library through a new opt-in library toolset; generation services use only the user's own key, which the user sets themselves and never through the agent."}
- {"area":"agent","text":"An agent with no shell can make sounds: audio.synth (toolset audio) runs the make-your-own-sounds synthesiser on a preset or a voice description and imports the WAV as an audio asset, the same bytes for the same parameters."}
- {"area":"agent","text":"Several agents on one connection can each play at once: every tool takes an optional
agentname, which makes that agent its own actor (its writes, leases and every refusal carry its name, not the lead's) and, for the Play tools, gives it a Play of its own in an editor of its own.play.stopends only the caller's game, a busyplay.startnames every holder, an abandoned Play is reclaimed with its editor, and callers that name nobody behave as before."} - {"area":"api","text":"A scene's atmosphere sky takes a visibilityKm (0.1 to 1000): how far you can see through the air, set from the physical formula for visibility. Smaller values give a hazier, greyer sky and distance; leaving it out keeps the preset's clear air. (API since 0.5.2)"}
- {"area":"api","text":"A scene can now say that a terrain's rivers, waterfalls and lakes are water: a
waterwayscomponent on the terrain entity turns them on, with a look (including four fresh-water types) and per-river overrides. Floating bodies drift downstream in rivers."} - {"area":"api","text":"GET /feel's audio now reports every voice sounding, each sound's plays and overlaps, stacked loops and the mix's estimated level, so a headless run (no speakers) can check its sound; the playtester's audio probe uses it and no longer calls a game silent while music started at load is playing."}
- {"area":"api","text":"
GET /profile/blamesays who paid for a frame: per script behaviour and per entity (with the exact entities and calls behind each), per sim phase, draw group, physics body and contact, asset memory, and each phase of loading the scene.POST /profile/detailturns on the costlier counters (script API calls per behaviour, entities per draw group) for a while."} - {"area":"api","text":"
GET /profile/explainsays what the running game is bound by and lists ranked fixes, each with evidence, a suggested change and an estimated saving that respects the frame model (a CPU fix on a GPU-bound frame saves nothing);GET /profile/diffchecks a fix against a saved capture with a noise band and a verdict per finding."} - {"area":"api","text":"
GET /profile/image?kind=strip|timeline|flame|heatreturns a PNG of the frame-time strip, one frame's timeline, the flame graph, or the viewport with the costliest entities tinted, drawn from the same layout as the editor's Profiler tab; the opt-inprofiletoolset gainsprofile.viewto look at them. The Profiler tab has a Heat toggle that tints entity bounds (and, in the standard renderer, the surfaces) by script time, triangles or contacts while the game runs."} - {"area":"api","text":"New query endpoints read the flight recorder:
GET /profile,/profile/frames(one row per frame, with spike flags, for a frame-time strip),/profile/trace(Chrome trace JSON for ui.perfetto.dev),/profile/capturesand/profile/capture/{id}, plusPOST /profile/captureto save the last few seconds on demand.GET /perfis unchanged."} - {"area":"api","text":"A profiler capture from a run started with
ARGUS_PROFILE_DIR(or--save-replay) now carries a replay recipe, andPOST /profile/rerunreplays that run's recorded input against the project as it is now:GET /profile/diffthen checks a fix like for like, refuses a replay whose entities, bodies or contacts diverged, and reports the spread between runs.argus run --profile-report FILEwrites the counters and flight recorder of a plain run."} - {"area":"api","text":"ctx.render.setMaterialParam(material, name, value): a behaviour changes a param of a shader material for everything wearing it, a buffer write with no compile. (API since 0.5.2)"}
- {"area":"api","text":"ctx.render.setShaderParam(entity, name, value): a behaviour writes a per-entity float of its entity's shader (a dissolve amount, a hit flash) with no new material and no new batch. (API since 0.5.2)"}
- {"area":"api","text":"ctx.world.road(id) reads a road's centre line (position, direction and curvature at any distance, nearest point, polyline) for AI lines, lap progress and minimaps. (API since 0.6.0)"}
- {"area":"api","text":"A playing sound can be steered: ctx.audio.setPitch and setVolume take a handle and glide linearly over rampSeconds, so an engine loop can follow speed. (API since 0.6.0)"}
- {"area":"api","text":"Behaviours can read the project's own data files with ctx.files.readText and ctx.files.readJson (files under data/, at most 1 MiB, read-only); an edit is seen at the next read without a rebuild, and an export packs data/ so the shipped game reads the same files."}
- {"area":"api","text":"ctx.world.road(id) now reports kerbWidth, kerbHeight, barrier and edge(s), the lateral distances of the kerb and the wall, so a game can keep a car inside them; the road object is built once per road, so asking again is cheap, and closest with a hint searches only its window."}
- {"area":"api","text":"A served engine can now be played the way the editor's Play is: POST /input takes key events and an axis held until released, GET /input reports the running scene's action map and where input goes, POST /scene switches the running world to another scene of the project, and the worker can be started to draw only when asked (--render-on-request), with its own save folder, a content root, and a refusal to run unchecked content (--require-checked). Many private sessions run side by side on one machine without sharing a port, a save or an identity."}
- {"area":"launcher","text":"Settings now shows the update channel (Stable, the only one offered for now), and the Engine tab says which channel it is checking. The launcher reads the channel from its settings file, so a second channel can be turned on later without changing the launcher."}
- {"area":"launcher","text":"Each installed Talos version on the Launcher's Engine tab has Documentation and Release notes online buttons that open that version's pages in your browser, with the address shown beside them. The editor's Help menu has Documentation for this version; both stay disabled, with a note, for a release that does not say where its documentation is."}
- {"area":"launcher","text":"The Engine tab now says how many Talos versions are installed and how much disk they use, and shows for each one how many of your projects open with it. \"Remove unused\" lists the versions no project needs, asks, and removes them; the newest version is always kept."}
- {"area":"launcher","text":"The launcher has Request a feature buttons that open the roadmap board."}
- {"area":"launcher","text":"The engine badge on a project card is now a menu: open the project once with any installed Talos version, or change which version the project uses. Choosing an older version than the project was saved with shows a warning first;
argus-hub --set-engine <project> <series>does the same from a script."} - {"area":"launcher","text":"Each update offer and each installed Talos version on the Engine tab now has a \"What's new\" section you can expand to read what changed in that version. The text comes from the signed release information, so an installed version still shows it with no internet connection."}
- {"area":"launcher","text":"Every engine release now carries its changelog Highlights inside the signed release, so the launcher's What's new shows what changed in the version you are about to install, offline too."}
- {"area":"launcher","text":"A project card's engine badge menu now offers \"Upgrade to Talos X.Y…\" when a newer Talos is installed. It asks that engine what an upgrade would change and shows the report, without changing your project. The dialog has a disabled Apply for now; applying, with a backup and a Restore, comes in a later version.
argus-hub --upgrade-report <project> [<series>]shows the same report from a script."} - {"area":"docs","text":"The docs now publish an llms.txt that links a single copy-for-AI text and the plain Markdown of every page, for AI readers."}
- {"area":"docs","text":"The documentation for each version is also available as a separate offline download (talos-docs-VERSION.zip) that opens from a folder with no server, search included."}
- {"area":"docs","text":"A Project codes page lists every diagnostic the project manifest validator can report, with its severity and meaning."}
- {"area":"docs","text":"Each query API endpoint page now shows its request parameters and the field tables of its request and response types, generated from the engine's own types."}
- {"area":"docs","text":"A new guide, \"Finding out why a game is slow\", covers the flight recorder end to end: turning it on and off, spike captures, the editor's Profiler tab, the live F3 rows, every
/profileendpoint with an example, the opt-inprofiletools and the explain, edit, diff-with-replay loop, Perfetto export, and what the profiler cannot measure. The Profiler overhead table in the performance notes is now written by a measuring script instead of by hand, and the Linux gate runs the recorder's start-cost check whenever the machine is quiet enough to mean something."} - {"area":"docs","text":"The Download page reads the release data: it shows the latest stable Talos 0.5 Preview with its size, SHA-256 checksum, the Windows SmartScreen note for the unsigned installer, and that it is free during the preview."}
- {"area":"docs","text":"When the site goes public it serves /llms.txt pointing tools and scripts at the plain-text docs index; while private it stays off."}
- {"area":"docs","text":"The Download page and the docs landing link an offline docs bundle (a zip of the documentation, separate from the engine) with its size and checksum, or show it disabled until it ships."}
changed
- {"area":"editor","text":"The editor and the launcher have a new look: the Inter typeface, a cooler graphite colour scheme with teal as the default accent, roomier 24-point rows (a Compact 20-point option is in Editor Preferences), and softer shadows on menus and windows; the arrow in the import unit picker now draws."}
- {"area":"editor","text":"The editor now draws one set of icons everywhere: the toolbar (Save, Undo and Redo as icons, Import and Export as icon plus word, Play and Stop with their icons), the menus (an icon column, check marks for what is on, shortcuts at the right), the Outliner (a type icon for every entity, folder icons, an eye and a lock), the drawer tabs and the status bar, and the viewport toolbar, whose tools, space, pivot and snaps are icons with tooltips."}
- {"area":"editor","text":"Details, Project Settings and the Import and Export windows are rebuilt from one set of controls: category bands with the raw JSON behind an overflow button, a header block with tag chips, vector fields with coloured axis rails, one segmented control style, bordered fields for every Settings value, and warnings as tinted notices; the main button is filled and Cancel, Revert and Close are quieter, and windows have a title band and a button footer."}
- {"area":"editor","text":"The Play snapshot key moved from F8 to Shift+F8, because F8 now ejects the camera as it does in the usual editor. A keymap file that sets play.snapshot itself keeps its key."}
- {"area":"editor","text":"The Generate panel and the Library tab no longer offer Import on a rejected model and show the gate's fix text under each reject; after a failed gate the panel offers a free Re-check, Use anyway for warnings (confirmed, under your name), Change only on the concept and Retry, each with its cost. The panel opens larger, shows a 3D preview and per-step costs, no longer lists the request in its cost dialog twice, highlights only the approved draft, and Project Settings shows new spend caps at once after Apply."}
- {"area":"engine","text":"A behaviour callback that runs more than a million loop iterations or a million function calls in one call is now stopped and disabled with a clear error, instead of running until the wall-clock cap. The limit is the same in the browser, where no wall-clock cap is possible."}
- {"area":"engine","text":"Setting entity.visible on an entity with no mesh or sprite, and ctx.ui.set on a screen that is not on the stack, now warn once (script-call-inapplicable) and do nothing instead of throwing and disabling the behaviour."}
- {"area":"engine","text":"Exporting a game whose materials name a user shader is now refused, and so is exporting a standard-renderer game whose scenes list screen effects; the message names the material or scene and the shader. A shipped game cannot compile or load either yet and used to skip them or fall back silently. HD exports with screen effects are not affected."}
- {"area":"engine","text":"In HD with ray-traced reflections, a clear-coated metal such as car paint now shows the room in its base layer too, so the paint reads as a deep tinted metal with crisp reflections instead of a flat colour."}
- {"area":"engine","text":"In HD with ray-traced global illumination, surfaces darken more where they meet other geometry (a tyre on the floor, the underside of a car body), so objects no longer look like they hover."}
- {"area":"engine","text":"Fair-weather, clear-sky and broken clouds are now optically thicker by default, so a cloud's own body shades its underside (grey-blue bases and soft volume instead of flat white cotton); overcast and storm decks are unchanged, and a scene's cloud density is still a multiplier of the preset's."}
- {"area":"engine","text":"Swaying plants drawn as ordinary meshes are much cheaper in dense forests. Three new quality settings set how far the sway reaches:
materials.windDistance(plants beyond it stand still and cost nothing extra, the last 10 m fade out so nothing pops),shadows.windDistanceandshadows.windCascades(how far, and in how many sun shadow cascades, swaying plants are redrawn in the shadow; farther ones keep a still shadow). Ultra keeps everything swaying, High sways within 60 m and its shadows within 40 m in the nearest cascade, Medium and Low use still shadows. Still air no longer pays for the sway at all."} - {"area":"engine","text":"Swaying plants cost much less in the sun shadow on mid-range graphics cards. The plants that sway in the shadow are now redrawn a group at a time instead of all together every other frame, so the cost is spread evenly over the frames and a dense forest cannot spike. New quality settings
shadows.windGroups(how many groups; High 4, Ultra 2) andshadows.windBudget(most triangles redrawn per frame, nearest plants first; High 150000, Ultra no limit)."} - {"area":"engine","text":"HD's ray-traced lighting of rooms lit by small lamps is steadier and no longer comes out dark: a bedroom was about 17 percent too dark when it settled and is now within 3 percent, and still views shimmer less."}
- {"area":"engine","text":"Ray-traced GI looks up its light cache without visibility rays at hits on leaves, 5 to 17% cheaper GI passes in leaf close-ups."}
- {"area":"engine","text":"HD global illumination: turning cosine-weighted guiding off (the default) now costs nothing; its shader code is only compiled when the setting is on, which brings the GI gather pass back to its earlier speed in open-world scenes."}
- {"area":"engine","text":"Auto exposure in HD now protects the highlights: a bright window or sunlit wall in a dark room is no longer left tens of stops over white (it darkens the exposure by up to two stops), and the glow around very bright pixels is limited, so a low sun no longer washes the frame to white."}
- {"area":"engine","text":"Lakes cost less: all the lakes of a frame are now drawn in one render pass instead of one pass each (identical picture; about 0.01 ms per extra lake at High and 0.01 at Low), and a lake's bank foam is a thin line where the water meets the shore instead of a wide band over a gentle beach. Lakes look more like lakes: a calm lake has no foam ring (only a faint lap line) and mirrors the sky more sharply, a windy lake piles foam on its downwind shore in patches, and the water at the edge is clear and tints to blue over the first metres so the bed shows through."}
- {"area":"engine","text":"Lakes at High now mirror the mountains and shores around them (before, only Ultra's ray-traced reflections did): the screen-space reflection of a lake looks several kilometres out and no longer gives up on its first step."}
- {"area":"engine","text":"Distant terrain no longer shows the repeating tile of its rock and ground textures as a brick or grid pattern. As one repeat of a terrain material's texture shrinks below about 48 screen pixels it fades toward the material's average colour with a flat surface detail, and is fully faded by about 10 pixels. The slope, height and splat variation is untouched, and reflections and global illumination see the same far colour as the camera. Terrain frames are slightly cheaper (fewer texture reads in the distance)."}
- {"area":"engine","text":"Trees drawn as virtual geometry now stop swaying with distance the way ordinary meshes already did: the sway fades out over the last 10 m before the wind distance setting (
materials.windDistance, High 60 m, Ultra no limit) in the picture, in the sun shadow and in ray-traced shadows and reflections, so a tree's shadow always matches the tree. In the cached sun shadow, trees beyondshadows.windDistanceare cached standing still, and the swaying ones take turns in groups with the same group and triangle-budget settings as ordinary meshes, which makes dense forests much cheaper to shadow."} - {"area":"engine","text":"In VR, ray-traced global illumination now traces its light probes once per frame and both eyes read them, which saves about 0.2 milliseconds of GPU time on the second eye; the image of the first eye is unchanged."}
- {"area":"engine","text":"HD ocean foam now has structure and a life cycle: whitecaps and storm crests are born bright and thick, thin out into a dim lace of bubbles over about ten seconds, drift downwind, and are shaded with bubble relief, crevice shadow and back-scattered sun instead of a flat white."}
- {"area":"engine","text":"HD water draws about 23% faster on a stormy sea and 25% faster with four lakes: the sun-shadow filter is capped, the sea and lake wave passes are shared, and the wave mips are built two levels per dispatch, with no visible change."}
- {"area":"engine","text":"The Low graphics preset now draws lakes as flat water, which keeps scenes with several lakes inside the water's frame budget; Medium and above are unchanged. New quality settings
water.lakeWaves,water.riverLodBiasandwater.mistPercentcontrol it."} - {"area":"engine","text":"Seas below Beaufort force 4 now get a light swell by default, HD water softens steep wave faces to remove thin pale lines, the shallow water colour ramp is shorter, and a storm sea has irregular foam patches with a sparse cold glint trail."}
- {"area":"engine","text":"Underwater looks deeper and bluer: the water glows toward the sun and goes dark navy away from it, the sun shows as a bright disc through the surface from below, and sunlight patterns drift through the water near the glow. The waterline has a soft, bubbly edge, and lakes have a soft rim with bank foam and paler shallows instead of a dithered edge."}
- {"area":"engine","text":"Underwater now looks underwater: the sea floor and everything in the water fade to blue with depth, sunlight ripples (caustics) play on what is under the surface, and looking up you see the sky through a bright circle of the surface. A camera crossing the waterline gets a clean line between air and water."}
- {"area":"engine","text":"A mesh with no collider that nothing moves now collides as a static copy of its shape, so imported models and prefab parts stop cars and players without a hand-added collider. Set
\"collide\": falseon the mesh to keep one pass-through."} - {"area":"engine","text":"The compiled-pipeline cache now lives in a folder named pipelines under the user cache folder, and its override variable is ARGUS_PIPELINE_CACHE (it was hd-pipelines and ARGUS_HD_PIPELINE_CACHE). The first run after updating compiles once more; the old folder can be deleted."}
- {"area":"engine","text":"An exported game no longer contains the profiler's analysis (blame, explain, diff, re-run, the pictures and the F3 profiler rows), only the flight recorder and capture files; the editor and the development engine are unchanged."}
- {"area":"engine","text":"Scenes with thousands of user-shader materials load much faster (materials that look alike share their GPU data, built shader pipelines skip the placeholder bake, the first frame no longer builds pipelines), draw in far fewer GPU calls (draws of one shader share a batched call, and a material that leaves a texture unset shares the texture set of one that sets it), and a driver pipeline cache folder can be chosen with the stress tool's --cache-dir. User-shader additive surfaces (
blend: add) now draw after the alpha-blended ones."} - {"area":"engine","text":"Materials of one shader family whose textures share a size now pack into texture arrays, share one bind group and draw in one call, and a scene with many shader families warns on the web at 64 and refuses at 129."}
- {"area":"engine","text":"The installed SDK is about 9 MB smaller: the script checker is minified and no longer carries the browser (DOM) and web worker typings. The checker now also reports
fetch,windowand other browser globals in a script as \"Cannot find name\", matching what the engine already refuses at load."} - {"area":"engine","text":"On Windows the standard renderer now prefers Vulkan, falling back to DirectX 12."}
- {"area":"engine","text":"A glTF material whose textures use different texture transforms (a finely tiled detail normal beside an untiled colour map, as car paint does) now imports, each texture keeping its own transform in HD, instead of being refused."}
- {"area":"engine","text":"The
vehicle-value-implausiblewarning now allows wheel radii down to 0.1 m (was 0.15 m) and chassis masses down to 80 kg (was 400 kg), so a go-kart no longer warns; larger-than-plausible values still do."} - {"area":"engine","text":"Beaches over a sea now read as a beach: the shallows go pale turquoise over bright sand, each wave's run-up ends in a foam tongue on the sand, and the sand the swash has reached stays darker and glossier while it dries."}
- {"area":"engine","text":"The sea surface pass is about 19 percent cheaper at High (sun shadows on water use fewer filter taps and the wave textures use 8x instead of 16x anisotropic filtering), with no visible change."}
- {"area":"engine","text":"The wave textures' mip levels are built two per GPU dispatch instead of one, which trims the sea and lakes' wave simulation time."}
- {"area":"engine","text":"A scene with lakes spends less GPU time on water: the sea and every lake simulate their waves together instead of one after another."}
- {"area":"engine","text":"Underwater light shafts are cheaper on the Low water tier (one noise per beam, no motes), so an underwater frame stays inside its Low budget."}
- {"area":"engine","text":"A web build's page now shows a progress bar from the first paint and starts downloading the game's own files while the engine is still downloading, so it reaches its first frame sooner on a slow connection. engine deploy web has an optional --precompress for hosts that serve precompressed files."}
- {"area":"engine","text":"A web export now starts the game without its heavy textures: the textures only a material uses are listed apart in the manifest, left out of the startup download and its size gate, and fetched after the first frame. The first frame draws the material's colours, and each texture appears as it arrives, a few milliseconds of work per frame."}
- {"area":"engine","text":"The texture cook now writes the web target's textures as UASTC with rate-distortion optimisation in a Zstandard-compressed KTX2 file, which the page transcodes to BC7 or ASTC at load, so web exports download far fewer texture bytes than the plain 8 bits per pixel ASTC they used before. Mobile and desktop cooks are unchanged."}
- {"area":"engine","text":"Ray-traced GI rays no longer alpha-test tree crowns' proxy slabs: the GI passes are about a third cheaper in leaf close-ups and forests, with no visible change."}
- {"area":"engine","text":"Exporting a project that contains a kind: pass shader now warns that the file is not exported, because nothing in a project runs pass shaders yet"}
- {"area":"agent","text":"behaviour.write accepts a module with no default export as a library: it is type-checked and written, the answer says it is a library, and attaching it to an entity is refused with a clear message."}
- {"area":"agent","text":"The human-present refusal now says since when a person has the editor and how to recover: close it, relaunch it agent-owned, or use editor.start."}
- {"area":"agent","text":"A lease-expired conflict now says which change and actor held the lease, when it began and when it was last active, and a refused scene write names the scene and job it was for."}
- {"area":"agent","text":"Play is leased for 5 minutes while others wait: the first agent in line takes it from a holder still using it once the lease runs out (and gets a fresh game), a busy play.start answers its place in line and when the lease ends, and the old holder's play calls are refused rather than stepping or stopping the new holder's game."}
- {"area":"agent","text":"critic.play on a scene with no goals now warns (play/no-goals) and ends with \"result: nothing tested\" instead of \"passed, goals 0/0\", still not failing the run; its feel probes now drive a vehicle-controlled player through its actions even without goals, and the controls probe waits up to 12 s by default (was 8) for a flyover and countdown to end."}
- {"area":"agent","text":"A named agent's own Play now runs in a headless engine of its own (checked build, no window, drawn only on capture) instead of an editor: twelve agents on one connection each play.start, play.measure, play.capture and play.stop at once at about 150 MB and a fraction of a core each, and nothing is left running afterwards. A worker also finds the engine's default font as the editor's Play does, so a project with text plays outside the engine checkout.
ARGUS_PLAY_BACKEND=editorkeeps the editor backend."} - {"area":"launcher","text":"The installed engine's knowledge pack (what
explainand the AI docs answer from) ships without indentation, 0.3 MB smaller. Answers are unchanged."} - {"area":"launcher","text":"The two deploy engines (standard and HD) now ship inside the install as small deltas from
argus.exe, so the installed engine is about 39 MB smaller. The first export unpacks the engine it needs into your cache folder (a fraction of a second); later exports are unchanged."} - {"area":"launcher","text":"The HD deploy engine is now stored as a small difference from the standard engine, so the installed engine is about 1.5 MB smaller. Nothing else changes: an HD export unpacks both engines into your cache folder the first time, as before."}
- {"area":"launcher","text":"The launcher's Engine tab, update offers, failures and Settings are redone: each installed build says its role and what removing it would do, updates and new engine versions say what they change, and a failed install or check says what happened and offers Try again."}
- {"area":"launcher","text":"The Talos install no longer carries esbuild twice:
bin/esbuild.exe(a byte-identical copy ofsdk/esbuild/esbuild.exe) is gone from the launcher payload and from an MSI built with an SDK, saving 10.6 MB. TypeScript behaviours build exactly as before."} - {"area":"launcher","text":"The install is 14 MB smaller:
argus.exeis now the engine CLI, the agent server and the workspace service in one program (argus agent,argus workspace-service), where they used to be three.argus-agent.exeandargus-workspace-service.exestay inbin\\as small stand-ins, so.mcp.jsonfiles and scripts from older installs keep working without change."} - {"area":"launcher","text":"The install carries the TypeScript compiler once (in the SDK) instead of twice: the engine CLI in
cli/now imports it from thesdk/beside it, saving 3.6 MB. Ifsdk/is missing, the CLI says so and how to repair the install."} - {"area":"launcher","text":"The WAD importer that some samples use now ships compressed in the install (2.8 MB down to about 1 MB) and is unpacked the first time a sample needs it; those samples install as before."}
- {"area":"launcher","text":"The stable channel now only ever offers releases built from a committed tree, and unsigned ones only when that was decided and recorded when the release was uploaded."}
- {"area":"launcher","text":"The engine CLI in an install (
cli/) no longer carries its own copy of the default font and the starter kit (3.2 MB); it reads them from thesdk/beside it, so exports and previews find the same files as before."} - {"area":"launcher","text":"The engine CLI bundle an install carries (
cli/) is minified, 12.3 MB down to 4.8 MB, with the same messages and no slower to start."} - {"area":"docs","text":"The documentation now has its own site root, separate from the main Talos site, so it can move to its own address later without changing the main site; every link on both is relative."}
- {"area":"docs","text":"The .road.json keys are documented in full with their defaults (barrier height, thickness and offset, kerb, gates), and a misspelt key is refused with the nearest real key and the keys that object takes."}
- {"area":"api","text":"POST /capture now lists every missing or wrongly typed field of a bad request body in one answer, instead of one field per attempt."}
fixed
- {"area":"editor","text":"Help > About, bug reports, crash reports and the agent now show the real engine version instead of 0.1.0."}
- {"area":"editor","text":"A material preview sent as material JSON with a shader now draws that shader; it used to draw the plain material and say nothing."}
- {"area":"engine","text":"Capturing the sky environment no longer panics when the graphics card is out of memory or lost; the device error is reported instead."}
- {"area":"engine","text":"Car paint, wheel and tyre materials draw as themselves in an exported game, not as plain PBR: the engine's stock car surface now ships in the pack and the scene's pre-warm list."}
- {"area":"engine","text":"A clear-coated dielectric no longer reflects 4% twice: the base under the coat reflects almost nothing, so coated paint is deeper and less grey."}
- {"area":"engine","text":"The static critic no longer reports a built-in behaviour module (such as audio) as a dangling reference for a project kept outside the engine checkout; the built-in names are read from the engine's own catalogue."}
- {"area":"engine","text":"POST /environment now accepts a sky turbidity of exactly 1.8, the lower limit, instead of refusing it as 1.7999999523162842; a value within a millionth of either limit is stored as the limit, and a value clearly outside (1.79, 10.01) is still refused."}
- {"area":"engine","text":"Exporting on Windows now starts esbuild from its real executable instead of the shell shim that cannot be launched there, and when esbuild cannot be started or fails, the export error says why and which path it tried (and to set ARGUS_ESBUILD) instead of ending after a colon."}
- {"area":"engine","text":"Exporting a project on Windows no longer drops every UI screen without a word: the folder holding the UI package is now found correctly there, an export in which no screen can be described stops with each file and reason instead of finishing with no menus, and a partly refused project reports each left-out screen as a warning in the export report and on the command line."}
- {"area":"engine","text":"In HD with a heavy haze (a high aerosol load), the strip of sky just above the horizon no longer turns saturated yellow; it keeps the colour of the haze around it."}
- {"area":"engine","text":"HD ground cover no longer darkens or recolours the ground it covers: gold and tan ground keeps its colour, low plants and rocks standing on it are left alone, and the covered ground stays within a few percent of its uncovered brightness from low and top-down cameras."}
- {"area":"engine","text":"HD ground cover no longer paints a flat green patch with a hard edge on real terrain: the ground under the grass now keeps its own colour and is tinted toward the grass colour by density, fading to the terrain's colour at the cover distance, and cover is kept off steep ground (rock walls) by a slope limit (maxSlopeDeg, default 40 degrees) applied to the density window."}
- {"area":"engine","text":"HD ground cover no longer shows a fixed dither pattern where it fades with distance or pale bare patches where the meadow is thin: the ground under any cover stays covered, the far fade uses noise that changes every frame for the upscaler to resolve, and the darkening eases to the grass colour with distance."}
- {"area":"engine","text":"HD ground cover no longer turns a pale or vertex-coloured ground nearly black or leaves a lattice with holes on real terrain: the carpet keeps the ground's own colour, moves it toward the meadow colour by a limited amount and never takes more than half its brightness."}
- {"area":"engine","text":"The hero waterfall's pool foam is broken lace that thins outward and streams downstream, and its mist gets a cool-grey tint plus a faint taller plume above the impact zone."}
- {"area":"engine","text":"The hero waterfall's pool foam is a long strip of broken lace running from the foot out along the outflow, so it stays visible from a camera standing in the pool at a grazing angle; the mist spawns across the whole foot line with a taller plume."}
- {"area":"engine","text":"The hero waterfall's pool foam is hard-edged lace sized for a grazing view (cells stretched along the outflow, a finer fleck layer, density falling with distance from the foot), sits 0.2 m over the water so the ripples show through the gaps, and is lit white; the mist is whiter where lit with a denser core at the foot."}
- {"area":"engine","text":"A generated plant's glTF now loads end to end: its wind weights (the _WIND attribute) reach the renderer, and its supplied ray-tracing proxy goes into the acceleration structure in place of a level of the render mesh, so a plant's ray-traced shadows follow the proxy it ships with (including a proxy-only crown material, its alpha-masked slabs, the wind and the tint the file carries)."}
- {"area":"engine","text":"Ray-traced diffuse GI no longer turns tree crowns almost black at High: the back face of a leaf now gets its sky light unless the leaf is enclosed, and ray-traced hits on leaves pass on the sun and sky light that reaches their far side."}
- {"area":"engine","text":"Glossy floors no longer show a grainy white speckle in the reflection of what stands on them (a car over a polished floor): the ray-traced reflection is now filtered over the footprint of its own lobe and kept longer between frames."}
- {"area":"engine","text":"The entity-id and depth pass skips instances outside the view or narrower than 2 pixels, and draws a 400-triangle copy of a raster mesh for its instances under 64 pixels wide, so a valley of mid-size plants costs about 1.2 ms there instead of 2.2 ms. Picking is unchanged for anything wider than a few pixels."}
- {"area":"engine","text":"The entity-id and depth pass no longer draws the full mesh of every virtual-geometry tree: it draws a coarse stand-in of at most 4096 triangles, once per instance range, so a forest of 5000 conifers costs about 1.5 ms there instead of 15 ms. Picking and overlay depth near such a tree follow the coarse shape (the DAG level's simplification error, 1.2 m worst case on a 15 m spruce). Plants that carry an impostor hint now become virtual geometry below the 50000-triangle density threshold too, so far plants use impostors."}
- {"area":"engine","text":"A forest of many different plants no longer runs a 10 GB card out of memory: meshes of one species and size class share one impostor atlas layer (the atlases are capped at 256 MB, a class past it draws without an impostor and says so once), a plant with an impostor hint becomes virtual geometry only from half the density threshold up (25,000 triangles on High; smaller plants stay raster), and the old page pool, pool buffers and atlas arrays are released as they grow instead of piling up until a later poll. On a 60-plant valley the peak GPU use fell from about 9.1 GB to about 5.8 GB."}
- {"area":"engine","text":"HD interiors no longer show bright dots along the seam where a wall meets the ceiling: the sun no longer leaks through closed solids at the seam."}
- {"area":"engine","text":"Lamps shining along a normal-mapped wall no longer draw the normal map's bumps into their shadows as a rippled pattern."}
- {"area":"engine","text":"Glossy surfaces seen in ray-traced reflections no longer reflect the sky when something blocks the way, which removes the white glow a car's underside cast into a glossy floor."}
- {"area":"engine","text":"River foam and flecks are lit by the same softened shadow as the river body, so a hill's shadow edge no longer shows as a straight seam across the river; the hero waterfall's curtain keeps no holes mid-sheet (deep gaps only toward its edges) and its mist is bluer and spread wider across the foot line."}
- {"area":"engine","text":"HD rivers read as teal water with foam only on fast, steep or rough stretches, whatever the discharge: the rapid foam follows speed and Froude number relative to the reach's own typical value (plus a steeper slope ramp, 12 to 40 percent), not an absolute speed, so a 4 m3/s stream and a 100 m3/s river both stay clear where they are calm; the shader caps foam coverage near 0.45; the inner-bend clamp is on now that the centrelines are smooth. A wide waterfall's mist is several smaller puffs spread over the curtain instead of one large disc that sliced the gorge wall."}
- {"area":"engine","text":"River water's soft shadow is cheaper (two probes either side on a 4-tap filter, a 4-tap bed ring) with the same look; the hero waterfall's mist puffs sit in front of the walls with varied sizes (no rectangular edge) and its pool foam apron is wider."}
- {"area":"engine","text":"HD river water no longer shows a navy stretch with a hard step where a hill's shadow ends: the body light and the bed seen through the water are blurred over a few metres and the body colour stops deepening at 1 m. The hero waterfall's curtain now breaks into bright cores and thin translucent gaps (rock shows through), and the mist puffs are spread along the whole foot line and rise higher."}
- {"area":"engine","text":"Fixes isolated dark, sharp-edged blotches on sunlit far terrain (hundreds of metres away) at the High and Ultra graphics presets. They were sun shadows traced from a point slightly below the real ground, because the picture draws distant terrain a little coarser than the ray-traced copy of it; shadow rays now start clear of that difference at any distance."}
- {"area":"engine","text":"Sun shadows of swaying trees in a forest cost about half as much at every graphics preset without ray-traced shadows (a dense forest frame fell from about 8.6 ms to 4 ms at High). The cascades now redraw swaying trees every other frame, taking turns; a held wind or still air redraws nothing, and a camera cut redraws every cascade at once."}
- {"area":"engine","text":"Distant objects no longer go missing in a VR headset: with virtual geometry, an eye whose view is off-centre could hide far objects behind a nearer object that was not actually in front of them."}
- {"area":"engine","text":"Reading player input on an entity that never receives it (a second controller or vehicle) is now reported: the running game warns once per entity, the critic flags it before play, and play.input says which entity got the keys and whether anything reads them."}
- {"area":"engine","text":"An installed engine now finds its default font in its SDK, so a scene with text runs from a project outside any checkout without ARGUS_FONT, as the agent guide says; when no font is found the error names the SDK places it looked in."}
- {"area":"engine","text":"A lake's mirror no longer shows a pale shelf along a cliff base or a grey strip along a grassy bank."}
- {"area":"engine","text":"Lake reflections no longer show scalloped wedges at the bank, and the Ultra tier no longer shows a pale beige band across the near water."}
- {"area":"engine","text":"The water-look basin lake's bank is a soft damp-sand band instead of a jagged near-black outline."}
- {"area":"engine","text":"Lakes no longer show a pale rectangle at the frame edge in their reflection, far lakes read turquoise instead of navy, and the bank under a lake's edge reads wet."}
- {"area":"engine","text":"A lake's far-shore reflection is smoother, the bank gets a faint shallow-water tint and a softer wet rim."}
- {"area":"engine","text":"A lake's mirror of a far shore's foot is soft instead of scalloped, and the cliff base at the waterline no longer shows a pale ledge."}
- {"area":"engine","text":"A lake's wet rim at the bank is a soft rounded band instead of a faceted dark outline."}
- {"area":"engine","text":"macOS builds compile again and draw through Metal; before, a Mac build failed to compile and would have had no graphics backend."}
- {"area":"engine","text":"A macOS export now writes the Mac app's minimum system version from the engine itself, so the app is no longer offered on a Mac too old to start it; the engine can also be built for macOS on Linux, though it has not been run on a Mac yet."}
- {"area":"engine","text":"On macOS the engine renders offscreen (self-tests, captures, exports) through Metal; before, it asked for Vulkan and stopped with \"no Vulkan adapter\"."}
- {"area":"engine","text":"POST /input now refuses an action that asks for frames above 1 but has no held flag (it would have released the action and done nothing), and its 400s for a bad body show a valid example body; the endpoint's shape, and how it differs from the MCP play.input tool, is documented in the query API."}
- {"area":"engine","text":"The F3 stats overlay's third line no longer always reads \"GPU timing unavailable\". It shows the GPU time of the newest finished frame, says \"(1 frame in 4)\" when timing has backed off to keep its own cost small, and gives the reason when the adapter cannot time passes."}
- {"area":"engine","text":"A replay saved from a run that was stopped with SIGTERM or crashed now replays to within two seconds of where it stopped, idle time included."}
- {"area":"engine","text":"A saved replay now plays after the engine is rebuilt or updated within the same version: the scene is identified by its file's content, not by how the engine reads it. An edited scene is still refused."}
- {"area":"engine","text":"An export now packs the .road.json file a road component names, and refuses an export whose road file does not exist, instead of producing a game with no track and no warning."}
- {"area":"engine","text":"A behaviour that runs over its 2 ms time budget now keeps running instead of being switched off after 10 slow frames; the overrun is still reported in the log and to agents, at most every 10 seconds. On a busy machine a race used to stop dead with frozen karts and no HUD."}
- {"area":"engine","text":"Exporting a project now applies its render.shaders settings: raw and pass shaders compile when render.shaders.raw is on, and raised costCapUnits and costCapFetches apply to the shader pack."}
- {"area":"engine","text":"Snapshots keep the exact simulation time, so restoring one resumes on the same tick. Older snapshots still load."}
- {"area":"engine","text":"A vehicle in a prefab spawned while the game runs now finds the wheels it was spawned with, so it drives and its wheels turn, instead of being refused as having no wheels."}
- {"area":"engine","text":"The standard renderer now draws a material's emission: emissive colour times strength is added to the lit colour of pbr, toon and vertex surfaces, so a glowing material no longer needs unlit shading. Materials without emission render exactly as before."}
- {"area":"engine","text":"With ray tracing on, swaying foliage now casts ray-traced shadows, reflections and bounce light in its true swaying shape, not an approximation that only leaned the whole plant; instances beyond a range or a per-frame budget keep the old approximation."}
- {"area":"engine","text":"On a menu in a scene with no player (a title or front-end menu), one tap of an arrow key no longer walks focus to the end of the list: the key release now always reaches the UI, so a held direction steps once, waits 0.4 s, then repeats every 0.12 s and stops when let go, including over a paused world. The bound
uiNavigateaxis (arrow keys on the web and in the editor's Play, the d-pad and the stick past its 0.5 threshold) now drives such a menu too, with the same delay and repeat."} - {"area":"engine","text":"A project made outside the engine checkout now finds the
@argus/uicomponent library on its own, the same way it finds the gameplay build: through the checkout or packed SDK the engine was told about (ARGUS_TOOLCHAIN_ROOT,ARGUS_REPO,ARGUS_SDK) as well as beside the project, the executable and the working directory. Before,critic.playof such a project reported aplay/script-errorforui/screensunlessARGUS_UI_PACKAGEwas set.ARGUS_UI_PACKAGEstill wins, and when nothing is found the error lists every place that was searched."} - {"area":"engine","text":"A beach's shallows now fade from the sand to deep water in one smooth turquoise ramp instead of stepped tone bands, and the damp sand behind the swash is darker and reaches further up the beach."}
- {"area":"engine","text":"Water no longer hitches the first time it is drawn: the sea, lakes, rivers and falls build every pipeline they need when the scene sets them, and the underwater view's pipeline is built in the background as the camera nears the surface."}
- {"area":"engine","text":"Web builds now show a project's menus and screens (the starter course opens on its main menu in the right language), and they can be clicked or tapped; the engine's own messages and a behaviour's log lines appear in the browser console."}
- {"area":"engine","text":"A game on WSL (WSLg) that played no sound now says why and how to fix it: ALSA had no default device because the ALSA-to-PulseAudio plugin is missing (install libasound2-plugins). A window silenced by ARGUS_NO_AUDIO or --no-audio now says so instead of playing silent without a word. The ready line's devices.audio_output is now false when no device opened."}
- {"area":"engine","text":"The benchmark's stats card, title card and trailer badge now take the product name from the brand file, so the card no longer says ARGUS where the product is Talos."}
- {"area":"engine","text":"The benchmark's stack build no longer fails on a fresh clone at the third-party notices step: it downloads every crate the notices read (including optional ones such as accesskit) before that step, which itself stays offline."}
- {"area":"engine","text":"A level too wide for a single-tile navmesh (over about 620 m across at a player's cell size) is no longer rasterised for 17 seconds only to answer \"no walkable polygons\": the engine refuses the build up front, says the navmesh was not built and how wide a level it can build, and a scene load that took 18 seconds on a kilometre-wide ground takes under a second."}
- {"area":"engine","text":"A paused engine answers each command (POST /time, POST /input, GET /snapshot) as it arrives instead of waiting for the next 16.7 ms tick, so a client that steps a paused world (the playtester) is no longer held back about a tick per request."}
- {"area":"engine","text":"A road barrier set away from the road (offsetM) no longer lets a fast car drop into the gap and slip under the wall: the gap is floored over, so the car meets the wall."}
- {"area":"engine","text":"Screen effects (a scene's meta.render.screenEffects) now work in exported games, native and web: the export validates and packs them, and the shipped engine builds them from the pack, so they no longer skip with a log line. An effect's textures are its real files instead of white."}
- {"area":"engine","text":"A game exported for the standard renderer now draws the user shaders its materials name; they were refused (or drew the plain material) because the shipped engine could not read them. The export's shader pack is loaded when the scene loads, with no shader compiled while playing."}
- {"area":"engine","text":"A sky whose sun angle was written in degrees instead of radians no longer draws a black sky with no message: an elevation outside plus or minus pi/2 is refused when the scene is saved or loaded, naming the field and the radian value it looks like, and the renderer clamps it instead of blacking out the dome."}
- {"area":"engine","text":"ui.activate and POST /ui/activate now scroll a node that a scroll container has scrolled out of view back into view and press it, instead of refusing it as ui.activate.clipped; any other clip is still refused and leaves the scroll as it was."}
- {"area":"engine","text":"A screen that writes words on an element that does not draw them, such as <button text=\"Start\" /> or <div text=\"SUBSTATION 9\" />, is now reported as ui-unknown-prop by the screen typecheck and by check-ui, naming the element, the attribute and the form that works (children, or the Button component's text), instead of drawing a blank control."}
- {"area":"engine","text":"A web export of a project whose shader materials name textures now ships those textures before the first frame (they were deferred, so every such material fell back to its plain look), and the web shader warm-up now draws every pipeline once (it drew none before the first frame) and warms the double-sided variants of a shader's materials. A web export also ships a scene's screen-effect shader files (
meta.render.screenEffects) and points the scene at them; before, the page skipped every screen effect with \"not in the payload\"."} - {"area":"engine","text":"A drawn terrain loads in under a second: the standard renderer builds each cell's far colour map across the cores instead of one cell after another (0.55 s of a 1.0 s load for a 64-cell terrain). The scene-load budget now measures a real load (a renderer, the first tick run), because a headless load never draws a terrain."}
- {"area":"engine","text":"Scenes with many UI screens or a drainage terrain load in a fraction of a second again: screens are compiled in parallel, and a terrain whose results are cached reads only its final cells and water data."}
- {"area":"engine","text":"In an HD game, a particle emitter whose material has a shader now draws its sprites with that shader; it used to draw the plain built-in sprite with no warning. Such an emitter is simulated on the CPU (so its particles move as they do on the standard renderer), while every other emitter stays on HD's GPU particles."}
- {"area":"engine","text":"HD scenes with shader materials load faster: only the shader variants the scene draws are built, in parallel, and the ray-traced bakes of its materials run together at the end of the load."}
- {"area":"engine","text":"On HD, scenes with many shader materials draw each material with its own textures and params (several used to show the first material's look), stylized shaders keep their rims and other constant terms, and a shader material lights the same as a built-in material on the same mesh."}
- {"area":"engine","text":"The standard renderer's shadow passes bind each shader-material shadow pipeline once per cascade instead of switching back and forth between them (the stylized stress scene: 15 binds a cascade instead of up to 23)."}
- {"area":"engine","text":"A shader material on an animated character is built while the scene loads, so its first frames draw the shader instead of a flat stand-in."}
- {"area":"engine","text":"Scenes with shader materials use less GPU memory: textures named by several materials upload once, HD keeps no second copy of the textures it draws from its own table, and the standard renderer's texture arrays are sized to what the scene uses."}
- {"area":"engine","text":"Scenes with shader materials on the standard renderer use about half the GPU memory they did: a texture only shader materials use is kept once (in its texture array, not also as its own upload), a mesh they draw is kept once (in the shared draw buffers, not also as its own), and materials that name the builtin black, white or flat texture no longer split their family into a second texture set that copied every other map again (replica-n50: 250 MB to 117 MB)."}
- {"area":"agent","text":"A change set's lease no longer expires while its holder is still editing: every edit extends it, and a write of many objects asks for a longer one, so a slow write on a loaded machine stops failing with lease-expired. A holder that goes quiet still loses it after 30 seconds."}
- {"area":"agent","text":"editor.start works on a headless Linux machine: it falls back to X when the Wayland socket is missing, uses a private display named by the HEADLESS_DISPLAY variable, and otherwise fails at once naming that variable and how to start Xvfb."}
- {"area":"agent","text":"An editor started by the agent server now runs in its own session on Linux and macOS, so ending the MCP server (a disconnect, its process group signalled, a closed terminal) no longer takes the editor and its workspace service down; the next MCP session reattaches to the running editor through the project's control file."}
- {"area":"agent","text":"Exporting for another platform (for example Windows from Linux) without that platform's export tools now stops at once with \"windows export tools missing\" and says where to put them, instead of waiting and then reporting \"no Ready build\"."}
- {"area":"agent","text":"export.compose now finds the export tools beside the installed engine on its own, so toolsDir is optional; it still honours ARGUS_EXPORT_TOOLS_DIR and a toolsDir argument, and when nothing is found it lists every place it looked."}
- {"area":"agent","text":"The critic.play controls probe no longer fails a game that freezes the player for a few seconds at the start, such as a countdown. It waits on simulated time: for the controls-live event when the player's script props declare playtest.controlsLive, otherwise by holding input until the player first moves, and calls the controls dead only after playtest.controlsWaitSec (8 s by default, at most 30), saying how long it waited."}
- {"area":"agent","text":"When no audio provider is configured, a build now writes a short silent WAV file into the project as the placeholder for each requested sound, and says so in the cost ledger, instead of naming a built-in sound the engine does not ship."}
- {"area":"agent","text":"A playtest of a scene that belongs to a project now runs it as that project, so a road's project-relative file is found and the road is built instead of the probe driving on nothing."}
- {"area":"agent","text":"The sound synthesiser script a recipe tells an agent to run now ships in the SDK, and the agent guide gives its real path, so an agent that cannot read argus:// resources no longer has to search the disk for it."}
- {"area":"agent","text":"A behaviour that threw and was disabled is now named in the answers of play.start, play.input, play.step, play.measure and play.stop and in critic.play's verdict, with the entity, module, message, first stack line and frame, instead of only in the editor log. Each error is reported once, in the first play.* answer after it happens."}
- {"area":"agent","text":"The timelapse encoder now takes a plain argus run --record frame folder (order from the file names, clock and feed still work), the renderer prints the engine's last error lines when a snapshot fails to load, and --keep-work output survives the next run."}
- {"area":"agent","text":"audio.synth with no editor or workspace service refuses before synthesising anything and says to start the editor with editor.start; asset.import's no-editor advice names editor.start too."}
- {"area":"agent","text":"A slow call (a measurement, a playthrough, a check, a build that is waited for, a behaviour that is type-checked) no longer holds up the other calls on the same connection: reads such as editor.state, activity and explain.search, and scene edits, are answered while it runs, and several slow calls run at once."}
- {"area":"agent","text":"critic.play reads the whole world for its softlock check once per 30 frames instead of every 6 while it drives a vehicle, which on a scene of a few thousand entities was a third of the run's wall time."}
- {"area":"agent","text":"The critic's feel motion probe now watches meshes carried by a moving parent, such as an enemy whose nav agent or kinematic body has no mesh and whose body, head and gun are child meshes, judging them where they are in the world instead of reporting that nothing in the scene can move."}
- {"area":"agent","text":"The critic.check out-of-bounds finding for a scale over a kilometre now says the allowed range and to build a larger ground from pieces or terrain, and the code's summary no longer describes only the position half."}
- {"area":"agent","text":"play.measure steps a run of ticks in one editor call instead of two editor frames per tick, and an editor an agent owns draws its Play view at most four times a second, so a 1200-tick measurement no longer takes minutes on a machine with only software rendering; what is measured is unchanged."}
- {"area":"agent","text":"Every argus:// document, recipe and schema now ships as a plain file in the SDK under resources/ (argus://X is resources/X), so an AI sub-agent that cannot read resources opens them directly instead of searching the disk or paraphrasing copies. New projects name their SDK path in AGENTS.md, notes.read reports resourcesDir, and explain.api now finds Author, WorldHandle, EventsHandle and RoadHandle and lists the nearest names when a symbol or component is not found."}
- {"area":"launcher","text":"The export test no longer expects a release export and a development export to carry identical third-party notices; each engine carries the notices of its own crates (the development engine adds the query API's)."}
removed
- {"area":"engine","text":"The engine no longer ships a starter kit (about 2.8 MB of sounds, music, ambient loops and fonts): a builtin:sfx, builtin:music or builtin:ambient path now plays a placeholder tone and says the engine ships no sounds, so make your own (the make-your-own-sounds recipe) or add an asset pack, the arcade and retro themes draw in the engine's default font, the argus://starter resource is gone, and the sound-and-hud and driving-course recipes now use generated sounds."}