Open it on your Mac, PC or iPad for the full three-pane cockpit.
Kingsleigh OS
Sign in to Kingsleigh OS
Sign in with your email — you only see the tools & data your role allows.
Signed out — sign in to see your jobs
The engine restarted, which ended the session. Nothing has been deleted — every job, folder and figure is exactly where you left it, and comes straight back when you sign in.
{{ loginErr }}
Locked out? Ask your administrator to re-send your invite from Users & access.
The same email & password as the Kingsleigh portal. Your portal role decides what you see here, and approval is checked with the portal on every sign-in.
Signing in here needs the internet — the portal checks your login. The email-and-password sign-in works entirely on this Mac.
Check your email — enter the code below within 30 minutes.
We email a code to your account address. No email on your account? Ask an admin (Jordan or Shawn) to reset you.
Runs entirely on this Mac. Each person sees only what their role allows — Directors & Admin see everything; office, trade and insurer accounts see only their tools. Admins manage accounts & passwords in Users & Access.
{{ s.name }}
{{ sessInitial }}{{ roleLabel }}
{{ g.label }}
ALL TOOLS ({{ allToolsCount }})
● {{ uiModeLabel }} view
{{ sessInitial }}
{{ sessName }}
{{ roleLabel }}
Job {{ routeJobMiss }} is not in the live list — this screen is showing no job at all, not another one. Pick a claim from the header, or check the link you were sent.
{{ jobHdrRef }} — not in the live list{{ jobHdrRef }}{{ jobHdrAt }}{{ jobHdrStage }}No job selected
◧
Sign in to see your day
Your Director's Desk — the Daily Run, live figures and follow-ups — appears the moment you sign in.
Stage 10 · Director's Desk
{{ deskGreeting }}
{{ today }} · {{ deskSummary }}
◧
No claims yet — create your first instruction
Raise the job card and Kingsleigh OS walks you through the whole claim, gate by gate — survey, price, mobilise, invoice.
{{ radar.chestLabel }}no target set — tell Jarvis "war chest target £25k, balance £X" and this fills in
green = money landing that week balance carried
Watching every invoice date, supplier bill, wage run and the VAT reclaim — hover any bar for that week. Rebuilds every 20 minutes.
{{ c.lead }}{{ c.title }}
{{ c.line }}
nothing moves without you
✦ MONEY RADAR{{ radar.failedNote }}
⇄ Field intake{{ fieldIntake.errorNote }}
⇄ Field intake{{ fieldIntake.countChip }}{{ fieldIntake.linkLine }}
sync error · {{ se.text }}
{{ fieldIntake.clearLine }}
{{ r.head }}{{ r.when }}
{{ r.reason }}
Each reason above is the engine's own, per capture. Whole on-site surveys taken before a job existed are held separately in the drying bay — listed just below, with an attach-to-job door.
≋ Drying bay{{ dryingBay.errorNote }}
≋ Drying bay{{ dryingBay.countChip }}whole site surveys captured before a job existed — attach each to its KH number to file it
Nothing held — every field survey the bay has ever received is attached to a job.
{{ b.head }}{{ b.when }}
{{ b.jobLine }}
✉ Trade messages{{ tradeInbox.errorNote }}
✉ Trade messages{{ tradeInbox.countChip }}what the trades sent from their portal — every reply drafts here and leaves only on your Send
No contractor messages on the inbox — anything a trade sends from their portal lands here (and on your notification email).
✉ MAIL DESKREAD · TRIAGE · HARVEST · DRAFT — NOTHING SENDS WITHOUT YOUR APPROVE
{{ mailRoadsLine }}
{{ mailBusy }}
{{ mailNote }}
ACTIONS NEEDED (preview — nothing filed yet)
{{ ma.line }}
HARVEST RESULTS
{{ mh.line }}
{{ mailInboxErr }}
INBOX
{{ mi.date }}{{ mi.from }}{{ mi.subject }}
A drafted reply waits in Jarvis's approvals box — it only sends when you approve it there. If his desk is offline the brief lands on your decision queue instead.
{{ m.who }}
{{ m.text }}
Jarvis is thinking…
✦ Jarvis · The Daily Run
The Contract Manager's day — in about 20 minutes.
{{ jarvisHub.headline }}
✓ Day cleared — nothing else needs you today.
Jarvis keeps trawling every 20 minutes and will flag anything new. Enjoy the light day.
{{ jarvisHub.pending }} of {{ jarvisHub.total }} left · ≈{{ jarvisHub.estMin }} min
✦ Jarvis — what needs doingReads the gates and proposes actions — nothing runs until you confirm.
Tap Check this job — Jarvis reads the stage, scope, CPP, PO and sign-off, then lists exactly what to do next.
Reading the job…
{{ job.jarvis.narrative }}
✓{{ job.jarvis.headline }}
{{ a.sevLabel }}{{ a.title }}
{{ a.why }}
{{ a.kindWhat }}
✓{{ a.doneMsg }}
Skipped — tap Re-check to bring it back.
▶ Run the job{{ wfStageLabel }}step {{ wfStepNo }}⛑ {{ wfAuditMeter }}
✓
{{ wfTitle }}
{{ wfDo }}
{{ wfNoteLabel }}{{ wfNote }}
⛓ Satisfies gate · {{ wfGate }}
⛔ Compliance gate — don’t skip this silently
Tick it only when it’s genuinely done. If you must move on without it, override — a reason is required and goes on the audit trail.
⚠
Not yet — the system can check this one
{{ wfBlockedMsg }}
Stage progress {{ wfStageProgress }} · tick each step or hit “Done” to move on. The hard gates (asbestos, approval, signed RAMS, Sat Note) are flagged red.
Completion-certificate register
{{ certReg.badge }}
Derived automatically from the priced scope's trades — the certificates this job needs, and which are on file. Grey never green: the Sat Note gate holds until every required certificate is in.
{{ certReg.gateHeadline }}
{{ c.chip }}
{{ c.label }}
{{ c.meta }}
No trade completion certificates are required by this job's scope. Nothing to chase or file.
Homeowner satisfaction
first-party · money-free · never folded into the carrier score{{ sat.busy }}
Reading this job's ratings…
Satisfaction engine: {{ sat.errorNote }}
{{ sat.headline }}
{{ sat.catalogueNote }}
{{ c.chip }}
{{ c.title }}
{{ c.line }}
“{{ c.words }}”
{{ sat.dueLine }}
Record a rating
{{ sat.replacesNote }}
1 = very unhappy · 5 = very happy. Recording is an explicit click — nothing is captured on opening a job or advancing a stage, and a low score drafts and sends nothing.
Stage checklist — {{ job.stageChecklistName }}
{{ job.stageChecklistProgress }}
✓{{ c.item }}
No checklist defined for this stage.
Costing & margin
{{ job.marginBadge }}
End figure to invoice
{{ job.value }}
net of {{ job.feeLabel }}
{{ job.feeDeductedLine }}
{{ job.approvedVarnLine }}
Cost
{{ job.cost }}
materials + subs, net CIS
Est. profit
{{ job.profit }}
Margin
{{ job.margin }}
target 40% · 30%+ healthy
0%healthy 30%target 40%
Variations— held off value until approved
{{ v.status }}
{{ v.desc }}
{{ v.amount }}
No variations logged.
{{ job.pendingVarnCount }} pending → doc
Job folder · OneDrive
{{ fo.icon }}{{ fo.name }}
£ Money
{{ job.money.hint }}{{ job.money.chev }}
Following the money…
The money feed isn't available on this machine yet — the figures still live in Costing & margin above.
Split so people actually read and sign them: the CPP, one RAMS per trade, and the QR induction sheet for the site entrance — instead of one 200-page pack.
⛨ Incident defence pack
Compiles the per-incident evidence pack — guardian trail, hash-chained stage ledger + provenance verify result, sign-ins, RAMS-ack and drying/diary extracts — files it to the job folder and opens it.
✓ {{ job.defencePack.filedLine }}
◉ Adjuster evidence link
One expiring, read-only link to a money-free evidence room — photo timeline, plans, moisture maps and drying log, assembled from the Defence file. Issuing drafts a disclosure into the Insurer Send-Out outbox and logs it to the hash chain; nothing is emailed. Every adjuster view is logged.
{{ job.adjuster.lastUrl }}
Issued links
Loading issued links…
Could not load the issued links.
{{ lk.recipient }} · {{ lk.statusLabel }}
{{ lk.expiryLine }} · {{ lk.viewLine }}
{{ job.adjuster.emptyNote }}
⚖ Defects-liability period
{{ job.dlp.hint }}{{ job.dlp.chev }}
Reading the defects ledger…
The defects ledger isn't available for this job yet.
No snags recorded on this job yet — walk the job to raise the first one.
· {{ cv }}
✉ Resident comms
{{ job.residentComms.count }} draftbooking & arrival drafts · confirm the send in Insurer Send-Out
Reading resident-comms drafts…
The resident-comms drafts aren't available yet.
No resident messages drafted yet — as the dispatch board books a task or a visit falls due, a booking/arrival message is drafted here (and into the Send-Out outbox) for you to confirm. Nothing is sent automatically.
Sending opens the Send-Out confirm modal and drains the whole outbox to the cloud ledger — the human confirm is the only send step.
✉ Outbound email
{{ job.outbound.count }} draftnothing sends itself — you review, your confirm is the send
⚠ Email service not configured — drafts compose, but sending will refuse until the app-mail secret is added in Operating System → Connectors.
RAMS / CPP packs email from the document viewer's ✉ Email… button.
Reading outbound drafts…
Couldn't read the outbound drafts for this claim — the drafting engine refused or is unreachable. This is NOT "no drafts": use ↻ Refresh to try again.
No open email drafts on this claim. A signed sat note drafts its insurer email here automatically; materials requests and H&S packs draft from the buttons above.
Temp and RH are RAW — the engine computes dewpoint, GPP and g/kg from them and stores what was read on the visit. A material reading is judged against the dry standard for that material; without one logged the engine will not certify it dry. An environmental reading is the meter's other functions — %RH, dew point, surface temperature — kept whole with its mode and unit and deliberately never plotted as damp.
Place equipment
Log the dry standard
The moisture % read on an UNAFFECTED area of the same material — the S500 basis the drying goal is judged against. Until it is logged the engine refuses to certify that material dry; it will not guess.
Money-gated — bid quotes are money, and this session isn't permitted to read them. That is the gate working, not an error; open the cockpit on the trusted office session to level bids.
Reading the bid register…
Bid engine: {{ bids.errorNote }}
{{ bids.noJobNote }}
{{ bids.emptyNote }}
{{ p.title }}
EXAMPLE — not a live bid
{{ p.scenario }}
Scope line
Qty
{{ h.name }}
{{ l.desc }} {{ l.badge }}
{{ l.qty }}
{{ cell.label }}
{{ bd.name }}
{{ bd.total }}
{{ bd.chip }}
{{ bd.detail }}
Levelled view — a SILENT line is flagged, never priced in; an outlier needs 3+ priced bids and >25% off the line median; a lump sum is never levelled line-by-line. Nothing auto-awards.
Price the claim here — this is your one costing sheet. Want a second opinion? Cross-check it.
⚖ vs {{ benchmark.sourceTag }}▲ {{ benchmark.above }} above▼ {{ benchmark.below }} below= {{ benchmark.at }} onmedian {{ benchmark.medLabel }} vs schedulesample rates — import a real schedule to make this live
✦ Suggested for this claimClaim type:
{{ perilSuggest.note }}
Trades: {{ perilSuggest.trades }}
◇ {{ stdScope.title }}
{{ stdScope.subtitle }}
{{ c.label }}{{ c.count }}
{{ c.note }}
⚑ {{ stdScope.gapsNote }}
Rooms · floor-plan take-off
Adding to: {{ activeRoomName }}
Measuring
{{ rfNameLabel }}
W (m)
D (m)
H (m)
Drs
Wins
{{ rm.label }}{{ rm.kindLabel }}
{{ rm.dims }}
{{ rm.areaLine }}
{{ rm.sell }} · margin {{ rm.margin }}
{{ rfHint }} Click an entry to make it active, then add elements — they take that entry's area for the surface chosen.
Priced lines & rooms have been merged into the scope below — confirm the measured dimensions & rates. Anything the book can't rate is listed here, never priced at £0.
⚡ Electrical PC-sum allowance{{ surveyImport.elec.total }}indicative · advisory · NOT in totals{{ surveyImport.elec.count }} seed line(s)
Reference comparison only. A matching classification does not prove equivalent work or units. Existing sell rates are unchanged; no price recommendation or job-value uplift is inferred.
◆ Guided scoping · walkthrough
Q&A → draft
{{ scopeQa.perilLabel }}
Pick the peril, then answer a short guided Q&A. It drafts a scope through the SAME assemblies, rate book and lint passes a LiDAR scan uses — nothing is committed until you build it in the estimator below.
Loading the {{ scopeQa.perilLabel }} question tree…
Couldn't load the walkthrough — {{ scopeQa.errorMsg }}
Add a room above, then add elements from the rate library — they'll take the room's measured area.
PC sum allowancesprovisional / prime-cost — kitchens, bespoke, supply-only{{ pcTotal }}
{{ p.desc }}
{{ p.amount }}
No PC sums. Add an allowance for items not yet specified (e.g. kitchen supply). PC sums are pass-through — they add to the job value but carry no margin.
Live margin protection
{{ est.margin }}
gross margin
0%{{ est.targetLabel }}60%
{{ est.protIcon }}{{ est.protMsg }}
{{ r.label }}{{ r.val }}
Insurer take-off{{ est.insVs.label }}
Delivery & overhead recovery
Lines KH self-deliver (KH) keep the labour value; subbed lines (SUB) contribute only the markup. Toggle KH/SUB on each scope line.
⚠ Day-rate labour floor{{ dayFloor.count }} trade(s) under a day
A trade priced below one day's labour cost doesn't cover the visit. Add a minimum-attendance top-up (never automatic), or set the days it really needs.
One claim, one path — the detailed schedule. The step-by-step path is the guided path.
Job name
{{ progHeader.jobName }}
Job no
{{ progHeader.jobNo }}
Job address
{{ progHeader.jobAddr }}
{{ progHeader.datesNote }}
Programme · {{ ganttJobRef }}● Unsaved
No programme yet — add your first trade to start laying out working days.
Trade
{{ d.dayLabel }}
{{ d.dateLabel }}
{{ row.label }}
{{ row.barText }}
{{ ganttBasis }}
Edit programme · tasks, trades & dates for this job
Task
Trade
Start day
Days
{{ progNote }}
Labour Diary · KH Contractor List · PQQ
Subbies & Labour
Labour diary
{{ diary.weekLabel }}
Money-gated — a day log books a £ cost line at a day rate, so the diary is money and this session isn't permitted to read it. That is the gate working, not an error; open the cockpit on the trusted office session.
Reading the week's day logs…
Day-log ledger: {{ diary.errorNote }}
{{ k.label }}
{{ d.name }}
{{ d.date }}
{{ r.name }}
{{ r.trade }}
{{ c.label }}{{ c.sub }}
{{ diary.addRow.name }}
{{ diary.addRow.trade }}
{{ c.label }}
{{ diary.totalLine }}
Compliance register & allocation gate
{{ subc.counts }}
Reading the compliance register…
Compliance engine: {{ subc.errorNote }}
{{ subc.emptyNote }}
{{ sb.name }}
{{ sb.trade }}EXAMPLE — not a real record{{ sb.gateChip }}
{{ ch.label }}
{{ sb.blockers }}
{{ sb.warnings }}
{{ sb.cis }}
{{ subc.note }}
Certificates from trades
{{ tcert.counts }}
Reading the certificate board…
Certificate board: {{ tcert.errorNote }}
{{ tcert.emptyNote }}
{{ tcr.trade }}
{{ tcr.label }} · {{ tcr.name }}{{ tcr.chip }}
{{ tcr.uploaded }} · {{ tcr.expiryLine }}
{{ tcr.reasonLine }}
Contractor directory
{{ subCount }} contactsAdd emails to enable one-click contact. Book only against a current PQQ + H&S audit.
ShowClick a trade's light to flag — ● good · ● caution · ● issues. Saved & kept across updates.
Point this Mac at your live data, then share it with the team. Each person sets these once on their own machine.
Company insurance & accreditation
Loading company cover…
No company cover recorded yet — add PL/EL/PI/CAR and accreditations; auditors ask for these first.
{{ cd.kindLabel }}
{{ cd.provider }}
{{ cd.policyNo }}
{{ cd.limit }}
{{ cd.expiry }}
{{ cd.chip }}
1 · OneDrive job folder
{{ folderBadge }}
{{ folderRootStatus }}
2 · Asana live board
LIVE
Paste your Asana Personal Access Token to drive the job board live. Without it, the app shows the last bundled snapshot.
3 · Contractor network
{{ settingsContractorCount }} trades & suppliers loaded from your sheet, each with a traffic-light status you set in Subbies & Labour. Rebuild after you update the sheet.
4 · Share with the office (LAN)
{{ netShare.statusLabel }}
Turn on to let staff on the office network open this app in a browser — no install needed. Your Mac must stay on.
{{ netShare.url }}
5 · One live server for the whole team
CONNECTED · {{ remoteHost }}
This app is a live client of the office server at {{ remoteHost }} — everyone connected here works on the SAME jobs, scopes and traffic lights, live.
Running standalone — this Mac's own data. To work off the office live server instead (one shared state for the whole team), enter its address from card 4 on the host Mac and connect. The app reconnects to it on every launch, and falls back to standalone if it's off.
6 · Removed cards {{ removedCount }}
{{ cardVisibilityNote }}
{{ pc.no }} · Unconfirmed action
Cards you removed from the board (e.g. tester cards). Their folders/data are untouched — restore any time.
{{ rc.no }}{{ rc.note }}
Dismissed queue cards {{ dismissedCount }}
Cards you dismissed from Jarvis's queue. Nothing was done or sent — restore one and it returns on the next queue build if the signal still stands.
{{ dc.job }}{{ dc.title }} · {{ dc.when }}
Removed trades {{ removedTradeCount }}
Firms removed from the network directory. Compliance records and history are untouched — restore any time.
{{ rt.no }}{{ rt.when }}
Advanced integrations (Xero, Claude, Netlify, email intake, passcode) live in Operating System.
Stage 5 · Materials Request · Quantity Calculator
Materials
Materials tracker — live register
{{ matsLive.sumLine }}
Reading the materials register…
Materials engine: {{ matsLive.errorNote }}
{{ matsLive.emptyNote }}
Needs attention
{{ mj.chip }}{{ mj.line }}
This claim — {{ matsLive.jobRef }}
{{ matsLive.jobChip }}
{{ matsLive.jobEmptyNote }}
Item
Qty
Status
Supplier
Expected
Clock
{{ mi.desc }}
{{ mi.qty }}
{{ mi.status }}
{{ mi.supplier }}
{{ mi.expected }}
{{ mi.chip }}
{{ matsLive.note }}
Material take-off — generated
{{ matJobRef }}
Add the elements + areas (m²/LM) and the app generates the consolidated material list for this job — quantities straight from your Materials Quantity Calculator.
Elements in this take-off
{{ l.name }}
{{ l.trade }}
{{ l.unit }}
No elements yet. Add from the list, or pull from the estimator scope.
Add an element
{{ g.trade }}
▣ Material list{{ matGenCount }} items
{{ r.material }}{{ r.qty }}
Add elements to generate the consolidated material list.
Customer materials request · like-for-like
Room
Material
Qty
Budget
{{ m.room }}
{{ m.material }}
{{ m.qty }}
{{ m.budget }}
{{ m.statusLabel }}
{{ m.choice }}
No customer material choices captured yet — these populate from a job's scope & the customer's like-for-like selections once wired. Nothing is shown until there's real data.
Approved suppliers · assessed by the Quality Management team
{{ g.cat }}
{{ nm }}
Stages 8–10 · Payments tracker · Figures Sheet
Payments & figures
Awaiting & settled
Job
Client
Value
Due
Status
{{ p.no }}
{{ p.client }}
{{ p.cis }}
{{ p.amount }}
{{ p.due }}
{{ p.statusLabel }}
✓ Sat notes{{ satnotes.count }}⚠ dissatisfied note — act first
Couldn't read the sat-note register — the engine refused or is unreachable. This is NOT "no notes": a ⚠ NOT SATISFIED note could be hidden behind this. Use ↻ Refresh to try again.
No sat-note links minted yet — issue one from a job's Outbound email panel. The row here tracks sent → opened → signed → filed, and a policyholder who marks HAS NOT surfaces first, loudly.
{{ sn.stateLabel }}
“{{ sn.comments }}”
{{ sn.formLabel }}
{{ sn.when }} {{ sn.signer }}
Figures · from the cards
{{ f.label }}{{ f.val }}
Overhead recovery
{{ overheadRecovered }}
Card gross profit {{ mtdGP }} — every date, not this month — against one month's {{ overhead }} overhead. Wages for Jordan & Shawn sit below this line, not in job cost.
Monthly P&L{{ figSheetLabel }}
Month
Turnover
Profit
Margin
{{ m.month }}
{{ m.margin }}
Total
{{ figuresTotal.turnover }}
{{ figuresTotal.profit }}
{{ figuresTotal.margin }}
Monthly overhead (On Costs)
From the Figures Sheet. Every job must clear its share of this.
{{ c.desc }}
Total + 30%{{ onCostTotal }}
Retention & release clocks
{{ ret.totLine }}
Money-gated — retention figures are money, and this session isn't permitted to read them. That is the gate working, not an error; open the cockpit on the trusted office session to see the ledger.
{{ clk.headChip }}s.110A payment notice · s.111 pay-less · both directions · not legal advice
Money-gated — payment clocks are money, and this session isn't permitted to read them. That is the gate working, not an error; open the cockpit on the trusted office session.
harvested from mail · receipts · PO invoices · manual — reminders only, no payment moves through this app
Money-gated — the payables ledger is money, and this session isn't permitted to read it. That is the gate working, not an error; open the cockpit on the trusted office session.
Nothing on the payables ledger yet. Harvest invoices from mail on the Jarvis screen, promote a snapped receipt, or add one below — the ledger tracks what Kingsleigh owes its trades and suppliers with due dates and overdue states, and files pay-reminders to your decision queue. It never pays anything.
Reminders file to your decision queue once per stage (due ≤7d → overdue → 30+ overdue). Marking paid is bookkeeping only. The Xero cross-check is read-only.
↯ Cash-flow & Triver · 13 weeks forward
{{ fcVerdict }}
Every number below traces to an invoice, a bill, the wage runs or the VAT reclaim — placed by each insurer's real payment habits. Click any week for its receipts.
Set this whenever the bank moves — the 13 weeks rebuild from it.
Triver facility
{{ f.label }}
{{ f.outstanding }}
{{ f.next }}
No draws recorded. Add any live Triver draws (amount, rate, repayment date) so repayments land in the right weeks.
{{ fcPlan.title }}
{{ fcPlan.line }}
Nothing is drawn without you — this switches the ledger to “fixes applied” so you can see it working.
Borrowing is a timing tool here, not a habit — the war chest is what retires it for good.
What I'm assuming
{{ a.chip }}
{{ a.text }}
Wrong assumptions make wrong forecasts — tell Jarvis and the 13 weeks rebuild.
Actual costs · true margin
Cost Tracker
{{ costError }}
⊗ CIS invoice check
CIS 340 lint
Build the invoice line by line — description, labour £, materials £ and the deduction shown (optional). Pick the subcontractor from the compliance register so the name matches. Lint + computation only: it never files to HMRC and never adjusts an invoice.
CIS checks are money-gated. Sign in with a role that can see cost & margin to run them.
Description
Labour £
Materials £
Deduction £
Or paste to import
{{ cis.utrMark }}UTR on file
Subbie VAT-reg{{ cis.vatRegLabel }}
We're end user{{ cis.endUserLabel }}
{{ cis.matsMark }}Materials inc-VAT
Couldn't check that — {{ cis.errorMsg }}
{{ cis.counts }}{{ cis.subLine }}
{{ cis.compLine }}
No CIS issues flagged on these lines. Still confirm the deduction and rate before paying.
{{ fd.sevLabel }}line: {{ fd.line }}
{{ fd.message }}
{{ fd.citation }}
{{ cis.disclaimer }}
◫ Client selections & allowances
betterment · credit
Insurer allowance vs the policyholder's chosen option per decision point. An over-allowance choice seeds a change-order DRAFT — nothing is ordered until you approve it on the Mac.
⊟ Cost-value reconciliation
earned value vs invoiced · margin now vs forecast · unmatched spend
Money-gated — a CVR is money, and this session isn't permitted to read it. That is the gate working, not an error; open the cockpit on the trusted office session.
Reconciling cost against value…
CVR engine: {{ cvr.errorNote }}
{{ cvr.rollLine }}
{{ cvr.monthLine }}
⚠{{ cvr.blindNote }}
Drift alerts are money-gated for this session.
Scanning for margin drift and unmatched spend…
{{ al.text }}
No job is drifting past the alert thresholds right now.
No jobs to reconcile yet — a job appears here once it carries a value.
Every job — model vs truth{{ costRowCount }} jobsReading every ledger…
Job
Client · network
Stage
Sell
Model
Actual
True margin
Ledger
{{ r.no }}
{{ r.client }}
{{ r.provider }}
{{ r.stage }}
{{ r.sell }}
{{ r.model }}
{{ r.actual }}
{{ r.tm }}{{ r.delta }}
{{ r.chip }}
No jobs on the board yet — cards land here as soon as claims exist.
Worst true margin sits at the top; jobs still running on the model (—) sit last. Click any row to open its ledger and make its margin real.
JobReading the ledger…
No jobs yet — the cost ledger starts the moment the first claim lands.
{{ k.label }}
{{ k.value }}
{{ k.sub }}
Committed vs estimate{{ costBarCommitted }} · {{ costBarModel }}
model
PaidInvoicedOn POModel cost
Actual cost ledger{{ costLedgerCount }} lines
Date
Item · supplier
Ref
Status
CIS
Net £
{{ g.label }}
{{ l.date }}
{{ l.item }}
{{ l.note }}
{{ l.ref }}
{{ l.statusLabel }}
CIS
{{ l.net }}
No actual costs logged yet — the margin here is still the model. Log a day or a cost line to make it real.
Log a day
Half-day steps, at the day rate — it writes straight into the ledger.
Day rates unavailable — check the backend connection.
{{ costDayDays }}
Add a cost line
{{ costCisMark }}CIS deduction applies
Subbie PO — offer & confirm
The PO goes out for the amount you enter with the scope attached unpriced. It logs as a cost only when the contractor confirms.
{{ spoError }}
{{ p.poNo }}{{ p.statusLabel }}{{ p.amount }}
{{ p.trade }} · {{ p.lineCount }}
No subbie POs on this job yet.
{{ spoCisMark }}CIS deduction applies
{{ spoScopeHint }}
Xero bills
Connect Xero and unmatched supplier bills will appear here to match against jobs.
Uses your existing Xero connection.
✦JARVIS
{{ costNudgeText }}
The automation layer
What the system does so Jordan doesn't have to
Every row below is a real engine in the server's tick registry — not a wish list. {{ autoLive }} of {{ autoCount }} confirmed live by the server; the rest are registered but have not reported here yet. Each engine files drafts only, deduped, into the one decision queue — nothing is sent, ordered, paid or auto-served.
The daily sweep
Reading the tick stamp…
This session isn't permitted to read the sweep status. That is the gate working, not an error.
Tick status: {{ autoErrorNote }}
{{ autoRunLine }}
{{ autoSummary }}
{{ autoTotalsLine }}
{{ autoScanLine }}
Last sweep error — {{ autoLastError }}
Job-folder rescan error — {{ autoIndexError }}
{{ autoNote }}
A dry run: each engine reports what it would raise and touches nothing. An engine with no dry-run mode is skipped rather than run with hidden writes. Nothing is queued, drafted, sent or paid.
Rehearsing the sweep…
The rehearsal reads money-bearing engines, and this session isn't money-enabled. That is the gate working, not an error — open the cockpit on the trusted office session.
Rehearsal: {{ autoPreviewError }}
{{ autoPreviewLine }}
{{ a.icon }}
{{ a.title }}{{ a.badge }}
{{ a.desc }}
{{ a.stateChip }}{{ a.entry }}()
{{ a.stateLine }}
{{ a.previewLine }}
Connected systems
These are integrations, not tick engines — each shows whether it is actually connected right now.
{{ c.icon }}
{{ c.name }}{{ c.badge }}
{{ c.line }}
Operations Manual v1.0 · 27 June 2026
The Kingsleigh Operating System
One documented, repeatable process so the business runs without any single person holding it in their head. The principle: Jordan runs the business solo, and the system carries the admin. Every recurring job, reminder and figure has a home, an owner and a control.
◇ Share on your network{{ netShare.statusLabel }}
This Mac becomes the host — Shawn and anyone on the office network (Windows or Mac) open Kingsleigh OS in their browser and work on the same live data: jobs, estimates, figures and surveys all save here. No install on their machines. It's also how the cockpit reaches your iPad — open the Kingsleigh app on the iPad, tap Cockpit, and enter this address.
Coworkers & iPad open → {{ netShare.url }}
Office/home network only — the login screen still applies, and nothing is exposed to the internet. Changes take effect when you restart Kingsleigh OS. Last write wins if two people edit the same job at once.
◈ Estate readiness
{{ estate.chip }}
Are the libraries this app runs on actually loaded? Every screen that prices, plans or checks reads one of these. A blank one doesn't crash anything — it just makes the screen above it look empty for no visible reason, which is the failure worth catching early.
Probing the estate…
Readiness probe: {{ estate.errorNote }}
{{ og.name }}{{ og.chip }}{{ og.count }}
{{ estate.emptyLine }}
{{ estate.scheduleNote }}
{{ estate.basis }}
↺ Recent changes
Every recorded mutation, newest first, each with the undo it was written with. Undoing re-applies the original values through the same save path that made the change, so gates and flags recompute exactly as they normally would — it is a real reversal, not a cosmetic one.
Reading the change journal…
Journal: {{ jnl.errorNote }}
Nothing recorded yet on this machine — the journal fills as you move stages, log costs and edit jobs.
Each stage carries a control that must be satisfied before the job moves on. The gates are the protection against time-wasting.
{{ s.n }}
{{ s.emoji }} {{ s.label }}
⛓ Gate · {{ s.gate }}
Template register
{{ t.t }}
{{ t.role }}
{{ t.stage }}
Your files → this app
Every uploaded template now has a home in the interface.
{{ f.icon }}{{ f.file }}{{ f.mod }}
Pipeline of recordKINGSLEIGH OS
{{ pipelineLine }}
Next: {{ pipelineStep }}
{{ pipelineMirrorLine }}
Import freezes every card's stage, dates, notes and comments on this Mac; cut over makes the OS the record — stage moves, new jobs and the phone's job list no longer touch Asana. Keep the Asana subscription for a week of dual-run, then cancel it.
Asana — live two-way sync{{ asanaBadge }}
{{ asanaStatusLine }}
⌂ KH Job Pipeline · open board ↗ · history only — the record is Kingsleigh OS
Token: asana.com → your profile photo → My Settings → Apps → Manage Developer Apps → + Personal Access Token. Stored only on this Mac. Once connected, pulls are live and stage moves / new jobs / dated programmes push back to the board (you confirm each push).
Xero — invoicing{{ xeroBadge }}
{{ xeroStatusLine }}
Create a free Web app at developer.xero.com. Register this exact redirect URI on it: {{ xeroRedirect }}. Paste the Client ID + Secret, Save, then Authorise. Invoices are raised as DRAFTS — you approve them in Xero. Stored only on this Mac.
AI assistant — Opus 4.8 on your Claude subscription, or Local{{ claudeBadge }}
{{ claudeStatusLine }}
Optional — Anthropic API key (only a fallback if the ‘claude’ CLI isn’t installed)
Claude (default): Jarvis runs on Opus 4.8 through your own claude CLI subscription — no API key, no per-token cost, just your normal plan limits. Local (free): runs on your Mac via Ollama (qwen2.5:14b) + Jarvis — private, offline fallback; install from ollama.com then ollama pull qwen2.5:14b. API key: only needed as a backup if the CLI isn’t installed — leave it blank to stay on the subscription. Everything stored only on this Mac.
Jarvis Desk — the standalone exocortex{{ jdBadge }}
{{ jdStatusLine }}
One pinned loopback contract (health · chat · task · confirm · goal): every improvement the standalone Jarvis ships — tool subsets, verifier, model ladder, approvals — flows into this app automatically the moment his desk restarts. Nothing is hand-ported; outbound stays draft→approve→act in HIS approvals box.
Learned workflows — drafts for review{{ lwBadge }}
{{ lwNote }}
{{ r.title }}
{{ r.tools }}
{{ r.meta }}
When a desk turn completes a new kind of multi-step action (two or more tools, one of them a card, a draft or a document), the desk remembers it, tells Jarvis, and writes a route and skill draft here for review (legal or dispute work gets no draft). Nothing is overwritten, nothing runs from a draft, and nothing copies a draft into the vault: move one there yourself once it reads right. Off: integrations.learned_workflows = false in config.json.
Netlify — website forms{{ netlifyBadge }}
{{ netlifyStatusLine }}
Token at app.netlify.com → User settings → Applications → Personal access tokens. Pulls the contact / project-submission / trade-registration forms into Enquiries & Intake, where a project submission converts straight into a New Instruction.
Job intake — supplier inbox{{ jobIntakeBadge }}polls every ~10 min while the app runs
{{ jobIntakeStatusLine }}
Suppliers email jobs@kingsleighhomes.co.uk → your Outlook rule files each one into a mailbox folder → this reads that folder straight from Microsoft 365 (a modern sign-in, no password stored). New instructions land in the triage queue below.
FOLDER
Finish the sign-in in your browser:
1. Go to {{ msDeviceUrl }}
2. Enter this code, then approve Mail.Read:
{{ msDeviceCode }}
Waiting for approval… this panel connects automatically once you approve.
Signed in as {{ msMailbox }} — the folder is read securely; nothing in your mailbox is changed or marked read.
Reads a Gmail relay over IMAP with an app password. Use this only if you route jobs@ to a dedicated Gmail instead of reading Microsoft 365 directly.
App password saved on this Mac — leave the password box blank to keep it; type a new one to replace it.
Nothing waiting — new supplier instructions land here.
OneDrive — job folders{{ folderBadge }}
{{ folderRootStatus }}
This is the locally-synced OneDrive folder the app reads & writes (KH00XX job folders, photos, H&S packs). On a second machine, point it at that machine's copy. Browse… opens a native picker inside the app; in a browser, type or paste the path then Save.
Data & privacy
This app holds policyholder personal data (names, addresses, photos). It runs only on this Mac (127.0.0.1) — nothing is exposed to the network. Records are kept in your OneDrive job folders and ~/Library/Application Support/Kingsleigh OS/. When a job is closed you can archive its folder as a retention record (Job Command → close, or the walkthrough's last step).
The passcode is a convenience lock that prompts on launch. Your data's real GDPR protection is your Mac account login + FileVault — turn FileVault on in System Settings → Privacy & Security.
Connected systems
Asana— ⌂ KH Job Pipeline board, the live control hub.
Xero— invoices, payments, cash position, CIS.
OneDrive— KH00XX job folders, mobile claims workspace.
Claude / CoWork— does the heavy lifting; reads files, builds costings.
Website— two-way: enquiries create New Instruction cards; job status mirrors back to a customer tracking page.
Next steps · for Claude Code
This is the interface. Wiring it to live data is the build.
→{{ n }}
The operating system · Playbook
{{ pbTitle }}
{{ pbMetaLine }}
{{ pbStats }}
One claim, one path — the full reference playbook. For the next action on the current claim, use the guided path.
Working job{{ pbCurJobNo }}{{ pbCurStageLabel }}
{{ pbCurStageName }}
{{ pbCurProgress }}
✓{{ c.item }}
No checklist defined for this stage.
{{ pbAdvanceHint }}
{{ s.n }}
{{ s.name }}
{{ s.owner }}
Trigger · {{ s.trigger }}
Tick list
▢{{ c.item }}
Documents
{{ d.dirLabel }}{{ d.name }}
Watch · traffic lights
◉ {{ tl.t }}
⛓ Gate · {{ s.gate }}
Traffic-light rule book
Every RAG rule from the spreadsheets, exact thresholds — the colour means the same here as it did in the original spreadsheets.
{{ r.system }}
{{ r.range }}
{{ r.meaning }}
{{ r.thresholds }}
Document register
{{ d.name }}
{{ d.audience }} · {{ d.stage }}
{{ d.dirLabel }}
{{ d.gen }}
Health & Safety · Compliance hub
H&S & Compliance
Subcontractor compliance, RAMS & COSHH, and per-job pre-construction packs — from the contractor portal, in your ops app.
PL = Public Liability · EL = Employers' Liability · H&S = SSIP/CHAS audit · RAMS = method statements on file. Derived from each sub's PQQ / onboarding status — the live portal holds exact certificate expiry dates per subcontractor.
Loading the RAMS library… (about 1 MB — fetched once per session, the first time you open H&S, so every other screen boots faster.)
The RAMS library did not load, so this tab has nothing to search — that is a missing file, not an empty library.
{{ r.title }}
{{ r.tags }}
{{ hsRamsReader.title }}
{{ hsRamsReader.tags }}
Hazards & controls
{{ h.hazard }}
Activity · {{ h.activity }}
Who · {{ h.who }}
{{ h.controls }}
Scope & method
{{ hsRamsReader.body }}
{{ c.name }}
{{ hsCoshhReader.name }}
Health hazards
• {{ x }}
First aid
{{ f.k }}
– {{ line }}
Controls
• {{ x }}
Storage & disposal
• {{ x }}
• {{ x }}
Permit to work
Hot works, electrical isolation and confined-space entry, with enforced hold points: a permit starts as a draft with every control unsigned, and the engine refuses to issue it until each mandatory one carries a name. A hot-works permit cannot be closed until its fire watch is served and the area signed safe — if you try, the engine refuses and this screen shows you exactly why. Money-free surface; close-out clocks are not legal advice.
Safety walk & corrective actions
Every site safety walk and every failed-item corrective action — owner, deadline and photo-evidenced close-out. Closing the loop is what an HSE fee-for-intervention visit checks for. Walks are recorded and closed with a photo in the field app; drafts and the report live here. Nothing is sent — chases are drafts you approve.
Pick a job to see its safety-walk register.
Reading the safety walk…
The safety walk isn't available for this job yet.
{{ hsWalk.overdueN }}
overdue
{{ hsWalk.openN }}
open actions
{{ hsWalk.closedN }}
closed / made good
{{ hsWalk.walksN }}
walks on file
No safety walks recorded against this job yet — an honest clean sheet, not a clean bill.
Corrective action
Category
Severity
Owner
Due
State
{{ a.desc }}
{{ a.category }}
{{ a.severity }}
{{ a.owner }}
{{ a.due }}
{{ a.state }}
Walks
Date
Walker
Area
Lines
Failures
{{ w.date }}
{{ w.walker }}
{{ w.area }}
{{ w.lines }}
{{ w.fails }}
{{ c }}
Pre-construction / CPP pack
Generates a Construction Phase Plan pack — a CDM requirement: site-wide RAMS, trade RAMS, COSHH and the risk matrix — for the selected job, ready to print or save as PDF. Built offline from the same KHCPPV1 generator as the portal.
Job
{{ hsCppJob }}
Peril (CPP)
{{ hsCppPeril }}
Scope-driven RAMS pack
{{ hsScopePackChip }}
{{ hsScopePackMsg }}
Assembles the RAMS / CPP / COSHH / toolbox-talk pack from this job’s priced scope and names the currently-qualified operatives from the compliance register (an expiry blocks naming — grey never green). A variation flags the pack stale. A draft only — a competent person reviews, names the crew and signs it off.
Opens the pack pre-filled from the job (claim, address, peril, insurer, policyholder). Pick the trades on the pack page, then Print / Save as PDF. For the full controlled H&S document library, open the live portal.
Admin · accounts, roles & permissions
Users & Access
Create accounts, set roles & per-section permissions, change passwords, and issue one-time invites to give anyone access to the app.
Create an account
Name
Email
Role
Sections this account can access
Roles: Admin = full control incl. this screen · Office = full app · Trade/Insurer = the Network Portal scoped to them · Custom = pick exactly which sections. A one-time invite is generated; share it so they set their own password (no plaintext passwords are stored).
Accounts
{{ userCount }}
Name
Email
Role
Access
Sign-in
Actions
{{ u.name }} {{ u.statusLabel }}
{{ u.email }}
{{ u.perms }}
{{ u.pwLabel }}
For the App-Store rollout to subcontractors, these accounts map onto the portal's hosted login (the production wiring). Locally they let you and Shawn run as admins and grant a future ops hire exactly what they need.
Portal ⇄ cockpit unison
{{ unisonCount }}{{ unisonDriftCount }} out of unison
Email
Portal role
Cockpit role
Status
What it means
{{ r.email }}
{{ r.portalRole }}{{ r.seenAt }}
{{ r.cockpitRole }}
{{ r.status }}
{{ r.line }}
Portal column source: {{ unisonSource }}. Portal sign-ins follow the portal role automatically (except raising to admin — that stays a promotion here); cockpit-password sign-ins keep their stored role and drift is shown, never auto-fixed.
{{ unisonError }}
Website · contact & project submissions
Enquiries & Intake
Trade contact-us, project submissions and trade registrations from kingsleighhomes.co.uk land here for you to action — convert a project submission straight into a New Instruction.
Live pull needs your Netlify access token (the site uses Netlify Forms). Locally captured enquiries show here regardless; the convert-to-job flow works on real enquiries only.
One claim, one path — this is the detailed master tracker. The same steps, guided one at a time, live in the guided path.
All open jobs — pick one to track
{{ j.no }}{{ j.pct }}
{{ j.client }}
Start or pick a claim
This screen works on one claim at a time.
{{ checkJobRef }}
{{ checkClient }}
{{ l.label }}
{{ p.label }}{{ p.count }}
{{ it.item }}{{ it.stateLabel }}
Day-rate model · Labour & Materials Calculator
Labour & Materials
A quick day-rate × markup cost build — use it to cross-check the composite estimator or when you price a job by labour days and materials rather than by SOR line.
Cross-check tool — your main costing sheet is the Estimator. Use this to sanity-check a price by labour days and materials.
Labour · day rate × days × markup
Trade
Days
Cost
Sell
{{ l.trade }}
{{ l.rate }}/day
{{ l.cost }}
{{ l.sell }}
No labour yet — add a trade below.
Materials · part units round up
Item
Qty
Order
Sell
{{ m.item }}
{{ m.note }}
{{ m.order }}
{{ m.sell }}
No materials yet — pick one from the list above.
Build total
Labour (sell){{ labLabourSell }}
Materials (sell){{ labMaterialsSell }}
Total cost{{ labTotalCost }}
Total sell{{ labTotalSell }}
Margin{{ labMargin }}
{{ labMarkupNote }}
QS coverage library · measured take-off
Coverage & Quantities
Every reinstatement material with its coverage yield and the source behind it. Browse the library, or pick a subject, enter a measured quantity, and turn it into a rounded order list — every number traceable.
{{ covStat }}
Cross-check tool — your main costing sheet is the Estimator. Use this for traceable quantities and a measured-take-off sense check.
Pick a subject
Measured quantity
This subject is priced by measure / prime-cost — there are no material yields to calculate. Its items are listed on the right.
▣ Order list
{{ toSummary }}
{{ l.name }}{{ l.qtyText }}{{ l.costText }}
{{ l.math }}
{{ l.priceLine }}
{{ l.costNote }}
{{ l.confText }}
{{ l.basis }}
{{ l.packNote }}
{{ l.source }}
No materials in this subject.
Your cost (trade — private){{ toCostSubtotal }}
Your margin (charge − cost){{ toMarginSubtotal }}
Charge into scope (RRP + {{ toMarkupPct }}){{ toMaterialSubtotal }}
Charge = RRP (retail list) + {{ toMarkupPct }} — what the insurer sees. Your trade cost stays private; margin = charge − cost. Materials only (ex-labour).
No materials match — widen the filters or clear the search.
Does this job clear net — fully subbed?
Materials @ RRP (keep the discount) · labour at your actualised travel-adjusted cost · overhead per job · margin. The verdict is on the FULLY-SUBBED net — a job that only clears on your own back doesn’t scale. {{ viabRecoveryNote }} recovery methods available in the playbook.
Paste the insurer scope → auto-derive materials
One line per item (with its measured qty). Room headers (Kitchen, Bathroom…) set the tiling/plaster system. Labour-only lines are skipped — no invented materials.
{{ viabRecError }}
{{ viabRecSummary }}
+ {{ x.line }}{{ x.val }}
{{ f.line }}{{ f.val }}
Recovery total dropped into the Recovery field. All defensible — firm at final account.
{{ viabMatError }}
{{ viabMatSummary }}
{{ m.line }}{{ m.val }}
{{ viabMatUnmatched }} · charge dropped into the Materials field below.
{{ viabMatNeedsCount }} matched material(s) need a price — NOT counted in the totals above (never buried at £0)
{{ m.line }}
{{ m.note }}
Peril:
{{ viabCompError }}
{{ viabCompSummary }}
{{ c.ref }}{{ c.item }}
{{ c.trigger }}
{{ c.justification }}
{{ c.evidence }}
Tick the ones that genuinely apply and add them to the schedule — each is a real, defensible line with its own rate. That’s where the margin is.
{{ viabError }}
{{ vProdHrs }} productive hrs/day on the tools after travel.
{{ r.l }}{{ r.v }}
NET — you performing
{{ vNetYou }}
{{ vNetYouPct }}
NET — fully subbed (scalable)
{{ vNetSub }}
{{ vNetSubPct }}
{{ vVerdict }}
Office Send-Out · transmittals outbox
➤ Insurer Send-Out
Packs composed by Send-Out queue here and wait for a human decision — nothing sends itself. Sending posts each queued record that can honestly send (artefact names + SHA-256 hashes, job refs, recipients) to the cloud transmittals ledger. Drafts and test rows are never posted as sent, nor is a row without its ledger seq — each held row says why. No money figures and no documents travel on this surface.
Reading the outbox…
Outbox status unavailable — is the backend running on this machine?
⇪ Queued for send-out{{ sendout.queued }}packs queued
{{ sendout.queuedBasis }}
{{ sendout.heldLine }}
{{ sendout.lastDrain }}
Last server reply{{ sendout.lastErrorWhen }}, verbatim: {{ sendout.lastError }}
{{ sendout.undrainableNote }}
Sending always asks first — an explicit confirmation stands between this button and the ledger. The endpoint has no dry-run, so the modal says exactly what will happen before anything moves.
The office API reports this queue as a count only — it does not itemise the queued packs. Each queued row carries the job ref, recipient, channel, and the artefact name + SHA-256 that Send-Out wrote when the pack was composed; to inspect them one by one, open Send-Out in the Kingsleigh Homes Mac app.
Outbox clear — nothing awaiting send-out.
Rows appear here when Send-Out composes a pack for an insurer or adjuster. An empty queue means everything composed has already been posted to the ledger — not that the module is broken.
Append-only stage-event ledger · per job
✓ Provenance Ledger
Every recorded stage move for a claim, oldest first, with who moved it, where the record came from, and how precise the timestamp is. Backfilled Asana proxies are flagged as proxies — a date is never dressed up as a live move.
No claim selected.
Pick a claim above to read its chain — or start one from the Pipeline.
{{ ev.move }}PROXY — imported from the Asana board (day-granular){{ ev.ts }}
{{ ev.actor }} · {{ ev.source }} · {{ ev.basis }}
Empty chain.
{{ prov.emptyNote }}
Cycle-time deltas
Days between first entry into each stage — straight from the ledger, each with the basis the engine reported. Proxy intervals are never passed off as measured.
{{ dl.label }}PROXY{{ dl.days }}
basis: {{ dl.note }}
Office Evidence · site capture → insurer pack
◳ Evidence Studio
Drop the field scan's survey JSON (and its 3D model) to reconstruct the room from the measured plan geometry, orbit it live, and lay out the branded A4 evidence pack — reviewed on screen, printed to PDF by Chrome. Measured rooms hand off to the Estimator; nothing is priced here.
Drop files anywhere on this card — the 3D model (.usdz / .usd / .usda / .usdc / .reality / .obj) and the survey JSON(s) the phone exported. Several room JSONs accumulate into one whole-property pack.
◳
{{ ev.modelName }}
{{ ev.modelMeta }}
Model received and hashed for provenance — drop the survey JSON to reconstruct and render the room (the browser can't open USDZ; the 3D file still ships in the pack).
{ }
No survey JSON (optional) — adds measurements + provenance
{{ ev.roomsLabel }}
{{ ev.captureCaption }}
{{ ev.error }}
{{ ev.filingNote }}
▤ Measured roomsclick a room to reconstruct it below
Quantities come from the scan's measured areas — not a width × depth guess. Pricing happens on the Estimator (the money surface), behind its own confirm.
◱ Reconstructionoffice reconstruction from survey geometry — not a photographic render
Flood / damage line{{ ev.floodLabel }}0–3 m · 0.05 steps — redraws live, plane at the set height
{{ ev.floodBelowNote }}
{{ ev.orbitNote }}
This survey carries no plan geometry (v2 export) — the room can't be reconstructed, but the measured schedule and provenance still make a full pack. Re-scan on the current app for plan geometry.
{{ ev.stage }}pack: {{ ev.packBase }}
The pack opens as a printable A4 document — the on-screen preview is the artifact, so there is no "PDF failed to write" failure to hit. Print / Save as PDF from the viewer files it.
{{ ev.packLine }}
Save pack writes the manifest, the original survey JSON(s) untouched, and the dropped model bytes — to a picked folder where Chrome allows it, as downloads otherwise. The turntable exports separately as WebM (named honestly in the manifest).
Structural deflection analysis · desk-side re-run
≋ Deflection Check
Re-run the structural deflection analysis on a mesh exported from the field scan (OBJ or USDZ) — pick out bulges, sags and dents beyond a threshold without re-visiting the site. Same maths as the field tool, constant for constant; runs entirely in this window — the mesh never leaves your Mac.
Excluded — contents in scan path: {{ dfl.obstructed }}
why: {{ dfl.obstructedNote }}
{{ dfl.noiseNote }}
labels: {{ dfl.labelBasis }}
✓ {{ dfl.allClearMsg }}
{{ dfl.findingsTitle }}
{{ f.title }}{{ f.trustChip }}{{ f.mm }}
{{ f.caption }}
basis: {{ f.trustBasis }} · {{ f.where }}
plan view on the fitted plane, viewed from inside the room — 5 cm cells. RED = pushed OUT into the room · BLUE (hatched) = bellied IN, away · cream = under the noise floor, not resolved. Take the straightedge to the marked worst point.
◱
Plan & Scope Markup
Calibrate, measure and stamp a plan — totals feed the estimate. Quantities only; money stays on the money surface.
{{ pd.markupBadge }}
{{ pd.hint }}
{{ pd.busy }}
{{ pd.notice }}
◱
Drop a plan here
PDF or image — or paste a screenshot (⌘⇧4, then ⌘V), pick “Open plan…” above, or pull a plan photo straight off the claim. Scanned/photographed PDFs open as measurable sheets; vector-drawn PDFs get a read-only preview and a paste-to-measure path (no PDF rasteriser ships in this desk, honestly stated — not faked).
{{ pd.folderLine }}
Reopen a saved sheet on this claim
Open a plan photo · {{ pd.jobNo }}
{{ pd.pick.total }} on file
Reading the photo timeline…
Couldn't read this claim's photo timeline — no folder, or the backend is unreachable.
{{ cat.label }} · {{ cat.count }}
{{ pd.status }}
{{ pd.calibIcon }}
{{ pd.calibSheetLabel }}
{{ pd.calibChip }}
{{ pd.calibBasis }}
Measurements
◌ {{ pd.markupSidebarNote }}
{{ m.icon }}
{{ m.valueLine }}
{{ m.basis }}
No measures yet. Calibrate, then use Length or Area.
Subtotals by label
{{ g.label }} · {{ g.count }}
{{ g.text }}
Stamps
{{ s.icon }}
{{ s.text }}
No stamps yet. Use Disputed, Agreed or Evidence ref.
{{ pd.reg.chainText }}. Each markup is logged with its author and timestamp the moment it is made — before the sheet flattens — so this list prints into the claim's Defence file as admissible dispute evidence, not just a picture.
No structured markups filed yet. Every measurement and stamp you commit is logged here — author, time, type and sheet — on an append-only, hash-chained ledger before any flatten.
Send & file
Every action above asks first and shows exactly what moves. Markup + calibration persist per claim on this machine; exports are copies — the original plan is never modified.
Total length
{{ pd.totalLinear }}
Total area
{{ pd.totalArea }}
{{ pd.totalsBasis }}
◲
Plan Takeoff
Pull quantities off a third-party drawing — calibrate the scale, measure by hand with the tool belt (or run the vision takeoff), then hand the scope to the Estimator. Quantities only; money starts in the Estimator.
{{ tk.jobRef }}
⟳ {{ tk.busy }}
{{ tk.status }}
{{ tk.error }}
⌖ snap · {{ tk.vectorCount }}
{{ tk.activeHint }}
◲
Open a drawing to take off
An architect’s, insurer’s or loss-adjuster’s PDF or image. Drag it in, paste a screenshot (⌘V), or use the button. Our own artifacts (field scans, dimensioned PDFs) read areas exactly; a photographed or third-party drawing is measured from a scale you calibrate. PDFs rasterise via the macOS render path — degrades honestly if none is present, never faked.
STEP 1
Calibrate the scale
Own artifact — areas can come exact from the source. Calibration is optional; you can measure straight away.
Pick Calibrate on the tool belt, click two points on a known dimension in the drawing, then type its real length. Pixels only become metres once this is set.
{{ tk.calPtCount }} / 2 points placed
Scale · {{ tk.scaleMethod }}
{{ tk.scaleBasis }}
Inferred, not measured — check it against a known dimension before trusting the numbers.
No measurements yet. Pick a tool from the belt over the drawing — Length, Area, Perimeter, Rectangle or Count — and each measurement lands here with an editable label and a rate-book category. Tools stay locked until the scale is set.
Areas · m²
{{ r.valueText }}
measured
Linear · m
{{ l.valueText }}
measured
Counts · nr
{{ c.n }}
STEP 3
Vision takeoff (optional)
Let the engine read rooms, counts and linear runs off the sheet — every figure comes back with a confidence chip and a measured/estimated badge. Use it as a starting point alongside your hand measurements.
Set the scale first — then the vision takeoff can turn the drawing into metred quantities.
VISION
Review
{{ tk.provider }}
Some figures are low-confidence — treat them as a starting point and verify against the drawing before pricing.
Nothing measurable was pulled from this sheet by the vision pass. Nothing is invented — measure it by hand with the tool belt, or try a clearer drawing.