Release planning

CadCraft 0.9 impact map

Every fix and feature lined up for 0.9, and what each one touches: which apps, and which layers of the stack.

ProjectCadCraft
Sheet0.9 impact
Items273
Date2026-11-09
115Fix
147Feature
4Spike
0Platform
0Site ops
0Sanity check
7Decision
≈ 0days in the written 0.9 plans
  • Planned 0 on the plan for the release it is filed under
  • Built 271 built and working in /lab (the dev builds). Whether the public has it is its reach: "in the lab", "Live" (the last gate) or "switched off"; see docs/REACH-LIVE.md
  • Partly built 1 part of it is built in /lab; the rest waits (see "Waits on")
  • Promised 0 the live site already says it is coming
  • Moved 0 moved here from an earlier release or wishlist
  • Found 0 bug found after a release shipped; fixed in a point release or the next one
  • Candidate 0 recommended in a spike or session log; owner to choose
  • Community please test 0 built and in /use; a Discord post gives the steps and the expected result and asks people to try it on their own devices, files or know-how
  • Decision Time 0 a decision, check, file, key, flag or go only you can give; folds into the list once answered

Built means built and working in the lab. Live means the public can use it, and is the last gate: 270 Built · Live, 1 Built · in the lab.

Sheet 1 · impact areas

Where 0.9 lands

How many items touch each app and each layer, by kind. One item can touch several areas, so the rows add up to more than the item count. Pick a row to filter the schedule below.

Impact areaFixFeatureSpikePlatformSite opsSanity checkDecisionAll
Apps
CadCraft 38 36 – – – – 2 76
BimCraft 27 53 2 – – – – 82
ModelCraft 19 45 2 – – – 2 68
MarkupCraft 16 11 – – – – – 27
TakeoffCraft 18 7 – – – – – 25
CivilCraft 14 32 – – – – – 46
DetailCraft 13 13 – – – – – 26
PartCraft 18 27 1 – – – – 46
Studio 2 5 1 – – – – 8
SuperCad Studio 22 17 – – – – – 39
Layers
Site and services 7 11 – – – – 5 23
Desktop host 1 1 1 – – – – 3
App shell 2 1 – – – – – 3
App code 10 28 3 – – – 3 44
Our engines – 12 1 – – – 1 14
Vendor engines – – – – – – – 0
Drawing surface – – – – – – – 0
Help and words 1 2 – – – – 1 4
Tests and tooling – – – – – – – 0

Sheet 2 · schedule

Every fix and feature

Grouped by track. App chips carry each app’s layer colour; Studio is in ink. "Waits on" names what has to happen first; the small lines under it say who asked and where the item is written up.

Add an item Fork map (Rust and C++ forks) The roadmap

Issues sync every 10 minutes; last sync Nov 9, 2026 7:00 pm.

ItemWhatAppsLayersStatusDaysWaits onIssues
Drafting and app features 4
FixTK.1 Link to TK.1Comment on TK.1 TakeoffCraft: show lengths in meters, centimeters or millimeters

TakeoffCraft's own settings tab gets "Show lengths as": Follow Global (the metric length unit starred in Settings > Global > Units, else feet-inches), Feet-inches, m, cm or mm. It changes how lengths read on the sheet, in the status bar and in the panels, and the heights too: item height/depth, thickness, head, base and the Levels dialog; a bare number typed in a height field is read in the shown unit. The 1/16, 1/8 and 1/4 inch picker shows only for feet-inches. Display only: quantities, costs and exports still use the exact lengths. Asked for on Discord (a user could not find a meters option). Built in the a Discord member build, checked by syntax and number formatting; not yet tried in a browser.

TakeoffCraft App code Built · Live – – From: Discord community (Discord) Discord, 2026-11-03
Platforms and stores 2
FixRL.2 Link to RL.2Comment on RL.2 /download notices brought up to date for 0.8

The Windows notice and the requirements table no longer say automatic updates are off: the Windows installer, .deb and AppImage check for updates (from the release's updates.json). The WebView2 notice says fixes arrive with each Studio version. The Spanish and Indonesian notices became one: every app offers the machine-made draft languages (count read from the CadCraft build), getting-started help only. Mac and Android still say updates are off (not in the feed).

Studio Site and services Built · Live – – From: owner (Owner) owner 2026-11-01
Fixes 104
FixFX.23 Link to FX.23Comment on FX.23 CadCraft: moving a hatch left its pattern behind

MOVE, ROTATE and SCALE moved a hatch's outline but its pattern stayed anchored where it was, so the lines shifted inside the shape. geom.js txEntity now takes the origin along, and for built-in patterns the angle and scale on a turn or scale. Mirror keeps the pattern angle. Found while building PLAN2D.1. Test tools/cadcraft-test/plan2d.mjs. Not tested: patterns from a file (custom lines) under rotation, which keep their angle.

CadCraft Built · Live – – From: Discord community (Discord) Discord, a Discord member, 2026-11-02
FixFX.47 Link to FX.47Comment on FX.47 Hatch pattern files (.pat) in CadCraft

Asked on Discord by a Discord member: does hatching work, and can .pat files be used? Hatching already worked (16 built-in patterns, scale, angle, origin, islands, associative, and a DXF/DWG file's own patterns). New: the HATCH command has a Pattern file option (F) that reads a .pat file (one or many patterns, comments, dashes and dots), and the patterns can be used by name (P, ? lists them). The hatch keeps its pattern with it, so it still draws on another computer and still takes scale and angle in Properties; DWG save writes its lines. A .pat file has no unit: sizes are taken as drawing units. New file: a Discord member/patfile.js; hatch.js patternFamilies; test: 'Hatch pattern files' (6 checks). Not done / untested: no pattern picker with previews; a patterns library that stays between sessions (the file is read again next time); a real .pat file from another program (tested with files written to the format only); DXF export still writes the outline only (as for every hatch).

CadCraft Built · Live 1 – From: Discord community (Discord) Discord, a Discord member, 2026-11-05
FixFX.49 Link to FX.49Comment on FX.49 BimCraft: Add levels takes heights below the lowest level

Asked on Discord by a Discord member: is there a way to create a level below the lowest level made so far? The Levels panel already had Add a level below (DC.119). The Add levels dialog (At these heights) still refused anything under 0; it now takes negative heights (for example -10'-0", -20'-0"): the new level reaches up to the next level above it and is named Level -1 (nearest the ground), Level -2, and so on. One undo step. Test: draw06 'Add levels at -6000 and -3000' (225/0). Not tested: a real project with walls or a slab at the lowest level (the levels are added, nothing else moves), a desktop build.

BimCraft Built · Live 1 – From: Discord community (Discord) Discord, a Discord member, 2026-11-04
FixFX.1 Link to FX.1Comment on FX.1 BimCraft: Move works on stairs (and ramps, railings, roof planes, free-standing devices, pictures, paths)

Reported from the browser edition of BimCraft 0.8.1: with an L-shaped stair with winders selected, Build > Move did nothing and a drag panned the plan. Move, Align and Distribute only knew walls, floors, columns and placed library items. Now a stair moves by a vector (its steps, rails and stairwell are made again; one undo step; selecting any of its parts counts as the stair). The same fix covers ramps, railings, roof planes, free-standing electrical devices, pictures and paths / driveways / patios. Devices on a wall, foundations, floors, ceilings, rooms, countertops, framing, dormers and doors / windows follow their parent and are not moved on their own. Copy is refused for these (as for placed items). No grips on a selected stair: Move is the way. Tests: bin/test-bimcraft.mjs --modify (stair, ramp, railing, roof plane, device); pictures and paths wired but not yet exercised by a test. Site masses and terrain are not movable.

BimCraft Built · Live – – From: site feedback (Site) feedback email 2026-11-03, BimCraft 0.8.1 browser
FixFX.2 Link to FX.2Comment on FX.2 Render falls back to WebGL when the GPU cannot start (Windows dxcompiler.dll error 87)

Reported by email: 'Failed to execute requestDevice on GPUAdapter: DynamicLib.Open: dxcompiler.dll Windows Error: 87' and the render stopped. The WebGPU path tracer already fell back to WebGL when GPU setup failed, but a requestDevice rejection carried no code, so the fallback never ran. pt-gpu.js and pt-denoise-gpu.js (BimCraft and ModelCraft) now tag that failure gpu_setup, so the still render drops to the WebGL engine instead of failing. The live view (ipr.js) calls the tracer without that fallback and may still show the error; not checked. Not tried on a Windows machine with the broken driver. Advice to the reporter: update the graphics driver and the browser, send chrome://gpu.

BimCraftModelCraft Built · Live – – From: site feedback (Site) feedback email 2026-11-03, Windows WebGPU
FixFX.3 Link to FX.3Comment on FX.3 CadCraft: Thai text prints in a PDF plot (was "?")

Reported on CadCraft 0.7.1 in the browser: PLOT to PDF printed every Thai character as a question mark (command line: '219 characters the PDF font has no glyph for'). Cause: plot.js embedded Liberation Sans (Latin, Greek, Cyrillic) and fell back only to the CJK font, which has no Thai. Fixed in the a Discord member build: a Thai font (Noto Sans Thai, OFL 1.1, Thai + Latin + digits, ~220 KB, assets/vendor/thai-sans, current symlink) is fetched only when a plot has Thai text, subset to the glyphs used and embedded with a ToUnicode map. Thai tone marks are placed by pdf-font.js (the font has no layout engine here): centred over upper vowels, over sara am's ring (น้ำ), left of tall consonants (ป่ ฝ่ ฟ้), lower vowels under ญ ฐ. Checked by rendering a PDF (ที่ นี้ ผู้ ก็ ป่า น้ำ ห้องน้ำ พื้น ชั้น) and by 6 new tests in bin/test-cadcraft.mjs (2772 pass). Not covered: characters the Thai font lacks (± and ⌀ print "?" in a Thai plot and are counted in the report); one font per file, so a drawing with Thai and Chinese together keeps whichever leaves fewer "?"; Arabic, Hebrew and Indic scripts still have no font; SVG / PNG plots use the browser's fonts and were not changed. LIVE in the browser edition since 2026-11-03 as CadCraft 0.8.2 (0.8.1 plus only these files; docs/releases/0.8.2.md). Studio and the desktop apps get it with the next Studio build.

CadCraft Built · Live – – From: site feedback (Site) support email 2026-11-03, CadCraft 0.7.1 browser
FixFX.4 Link to FX.4Comment on FX.4 /studio facts list no longer says "Live: Local code (invite links not open yet)"

The Studio page's facts list had a Live row reading "Local code (invite links not open yet)" while invite links are off. The row now shows only when invite links are open (LIVE_PUBLIC), as "Local code, or invite link". The Live section lower on the page and the FAQ still say invite links are not open yet; bin/test-product.php updated, not re-run.

– Site and services Built · Live – – Owner, 2026-11-03
FixFX.5 Link to FX.5Comment on FX.5 Privacy notice: "Placeholder document" box removed

/legal/privacy no longer carries the dashed Placeholder document box saying it was not reviewed by the owner or a lawyer. The terms page still has its own. test-resources.php updated and passing (274). The wording itself has not had a legal review.

– Site and services Built · Live – – Owner, 2026-11-03
FixFX.6 Link to FX.6Comment on FX.6 Tutorials: each app's What's new said 0.7; now 0.8 and 0.8.1

The eight apps' What's new help topics still described 0.7, including in the frozen 0.8.1 builds. New "What's new in 0.8 and 0.8.1" topics written from the release notes (a Discord member help, compiled); the 0.7 text stays as whats-new-0-7. The site shows the a Discord member copy of the release-note topics only when its title names the shown build (Help::withReleaseNotes); the 0.8.1 builds' in-app help still has the 0.7 text. Translations of the topic are stale. The eight pages were written by background agents; only TakeoffCraft's was read through by hand.

– Help and wordsSite and services Built · Live – – Owner, 2026-11-03
FixFX.8 Link to FX.8Comment on FX.8 Studio Live invite links opened to everyone (LIVE_PUBLIC on)

The invite link (Studio Live from anywhere, through the relay at wss://getcadcraft.com/live/relay) was built and tested since 0.5 but held behind .env LIVE_PUBLIC=0, so /studio, the pricing/FAQ copy and the apps' help said "not open yet". Owner said do it now: LIVE_PUBLIC=1. The site copy follows the switch by itself (/studio Live row, Invite link card, FAQ). a Discord member help for the eight apps (work-live) and MarkupCraft's not-built-yet list updated and compiled. Rules unchanged: the host needs a Team Cloud Plan seat, guests join free, 5 open rooms per host. Checked: relay test 26/26, paid-live gate 10/10, live-rooms 98 of 99 (the one failure, 'no Join in the browser while no public build takes live sessions', was failing before the switch and looks stale because 0.8.1 builds accept live). NOT checked: an invite link run end to end between two real Studios on different networks; the frozen 0.8.1 in-app help and Tutorials pages still say invite links are not open yet until the next release.

– Site and servicesDesktop host Built · Live – – Owner, 2026-11-03
FixFX.9 Link to FX.9Comment on FX.9 EnergyPlus check and address lookup add-ons could not be switched on

The add-on loader refuses a description over 400 characters. BimCraft's EnergyPlus add-on (451) and CivilCraft's site-geocode-osm add-on (488) were over it, so neither could be switched on. Both descriptions shortened (388 and 369), same facts. test-addons-apps 112/0. Untested: switching each one on by hand in /lab.

BimCraftCivilCraft Built · Live – – Found by session climate-futures-09, 2026-11-03
FixFX.10 Link to FX.10Comment on FX.10 SRK bubble point lands on a wrong root near the critical region

lib/process: SRK methane/propane 40/60 at 30 bar flashes two-phase at 230 K, yet the bubble point at 30 bar is 269.8 K; the vapour-fraction flash inherits it. Likely wrong root near the critical region. Not fixed yet (docs/0.9-sessions/cape-open-09.md). engineer-09 2026-11-05: Reproduced (SRK methane/propane 40/60, 30 bar): bubbleT 269.77 K while flashPT was already two-phase from about 215 K. Cause found: not the cubic's root choice. The saturation scan starts at 30 K, where the incipient vapour collapses onto the feed (the trivial solution); that collapsed composition was carried as the warm start to every later grid point, so the residual stayed the 'no second phase' flag (-1) up to 269.8 K, where the flag flipped to a real residual and the bisection took the flip as the root. Fixed in lib/process/thermo.js: a trivial warm start is thrown away and the Wilson seed tried; every sign change on the grid is a candidate and the first one that passes the stability condition (Michelsen tangent-plane test: stable just on the liquid side, unstable on the other) is returned (result.stable). Now 214.43 K; flashPVF(30 bar, V of the 230 K flash) gives back 230.000 K (was 269.77). Reference (measured, not typed from memory): May et al., J. Chem. Eng. Data 60 (2015) 3606-3620, doi 10.1021/acs.jced.5b00610, via NIST TRC ThermoML data sets 3-4, 243.62 K isotherm: x(C1) 0.3442 at 3909 kPa -> SRK (kij 0) 3943 kPa (+0.86 %); x 0.071 at 891 kPa -> 908 (+1.96 %). Tests: node tools/process-test/test.mjs 132/0 (10 new FX.10 checks), all 13 other process-engine suites one at a time, real page: node tools/process-test/browser-fx10.mjs 4/0 (/lab/cadcraft, the Flash and saturation calculator) and tools/capeopen-test/browser.mjs 13/0. Copies synced to cadcraft and bimcraft a Discord member/process.

CadCraft Built · Live – – Found by session cape-open-09, 2026-11-03
FixFX.11 Link to FX.11Comment on FX.11 Studio add-on consent dialog no longer says "to draw your picture"

Studio's dialog before an add-on runs a program said it was "to draw your picture" (written for render engines), which is wrong for the Chip design add-on and any other. Sentence now ends "with a script that comes with the add-on." in desktop-shell src-tauri/src/engines.rs, the site copy tools/render/studio-bridge/engines.rs and docs/ADDONS-SPEC.md. Untested: no Studio build was made (not compiled on the VPS).

Studio Built · Live – – Owner 2026-11-03 (found by chip-runners-09)
FixFX.12 Link to FX.12Comment on FX.12 Library item page: shows whether X, Y and Z are scalable; "Scale: Fitted" removed

Reported by the owner: the title strip under the drawing said 'Scale: Fitted', which only meant the plan was drawn to fit the frame and told nothing about the object. That cell is now 'Scalable' (No, or the axes, such as X, Y), the caption says the drawing is drawn to fit, not to a scale, and the Data table has one row per axis (Scalable: width (X), depth (Y), height (Z): Yes or No) under the sizes. The 'Stretching' row in the facts list is gone, since it said the same thing. Values come from library_versions.stretch; shown for equipment, furniture, fixtures, doors, windows, symbols and details. Checked on the live page on a none item and an x,y item.

– Built · Live – – From: owner (Site) owner 2026-11-03, library item page
FixFX.13 Link to FX.13Comment on FX.13 MarkupCraft: removed markups stayed readable inside the saved PDF

Found while building NOTES.1. Saving took a deleted or rewritten annotation off its page but left the object in the file, with its text and appearance, so anyone reading the PDF's bytes could still recover it. Save now deletes those objects, their appearance streams and photo attachments. Checked by opening every object and stream of saved files in bin/test-markupcraft-notes.mjs and tools/markupcraft-test/browser-notes.mjs. In /lab, not released. Copies saved by earlier builds still hold them until saved again.

MarkupCraft Built · Live – – From: owner (Site) found building NOTES.1, 2026-11-03
FixFX.14 Link to FX.14Comment on FX.14 Student Program: applications stay out of the inbox; every program email shows its Brevo status

When the verify step was added, StudentProgram::apply still created a normal Contact message, so each application landed in /admin/messages, mailed staff and sent an acknowledgement next to the verify email. Now the form's words are kept as an archived message (Contact::submit ctx quiet), with no staff note and no acknowledgement. /admin/students has a Last email column and a notice for verify emails that did not get through; /admin/student has an Emails section (status, opened, clicked, the refusal reason), from email_log. The resend message says the email was handed to Brevo, not that it was sent. Found through a school (itcgalilei.edu.it) whose mail server refuses our mail with 550 5.7.1; that applicant cannot verify at that address. Tested with bin/test-student-program.php (91 pass) and by rendering the pages on real rows; no new application has gone through the live form since.

– Site and services Built · Live – – Owner, 2026-11-03
FixFX.15 Link to FX.15Comment on FX.15 SuperCad: reopening a project could overwrite a marked-up PDF

Found building NOTES.1. A saved project holds name.pdf and name (marked up).pdf, and reopening opened both. Both save as name (marked up).pdf, so saving the original's sheets could overwrite the marked-up copy and its markups. A PDF with a marked-up copy now stays in the project but does not open. Checked in tools/super-test/private-notes.mjs, in /lab. Not released.

MarkupCraftSuperCad Studio Built · Live – – From: owner (Site) found building NOTES.1, 2026-11-03
FixFX.16 Link to FX.16Comment on FX.16 TakeoffCraft: areas in m² on the drawing, wall area in the tables, currency symbol

Reported on lab pass 18 (TK.1) by a Greek tester: (1) an area measured with a metric item showed m² in the table but 'SF' in the drawing label and the mark panel. Now one areaShow() writes m² when the item is priced in metric or lengths show metric (m/cm/mm), else SF; used for the drawing tag, the mark panel (area, back-outs, plan area, outline, cut-outs, wall area). (2) A linear item with a height only showed its wall area in the item editor; the Items list now ends 'wall 12.34 m²' and the by-item quantities table gets a note row under it (length × height). Tiling a bathroom: floor = an area item in m², walls = a linear item with the wall height (or an assembly component with formula A priced per m²). Not built: one combined floor + walls total, or pricing a linear item per m² directly. (3) New Settings › TakeoffCraft › Currency symbol ($ € £ CHF kr zł R A$ C$): prices, bid PDF, CSV/XLSX number formats. Display only, nothing converted, per viewer (not saved in the project file). Existing suite 1196 pass; no new test, not tried in a browser; other languages show English for the new strings.

TakeoffCraft Built · Live – – From: site feedback (Site) lab pass 18 feedback 2026-11-03
FixFX.17 Link to FX.17Comment on FX.17 Account pages: side panel redesigned

Owner 2026-11-04 on /account/developers: 'left panel design it better'. The panel was a flat list of up to 12 links floating on the page grid, and on a short window its sticky list could leave the last links out of reach. Now it is a ruled box like the settings sections, with the account's address at the top and links grouped as Account, Cloud, Library and add-ons, Programs and Bidding, in the same order as before; a group with nothing to show is not drawn. The current page has a tint and a blue bar, and the panel scrolls by itself when it is taller than the window. Phones keep the wrapping tabs. Checked on the account pages at desktop and phone sizes, in Paper and Model. Not checked with SuperCad Studio and Your students showing together (12 links).

– Built · Live – – From: owner (Site) owner 2026-11-04
FixFX.18 Link to FX.18Comment on FX.18 Developers page: Make a key redesigned, form errors now show

Owner 2026-11-04 sent a screenshot of /account/developers. The form was a narrow column with a long flat list of permissions. Now it fills the section, permissions are a table of areas by See and Change with the scope name in small text, Data choices sit side by side, and Workspace, Expires and Allowed addresses are grouped as Limits. The API keys section gets a docs button and a link to the first key. Bug fixed: after the Name field the form lost its form id, so a missing permission or a bad address said 'Check the highlighted fields' with nothing highlighted, and Workspace, Expires and Allowed addresses were lost. Checked with a real live key on a test account: bad input, make, show once, revoke; desktop and phone, Paper and Model. Sandbox keys could not be checked: the sandbox is not open.

– Built · Live – – From: owner (Site) owner 2026-11-04
FixFX.19 Link to FX.19Comment on FX.19 Developers page: new key panel and key list redesigned, Roll and Revoke ask first

Owner 2026-11-04: 'redesign the keys table and new key panel too', on the new key panel 'ugly'. The new key now sits in its own box with Copy key, above a Try it command with Copy command. The old command was cut off and could not run; the new one runs as pasted (/v1/account when the key may read it, else /v1/endpoints). The table became one block per key: name, mode, Expired or Paused, what it can do in the form's words, workspace, expiry, allowed addresses, last used, and the last calls as a small table. Roll and Revoke used to act on one click; both now ask first (needs JavaScript; without it they act at once as before). Checked with real live keys on a test account: copy, both commands answered 200, cancel and accept on the questions, roll, revoke; desktop in Paper and Model, phone in Paper. Not seen: Expired and Paused tags, Sandbox keys.

– Built · Live – – From: owner (Site) owner 2026-11-04
FixFX.20 Link to FX.20Comment on FX.20 Account: license certificates open in the MeCentral vault, not on this site

Owner 2026-11-04 on /account: the View links in the MeCentral vault card should go to the vault; 'there really should never be a link to view on getcadcraft'. View opened CadCraft's stored PDF unless a setting was on. Now a filed certificate links to its document in MeCentral, and one not yet filed has no link. The old /account/license-certificate page no longer shows the PDF: a kept link goes to that member's document in MeCentral, anything else is a 404. Staff keep 'CadCraft's copy' on /admin/accounts/view. A person has to be signed in to MeCentral with the vault opened to see the document.

– Built · Live – – From: owner (Site) owner 2026-11-04
FixFX.21 Link to FX.21Comment on FX.21 Account: a certificate whose MeCentral link fails opens a support ticket

Owner 2026-11-04: if the MeCentral link can't be obtained, open a support ticket, never show the local version. The broker cron now opens one ticket in /admin/messages (topic Licensing, with the member's address) for a filing that is held, rejected, filed with no document id, or unanswered after a day. Expected refusals (address not verified, not permitted, test fixture, account gone) open none. The member gets no acknowledgement mail; the /account card says 'We opened a support ticket for this' with no link, until the filing succeeds. No filing was failing when this went live, so no ticket has been opened on a real account yet.

– Built · Live – – From: owner (Site) owner 2026-11-04
FixFX.22 Link to FX.22Comment on FX.22 BimCraft: dragging a wall no longer skews the room, and Square up brings 90 degrees back

Discord report with screenshots: dragging a wall's centre grip slightly off square tilted both joined walls, and nothing brought the room back to 90 degrees. The grip moved the wall by the whole drag and carried the joined corners with it; Length did the same. Changed in the lab build. The centre grip moves the wall square to itself; its corners slide along the joined walls, so they keep their angle at any angle, and partitions butting into it come along. Ctrl (Cmd) gives the old free move. An end grip catches square to the wall joined at its other end within 3 degrees (Shift stays on the plan's axes, as before). Properties for a straight wall adds: Measure from (centre line, inside face, outside face), which Length and the new Room size read and set from; Move square (typed, + out, - in); Angle to joined wall (or Direction for a wall on its own); and Square up, which turns the connected walls within 10 degrees of a right angle to their main direction. A distance can be typed while a grip is held (Enter or letting go uses it, Esc drops the move). Each change is one undo step. Geometry in wall-square.js. Tested: tools/bimcraft-test/wall-square-test.mjs 56, browser-wallsquare.mjs 28 (the report's steps), browser-model, browser-comforts and --model pass. Not tested: a real project with many walls, doors in a wall whose corners slide at a non-right angle, or a desktop build.

BimCraft Built · Live – –
FixFX.24 Link to FX.24Comment on FX.24 Student Program: verifying the email issues the license, no approval step

Only .edu / .ac.xx addresses were issued on the verify click; any other school address (cvut.cz) waited in Waiting for a staff Approve. Now every verified address is issued at once (active, welcome email, certificate). The Approve button is gone. New column student_licenses.upgrades_until (migration 121): set to a year on issue, moved on a year by each yearly check (confirm) on the SAME license, never a new one. Test bin/test-student-program.php (94). Not changed: an active student still has every version; the date is recorded, shown nowhere yet, and not yet read by the entitlement.

– Built · Live – – Owner, 2026-11-04
FixFX.25 Link to FX.25Comment on FX.25 Website: show/hide eye on password fields (sign in, create account)

Password fields had no way to check what was typed. /login, /signup and /admin/login now have an eye button inside the field that shows or hides the password. Because it lives in the shared account/field.inc, the reset-password page, the password fields on the profile page and the app sign-in confirm page get it too. The button appears only once site.js runs (no dead button without JavaScript); the field goes back to masked on submit so browsers still offer to save it as a password; Edge's own eye is hidden so there are not two. Tested in headless Chromium on /login, /signup and /admin/login (reveal, re-mask, masked on submit, no JavaScript). Not tried on the other pages, in Edge or Safari, or with a screen reader. Not added to the cloud encryption passphrase, own-storage secret or SSO secret fields, which do not use field.inc.

– Built · Live – – From: owner (Site) owner request 2026-11-04
FixFX.44 Link to FX.44Comment on FX.44 Student Program: tell applicants what to do when the verify email never arrives

Some school mail servers refuse outside mail (seen: itcgalilei.edu.it, 550 5.7.1), so an applicant at such a school waits for a link that never comes and we cannot email them to explain. The notice after applying and a new "No email from us?" item beside the form on /education now say to check spam, then apply again with another address. Since FX.24 another address gets the license on the click, with no approval. The staff alert discussed with this fix was not built: no application waits for approval any more. Tested with bin/test-student-program.php and the live page; no one has yet applied after seeing the new words.

– Site and services Built · Live – – Owner, 2026-11-05
FixFX.52 Link to FX.52Comment on FX.52 Student Program: school address at the door, and applicants see what happened to our email

Owner 2026-11-05: a verified address alone does not show someone is a student, and an applicant could not tell that our email never reached them. Personal mail providers (Gmail and the like) are now refused at the form, for students and teachers. Any other host passes, because real schools often have no .edu in the address (cvut.cz, ualg.pt). After applying, the person lands on /education-status, which shows whether our email is on its way, was delivered, was refused or found no mailbox; applying again with the same address brings them back there. Only a refusal by their school's server (like the 550 5.7.1 we saw from itcgalilei.edu.it and aglousa.com) unlocks using another address; a mailbox that does not exist does not, or a made-up address would open the door. Staff see the refused address on the row. Quarantined mail reports as delivered: those people are told to write to us from the school address, and staff use "Issue without the click". Migration 123. Tests in bin/test-student-program.php (140 pass). Not done / untested: no real outside applicant has used the page yet, and no real refusal has been seen through it (the states were set by hand on a fixture, against the live site). The personal-provider list cannot be complete and does not cover throwaway mail services. A person who knows a school that refuses mail could still name it to reach the other-address form. Nicolas and the aglousa.com applicant can only find this by coming back: we have no way to reach them.

– Built · Live 1 – Owner, 2026-11-05
FixFX.53 Link to FX.53Comment on FX.53 Student Program: 3-year term, with proof of enrollment to go longer

Owner 2026-11-05: a student license now runs 3 years from issue: a check after year one and after year two, then it stops by itself with no third check. Neither a new check, an old link nor a staff check brings it back; staff extend it a year at a time after seeing proof, with a required note (/admin/student "Extend by a year"). Proof arrives by email to the inbox, so no documents are stored on the site. The installed program keeps working and keeps the versions it covered, as before. Teachers have no term. Licenses issued before this rule keep the old terms (term_ends_at empty). Copy updated on /education, /supercad, the join page, emails, the license certificate and the educator kit; the four kit PDFs were rebuilt. Not done / untested: the term was tested with a fake clock, and the first real term ends in 2029. A 4-year degree will need the proof step in its last year. The Developer API docs do not mention the term; teachers' systems see the end of a term as student.stale.

– Built · Live 1 – Owner, 2026-11-05
FixFX.54 Link to FX.54Comment on FX.54 Student Program: leftovers from when staff approved applications

/admin/students opened on an always-empty Waiting tab: it now opens on Active, and Waiting hides when empty. The form's note hint promised a proof-by-reply check that no longer existed. The welcome email's preview said "Sign in with your school email" even for other addresses. The verify email still said a person would check non-school addresses. The kit said a .edu address was needed for an instant license. All corrected. Also: t= links are now hidden in the analytics log, because the status link is private.

– Built · Live 1 – Owner, 2026-11-05
FixFX.55 Link to FX.55Comment on FX.55 BimCraft: typing LEVEL does nothing and the ribbon has no Levels button; optional side-panel accordion with a lock (setting, default off)

a Discord member, 2026-11-05 (working in /lab with the drafting ribbon): the help describes the Levels panel, but typing LEVEL on the command line said Unknown command and no ribbon button led to it. Built (/lab, a Discord member): the command line takes LEVEL, LEVELS, STOREY, STOREYS (opens Add levels…); a Levels button sits in the Home > Levels group (Drafting ribbon), the Architecture > Model group (Ribbon) and the Home menu (model.levels in input-bimcraft.js). The left/right panel's collapsible sections (Find, Quantity totals, Checks, Clash …) close each other so the one you opened has the focus when Settings > BimCraft > Side panels is on (default OFF, owner's call 2026-11-05); a lock beside each caret keeps one open, remembered on this device (panel-focus.js). Test: tools/bimcraft-test/browser-levels09.mjs, 15/0. Not in the Docked/Duncan layouts' own tool sets (the docked ribbon already had Level). New strings are English only until the next language sync.

BimCraft App code Built · Live 1 – From: Discord community (Discord) Discord, a Discord member, 2026-11-05
FixFX.58 Link to FX.58Comment on FX.58 BimCraft wall Length in Properties (5000) differs from the plan dimension (5092) with no stated reference

Reported 2026-11-05 in Duncan's wall tool specification (page 1). In the Room 1 test the Properties panel showed Length 5000 while the plan dimension on the same wall read 5092; nothing says which reference each figure uses (location line, finish face, core, centreline, or end-to-end after joins). Wanted: both figures name their reference, and they agree or the difference is explained. Cause not investigated yet. Status: not started. Tracked as a document with status notes: /roadmap-internal, 'BimCraft wall tool specification' (docs/team-roadmap/bimcraft-wall-tool-specification.md). Source PDF: dropai.zone/d/vRSxnoBw. wall-fix 2026-11-05: CORRECTION: FX.22 already added Measure from (centre | inside | outside) to the Length field (wall-square.js lengthFrom) so 5000 vs 5092 can be explained; whether the plan dimension and the Properties field now agree by default, and name their reference, is not checked (spec test 9, decision D3). walls-09 2026-11-06: Length and the plan's wall dimension now read the same reference, named on the model bar (Measure from: centre line by default, decision D3; inside or outside face) and in Properties; spec test 9 Pass (node: both 5000 on centre line, both 5114.3 on the outside face). Cause of Room 1's 5000 vs 5092, from reading: Length read the centre line while the plan dimension read the outside face; NOT reproduced on Duncan's own file (we do not have it). The hand check is part of WT.3-HAND.

BimCraft Built · Live 1 – From: Duncan (Session) Duncan, wall tool specification 2026-11-05
FixFX.59 Link to FX.59Comment on FX.59 CadCraft 2D plan walls: joins are found by position at each edit, not stored; same edit rules as BimCraft wanted

Wall tool spec (Duncan, 2026-11-05), tracked at /roadmap-internal 'BimCraft wall tool specification'. Assessed 2026-11-05 as part of FX.57. CadCraft's plan walls (lib/plan2d/walls.js, used by app/walls-cmd.js) have their own engine. followMoves already carries a wall joined end to end and slides a T end along its own line, which is more than BimCraft's Move does. But joins are still guessed from end positions each time (no join record), there is no Disallow join or Split that keeps joins, and a typed length or a thickness change has not been checked against the five rules (joined walls follow and stay joined, selected wall moves and the reference holds, location line holds, one undo step, Length and dimension name their reference). Wanted: run the spec's nine tests (they are plan-view, they apply as written) against CadCraft, fix what fails, and share the join record with FX.60. Not tried yet; nothing changed. Page 3 check (2026-11-05): followMoves puts a shared end at the moved end and leaves the far end, so a neighbour turns when a wall is moved sideways (finding 2 applies here too: FX.63); T ends already slide (finding 3 does not apply). Move already follows joins (finding 1 does not apply). walls-plan-09 2026-11-06 (done): Built in /lab: CadCraft plan walls store their joins. Each wall has its own id and the join records (end meets start, end meets mid for a T, mid meets mid for a crossing: the same record as BimCraft, rules in lib/walls/joins.js, checked equal to BimCraft's wall-joins.js); both walls carry it, in the... see docs/0.9-sessions/walls-plan-09.md.

CadCraft Built · Live 1 Hand check is community test WTPLAN-HAND (not blocking) From: Duncan (Session) Duncan, wall tool specification 2026-11-05 (page 2)
FixFX.61 Link to FX.61Comment on FX.61 Apps that read or draw walls (DetailCraft, TakeoffCraft, CivilCraft hardscape): check what stored joins change

Wall tool spec (Duncan, 2026-11-05), tracked at /roadmap-internal 'BimCraft wall tool specification'. Assessed 2026-11-05, no change yet. DetailCraft: wallPanel frames one wall at a time (lib: framing.js); corner and T framing (extra studs, backers) would follow a join record once it exists. TakeoffCraft: scene3d wall strips and wallOutline use mitred joints for takeoff; counts should not change, but check them against BimCraft's net-of-joins quantities after FX.57. CivilCraft landscape: hardscape walls (retaining / freestanding polylines) have no join model; two garden walls meeting at a T are drawn as separate runs. Wanted: after FX.57 lands, re-run each app's wall quantities and drawings on a joined-wall file and file a row for each real difference; do not add join code to these apps by hand. ModelCraft (print-walls is wall thickness for printing), MarkupCraft and PartCraft have no joined walls. walls-plan-09 2026-11-06: Checked 2026-11-06 (read the code and measured): DetailCraft, TakeoffCraft and CivilCraft hardscape read neither the join record, nor a wall's thickness, nor CADCRAFT_WALL. DetailCraft wallPanel takes a spec (length, height, openings, stud sizes); TakeoffCraft's wallOutline is its own mitred run with a thickness it is given; CivilCraft hardscape walls are open polylines with their own thickness. Measured: a CadCraft DXF of a four-wall room opened with TakeoffCraft's and CivilCraft's readers gives 4 INSERTs and 8 LINEs in 4 anonymous blocks, extended data kept, nothing else read; so a stored join changes none of their quantities. What would change: nothing breaks. Corner and T framing in DetailCraft and joined hardscape runs in CivilCraft would be NEW features that could read the record (no row made: nothing differs today). Not run on a BimCraft IFC with join records through DetailCraft's IFC export (that it keeps the unknown relationship lines is untested).

TakeoffCraftCivilCraftDetailCraft Built · Live 1 – From: Duncan (Session) Duncan, wall tool specification 2026-11-05 (page 2)
FixFX.65 Link to FX.65Comment on FX.65 BimCraft thickness / type change: the corner follows only when exactly one straight wall meets the end

Wall tool spec page 3 (Duncan, 2026-11-05), tracked at /roadmap-internal 'BimCraft wall tool specification'. Code checked in the a Discord member source 2026-11-05 (the spec read commit a538e43). Found while checking the 'Already right, keep it' list on page 3: updateWall, the location-line shift (changes.justification not centre): neighbours are looked up and then skipped unless nbs.length === 1 and the neighbour is not curved. So a thicker wall at a three-wall node, at a T, or next to a curved wall keeps its old corner and the junction is left open or overlapped, while the two-wall straight corner case Duncan tested works. Wanted: spec test 5 (set the location line to the exterior face, thicken the wall: exterior face does not move, wall grows inward, joins clean up) at L, T, X and curved neighbours. Not reproduced yet; nothing fixed. Other apps: the same question applies to CadCraft's plan walls (thickness change) and goes into FX.59's test run. walls-09 2026-11-06: Fixed in /lab: a location line that holds now moves the centre line square with the join solver (squareMove), so the corner follows at an L, at a node of three walls, at a T (the partition comes with it) and next to a curved wall. Spec test 5 Pass: node (--walltools) and the real page (outside face held at -92.1 with 300 thickness, both corners follow).

CadCraftBimCraft Built · Live 1 – From: Duncan (Session) Duncan, wall tool specification 2026-11-05 (page 3)
FixFX.66 Link to FX.66Comment on FX.66 Wall + Move / Copy: a moved or copied group of rooms does not stretch the joined walls outside the group

Wall tool spec page 9, 'How other tools combine with the wall' (Duncan, 2026-11-05), tracked at /roadmap-internal 'BimCraft wall tool specification'. Code checked in the a Discord member source 2026-11-05. Spec: move or copy a group of rooms and every joined wall outside the group stretches to stay joined (Place in space -> Join solver -> Follow; today Partly). Cause, from reading: Move is carryJoined: false (FX.62), and a copy goes through addWall (model-modify.js), so the copied walls are new walls that are not joined to anything outside the group, and nothing stretches. Wanted: Move stretches the outside neighbours (their ends slide along their own line, FX.63 / FX.60); Copy leaves the originals alone and makes the copies joined among themselves. Acceptance: spec test 1 style on a two-room plan, one undo step. OTHER APPS: CadCraft plan walls Move already follows joins (FX.59 notes the turning problem); Copy there is not checked. Not started. walls-09 2026-11-06: Checked, no code change needed after FX.62: a Move of a group of walls (one room of two) keeps the group's corners and the walls outside stay joined; Copy leaves the originals and the copies are joined among themselves (two corners). One undo step. Test: node bin/test-bimcraft.mjs --walltools (FX.66 block). Real page: the Move tool's group move was not driven in a browser by this session.

CadCraftBimCraft Built · Live 1 – From: Duncan (Session) Duncan, wall tool specification 2026-11-05 (page 9)
FixFX.67 Link to FX.67Comment on FX.67 Wall Length and typed dimension: no choice of fixed end, no marker for the fixed side, no modifier-key drag to break a join

Wall tool spec pages 11-12 (Duncan, 2026-11-05), tracked at /roadmap-internal 'BimCraft wall tool specification'. Checked in the a Discord member source 2026-11-05. Page 11 'BimCraft must' column, three things the code does not do: (1) Changing length: 'start end fixed by default; toggle to grow from the other end or the centre'. setLength (wall-square.js) always keeps the start end and moves the end; there is no toggle. (2) Typing a dimension value: 'a marker shows the fixed side before Enter'. No marker exists; the fixed side is not shown. (3) Breaking a join: 'only by Split, Disallow join, delete, or a modifier-key drag'. No modifier-key drag breaks a join (Split and Disallow join are WT.4 and WT.5). Wanted: a Grow from control on the Length field (start | end | centre) with the fixed side drawn on the plan while the field is focused, and a modifier-key drag (Revit's Move with Disjoin) that moves a wall without carrying its joins and keeps the wall's id. Spec tests 3 and 9. OTHER APPS: CadCraft plan walls have no Length field or toggle either (FX.59). Not started. walls-09 2026-11-06: Built in /lab: Properties › Grow from (Start holds | End holds | Centre holds) next to Length; the side that holds is marked on the plan while the Length field is in use; Alt + drag of the middle grip moves the wall free of its joins (they break, the id stays). Tests: --walltools (grow from end and centre, marker point), browser-walltools (grow from end, marker, Alt-drag).

CadCraftBimCraftSuperCad Studio Built · Live 1 – From: Duncan (Session) Duncan, wall tool specification 2026-11-05 (page 11)
FixFX.68 Link to FX.68Comment on FX.68 BimCraft lab: picking a wall with Draw off threw in the Properties panel (FX.22 read the drawing data that only exists while Draw is on)

Found 2026-11-05 by suggestions-followup-09 while fixing tools/ids/browser-bimcraft.mjs: with an IFC open and Draw off, picking a wall (for example from Problems) logged "TypeError: Cannot read properties of null (reading 'walls') at propsBlock" (model-ui.js). Cause: FX.22 (wall grips, Measure from) read S.data.walls, which is null unless Draw is on; propsBlock's own data (S.data when drawing, else a snapshot of the model) is the right source. The error was caught, so the panel just lacked the wall's Measure from and Length fields. Fix: one word in model-ui.js (all = data.walls). Lab only (FX.22 is 0.9 /lab); released 0.8.1 does not have the code. Checked 2026-11-05: in the real page (lab BimCraft, house fixture, Draw off) a picked wall shows Measure from + Length and no console error; tools/ids/browser-bimcraft.mjs 30/0 (its 'no page errors' check), tools/bimcraft-test/wall-square-test.mjs 67/0, browser-wallsquare.mjs 28/0.

BimCraft Built · Live 0.1 – From: session (Session) docs/0.9-sessions/suggestions-sweep-09.md § Follow-up
FixFX.69 Link to FX.69Comment on FX.69 Two stale tests: TakeoffCraft learn.mjs expected the released build to ignore learn data; the BimCraft IDS browser test clicked a folded Undo

Found by suggestions-sweep-09 (2026-11-05), fixed by suggestions-followup-09 the same day; tests only, no app change (the app fix found on the way is the row above). (1) tools/takeoffcraft-test/learn.mjs loaded `current` as "the frozen release before learn"; current is 0.8.1 since 2026-11-02 and ships learn.js (identical to 0.8 and a Discord member). Now: the newest frozen folder WITHOUT learn.js (0.7) must ignore the section, and current (0.8.1) must read it back identical. Before 104/1, after 107/0. (2) tools/ids/browser-bimcraft.mjs clicked [data-undo] / [data-save] in the left panel's Changes section, which the shell's Auto-focus panel (app-settings.js, on by default) folds while the IDS section is open: by design, not a regression. It now asserts that fold, undoes with the toolbar Undo and with Ctrl+Z (both proven to remove the IDS reference and its 13 problems; Ctrl+Y brings them back), saves with Ctrl+S, and waits for 'Saved' before reopening (sooner is refused with 'Still working on the last one…', correct). Before 13/1 (the run stopped at undo), after 30/0.

BimCraftTakeoffCraft Built · Live 0.1 – From: session (Session) docs/0.9-sessions/suggestions-sweep-09.md § Follow-up
FixFX.71 Link to FX.71Comment on FX.71 BimCraft test "dimensions retain IDs across redo, type swaps, flips, curves and rebinds" fails (tools/bimcraft-test/wall-precision.test.mjs)

Found 2026-11-05 while running the BimCraft suites for the join record (FX.60). node bin/test-bimcraft.mjs --walls: 6 of 7 pass; this one fails at wall-precision.test.mjs:65, after Undo then Redo of a saved wall dimension its GlobalId is a different one (readWallDimensions(...)[0].guid !== d.guid). It fails the same with the join sync switched off, so it is not from the join work; cause not looked into (a redo that runs the op again and makes a new GlobalId for the dimension is the likely shape). Wanted: Redo of a dimension keeps its id, like Redo of a wall type does (the test's first redo passes). Not started. walls-09 2026-11-06: Cause found: the CODE was wrong, not the test. saveWallDimension's op (wall-dimensions.js operation) drew a fresh GlobalId each time it ran, so Redo made the dimension again under a new id. It now hands out the same GlobalIds again on Redo, as model-ops.js op() does. node bin/test-bimcraft.mjs --walls: 15/0 (was 14/1).

BimCraft Built · Live 1 – test run 2026-11-05
FixFX.72 Link to FX.72Comment on FX.72 CadCraft: the object snap menu cannot be reached (status bar Snap, OSNAP command)

Emailed report 2026-11-05 (desktop build): clicking or right-clicking the Snap button in the status bar opened nothing, and OSNAP, DDOSNAP, SHORTCUTMENU and CMDDIA answered Unknown command; only OSMODE (numeric) worked. The snap kinds list existed but only behind a small chevron at the end of the status bar. Changed (a Discord member): a right-click on Snap opens the snap menu (closes on an outside click); OSNAP, DDOSNAP, OSNAPSETTINGS and SHORTCUTMENU open it too (commands.js, cadcraft.js, lang/en.json, English only for now). CMDDIA stays a system variable, not a command. Untested in a browser or the desktop app. Reporter has no account yet: invite mailed 2026-11-05 to create one for a lab pass.

CadCraft Built · Live 1 – email 2026-11-05
FixBot obtainedFX.73 Link to FX.73Comment on FX.73 Internal Roadmaps editor: the Markdown preview is white in Model view, so the light text cannot be read

In /roadmap-internal/edit the Markdown preview panel (.md-pv) had a fixed white background, while Model view turns the text light, so headings and paragraphs vanished (tables kept their own background). The panel now uses the theme sheet colour, so it follows Paper and Model.

– Built · Live 1 – owner screenshots 2026-11-05
FixFX.74 Link to FX.74Comment on FX.74 Suggestions and roadmap items link both ways in /admin

Staff can now link a /suggest ask to the roadmap item that builds it, from either page: /admin/suggestions shows each suggestion's linked items (key, title, release) with Unlink and a Link to roadmap box (item key like FX.26, release:key, or #id); the item's edit page has a Suggestions panel (linked asks with status and votes, Link a suggestion by number, Unlink). Staff only; linking tells nobody. RoadmapSuggestions + migration 125 (roadmap_item_suggestions, nothing deleted). Checked 2026-11-06 in code: link, duplicate refusal, both-way reads and unlink against the live database. Pages linted; not yet viewed in a browser.

– Built · Live – – From: session (Session) owner request 2026-11-06
FixFX.75 Link to FX.75Comment on FX.75 Vector layout: palette icon highlight no longer spans neighbouring tools

In the Vector layout the Basic palette's icons overlapped: the pressed Select cell was highlighted across Select and Hand together, and the Tool Sets rows were squeezed. The ribbon rule for compact tools (min width 5.2rem, dense height 1.25rem) outranked the palette's own sizing, so each cell rendered 83 x 20 px. The palette rules in assets/css/app-workspace.css now sit under .vw-toolpalette and win over it: every Basic cell is a 40 x 40 square lit on its own, and Tool Sets rows keep their height. One stylesheet, so all eight apps. Checked by measuring the cells in ModelCraft in a headless browser; the screenshot showed one lit cell.

– Built · Live – – From: session (Session) owner screenshot 2026-11-06
FixFX.76 Link to FX.76Comment on FX.76 Documents opens as a centered dialog, not a box in the corner

Owner 2026-11-06: Documents seemed to do nothing, and on large screens the placement was wrong. It opened as a small box pinned to the top right of the drawing area, far from the button. It is now a modal dialog centered on the window with the page dimmed, in BimCraft, PartCraft and CadCraft through lib/vault. Esc, the X or a press on the dimmed page closes it. Opening a file or a copy closes it so the file can be seen. Tested at 1280 to 3840 wide in the standard, Vector and Duncan layouts on SwiftShader; not on a real large monitor or in a Studio build.

CadCraftBimCraftPartCraft Built · Live – –
FixFX.77 Link to FX.77Comment on FX.77 Studio and browser-edition packers: stale file lists (suite stubs, hub files, docinfo and About modules)

Found by mounts-09 2026-11-06 while building the Studio suite for the undo test. (1) studio/pack/suite-stubs.php WORKSPACE_MODULES lacked app-workspace-icons.js and app-workspace-vector.js, so node pack/suite.mjs stopped with "a plain re-render differs from the edition's index.html" for every app: a Studio rebuild could not have been made. (2) pack/suite.mjs HUB_FILES did not copy the new hub/undo-journal.js. (3) tools/shell-test/test-packed-imports.mjs failed 6 checks: devshell/edition.php and devshell/pack.php lacked docinfo.js, app-docinfo.js and app-about.js (DI.1, ABT.1), so packaged editions would have asked for files that are not there. All three lists fixed; the suite packs for cadcraft, detailcraft and takeoffcraft and the test reports "all packers list every imported shell file". The full eight-app suite was not rebuilt here.

CadCraftBimCraftModelCraftMarkupCraftTakeoffCraftCivilCraftDetailCraftPartCraft Built · Live 0.5 – docs/0.9-sessions/mounts-09.md
FixFX.78 Link to FX.78Comment on FX.78 Tests: the team button sits in a folded panel section; add-on buttons are not registry commands

mounts-09 2026-11-06: tools/bimcraft-test/browser-r5.mjs clicked [data-model-team] while the shell's panel accordion had its section folded (a person opens the section first; the test now does too). tools/shell-test/browser-input-apps.mjs's "every toolbar button is a registry command" no longer lists add-on buttons (data-addon-tool), as print-09 asked; ModelCraft's 3D Print button passes. Still failing there, not from this session: "Move the Tools toolbar" (the toolbar tear grip) and the Settings style-card radio that is not visible; and tools/civil-mount-test/browser.mjs la4 clicks the first of two "Ground modifiers" menu items, which is hidden.

CadCraftBimCraftModelCraftMarkupCraftTakeoffCraftCivilCraftDetailCraftPartCraft Built · Live 0.5 – docs/0.9-sessions/mounts-09.md
FixFX.79 Link to FX.79Comment on FX.79 ModelCraft Surfaces solids test opens the folded Surfaces section first

tools/modelcraft-test/browser-solids.mjs failed before any change of 2026-11-06: the right panel now folds its sections (app-settings.js, one open at a time), so the Surfaces button was not visible. The test now clicks the Surfaces heading when the section is folded (as a person does), and expects 9 Solids commands (+ Fillet between faces, Thicken into a solid, SU.747c); PartCraft's browser-solids.mjs the same count. Both pass (14/0, 18/0). Not fixed here: ModelCraft's browser-trim.mjs, browser-scanfit.mjs and tools/nurbs/browser-scanfit-09.mjs open the panel the same old way (listed in docs/0.9-sessions/nurbs-s3-09.md § Found).

ModelCraftPartCraft Built · Live 0.1 – docs/0.9-sessions/nurbs-s3-09.md
FixFX.83 Link to FX.83Comment on FX.83 Settings > Layout: the layouts are a drop-down of two-line choices, not a long radio list

The layout list (built-ins plus add-on and imported layouts) grew into a long radio column. Now a button shows the chosen layout (icon, name, hint) and opens a pop-up list of two-line choices, scrolling past 24rem. The radios stay inside the pop-up, so picking, the extras list, Remove and the keyboard (arrows between layouts) work as before; Esc, a pick or a click elsewhere closes it; without JS the list just shows. Files: app-settings.inc, app-settings.js (wsCur, wsOpen), app-shell.css. Checked: syntax and php -l; not yet tried in a browser. Owner tried it in /lab 2026-11-06: works.

CadCraftBimCraftModelCraftMarkupCraftTakeoffCraftCivilCraftDetailCraftPartCraftSuperCad Studio App shell Built · Live – – From: owner (Owner) owner request 2026-11-06
FixFX.92 Link to FX.92Comment on FX.92 CadCraft: text styles (STYLE) and a font for every text

STYLE (ST, TEXTSTYLE; -STYLE on the command line; Draw > Text > Text style): named styles with font, height (0 = ask each time), width factor and oblique angle, kept in the file's STYLE table (DXF/DWG already read and wrote it). New TEXT and MTEXT take the current style's font, width and slant and carry its name; changing a style changes the text that uses it in one undo step; Apply to selected text; New / Set current / Delete (a style in use and Standard are refused). Text objects now have their own font (e.font) drawn and measured in that face (canvas measurement; monospace fallback). Files: textstyles.js, textstyle-ui.js, font.js, geom.js, view.js, mtext-draw.js, plot.js, commands.js. Tests: bin/test-cadcraft.mjs section Text styles and fonts; tools/cadcraft-test/browser-textstyle.mjs. Known limit: the plotted PDF sets text in Helvetica whatever the font (the screen and the plot preview show it).

CadCraft App code Built · Live – in /lab; outcome waits on the requester's lab pass (hand check: a font that is not installed falls back; plotted PDFs still set other fonts in Helvetica) From: Mohammad Imtaar (Staff) email 2026-11-06 (Mohammad Imtaar)
FixFX.93 Link to FX.93Comment on FX.93 CadCraft: MTEXT editor with font, size, bold, italic, underline, colour, alignment

The paragraph text box (MTEXT, TEXTEDIT, a double-click on text) is now a formatted editor: font list, size (the selection, or all of it with nothing selected), B / I / U / strike, colour, left / centre / right, degree, plus-minus and diameter signs, Ctrl+Enter to finish. It writes the MTEXT codes (mt) and the plain text (s), so find, snap, DXF and DWG keep working; text left unchanged keeps its own codes untouched; paste is text only. Files: mtext-edit.js, cadcraft.js (editText), commands.js, cadcraft.css. The command line's height (suggestion 1083, SU.1083) is the third point of the email: the handle on its top edge, or COMMANDLINE, or one line plus F2. Tests: bin/test-cadcraft.mjs; tools/cadcraft-test/browser-textstyle.mjs (headless Chromium).

CadCraft App code Built · Live – in /lab; outcome waits on the requester's lab pass (not built: bullet and numbered lists, the tab ruler, justify) From: Mohammad Imtaar (Staff) email 2026-11-06 (Mohammad Imtaar)
FixBot obtainedFX.94 Link to FX.94Comment on FX.94 Material flow Real mode: connect again after the link ended on PLC exceptions

When a Real link ended after several exception answers, Studio's socket stayed open (only the page stopped), so pressing Connect again was refused with "already connected". RealLink.connect now closes the old socket first. Found by tools/plc-sim/test.mjs against a software Modbus slave. Also plc.rs: the below-1024 port rule is a plain function with a test.

ModelCraft Built · Live – – twin-plc-09 2026-11-06
FixFX.96 Link to FX.96Comment on FX.96 CadCraft GRIDMOVE carried a whole plan wall that only starts on the grid line

Found by walls-plan-09 while locking walls to grid lines (WT.7): GRIDMOVE treats a block reference whose insert point lies on the line as a column and moves it whole, and a plan wall is a block reference, so a wall that merely STARTS on the grid line (the room's north wall at its east end) travelled away whole instead of being stretched. Fixed in gridmove.js: a plan wall is judged by its ends: an end on the line goes with it, both ends on the line move the wall whole, otherwise the wall stays. Test: node tools/cadcraft-test/walls-plan.mjs (WALLGRID then GRIDMOVE: east wall follows, south and north walls shorten, west wall stays). In /lab, not hand-tried: part of WTPLAN-HAND.

CadCraft Built · Live – – walls-plan-09 2026-11-06
FixFX.97 Link to FX.97Comment on FX.97 Settings > Plugins list in SuperCad stayed empty once the module waited for the routing table

The list was filled by a window load listener; the module now finishes after load, so the listener never ran. It fills at once when the page is already loaded. Found by the older browser suites (notes-tasks, timer).

SuperCad Studio Built · Live – – teams-sync 2026-11-07
FixFX.98 Link to FX.98Comment on FX.98 Sync merge endpoint did not return the "future" count, so a device could not tell a row was refused for its clock

api/v1/team/teams.php returned a fixed list of fields without future. Found by running the real client against the real server.

SuperCad Studio Built · Live – – teams-sync 2026-11-07
FixFX.99 Link to FX.99Comment on FX.99 Account database update stamps never moved forward: SQLite MAX() compared the bound stamp as text

PDO binds numbers as text, and in SQLite any text sorts above any integer, so MAX(?, updated_at + 1) always chose "now". Fixed with CAST(? AS INTEGER). Found by the last-writer tests.

SuperCad Studio Built · Live – – teams-sync 2026-11-07
FixFX.100 Link to FX.100Comment on FX.100 Synced rows with an exact timestamp tie never converged: each copy kept its own

Ties are now decided by a fingerprint of the row's content in both JS and PHP (shared vectors), so every copy picks the same row.

SuperCad Studio Built · Live – – teams-sync 2026-11-07
FixFX.101 Link to FX.101Comment on FX.101 SuperCad said "not signed in" for Teams sync although the person was signed in to the site

A SuperCad tab is signed in to the site by a cookie, but the account API takes a key, and nothing in the page fetched one (the add-ons client that does is mounted only for the eight apps and refuses SuperCad). New: POST /api/account/super-connect (same origin, guarded) mints a 30-day sync-scope key for the tab; super-account.js keeps it in the tab, reconnects once on a 401, retries when the tab regains focus, and tells the plug-in at once. Found when the person said they were signed in; my tests had injected a signed-in account object and never exercised this.

SuperCad Studio Built · Live – – teams-sync 2026-11-07
FixFX.102 Link to FX.102Comment on FX.102 SuperCad showed no "Starting up…" while it opened an app in a panel

The indicator in the bar ran only at page load. app-boot.js now has window.ccBoot.begin(name) / end(): SuperCad calls it while a panel opens an app, so the bar shows "Opening Building…" and then the files really being fetched, and hides it when the app is ready (new string shell.boot.mount). Single apps behave as before.

SuperCad Studio Built · Live – – teams-sync 2026-11-07
FixFX.103 Link to FX.103Comment on FX.103 SuperCad: an app's Open a folder / Documents buttons were tiny and unframed when docked, and tall frames in a view

The layout engine resets every button in its palettes to plain text (transparent border, 3px padding) and SuperCad's .sc button reset hit the app's panel once it was moved into the Properties panel, while the site's touch-size .btn-line (3 rem minimum, 17px bold) made frames in a view much taller than their label. Real buttons (btn-line, btn-plot) now keep a frame sized to the label in the layout's own text size, in both places (app-workspace.css, supercadcraft.css). Test tools/super-test/mount-ui.mjs.

SuperCad Studio Built · Live – – teams-sync 2026-11-07
FixFX.104 Link to FX.104Comment on FX.104 Layout ribbon: large tool buttons had a fixed 75px frame with about 30px empty under the label

app-workspace.css gave .ws-tool a fixed height of 4.6875rem (the "labels" mode already knew a frame should be its label's size). The frame now hugs its icon and label (about 50px). Shared by every app's ribbon. Test tools/super-test/mount-ui.mjs.

SuperCad Studio Built · Live – – teams-sync 2026-11-07
FixFX.105 Link to FX.105Comment on FX.105 SuperCad docked layout had no button to get back to the Home / welcome page

The docked title bar showed Open and Save only. An app that offers a home action (SuperCad Studio) now gets Home first in the layout's title-bar quick buttons (app-workspace.js quickIds); other apps are unchanged. Test tools/super-test/mount-ui.mjs.

SuperCad Studio Built · Live – – teams-sync 2026-11-07
FixFX.106 Link to FX.106Comment on FX.106 SuperCad panel tabs: the pop-out icon is replaced by the apps' "…" menu (move, show on its own, float, new window, hide)

Each panel tab, docked or floating, had a small pop-out icon that only tore the panel off. It now has the same "…" button the apps' panel grips have (app-workspace-popout.js menuButton), with Move to the left / middle / right / bottom (not the side it is on), Show on its own, Float in this window, Open in a new window (a real OS window), Hide this panel, and Put it back in the window for a floating one. Test tools/super-test/tab-menu.mjs.

SuperCad Studio Built · Live – – teams-sync 2026-11-07
FixFX.107 Link to FX.107Comment on FX.107 SuperCad: Teams and Team members are pages of the welcome area, not modal dialogs

A plugin can now register a PAGE (api.page / api.openPage; host.pages()) that the welcome screen shows with its own left-menu entry. Teams (menu entry) and Team members (reached from a team) are pages: no dialog, adding a team no longer drops you into the drawing space, and the Workflow buttons on the welcome page no longer leave it. The commands Teams, Team members and New team open the pages (New team puts the cursor in the name field). Tests tools/super-test/home-teams.mjs, bin/test-super-teams.mjs.

SuperCad Studio Built · Live – – teams-sync 2026-11-07
FixFX.108 Link to FX.108Comment on FX.108 SuperCad: the primary button on the welcome page (Continue SuperCad project) and other primary buttons had dark text on blue

.sc button { color: inherit } (and .sc-home button) outranked the button colours. Primary buttons now use the on-action colour (white) and the sheet colour on hover; outline buttons the action colour (supercadcraft.css). Checked by contrast in tools/super-test/home-teams.mjs.

SuperCad Studio Built · Live – – teams-sync 2026-11-07
FixFX.109 Link to FX.109Comment on FX.109 Accuracy: exact-equality comparisons reviewed, 7 given a tolerance, the rest tagged (new Changes tab)

Prompted by a community comment that floating-point == / === comparisons in the apps look suspect. All 367 candidates on /accuracy/comparisons were read. 7 now compare within a tolerance (1e-9 relative): electrical add-on (2 places), process dispersion, process vessel, PartCraft lattice, PDF rectangle corners (isAxisRect), window cut-list part merge. The other 277 were left exact on purpose (whole numbers, copied values, zero guards, typed codes, triangulation and ordering tie-breaks) and tagged with the reason in plain words. Every change is on /accuracy/changes with before, after, UTC time and a revert command (node tools/accuracy-equality/fix.mjs revert EQ-n). a Discord member (/lab) only. Not done: live shared shell (engines/risk/weibull.js, calc.js:240) waits for a release go; 6 needs-review items (EQ-0094, 0209, 0215, 0248, 0273, 0279) still to decide; app suites not re-run, edited files only checked to parse; reviewers' reasons come from reading code, not running it.

CadCraftPartCraft Built · Live – – From: community (Site) community comment, accuracy review 2026-11-07
FixBot obtainedFX.110 Link to FX.110Comment on FX.110 CivilCraft help: "Not built yet" said LAS and LAZ cannot be written

The Point clouds add-on writes a cleaned cloud as LAS 1.4 or LAZ (PC.14), but the "Not built yet" row and the elevation-grids topic still said "Writing LAS or LAZ". Both now say what is true: no LAS/LAZ from a surface or the elevation-grid and LiDAR tools; the add-on writes a cloud. Help rebuilt. Checked by reading; no test.

CivilCraft Built · Live – – closing 2026-11-07
FixBot obtainedFX.111 Link to FX.111Comment on FX.111 CadCraft help: "Not built yet" said a hatch cannot follow its boundary; .pat files had no help

PLAN2D.1 links a hatch to its boundary and FX.47 loads .pat files, but "Not built yet" still listed both as missing and hatch.md did not mention .pat. Rows corrected (gradient fills stay listed; a link made in another program is not read), a Pattern files paragraph added to the Hatch topic (only files written to the usual format were tried). Help rebuilt. Checked by reading; no test.

CadCraft Built · Live – – closing 2026-11-07
FixFX.112 Link to FX.112Comment on FX.112 CadCraft: the grid was drawn only inside the drawing limits even with the limits OFF

Drawing limits set (LIMITS) held the grid inside the rectangle whether the limits were on or off. Now the grid is held inside only while the limits are ON; OFF shows the full grid, and the limits outline stays, dashed. view.js drawGrid + limits.js note. Checked in the browser (tools/cadcraft-test/browser-aids.mjs, grid pixels outside the rectangle with limits off). Not checked: a drawing opened from a DWG that carries $LIMCHECK.

CadCraft Built · Live – – From: Mohammad Imtaar (Site) email 2026-11-07
FixFX.113 Link to FX.113Comment on FX.113 CadCraft: no Snap to grid (F9)

The status bar had only Object snap (called Snap, F3) and Grid (F7, display only). Added Grid snap (F9): picked points go to the nearest grid point of the UCS (the grid step on screen) when no object snap took the point; button in the status bar and every layout, F9, the keys registry (aids.gsnap), saved with the settings. Checked in the browser (browser-aids.mjs). Not built: a separate snap spacing apart from the grid (SNAPUNIT) and an isometric snap.

CadCraft Built · Live – – From: Mohammad Imtaar (Site) email 2026-11-07
FixFX.114 Link to FX.114Comment on FX.114 CadCraft: the object snap list could not be opened in the ribbon, toolbox and other layouts

The Object snaps list (chevron beside Snap) opened upward inside a block that clips its content (ribbon, status bar), so only Classic showed it. The list is now placed on the screen itself, up or down as there is room, and kept inside the window. Checked in the browser in all seven layouts (standard, docked, toolbox, autorev, duncan, vector, sketch): list fully visible and clickable. Not checked: a pop-out window of the aids.

CadCraft Built · Live – – From: Mohammad Imtaar (Site) email 2026-11-07
FixFX.115 Link to FX.115Comment on FX.115 CadCraft: long block list ran off the screen; INSERT gave no near names; FILLET radius prompt did not say clicks measure it

From four asks in one message. The block list in the side panel now scrolls inside its panel (max 24 rem / 45% of the window). INSERT: a name that is no block lists the blocks that start with or hold what was typed ("Did you mean"), and a name that is a block while others start the same way ("1" and "10", "12") says so. FILLET: the radius prompt says a value is typed or two clicks measure it (it already did). Already there and answered: UCS (UCS command), STRETCH by crossing window (select with C or drag right to left). Not built: a dropdown of candidates under the command line. Checked by reading + syntax; browser-aids.mjs covers the other fixes only.

CadCraft Built · Live – – From: young Ryu (Site) support message #1300 2026-11-07
FixFX.116 Link to FX.116Comment on FX.116 TakeoffCraft: no 1:150 or 1:75 metric scale presets

Asked in support message #1301 (drawings at 1:150): the metric presets went 1:100 to 1:200. Added 1:75 and 1:150 (now 32 presets, 14 metric) in units.js; the Scale presets help topic lists them and the count is corrected, help rebuilt. bin/test-takeoffcraft.mjs 1197 of 1197 (count updated, new check that both are metric). Not checked: the preset list on screen in a browser.

TakeoffCraft Built · Live – – From: Tom (Site) support message #1301 2026-11-07
FixFX.117 Link to FX.117Comment on FX.117 Accuracy Changes tab: search, filters, and a before/after check on each fix (1,000,000 inputs)

Owner 2026-11-07. /accuracy/changes now has a search box, tag chips and App / What happened / Before and after filters (server-side, 50 a page). Each of the 7 fixes was run before and after on 1,000,000 generated inputs (tools/accuracy-equality/verify.mjs, one recipe per change in checks/): all 7 show 'Corrected' (the old text was wrong on 13 to 45 percent of inputs, the new text on none) and link to /accuracy/changes/EQ-n with counts, samples and the seed; the raw file is /accuracy/changes/EQ-n.json and lives in core/data/equality-results/ so it can be copied to a CDN (.env NUMERICS_RESULTS_CDN makes the links point there). Limits: it runs the changed comparison text with generated inputs, not the whole app; the 'right answer' is within 1e-12 relative, which is my definition; 277 tag-only entries have nothing to compare. Not done: no revert button on the page; app suites not re-run.

CadCraftPartCraft Built · Live – – From: owner (Site) owner request 2026-11-07
FixFX.118 Link to FX.118Comment on FX.118 SuperCad dialogs and pages: dropdowns, text fields and notes boxes had no styling; a stray "null" showed in the Timer and the event form

Wrong: selects in the Timer, Calendar, Teams and Settings dialogs were the browser's small native control, text/date fields and notes boxes were plain white boxes (the time zone field stayed narrow), and the Timer and the calendar event form printed the word "null" where an optional field was left out (empty placeholders were passed straight to replaceChildren). Changed: one rule gives selects, text/date/number fields and textareas the same border, height, colours and focus outline; the empty placeholders are dropped before drawing; the event form's ten reminder ticks lay out in columns. Tests: home-calendar checks no stray null/undefined text in the form. Untested: browsers other than headless Chromium.

SuperCad Studio Built · Live – – SuperCad Studio, owner session 2026-11-07
FixFX.119 Link to FX.119Comment on FX.119 SuperCad Calendar: a full-page calendar in the welcome area (day, week, month, year; tasks panel; events list; .ics; search; colour and owner)

New page, left menu entry Calendar, built over the Calendar plugin's own data and editor. Day, Week, Month and Year views with Today and back/forward; calendars box (project calendar plus one per team, colour, tick to hide, scrolls); tasks panel (tasks with a due day, shown on the grid, Make event); events list for the range with a one-click .ics each; Export .ics for the ticked calendars (repeats included); search; click a day or an hour slot to add an event; events carry an optional owner (project or a team) and colour (new optional fields, older files open unchanged). Not built: drag or resize in the week view, a mini month navigator. Tests: tools/super-test/home-calendar.mjs (28). Untested: .ics in a real calendar app, phone widths on a real device. New strings are English only.

SuperCad Studio Built · Live – – SuperCad Studio, owner session 2026-11-07
FixFX.120 Link to FX.120Comment on FX.120 SuperCad Teams redesign: teams left, members right, Add people, a member's page with roles, status and activity; website Members tab to match

From the owner's design boards (dropai.zone/d/znEiRaXp). SuperCad Teams page: team cards (people, projects, invited count, project access, edit, delete) beside the picked team's members as rows (person, title and company, role, status Active/Invited/Disabled); filters, search, role filter, bulk disable/remove; Add people (people you already work with, or type an email, one card each with a role and what that role can do); a member's page (details, their teams, activity, a role and permissions table, the projects they reach); the empty state. Data and server: roles are owner/admin/member (an older Lead is read as admin); members gain joined_at, invited_by and disabled_at, people gain last_active; whoever makes a team is its owner; the last owner cannot step down, be removed or be disabled; account database schema 3 rebuilds team_members with the new check and keeps every row; new endpoint ops set_member_access, touch_active and GET ?me. Status is derived: disabled, active (has an account or is the person using this copy) or invited. Website: the team Members tab (/teams/{slug}/members) gets status pills, search and filters (progressive) and a what-each-role-can-do table; no member page or disable on the website yet (accounts have no such model). Tests: test-super-teams 291, test-user-teams 93, test-teams 145, home-teams 29. Not done: the file-format spec page (supercad-file-format-0.1.html) still lists the old team_members columns; last active is only recorded for the person using the copy; not run against the live account database or a signed-in device.

SuperCad Studio Built · Live – – SuperCad Studio, owner session 2026-11-07
FixFX.121 Link to FX.121Comment on FX.121 Admin dashboard shows SuperCad Studio revenue

The /admin dashboard counted SuperCad owners and seats but no dollars: revenue figures read only owned licenses and Team Cloud Plan. Added a "SuperCad Studio revenue, all time" tile, SuperCad rows in the License payments table, and SuperCad in the one daily chart: blue bars = licenses, green bars = SuperCad seats, line = grand total revenue to date (all sales). Test emails left out. Billing::revenue(), payments(), dailyLicenses(). Not in the Licensed users count. Checked against live data (4 purchases, 6 seats, $175; Handybear $150 listed); page not looked at in a browser.

– Built · Live – –
FixFX.122 Link to FX.122Comment on FX.122 CadCraft: MTEXT OK button and part-text height, Text style in Annotate, command drop-down list, Multiline tool

Lab pass 37 feedback (Mohammad Imtaar, 2026-11-07) listed what still failed. Fixed in a Discord member: (1) the MTEXT box had no OK or Cancel button (they were made but never added to the box); (2) a new size typed for a selected part of the text was lost because the size box took the focus and the selection with it, so the whole text changed or nothing did; the selection is now kept the moment the box takes focus, and Enter leaves the box once; (3) the Text style tool was missing from the Draw toolbar's buttons, so the ribbon's Annotate tab had nothing to press, and the Ribbon style's Annotate tab had no text group; both added (Text, Paragraph, Text style); (4) typing in the command line now shows a drop-down list of every command that starts with the letters (arrows + Enter, or a click); (5) MLINE did not exist: new multiline (parallel polylines, Scale, Lines 2-8, Justification, Close, Undo) with a Multiline button in Draw. Test: tools/cadcraft-test/browser-fx94.mjs (9).

CadCraft Built · Live – – From: Mohammad Imtaar (Site) lab pass 37 feedback 2026-11-07
FixFX.123 Link to FX.123Comment on FX.123 SuperCad Teams: Resend invite, a join code for when email fails, Join with a code (app and /join-team), role changes behind an Apply button

Wrong: the Add people screen said an invited person 'gets an email invite' but nothing was sent, there was no way to resend, and no way to join if the email failed. Changed: TeamJoin (service) makes a 12-character code per invited member (only its sha256 is stored, table team_join_codes, migration 128, 14 days), emails it (Mailer::teamJoinCode, branded) and shows it once on the inviter's screen with Copy, so it can be handed over when email misbehaves; Resend invite makes a new code and the old one stops working. The invited person joins by entering the code AND their email address at /join-team or with Join with a code on the Teams page; they must be signed in with that verified address; the member's row then links to their account and shows Active. Wrong tries are throttled per person (8 / 10 min); a wrong guess never says which part was wrong. Send invite needs a signed-in account and syncs first. Also: a member page's role changes wait for Apply (on only when the pick differs, Undo to go back); the Sync status headings have air above them. Tests: test-user-teams 110, test-super-teams 304, home-teams 31. Untested: a real email through Brevo to a real address, the page with a real signed-in browser session. Not done: the table's role select still changes at once; the migration runner stops at an older migration (country column) so 128 was created from schema.sql; other-language strings.

SuperCad Studio Built · Live – – SuperCad Studio, owner session 2026-11-07
FixFX.124 Link to FX.124Comment on FX.124 SuperCad Home: New project is a setup page, not a confirm and prompt; cancelling Open file no longer closes Home

Wrong: New on Home used the browser's confirm and prompt (an alert saying the open project has files), Open file left Home the moment it was clicked so a cancelled pick dropped you into the drawing space, and the 'No projects opened or saved' line was squeezed into one card column. Changed: New opens a New project page on Home (super-newproject.js): name, description, what it is for (design, documentation, estimate, review, study, other), client, team (from the Teams plugin), start and due dates (a due before the start is refused), length unit and keep-earlier-versions, with a notice and Save first when the open project has files. The details are stored in the project (new optional info block in Data/manifest.json; older files open with empty details; cleanInfo validates days and intent). Open any file, open folder and open project file leave Home only after something really opened. The empty-projects line spans the row. Tests: home-actions 19, test-super-core 137, test-super-home 22. Untested: the page on a phone, a real file pick on every browser. Not done: the chosen team is recorded on the project but not given project access (that is still done on the Teams page); the intent and dates are not shown on the Home project card yet; strings English only; the file-format spec page does not list info.

SuperCad Studio Built · Live – – SuperCad Studio, owner session 2026-11-07
FixFX.125 Link to FX.125Comment on FX.125 Studio and browser editions: the chosen language now reaches every word the page prints (New, Open, Save, Draw, About <app>…)

Wrong (Discord, a Discord member, 2026-11-07, still after 0.8.1): in CadCraft Studio and the browser editions the choice was saved and reached every app window, but the most used words stayed English: New, Open, Save, Draw, Modify, Edit, Select, a Discord member, "About CadCraft", the app's tagline. Cause: a packed page is printed once in English and app-lang-boot.js swapped words by matching the English across the whole catalog; any English several keys share with different translations, and any text with fills, was left alone. Fix: render.php --edition records every key it prints (Lang::record, #cc-lang-printed) and app-lang-boot.js swaps by that key, fills and plurals included, pieces around markup fills too; Paper/Model in the edition bar now use the shell's keys. Checked in real Studio 0.8.1 on Windows (portable build, own data folder): choice kept across hub, app windows, app Settings and a restart. Leftover English in French on screen: CadCraft 34 → 0, MarkupCraft 11 → 0, the same as the website. Needs a Studio and editions rebuild to ship.

– Built · Live – – Discord #general, a Discord member, 2026-11-07; lab session 2026-11-07
FixFX.126 Link to FX.126Comment on FX.126 Website: a language picker in the footer that sets the language the apps open in (lab only)

Asked on Discord (a Discord member, 2026-11-07): getcadcraft.com has no display-language option. Built: core/components/site-lang.inc in the footer, POST api/site-lang (CSRF, can_lab() else 404) → Lang::rememberChoice writes the same cc_lang cookie the apps read; choices = every shell language file (Lang::siteChoices, 74). Says plainly that the site's own pages stay English for now and that Studio keeps its own choice. Lab and staff only until the owner's go. Translating the site's pages themselves is a separate, larger decision (docs/LANG.md: the site stays English).

– Built · Live – – Discord #general, a Discord member, 2026-11-07
FixFX.127 Link to FX.127Comment on FX.127 Website footer: the language picker sits in the Community column under a rule; Save is a small button that shows once the pick changes

Owner 2026-11-07 (screenshot): the footer language picker moved from the notes strip into the Community column, under a rule like the one above SuperCad Studio in Apps. The Lab tag sits beside the heading. Save is a small button that appears only after the pick changes (site.js; without JavaScript it always shows). Files: core/components/footer.inc, core/components/site-lang.inc, assets/css/site.css, assets/js/site.js. Still lab only (can_lab). Then (same day): pinned to the bottom of the Community column (.tb-community flex column, margin-top auto). Community column gets the spare width from 1100px (columns .75/1/1/1.25; equal below).

– Built · Live – – Discord #general, a Discord member, 2026-11-07
FixFX.128 Link to FX.128Comment on FX.128 Team member pictures: built-in defaults, upload, change

SuperCad Teams member page showed only a letter in a circle. A person now has a picture: the default is their initials on a colour, or one of 12 built-in pictures in 8 colours, or an uploaded image (cut to a 128 px square in the page, kept under 24 KB). Change it under Details > Edit. Stored on the person row (people.avatar, account DB schema 4), synced like title and company; the server and the plug-in both refuse anything that is not a built-in or a small png/jpeg/webp. Tests added (teams 310, user-teams 116). Not done: the account's own profile picture is not used as the default; no website member page picture; other-language strings still English; never opened in a real browser window.

SuperCad Studio Built · Live 0.2 –
FixFX.129 Link to FX.129Comment on FX.129 Teams page flashed an empty list for about 1.5 s before the members appeared

On a fresh load the Teams page drew its empty states until the account connected and the first sync brought the rows in. Now the page says 'Loading your teams (N teams, N people)' with a spinner while the first sync of the visit is pending. Where the count comes from, in order: (1) the account itself: app-shell.inc prints #cc-account-hints {teams:{teams,people}} for the signed-in person on /lab/supercadcraft (UserTeams::hint: two counts, never creates a database), so it works in a browser that has never synced; (2) otherwise a marker this browser kept at its last good sync. A hint of none wins over an older marker. It gives up after 15 s and tells the truth (empty, or the sync error); an account with no teams sees the empty state at once. Tests: teams 321, user-teams 118. Not done: the rows themselves are not cached locally; the hint is only printed for signed-in site sessions (a device-token-only window falls back to the browser marker); never opened in a real browser window.

SuperCad Studio Built · Live 0.1 –
FixBot obtainedFX.130 Link to FX.130Comment on FX.130 CadCraft: DXF R12 export was refused by AutoCAD (dimension styles)

Reported on the Discord: a CadCraft R12 DXF would not open in AutoCAD, which said 'Unknown group 1001 for table' and then 'Omitted group 4'. Cause, in dxf.js: each DIMSTYLE record carried CadCraft's own settings as xdata (1001 CADCRAFT), which R12 tables do not allow, and the record left out groups R12 requires (DIMAPOST, group 4, when the style had no alternate text; also 46, 145, 175, plus a 270 R12 does not have). Now every record lists all the groups R12 lists, once each, in its order (dwg-props.js r12DimstyleItems), and the settings R12 has no variable for travel in a CADCRAFT_DIMSTYLES block the way the classes and Laser panel data do; files written before 0.9 still read. Tested: bin/test-cadcraft.mjs (record layout, round trip, old files). Not opened in AutoCAD here (none on the server): the reporter's AutoCAD is the check.

CadCraft Built · Live – – Discord #bug-reports, 2026-11-08
FixBot obtainedFX.131 Link to FX.131Comment on FX.131 Add-ons publish with the release: one command, held until the apps carry what they need

Owner 2026-11-08: add-ons that are ready must not wait for someone to remember them. bin/addon-package.php --release=0.9 checks every add-on against the add-on API 1.4 the 0.9 apps report and publishes it only when every app it targets has 0.9 (or newer) as current AND that build holds every engine:/host: file the package imports; until then it is listed as HELD with the reason (pid, lighting and harness are held now: CadCraft current is 0.8.2). After the release moves current: sudo -u www-data php bin/addon-package.php --release=0.9 --apply. Also: add-on help compiles per language (help/help.<locale>.js, build-help.php --addon) and the add-on loader picks the page's language (hvac and piping 0.9.0, 11 languages, machine drafts). Run sheet: docs/0.9-sessions/first-builds-09.md § Add-ons at release.

CadCraft Built · Live – – Owner, 2026-11-08
FixFX.133 Link to FX.133Comment on FX.133 TakeoffCraft: item list quantity label broke the page (itq0 not defined)

Found while testing TKW.1 in the real page: qtyLabel in takeoffcraft.js (a Discord member) read itq0.conds and t.conds, a half-finished rename of the quantity map (it.conds and tq0.conds are right), so the page threw on load and no browser test could open. Corrected the two names. Separate, not fixed: tools/takeoffcraft-test/browser-propgrid.mjs fails in a fresh profile because the shell Auto-focus panel folds the item grid; browser-weights-temps.mjs switches it off first.

TakeoffCraft Built · Live – – found testing TKW.1 2026-11-08
FixFX.134 Link to FX.134Comment on FX.134 Website: /admin dashboard took 5 to 6 seconds to load after every new signup

What was wrong: the dashboard's metrics cache (a day) was dropped by every new account, email verification and license event, 100 to 230 times a day, and the recount ran in the page request: 4 seconds of it were three COUNT queries over a million session_activity rows (pageviews, visitors, app opens over 30 days). Largest Contentful Paint 5.72 s in the owner's measurement (2026-11-08). What changed: AdminDashboard now keeps two caches. Accounts, signups, licenses and revenue (~25 ms to count) stay on the day cache dropped by audit events. Traffic is read from the stored /admin/analytics 30-day report (counted nightly by bin/warm-analytics.php), never counted while a page waits; when that report is missing or past its time the page shows what it has and starts the count in the background (bin/warm-analytics.php --days=30, one at a time, lock tmp/cache/.analytics-warm-30.lock), and says so. A fresh analytics count now replaces the stored report only when done (Cache::put) instead of deleting it first. Count again now (?fresh=1) recounts the account figures at once and starts a traffic count. Admin bar counts stopped fetching 500 library versions and 200 SuperCad inquiries to count them (LibraryVersions::countPending, SuperCadLicenses::counts). Also found: 2.45 million session files (PHP's collector is off for the custom path, 521,000 of them empty from crawlers): bin/session-gc.php + /etc/cron.d/cadcraft-sessions remove expired and empty ones daily. Measured with the new shim bin/admin-perf.php (in-process render with every query timed, or --http against the live vhost as the test admin): cold cache 4,233 ms to 75 ms; warm 50 ms either way. Not done: MySQL innodb_buffer_pool_size is 128 MB on a 32 GB server (session_activity alone is 646 MB), a server-wide setting for the owner; crawlers still start a session on every visit.

– Built · Live – –
FixFX.135 Link to FX.135Comment on FX.135 Website: /admin/library (3.8 s) and /admin/analytics (1.7 s) staff pages were slow

Found with bin/admin-perf.php while fixing the dashboard (FX.134), 2026-11-08. /admin/library: LibraryVersions::possibleDuplicates joined every version to every other version with the same source hash. The Library's generated collections share one source file across 250 items of one maker, so the self-join compared about 6 million pairs to find nothing (3.8 s). The source branch now starts from source hashes held by versions of two or more owners (a pair with different owners needs one), which is the same answer: 365 ms. /admin/analytics: the browser-language list (Analytics::languages) was the one figure counted live on every load, 1.7 s over session_activity; it is now part of the stored report (Analytics::report carries languages), counted nightly by bin/warm-analytics.php like the rest. Loads in ~60 ms. Tests: bin/test-library-admin.php, bin/test-admin.php (one failure in the message search is other sessions' uncommitted work on Contact.php, not this).

– Built · Live – –
FixFX.136 Link to FX.136Comment on FX.136 Website: 2.45 million session files; sessions now collected (21 days, empty after a day, CSRF-only after 48 h), none for crawlers

What was wrong (2026-11-08): PHP's session collector is off for the site's own sessions folder (session.gc_probability 0; the system timer only cleans /var/lib/php/sessions), so nothing ever removed a session file. After one month: 2.45 million files, 521,000 empty. A sample showed 99 % of the rest hold only an 83-byte CSRF token: a first visit that rendered a form and never came back. Most come from cookie-less crawls with plain browser user agents (one walks every /roadmap-issues filter permutation, about 4,000 requests an hour in bursts, from Huawei Cloud Singapore), which start a fresh session on every request. In 7 days bots made 103,244 sessions against 73,607 from people. What changed (owner's choices): SESSION_LIFETIME 21 days; bin/session-gc.php from /etc/cron.d/cadcraft-sessions every 6 hours removes expired sessions, empty ones older than a day, and sessions whose whole content is the CSRF token line after 48 hours (1.47 million removed on the first run); core/bootstrap.php starts no session and sets no visitor cookie for named crawlers, link previewers and scripted HTTP clients arriving without our cookie (curl, wget, headless browsers, the smoke test and empty user agents still get one: the test suites need CSRF and sign-in). Also: MySQL innodb_buffer_pool_size 128 MB to 1 GB (SET PERSIST, online). Cost accepted: a person who leaves a form open for two days and then submits gets the CSRF 403 and submits again. Not done: stateless CSRF (no session for anonymous visitors) and throttling the roadmap crawl; the owner judged both too likely to break things.

– Built · Live – –
FixFX.137 Link to FX.137Comment on FX.137 Arc: all ten methods (3-Point, Start/Center/End/Angle/Length, Start/End/Angle/Direction/Radius, Center/Start/End/Angle/Length) and Continue

The Arc tool only offered a start point or a centre. Now every method is there, in CadCraft, ModelCraft, PartCraft sketches, MarkupCraft and TakeoffCraft, from one shared library (lib/arcs, copies via tools/arcs/sync.mjs). Arcs run counter-clockwise; a negative angle or chord length takes the clockwise arc, a negative radius the major arc. Angle, length, radius and direction can be clicked or typed. CadCraft also has Continue (Enter at the start point) tangent to the last line, arc or polyline, and a split button listing the methods. MarkupCraft and TakeoffCraft keep their saved arc formats; PartCraft arcs stay centre/start/end so constraints work. Tests: tools/arcs/test.mjs, test-cadcraft, test-markupcraft, test-takeoffcraft, tools/partcraft-test/test-sketch-arcs.mjs, tools/modelcraft-test/tools07.mjs. Not yet checked by hand in a browser: MarkupCraft and TakeoffCraft pointer flow, PartCraft split face label, ModelCraft on a tilted face.

CadCraftModelCraftMarkupCraftTakeoffCraftPartCraft App code Built · Live – The reporter to try it in /lab. From: a CadCraft user (Staff) email 2026-11-08
FixFX.139 Link to FX.139Comment on FX.139 Screenshot mode for /lab: ?shot=1 hides the Lab badge, stamp and staff panel; capture tools shoot from /lab

Why: 0.9 media (store shots, tutorial pictures, About/README screenshots, videos) should not wait for the real 0.9 builds, and the lab badge, build stamp, staff panel and 'a Discord member' must never show in them. Changed: shot_mode()/shot_version() in core/functions/helpers.php (lab testers only, /lab/ pages only, per request: no cookie or session, so it cannot reach /use). With ?shot=1 the app bar drops the Lab badge, build stamp and version list; Settings > Version and the About dialog show the release number (0.9, or ?shotv=); header.inc drops the staff panel. New tools/shot-target.mjs (LAB_SHOT=1 points tools/help-walkthrough-shots.mjs, tools/help-shots.mjs and videos/kit/shoot.mjs at /lab/<app>?shot=1 as the shell test admin); stores/kit/lab-shots.mjs now uses the param (its visible-text guard stays); tools/shot-freeze.php record|check lists apps whose lab build moved since the shots (docs/0.9-shots-freeze.json). Tried: lab-shots (CadCraft, BimCraft) and help-shots (MarkupCraft) on the VPS, badge and staff panel gone, guard passed. Untested: the tutorial walkthrough and video tools with LAB_SHOT=1 end to end, native window chrome per OS (needs a real Studio build), no freeze recorded yet.

– Built · Live – – From: owner (Site) owner 2026-11-08 (screenshots from /lab)
FixFX.140 Link to FX.140Comment on FX.140 Resin slicing: faster on big screens and dense miniature meshes, and less memory

A tester reported the resin slicer crashed while slicing; they later said the model was a dense mesh from a miniatures set, a few MB, not regular geometry. The cause is not confirmed and no crash was reproduced, but tests found three real problems. (1) Drawing: the page spent most of its time turning each layer into a 12K picture (59 million pixels a layer); a 100 mm part at 0.05 mm took over 280 s. Now only the rows a layer lights are touched, one buffer is reused, and dark rows are written as single runs: a 60 mm part 151 s to 27 s, the 100 mm one over 280 s to 100 s. (2) Dense meshes: the island check ran an exact overlap test for every small piece of every layer (40 of 52 s on a 40,000-triangle noisy ball with supports); the overlap of the whole layers is now found once and cut into pieces, same island counts as before (251 = 251 on a test mesh), 52 s to 22 s. The cavity of a hollow part is worked out on an outline simplified by half a pixel (about 25 percent faster, wall within half a pixel). (3) Memory: a 40-piece, 139,000-triangle mesh at 0.03 mm, hollow with supports, peaked at 1.98 GB (enough to kill a browser tab), because every layer's pieces were kept to the end; temporary shapes are now given back at once: 1.20 GB, and it finishes in about 4.5 minutes where it ran past 7. Layers are identical to before the change except the half-pixel cavity. With RSN.8 the slicing also runs on a worker thread, so the page cannot freeze. Not tried on a real printer or on the tester's own file.

BimCraftModelCraftPartCraft App code Built · Live – The tester to try again in /lab and say what happens (printer, layer height, hollow/supports, model size). From: Discord community (Discord) Discord 2026-11-08: "it crashed while slicing"
FixFX.141 Link to FX.141Comment on FX.141 Apps: every app page decoded 130 language files (43 MB) to list the languages in Settings

Built: app-settings.inc called json_decode on every language file under assets/lang on every /use and /lab app page to show each language's own name in Settings, 156 ms of PHP per page view. Lang::nameOf() now reads the first 1 KB of a file and takes "@name" from it (every file tools/lang writes puts @locale and @name first; a head without it falls back to a full decode). app-settings.inc and Lang::siteChoices use it. Measured: app-settings.inc 156 ms to 2 ms, time to first byte of /use/cadcraft on localhost 230 to 290 ms to 95 to 110 ms, the same 84 language options. Tests bin/test-lang-packs.php 21/21. Log docs/0.9-sessions/perf-09.md. (Filed as FX.137 in that log at first; the key was taken by the arc methods the same day, so this row is FX.141.)

– App shell Built · Live – – docs/0.9-sessions/perf-wave3/
FixFX.142 Link to FX.142Comment on FX.142 CadCraft: Plans.dwg (200,000 3D faces) and any DXF over about 70,000 entities failed to open with "Maximum call stack size exceeded"

Built in the lab. Two readers appended whole lists with push(...list), which puts every item on the call stack. (1) model3d.js:187 and :213 (split3d): the 3D faces a drawing's block references place, up to MAX_PLACED = 200,000, so Plans.dwg (288 objects, 50 blocks) failed in /use 0.8.2 with "Could not open Plans.dwg" after the worker had read it; wave 2 counted that open as accepted because the heap grew. (2) dxf.js:102, :162-165, :479: any DXF from about 70,000 entities (a 15 MB file) threw the same RangeError with no message. (3) The same spread in io.js:1291 (ModelCraft, and CadCraft's m3d copy) for a flattened component. All use a loop now. Measured: Plans.dwg opens in the lab build in 7.8 s (4.8 s blocking, one 4.6 s task placing the 200k faces into the 3D tab, heap 518 MB: that cost is PERF.9's); a 19 MB DXF (137,851 entities) that crashed reads in 1.4 s; 1,000,000 entities (122 MB) read in 10 s and 2.1 GB in Node, so the next wall is memory and the one-string reader (wave 3 scale rows). bin/test-cadcraft.mjs 2,847/0. Other spread-into-push sites that take whole lists remain in bimcraft res-skeleton.js:349, res-views.js:282, dwg/nongraphic-write.js:332 (every copy) and lib/cabinetcraft cornerdrill.js:113: small lists today, worth the same loop when touched. Found by the wave 3 scale and 2D tracks (docs/0.9-sessions/perf-wave3/scale-1000x.md, apps-2d.md).

CadCraftModelCraft App code Built · Live – A 0.8.3 point release if the owner wants Plans-sized drawings to open in /use before 0.9. docs/0.9-sessions/perf-wave3/
FixFX.146 Link to FX.146Comment on FX.146 DetailCraft: My profiles, custom profiles kept for every new model

A custom profile lived only in the model file, so a new model started without it. Now the Custom profile form has Keep in My profiles (ticked), and a My profiles list under it, kept in this browser (localStorage detailcraft.myprofiles, at most 200, cleaned on read by profiles.js cleanLibrary). Every new model (start-up and New) begins with them in model.state.profiles, so they save with the file. Keep button on a model's own profiles, Use here for a model that lacks one, Remove (models keep their copy), a taken name with other dimensions is refused. Per browser, not per account. Help: plates-and-profiles.md. Test tools/detailcraft-test/browser-myprofiles.mjs (15 checks). The same report also met 'only I-shape': shear tabs already take a channel BEAM but need an I-shape COLUMN, end plates need an I-shape beam; which one the person hit is unknown, no change made.

DetailCraft Built · Live – Owner to clear in 0.9, then reply to a Discord member. Account sync and channel columns / end plates are not built. From: Discord community (Discord) Discord 2026-11-09
FixFX.155 Link to FX.155Comment on FX.155 CadCraft: no Arc drop-down in the default toolbar, and the ribbon Arc menu showed 6 of its 12 tools

CadCraft default toolbar (ui.inc): Arc and Circle had no drop-down; the eleven arc methods and the two circle methods sat only under Draw > More. Each now has a caret beside the button listing its ways to draw (moved out of More). FX.137 added the eleven ways to draw an arc, but the shared menu code (assets/js/app-input.js) kept only the first 6 tools of any split button, and dropped the rest without a word. CadCraft's Arc and PartCraft's sketch Arc (12 tools each) lost half their list; no other built-in split in any app is longer than 6. The limit is now 16, and a split cut to fit is reported like any other bad menu entry instead of vanishing. New test tools/shell-test/input-splits-test.mjs runs every built-in menu style of every app through the sanitiser and fails if anything is dropped (it fails on the old limit of 6, passes on 16). Installed 0.9.0 desktop builds carry their own copy of the menu code, so they need the 0.9.1 build (docs/0.9.1.md, 91.1); the web edition has the fix now.

CadCraftPartCraft App code Built · Live – The reporter to try it in /lab; the 0.9.1 build. From: a CadCraft user (Staff) email 2026-11-08
FixFX.156 Link to FX.156Comment on FX.156 Tooltips: one Bootstrap engine everywhere; the other tooltip methods are gone

Tips were drawn five ways: app-tooltips.js (Bootstrap, from title), a hand-made .ws-tooltip div in the workspace, a second Bootstrap instance for cut-off text in Settings, one each for the area badge, the download copy button and CivilCraft's narrow number boxes, and a CSS ::after bubble on the status bars. Now app-tooltips.js is the only one: it reads data-ws-reason, title or an old data-bs-title, and offers ccTooltips.showText(el, text) for text a page computes (cut-off text, Copied, a clipped number). The site footer and admin footer load it too, so public pages match the apps. Popped-out ribbon, panel and dialog windows get Bootstrap and the engine through ccTooltips.attach(win), so they show the same tips. Same look everywhere (.tooltip.cc-tip).

CadCraftBimCraftModelCraftMarkupCraftTakeoffCraftCivilCraftDetailCraftPartCraft App code Built · Live – The 0.9.1 build (desktop installers carry the shared files from their pack date). From: the owner (Staff) owner 2026-11-09
FixFX.157 Link to FX.157Comment on FX.157 CadCraft: objects moved against each other while zooming in a drawing at distant coordinates (a stray object near 0,0 made hatches slide off their outlines)

A member sent a screen recording: a hatch and its outline drifted apart as they zoomed, in a drawing near E 830000 / N 4480000. They guessed a 32-bit float problem, and it is one. A canvas Path2D keeps its points as 32-bit floats and the matrix that draws them is 32-bit too. CadCraft stores paths relative to an origin, but the origin was the middle of the whole drawing's extents: with one object left near 0,0 it sat 2.3 million units from the geometry on screen, so zoomed in the digits were gone. Measured in the released 0.9 build (new tools/cadcraft-test/browser-far-coords.mjs, the real view.js in Chromium): a hatch edge 1 px off at 20 px per unit, 22 px at 200, 94 px at 1000, fill gone at 2000; without the stray object, or with one 20 km away, exact. Only the picture was wrong; coordinates, snaps, measurements and saved files are 64-bit. Fix (view.js): the cache is rebuilt around the view center once the origin is more than 160,000 px from it (FAR_PX), also for the model shown in a sheet viewport; ordinary drawings never rebuild. The test fails on 0.9 (99 px) and passes in the lab (0 px at every zoom); bin/test-cadcraft.mjs 2847 passed. /accuracy had the old origin down as keeping values small: now a 32-bit policy, Drawing far from the origin, on screen, with the measurements and an open item to test BimCraft dwg-view.js, TakeoffCraft cadset.js and CivilCraft view.js (same pattern). Installed 0.9.0 desktop builds carry their own view.js and need 0.9.1.

CadCraft App code Built · Live – The reporter to try it in /lab (send the file or a lab pass); the 0.9.1 build; the other three apps tested for the same pattern. From: Discord community (Discord) Discord 2026-11-09
Discord, last sweep before 0.9 (2026-11-05) 5
FixFX.31 Link to FX.31Comment on FX.31 ModelCraft: Play turns into Pause while an animation plays, and Space toggles it

Reported 2026-10-20: the Play button stays a triangle while the animation runs (it acts as stop); the reporter asks for a Pause state, matching the timeline, and for Space to play and pause while the timeline is open. Untested. Built 2026-11-05 (model-fix-09), in /lab. The timeline's own Play button already turned into Pause while playing (since 0.6); what stayed a triangle was the Animate workspace's toolbar Play (a second button, and Stop beside it). Now it shows Pause (icon, word, pressed) while the animation plays and a second click pauses; Space plays and pauses while the timeline is open (not when a button has the focus, not while a tool runs; with the timeline closed Space is still Select); the new command Play or pause the animation (camera.play) can be given any key in a style of your own. Tests: browser-fix09.mjs 'FX.31' (real keys and clicks) and test-fix09.mjs. Help: animation topic.

ModelCraft Built · Live 1 – docs/0.9-sessions/final-sweep-2026-11-05.md
FixFX.32 Link to FX.32Comment on FX.32 ModelCraft: the Render view pop-up stays over the toolbar, and the Render panel shows "null" under Detail

Reported 2026-10-25 on macOS Studio: switching to Render shows a "The path tracer renders the view..." pop-up that does not go away and passes clicks to the toolbar underneath; the Render in the view panel has the word null below the Detail drop-down. Untested; not yet looked for in the code. Checked 2026-11-05 (model-fix-09): already fixed in 0.7.1 (71.1: the long note became a plain paragraph in the Render panel instead of the floating stage hint; 71.2: the empty slot that printed "null" is gone), and the code is the same in 0.8.1. The reporter was on 0.7. Reproduced in /lab with a browser test (tools/modelcraft-test/browser-fix09.mjs, 'FX.32'): the note sits inside the side panel, does not cover the toolbar, a click on it lands on it, it has a Close control (and "What is this?" brings it back), and the word null is nowhere in the panel. Not tested on macOS Studio itself.

ModelCraft Built · Live 1 – docs/0.9-sessions/final-sweep-2026-11-05.md
FixFX.38 Link to FX.38Comment on FX.38 MarkupCraft: copy and paste a selection of markups, and save it as a stamp or tool

Reported 2026-10-26 (0.7): selecting markup content has no way to copy and paste the selection, or turn it into a stamp or tool-chest tool. Check against the current build first (D8.15 Copy area copies a page region, a different thing). Untested. Checked 2026-11-05 by markup-fix-09: already built in 0.7.1 (71.6 copy/paste, 71.9 Save as a stamp) and in the released 0.8.1. The reporter wrote on 0.7. Copy/paste of markups and of page content works on the same page, other page and other open file (and other tab); Save selection as a stamp puts markups, pictures included, into the tool chest. Tested: tools/markupcraft-test/browser-071.mjs 39/0 in a real browser, bin/test-markupcraft.mjs 565/0 (new check: a picture stamp survives the chest file). Help: stamps-and-notes, tool-chest. Reporter's own build and wording not confirmed.

MarkupCraft Built · Live 2 – docs/0.9-sessions/final-sweep-2026-11-05.md
FixFX.39 Link to FX.39Comment on FX.39 MarkupCraft: add a stamp or signature from an image file, not only by paste

Reported 2026-10-25 (0.7): there is a way to paste a stamp or signature image but not to pick one from a folder, and no flatten option; also asked how to use a scanned code book. Untested. Checked 2026-11-05 by markup-fix-09: already built in 0.7.1 (71.7 Insert a picture from a file, 71.8 signature from a file) and in the released 0.8.1. Stamp tool > Picture or My signature (file picker, scan made see-through, list of saved signatures in this browser), Edit > More > Insert a picture from a file, Flatten into the page when saved in Properties; a picture can also be saved as a stamp in the tool chest. Tested browser-071.mjs 39/0 and test-markupcraft 565/0. Help: stamps-and-notes. Scanned code book: not asked of the reporter; a scanned page opens as a PDF page like any other.

MarkupCraft Built · Live 1 – docs/0.9-sessions/final-sweep-2026-11-05.md
Owner-reported, 2026-11-09 10
FixFX.147 Link to FX.147Comment on FX.147 All apps: a panel tab strip that does not fit scrolls (visible chevrons) instead of cutting tabs off

Owner, 2026-11-09 (MarkupCraft right panel): the tab row (Properties, Markups, Punch list, Tasks, Notes, Field, Tool chest) was cut off with no way to scroll; only widening the panel reached the last tab. Tab labels never wrap.

CadCraftBimCraftModelCraftMarkupCraftTakeoffCraftCivilCraftDetailCraftPartCraft Built · Live 1 Checked 2026-11-09: in /lab and the 0.9 web folders. Desktop installers staged, not published; ship as 0.9.1 on the owner's go (docs/0.9.1.md 91.2). docs/results/0.9/2026-11-09-suites-fix-ui.md
FixFX.148 Link to FX.148Comment on FX.148 All apps: every panel and sub-section header is title, lock, caret at the far right (open down, closed up); lock at 50% opacity

Owner, 2026-11-09 (MarkupCraft, DetailCraft, CivilCraft, CadCraft panels): carets were on the left, lock icons hung off the title, CivilCraft's sections had neither, carets did not line up. One shared header; the direction is one CSS variable (--af-caret-open / --af-caret-closed); --cc-lock-opacity .5. A lint reads the DOM of every app. Sections that were open stay open by default.

CadCraftBimCraftModelCraftMarkupCraftTakeoffCraftCivilCraftDetailCraftPartCraft Built · Live 2 Checked 2026-11-09: in /lab and the 0.9 web folders. Desktop installers staged, not published; ship as 0.9.1 on the owner's go (docs/0.9.1.md 91.2). docs/results/0.9/2026-11-09-suites-fix-ui.md
FixFX.149 Link to FX.149Comment on FX.149 All apps: every tooltip is a Bootstrap tooltip

Owner, 2026-11-09: the top-bar icon buttons showed the browser's native title tooltip. Rule: all tooltips are Bootstrap (local 5.3). One delegated initialiser upgrades every title in the shell; no double tooltip; keyboard focus shows it.

CadCraftBimCraftModelCraftMarkupCraftTakeoffCraftCivilCraftDetailCraftPartCraft Built · Live 1 Checked 2026-11-09: in /lab and the 0.9 web folders. Desktop installers staged, not published; ship as 0.9.1 on the owner's go (docs/0.9.1.md 91.2). docs/results/0.9/2026-11-09-suites-fix-ui.md
FixFX.150 Link to FX.150Comment on FX.150 All apps: the row-remove x is small and shared; the start/help card has a close x

Owner, 2026-11-09 (DetailCraft Levels rows; the 'Start a model' card): the x buttons were too large, and the start card could not be dismissed. One compact .shell-x style; the start card closes, is remembered per app, and comes back from the palette.

CadCraftBimCraftModelCraftMarkupCraftTakeoffCraftCivilCraftDetailCraftPartCraft Built · Live 1 Checked 2026-11-09: in /lab and the 0.9 web folders. Desktop installers staged, not published; ship as 0.9.1 on the owner's go (docs/0.9.1.md 91.2). docs/results/0.9/2026-11-09-suites-fix-ui.md
FixFX.151 Link to FX.151Comment on FX.151 All apps: add-on toolbar buttons look and behave like core ribbon buttons (PartCraft Print stage)

Owner, 2026-11-09: the Print stage button had no gap between icon and label and a non-standard grey fill and white border. The add-on loader mistook the right panel's pin tab for the toolbar; the button now carries the core tool class (same computed style at rest in PartCraft, BimCraft, ModelCraft).

CadCraftBimCraftModelCraftMarkupCraftTakeoffCraftCivilCraftDetailCraftPartCraft Built · Live 1 Checked 2026-11-09: in /lab and the 0.9 web folders. Desktop installers staged, not published; ship as 0.9.1 on the owner's go (docs/0.9.1.md 91.2). docs/results/0.9/2026-11-09-suites-fix-ui.md
FixFX.152 Link to FX.152Comment on FX.152 DetailCraft and the other apps: the mass readout ("0 kg") belongs in a panel section, not a fixed corner pill

Owner, 2026-11-09: the '0 kg' pill sat in a fixed corner and could not move; it should really be in a panel. Moves into a section of the panel (title, lock, caret) so it docks, folds and floats with the panel system; the fixed-corner widgets of the other apps are audited.

CadCraftBimCraftModelCraftMarkupCraftTakeoffCraftCivilCraftDetailCraftPartCraft Built · Live 1 Checked 2026-11-09: in /lab and the 0.9 web folders. Desktop installers staged, not published; ship as 0.9.1 on the owner's go (docs/0.9.1.md 91.2). docs/results/0.9/2026-11-09-suites-fix-ui.md
FixFX.153 Link to FX.153Comment on FX.153 All apps: browser tab titles and favicons follow one pattern

Owner, 2026-11-09 (tab strip screenshot): DetailCraft read 'Untitled — DetailCraft' while the others read '<App> — Lab | CadCraft'; favicons missing or inconsistent. Pattern: '<App> | CadCraft' on /use, '<App> — Lab | CadCraft' on /lab, '<document> — <App> | CadCraft' with a document, '| CadCraft' always last; each app has its own icon (SVG plus raster fallbacks).

CadCraftBimCraftModelCraftMarkupCraftTakeoffCraftCivilCraftDetailCraftPartCraft Built · Live 1 Checked 2026-11-09: in /lab and the 0.9 web folders. Desktop installers staged, not published; ship as 0.9.1 on the owner's go (docs/0.9.1.md 91.2). docs/results/0.9/2026-11-09-suites-fix-ui.md
FixFX.154 Link to FX.154Comment on FX.154 BimCraft: the placing bar uses one compact control size and one button system; the X,Y placeholder is lighter

Owner, 2026-11-09 (the bar shown while placing a Library item): dropdowns, the X,Y field and buttons were different heights and weights, three different button styles (Place here, Wall snap, Turn 90, Stop placing), the readout ran under the view toggles, and the example placeholder was too dark. One compact size, one primary (Place here), Wall snap as a toggle, the readout wraps, the placeholder at about 50% of the text colour.

BimCraft Built · Live 1 Checked 2026-11-09: in /lab and the 0.9 web folders. Desktop installers staged, not published; ship as 0.9.1 on the owner's go (docs/0.9.1.md 91.2). docs/results/0.9/2026-11-09-suites-fix-ui.md
Suggest an item

Anyone can send one; no account and no name needed. The team reads each idea, and the ones we take on appear on this page. Please leave out web addresses.