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.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.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.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.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.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.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.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 –
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.