RMIVisualize your roof Last built 3 October 2026, 18:08 UTC · adf534e

RMI Roof Visualizer — Project Tracker

Tracker updated: Fri 18 Sept 2026

The single status page. Per-drawing ASSUMED questions live in the catalog, not here: RMI_Library_Catalog.md — §3c is the per-detail sync table, §5 is the numbered list of open questions for RMI (cited below as §5 #n).

Rule: every task updates the rows it touched (§1–§3) in the same commit as the work, so the tables stay accurate. No per-task log lines: §4 is a weekly update, written on Fridays.


1. Details

28 rows = the 25 entries in DETAILS (index.html) + the 2 byRoof variants that show the rep a different detail on concrete (Bin vent, Manway / bin hatch) + the Solar Post toggle (S.solar).

Status key. MODELLED+SPLICED — a Blender .glb is mounted in at least one building's scene (mountModel). MODELLED — a .glb exists but nothing mounts it. CODE-DRAWN — generic Three.js geometry only. NOT STARTED — no geometry. Where a model covers only some instances, the Detail cell says where; the rest of that detail is still code-drawn. Roof types are those of the buildings that carry the detail.

DetailDrawing No.Roof TypesStatusOpen ASSUMED
HVAC curb on metal (curb) — every curb: warehouse, manufacturing (1:12), both arena curbs (3:12); SPF still codeCS-13-MP · SPF → SPF-13-TYPR-panel, standing seam, SPFMODELLED+SPLICEDThe curb-to-panel junction — no sheet draws the panel (§5 #24); curb, counterflashing and unit sizes; SPF wrap height (§5 #15)
R-panel side lap (lap) — warehouse slopeF-8-TYPR-panelMODELLED+SPLICEDRib, lap lips, fastener spacing, Flex extent past the rib (§5 #10)
Standing seam (sseam) — manufacturing slopeF-9-TYP, F-20-TYPStanding seamMODELLED+SPLICEDSeam silhouette, clip spacing, Flex extent (§5 #11)
Skylight panels, flush (mskylight) — every skylight on manufacturing and the hangar (both slopes); SPF still codeF-12-TYP · SPF → noneR-panel, standing seam, SPFMODELLED+SPLICEDNo 3D render: end laps, panel width and length, where the 3" is measured from (§5 #13); SPF treated as a curb (§5 #13)
Vents on metal / SPF (vent) — every vent on manufacturing (1:12), the airport hangar (1.5:12) and arena (3:12); SPF still codeCS-13-MP note 7 (no vent sheet exists), Plate D for the vent metal · SPF → SPF-16-TYP · membrane (EagleView prospect) → CS-1-TYP note 7R-panel, standing seam, SPFMODELLED+SPLICEDCurb-mounted and liftable, the hood, sizes (§5 #12); panel junction (§5 #24); SPF wrap height (§5 #15)
Bin vent (vent on concrete) — silo capCS-12-CON; CS-1-TYP note 7ConcreteMODELLED+SPLICEDShared curb numbers (§5 #5); concrete skinning of the curb
Pipes on metal (mpipe) — every pipe on manufacturing and the hangar; SPF still codeP-9-MP (P-10-MP alt.) · SPF → SPF-4-TYPR-panel, standing seam, SPFMODELLED+SPLICEDPlate over the ribs, boot and pipe sizes (§5 #25); SPF wrap is on the sheet (Flex 1" above the collar flashing), code geometry not yet checked against it (§5 #15)
Gutters (gutter) — a 4-ft seam section at the arena and hangar gutter hotspots; the rest of both runs is code of the same sectionW-7-TYP (gutter-seams sheet; the concrete-wall sheet carries the same number, so the panel renders this one as W-7-TYP-GUTTER)Standing seam, R-panel, SPFMODELLED+SPLICEDEvery gutter size, the 1" lap and its rivets, coat thicknesses (§5 #26); the sheet's 2" band and whole-interior topcoat are VERIFIED
Downspout inlets (gutterinlet) — a 4-ft inlet section on a downspout at the arena and hangar inlet hotspots; the other outlets codeD-8-TYPStanding seam, R-panel, SPFMODELLED+SPLICEDOutlet size and flange, the strainer basket (no sheet shows one), 12" of drop, coat thicknesses (§5 #26); the 3" out / 3" in / 1" further extents are VERIFIED
Roof hatch on metal / SPF (hatch) — arena hotspot (standing seam and R-panel); SPF still codeCS-15-MP · SPF → SPF-13-TYP · membrane (EagleView prospect) → CS-1-TYP note 7Standing seam, R-panel, SPFMODELLED+SPLICEDSkirt after the topcoat, (E) vertical metal drop, sizes (§5 #14); panel junction (§5 #24); SPF wrap (§5 #15)
Manway / bin hatch (hatch on concrete) — silo capCS-14-CON; CS-1-TYP note 7ConcreteMODELLED+SPLICEDLid size, open angle, hinge; concrete skinning; shared curb numbers (§5 #5)
Ridge cap (ridge) — warehouse onlyF-21-M-TYP · SPF → SPF-3-TYPR-panel, standing seam, SPFMODELLED+SPLICEDCap lap, closure position (§5 #16); model built for a 1:12 gable
HVAC curbs / RTU (rtu) — 8 × 1.5 ft curbs: big-box, hospital wingCS-1-TYPTPO, mod-bit, gravel BUR, concreteMODELLED+SPLICEDCurb and unit sizes, nailer, skirt, Flex apron and turn-down (§5 #5)
Drains (drain) — all seven flat buildingsD-1-TYP, D-2-TYPTPO, mod-bit, gravel BUR, concreteMODELLED+SPLICEDBowl, clamping-ring and dish sizes; the outlet at the foot of the bore
Scuppers (scupper) — big-box north parapetD-4-TYPTPO, mod-bit, gravel BURMODELLED+SPLICEDTube size, exterior termination, 12" measured from where (§5 #8); cant and flashing height (§5 #7)
Wall tie-in, reglet (wall) — school gym wallW-11-TYPMod-bit, TPOMODELLED+SPLICEDFlashing height, reglet, counterflashing lap (§5 #6)
Soil stacks (pipe) — all five buildingsP-6-TYPTPO, mod-bit, gravel BUR, concreteMODELLED+SPLICEDEvery dimension (§5 #9)
Skylights, curb-mounted (skylight) — schoolCS-1-TYP note 7Mod-bit, TPOMODELLED+SPLICEDDome rise, retainer frame, condensation gutter; shared curb numbers (§5 #5)
Edge metal (edge) — office east edge at the hotspot; every office edge draws the same cross-section in codeF-1-TYPTPO, concrete, mod-bitMODELLED+SPLICEDFlex and topcoat down the fascia (the 2D drawing ends them at the roof edge); flange, fascia, stripping and cleat sizes (§5 #22)
Penthouse walls (penthouse) — office penthouse west faceW-13-TYPTPO, mod-bit, gravel BUR, concreteMODELLED+SPLICEDCounterflashing height, depth and stand-off; cant; skirt size and lap; fastener spacing; skirt fitted after the topcoat (§5 #21)
Sleeper supports (sleeper) — office hotspot sleeper, hotel hotspot condenserCS-8-TYPTPO, mod-bit, concreteMODELLED+SPLICEDEvery dimension (NTS): sleeper, pad, 6" raise, patch; whether the (E) condition has a pad
Pipe clusters / Chem-Curb (pitchpan) — all three hospital pansP-8-TYPGravel BUR, mod-bit, TPO, concreteMODELLED+SPLICEDEvery dimension (NTS): curb, penetrations, fill crown, Flex field extent; curb set before or after priming (§5 #20)
Expansion joint (ej) — hospital: a 4-ft section at the hotspot; the rest of the run is a code strip of the same section, flanges flat on the roof as drawnA-3-TYPGravel BUR, mod-bit, TPO, concreteMODELLED+SPLICEDJoint, flange, bellow and fastener sizes; no 3D render (§5 #16)
Silo walls (silowall) — a 4-ft ring of the hotspot bin's wall; the other five bins and the rest of this one stay code, coated the same wayW-7-TYP (concrete-wall sheet) + Plate C for the crack repairConcreteMODELLED+SPLICEDEverything about extents: full-height coats on a curved wall, joint spacing, crack repair, every size (§5 #17)
Gallery supports (support) — silo: the hotspot post; the other five draw the same wrap in codeP-5-C, P-7-CConcreteMODELLED+SPLICEDPost, gap, bead, backer-rod and old-mastic sizes (§5 #23); the wrap extents are from the sheet
Kitchen exhaust (exhaust) — restaurantCS-1-TYP note 7TPO, mod-bitMODELLED+SPLICEDDegreasing method (§5 #4); fan sizes; shared curb numbers (§5 #5)
Parapet / coping (coping) — big-box east run onlyW-1-TYPTPO, mod-bit, gravel BUR, concreteMODELLED+SPLICEDJoint gap, fastener spacing, whole-coping primer (§5 #3)
Solar Post supports (toggle, not in DETAILS) — every post on the flat roofs and SPF slopes; metal-panel posts still code (no sheet draws one)P-1-S-TYP (P-2-S-TYP sealant-fill alternate; P-3-S-TYP is the site-screen pitch pan)Flat roofs, SPFMODELLED+SPLICEDNo 3D render, NTS: post, plate, pocket, repair and weep-hole sizes; the repair material; metal-panel posts; the post square to an SPF slope (§5 #27)

Totals: 28 MODELLED+SPLICED · 0 MODELLED · 0 CODE-DRAWN · 0 NOT STARTED.


2. Product features

Built — what index.html already does, each row checked against the code (2026-09-14; rechecked 2026-09-18).

#FeatureStatusNotes
B1ConfiguratorBUILT11 building types and 7 roof types (BUILDINGS, ROOFS). Each building offers only its own 1–4 roof types (silo: concrete only), so not every pairing exists. The detail checklist is set by the building (BUILDINGS[].details), not by roof type; the roof type swaps a detail's name and drawing through byRoof (e.g. vent → bin vent CS-12-CON on concrete)
B2Six-stage walkthroughBUILTExisting → Prep → Primer → RMI-Flex → RMI-Thane → Finished on every roof, with play, step and per-stage text. The stage timeline drives the layers: its progress shows each model's existing / primer / flex / topcoat collections and sweeps the clipped overlays across code-drawn roofs. The Finish toggle (RMI-Thane / RMI-White Plus) recolours the topcoat, swaps the system code, and renames stage 5 with its text and plate rates; the Finished text follows it (gravel BUR is Thane-only). Gravel removal is not a separate stage — it sweeps off during Prep on gravel BUR. No ballast removal in the code
B3Macro roof with click-to-zoom hotspotsBUILTWhole-roof view with a marker per switched-on detail, labelled with its drawing number; click flies the camera to the detail, "Back to roof" returns. Photo pins (#1) use the same jump
B4Section-view toggleBUILTDetail view only: a cut plane through the detail, facing the camera, so the section follows the orbit
B5Material quantity estimateBUILTGallons of primer, Flex and topcoat plus the system code, from the spec-plate rates in ROOFS. Metal takes off laps, end laps and fasteners; flat roofs full field +6% (ASSUMED); per-detail allowances ASSUMED; silo walls add their area. No pricing
B6glTF detail models (mountModel)BUILTLoads the MODELS .glb files, keeps only <layer>__ meshes, scales metres to feet, skins parts to the roof's materials, and hides the code-drawn stand-in once loaded (kept if the load fails). Field cutouts (applyCutouts) open the membrane and coating sheets around flat-roof models; splices set 4-ft sections into parapet runs (coping, scupper), walls (W-11 reglet, W-13 penthouse), the office edge-metal run (F-1) and metal slopes (side lap, standing seam), plus the ridge cap; the hospital expansion-joint run (A-3) lies in one long field cutout as a strip of its cross-section, with the 4-ft model at the hotspot. A cutout can open the primer sheet wider than the Flex sheet (primerGrow) for a low detail camera; gravel pebbles and the random failure and repair decals are dropped wherever they would lie over a model's patch
B7Environment map and bump texturesBUILTProcedural, no image files: a gradient cube map as scene.environment for metal and Thane reflections; canvas-noise bump maps on mod-bit granules, SPF foam, concrete and felts. Image textures are still #4
B8Solar Post visual toggle (S.solar)BUILT"Add Solar Post supports" under Finish shows posts and racks on all 11 buildings, adds an ASSUMED Flex allowance to the estimate and sets solar_post: true in configuration(). On a flat or SPF roof every post is the P-1-S-TYP model and the toggle opens round holes in the field sheets and the building's top face over each (solarCuts, no rebuild); on metal panel the posts are code. Not a hotspot: snapshot.py --solar [i] / __rmi.solar.view(i) shoot a post at its own camera. Geometry status in §1
B9Lead-capture email modalREMOVED 2026-09-14Obsolete under the desktop direction; it never sent anything. Button, modal, Copy/Close handlers and __rmi.payload() removed. The serialiser is kept as configuration() (__rmi.configuration()): building, roof and plate, system code, existing condition, checked details with drawing numbers, topcoat, sq ft, gallon estimate, photo file names and pins. No pricing. Needed by #9 and #11. The internal keys sit beside the labels so #11 can restore a prospect: building_key, roof_key, topcoat_key, and detail_ids ({id, name} per checked detail, same order as details). Both lists hold only the DETAILS checklist; the Solar Post toggle is its own field, solar_post: true/false

Numbered — done items first, then the order CLAUDE.md "What's left" had when this tracker was made. Numbers are fixed: §3 and the weekly update cite them; the working order is CLAUDE.md "What's left" (realigned with the project instructions 2026-10-01).

#FeatureStatusNotes
0Desktop installer (Electron, Windows)BUILT (v0.3.1 on GitHub Actions)Releases build on GitHub Actions (2026-10-01, .github/workflows/build-installer.yml, windows-latest): npm version patch → git push --follow-tags → the tag's GitHub Release carries RMI Roof Visualizer Setup <version>.exe (also kept 14 days as a workflow artifact; a manual run builds the artifact only). The runner has no Smart App Control, so the unsigned uninstaller stub builds; the workflow holds a commented-out Azure Trusted Signing step (#12). Locally: npm run dist → dist/RMI Roof Visualizer Setup 0.3.0.exe; RMI crest as the app/taskbar icon (build/icon.ico, build/icon.png) and the RMI logo (assets/rmi-logo.png) in the header, on the PDF cover and in the PDF page header; runs offline, vendored libs; bundles drawings/ (render it first) and samples/ (the four sample roof photos, 2026-09-17). RMI_SELFTEST=<png> opens the big-box drain with the Drawing panel, prints its state and saves a screenshot; RMI_SELFTEST_PDF=<pdf> exports the big-box presentation with the sample photos to that path; RMI_SELFTEST_PROSPECT=<folder> runs the saved-prospect round trip in two launches (#11) (the build checks). Window title shows the version from package.json at runtime (app.getVersion()), e.g. "RMI Roof Visualizer 0.3.0". Locally, v0.3.1 packages but the installer .exe cannot be produced on Heath's machine (hence the Actions build): Smart App Control blocks the unsigned NSIS uninstaller stub electron-builder has to run mid-build (spawn UNKNOWN; CodeIntegrity event 3077) — dist/win-unpacked builds and passes the checks, only the NSIS step fails (#12). Mac only if needed. Reps get the installer through ShareFile (the .exe downloaded from the Release and sent on); rollout not yet recorded
1Photo panelDONE (v2, 2026-09-14)v2 per Dennis: a thumbnail strip across the top of the 3D view (56 px, 4:3, pin-count badge, × to remove, "+" tile, drag-drop, "Clear photos", the orbit hint at its right end); click a thumbnail and the slider docks on the right at about 40 % (filename, i / n, prev/next, ← → keys, Esc). Pins unchanged from v1. Photos (blob), pins and the building/roof selection persist in IndexedDB on that machine (rmi-visualizer db); "Clear photos" wipes the photo store; nothing is uploaded. "Load sample photos" on the empty strip loads samples/sample-01…04.jpg, labelled "Sample roof"; a rep's own photos replace them. In the installed app they come through the desktop bridge (rmiDesktop.samplePhotos → main reads them out of the bundled samples/), because fetch() cannot read a file inside app.asar — it silently loaded nothing before (fixed 2026-09-17, RMI_SELFTEST_PDF now exports the photo pages from the packaged app); the browser build still fetches them. Native "Add photos" dialog in Electron kept. A saved prospect (#11) carries the photos and pins in its own file
2Remaining detail modelsDONE (2026-09-30)No CODE-DRAWN row left in §1. 30 Sept 2026: the hangar's vents at 1.5:12 (moved to odd x on the other vent models' lap phase and onto a purlin row), and the Solar Post toggle's P-1-S-TYP post on flat and SPF roofs — metal-panel posts wait on RMI (§5 #27). 25 Sept 2026: the gutter pair (W-7-TYP, D-8-TYP) as the third splice pattern, eave-hung, and the silo wall (W-7-TYP concrete sheet) as the fourth, a ring on a curved wall — every extent of it ASSUMED pending RMI (§5 #17)
3Fine-tuningOPENHotspot label crowding (worst on prospect roofs), "Prospect roof" menu label truncation, hospital penthouse camera, silo headhouse and shed, a metal-roof Solar Post model (P-1-S-TYP is flat/SPF only, §5 #27) (fastener size done 2026-09-14)
4TexturesNOT STARTEDMaterials and textures once the Flex and Thane close-ups arrive; CC0 scans for the rest. textures/ folder (planned layout)
5Catalog alignment with the 25 DETAILS entriesOPENCatalog rows ↔ the 25 DETAILS entries. The detail menu is a per-building checkbox list, not a dropdown (B1)
6ASSUMED questions to RMIOPENCatalog §5 (#1–#27), to be sent as one list; each answer moves an item to VERIFIED
7Repo private, Pages off, transfer to an RMI-owned GitHub organizationPARTLY DONE (2026-10-01)Private and Pages off since 2026-10-01; drawings/ committed the same day (#8). Left: the transfer to an RMI-owned GitHub organization, so RMI controls collaborator access — the repo is still under nihthauke
8Drawing panelBUILT (2026-09-15)"Drawing" button beside "Section view" in detail view docks a panel right of the 3D view (the view shrinks, the detail stays centred; with the photo slider open too the columns are 5 / 3.2 / 2.8, usable at 1366×768). Tabs: 2D drawing (scroll-zoom, drag-pan, double-click 1:1, Fit), How it's applied (numbered steps per detail from the sheet notes — STEPS in index.html, ASSUMED rendered as a tag, byRoof variants carry their own), 3D concept (where the library has one). Header shows the sheet number, title and issue/revision date from the sheet (drawings/index.js). Sheets are PNGs rendered at 150 dpi by scripts/render_drawings.py from the local library — 51 today, every referenced number found — into drawings/, committed since 2026-10-01 (PNGs + index.js / index.json, no PDFs) and bundled by the installer; a missing sheet shows "not bundled with this build" instead of breaking. Sheet-number fixes found on the way: the SPF variants pointed one sheet off (now SPF-13 curb/hatch, SPF-4 penetration, SPF-3 ridge); the library has two different sheets numbered W-7-TYP
9PDF exportBUILT (2026-09-15)"Export PDF" in the header opens a dialog: prospect name and address, rep name, notes, and a checkbox per section (cover; building and roof configuration with a labelled whole-roof image; the six stages as captured images with the stage text; one page per selected detail — 3D view at the finished stage, existing / primer / Flex thumbnails, layer legend, "How it's applied" steps with ASSUMED tagged, then the 2D sheet on its own page where bundled; material estimate with coverage rates and per-detail allowances, no pricing; prospect photos with their pins drawn and listed; notes and every ASSUMED item; the Project Evaluation pre-fill as an appendix). Images come from the canvas at the default cameras (whole roof at each stage, details at four stages), composited on the view background. Desktop: Electron printToPDF (Letter, CSS page margins, running footer with page numbers) through rmiDesktop.exportPdf, save dialog defaulting to Documents and <prospect>-<date>.pdf, an Open button after; browser: the print dialog ("Save as PDF"). Big-box with four photos: 18–19 pages, ~3 MB. Verified from the installed 0.1.4 app
10EagleView importBUILT (2026-09-15)"Import EagleView report" in the header (native dialog in the app, file input in a browser) reads the report XML from the rep's machine and adds "Prospect roof (report N)" to the building menu. Each ROOF facet becomes a polygon block at its measured elevation (main roof, penthouses, stair towers, canopies); PARAPET edges get the parapet + coping (W-1-TYP), EAVE edges edge metal (F-1-TYP), FLASHING edges the wall tie-in (W-11-TYP), a PARAPET edge against a higher facet the penthouse wall (W-13-TYP); every penetration sits at its polygon centroid with its footprint, typed by area as a best guess (under 1 sq ft soil stack; 1–4 small curb; 4–10 curb / hatch; 10–30 RTU / skylight; over 30 large equipment on a curb at its measured size) using the existing models. A "Penetrations" panel beside the roof lists each one by report number with a type dropdown and a confirm box; unconfirmed types stay ASSUMED and the roof is labelled "From EagleView report N, file dated D — penetration types confirmed by rep: n of m". The rep picks the roof type (flat plates: TPO, mod-bit, gravel, concrete, SPF). The estimate uses the report's measured totals — roof area less penetrations, parapet length × the parapet height the rep enters, penetration count and perimeter — instead of the square-footage field. Stages, hotspots (one per detail type present), photos, drawing panel and PDF (cover with report number and file date, penetration schedule, measured basis, ASSUMED notes) all work on it. The XML carries no report date (the file date is used) and no parapet height; a hatch or vent on a membrane roof takes CS-1-TYP note 7 (FLAT_HATCH / FLAT_VENT byRoof). Report files are client data: *.xml and prospects/ are git-ignored; the sample report lives outside the repo. snapshot.py --eagleview <xml> and RMI_SELFTEST_EV are the checks
11Saved prospectsBUILT (2026-09-16)"Open prospect" and "Save prospect" in the header. One .rmiproject file per prospect, a zip written and read in the page (no library): prospect.json (format, version, id, saved date; prospect name, address, rep, notes; the restore keys — building, roof, finish, Solar Post, existing condition, sq ft, checked details, parapet height; the EagleView block — report id, file name and date, totals, every penetration's id, type, best guess and confirmation; each photo's file and pins; and the full configuration()), the original EagleView XML under eagleview/ and the photos under photos/, byte for byte. No pricing. Save dialog: prospect, address, rep, notes (shared with the PDF dialog), a one-line summary of what is saved, and the folder. Desktop: written through rmiDesktop.prospects to a folder chosen once and remembered in the app's settings.json (default Documents\RMI Prospects, "Change folder…"); saving again updates the same file in place, and a name that belongs to another file gets " (2)" — nothing is overwritten. Browser: the file downloads. Open dialog: "Recent prospects" (desktop: files saved or opened on that machine that still exist; browser: copies in IndexedDB, last 8), × removes a row and leaves the file, Browse… for any file. Open checks the whole file first (zip, CRC, JSON, report parses) and changes nothing if it is damaged; then rebuilds the prospect roof from the embedded XML with the saved types and confirmations, the configuration, and the photos with their pins in one pass. Asks before replacing unsaved work; the header shows the prospect name. Checks: scripts/check_prospect.py --eagleview <xml> (browser: save, reopen from Recent and from Browse…, compare state, zip entries byte-identical) and RMI_SELFTEST_PROSPECT in the installed app. *.rmiproject is git-ignored; prospect files are client data
12Bundled drawings, code signing, wide rolloutIN PROGRESSDrawings ship inside the installer from the committed drawings/ (#8). Installers now build on GitHub Actions (#0), which gets past Smart App Control on Heath's machine (it blocks the unsigned NSIS uninstaller stub during a local npm run dist). Left: code signing — Azure Trusted Signing in RMI's name (needs RMI's Azure account and business validation); the step is stubbed, commented out, in .github/workflows/build-installer.yml with the secrets and variables it needs; unsigned, reps' machines show SmartScreen and SAC may block the app — and the rollout to reps through ShareFile
13Project Evaluation pre-fillBUILT as the #9 appendix (2026-09-15)The PDF's last section mirrors RMI's Request for Project Evaluation (revised 11/15/13): project information (use, roof squares, RMI specification #, general overview written from the configuration), document profile (proprietary RMI products, warranty years from the system code), existing roof system (surface membrane, gutters / drains / skylights / mechanical / sheet metal from the checked details), the "Detail drawings — check all applicable" grid ticked from the details with their drawing numbers (PE_ITEMS in index.html), photo count, signature block. Unknown fields read "rep to complete". No standalone view or fillable form yet; numbered 13 so #0–#12 keep their cross-references
14Web copy (Cloudflare Pages + Access)BUILD READY (2026-10-02) — Cloudflare setup leftApproved by Dennis 2026-10-02 for a named list of people; the desktop app stays the reps' product. scripts/web_build.py assembles web_dist/ (git-ignored) with only index.html, vendor/, models/ (.glb), assets/ and samples/ — no drawings/ — and fails on any reference it did not copy; its index.html is marked data-build="web", so the Drawing panel's 2D and 3D tabs and the PDF's detail pages say the sheets are available in the desktop app (steps tab unchanged). Checked from web_dist/: every building × roof × detail on all three tabs, sample photos, PDF build — zero console errors, no request under drawings/. Status area (2026-10-02): the build also renders this tracker and the catalog to status/index.html and status/catalog.html (the app's header, a link between them, "Last built" date and commit), linked from a "Status" button in the app's header that only the web copy shows; before writing them it fails on anything shaped like a report number, address, company name, email or phone, and on the real client values in the local prospect files outside the repo (CLAUDE.md "Web copy"). Left, in the Cloudflare dashboard: the Pages project (build command python scripts/web_build.py, output web_dist, SKIP_DEPENDENCY_INSTALL=1) and the Access application with the email list, covering the production pages.dev hostname as well as previews (CLAUDE.md "Web copy")

3. Fine-tuning & housekeeping


4. Weekly update

Newest first, one entry per week, written on Fridays.

18 Sept 2026

Covers Fri 11 – Thu 17 Sept. Monday's work is already in the 14 Sept entry and gets one line here so the week reads whole.

14 Sept 2026