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
Fixes 104
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.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.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.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.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.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.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.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.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
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.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.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.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.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/
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.