Manual / What’s new
What’s new
The features worth knowing about, newest first — then the complete record of everything that changed in the last 3 months.
Highlights
-
Sep 2026
Block models: bin opacity, and projects that hold one save and autosave
Each bin of a block model coloured Binned now has its own opacity, so a low-grade shell can be turned down to show the high-grade core inside it. Block models are also stored far more compactly: a 2.9-million-block model with nine attributes takes 149 MB instead of 343 MB, which brings projects holding one within reach of autosave and cloud saves.
-
Sep 2026
Import sub-blocked block models of any size
Octree and other sub-blocked models from Leapfrog now load at every block's own size, and a block-model CSV can be many gigabytes: the file is read in the background, never opened whole. Before loading you choose what to keep, such as leaving out -99 air blocks or setting a grade cut-off, and the wizard estimates how many blocks that leaves. The layer records what was left out. Add the Leapfrog .csv.txt header to have a rotated model refused rather than drawn in the wrong place.
-
Sep 2026
Blank and pending assays no longer paint as a second layer
The drillhole importer now asks what each blank or marker word in an assay file means (pending, NS, -, and so on). Not-assayed intervals are hidden instead of drawn as grey cores over your grades. Pending ones are drawn in a neutral grey and counted in the legend. An element that is mostly pending, or held back by an unfamiliar code, now imports.
-
Sep 2026
Free 7-day trial — no card, no waiting
Anyone can now start a free 7-day trial from exploration.rocks: sign in with a work email and bring in your own data, save and publish. The sample deposit stays open to everyone. When the trial ends the account pauses, including its published tours, until a plan is chosen at checkout; your projects are kept.
-
Sep 2026
See who watched a published deck — and send the report to your client
Published decks and their embeds now count views: visits, time on each scene, narration heard, how far people got. Share link → Who watched → View analytics opens a plain-English report you can forward with Copy report link; Reset link takes forwarded copies back. Anonymous — no names, emails or IP addresses, and Do Not Track is honoured.
-
Sep 2026
Phones: regional scenes open at their real scale, and landscape gives the model the screen
Wide establishing shots — a country, a greenstone belt — no longer open zoomed in on phones: the camera's zoom-out limit was being measured before a phone had built the regional map layers, and now uses each layer's saved extent instead. Held sideways (or in a short embed), a phone now drops the app header, withholds the compass card, folds the compliance strip to a single line with every full text one tap away, and keeps the colour keys low and clear of the scene card. It applies to every published story at once — nothing needs re-publishing.
-
Sep 2026
A calmer slice envelope under the mouse
Opening and closing the slice envelope with Ctrl + both buttons (push away to open, pull toward you to close) is now gentler and scales with the envelope: a thin section adjusts in fine steps instead of doubling at a twitch, and a wide one still moves at a useful pace. One long pull opens it by about two-thirds again.
-
Sep 2026
Full screen for embeds on iPhone — and the colour key stays put on phones
An embedded story now has a working full-screen button on an iPhone. iPhone Safari gives web pages no full-screen mode, so the embed asks the page it sits on to let the model cover it — tap again and the page is back exactly as it was. It needs the one-line script that now ends the embed snippet, so re-copy the snippet from the Share dialog for embeds pasted before today. On phones, the colour key no longer gets pushed up behind the scene card: the Mineral Resource Estimate table folds to one line you tap to open, and the estimate's method disclosure shows two lines with a Read the full disclosure link.
-
Sep 2026
Less clutter in story mode — and phones are viewers only
Story mode hands more of the screen to the model on every device. The scene card sits tight in the top-left corner and is only as big as its text (on a phone, a single line), the scene rail along the bottom is shorter, and the all-clear Data checks passed chip steps aside once the story moves on to scene 2 — a chip carrying caveats still stays for the whole story. On a phone, exploration.rocks now opens as a viewer: the story, without the Pro workbench, sign-in or author controls. Build and share on a computer.
-
Sep 2026
A cleaner stage on phones — your choice per link
A new share option, Minimal chrome on phones, lets a link give phone viewers the model without the on-canvas colour keys and the all-clear data-quality chip — the densest overlays at phone widths. It is off by default and per link, and it trims chrome, never disclosure: a data-quality chip carrying caveats still shows, desktop viewers see everything, and the compliance notices stay on every device. Phone framing also gained breathing room — the camera pulls back a touch further than an exact fit, so the scene floats in the letterbox instead of pressing against its edges (now on every iPad, not only the 4:3 ones) — and an iPhone viewing an embedded story gets an open-the-full-viewer link where the full-screen button would be (Safari offers no full-screen control to web pages), opening the story in its own tab.
-
Aug 2026
A portrait phone sees your whole framing
Scenes are framed on a landscape canvas, and a portrait phone used to keep the height and crop the sides — callouts and the edges of the deposit simply fell off screen. The camera now pulls back on narrow screens until the full authored width fits, like a landscape photograph letterboxing on a portrait phone. The scene card also collapses to a slim strip — tap it to read the whole narrative, tap again to put it away — and the gesture hints finally speak touch: drag, pinch, double-tap.
-
Aug 2026
Any-size decks on phones
A phone now builds each scene's map layers as the story reaches them and releases the ones it has moved past, so what has to fit is your heaviest few scenes — not the whole file. A deck several times larger than a phone could ever hold whole opens and plays there, and the size check re-measures the real file on the device before building anything, so a link can never talk a phone into more than it can survive. Mint a fresh share link (and re-publish) to pick it up.
-
Aug 2026
Full screen on phones, and a story that yields to the model
A full-screen button now appears on phones and tablets (where the browser offers one — iPhones don't), hiding the app header so the model takes the entire display. The scene card also slims down on phones — tighter, smaller type, narrative clamped to three lines — so the map stays the subject instead of the caption.
-
Aug 2026
Map-heavy decks now fit on phones
The solid fill of a polygon layer — a country silhouette, a claims block — is rebuilt from its own outlines when a scene first shows it, instead of travelling in the file. On map-heavy decks that is often half the story's weight, which is the difference between a phone refusing the link and playing it. Mint a fresh share link (and re-publish a published deck) to pick up the saving on an existing story.
-
Aug 2026
Publish a story to a permanent address
The Share dialog's Publish section gives a story its own address at exploration.rocks/e/your-name — a stable link for a website, a news release or an IR page. The address is permanent and stays with the project.
-
Aug 2026
Photos and video on a scene
Media annotations put a site photo or an embedded YouTube video directly on a beat, beside the geology it explains.
-
Aug 2026
The slicer moves from the keyboard
One press of an arrow moves the cut 10 cm — a real distance, so the same key does the same thing on a 300 m prospect and a 4 km porphyry — and holding it sweeps the whole model in about six seconds. Reading where mineralisation starts and stops no longer means dragging.
-
Aug 2026
Text blocks you can actually typeset
Free text on a scene now carries alignment, leading, tracking, bold, italic, rotation, a width and a type voice — with a glyph halo so it stays readable over any model.
-
Aug 2026
Distance arrows
A third annotation kind: two clicks span any two points with a labelled arrow that survives share links, beats and the project file — the measurement your audience can see.
-
Aug 2026
Add new drilling without rebuilding the project
Import fresh CSVs into a project you already have — add or update the dataset, or replace the collar, survey, assay or lithology table outright, including removing holes that are gone. A merge can be undone.
-
Aug 2026
Press-release composites as their own layer
Highlight intervals import as a disclosed layer of their own, so the composites in your news release are visible as exactly that — never mixed silently into the raw assay record.
-
Aug 2026
A viewer who takes over stops the tour
Touching anything during playback now stops the tour rather than fighting it, and Play/Stop reads as the primary control.
-
Aug 2026
Filter your data by asking
Ask can now set and clear query filters on drillholes and on named GIS layers, and it can tell you which layers are filterable and on which columns.
-
Aug 2026
GeoTIFFs up to 2 GB
Large rasters stream in — window-read, tile-aligned and decimated to the detail you asked for, using pyramid overviews where the file has them — instead of trying to hold the whole grid in memory. Past 2 GB the app refuses honestly rather than crashing the tab.
-
Aug 2026
Project files got dramatically smaller
Terrain geometry that can be rebuilt from its height grid is no longer stored, on top of the same treatment for normals: one real project went from 137 MB to 38 MB. Existing files shrink when you re-save them.
-
Aug 2026
Terms, viewer terms and a privacy policy
Published in plain language, covering what the software is and is not — in particular that its outputs are not a mineral resource estimate without a Qualified Person signing one — and what happens to your data.
-
Aug 2026
A slice never labels what it hides
With a cut active, labels, hover cards, intercept callouts and the measure tool are all gated by the visible band. Measure in particular could previously report a distance to a surface that was not on screen; it cannot any more.
-
Aug 2026
Leapfrog meshes in, CAD surfaces out
Leapfrog .msh files import directly, and any honest triangle mesh exports as DXF or GOCAD TSurf — the format Leapfrog imports natively. Imported solids and committed geological units all export in real-world coordinates.
-
Aug 2026
PowerPoint decks that render at export time
Every slide in an exported deck is re-rendered live when you export, so a deck never ships a stale thumbnail of a model you have since changed.
-
Jul 2026
An elevation scale in the viewer
A labelled RL post at the back of the drilling answers how deep something sits, in real elevations rather than scene units.
-
Jul 2026
Drill targets explain themselves
The machine-learning targeting layer now draws a key on screen, shows the composites the model trained on, and can reveal its tiers as a story beat.
-
Jul 2026
Search everything with Ctrl+K
One box over imported layers, drillholes, story scenes, every Model-tab section and every labelled keyboard action.
-
Jul 2026
Reference planes — images and PDF pages in 3D
Place a historic section, a scanned map or a PDF page as a textured plane in the model, sized and faded to taste.
-
Jul 2026
Colour any layer by a category
Vector points, lines and polygons colour by a string field, with a matching categorical key that also appears in Present.
-
Jul 2026
360° site tours
Panorama scenes gained hotspots — pins, info cards, media overlays and 360-to-360 jumps — plus in-app image upload, a saved landing view and auto-pan during playback.
-
Jul 2026
Autosave and crash recovery
Work is snapshotted continuously to this device; if a session ends badly, the next load offers to restore it. The top bar always shows autosave's real state.
-
Jul 2026
Narration in exported movies
Per-scene narration is mixed into the exported video, and each scene holds long enough for its own audio to finish.
-
Jun 2026
Leapfrog-parity navigation and slicing
Right-drag zoom, middle-drag pan, the full slicer key set, lock-to-camera (Ctrl+L), orient-to-view (Ctrl+V) and a moving plane for reading structure orientation — the muscle memory carries over.
Everything that changed
Every user-visible change in the window, grouped by the part of the product it touched. Nothing here is trimmed — the highlights above are a selection from this same record, not a substitute for it. The one exception is work on the modelling tools (grade shells, block estimates, geological models, drill targeting) and the map-sheet and figure exports, which are not part of this release and are left out of this page.
September 2026 26 changes
Stories & presenting3 new · 3 fixed
- Fixed09-27Review round one - one-row strip floor, every row one line, full extent union
- New09-27Phones frame regional beats at scale; short screens give the model the room
- Fixed09-26Review round one - verified host cover, band re-base, honest toggles
- New09-26Phone colour key keeps its place; iPhone embed fullscreen
- Fixed09-26Review round one - phone-only lock, recipient deferral, empty-state copy
- New09-26Declutter story mode; phones are viewers only
site4 new · 1 fixed
- New09-28Exploration.rocks sells self-serve - build it in an afternoon, update any time, the link stays live
- New09-27Brand skill, copy pass, design audit, one scroll moment, one icon set
- New09-27Exploration Sites logo and brand across the marketing site
- Fixed09-27Review round one - returning authors keep their origin, canonical /e/ addresses, consent evidence
- New09-27Exploration.rocks becomes the ES3D marketing site; app moves to app.exploration.rocks
3D viewer1 new · 2 fixed
- Fixed09-28Letting go of a two-button pan in either order no longer jump-cuts the view
- Fixed09-28Never save a blank readback as a black scene thumbnail
- New09-27Slower, proportional Ctrl+both-button slice envelope resize
Other improvements9 new · 3 fixed
- New09-28Blank and pending assays are tagged, not drawn as a second layer
- New09-28A free 7-day trial replaces "Request access"; then paused until a plan is paid
- Fixed09-27A data deck keeps counting scenes after it loads; the report chart gets a 30-day frame
- New09-27Published decks are counted, and their owners get a report to send
- New09-27The sample, the intro and Draft story tell a v1 story
- New09-27Helper lifts z-indexed ancestors, verifies by hit-test, exposes es3dEmbed.cover
- Fixed09-09Stop the chrome pointing at a tab that no longer exists
- New09-09Two tabs — hold every interpolation surface, rehome the rest
- New09-09Build-time flags for the held model surfaces
- New09-01Lift the handheld zoom ceiling by the framing headroom; cover cedes its wide shot
- Fixed09-01Review round one - the iPad fade anchor, URL allowlist, and honesty carve-out
- New09-01Framing headroom, iOS standalone link, minimal-chrome share option
August 2026 332 changes
Stories & presenting19 new · 18 fixed · 3 faster
- Fixed08-27The Report pill is pressable again, and the Reset chip gets its 6px back
- New08-24Arrows drive the slicer; media photos can be uploaded; text fades only in Present
- New08-21Distance arrows survive share links, beats and the bundle
- Fixed08-20The ✕ reaches every deck, and the terms link actually stands
- New08-20The dismiss control clears the whole compliance bar
- New08-20Make Play/Stop read as the primary action
- New08-19A viewer touching anything stops the tour
- New08-19One action for 'the viewer took over'
- Fixed08-12Busy card tucks bottom-right under the story cover
- New08-10Make the scene rail's scrollability discoverable
- New08-1044px tap areas that do not move one painted pixel
- Faster08-10The capture walk visits scenes instantly
- Faster08-10Deflate the .pptx instead of storing it
- Fixed08-10The capture pass now answers Cancel, and stops steering live followers
- Fixed08-09Stop offering Cancel once it cannot take effect — plus its announcement and its boundary
- New08-09A way out of a 33-second render — cancel, abandon before writeFile
- Fixed08-09Key every classified figure a slide drew, not just the drill ramp
- Fixed08-09A share link decides the attribution — and the figures that may sit under it
- Fixed08-09Pin exportDeck(rendered) vs exportDeck(spec) — review finding
- New08-09Render slides on export, with progress, a ref guard and a real error path
- New08-09Render each beat at export time, with its overlays and furniture
- New08-09Carry the author's brand, and a sender's meta on a recipient deck
- New08-09Carry the slide → source view index through buildDeck
- New08-09A settle policy that outlasts the debounces sceneHold misses
- New08-09Render buffers that match the PPTX box aspects
- Fixed08-08Capture any unvisited scene before exporting, so a story exports as pictures
- Fixed08-08Carry the per-scene captures in the .es3d, so a reopened project exports slides with images
- Fixed08-08Reset view arms on real camera motion, not on a bare click
- New08-08A compact scene rail for embed-sized viewports
- Fixed08-08One owner for the top-right corner — chapters, fullscreen and help stop colliding
- New08-08A one-time gesture hint and a viewing-only help popover
- New08-08Reset view — the way back when the camera is lost
- New08-08Layer flyout lists exactly what the scene contains
- Fixed08-03The cover's re-ask fired before the composites existed
- Fixed08-03A deck skipped past its cover reached the reveal with no model
- Faster08-03The AI-targets group stopped rebuilding what it already had
- Fixed08-03The FIRST reveal in a freshly opened deck had no model to reuse
- Fixed08-03A beat that reveals the AI targets retrained a model it already had
- Fixed08-03The training key stated the LIVE rule under a frozen round's tiers
- Fixed08-02The training key counted grid-averaged blends as composites
GIS & terrain13 new · 15 fixed · 1 faster
- Fixed08-27Stop terrain showing through a draped polygon's cap
- Faster08-27Ration vector drape refinement by the ground it actually covers
- Fixed08-19The filter badge counts features, and labels honour the filter-kind gate
- Fixed08-19Resolve exact layer names against the full layer list, not just filterable ones
- Fixed08-19A removed layer drops its query-filter binding
- Fixed08-19Fallback chain for feature totals on bridge-less line/polygon layers
- New08-19One feature-space count authority for filtered layers
- Fixed08-13The fallback test actually drives the fallbacks, and two comments stop lying
- Fixed08-13The fill lift bites on OLD projects, and its total is bounded
- Fixed08-13The merge transposed ctx.theme and ctx.bloom — both features were inverted
- Fixed08-13The greenstone belts stop tearing on the country polygon
- Fixed08-13A glow keeps its Size control, and picking Glow writes its intensity
- New08-13Default hero-glow intensity 5 (hero sweet spot) + hero-bloom showcase probe
- New08-12A glow effect auto-enables the FX/bloom path (edge-triggered, respects manual toggle)
- New08-12Hero glow drives sibling HDR (xintensity) so post bloom catches it as real light
- New08-12Softness-driven feathered shadow spread + intensity/softness in rebuild signature
- New08-12Editor Intensity (glow) + Softness (shadow) controls
- New08-12Add intensity+softness to VectorEffect model + sanitize
- Fixed08-06Vector-effect halos ride the transition fade, and stop rebuilding 60x/s
- Fixed08-06Restore path must set depthByOpacity, matching the builders
- Fixed08-05Carry hidden labels in the scene snapshot, conditionally
- New08-05Remove individual labels from the scene, restorably
- New08-05Per-ortho encoding quality picker (Balanced/High/Lossless)
- Fixed08-05Stop compounding lossy re-encodes + close review gaps on drape encoding
- New08-05Encode image drapes as WebP/PNG instead of raw RGBA
- New08-05Read encoded image drapes via an async decode pre-pass
- New08-05"Conform to terrain" — re-place an existing layer on the ground
- Fixed08-04Conform imported 2D vectors to the terrain instead of a flat mid-elevation sheet
- New08-03Infrastructure proximity — measure the deck's "12 km from the highway" claim
3D viewer9 new · 13 fixed · 5 faster
- Faster08-26Defer GIS geometry a handheld's opening scene does not show
- Faster08-25Release normal/uv CPU copies on an embed, behind a save-proof belt
- Faster08-25Cap drape DECODE on handhelds, source bitmaps 179.6 -> 24.1 MB
- Faster08-25Cap drape imagery on handhelds, measured 349.9 -> 32.4 MB
- Fixed08-24Stop point icons ghosting and orthophotos popping across a beat change
- Fixed08-23The fat-line clip must be installed in setupOutput, or it never compiles
- Fixed08-23The slicer must reach drill traces without needing a rebuild
- Fixed08-22The slicer reaches drillholes imported as their own database
- New08-22Free text blocks, and markup that fades across a scene change
- Fixed08-22The arrowheads stop at the end lines instead of spearing them
- Fixed08-22The arrow panel stops closing itself, and the number can be relabelled
- New08-22Restyle the number on a distance arrow
- Fixed08-22Keep the arrow's panel open while you drag its ends
- New08-22Style a distance arrow, and end lines at each end
- Fixed08-22Arrow endpoints actually drag now
- New08-21Two clicks anywhere place a distance arrow
- New08-21Draw distance arrows with screen-space heads and a live label
- Fixed08-21Trace thickness now survives a slice or clip box
- New08-11Eye-dome lighting — contact edges that show what is in front of what
- Fixed08-11Demo labels laid across the sign-in dialog — pin every drei <Html> z-band
- Faster08-08Mount a content family only when the scene contains it
- New08-08A dependency-free scene-family readiness registry
- New08-08Publish a camera-off-authored-pose signal from inside the Canvas
- New08-08SceneContents() — one derived truth about what is in the scene
- Fixed08-03Three layers skipped the crossfade when their material was rebuilt mid-flight
- Fixed08-03The AI targets get their own crossfade channel
- Fixed08-03Crossfade the learning-points layer with its siblings
Importing data10 new · 9 fixed
- New08-27Streamed GeoTIFFs read pyramid overviews, pool their decode, and prefetch chunks
- Fixed08-21A second drillhole import is a separate database again
- New08-21Replace a drillhole table, including removing what is gone
- Fixed08-21The wizard can complete a partial merge payload
- Fixed08-21Use colour tokens this theme actually defines
- New08-21Add or update drillhole data in an existing project
- Fixed08-1410 adversarial-review defects in the GeoTIFF streaming slice
- New08-14Ortho imagery path streams through the decimated reader
- New08-14Geophysics GeoTIFF path streams at a 2500-cell target
- New08-14DEM GeoTIFF path streams — AOI-windowed, tier-decimated, exact node lattice
- New08-14GeoTIFFs to 2 GB — blob-range open above 250 MB, honest gate above 2 GB
- New08-14Streaming decimated GeoTIFF reader (tile-aligned, skip-aware, budget-bounded)
- New08-11Leapfrog .msh meshes, routed by content not extension
- Fixed08-11Say when a repeated interval discards an assay
- Fixed08-11Say what arrived out of what was handed over
- Fixed08-11A negative assay is a code, not a grade
- Fixed08-10A below-detection-heavy element is an element, not a missing column
- New08-08Refuse an oversize raster before reading a byte of it
- Fixed08-08Planned holes in a drilled-collar export are a warning, not 31 errors
Core engine9 new · 8 fixed
- New08-21Merge drillhole tables into an existing dataset
- Fixed08-13A fill's tier stops depending on which vertex its ring starts at
- New08-13Coplanar polygon fills separate in DEPTH, not in the sort
- New08-13Read bundle terrain into a world-referenced HeightGrid
- Fixed08-13SourceVector props sidecar hard-fails like kinds, not a silent ?? []
- Fixed08-12Points parts selected by role, slack that adds its float term, over-inflation warns
- Fixed08-12Points-bounds slack is the exact import-time formula, not a heuristic; outline parts no longer double-decode
- Fixed08-12Points-slack floor scales with pointSize/pointRadius, not a flat metre
- Fixed08-12Frame guard cannot promote a mirror-ambiguous layer to verified
- New08-12Reconstruct baked layers with a hard coordinate-frame guard
- Fixed08-12Source-vector reader hard-fails on corrupt sidecars instead of degrading silently
- New08-12Decode source-vector layers into world map coordinates
- Fixed08-12Gis.json layers key is validated, not silently defaulted; drop dead sidecar helpers
- New08-12.es3d GIS bundle reader scaffold with an awkward-case fixture
- New08-05Drape encoding tiers + imageMime/quality in the bundle sanitizer
- New08-03Capture readout and top drivers for the report card
- New08-03Fit bands and the refusal rule, with the yardstick as data
Colour & legends1 new · 15 fixed
- Fixed08-21Stop a background rebuild wiping a bin threshold mid-edit
- New08-19Drop one element's scale without wiping the shared map
- Fixed08-19The drill colour key follows what the scene actually draws
- Fixed08-19The key obeys the filter-kind gate, and discloses counts it could not filter
- Fixed08-19The key follows a filter RENAME, and the folder gate pins its full table
- Fixed08-19The GIS key re-renders when the query filter or a folder moves
- Fixed08-19A class-card note only where its denominator matches its rows
- Fixed08-19GIS keys count what the filter and the folder leave on screen
- Fixed08-18The exported key shows its hidden classes, and a roster guards the set
- Fixed08-18The exported grade key indexes by class, like the screen
- Fixed08-12The picker card lands on-screen — portalled, fixed, viewport-clamped
- Fixed08-12On-canvas grade legend spans the merged range across databases
- Fixed08-12One row model for the grade key, indexed by class
- Fixed08-12Key the drill scales only when a drill layer is drawn
- Fixed08-12Stop keying figures that are not on screen
- Fixed08-11The low end of a pinned ramp clips too, and now says so
Slicing & sections8 new · 6 fixed · 1 faster
- Fixed08-24A tap moves the cut 10 cm, not 2 m
- New08-24Arrow keys step the slice 2 m, and holding one sweeps the model
- New08-24Ctrl+arrows move and resize the slice; ease the content crossfade
- Fixed08-12Keep the fault chip on the face, and re-ask the gate as the cursor moves
- New08-12Cut fault planes and planned holes, and move their labels with them
- Fixed08-11Gate the demo hover, and un-blind the guard's extractor
- Fixed08-11Round-3 — drop the unsound bounds cache, gate five more hover producers
- Fixed08-11Round-2 review — revert the descent gate, close the box hole, stop the walks
- Fixed08-11Close the CLICK door, walk EOH labels from their own end
- Faster08-11Keep the tube rebuild off the clip dependency
- New08-11GIS point labels, annotations and target pins
- New08-11Intercept callouts respect the slice, and stop going stale
- New08-11Hole-id labels relocate onto in-band trace
- New08-11Hover reports nothing the slice hides
- New08-11One pure clip predicate + the CPU readback
speaker12 new · 1 fixed
- Fixed08-27Default the overlay to TOP-right, measured not guessed
- New08-27Say that exported movies omit the talking head
- New08-27Publish clips to a public story-media bucket
- New08-27Voice | Video authoring modes with webcam recording
- New08-27Mount the overlay in Present mode, one narration status
- New08-27SpeakerOverlay - reports the same NarrationStatus as audio
- New08-27Carry the speaker field on share links (https-only)
- New08-27Embed and re-home speaker clips in .es3d
- New08-27.es3d video/ container, stored not deflated, additive
- New08-27VideoAssets IndexedDB store, own DB (the imageAssets pattern)
- New08-27SavedView.speaker + setSpeaker, mutually exclusive with audio
- New08-27Placement geometry - shrink on phones, keep the corner
- New08-27The narration-track rule - speaker wins over audio
Sharing & embeds4 new · 4 fixed · 4 faster
- Faster08-26Compress share bundles losslessly, and gate mobile on raw bytes
- New08-24Publish a story to a permanent /e/<slug> address
- Fixed08-20Release the audience defer for targets, and lift disclosure over the pano
- Faster08-20The chat brain loads with the chat, not with the viewer
- Faster08-20Select the authored-intent boolean, and pin the roots inside the boundary
- Faster08-20The geology renderers load only when a scene asks for them
- New08-12Refuse a hydrate this device cannot survive, instead of dying
- New08-06Stream the recipient's project download, with honest progress and resume
- Fixed08-12Sync optsRef in an effect, not during render
- Fixed08-12The upload progress row was inside a disclosure nobody had opened
- Fixed08-12Ask the size question before the mount-time auto-upload
- New08-08One obvious action, with options and embed behind disclosures
Cloud projects5 new · 6 fixed
- Fixed08-12The pre-compress ceiling was the wrong shape, not the wrong side
- Fixed08-12Bound the pre-compress budget by what the compress peak can survive
- New08-05Progress and cancel for a share-with-data upload
- Fixed08-05Lower per-project cap to 400 MiB and refuse over-cap saves BEFORE compressing
- New08-05Determinate upload progress with cancel
- New08-05Route saves and share bundles over 6 MiB through TUS
- Fixed08-05Plug abort-listener leak and honour cancel during the tus import window
- New08-05Resumable TUS upload transport with progress and cancel
- New08-051 GiB per-project cap with its own message, 1.5 GiB bucket backstop
- Fixed08-05Add test coverage for uploadShareBundle and openFromCloud error surfacing
- Fixed08-05Surface the real Supabase error instead of a bare Upload failed
Exports3 new · 7 fixed
- New08-04Render the 3D-view PNG at print resolution (1× / 2× / 4×)
- New08-11GOCAD TSurf writer + committed-snapshot export
- Fixed08-11Anchor drill-derived exports on project.center, not grid.origin
- New08-11Drill traces → DXF polylines, collars → CSV
- Fixed08-09The run owns activeId, hands it back first, and restores the LIVE scene
- Fixed08-09One claim, one export — a movie run can no longer start on top of a deck render
- Fixed08-05Add mutation-proven URL revocation test for the click-throws path
- Fixed08-05Cover the blobPartFor copy branch and error paths in saveBundleAction
- Fixed08-05The local .es3d download failed silently on any throw
- Fixed08-03A movie beat that turns the AI targets on baked its opening frames empty
Annotations7 new · 2 fixed
- New08-24Media annotations — photos and embedded YouTube on a scene
- New08-24Text blocks dim when the viewer moves off the beat's saved view
- New08-23Text blocks get alignment, leading, tracking and a glyph halo
- Fixed08-23A text block must establish its width, not merely cap it
- New08-23Text blocks get bold, italic and rotation
- New08-23Arrows expand in, pin across scenes; text blocks get width + a type voice
- New08-21A distance arrow is a third annotation kind
- New08-21The pure rules a distance arrow follows
- Fixed08-12An armed placement cannot drop into an export mid-render
Project files2 new · 1 fixed · 5 faster
- Faster08-30Omit derivable fills of stored-hidden layers - big decks fit phones
- Faster08-27Ship a hidden polygon fill as a marker, re-earcut it on demand
- New08-12Round-trip intensity+softness through core bundle twin + urlState share links
- Faster08-12The writer's terrain reference computes only what it compares
- Faster08-12Stop shipping a terrain lattice the heightGrid reproduces (phase 2, the writer)
- Fixed08-11Phase-1 review — same material, a witness that cannot rot, an honest comment
- New08-11The loader can rebuild a terrain mesh from its heightGrid (phase 1, reader only)
- Faster08-11Stop shipping vertex normals the loader regenerates exactly
chat3 new · 5 fixed
- Fixed08-20A throwing tool fails the turn instead of wedging the chat
- Fixed08-19The GIS count unit tells the truth, and the renderer checks filter kind
- New08-19Model_overview names the filterable GIS layers and their columns
- Fixed08-19GIS filter counts disclose their unit, and never claim "all shown" over a hidden layer
- New08-19Set_query_filter / clear_query_filter target a named GIS layer
- Fixed08-13Adversarial-review findings F1-F6 on set_query_filter
- Fixed08-13Reject conditions+intercept ambiguity; single project read in clear note
- New08-13Set_query_filter / clear_query_filter — NL drillhole filtering via the chat (drill-only v1)
anysize4 new · 2 fixed
- Fixed08-31Review round two - accounting, wire-cap headers, cover re-fire, export sweep + the pin battery
- Fixed08-31The review's confirmed critical + four load-bearing hardenings
- New08-30Mint the scene-peak - meta.data.peak rides every share link with beat snapshots
- New08-30Beat-scoped eviction - a walked deck's residency tracks the window, not the union
- New08-30Staged share-path load - measured re-verdict, selective inflate, wire cap
- New08-30Core wave - one defer policy, scene-peak facts, peak verdict, staged unpack
report-card5 fixed
- Fixed08-04Pin soft-label threshold, share the card's width cap, dedupe refusal qualifier
- Fixed08-04The fit card speaks the card's own vocabulary, and refuses on a frozen round
- Fixed08-03The band word carries its own rule when the legend clips
- Fixed08-03Close the yardstick's contradicting ranges, pin its copy
- Fixed08-03Band the printed number, not the raw AUC
Visual effects2 new · 2 fixed
- Fixed08-13No HDR lift where no bloom will run — plan/ortho and WebGL2
- New08-13Theme-aware outline/shadow defaults + glow probe re-pinned
- Fixed08-13Curve both hero ramps, and assert the glow still reads ore-gold
- New08-13The hero glow blooms and NOTHING ELSE does — threshold selectivity
Import & export2 new · 1 fixed
- Fixed08-27Pin the .es3d zip mtime so bundles are reproducible
- New08-11Multi-layer DXF writer, ACI colour, and one export frame
- New08-11Leapfrog .msh binary mesh parser
engagement1 new · 2 fixed
- Fixed08-27Close four holes in the guards that protect an opted-out viewer
- Fixed08-27File a settled cut against the right scene; make the notice guards structural
- New08-27Record settled section cuts and narration completions
App shell1 new · 2 fixed
- New08-23Ask and Report become icons stacked above the compass
- Fixed08-23Ask sits left of Report, and the float band spaces evenly against NavBox
- Fixed08-12Auto-reload once on stale-deploy chunk failures
publish1 new · 2 fixed
- Fixed08-22The trailing-slash form needs its own rewrite source
- Fixed08-22/e/<slug>/ with a trailing slash must not 404
- New08-22/e/<slug> is an audience route — the foundation for a stable embed pointer
project2 new · 1 fixed
- New08-21Merge drillhole CSVs into the loaded project
- Fixed08-19Null the project before wiping scales, not after
- New08-19Clear the drill data without destroying the workspace
scene-tree1 new · 2 fixed
- Fixed08-19Promise the grid outcome the clear actually delivers
- New08-19Clear the drill data from the layer panel
- Fixed08-19Don't strand the user after removing every drill row
Panoramas1 new · 2 fixed
- Fixed08-12An armed placement cannot outlive the run, the beat, or the panel
- Fixed08-12In-flight hotspot text survives an unmount — commit on change, not on blur
- New08-12The author may place, edit and REMOVE 360° hotspots in Present
descent3 fixed
- Fixed08-12An ungrounded chip is tested as a COLUMN, not skipped
- Fixed08-12A chip stands on the ground the READER can see, resolved once
- Fixed08-12Annotation altitude is an RL, and the clip gate comes back
Layers panel1 new · 2 fixed
- New08-12Streamline the layer panel to an institutional density
- Fixed08-08A colour-by mode the project cannot paint snaps back to one it can
- Fixed08-08Mint drill rows only for content the project carries
Other improvements16 new · 40 fixed
- Fixed08-31Review round one - the pose/pixel leak family + a11y + pins
- New08-31Portrait framing fit + phone chrome round two
- New08-30Fullscreen on handhelds, and Present chrome that yields to the model
- Fixed08-30Guard the rebuild chokepoint - three ways the adversarial review found to lose or double a fill
- Fixed08-30The SYNC save sweep must skip the fill-marker part too
- Fixed08-30Import deferredFill lazily in the pump - a static edge closed a module cycle
- New08-27Sensitivity sweep → story chapter
- Fixed08-27Keep agent and QC working directories out of the upload
- New08-23Say what the import options do, and give secondary databases real rows
- Fixed08-22The shaft must stop inside the head so the point is sharp
- Fixed08-2125 confirmed findings from the B/C/D adversarial review
- Fixed08-21The last five findings from the adversarial review
- New08-21Highlight composites as their own disclosed layer
- New08-21The format gate for highlight composites
- Fixed08-21Six defects from the adversarial review
- Fixed08-21Count intervals removed and added, never their net difference
- Fixed08-20Guard the deferred chunk, and make disabled Play legible
- Fixed08-20Arm the grade-anisotropy subscription through a guard
- Fixed08-19Removing every layer row no longer restores the drillholes
- Fixed08-194 final whole-branch review findings
- New08-19Drop drill filters without touching the GIS ones
- New08-13Render from an .es3d bundle, disclosing reconstructed layers
- Fixed08-13Honest selectivity bound, a gold check that can see the line, default 3
- Fixed08-13Share links follow HERO_INTENSITY_MAX; probe-veffects skips cleanly
- Fixed08-13Fold the ViewerHints '?' chip under the story cover
- Fixed08-124 adversarial-review findings on the zoom-near-clip change
- Fixed08-12Scene no longer vanishes on zoom-in — distance-adaptive near plane + null-island collar exclusion
- New08-12The Report pill in Present too — shared links and embeds included
- New08-12In-app bug reports — a Report pill beside Ask
- Fixed08-12The third .vercel.app alias was still minting links
- New08-12Transform gizmo — drag to move/rotate/resize a reference plane
- Fixed08-12Primary grade histogram bins over mergedRangeForElement
- Fixed08-12The length field never reads below what the scene is drawing
- Fixed08-12Stop DXF surfaces tearing, let bars go short, allow a 0 s scene
- New08-12Publish Terms, Viewer Terms and Privacy Policy; enforcement on
- New08-11Withhold exports and layer control from shared links and embeds
- Fixed08-11Never measure to a surface the slicer has erased
- Fixed08-11Production stamped 'nogit' into the compliance record
- Fixed08-10A grazed dot can no longer bake itself into an export
- Fixed08-10The dot gets its numbers back, and the probe visits the state it was blind to
- Fixed08-10The honesty chip gets its centre back — compass and callouts yield at 375
- Fixed08-10Extend past the last station instead of collapsing the hole onto its collar
- Fixed08-104 review findings — a probe that ships green, honestly
- Fixed08-09An export must not steer followers, and pin the scene-entry write
- Fixed08-09Photograph the scene being exported, and restore what the run changed
- Fixed08-08301 the deprecated .vercel.app aliases to exploration.rocks
- New08-08Font CDN links out, link-preview card in
- New08-08Vendor Inter, Spectral and IBM Plex Mono as first-party woff2
- Fixed08-08Never log renderer capability from an embed, and honour DNT
- Fixed08-08?intro=1 replays the hero on a machine that has already seen it
- Fixed08-08Four defects the adversarial review confirmed
- Fixed08-06Size the cap from a measurement, and stop flushNow dropping edits
- Fixed08-06Raise the cap to 500 MB and make every failure visible
- Fixed08-06Finish an interrupted content tween instead of abandoning it
- New08-03Persist the run's training composition for the report card
- Fixed08-02Four places where a check reported success it had not earned
July 2026 429 changes
GIS & terrain45 new · 31 fixed · 2 faster
- Fixed07-28The finest DEM owns the ground where terrains overlap
- Faster07-24Skip unchanged layers in the GisLayers apply pass
- Faster07-24Batch a transition frame's layer fades into one store write
- New07-24Categorical legend in Present — colour key for classified vector layers
- New07-24Categorical symbology for lines + polygons (per-vertex fan-out)
- New07-24Categorical symbology — colour a point layer by a string field (Wave D)
- New07-23Windowed + decimated ortho decode — never allocate the whole raster
- Fixed07-23Halve ortho-import peak memory — read bands, drop the interleave copy
- Fixed07-23Close the colorNode-override blast radius (geochem/grid rebake + dead code)
- Fixed07-23Post-hoc ortho/GIS drapes render grey — rebuild the clip colorNode
- Fixed07-23Stop orthos silently vanishing — honour declared alpha + warn off-terrain
- New07-22Stronger vector effects — soft falloff glow/shadow + bolder outline
- Fixed07-22List order drives GIS layer draw order (top of the list = in front)
- Fixed07-22Overlay linework no longer writes depth (crossover z-fight)
- New07-22FocusManyRequest — n-bumped bulk focus request + consume
- New07-22Render OUTLINE + drop SHADOW vector effects (effects E3)
- New07-22Render the per-layer GLOW effect (vector effects E2)
- New07-22Per-layer vector effect model + editor (effects E1, no render yet)
- New07-22Polygon outline on/off (show fill only)
- Fixed07-21Translucent DEM/topography/DXF surfaces no longer hide geometry beneath them
- Fixed07-21Persist line/polygon feature labels through save/reload (review fix)
- Fixed07-21Mount the label overlay for line/polygon layers (labelsShownFor)
- New07-21Enable Label-by for line and polygon layers
- New07-21Label-by menu reads per-feature props with a union of keys
- New07-21Render feature labels for line/polygon layers (kind-aware provider + per-feature keep)
- New07-21Build-time per-feature label anchors + property stash for lines/polygons
- Fixed07-21Labels inherit the layer's on/off (hidden layer hides its labels)
- Fixed07-19The remedy follows provenance, and the net that could see itself
- Fixed07-19The age message needs evidence — invert the default, mark the producers
- Fixed07-19The thematic surface, the directional remedy, and the net that was blind
- Fixed07-18The honesty layer around vector-source retention
- New07-18Drape or un-drape a vector layer after import
- Fixed07-19A rejected CRS entry can no longer be read as "translate only"
- Fixed07-19Detect geographic CRSs from the PARSED projection, and make the guard enforce its own rules
- Fixed07-18The drill wizard must refuse geographic CRSs — and a guard so the next one can't be missed
- New07-18Geographic CRS support for CSV imports + block CSV CRS prompt
- Fixed07-18Revert sentinel row-dropping; robust origin; drop lat/lon from this wave
- Fixed07-18Confirm the CRS instead of inferring it; sanitise coordinates ungated
- Fixed07-18A bad coordinate row can no longer move the sticky project grid
- Fixed07-18Make the CSV discriminators sound — order-independent, gated, plausible
- New07-18Thematic + natural-break classification for point layers
- New07-18Greyscale by default + selectable terrain themes
- New07-18Drape imported vectors onto terrain only when asked (default: keep as a layer)
- Fixed07-17Verify round 2 — fround the geophysics nodata sentinel to the band, throw-safe geokey/nodata reads, PixelIsArea coverage
- Fixed07-17Verify round — PixelIsPoint node truth, real-file geokey/nodata access, mutant-proof fixtures
- Fixed07-17One extent convention — node-centre origin/spacing explicit on GridSource
- New07-17Line styles — dash presets + display smoothing, screen == export
- New07-17Linked contour layers from grids (GRD wave 2)
- New07-16Hold 2D point markers at a constant on-screen size
- New07-152D marker polish — query-filter hides them + 2D outline/halo
- New07-15Finish label stack — colour + halo styles, manual on/off per point
- New07-152D camera-facing point markers, 2D by default (3D on toggle)
- New07-15Label declutter v1 — cap keeps highest-value points
- New07-15Per-layer point-label font size control
- New07-153D marker outline/halo (inverted-hull BackSide pass)
- New07-15Filterable point labels by an attribute rule (Stage 2 v1)
- Fixed07-153D marker shapes render distinctly + labels sit off the point
- New07-15Drape KMZ GroundOverlays onto terrain
- New07-15Import .kml/.kmz vector layers (WGS84) via the geojson path
- Fixed07-15Imported points render again — route through the proven 3D path
- New07-15Serialize/restore per-point properties so labels survive save/reopen
- New07-15Add per-point properties field to the bundle points-part
- New07-15"Label by" + "Max labels" editor controls
- New07-15Persist labelBy/labelMax through the .es3d bundle
- New07-15Render point labels as capped Html billboards
- New07-15Retain per-point property values for labelling
- New07-15LabelBy/labelMax fields + setters on GisLayer
- Fixed07-15Imported points invisible — billboard markers had a zero instanceMatrix
- Fixed07-153D point markers vanished — size sphere to the data extent, not px
- New07-15Marker symbology controls + live apply in the viewer
- New07-15Persist point marker symbology fields
- Fixed07-15Recognise billboard point markers when serializing GIS layers
- New07-15BuildPointMarkers — billboard shape markers + 3D fallback
- New07-15Marker symbology fields + setters on GisLayer
- New07-15Pure marker shape-atlas generator (7 shapes)
- New07-14Fill + outline opacity sliders for vector layers
- Fixed07-14Shapefile review fixes — batch resilience + store-zip + lone-.shp guidance
- New07-14Import loose shapefile sidecars (.shp + .dbf + .prj together)
Stories & presenting30 new · 20 fixed · 2 faster
- Fixed07-31The training sub-header matched the card, not the body text
- Fixed07-31One gate decides whether the training key prints, and tests pin it
- Fixed07-31The training-data key follows the points, not the tier rows
- New07-31The training data gets a key that states its rule
- New07-31A beat can carry the learning-points reveal
- Fixed07-30A filtered beat's drillhole subset was leaking into every later unfiltered beat
- New07-29A GIS-only project carries its Present story through save and reopen
- Fixed07-29The legend stack clears the figures column below it too
- Fixed07-29Apply queryFilters on the instant path too, via a shared helper
- Fixed07-29The legend fit spends slack it was hoarding a row at a time
- New07-29The ML targets finally have a key on screen
- New07-29Replay the targets reveal + threshold on both scene-apply paths
- New07-29The scene tier reveal + threshold survive the share/bundle envelope
- New07-29Capture the targets reveal + threshold in a scene snapshot
- Fixed07-29The deck headline survives a save and reopen
- Fixed07-25The legend stack can no longer climb under the narrative card
- New07-25The story cover quiets the intercept callouts and the NavBox
- Fixed07-25The cover-quiet cuts on the way out, and lands in the same commit
- Fixed07-25The story cover is a clean title card — the map furniture goes quiet under it
- Fixed07-24Measure the compliance band's reservation instead of counting rows
- Fixed07-24Calibrate the compliance strip's reserved row height to the measured 41px
- Faster07-24CSS dwell bar, reserved bottom bands, lazy overlays, busy surface
- Faster07-24Key the on-canvas GIS legends on a cheap fingerprint
- New07-23Drag-reorder scene rows + slide-sorter grid overview
- New07-23Shared scene-drag core (MIME + pure drop-index + edge scroll)
- Fixed07-23Mutually exclude the Ask dock and 3D-Layers flyout in the shared corner
- Fixed07-23Stack the Layers flyout above the NavBox (was hidden behind it)
- New07-23Mount the 3D Layers flyout in Present mode
- New07-233D Layers flyout component + layers icon
- New07-23Pure 3D-layers assembly selector + show/hide gate
- New07-23Read-only investor Ask in the distributed story
- Fixed07-23Duplicate Scene-name field when switching to a slide/CTA scene
- New07-23Unify — Cinematic motion + Chapter in the Story-tab scene editor
- New07-23Scene management — undo Update, rail-tile Update, duplicate scene
- New07-23Update button — re-frame a scene to the current view
- New07-22Carry author headline (storyTitle) in the share/.es3d envelope
- New07-22Hide in-scene chrome while the cover is up (clean hero takeover) + qc probe
- New07-22Default share links to carry the project (share-with-data)
- New07-22Wire live-model cover into PresentShell
- New07-22StoryCover redesign — lower-left lockup over the live model, optional Skip, no full scrim
- New07-22ViewController cover attract-orbit — establishing pose + slow orbit around scene 1
- New07-22CoverActive (viewsStore) + coverDismissed (uiStore) session flags
- New07-22CoverGeometry — firstCameraScene + establishingPose (pure, tested)
- New07-22Smooth scene transitions — pole-safe camera + label/leader fade on layer-hide
- Fixed07-22Review fixes — auto-play holds through the flight, robust reorder, tidy fields
- New07-21Reorder scenes, per-scene transition duration, Story-tab rename
- Fixed07-21Saved scene views no longer overwrite each other (id collision)
- Fixed07-09Guard the demo story by its populate-time stamp, not live project stats (war-room #2 review)
- New07-09Sample stories auto-populate — Present always opens playable (war-room #2)
- New07-07Section.geoTraces rides the scene snapshot + bundle round-trip (G5 W3)
- Fixed07-05Move the data legend out from under the narrative card (qc-confirmed P5 overlap)
- New07-04Plain-language story beats + a Present-mode qc capture (persona panel #12)
3D viewer12 new · 16 fixed · 6 faster
- New07-31An elevation (RL) scale — the viewer answers "how deep is it"
- Fixed07-25A mode switch must produce the camera it produced before the hoist
- Fixed07-25A renderer failure must not be terminal for the tab
- Fixed07-25AdaptiveDpr must RE-ASSERT the pixel ratio, not cache it
- Fixed07-25Hold the canvas slot in the Pro Suspense fallback + repoint the jsdom viewer mocks
- Faster07-25Hoist the Canvas above the Pro<->Present swap — one renderer per tab
- Fixed07-24The framing glide arcs around the content and always loses to a camera command
- Fixed07-24A drag no longer freezes hover — unhover on drag start, re-pick on release
- New07-24Framing glides instead of teleporting; slice drags and FPS reporting stop costing a frame
- Faster07-24Keep DOM-only hover/selection and chrome-only uiStore writes out of the render epoch
- Faster07-24No raycasts while the pointer is dragging, one pick per frame at rest
- New07-24PDF reference planes — rasterise a PDF page onto a plane in 3D
- New07-24Reference image planes — free-placed textured quads (Wave C)
- New07-23Fog of war — radial distance fog centred on the focus
- New07-22Persist depth-cue toggle + strength across reloads
- New07-22User-tunable depth-cue strength + subtler default
- Fixed07-22Stop camera drift after mouse release (disable OrbitControls damping)
- Faster07-21Delete CursorProbe — a per-frame full-scene raycast with no reader
- Fixed07-20An outlines-only polygon's fill stops picking, not just drawing
- New07-21Wheel zoom-to-cursor + middle-click recentre (Leapfrog reflex)
- New07-21IsTap predicate — stationary press→release vs drag
- Fixed07-19Near plane follows the VISIBLE envelope, so hiding a regional layer stops clipping the drill
- Fixed07-19A hidden layer stops picking, not just drawing
- New07-18Backdrop presets — Flat / Studio / Horizon
- Fixed07-18Slice terrain like everything else — keep the inside of the band
- Fixed07-18Derive layer bounds so the slicer sizes to imported terrain/surfaces/grids
- Fixed07-18Call vertexColor() — the bare factory blacked out every imported DEM
- Faster07-16Stop the billboard facer redoing identical work every frame
- New07-15User-settable viewport background colour
- New07-14Dismissible forward-looking statement + north-up compass reset
- Fixed07-13Stop three r171 InstanceNode from blanking the whole WebGPU frame
- Fixed07-12Frame the deposit on load so drill data is visible
- Faster07-12P1 drill-bar LOD — prism far-tier bucket (37.3M->13.2M tris, 7.6->30.7 fps @ 8k)
- Fixed07-01Triangle-align the cap buffer capacities — kills the NaN bounding-sphere warning
Core engine19 new · 9 fixed
- Fixed07-31A tiny non-zero share must never print as 0% or a cutoff as 0
- New07-31The training split and the sentence that states its rule
- New07-22GOCAD TSurf + legacy ASCII VTK surface parsers
- New07-22Stage-A field builder — minimum curvature + clip/blanking + buildGrid2D router
- Fixed07-21Strict-null-safe feature-anchor helpers (noUncheckedIndexedAccess)
- New07-21Per-feature label anchors — polyline arc-midpoint + polygon interior point
- New07-15Pure label density cap (capLabels)
- New07-12Additive .es3d barLogs config (types + sanitize + round-trip)
- New07-12Bar-log geometry math (value→length, azimuth outDir, over-cap)
- Fixed07-07CompositeIntervals/collectSamples bail on undefined segments — no uncaught 'segments is not iterable' from an async recompute after teardown (CI hygiene)
- Fixed07-07Topo datum-truncation gated on fill — cap-on/fill-off stays pre-Wave-A byte-identical, no logged rock shaved (Wave A re-review)
- Fixed07-07Topo cap truncates uncovered-DEM columns at a conservative fallback datum — fill no longer balloons above ground where terrain is missing (Wave A review)
- Fixed07-07Topo-cap SDF written in engine x-fastest order — cap no longer clips the wrong region on non-cubic grids (Wave A review CRITICAL)
- Fixed07-07Lone real domain's filled halo renders solid (phi=-sk) — mesh consistent with label + inferred volume (Wave A 2b)
- Fixed07-07Watershed neighbour min over OUTSIDE domains only — a co-inside older unit no longer holes a younger domain's constrained core (Wave A 2b)
- New07-07Watershed carved field grows domains to tile filled voids — logged contact internal, contacts/chronology/topo preserved (Wave A)
- New07-07Drill-envelope AABB + per-axis 10% expansion (Wave A)
- New07-07Per-domain type features (PCA tabularity/coherence) + type heuristic over aggregated intervals (AI geo-setup W1)
- New07-07Litho grouping heuristic + THE ASSAY-GUARD — protected ore-hosts never merged, borderline to protected (AI geo-setup W1)
- New07-07Per-litho grouping features + assay significance (metal share, above-cutoff share) (AI geo-setup W1)
- New07-07Assay-litho overlap join — hole+depth attribution grounding the assay-guard (AI geo-setup W1)
- New07-07FillLabelCells — per-label section fill triangles (G5 W1)
- New07-06SectionResolve2D — 2D chronology resolver matching the 3D carved fields (G5 W1)
- New07-06ChainContours — weld marching-squares segments into polylines (G5 W1)
- New07-06ConfidenceFromDrilling — pure per-vertex distance->confidence for the G3 confidence fade (G3 W1)
- New07-06HonourRate part 2 — hit/miss counter with skipped/unmappable/outside-grid exclusions + per-domain support (G3 W1)
- Fixed07-06ExplodeLayout stack centers on actual ranks + edge-case tests (G4 W1 review)
- New07-06ExplodeLayout — pure explode-factor→per-domain offset (radial+stack) (G4 W1)
Exports7 new · 10 fixed
- Fixed07-25Block the mode switch while a movie export is running
- New07-23Mux per-scene narration into the exported movie
- New07-23Optional AAC/Opus audio track on the WebCodecs encoder
- New07-23Narration planning/mixing + decode to mono PCM
- New07-23Hold each scene for max(durationSec, narrationSec)
- New07-22Fade labels + leader lines between scenes in exported video
- Fixed07-22Deck + fallback follow scene array order, not isCover hoist
- Fixed07-19The local pass is not skipped in the 101-199 band; stacking words follow every measurement
- Fixed07-19The surface classifier is ADVISORY — it recommends, it never suppresses the dialog
- Fixed07-19Read solids against their OWN footprint; stop dedup eating real area; drop two false claims
- Fixed07-18Delete the watertightness signal; a skipped measurement can no longer read as ground
- New07-18Subsurface solids import as 3D meshes; terrain is a choice, never automatic
- Fixed07-18SOLID stream↔parser parity — read e.points, triangulate the bowtie order on both paths
- Fixed07-18Stream mid-size DXFs (threshold 256MB→48MB) to prevent parse-time OOM; stream/parser geometry parity
- Fixed07-18Scope MESH recovery to the ENTITIES section (drop block-definition MESH)
- Fixed07-18Import polyface meshes + MESH entities as surfaces (were dropped to 0 triangles)
- New07-09Burn the compliance strip into PNG + movie exports (war-room #5)
App shell11 new · 5 fixed · 1 faster
- Fixed07-24The busy card must show BEFORE the freeze, and keep its label
- Fixed07-24Text fields keep native drag-and-drop; the wasm warm swallows its own failure
- New07-24Delay-in and minimum-visible on the busy indicator
- Faster07-24Dedupe setHover at the setter and split the Hud into leaf subscriptions
- Fixed07-18Stack the Backdrop control so "Horizon" isn't clipped; add verification probes
- New07-14Custom HEX-first colour picker (replaces the native OS swatch)
- New07-12Persist downhole bar logs into .es3d (save + restore)
- New07-12DownholeBarLogs renderer + pure instance builder, mounted in Scene
- New07-12BarLogStore — configs, lifecycle seeding, bundle mappers
- Fixed07-11Final-review fixes — mode-aware NavBox, keymap dialog guard
- New07-11Wave 7 — warm-quartz light viewport, resizer a11y, polish residuals
- New07-11Wave 5 — left rail intent groups + first-run/empty-state honesty
- New07-11Wave 4 — Viewer card: junk drawer -> titled groups, control grammar, one help surface
- New07-11Wave 3 — story rail P0 fix, honest thumbnails, +Add menu, delete undo, bottom-band layout
- New07-11Wave 2 — Present-mode chrome integrity (P0) + TopBar redesign + Present keyboard nav
- New07-10Wave 1 foundations — tokens, primitives, consistency sweeps
- Fixed07-09Serve favicon.ico, apple-touch-icon.png and robots.txt (war-room pre-flight 404 hygiene)
Importing data8 new · 9 fixed
- New07-24Per-terrain ortho draping — target the chosen/best-fit terrain
- New07-24Per-file detail control for DEM + orthophoto fidelity
- New07-22.ts (GOCAD TSurf) + .vtk land as surface GIS layers
- Fixed07-20TIF DEM node-centre placement — share one geoTiffNodeGeometry producer
- Fixed07-17F32HeightGrid frounds noData with the data; seam-test docstring states its honest scope
- Fixed07-17Verify-minors pile — tighter GRD acceptance, honest near-miss, real shas, no NaN terrain
- Fixed07-17Final review round — drape triage restored, polygon fills follow the filter
- Fixed07-17MapInfo TAB review fixes — attributes reach the layer, .MAP header owns the CRS, binary hardening
- New07-17MapInfo TAB vector sets — claims and tenure open natively
- New07-17Double-precision binary .grd flavour — the second contractor GRD dialect opens natively
- New07-17Content-aware DXF topo — contours/TIN become terrain, linework gets honest simplification
- Fixed07-17GRD review fixes — f32-exact dummy sentinel, honest .gi clamps
- New07-17Geosoft GRD — parser + drape/terrain routing (wave 1)
- Fixed07-13Correct triangular 3DFACE + crop-on-ingest for streamed DXF
- New07-13Stream large DXF DEMs past the 512MB string cap
- Fixed07-06Honest empty/partial import messages (AOI mis-attribution + planned-holes partial) + disclosure uses CLASSIFICATION_MIN_HOLES (retro review)
- Fixed07-03Surface the ten silent secondary-import failures (persona panel #10)
Drill data11 new · 4 fixed · 1 faster
- Fixed07-25Reproduce drei's LINEAR z-index, box-cull, and stop hiding ids over live core
- Faster07-25One container for the hole-id labels, not 600 <Html> roots
- New07-22Per-DB bar-log editor in DrillDbEditor (Wave C3)
- New07-22ExtraDownholeBarLogs — histogram combs per secondary DB (Wave C2)
- New07-22Per-DB barLogsEnabled + barLogs in DrillDbStyle, sanitized (Wave C1)
- New07-22Hole search spans secondary databases (Wave C4)
- New07-22Center-in-view + reorder for secondary DB rows (Wave B4)
- New07-22Secondary top-intercept parity + wider control ranges (Wave B3)
- New07-22Per-DB collar/trace label toggles (Wave B2)
- New07-22Per-DB independent traces/assay/litho parts + litho radius (Wave B1)
- New07-22Per-DB filter UI — each secondary database gets its own filter control
- New07-22Per-DB query filter reaches secondary DBs in render + store
- Fixed07-22Stable secondary-DB ids + sourceCrs round-trip (reopen-corruption fixes)
- Fixed07-09War-room #3 — disclosed cutoff composite, not lowest-baseline smear
- New07-05Screen-space callout declutter (persona panel #5, layout half)
- Fixed07-05Downhole qualifier + selection-rule disclosure on the callout cards (persona panel #5, disclosure half)
Panoramas16 new
- New07-24Tour polish — hotspot drag-reposition + Present auto-pan (Wave A)
- New07-24In-app pano image upload — render from blob + embed in .es3d (2c)
- New07-24Pack/unpack uploaded pano images in .es3d (2c)
- New07-24Pano.assetId type + setPanoImageAsset + link persistence (2c)
- New07-24IndexedDB store for uploaded pano images (2c)
- New07-24360->360 jump hotspots + target picker (2b-3)
- New07-24Media hotspots — image/PDF/video overlays on Dialog (2b-2)
- New07-24Hotspot authoring in the scene editor (pin/info)
- New07-24Projected hotspot markers + sphere-click placement (pin/info)
- New07-24Persist hotspots in share links + .es3d
- New07-24Scene hotspot data + store actions
- New07-24Pure hotspot anchor + id helpers + SavedView field
- New07-23Persist the landing viewpoint in share links + .es3d
- New07-23Set viewpoint / Clear controls in the pano scene editor
- New07-23Glide to the saved viewpoint on entry + publish live pose
- New07-23Saved-view data + pure landing-glide + live-pose singleton
Labels11 new · 4 fixed · 1 faster
- New07-22Box stroke (colour + width) + legible shadow, screen==export
- New07-22Opt-in box + text styling on drill-intercept callouts (wave 3)
- New07-22Story-markup notes/hotspots adopt rich text + box (wave 2)
- Fixed07-22Multiline in the rich editor — native Enter + recursive runs parse
- New07-22Per-character rich text — chip spans, per-run export, contenteditable editor (wave 1)
- New07-22Rich-text runs core + resolve + persistence (wave 1, foundation)
- Faster07-22Update a chip's appearance IN PLACE, never rebuild the overlay
- Fixed07-22Declutter accounts for glow/shadow painted extent (review finding 4)
- Fixed07-22Review fixes — typeable editor, honest effect export, robustness
- New07-22Map/PNG export renders per-label overrides
- New07-22Edit icon on each chip + LabelEditor popover
- New07-22Render per-label overrides on the chips
- New07-22Persist labelOverrides through .es3d, share links, and scene snapshots
- New07-22Box + chip-effect fields on LabelOverride
- New07-22Per-label override data model + sanitizer + store actions
- Fixed07-19A filter change now reaches the labels; a fade change now reaches the screen
w34 new · 4 fixed
- Fixed07-24Palette Model-section rows tell the truth about sections with no data
- Fixed07-24Escape undoes the clip envelope draw-slice armed, not just the AOI box
- Fixed07-24Drop dispatch claims on an explicit marker, not defaultPrevented
- Fixed07-24Layer filter — no dead-end panel, and Shift-range follows the filtered rows
- New07-24Filter box on the Layers tree, and a gate on 'Clear imported'
- New07-24Ctrl+K command palette, and Escape that disarms before it closes help
- New07-24Glassy panel resize, drop-anywhere import, AOI panel selector
- New07-24Pure cores for panel-drag, palette ranking, escape cascade, tree filter, import hand-off
Import & export3 new · 5 fixed
- New07-21EsriPrjEpsg reads the OLD ArcInfo .prj keyword form for UTM
- Fixed07-18Verify follow-up — positive-flood sentinel, 32767 user-defined CRS guard, per-band void predicate
- Fixed07-18DEM+imagery geoKeys/CRS + GDAL_NODATA revival with fround + multi-format sentinel masking
- Fixed07-18Robust GeoTIFF raster reader — decode Deflate/LZW/tiled tifs geotiff.js chokes on
- Fixed07-18BIL CRS-confirm flow, content-sniff .grd dispatch, .prj EPSG prefill
- Fixed07-18Content-sniff grids, correct Encom .grd message, add BIL/HDR DEM reader
- New07-15KMZ container reader (parseKmz -> vectors + resolved GroundOverlays)
- New07-15Dependency-free KML vector parser + GroundOverlay extraction
perf5 new · 3 fixed
- Fixed07-10Harden probe toggle-confirm + honest fxState + measured rest dt; HUD rolling-window present-rate
- New07-10Scale-sweep perf-baseline probe + npm script
- New07-10Dev-only ?perf=1 live GPU-cost HUD
- New07-10Snapshot renderer.info onto renderLoopStats at both present sites
- New07-10Pure perf-stats helpers (captureGpuInfo, computeRates)
- Fixed07-01Close the GPU-01 review findings — pointer-driven dirt + AdaptiveDpr presented-gating
- Fixed07-01Quantize the static-skip signature + add DirectRenderGate for the no-FX path
- New07-01GPU-01 — skip the whole render when the scene is static (idle GPU rest)
Statistics6 new · 1 fixed
- Fixed07-22Source picker on its own row — protect the '· filtered' honesty cue from truncation
- New07-22ProjectStats counts follow the selected DB source
- New07-22GradeHistogram reads the selected DB source; cap gated to primary
- New07-22StatsSourceSelect — compact DB picker, hidden when single-DB
- New07-22UseStatsSource hook — primary/secondary read-model
- New07-22Persisted uiStore.statsSource slice
- New07-22Pure source resolver + descriptor type for multi-DB stats panels
classification4 fixed · 1 faster
- Fixed07-30A NaN sample corrupted the bucket index; a flat slab froze it
- Faster07-28Exact bucket index for the nth-hole sweep — 47x, bit-identical
- Fixed07-03Honest control tooltips + suggest the LOWEST material class (persona #6 residue)
- Fixed07-03Restore drillhole attribution end-to-end — the multi-hole metric was silently defeated (review 2026-07-03)
- Fixed07-03Stop minting Measured tonnes from single holes (persona panel #6)
xray4 new · 1 fixed
- New07-24Per-scene X-Ray snapshot (Wave B)
- Fixed07-23Persist GIS solid/surface x-ray in the bundle + bump opacity to 0.5
- New07-23Drill editor toggle + visibility sync + GIS solid/surface x-ray
- New07-23Drill-trace occluded pass, wired + persisted + mechanism proven
- New07-23Shared occluded-pass material + overlay builder
Layers panel4 new · 1 fixed
- New07-23Drag-reorder honours the multi-selection too
- Fixed07-23Per-row drag + visibility honour the multi-selection
- New07-22Zoom-to-selection on the multi-select bulk bar
- New07-22Bulk Hide/Show/Remove on the multi-select + hover-revealed checkboxes
- New07-14Rename any layer (drill sub-layers, drill DBs, GIS) inline
Slicing & sections4 new · 1 fixed
- Fixed07-21Slice-envelope thickness can reach 0.1 m (was floored at ~50 m)
- New07-13Shift+D keyboard shortcut for Draw slice
- New07-07SectionGeoTraces — exact contact lines + filled lithology polygons (G5 W2) [HOLD]
- New07-07GeoTraces/lithoLog flags + autoSection action (G5 W2)
- New07-07SectionGeoField — exact geo contact traces + fills on the section plane (G5 W2)
Sharing & embeds1 new · 4 fixed
- Fixed07-17Verify minors — fold data.url into the shared URL policy + typo-aware wording
- Fixed07-17Mint-time URL warnings — the author sees what the recipient loses
- Fixed07-17The views array gets the same field-validation the meta envelope has
- Fixed07-06Cache the share-with-data upload per modal session — stop re-uploading the dataset on every cosmetic option change (retro review)
- New07-03Share-with-data — the investor link carries its dataset (persona panel #2)
Cloud projects1 new · 2 fixed · 1 faster
- Faster07-24Keep @supabase off the first-paint path — lazy client, pure cloudConfig
- Fixed07-22Allow Save to cloud without a drillhole DB (GIS-only projects)
- Fixed07-13Make the save-name / rename durable (name lived in two places)
- New07-13Name a project on save + rename existing cloud projects
autosave4 new
- New07-23Wire init, recovery banner, and clear-on-save/load/new
- New07-23Recovery banner (restore/discard on load)
- New07-23Driver — subscribe project stores, debounce, snapshot to slot
- New07-23IndexedDB recovery slot + pure idle-debounce scheduler
lines4 fixed
- Fixed07-21Blend ALL fat lines, not just dashed — solid twins too
- Fixed07-18Own the fat-line output — normal blending, coverage+opacity in alpha
- Fixed07-18Route fat-line dash coverage to alpha, not the viewport-snapshot branch
- Fixed07-18Antialias the dash pattern — analytic coverage + minification fade
barlogs3 new · 1 fixed
- New07-13Billboard bar logs track the camera continuously, not just on settle
- Fixed07-13Floor the log axis in manual mode + guard the over-cap rim
- New07-13Discover-style downhole histogram combs (interval-spanning slabs)
- New07-12Deposit-relative default width + render-epoch wiring + qc view
save2 fixed · 1 faster
- Fixed07-24An off-thread pack/unpack must always settle
- Fixed07-24The raw size pre-check is a work budget, not the cap
- Faster07-24Weigh the bundle before compressing it, and inflate/deflate off-thread
boot1 fixed · 2 faster
- Fixed07-24Stop share links preloading ProShell, and stop a stylesheet deferring the hint
- Faster07-24Embeds skip auth+autosave, warm the wasm on idle, stop stray drops eating the session
- Faster07-24Preload ProShell, bootstrap the theme inline, unblock first paint from Google Fonts
geophys3 new
- New07-22Colour Grid presets (Discover 'Current Settings')
- New07-22Colour Grid section + interactive sun-position dial (Discover-style)
- New07-222D geophysics contours Model section
topo1 new · 2 fixed
- Fixed07-17Analytic height sampling — the DEM freeze was O(columns × triangles) raycasting
- Fixed07-13Review fixes -- max float parity + clear stale simplify note
- New07-13Stream large .asc/.xyz topo imports past the 512MB string cap
General3 new
- New07-09Surface the geology on sample load + story beat + chip (war-room #6)
- New07-09War-room #4 — establishing shot + auto-ghost terrain
- New07-09Demos pass their own honesty badge — declare sample CRS + one-click Declare CRS (war-room #1)
Other improvements15 new · 34 fixed · 2 faster
- Fixed07-30Three verified defects — build_model note, GIS-only reopen leak, unfailable probe
- Fixed07-30Close three lifecycle gaps in the DEM cover mask
- Fixed07-29Clear the autosave slot from a leaf, not across the projectStore cycle
- Fixed07-28Build_model arms a plan for the user to confirm — it no longer builds
- Fixed07-25Guard the cover probe's server; quiet the strat key; one adopter roster
- Fixed07-25Correct a false pointer-events rationale; fix the probe's spread denominator
- Fixed07-25Font-serif was a no-op app-wide — quote "Source Serif 4"
- Fixed07-24Self-review pass on the review fixes
- Fixed07-24A failed SDK chunk load no longer disables auth for the life of the tab
- Faster07-24Commit an AOI face drag once per frame instead of once per pointermove
- Fixed07-22Replace raw NUL bytes with u0000 string escapes in DataPanel + lithoSetupAdvisor
- Fixed07-22Draped soil-band editor reachable via Colour grid + Wave 2 probe
- New07-22Confidence wash for interpolated soil-geochem surfaces
- New07-22Synthetic Magnetics TMI grid draped on the demo terrain
- Fixed07-22Extract samples from rendered geometry, not sourceVector
- New07-22Soil geochem contours Model section — minimum curvature + clip
- Fixed07-19Close the two rejected-CRS bypasses, and stop claiming a guarantee we don't provide
- Fixed07-19Close round-2 review — real coverage for backdropNode, ortho depth-cue + ray fixes
- New07-18Branded ES3D magic-link + confirm-signup emails
- Fixed07-18Never emit NaN vertices for nodata holes — omit hole triangles instead
- Faster07-17Wave 8 — the embed stops downloading the workbench
- Fixed07-17Wave 3 — the compliance record stops asserting parameters that never governed
- Fixed07-17Wave 5 — CI proves the wasm, the AI proxies stop being a blank cheque
- Fixed07-17Waves 4+7 — exact-cutoff truth, de-tautologied guards, docs that stop lying
- New07-16Investor-clean column headers — elementDisplayName with the canonical unit
- Fixed07-16Wave 1 review — I made the deck worse, and two guards didn't hold
- Fixed07-16Unit truth — kill the 10,000x roll-up and the competing resolvers
- New07-15Remember point-label on/off per scene + fade labels on transition
- New07-15Where-to-drill tool — suggest_drilling reports the trained targets
- New07-15Agentic Ask v1 — build models from chat (build_model tool)
- New07-14Allow saving/opening a GIS-only .es3d project
- Fixed07-14Survive-rename-on-rederive + clean FLS strip collapse
- Fixed07-14Don't let a blank dip/azimuth input zero the orientation
- New07-14Edit a detected fault's dip / dip-azimuth
- Fixed07-12Use themed signal token for pathfinder role chip
- New07-10Backlog #1 — prove which data the audit record audits
- New07-09Shared-story engagement pipeline — story_events schema, DNT-respecting telemetry, consent notice, owner card
- New07-09Soften establishing camera + make geology opt-in
- Fixed07-07Debounce section geo-field on plane settle + persist litho-log toggle + topoSdf length guard + gate auto-section on a built model (whole-branch review)
- Fixed07-06Never show a stale honour-rate mid-rebuild + confidence-fade toggle + CB-safe misses + honest not-applicable message (whole-branch review)
- Fixed07-06Clear reveal/explode channel per export scene + aria-pressed toggles + clear-on-disable (whole-branch review)
- Fixed07-06Outward-winding for marching cubes + honest module doc (review w53u04tx7)
- Fixed07-04Wrap azimuths at import + group the warning flood (persona panel #8)
- Fixed07-03Stop the vein demo's planted anisotropy leaking onto real data + close the badge/copy residuals
- Fixed07-03Purge misleading investor-facing copy (persona panel #4)
- New07-02Three demo deposits behind the Load-sample menu + a stress-scale CSV generator
- Fixed07-02Root-cause the honeycomb (wasm spheroidal bug, isoLab-pinned) + deposit-true vein anisotropy
- New07-02The FX-options wave — filmic grading trio + contact-sheet-tuned presets
- Fixed07-02Span-grade the 10 m default + scale-consistent polish (review-measured fixes)
- Fixed07-01Terrain texture filtering + brand-compliance chrome (P2, board-verified)
- Fixed07-01Close 2 criticals (XSS + a11y focus) + remove brand-illegal hero glow
June 2026 20 changes
3D viewer8 new · 1 fixed
- New06-29W5 slicer lock-to-camera (Ctrl+L) + orient-to-view (Ctrl+V)
- New06-29Leapfrog mouse navigation (right=zoom, middle/both=pan)
- New06-29Draw-plane-line tool + properties panel (Leapfrog W4 Task D)
- New06-29Moving-plane render + look-at camera (Leapfrog W4 Task C)
- New06-29Moving-plane store + keymap bindings (Leapfrog W4 Task B)
- New06-29U3 static story fallback for no-GPU machines (preview-hold)
- New06-29U2 passive renderer-capability probe + graceful telemetry
- Fixed06-29Branded card on total renderer-init failure (no silent black screen)
- New06-29CameraNudge request + 'all' focus tag — Leapfrog nav W2 T2
keymap3 new
- New06-29Leapfrog slicer parity — axis/centre/step/look/thick/remove (W3)
- New06-29Leapfrog camera parity — arrow-rotate/pan/zoom/Home/P-O (W2 T3+T4)
- New06-29Declarative keymap registry + data-driven help legend (W1)
Other improvements6 new · 2 fixed
- Fixed06-30Gate GeoTIFF-DEM button on the real in-memory raster, not persisted config
- Fixed06-30Resolve 6 adversarial-review findings before prod (W5 + GeoTIFF + analytics)
- New06-29One-click PPTX investor deck (Export → Deck)
- New06-29Renderer-telemetry readout (owner stats card over the U2 events)
- New06-29Export → GeoTIFF (georeferenced DEM raster for QGIS/ArcGIS)
- New06-29Moving-plane orientation math (Leapfrog W4 Task A)
- New06-29U4 device-tier budget scaling — coarsen builds on weak HW, unchanged on capable
- New06-29Pure orbit-nudge math (rotate/pan/dolly) — Leapfrog nav W2 T1
npm run docs:whatsnew).
Entries are engineering changelog subjects, lightly filtered; internal-only work is omitted.