The development notebook

Always experimenting.

Real changes, clear notes. Follow the game right here, without a repository account.

Website launch28 September 2026

A new home for your experiments.

Phoenix Particle Sandbox now has its own website, shared community accounts and on-site forums. Explore the game, read complete development notes, and join our official Discord without needing access to the private development repository.

Registration, sign-in, forum posting, replies, reporting and withdrawal have passed live service checks. Private map storage is now connected and the shared catalog is online. The public Windows download is still being prepared, and end-to-end sharing between two game installations remains to be verified. This website update does not change the desktop game version.

v0.1.35Development build

R496 window movement and saved gravity

From the frozen build notes. Gameplay acceptance remains in progress.

Read complete changes

Four additional player feedback notes

Reviewed the four new 0.1.34 notes about stuck windows, horizontal splitting, gravity reload and overlay slider explanations. Original local notes remain unchanged. Research, implementation choices and manual acceptance steps are in APPARATUS_IMPLEMENTATION_REFERENCES and the authored WINDOW_FEEDBACK sheet.

Window headers now use one drag target rather than overlapping selectable text and a drag target. Narrow panels put controls on a second row so the title remains usable. Tear-off keeps its own pointer capture instead of handing it to a disabled native title widget. The original press offset is retained and abandoned captures clear.

A pane dragged out of a group stays floating on that release, even near its former parent. Drag its outer window title again to use magnetic docking. Window > Float remains available. Shift always suppresses automatic snapping. No saved layouts or player settings are reset.

Window menus now offer a persistent Magnetic snapping toggle and Prefer horizontal divider (above / below) preference. Stacked splits are preferred by default when edge choices are ambiguous. Explicit Above/Below choices appear first; Left/Right splits and arrow-key bias remain available. Horizontal here means a horizontal divider with one pane above another.

View and Overlay studio share expanded hover explanations on minimum/maximum, signed logarithmic scale, palette, colors, custom opacity, stacked layer intensity and heat-flow arrow opacity. Help states units, clamping, custom-enable requirements and the difference between display changes and physical simulation changes. Click numeric values for exact entry.

Gravity selection, rest state and world saves

Fixed generated numeric enum bounds: the three gravity modes now produce a 0..2 range rather than silently treating the first two labels as a 0..1 range. The authored spreadsheet remains the source.

Unified gravity UI-to-engine conversion before save capture and normal frame synchronization, including paused worlds. Rest caches wake when the field changes: chunk activity, rigid rest counters and FEM sleep. Changing gravity does not erase existing momentum or move pinned structures by fiat.

Full-world saves now use native world format V8, appending a fixed 28-byte gravity section to the same atomic file as cells and device state. It stores global mode, vertical/horizontal strength, radial center, body attraction and well pull. Invalid modes, non-finite values and truncated sections are rejected before adoption.

F10 and Maps/community-path reload restore BOTH UI settings and engine values, so the next frame does not overwrite the restored field. Cell-scale conversion is reversed on load; radial center and well pull also persist in user preferences.

Old V1-V7 worlds remain readable and retain current gravity because they never recorded it. New V8 worlds require 0.1.35 or later; older games will reject them rather than silently misread them. Stamps stay legacy region files without world gravity. Save to a new slot if you need to keep an older-build copy.

Gravity Off disables the global field only. Existing momentum, pressure, wells and body attraction can still move things. Paused worlds require a step or resume to show physical movement. Built-in scenes may intentionally apply their authored gravity.

Community service source admission now accepts V8 headers as well as V6/V7. This is source compatibility, not a claim that hosting has been deployed or authorized.

Verification boundaries

Source review and ordinary compilation/startup are distinct from gameplay acceptance. Drew owns testing, so no test suite or automated gameplay is run for this request. Drag/drop, nested layouts, paused/reloaded gravity and save compatibility require his manual acceptance. No FPS improvement or fully realistic solver claim.

Previous releases, active games, worlds, feedback and chemistry evidence are preserved. Exact source and portable archives include these notes. Shared repository feature-registry errors may still block normal source commits; no hook bypass or unrelated peer changes are authorized.

v0.1.34Development build

R495 body safety and direct editing controls

From the frozen build notes. Gameplay acceptance remains in progress.

Read complete changes

Five additional player feedback notes

Reviewed five new 0.1.33 notes and preserved their original local JSON. Research and the ordered plan are recorded in APPARATUS_IMPLEMENTATION_REFERENCES; the authored FEEDBACK_REFINEMENTS sheet links each note to its source changes and manual acceptance criteria.

View now contains the active overlay's minimum/maximum sliders, palette, endpoint colors, opacity, stacked intensity and save/reset controls directly in its dropdown. Choosing a view keeps the popup open. Overlay studio remains available, editing the same preferences.

Electrical length and width now reach 64 size units instead of 8. Gallery controls, mouse wheel, Shift+wheel width, saved configuration validation and guarded reshape share the same bound. Standard components can reach 129 by 129 cells; scaled logic/transformer layouts can reach 385 by 385 cells. Existing terminal placement, obstruction checks and legacy sizes remain in use.

R rotates the brush in quarter turns instead of replacing the world with the reactor scene. Armed stamps keep their existing R rotation priority. Orientation is saved with brush settings and available in the brush context menu. Triangle freehand painting, CPU line/outline tools, mirrored copies and placement ghost now use the same orientation. Circles and squares are unchanged by quarter-turn symmetry. Reactor remains available through Maps.

Rigid-body material preservation and grabbing

Existing rigid bodies wait for a fresh grid snapshot before clearing their footprint or moving when the asynchronous copy is unavailable. Soft-body stepping hands its already-read, patched grid directly to the rigid path instead of consuming its snapshot and forcing a second readback. Collision occupancy is refreshed from that input before movement.

Cargo transfer now journals every write. A no-space refusal restores all previous transfers in reverse order, not only the last stranded grains. Rounded duplicate cavity destinations are deduplicated before filling, preventing two grains from being written to the same destination.

Removed the exemption that let loose material in a previous wall footprint be overwritten. Proposed hard footprints are checked against terrain before cargo is lifted. Settled-rubble reintegration in the live simulation refuses occupied destinations instead of overwriting water or other matter.

Grab uses an implicit spring response and the grabbed point's 2-by-2 effective mass, rather than applying a center-of-mass correction and amplifying it a second time through the angular lever arm. The correction cap scales with the substep.

Rigid fractures use repeatable irregular cuts seeded by body identity and fracture generation instead of always splitting along the same diagonal. Connectivity and minimum fragment limits remain; each original local cell still belongs to one candidate piece, and no separation kick is added. This is game fracture geometry, not a validated crack-propagation model.

Soft-body stability and avoidable work

Swept contact stops at its last checked location when the bounded 64-sample budget is exhausted. It no longer checks only the start of a long move and then accepts the unchecked endpoint.

Failed or nonfinite FEM solves roll back mechanical geometry and plastic state before fracture. Fixed/grab-constrained nodes no longer acquire artificial velocity from prescribed position changes. Loss of a terrain anchor wakes the body.

Force and prediction buffers are reused across substeps. Unchanged sleeping/rejected geometry reuses its existing raster, and an accepted nonfracturing step reuses its proposed raster for commit. Pressure and temperature wake checks still run, so sleep is not a blanket skip of physical inputs.

The existing sheet-driven implicit corotated FEM and PCG/multigrid solver are retained. Box2D stepping/mouse-joint principles and the MIT PositionBasedDynamics integration reference were researched; no unreviewed C++ dependency or copied third-party implementation was added.

Acceptance boundaries

Gameplay, conservation scenarios, fracture appearance, large-component save/load, speech and frame-time comparisons are for Drew to test. Compilation and shader validation are not gameplay acceptance. No tests or automated gameplay input were run for this request.

These fix identified source defects, not every possible rigid/soft-body artifact. Rasterized body coupling remains approximate, and a solver or placement refusal can pause a body's movement rather than silently damage or erase material. Large active deformable meshes still incur FEM and grid-coupling costs; no numerical FPS gain or complete physical realism is claimed.

Previous game processes, player saves, feedback, chemistry evidence and unrelated edits are preserved. Exact frozen-source and portable release assets identify the built snapshot; inherited shared registry errors may still block the normal source commit.

v0.1.33Development build

R494 feedback-driven workspace and tools

From the frozen build notes. Gameplay acceptance remains in progress.

Read complete changes

Eight player notes turned into implementation

Reviewed all eight saved 0.1.32 feedback notes without modifying their original JSON. The authored feedback-improvements sheet links each note to its implementation, research and manual acceptance criteria. Reviewing this notebook is now the first step in requested improvement work, not an automatic agent or recurring background task.

Fixed the missing GPU brush-shape flags. Circle, square and triangle settings now reach the freehand brush shader, and the cursor outline follows the chosen shape. Selecting a palette tool cancels an armed apparatus/stamp instead of allowing it to intercept drawing clicks.

Removed duplicated Temperature, Electricity and Rigid bodies sections from Tools. Their placement, temperature, electrical and object controls remain in relevant right-click menus. Maps and Options retain world-level controls. Added an illustrated Stamps entry directly to the tool gallery.

Observation without a blocking passive readback

Passive dissolved-species analysis, area pins and selection statistics now share an independent asynchronous GPU snapshot instead of synchronously reading the whole world on the render thread. Requests are throttled, pending buffers have one owner, and stale results are rejected after grid replacement or region movement.

The Inspector is dedicated to the material under the cursor, with temperature, pressure, velocity, density, dissolved-species/pH information, freshness and material-reference links. It no longer mixes Tool/Object/World settings into its tabs. Selected device controls remain in a separate device-settings window, and pump/filter world context menus remain available.

This removes a confirmed blocking code path, not a measured FPS regression diagnosis. Snapshot transfer and CPU chemistry/region analysis still have a cost. No gameplay benchmark or performance improvement percentage is claimed.

Window placement and apparatus

Dragging a floating window near two workspace corner edges now previews and snaps that corner while preserving the window dimensions instead of converting it into a full-height side panel. Shift suppresses snapping; directional arrow bias retains side docking; neighboring-window split docking remains available.

Apparatus entries are illustrated cards. Buildable constructions show their authored physical wall shape, while research-only entries remain explicitly non-placeable. Right-click offers context and dimensions for the selected apparatus.

Physical valves automatically infer the actual straight pipe's bore, axis and wall material, rather than depending on the current drawing material and width. Ambiguous, damaged or elbow geometry is refused. Opening removes matching gate material; closing refuses occupied fluid instead of deleting its contents. Manual valve width controls are no longer presented as necessary.

Native feedback voice entry

Feedback offers an explicit native Windows text editor for Win+H voice typing. The existing draft is transferred as data, not executable script. Use text returns the result for review without submitting the note; Cancel leaves the draft unchanged.

If the draft changed while the native editor was open, returned text is retained separately for copying instead of overwriting newer work. Windows speech services, microphone permission, internet requirements and privacy settings remain under the player's control. In-place dictation support for every egui text box is not claimed.

Overlay studio

View now opens Overlay studio with per-view custom appearance. Scalar overlays support explicitly labelled minimum/maximum, linear or signed-log normalization, Viridis/Inferno/Plasma or custom endpoint colors, opacity and matching legends. Existing stackable overlays use the same configured ranges and colors.

Authored units distinguish kelvin, kPa, cells per second, kelvin per cell and density. Structural load is labelled as a solver diagnostic, not calibrated stress. Electrical and heat-source classifications are not mislabeled as voltage or wattage. Categorical/appearance views offer tint and opacity rather than meaningless numerical ranges.

Overlay preferences can be saved atomically across versions. Disabling custom appearance restores the existing presentation. Shader uniform layout and application upload are extended together.

Visual stamps and practical reuse

The stamp library now has material-color thumbnails, search, optional automatic names, a direct selection/capture action and explicit delete confirmation. Thumbnails are cached and loaded at most one visible entry per frame rather than reloading every saved stamp each frame.

An armed stamp uses the existing world ghost and gains 10 to 400 percent resizing through its library control or mouse wheel. Ctrl+wheel still zooms; R rotates; F flips. Resizing samples the original stamp rather than repeatedly shrinking already-resampled cells. Dimensions and total preview cells are bounded, and velocities rotate/reflect with their cells.

Stamps remain cell snapshots. Custom device settings, circuit wiring and mechanical objects are not cloned; complete map saves remain the appropriate format for those systems. Original stamps are not changed by preview transforms.

Delivery and testing boundaries

Version and embedded What's New advance together to 0.1.33. The build uses the retained private compiler cache and free-space guard; original feedback, saved worlds, chemistry evidence and prior game versions are preserved.

No gameplay tests, automated input or gameplay measurements were run. Drew owns acceptance, including native Win+H behavior, overlay appearance and docking on his desktop. Compilation does not establish those outcomes. Community hosting remains unactivated and candidate reaction-corpus data is not silently admitted.

v0.1.32Development build

R493 contextual feedback notebook

From the frozen build notes. Gameplay acceptance remains in progress.

Read complete changes

Feedback where you are working

Added an original speech-bubble feedback icon to shared floating/docked panel controls and a permanent Feedback entry in the top toolbar. Shared navigation menus and What's Changed expose feedback actions without leaving the game.

Added contextual entry points to tool settings, material actions, the save/community gallery, electrical tools/components, pump/filter menus, hover inspector, analysis pins, material science, file chooser, creation studio and zoom lens. Context identifies the surface plus available material/tool/machine or analysis data. This is broad shared coverage, not a claim that every nested popup has its own button.

The composer offers Improvement, Bug, Question and Praise, Normal/Important/Blocking priority, optional title, and free-text notes. Existing unsaved text is retained rather than replaced when a second panel requests feedback. Closing keeps that draft in this running game; Save is required before quitting.

Version and simulation context

Notes capture the running game version, timestamp, simulation frame, world dimensions, view, pause/FPS state, brush/tool/material settings, selection, last hover reading with freshness/age, and available nearby dissolved-species/pH readings. Context is frozen at note creation, not silently changed while typing.

Attach world point temporarily intercepts the next world click instead of painting. It captures an exact point probe and up to a 64 by 64 neighborhood with material identities, packed flags, temperature and velocity. An outlined target and a material-color preview help identify the location. Right-click or Escape cancels picking.

Ctrl+Shift+F captures the world point under the pointer when a text field is not active. This shortcut does not alter the selected tool. Explicit readback can briefly pause rendering. The preview is a material grid, not a screen capture, full save or reproducible simulation checkpoint.

Included context can be reviewed before saving and copied separately. Existing asynchronous hover/solution data is explicitly marked with its age and may describe an earlier sample; attached world data has its own frame/coordinates.

Private durable notebook and later review

Save feedback locally writes a uniquely named JSON record through the existing atomic create-new writer. It flushes before publication, never overwrites an existing note, retains the draft on failure, and offers Copy note as a backup.

The notebook lives in `%LOCALAPPDATA%/Emberfall/feedback` on Windows, shared across game builds. `EF_FEEDBACK_DIR` can override it. No folder selection is required. Nothing is sent to GitHub, Discord, a hosted service, or an agent automatically.

Saved notes can be searched across title, text, version, surface, kind and priority, filtered to the current version, refreshed and copied individually or as a review bundle. The reader limits a record to 2 MiB and loads up to 500 recent records within 32 MiB; all original notes remain on disk. Bundles copy at most 20 notes/2 MiB. Unreadable/future-schema notes are reported, not deleted.

Ask Jcode to review the feedback notebook to turn the saved notes and context into a prioritized development plan. The records are not executable instructions. There is no automatic code modification, public posting, background agent or telemetry.

Authored contracts and manual acceptance cases are in sheet 49_FEEDBACK. Existing request/master records and workbook are preserved. Version and embedded What's New are updated together. Gameplay testing remains Drew's responsibility. No automated tests or gameplay interactions were run for this change.

Inherited limits remain: community hosting is not activated, and blast physics remains a gameplay approximation. Feedback does not change those systems or activate candidate chemistry.

v0.1.31Development build

R492 barrier-aware blasts, explosion effects and category icons

From the frozen build notes. Gameplay acceptance remains in progress.

Read complete changes

Blast interaction and heat

Blast pulses now trace intervening cells from an immutable GPU snapshot. A one-cell solid cannot be skipped by coarse sampling. Intact solid crossings attenuate mechanical loading and block direct blast heat; thicker barriers provide additional attenuation. The impacted front surface still receives the incident load.

Removed repeated enclosed-fireball heating and unconditional conversion of nearby matter to gas. Each event delivers one arrival pulse. The heat increment uses the material heat capacity and pays through existing melting/boiling latent-heat bands. Water can carry a pressure disturbance without automatically becoming steam throughout a cavity.

Removed the duplicate post-fire dispatch that could apply old events twice in one tick. Newly ignited charges are consumed at their first arrival on the next tick, before movement. Detonation inputs are frozen separately from the writable chain-reaction ring.

Fixed blast pressure binding to use the actual pressure front, independent of the cell ping-pong front. Impacted chunks and their neighbors remain scheduled to wake.

Fracture sums arriving load and uses existing hardness and metallicity. Failed static materials retain their identity but become explicit loose powder, with a density-scaled, capped outward kick. The thermal pass no longer silently changes cold powder back to intrinsic static solid. Indestructible boundary material remains indestructible.

The fast same-charge ignition search now requires an explosive path. It no longer jumps a separating wall simply because another hot charge is inside its search radius. Normal pressure and heat ignition remain available.

Explosion appearance

Added blast-driven blue-white pressure crests, orange-to-white brief flashes, fracture-site dust and glints on real hot fast grains. The existing bloom path receives their emission.

Cues are generated by shielded blast arrivals, not arbitrary pump pressure. Presentation does not add heat, pressure, mass or particles. FX strength remains controlled by the existing fx_scale option; diagnostic views remain unaltered by these new cues.

Transient effects decay on simulation ticks, freeze when paused and clear on world upload/reset. No old explosion glow is carried into a newly loaded map.

Material navigation

Added original scalable star, burst, atom, molecule, wall, shield, flask, thermometer, light and flame symbols to the existing icon family.

Every category authored in menu.toml and all nine material sections now use sheet-backed icons beside their labels. Existing selection, colors, keyboard/accessibility response and hover counts remain native controls. Chemistry-injected categories use semantic icon fallback.

Category controls use roomier icon/text sizing and remain clipped and responsive at narrow widths. Authored mapping is `49_CATEGORY_ICONS.csv`, exported alongside explicit blast tuning in `49_BLAST_RESPONSE.csv` and the existing request/master/workbook records.

Evidence and unfinished boundaries

Actual game version and embedded What's New are 0.1.31. This is an unverified gameplay preview for Drew's own testing, not a passed blast acceptance claim. No automated gameplay tests or interactions were run.

The blast remains a bounded 2D gameplay approximation. Full reflection/diffraction, calibrated acoustic impedance, global energy conservation, complete free-body fragmentation and performance across large charges are not claimed. Long unresolved rays fail closed after 2048 crossings; the existing 256-event ring limit remains.

GitHub release artifacts include the exact frozen source and full notes. No Discord release publication. Community hosting from 0.1.30 is still pending Cloudflare authorization; this build does not activate it.

v0.1.30Development build

R491 native shared-community client and service / HOSTING NOT ACTIVE

From the frozen build notes. Gameplay acceptance remains in progress.

Read complete changes

Native community browser

Saves now opens a first-class **Community** tab in the game's own GUI. Local My saves, favorites and the optional shared-folder inbox remain separate, clearly labeled workflows.

Added responsive thumbnail cards with map title, authenticated creator, description, tags, like count and download count. Details show the complete description, credits, map dimensions, file size, game version, sharing terms and stable map ID.

Keyword searches match all supplied words across title, description, tags and creator. Exact creator/tag filters, clickable tag chips and creator links, newest/most-liked/most-downloaded sorts, 24-entry pages and My submissions are integrated with the service API.

Added native sign-in and account creation, with no browser redirect or GitHub account requirement for players. Public browsing/downloads need no account. Passwords and bearer credentials are kept only in the running client, not configuration or save files. Initial registration is invitation-gated. Password reset/recovery and persistent sign-in are not implemented.

Submit, download and play

Local save Details and context menus now offer **Submit to community**. A dedicated form collects title, instructions, up to eight tags, attribution and an explicit sharing-permission choice. Publishing requires account sign-in and a separate permission checkbox. Ordinary Save never uploads anything.

Publication uses an owned private draft, separate bounded world/thumbnail uploads, server SHA-256 receipts and an explicit final publish transition. Incomplete transfers stay private. The byline comes from the authenticated creator, not a typed local metadata field.

Download & play and Keep in My saves use HTTPS background jobs. Transfers do not execute on the render thread. Thumbnail requests are limited to four parallel workers; loading, service failures and expired sessions are visible.

Downloaded worlds must match the catalog byte count and SHA-256 before native material/control validation. Missing identities are rejected rather than replaced silently. Downloads use unique game-managed paths. Play opens the real game with the selected map and preserves the original experiment window, without visiting a website.

Added one-like-per-account controls, remove-like, in-game problem reporting and explicitly confirmed owner withdrawal. Download counters are deduplicated per hashed network/day, not represented as exact unique-player counts.

Shared backend and operating boundaries

Added the original Cloudflare Worker service, additive D1 schema and private R2 object-storage configuration under `services/community`. Routes cover accounts, catalog, drafts, uploads, publish, downloads, ratings, reports and operator moderation with audit reasons.

SQL parameters, fixed sort choices, request/file/text bounds, ownership checks, session expiration, basic request/login/registration/upload/report limits and abandoned-draft cleanup are implemented. Concurrent upload replacement uses compare-and-swap; published object references are immutable. Service secrets never ship with the game.

Initial admission is native V6/V7, 32 MiB per online world, 8,388,608 cells, 256 global slots and 50 slots per account. These conservative capacities are not a promise of unlimited hosting or zero running cost. Server validation checks the native header; the existing bounded native reader remains the final content-admission gate.

**Not live yet:** Cloudflare authorization was expired when deployment was attempted. The shipped endpoint remains empty rather than pretending a local directory is a public catalog. Real hosting authorization, deployment configuration and two-player acceptance are still required. No paid plan was enabled. The interface explicitly reports this state.

Native free rigid-body/joint save fidelity is still unfinished; existing capture refusal remains. No production security audit, bot-proof moderation, email recovery, comments or cross-version scientific compatibility is claimed.

Release bookkeeping

Actual version and embedded What's New are now 0.1.30. GitHub and this detailed changelog are the release record. New Discord-update generation/publication is discontinued at Drew's direction.

The package includes the matching frozen source, service source, authored request records, checksums and full changelog, including earlier 0.1.23-0.1.29 changes. A GitHub release source snapshot is distinguished from master-branch commits so peer edits are not silently swept into history.

Ordinary app compilation and service syntax/bundling are delivery checks only. Drew owns testing: no gameplay interactions or automated account/submission scenarios were run. The live shared-service outcome is explicitly unfinished until authorization and real deployment succeed.

One account. More possibilities.

Join the experiment.

The same account for the website, forums and in-game community.

Use a unique password of at least 12 characters. Password recovery is not available yet. Keep it in your password manager.

Report content