RELEASE HISTORY

Everything that changed.

Every version from the first board to today, with what it added and — where it matters more — what it fixed. Currently live: V 2.36 of 25.08.2026.

BACK TO THE BOARD
  1. V 2.36

    25.08.2026

    The motion-control rail turns on a ring, and cannot leave the floor.

    • Click the rail and the rig is in hand; switch to the turn tool and it wears one flat ring, on the floor, centred where the rail actually pivots. Swing the ring and the rail, the carriage and the whole arm come round with it.
    • One ring, not three, and that is the constraint rather than a simplification. A rail lies ON the ground: pitch or bank would lift it off, so those two are not offered at all instead of being offered and then refused. Turning about the upright is the only rotation a rail has, so it is the only one there.
    • The turn was always possible — by holding shift while dragging the rail, which is a thing you either knew or did not. The shift-drag still works. This is the same move with the modifier taken off it, and it starts the very same turn underneath: one idea of how far the rail has swung, one clamp, one place for it to be wrong.
    • No arrows on the rig. The rail is laid along the route and then pushed ACROSS itself — one degree of freedom, which the drag already has. Three arms for one number would be two arms that do nothing.
    • RECENTRE on the rig puts the rail back on the line the route asks for: no push, no turn, and the pinned rail let go so it is fitted afresh.
    • Worth knowing, because it is a real limit and not an oversight: the CARRIAGE cannot be turned on its own. The arm is solved in the upright plane through the base and the camera, and the carriage runs to the point of the rail nearest the camera — so where it sits and which way it faces are worked out from the shot, not set by hand. Turning it independently would mean an arm that can no longer reach where the route says the camera is.
  2. V 2.35

    25.08.2026

    The squared floor is a handle: the whole set slides, lifts and tips.

    • Tap the floor in STAGE 3D and you have hold of the set. The arms slide it and lift it, two rings tip it — pitch and bank, not three, because spinning a square grid about its own upright turns it into the same square grid. Tap again to let go. A DRAG on the floor still orbits, as it always did: four pixels of travel is the line between the two.
    • Everything standing on the floor goes with it — blocks, route, camera, the reference board — because they are all measured against the floor rather than against the frame.
    • It does NOT change the shot, and that is worth being precise about rather than hoping. The camera travels the route through the set, so when the set moves the camera goes with it and the film that comes out is frame for frame identical. The test suite measures exactly that across every placement and five points of the move: zero difference, not nearly zero.
    • The way it is built is the reason the handles stay glued to what they move. Placing the set in front of a fixed viewer and moving the viewer around a fixed set are the same rigid motion read from two ends, so the transform is undone on the ONE thing that is not part of the set — the eye — instead of being applied to the floor, every block, every route sample, the plate, the rail and each of the handles separately. Any version that transformed the drawing and forgot one of those would leave a gizmo half a metre from its object. The suite pins the equivalence at 564 projected points: the worst disagreement is four hundredths of a nanometre of screen.
    • A FRAME SIZE slider sits under LOAD A FRAME now, as well as in REFERENCE BOARD. The moment you want that number is the moment the picture turns up at the wrong size, and that moment is at the load key, not four folds away.
    • DISPLAY leaves the lens inset alone. It is not furniture like the handles are — it is a second camera, and someone showing a move wants to show what the lens sees. It has its own key above the picture. D is in the controls list now, which is where it should have been from the start.
  3. V 2.34

    25.08.2026

    The subject mark is in the 3D set, and everything in it takes the same handle.

    • LOCK ON SUBJECT changed what the camera did and drew nothing in STAGE 3D. The plan view has always shown the white cross; the 3D view showed an empty floor, so the one thing you needed to see in order to trust the lock — what it had locked onto — was the one thing missing. The mark is now in the set, at the height the camera actually aims at, with a dropper to the ground so you can read where it stands.
    • That height was a bare 1.4 written inside the camera code and nowhere else. It is a named constant now, the target carries its own when you set one, and the share route keeps it — before, a link sent with the aim on a face arrived aiming at a chest, silently. A new test suite pins the thing that matters: the mark is on the aim ray from wherever the camera is, at every height, at every point of the move. It also pins the opposite mistake, that pan and tilt still trim the lock rather than being swallowed by it.
    • The mark is picked with a click and moved with the arrows: across the floor, or up and down to change the aim height. It is deliberately not draggable by the body like a prop is. It spends its life hanging over the very figure you are trying to grab, and a shot quietly re-aimed by a stray drag is a bug you find in the take.
    • Blocks — props and figures — now take the arms and the ring too. They could always be dragged loose across the floor and still can; this is the accurate way, one axis at a time. They get the flat ring alone, because a block has a facing and nothing else: offering a ring that turns nothing is worse than offering none.
    • The handle key now shows the tool you would GET, not the one you have. A key that pictures its own state is a label; a key that pictures its effect is a button.
    • A RECENTRE key, third in the row. Whatever is selected goes back to where that kind of thing starts — place and facing, never size, so sending a piano home does not un-resize it. The starting places were three copies of the same numbers in three files; they are one set of constants now, which is the only reason the key can promise what it promises.
    • DISPLAY, on the D key and in the controls. The viewer with the instrument taken off it: the floor, the yellow line, the camera and the blocks. Handles, labels, the readout, the rail, the reference board and the corner keys all go. The lens inset stays — it is not furniture, it is a second camera, and it has its own key above the picture. It is a viewer switch, not a plan one — not saved, not shared, and it does not change what RECORD produces.
    • The transport moved above the timeline. PLAY and RECORD are what you reach for while watching the shot, and the ruler was sitting between the picture and the keys.
    • The take length is a slider in the corner of the picture now, as well as in the panel. It is the one number you judge by eye and then want to change, and opening a fold to reach it loses the thing you were judging. Two seconds is the floor, not zero: the share route refuses anything shorter and a take of no length has no frames.
    • The first press of PRO opens STAGE 3D. It arrives as a tab that was not there a moment ago, which is how someone turns the feature on, sees the same plan view, and decides the switch does nothing. Only the first press.
  4. V 2.33

    25.08.2026

    The last traces of the platform this app was generated on.

    • V 2.25 said the generator's furniture was all gone. It was not. Five things survived that pass, and this is them: a cover-image field in the page metadata pointing at a file on the generator's CDN, under another user's account; an environment name and an app slug declared and filled in on both server adapters, which nothing has ever read; the same two as committed variables in the Cloudflare config; and a page of comments in that config describing a deploy pipeline that stopped existing when the app left the platform.
    • None of it did anything — every one of them was dead — but a config that explains how somebody else's CI will overwrite it is a config that lies to the next person who opens it. The comments now describe what actually happens, and the Worker is called shot-block rather than app-slug-placeholder.
    • The V 2.25 entry is left as it was written. It was wrong about being finished, and a log that quietly edits itself is worth less than one that admits the second pass was needed.
  5. V 2.32

    25.08.2026

    The homepage plate is a real dolly on real track, not a render.

    • The plate behind the front page was a computer-generated set seen from above: invented gear, invented track. It is now a photograph — a stainless camera dolly on aluminium track, a cinema camera on a fluid head, two spare primes and a coiled cable on the floor — shot from high up in a near-black studio with one hard source. The yellow arc and the tick marks stay: they are the whole point of the picture.
    • It carries no lettering anywhere. Machines in shots like this wear badges and focus scales, and a hero that reads someone else's brand name is the one thing a hero must not do.
    • The plate is now 2:1 instead of 3:2, and that is the part that matters. With the right edge pinned, a wide plate gives up its empty left edge when the window is short; a narrow one is cropped top and bottom instead, and the arc lives in the lower half. On a 1440x700 window the old shape lost nearly all of the arc; this one keeps it whole, and on a phone the same crop lands on the camera head.
    • On a phone the plate is cropped to a vertical slice, and pinned to the right that slice landed on the push bar with the camera off the corner. It is nudged to 78% across on narrow screens, which is where the slice centres on the camera with the arc still over the top.
    • The wash over it is lighter, and now reaches zero. It used to run 94% down to 28% and stop there, holding the plate down; this one arrives dark of its own accord, so the wash was taking away picture rather than glare. It is down to what the copy needs and gone entirely by three-fifths across.
  6. V 2.31

    22.08.2026

    STAGE 3D opens on the stage, not on the reference board.

    • The angle the 3D stage opened at put the reference board square across the middle of the frame with the whole set behind it, so the first thing you saw on pressing STAGE 3D was a photograph rather than a stage.
    • The new angle was measured, not chosen by eye. Every combination of distance, height and bearing was projected; the board's outline and the things that matter — the figures, the props and the camera at five points along the move — were put on screen; and every angle that hid any of them behind the board, or pushed any of them off the edge, was thrown out. The whole board has to be IN the picture, not merely in front of the lens. Of what survived, this one covers a seventh of the frame with the board upstage and spreads the action across half the width.
    • It is only where the stage OPENS. Turn it and the angle is yours — nothing resets it under you.
    • The test scene now opens at the same angle, instead of its own.
  7. V 2.30

    22.08.2026

    The rail holds still and the arm reaches for the camera.

    • THE RAIL NO LONGER MOVES WHEN THE MOVE DOES. It used to be re-fitted to the route on every edit, which meant nudging one mark slid the whole track sideways underneath the rig standing on it — the tail wagging a very heavy dog. The first one is still placed by fitting it to the move; after that it is a physical thing on a floor, and it moves when somebody moves it. Dragging it by hand works exactly as before.
    • AND THE ARM RUNS OUT TO REACH. Move the camera anywhere and the three segments telescope to put the hand on it, keeping the proportions the sliders set — so it stays the shape of the rig it is meant to be, rather than becoming a different machine with one enormous segment. It draws in as well, which matters: a chain whose longest segment beats the other two put together cannot fold small enough to bring its own hand in close, and drawing in proportionally shrinks that blind ball with it.
    • "ARM SHORT BY" is gone, and the fact behind it is not. The arm now reports its own length against the rig's nominal size — the scene writes ARM OUT TO 4.80M — RIG IS 3.40M and the panel says how far past the sliders the move pushes it. A shot needing five metres of arm from a three-metre machine is still worth knowing; it is just no longer a broken drawing.
    • Measured: at four different slider settings, including one far too small and one lopsided enough to have a three-metre blind spot, the hand lands on the camera to the last decimal on every frame of the move — and every segment is its slider value times the same run-out, so the shape holds.
    • Fixed a test that had started passing by not running. The check that the hand lands on the camera used to skip any frame the arm could not reach; when the arm became one that always reaches, the property it skipped on stopped existing — and `!undefined` is true, so it skipped every frame and passed having measured nothing. It now counts the frames it measured and fails if that is not all of them.
    • Full screen inside the frame: the board now asks the page for it when it is refused. The refusal is not the iframe's `allow` attribute, which the host does set — it is the host's own Permissions-Policy, which grants full screen to its own origin alone and cannot hand out more than that for ours. The host can always fullscreen its own iframe, so the board asks with a message rather than faking it: `position: fixed` inside a frame fills the frame, and a 16:9 box in the middle of somebody's page is not a screen however loudly it is announced.
  8. V 2.29

    22.08.2026

    A key to take the reference board out of the scene, a tidier console, one archive.

    • A frame key sits next to the handle switch in the corner of the viewer: it takes the reference board out of the scene, and the same key brings it back. The switch already existed four folds down the console, but the board is a thing you look at, and the place to turn it off belongs next to what it stands in front of. Taking it out also lets go of it — a handle left hanging on a gap is how a gizmo ends up moving nothing.
    • THE TAKE NOW COMES AS ONE ARCHIVE BY DEFAULT. A take is not one file: it is the film, the slate, and from the 3D stage the FBX and the camera track as well — up to five things that only make sense together and that share a name so they can be put back together later. Handing those over as five separate downloads makes the browser suspicious around the third one and makes whoever receives them responsible for keeping a set intact. Loose files stay one click away for dragging straight into an edit.
    • The console starts folded, except the rig. Eleven blocks opened at once is a wall you read past to reach the two sliders you came for; folded, the titles are the index. The rig is the exception because it is where every board starts — you pick the machine before you have anything to say about the move. The controls list under the viewer folds the same way. Every fold is still remembered for the session.
    • Fixed: Delete, with the reference board selected, said "Removed. Ctrl+Z brings it back." and had removed nothing. The code has a branch for a prop and one for a figure and none for the board, so it deselected it, pushed an undo step for a change that never happened, and reported a deletion — three falsehoods, the loudest being the message. The board is part of the plan, like the route: there is one, and it is hidden or shown, never deleted. It now says exactly that and points at the two controls that do it.
    • Fixed: the rotate glyph on the handle switch still showed two rings after the third one was added, quietly teaching the wrong thing about what the tool does.
    • Fixed, and it was mine from an hour earlier: bundling every dependency into the server was applied to the dev server too, where it forced each one through the SSR pipeline and took the CJS packages among them down with "module is not defined". Builds need it and dev does not — dev serves from node_modules, which is there. Production was never affected; the dev server would not start.
  9. V 2.27

    22.08.2026

    The Node build now stands on its own — it could not have been published.

    • Fixed: the server built for Node imported eight packages by name and expected to find them in a node_modules beside it. The way this is published there is no node_modules beside it — the upload is the built folder, a twenty-line listener and a package.json with no dependencies, and there is no install step at the far end. Every request would have answered 500 with `Cannot find package '@tanstack/router-core'`.
    • The reasoning in the config was written down and was wrong: "a Worker has no node_modules at runtime, a Node server has one, so leave them external". True of a machine where you check the project out and run it; not true of the folder that actually gets uploaded. Both runtimes bundle everything in now, and only Node's own built-ins stay outside, which is right — Node provides those.
    • Caught by the deploy script's own smoke test, which starts the staged server before uploading anything and refuses to publish when the board does not answer 200. It tests the exact folder that goes up, which is why it caught a fault that every local check passed straight through: the dev server and the test suites all run where node_modules exists.
    • After the fix the same test answers 200, and the publish step lists 73 files to send with the database and the restart marker untouched.
  10. V 2.26

    22.08.2026

    Framed, the board says how tall it is — and takes the real screen.

    • THE HEIGHT. The page that frames the board is on another domain and cannot look inside to measure it, so the frame keeps whatever height it was given and the board grows a scrollbar of its own inside somebody else's page — two scrollbars, one of them in the wrong place. The board now says its height when it loads and again whenever it changes, and the host resizes the frame. It says nothing at all when it is not framed: nobody is listening, and a message posted to yourself is one you will handle by mistake one day.
    • Fixed before it shipped, and only because it was measured: the first version reported the height off the root element, which is the obvious choice and a trap. The root stretches to fill the viewport, and inside a frame the viewport is whatever height the host just set — so the reading was the frame's own height coming back, and the number could grow but never shrink. Six hundred pixels of filler added to a board reporting 3725 moved it not at all, because the real content was 2453. It measures the body now, which does not stretch.
    • FULL SCREEN, framed, now takes the real screen. It asks on behalf of the whole framed document rather than of a box inside it, so the browser sends the frame itself to the glass.
    • And when the screen is refused in a frame, the board does not fake it. The fallback it uses standing alone is `position: fixed`, which is fixed to the viewport — and inside a frame the viewport IS the frame, so the fallback would fill a 16:9 box in the middle of someone's web page and report FULL SCREEN. It says which attribute the host page is missing instead. A message that names `allow="fullscreen"` gets the attribute added; a fake full screen never would.
    • Measured in a real frame: the host receives the height, sets the frame to it, and the board's content height then equals its visible height exactly — no inner scrollbar left. And with the screen refused, the overlay stays off.
    • The height logic is pinned by a test with a hand-fired observer, including the case that caught the ratchet. It has to be hand-fired: the browser delivers those callbacks from its rendering loop, so nothing fires in a frame that is not being painted, and a test that waited for one would pass by not running.
  11. V 2.25

    22.08.2026

    Embedded mode: inside another page, the board drops its own header.

    • The board is framed into the presentation page at shotblock.it, which has a header with the same logo ten pixels higher up. Two of them stacked is not a style problem, it is the board looking pasted in. So when the board notices it is inside a frame it drops its own header. Opened at its own address it keeps it — there it is the only one. Until now this was a hand edit made after every build; it is part of the board now.
    • The check happens BEFORE the first paint, which is the whole difficulty. The site build renders on the server, so the header is in the HTML and on the screen before any React runs — hiding it from an effect would show it and then take it away, on every load. So it is an inline blocking script in the head. Measured, not assumed: in the HTML the server sends, the script sits 230 bytes ahead of the header markup, so the header is never drawn at all. The two offline builds run the same check before `createRoot`, which on a client-only build is before anything is on screen.
    • It also stops the page being a screen tall when embedded. `min-height: 100vh` inside a frame means "as tall as the viewport", but the frame already has a height, so the two added up and left a band of empty stage under the board.
    • The rule is written twice on purpose — a function for the offline builds, the same logic as inline text for the head script, which cannot import anything — and a test runs both against the same fake windows and fails if they ever disagree. It also checks that all three shells still tag the header they draw, because they are three separate files and this is exactly what gets done twice and forgotten once.
    • A cross-origin frame cannot look at its own top and throws instead. The throw is read as embedded rather than swallowed: guessing the other way would put back the second header this exists to remove.
    • Verified in a browser in both directions, on both the site build and the offline copy: framed, the header is 0 pixels tall and the page is 0 tall; on its own, the header is there and the page is a screen tall. `app.shotblock.it/prova-iframe.html` is the page that checks it, kept so it can be checked again after any deploy.
    • Fixed, found on the way: SINGLE FILE in the header downloaded /downloads/ShotBlock.html, and nothing put a file there — the link answered 404 on the live site. The build that produces the single file is the only thing that knows where it is, so it now leaves a copy under the name the link asks for.
  12. V 2.24

    22.08.2026

    Nothing left of the platform this was born on.

    • Shot Block was generated on someone else's platform and carried its furniture for a long time. All of it is gone now: the design inspector (their development tool, 987 lines, loaded behind an environment flag), a module that reported errors to a global object only their site ever installed, their two login hosts in the Content-Security-Policy, a step that rewrote asset URLs to undo a stale hostname they used to bake in, their name in the author and twitter meta tags, their default page title, their marketplace cover field, and their address printed on the slate of every export.
    • The slate now says SHOTBLOCK.IT, which is where it lives.
    • Two of those were doing real work and are now doing less of it, which is the point: `frame-src` is down to `'self'` — nothing frames this app but its own pages — and the URL rewriting is gone, so an absolute address in the app's metadata is now left absolute, because the only reason to write one is to point somewhere that really is elsewhere.
    • The standalone single-file copy was rebuilt: it is a compiled artefact, and the old one still had the name inside it. Editing a build output would have been the wrong fix.
    • The original code is untouched in the V1.00 backup, so this is a removal and not a loss.
    • THE SPEED CURVE IS NOW A PRO CONTROL. It is the most technical thing on the board — a tangent editor — and in LIGHT it was the first thing a new operator met and the least likely to mean anything. The ease percentages stay on the mark sliders in both modes, so nothing became unreachable; only the graph waits until it is asked for.
  13. V 2.23

    22.08.2026

    FULL SCREEN always fills the screen, and a key to level the horizon.

    • FULL SCREEN now always does something. A fullscreen request has three outcomes and only two of them are a promise: it can be granted, it can be refused, or it can be quietly swallowed — which is what an iframe without `allow="fullscreen"` and some embedded browser views do. There is no error to catch and no event to wait for, so the button used to sit there having visibly done nothing, which reads as a broken button rather than as a refused permission. The request is now checked by the clock as well: if the screen has not been handed over shortly after asking, the board takes the window itself and says why.
    • Older Safari fullscreens through its own prefixed event, which nothing was listening for — so on those browsers the board was handed the screen and carried on drawing itself at inline size. It listens for both now.
    • INSTALL AS AN APP is gone. Shot Block lives on its own site now, and asking a visitor to install a page they have just arrived at is the wrong question. SINGLE FILE stays, because it answers a real one: the whole instrument in one document, no network, on a stick, on set.
    • LEVEL THE HORIZON, in the CAMERA AIM panel. The green ring tips the horizon and a ring is easy to catch by accident — half a turn of dutch nobody meant, on one mark in the middle of a move, is very hard to find by reading sliders. One press puts every mark back level. It also says whether there is anything to level and how far the worst mark is tipped, rather than sitting there looking pressable and doing nothing.
    • Fixed, and found while testing that key: a shared board lost the dutch. A link is the whole plan on the way out and a hand-written decoder on the way back, and the decoder names the fields it will accept one by one — which is the right way round, but it means a new field is silently dropped until somebody adds it, and the failure only shows when someone else opens the link. Roll is now carried, and the trip is checked by a test that also pins the reference board and the rig arm to it.
  14. V 2.22

    22.08.2026

    Drop a frame straight onto the set.

    • Drag a JPEG or PNG onto the viewer and let go. No file dialog, no browsing — the picture goes onto the reference board, and the board comes back into the set if it was hidden.
    • WHERE you let go is part of the gesture. Drop it on bare floor in Stage 3D and the board stands at that spot. Drop it on the board that is already there and only the picture changes, which is what replacing a reference means. Put something down somewhere and it should be there.
    • Let go above the horizon, where the ray never meets the floor, and it loads the frame and leaves the board where it was — rather than inventing a place for it out on the skyline.
    • The viewer says what a drop will do while the file is still in the air: the border goes yellow and the picture names both outcomes. A drop target you only find out about after dropping is a drop target you have to guess at.
    • Drop something that is not an image and it says which of the two things went wrong. A picture dragged from another browser tab arrives as a LINK rather than a file, which is worth naming — "invalid input" would leave you dragging the same thing again.
    • A drag abandoned anywhere else still clears the overlay. Cancelling a drag with Escape over the viewer fires no `dragleave` in every browser, and a full-viewer overlay that has forgotten to go away is the sort of thing you reload the page to escape.
    • The one that would have been unforgivable, and is checked: `dragover` is always prevented. A browser's own answer to a dropped file is to navigate to it, so a missed preventDefault does not weaken the feature — it throws the whole instrument away and leaves you looking at a JPEG.
  15. V 2.21

    22.08.2026

    The reference still stands in the set, and there are three rings now.

    • The loaded still used to be washed across the top of the 3D view at half strength, clipped to the horizon. That is a plate in SCREEN space, and it behaves like one: it slides about as you turn the set, fades out at some angles, and can never be lined up against anything — because it is not anywhere. It has been taken out.
    • It is a board standing in the set now: somewhere real, at a real size, facing a real way. Click it in Stage 3D and it takes the same three-armed handle a route marker gets — drag an arm to move it across the floor or lift it — and the same rings to swing it. There is a REFERENCE BOARD panel too, for when a number is wanted rather than a drag: width, height off the floor, swing, lean and turn.
    • Because it is in the set, it goes through the lens. THROUGH THE LENS shows the reference behind the figures, a puppet standing in front of it is in front of it, and the route can be drawn past it — which is the entire point of loading a reference in the first place.
    • Lean is measured from upright: 0 stands it up, 90 lays it flat on the floor as a ground plan. That reading fits in your head, which is worth more than measuring from the floor and being technically symmetrical.
    • THE THIRD RING. Where there were two circles there are now three, one per axis and each drawn in the plane its axis turns things in — blue around the upright, red across the set, green along its depth. Three squared-off circles read as a ball you can turn; two read as two arcs.
    • The new one is roll, and it does real work on both things it is hung on. On a mark it is the dutch: the horizon tipped about the lens axis, interpolated along the route like pan and tilt, and carried into the take, the lens view and the exported camera track — it is added to the operator's own sway, because roll is the one rotation that is not an aim. It leaves the camera pointed exactly where it was and turns the frame around that line. On the reference board it turns the picture in its own plane, for a still that was shot on a dutch when the set is level.
    • Measured rather than eyeballed: over every combination of swing, lean, turn and picture shape the board stays a rectangle with square corners to the last decimal, keeps the shape of the picture on it, and never drifts off its own middle — which matters because the middle is where the handle is hung, and a handle that lies about what it is holding is worse than no handle.
    • The still is drawn as a real surface, which a canvas cannot do on its own: `drawImage` can scale and shear but not foreshorten, and a board seen at an angle needs foreshortening. So it is cut into a grid of cells small enough that the shear is indistinguishable from the perspective, with a hair of overlap — sixteen abutting shears leave hairline gaps, and a grid of pale lines across a photograph is far more noticeable than a pixel of doubled image.
  16. V 2.20

    22.08.2026

    The space bar plays the move.

    • Press space to play, press it again to stop — the way it works in every cutting room. The transport button says so on hover, and it is in the list of controls under the viewer.
    • It does not scroll the page, which is what the space bar does if nobody stops it and what would otherwise throw the board out from under you the first time you tried it.
    • It stays out of the way where it should. A focused button keeps its own space bar — that is how a keyboard presses a button, and taking it would break the panel for anyone not using a mouse. A text field keeps its spaces. And while the recorder is rolling the transport belongs to the recorder: stopping halfway would leave a take that is not the move.
    • A slider is the exception, deliberately. Nothing happens when you press space on one, and the moment just after nudging a slider is exactly when you want to see what it did — so space plays from there rather than reading as broken.
  17. V 2.19

    22.08.2026

    Take hold of the rail and the arm.

    • The rig can be worked by hand now, not only by the sliders. Grab the rail and push it — it slides square to itself, because sliding a straight rail along its own length moves nothing. Hold shift and it turns about its middle instead.
    • Each arm segment has a grab dot: two on the joints, where the hand looks for them, and one on the middle of the head segment, which has no joint of its own to offer — its far end is the camera, and the camera is the shot rather than a part of the rig.
    • Every drag is constrained on purpose. A segment handle runs along its own segment and nothing else; the rail only slides or turns. A free drag in a perspective view is a guess, and an axis drag is a decision — the same reasoning as the marker gizmo.
    • Pulling one segment leaves the other two alone, and cannot take it outside what the slider allows: the handle and the slider write the same field, and a rig you could only build with the mouse would not be a rig.
    • The point of pushing the rail is watching what it costs. Shove it four metres clear of the action and the panel goes from asking the arm for 2.99m to asking for 5.36m, and turns red — the rail, the arm and the verdict are one calculation, so moving any of them moves all of it.
    • The rail's position is kept as a correction to where the move says it should be, not as a place on the floor. Redraw the route and the rail follows it, still pushed the same distance clear, instead of being stranded where it made sense for the old move.
  18. V 2.18

    22.08.2026

    Motion control gets its track, and an arm that can come up short.

    • Pick MOTION CONTROL and a rail now appears on the stage floor with a three-jointed arm standing on it — column, boom and head — carrying the camera. Three sliders run the segments out from 0.3m to 4m; the defaults add up to 3.4m, which is about a Bolt.
    • The rail is not scenery placed near the line. It is worked out FROM the move: the straight line through the route that costs the arm the least reach. The base sits at the point on that rail nearest the camera, and the arm is solved from there to wherever the camera actually is — so every curve in the yellow line is the arm making it, which is how a cinebot works.
    • Which means the board can now tell you the shot is impossible. Under the sliders it reads back how far off the rail the move asks the arm to reach, at which point in the take, against how much arm there is — and when the arm cannot get there the arm goes red in the scene, says ARM SHORT BY, and the panel names the shortfall in metres. A rig drawn permanently able to do whatever it is asked would be a prettier picture and a useless instrument.
    • It also catches the fault nobody expects: run one segment longer than the other two together and the arm can no longer fold small enough to bring its own hand in close, leaving a blind ball around its own base. Set the column to 4m and it is a 3.4m hole. The panel says CANNOT FOLD THAT CLOSE and tells you to even the segments up.
    • Fixed before it shipped, and only because it was measured: the arm flipped its elbow. A bowed move crosses its own rail twice — a best-fit line being a fit — and at each crossing the camera passes over the base and out the other side. Reading the reach as a positive distance made the far side of the arm's working plane become the near side, throwing the elbow 2.4 metres across the set between two frames while the camera moved 6 centimetres.
    • The reach is now signed across the rail, so it passes through zero and the arm swings up through vertical. And the solver was replaced outright: three segments reaching for two numbers have a spare degree of freedom, and near full stretch that freedom is nearly free, so an iterative solver lands somewhere different every frame. Running it to a finer tolerance made the flipping WORSE, which is the tell. It is closed form now — the arm unfolds in proportion to how far it is reaching, and the rest is the cosine rule.
    • Measured over a whole move: the hand lands on the camera to the last decimal, the segments hold their length to the last decimal, and the joints move 5.86cm between frames against a camera moving 5.87cm. The arm now travels less than the camera it carries.
  19. V 2.17

    22.08.2026

    The speed curve zooms, down to the frame.

    • Roll the wheel over the graph to zoom, drag the graph to move about, double-click or press FIT to see the whole take again. There are − and + keys too, and they zoom around the selected mark rather than the middle, so the point you are working on is the point that stays put.
    • Whatever is under the pointer stays under the pointer. That sounds obvious and is the whole difference between a magnifier and a scale control: get it wrong by a fraction and the mark you are aiming at walks off the side as you zoom. Measured over 540 zooms at every corner of the graph, the point under the cursor slips by a ten-thousandth of a millionth of a drawing unit.
    • The grid follows you down. Looking at the whole take it is ruled in seconds; go in and it steps to half seconds, then tenths, and finally reads out in seconds and frames — because a motion control move is programmed at the frame, and two marks a tenth of a second apart are one blob at full width.
    • It will not zoom past four frames across, which is as close as two marks are ever allowed to sit, and it cannot be pushed outside the take: zoom out far enough and you are always back at the whole move.
    • Picking a mark on the timeline while zoomed in brings it into the window, rather than leaving the graph apparently pointed at nothing.
    • The window arithmetic now lives on its own, apart from the drawing, and is checked by 12 tests. This is the sort of thing that looks right in a screenshot and is maddening in the hand, so it is pinned down by measurement rather than by eye.
  20. V 2.16

    22.08.2026

    A speed curve you can draw, under the timeline.

    • Selecting MOTION CONTROL brings up a graph below the timeline: time across, distance along the route up. A straight diagonal is a constant speed, a flat stretch is the camera holding, a steep one is a dash. The shape of the line IS the shape of the move — which a percentage in a slider can state but cannot show.
    • The yellow handles either side of each mark are its ease in and ease out. Pull one back towards its mark and the camera slows into it; push it out and it sweeps through. Not an analogy: the handle's reach IS the tangent scale the motion is computed from, so what you draw is what the rig does.
    • The graph reads from the same call the movement is built from. A graph drawn from a second, lookalike calculation is one that will eventually disagree with the shot, and a graph you cannot trust is worse than no graph.
    • Clicking a point on the curve selects that mark, on the timeline and in the viewer with it.
    • The percentage sliders are still there for when a number is wanted rather than a shape; both write the same figure.
    • Fixed, and found by drawing the graph: a mark you had never dragged was timed two different ways. The move placed it at its distance along the route, the graph at the moment the plan's speed shape reaches that distance. On an accelerating move the two readings sat 24% of the route apart — and worse than the graph being wrong, touching a single ease quietly flattened the whole plan's accelerate or decelerate into a constant speed. There is now one calculation, so they cannot part company again.
    • Fixed: the graph was arriving broken on first paint. The page is rendered once on the server and again in the browser, and the two engines part company in the fourteenth decimal of the same spline arithmetic — enough for React to declare a mismatch and leave the drawing unpatched. The coordinates are now rounded to a hundredth of a unit, identical on both sides and far finer than a pixel.
    • Fixed: a shared link with times in a scrambled order was being made playable by pushing every offending mark onto the same instant. That stopped the camera running backwards by asking it to be in three places at once, which covered half the route in a single frame. Tied marks are now shared out over the room between their neighbours, in proportion to how far apart they sit on the route — the same 48% jump now measures 0.4%.
  21. V 2.15

    22.08.2026

    MOTION CONTROL, with an ease in and out on every mark.

    • The robo-arm is now MOTION CONTROL — the cinebot rig: very fast, repeatable to the millimetre, the one that shoots food and cars. Only the name changed; the id a shared board is saved under is untouched, or every link ever sent would quietly come back as a different rig.
    • Every mark now carries its own EASE IN and EASE OUT, 0 to 100 per cent. This is not a decoration on the timing: the tangent of the time-against-distance curve at a mark IS the speed there, so easing is that tangent scaled down. 100% sweeps through, 0% is a dead stop.
    • The two are broken apart on purpose. A mark can be arrived at gently and left in a hurry, which is how a motion-control move is written — hold, snap across, settle on the product. One speed shape for the whole move could never say that.
    • Easing can only ever SLOW the curve, and that is a guarantee by construction rather than by testing combinations: the monotone bound is an upper limit on the tangent, so scaling one down is always still monotone. No arrangement of eases can make the camera reverse.
    • Measured: a mark at 0% brings the camera from full speed to under a quarter of it as it passes, and the marks themselves do not move — easing shapes the speed between them.
  22. V 2.14

    22.08.2026

    Feet on the right way round, and a woman told apart by her build.

    • Fixed: every figure stood with its feet on backwards. Forward is local +z — the poses have always said so, a seated figure putting its knees and feet out in front of it — and the feet were built along -z. The foot is the first thing the eye reads a figure's facing from, so the whole figure looked turned around.
    • The hair bun is gone. It was a ball above the crown that the old rough figure hid and this one could not, and hair is not blocking information. A female figure is now told apart by her build: two forms carried on the front of the ribcage, which is what distinguishes a silhouette from across a stage and from directly above.
    • Fixed something worse than either, in the tests rather than the app: the figure's build was checked BELOW the point where the test script decided whether to fail. Fourteen checks could print FAIL and the script would still exit clean. The gate is now the last thing in the file, and a deliberately broken check was used to prove it fails.
  23. V 2.13

    22.08.2026

    A clock beside the timeline, timecode on the slate, and a figure with a section.

    • A clock to the left of the timeline reads the take in seconds and frames — 07:12 is seven seconds and twelve frames. Hours and minutes are left off: a move is thirty seconds at most and two columns of zeroes say nothing.
    • The slate no longer counts frames at a mark. It carries a timecode: the take's own, MM:SS:FF, or the recorder's absolute code when a start has been typed on the slate — that is the number that has to match, so it wins when it exists.
    • Frames are numbered from 00, as timecode always numbers them: at 25 fps the field runs 00 to 24 and the second rolls at 25. Counting from 1 reads better out loud but would disagree with the recorder, the edit list and the slate's own start and stop.
    • THE FIGURE HAS A CROSS-SECTION NOW. Every limb was a flat ribbon, the same width from every angle — a chest seen from the side was as wide as from the front, and the eye reads that as cardboard without being able to say why. Each part now carries how deep it is against how wide, and its silhouette narrows as you walk round it.
    • And a profile along its length, instead of a straight cone end to end: the calf carries its muscle high, the forearm swells below the elbow, the torso is a waist under a ribcage, the deltoid is a cap over the shoulder. A cone cannot do any of that, and it is most of what makes a leg read as a leg.
    • Still not the skinned quad mesh a modelling package would give you — but it is a body rather than plumbing, and it costs no mesh, no skinning weights and no new export path.
  24. V 2.12

    22.08.2026

    The blocking figure looks like a body instead of plumbing.

    • Every limb tapers now, because a body does: the thigh is widest at the hip and narrowest at the knee, the calf swells below the knee and runs to a thin ankle, the upper arm carries the deltoid at the top, the forearm thickens at the elbow and narrows to the wrist. Drawn at one width end to end — which is what it was — a figure reads as a diagram of pipework, and you cannot tell at a glance which way it faces or where its weight is.
    • The torso goes the other way: a waist under a ribcage, so the shoulders have something to sit on.
    • Hands and feet. The foot is a flat slab pointing where the figure points, which is what the eye reads a figure's facing off before anything else.
    • The proportions are fractions of the figure's own height, so a 1.60m and a 1.90m figure are the same build at two sizes rather than the same pipe widths on two lengths. It comes out at 7.6 heads tall.
    • This is the cheap half of the job, and worth saying plainly: it is still a jointed mannequin of tapered capsules, not the skinned quad mesh a modelling package would give you. That would need the mesh itself, skinning weights, a renderer sorting hundreds of triangles a frame, and a new FBX path.
  25. V 2.11

    22.08.2026

    Both handles work everywhere, and the pen looks like a pen.

    • Fixed: at the ends of the route — and anywhere the camera sat on top of a mark — switching to the move handle showed nothing. The camera is tested for a click before the marks are, so clicking there always picked the camera, and the arrows had been made a mark's handle only.
    • Every handle now acts on a MARK, and selecting the camera is simply another way of pointing at the mark it is standing on. Both handles work from either, everywhere on the route. Grabbing an arm also selects that mark, so the sliders beside the board are the sliders for what the hand is holding.
    • The pointer over the board says what the next press will do: a pen nib while PEN is on, the grab hand on the stage, a crosshair on the plan. The nib carries its hotspot on the tip rather than the middle — a pen that draws from its centre lies about where the line will start.
  26. V 2.10

    22.08.2026

    A handle switch in the corner, and the marks on the slate with their timecode.

    • An icon in the top-left of STAGE 3D switches between the two handles: the three arrows that move a mark, and the two rings that aim the camera. It shows the handle you are USING, not the one you would switch to — a control that shows its own state is read at a glance, one that shows its next state has to be reasoned about every time.
    • The arrows stay a mark's handle only. The camera's position is not its own — it is wherever the route puts it at that instant — so there is nothing there to drag; the rings go on either.
    • THE SLATE NOW CARRIES THE MARK LIST. Every mark with the frame it falls on and its timecode, plus what it does to the camera: its height, its pan, its tilt. A route described as 'five marks' tells nobody when to do anything; 'mark 3 at 01:00:03:11, frame 86, up to 4.20m and 25 degrees round' can be programmed, called over comms, or matched on a second take.
    • The frame counts from the first frame of the take and the timecode from whatever start was typed on the slate, so the numbers line up with the recorder's clock rather than an internal zero nobody else shares.
  27. V 2.09

    22.08.2026

    The yellow line is the camera's path, from the first frame.

    • Fixed: the route line was a shadow on the floor while the camera flew a metre and a half above it. The two only met once a mark had been given a height of its own, which meant the only way to see the camera on its own route was to start editing heights you did not want to edit. A route line the camera does not travel is a drawing of a different shot.
    • The line now carries the height at every point — the mark's own or the move's — plus the rig's lift, worked out exactly as the camera's position is worked out. The cube sits on it from the first frame, and the faint droppers to the floor say how high it is.
    • The shaker is deliberately left out of the line. A handheld's wobble belongs in the take, not in the route you are trying to read.
    • The mark dots ride the line too, so the handle you grab is on the thing you are moving.
  28. V 2.08

    22.08.2026

    Marks can be added by clicking the timeline, on either track.

    • Click a bare stretch of the MOVE track and a route mark appears there. Click the AIM track and you get a camera-aim key at that instant instead. Both land exactly where the camera already is at that moment, and every other mark is frozen at the second it already happens, so the take you had is the take you keep.
    • An aim key is seeded at the deviation already in force — none, usually — so adding one changes nothing until you turn the camera.
    • A key of zero now counts as a key. It pins the aim to neutral at that instant, which is how a turn is stopped from bleeding backwards into the shot before it; clearing the keys with STRAIGHTEN is what takes a mark off the aim track.
    • The scrub strip is now the only thing that scrubs. The tracks are for their marks, which is the shorter rule to remember.
    • A mark cannot be dropped on top of another, and a full route says so rather than silently ignoring the click.
    • Worth knowing: adding a mark SETTLES the route slightly — up to about a metre on a twelve-metre stage, and the aim with it. The route is an interpolating curve, so a new control point changes the tangents either side even when it is placed exactly on the old curve. Every tool with a path like this behaves the same way. It settles, it does not restage.
  29. V 2.07

    22.08.2026

    The camera on the stage is finally the camera in the take.

    • Fixed, and it was the worst kind of wrong because everything looked fine: the camera token on STAGE 3D was not the camera being recorded. It worked its own position out instead of asking, and had drifted from the shot in three separate ways — it ignored the height set on a mark, it ignored a mark dragged along the timeline, and its cone ignored a mark's pan and tilt. The viewer was showing a move the recorder was not making.
    • The token now asks rigEye where the camera is, the same answer the recorder, the lens view, the FBX and the camera track all use. Scrub the timeline and the cube climbs, dives and turns along the yellow line, on every axis.
    • The aim rings live on the camera now, not on a route mark, and they appear when you click the camera itself. Clicking the thing you want to change is a shorter sentence than picking a tool first, so the MOVE / ROTATE switch is gone: a selected mark wears the arrows that move it, the selected camera wears the rings that aim it.
    • Turning a ring writes the aim to the mark the camera is nearest to in time — the marks are the only things the route has to hang it on, and that is the one a director would point at and call 'there'.
  30. V 2.06

    19.08.2026

    Marks can be dragged along the timeline: the move hits its cues.

    • Drag a mark sideways on the timeline and it now happens at that second. Until this, when a mark happened was worked out from how far along the route it sat and the speed shape — you could not simply say 'be there on four'. Now you can, and the speed either side bends to suit.
    • Dragging one mark freezes them all at the second they are already at. Half a timing would be worse than none: the timed marks and the untimed ones would disagree about where the camera is. Freezing them changes nothing visible and makes the timings the single answer from then on.
    • The camera never runs backwards to hit a cue. Joining the timings with an ordinary spline would overshoot, and overshooting DISTANCE means running past a mark and reversing onto it — so the curve used is monotone by construction, smooth but incapable of turning round.
    • Marks keep four frames of clearance from each other. One frame apart is legal arithmetic and physical nonsense: a slip of a few pixels would ask the camera to cross a quarter of the set in 40 milliseconds. Four still allows a hard whip.
    • A shared board with contradictory timings — two marks claiming the same instant, or an order that runs backwards — is read as a hold rather than throwing the camera across the set. The timeline cannot produce that; a hand-edited link can.
  31. V 2.05

    19.08.2026

    The playhead can be dragged.

    • A scrub strip above the two tracks: drag it and the take parks at that instant, with the viewer, the rig token and the readout all following. Anywhere on a track works too, except on a mark, which still selects.
    • It parks between marks as well as on them — which is where you look when you are checking what the camera does on the way rather than where it stops.
    • Scrubbing stops playback rather than fighting it for the playhead a frame at a time.
    • The elapsed second is spelled out beside the strip, so the position is a number and not just a bar.
  32. V 2.04

    19.08.2026

    A timeline under the viewer: where the marks fall in the take.

    • Two tracks under the viewer, in both PLAN and STAGE 3D. MOVE carries every mark on the route — where the camera is. AIM carries only the marks that turn the camera — where it looks. Keeping AIM sparse is the point: a track with an entry for every mark would say nothing, three entries say the camera turns here, here and here.
    • Click a mark on either track to select it, which beats hunting for a ten-pixel dot in a perspective view.
    • The marks sit where the camera REACHES them, not at tidy equal intervals. Two things decide that and both are honoured: how far apart the marks are on the floor, and the speed shape. On a snap + settle the marks bunch at the head of the take, because that is what the shot does — the middle mark of the piano scene lands at 1.6 seconds rather than 5.
    • Working that out means reading the speed shape backwards. Rather than hand-inverting five different curves and getting one of them subtly wrong, the answer is found by bisection — every shape inverts to better than a thousandth of a frame.
    • Each mark reports what it carries: its second, its height if it has one, its pan and tilt if it turns. A mark dialled back to zero drops off the AIM track instead of sitting there doing nothing.
  33. V 2.03

    19.08.2026

    The camera can be aimed mark by mark, and it gets there smoothly.

    • Markers can now carry their own pan and tilt. Turn the camera at one mark and it eases into that aim on the way past and out of it again — a look-off, a whip to the subject, a settle.
    • The rotation is an OFFSET from the move's own pan and tilt, not a replacement, so every route drawn before this behaves exactly as it did and the two existing sliders keep meaning what they say.
    • ROTATE tool in STAGE 3D: the selected mark wears two rings instead of the arrows — blue sweeps the camera round, red tips it up and down. Turning is measured as the angle swept around the mark, so it reads as a dial rather than a slider bent into a circle.
    • The same two angles are on sliders for when a number is wanted rather than a gesture, and either can finish what the other started.
    • The smoothness is measured, not assumed: on a ten-second move at 25 frames a second, the worst frame-to-frame swing with a 35 degree deviation dialled in is 1.3 degrees, against 1.0 for the same move without it.
    • The camera never swings past an angle nobody dialled in. A spline through a single turned mark overshoots on both sides — the camera would look the wrong way before it looked the right way — so the curve is held inside the values the marks actually describe. The same limiter now protects height.
    • Fixed: switching a tool did not repaint the viewer, so the handle you had just chosen only appeared after something else happened to force a redraw.
  34. V 2.02

    19.08.2026

    The route can be drawn by hand, and it can leave the floor.

    • PEN mode: press and drag to draw the whole route in one stroke instead of clicking mark after mark. The stroke is read, not stored — the shape you drew comes back as a handful of markers you can still grab, with the corners kept where you put them.
    • The pen works in STAGE 3D too, drawing straight onto the set floor.
    • Route markers are visible in STAGE 3D and can be selected. Clicking one raises an X / Y / Z handle: drag an arm and the marker moves along that axis alone, which a free drag in a perspective view can never promise.
    • Markers can now carry their own height. Lift one and the move climbs to it and back down — a crane rise, a descent onto the subject. The HEIGHT slider still governs a move whose marks have no height of their own, which is most of them.
    • The height can be dragged on the blue arm or typed on a slider; both write the same figure, so either can finish what the other started.
    • Fixed, and it had been wrong since rigs got their constraints: a dolly or an arm rebuilt the route from its two or three end points and threw away every marker in between. Heights set on those markers had no effect at all, silently. The constraint now shapes the ground track and leaves the marks — and their heights — alone.
    • Fixed a dip on the way to a raised mark. The height followed the same curve as the ground track, which overshoots around a single high point: the camera sank below the marks either side before climbing. It no longer invents a height outside the ones the marks describe.
    • Dragging a marker carries its neighbours with it by default, fading out over three marks, so moving one mark of a smooth arc relocates the arc instead of denting it. FOLLOW OFF moves one mark alone.
  35. V 2.00

    19.08.2026

    The board stands on its own, and RECORD THE TAKE can finally be saved.

    • DOWNLOAD THE TAKE was broken, and had been since the feature shipped. The button builds the ZIP by reading the recording back from its own Blob URL, and the site's content policy forbade exactly that: it answered 'Failed to fetch' and the take could not be saved at all. blob: had been allowed for images and video but forgotten in the one place a fetch looks at.
    • The offline mode of the site never worked either. The service worker is served from /app/ but has to control the whole site, and the server never said it was allowed to — so the browser refused the registration outright, silently.
    • The project no longer needs the platform it was built on. Four private packages it could not compile without have been removed along with the marketing landing page and the unreachable scaffolding around the board: 129 files that no route ever loaded. The instrument itself — rigs, glass, the object bot, recording, FBX and camera-track export — was not touched. The stylesheet went from 501 kB to 28 kB.
    • The address bar now opens straight onto the board.
    • Publishing a new copy no longer depends on remembering anything: the cache version inside sw.js is stamped by the build from a fingerprint of what it just produced. An unchanged build keeps its fingerprint, a changed one gets a new one.
    • The publishable folder is complete again — manifest, hosting configuration, share-preview tags and the preview image. Several of those had only ever existed inside a hand-assembled zip, so every rebuild quietly dropped them.
    • The site no longer fetches its own icon and preview image from someone else's CDN.
  36. V 1.53

    16.08.2026

    INSTALL AS AN APP, always.

    • Fixed a piece of dishonest wiring: when a browser did not offer the install event, the header quietly became DOWNLOAD THE APP and handed over an HTML document. You pressed something called the app and got a file.
    • The install button is now always there. With the browser's own prompt it is one click; without it, the button names the menu item for that browser — Chrome's address-bar icon, Edge's Apps menu, Safari's File, Add to Dock.
    • The single file is still there, called SINGLE FILE, which is what it is: the whole board in one document, no installation, no network.
    • Firefox is told the truth: it does not install sites, so use another browser or take the single file.
  37. V 1.52

    16.08.2026

    The downloaded app opens on its own name.

    • DOWNLOAD THE APP now opens on a proper front door: the round Shot Block mark, the name, and one line saying the board is loading — instead of a bare grey LOADING line.
    • The window is titled simply Shot Block, and the round mark is the window and tab icon.
    • The mark is carried inside the file as data, so it shows with no network at all — even opened straight off a memory stick.
    • The opening screen disappears the moment the board paints: no timer to guess at.
  38. V 1.51

    16.08.2026

    Its own window, on every machine.

    • INSTALL ON THIS COMPUTER puts the board in a window of its own — no address bar, no tabs, an icon in the Dock or the taskbar — and it keeps working without a network.
    • Safari never fires the install event, so the button could never appear there. It now says where the menu is instead: File → Add to Dock.
    • When the board is already running as an installed app it says so, rather than offering to install itself again.
  39. V 1.50

    16.08.2026

    Fullscreen actually goes fullscreen.

    • Fixed: in fullscreen the board kept its two column grid, so the viewer was squeezed into the left column with an empty gap beside it and the picture clipped on both sides.
    • The cause was the cascade: the fullscreen rules sat in a layer that Tailwind's utilities override, so the board stayed a grid however specific the selector was. They are now unlayered, which beats every layer.
    • The viewer is centred, keeps 16:9, and takes every pixel the screen and the control panel leave — including when the panel is folded to its rail.
  40. V 1.49

    16.08.2026

    One line less at the top.

    • The THE INSTRUMENT kicker above the logo is gone: the page opens straight on the name.
  41. V 1.48

    16.08.2026

    Wait for both films before offering them.

    • A 3D take is two passes and two encodes, and the download used to appear as soon as the first film was written — so it was possible to save half a take.
    • The board now shows RENDERING while it works, naming the pass it is on, and only offers DOWNLOAD THE TAKE when every file is ready.
    • The waiting line pulses slowly, so it reads as work in progress rather than a message stuck on screen.
  42. V 1.47

    16.08.2026

    Two films, and neither is inside the other.

    • The lens inset no longer appears in the recorded stage film: it is a working aid on screen, not part of the shot.
    • The stage film shows the stage, the lens film shows the lens, and both stay full frame — ready to be cut side by side or handed to a video model without a picture-in-picture in the corner.
    • On screen nothing changes: the inset is still there while you work, and LENS VIEW ON / OFF still governs it.
  43. V 1.46

    16.08.2026

    All five files actually arrive.

    • A 3D take produces five: the stage film, the lens film, the slate, the FBX and the camera track. They were all being generated, but fired within a second and a half of each other — and a browser silently drops the later ones as if they were pop-ups, so the folder ended up with four.
    • The saves are now spaced almost a second apart, lens film first.
    • The board prints what it handed over, by name, so a file the browser refused is visible instead of silent.
    • If your browser still asks about downloading multiple files, allow it once — or switch the button to ONE ZIP, which is a single download by definition.
  44. V 1.45

    16.08.2026

    The posing handles stay in the viewer.

    • Fixed properly: the pale blue joint rings were drawn unconditionally, so they reached the recorded MP4. The previous attempt only changed their colour and size, which is why they were still there.
    • They are now tied to the view instead of to a mood: the STAGE 3D viewer has them, the lens view never does — not the inset, not the recorded lens film — and the stage film drops them while the recorder rolls.
    • Checked by counting the ring strokes actually issued for each view: 11 in the viewer, 0 in the lens, 0 while recording.
  45. V 1.44

    16.08.2026

    A figure you can read.

    • The blocking figure is no longer a bundle of sticks: every limb is drawn as a tapered, two-facet volume, lit on one side and shaded on the other, with rounded joints instead of cut pipes.
    • The head is a faceted skull — cranium, brow, cheek and jaw — so which way a figure is looking reads at a glance.
    • The head is the size a head actually is: the figure now stands 7.6 heads tall, the classical proportion, where before the head was far too small.
    • The exported FBX follows the same skull, so what you block is what arrives in the 3D package.
  46. V 1.43

    16.08.2026

    The furniture stays out of the film.

    • Fixed: the joint rings on a figure, and the selection outlines, were filmed into the take on the 3D stage.
    • The cause was a flag that arrived one render too late — the recorder started painting frames in the same tick it announced it was recording, so the board still thought it was in editing mode for the whole take.
    • The flag is now read live, so frame zero is already clean, in both the stage film and the lens film.
  47. V 1.42

    16.08.2026

    This page.

    • A release history at /changelog: every version, what it added and what it fixed.
    • The same history downloadable as a text file, written from the same list the page renders so the two cannot drift apart.
    • Linked from the foot of the site and from the board's header.
    • The stamp at the bottom of the site now reads the day it was actually shipped.
    • The text file can be taken straight from the foot of the site, without opening the history page first.
  48. V 1.39

    16.08.2026

    The lens gets its own film.

    • Recording on STAGE 3D now produces TWO videos: the stage as you see it, and what the lens itself sees, full frame.
    • The two films are recorded as two sequential passes rather than two parallel encoders — two H.264 recorders at once looked correct and silently returned an empty second file.
    • Frame zero is painted before the encoder opens, so both films hold exactly the same frame count: measured 101 and 101 on a four second take.
    • Files named _stage and _lens, both from the slate.
  49. V 1.36

    16.08.2026

    One archive, if you want one.

    • A ZIP of the whole take, named from the slate, with the choice left to you: LOOSE FILES or ONE ZIP, remembered for the session.
    • Store-only archive written by hand, about a hundred lines, no library: MP4 and PNG are already compressed, so squeezing them again would cost a second of CPU and save nothing.
    • Verified with the system unzip: no errors, and the extracted camera track is byte for byte the original.
    • RAR is not possible in a browser — the compressor is proprietary.
  50. V 1.34

    16.08.2026

    The take arrives as a set.

    • A take recorded on STAGE 3D downloads the whole set at once: video, slate, FBX and camera track.
    • BUILD FBX and BUILD CAMERA TRACK removed — those four files are one deliverable, and a set missing its .chan is a set nobody can use.
    • A take recorded in PLAN VIEW stays at video and slate: a plan is a diagram, it has no camera in space to export.
    • Fixed: the FBX and the camera track only appeared in a list waiting for a second click; now they really save.
  51. V 1.33

    16.08.2026

    The slate, in the crew's words.

    • Every field on the slate card and on the printed slate is in English: SCENE, SHOT, TAKE, VERDICT (GOOD / HOLD / NG), CLIP NAME, TIMECODE START, ACTION, CONTINUITY NOTES.
  52. V 1.32

    16.08.2026

    One button for the take and its paperwork.

    • One click saves the video and the slate together; the separate slate button is gone.
    • The PNG is fired a beat after the video, so the browser treats them as two deliberate downloads rather than one runaway script.
  53. V 1.30

    16.08.2026

    The slate card.

    • RECORD THE TAKE now asks for the shot's identity first: scene, shot, take, verdict, clip name, timecode start, action, continuity notes.
    • Nothing is compulsory. SKIP AND RECORD behaves exactly as before, and an empty field is never printed — a blank CONTINUITY line reads as nothing to match rather than nobody wrote it down.
    • What you type names both files: 14 / 3 / 2 becomes sc014_inq003_tk02.mp4 and _slate.png, padded so a folder sorts itself.
    • Timecode start is enough: stop and length are worked out from the real frame count.
    • Fixed: the take number stepped up straight after recording, so the files came out one take ahead. It now steps when the next card opens.
  54. V 1.29

    16.08.2026

    Every take comes with its slate.

    • A slate PNG generated next to the take: rig, lens, duration and frame count, camera height, speed shape, shaker, aim, pan, tilt, framing centre, route, stage, blocking and exports — with the board itself as the frame grab.
    • Drawn on your own machine: no server, no credits, works in the offline copy.
  55. V 1.23

    16.08.2026

    Housekeeping.

    • AUTO-BLOCK parked out of sight until its guess from a frame is good enough to trust. The code stays, the button does not.
    • Every settings block folds on its own, with the same − / + as the rest of the board, remembered per block for the session.
    • Every − and + sits at the right-hand end of its row, so the eye always finds it in the same place.
    • MOVE sits directly under RIG: duration, height and the shaker are what the chosen rig does.
    • The controls list under the viewer folds to its title bar.
  56. V 1.26

    16.08.2026

    The offline copies were stale.

    • The offline folder and the single-file desktop build were serving a bundle several versions old — including the phantom UNDO (1) that had already been fixed on the site.
    • Both rebuilt from the current source, and they are rebuilt with every release from now on.
    • Fixed: a rebuilt offline copy offered SAVE + SHARE, which needs a server it does not have. The offline flag now lives in the build config where it cannot be forgotten.
  57. V 1.22

    16.08.2026

    The shaker.

    • The effect is named SHAKER, with a slider from 0 to 2: locked off, a working shoulder, or the documentary look where the frame never settles.
    • The camera car gets the road instead of a walk: tarmac vibration at 7.5 Hz, a second at 5.3, the body floating on its suspension at 2.4, and the occasional hit that knocks the frame and settles over a third of a second.
    • Amplitude kept in millimetres on purpose — a camera car vibrates by millimetres, and overdoing the travel turns an car into an earthquake.
    • The camera car's own character raised from 2.6 to 4.6.
  58. V 1.18

    16.08.2026

    The handheld swings the lens again.

    • What reads as handheld is angular, not positional: the body barely travels, the lens swings a degree or two. The first version had it the other way round and the shot looked glassy.
    • The swing is applied to the finished aim direction, so it survives a subject lock — the case where it used to be silently cancelled.
    • The horizon rolls with the footfall in the lens view.
    • Four layers: body sway, walk at 1.9 steps a second, hand tremor, and an aim that lags then catches up at two speeds.
    • In PLAN VIEW the frustum swings at its real angle and the body travel is drawn at three times scale, because five centimetres on a twelve metre stage is four pixels and a diagram that hides what it should show is useless. The data stays metric.
    • Measured: handheld 2.3° of lens swing at the peak, dolly 0.1°, motion control exactly zero.
  59. V 1.17

    16.08.2026

    Clear the board.

    • CLEAR THE BOARD wipes every marker, object and figure and keeps the loaded frame — RESET ROUTE hands back the demo scene, which is the wrong tool when you have just loaded your own still.
    • One undo away from coming back.
  60. V 1.16

    16.08.2026

    Rigs that are carried, breathe.

    • Body sway, footfall, hand tremor and a lagging aim, reaching the 3D stage, the lens view, the recorded take, the FBX and the camera track — deterministic, so all five agree frame for frame.
    • Motion control stays perfectly still, as it should.
  61. V 1.15

    16.08.2026

    Who is building this.

    • A closing section on twenty years of cinema and visual effects, and the bridge between classical film grammar and the new machines.
    • An address to follow the releases: lab@noiselab.it.
  62. V 1.14

    16.08.2026

    No full-screen button on a phone.

    • The control is gone on handhelds, and its row is gone from the controls list: iOS Safari has no element fullscreen at all, and the substitute froze the page.
    • The portrait rotation rule went with it.
  63. V 1.13

    15.08.2026

    25 frames a second, counted.

    • TAKE_FPS and the export rate both fixed at 25.
    • Fixed: captureStream(25) only SAMPLES the canvas — a ten second take came out with 245 frames instead of 251. The recorder now runs on its own clock: frame n is painted at exactly n/25 and handed over by hand. Measured 251 frames in 9.995 s.
    • A phone asking for full screen gets an honest message instead of a rotated pretence.
    • Version and date stamped at the bottom of every page.
  64. V 1.10

    15.08.2026

    Two jobs, one board.

    • A section on what the board is for: agreement on a real set, and a reference handed to a video model.
    • The scroll background is a film again, cut into four chapters.
    • Kling and Veo removed from the model list; Seedance 2.0, Seedance 2.5 and Google Omni named.
  65. V 1.8

    15.08.2026

    The board opens on something worth looking at.

    • The piano test scene as the opening board, camera locked on the player.
    • The opening move widened to 84% of the stage and lengthened to ten seconds — the length a reference clip wants.
    • Fixed: a phantom UNDO (1) on load, caused by seeding the history with a second copy of the default plan.
    • The console panel opens at its top, and the board no longer restores a stale scroll position.
  66. V 1.6

    15.08.2026

    Sharing without a server, and a build that needs nothing.

    • The whole board packed into the link itself, deflate-compressed into the address — about 450 characters, and the data never reaches a server log.
    • A standalone offline folder and a single-file desktop build, everything inlined, fonts included.
    • Fixed: the single-file inliner corrupted the script because a $& in the bundle was read as a replacement pattern.
  67. V 1.4

    15.08.2026

    Frames from a real camera.

    • Frame loading hardened: blob decode with a data-URL fallback, halving downscale to 1280, 40 MB and 60 MP guards, HEIC-aware messages. A 48 MP photo loads without killing the tab.
    • An honest notice on phones: open this on a computer.
    • RECORD THE TAKE given the weight it deserves: heavy red outline, halo, and a pulse while it rolls.
  68. V 1.3

    14.08.2026

    The floor grid you can actually see.

    • Fixed: the grid was drawn at 16% opacity over a 22% alpha — 3.5% effective, invisible — and the 3D toggle did nothing.
    • Now metric: one metre steps, five metre majors with labels.
    • STAGE 3D is PRO only, and leaving PRO returns the board to the plan.
  69. V 1.2

    14.08.2026

    Shot Block.

    • Renamed from Camera Control, which collided with Apple's iPhone button and said nothing about blocking.
    • New logo, icons, cover and page titles.
    • The rig order rearranged and ROBO-ARM made the default.
    • Fixed: the header logo was stretched — the medallion measured 40 × 40 exactly round afterwards.
  70. V 1.0

    14.08.2026

    The first board.

    • Ten rigs with their own physics, prime and zoom optics with a real field-of-view frustum, speed shapes.
    • A route drawn on any still, the yellow camera walking the yellow line.
    • STAGE 3D: a software renderer, orbit and zoom, the lens view inset, blocking puppets posable by hand.
    • Export as video, as FBX and as a .chan camera track.
    • The object bot and a library of 122 objects, built from primitives on your own machine.
    • A shareable board behind a short link.

THE VERSIONS BETWEEN THE ONES LISTED WERE SMALL CORRECTIONS SHIPPED THE SAME DAY — COPY, SPACING AND WORDING — AND ARE ROLLED INTO THE ENTRY ABOVE THEM. UPDATES: LAB@NOISELAB.IT