Javis OS
Javis OS is an Agentic AI that assists entrepreneurs in business tasks, helping them grow their work.
AI translation
Track construction changes, measure areas from PDFs, and register project drawings via browser-accessible dashboards
AI summary · website and README
BusinessHTML · JavaScriptGitHub @sajjadsj44-maxOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
Static, self-contained HTML dashboards published live on Netlify and GitHub Pages.
On Netlify the site root serves the dashboard itself (see the rewrite in
netlify.toml); on GitHub Pages the root serves the index page instead.
Both hosts serve the same repo and update from the same push, so either link
works. Share the Netlify one — it is shorter and easier to read out.
Public and read-only — anyone with the URL opens them in any browser, phone or
desktop, with no login and nothing to install. Viewers cannot edit anything.Read the full README ↗Static, self-contained HTML dashboards published live on GitHub Pages.
| Page | Link |
|---|---|
| Zameen Developments | https://sajjadsj44-max.github.io/ZD-Dashboard/zameen-developments/ |
| Drawing Tracker | https://sajjadsj44-max.github.io/ZD-Dashboard/drawing-tracker/ |
| PDF Takeoff | https://sajjadsj44-max.github.io/ZD-Dashboard/takeoff/ |
| Dashboard index | https://sajjadsj44-max.github.io/ZD-Dashboard/dashboards/ |
| Site address (opens PDF Takeoff) | https://sajjadsj44-max.github.io/ZD-Dashboard/ |
GitHub Pages is the only host. Always open the same address: the takeoff keeps its projects in that browser, per address.
Read-only — anyone with the URL opens them in any browser, phone or desktop, with nothing to install, after entering the dashboard password. The password is asked every time a page is opened (also on Back / Forward) and is never saved: no "remember me", and the field is not a browser password field, so no browser or password manager offers to save or fill it. Viewers cannot edit anything. The lock only keeps casual visitors out — the pages themselves are in this public repo.
Because the repo is public, everything committed here is publicly readable. Don't commit confidential data.
zameen-developments/index.html.main.The URL never changes, so links already shared stay valid across every update. If someone still sees an old copy, GitHub Pages caches HTML for up to 10 minutes — a hard refresh (Ctrl + F5, or Cmd + Shift + R) clears it immediately.
The Change Management app reads two Google Sheets over the gviz JSONP endpoint, both of which must be shared as Anyone with the link · Viewer or the dashboard cannot read them:
| What | Sheet | Read as |
|---|---|---|
| RFI / design change log | Change Management-Cost Impact | first tab, gid=0 |
| Per-project cost, area, rate and dates | Projects Summary | first tab, then by tab name |
SHEET_ID and PD_SHEET_ID hold the two workbook ids. SHEET3_CANDIDATES
is tried in order: the Projects Summary workbook first, then a
Sheet 3 / Project Details / Projects / Project Data / Master tab
inside the log workbook, so a project summary kept as a tab in the log
workbook still works with no code change.
The project summary needs these eight columns. Headers are matched by regex,
not by position, so the wording can vary — Covered Area (Sft) and
Area, Sft both resolve:
Project Name | Original Contract Cost (PKR) | Covered Area (Sft) |
Original Rate / Sft (PKR) | Contract Date | Contract Duration (Days) |
Expected Completion | Remarks
Rate is derived as cost ÷ area when the rate cell is blank. Project names are
matched to the log through the built-in PROJECTS registry, so NEO in the
log and Zameen NEO in the summary resolve to the same project.
The Drawing Tracker (drawing-tracker/index.html) reads one Google Sheet,
ZD Drawing Register (Tracking) (SHEET_ID in that file), first tab via
gid=0, also over the gviz JSONP endpoint — so it too needs to stay shared as
Anyone with the link · Viewer. Columns: Project | Discipline | Drawing / Revision | Status | Date Received | Category / Source Folder | Remarks / Source | Drive Folder Link. It was seeded on 23-Sep-2026 from the drawings
actually found in the shared "New ZD Drive" (ARX, DTR, EON, GRANDE PALLADIUM -
IVORY, GVR Multan, HIVE, JADE, MALL-35, NEO, PHOENIX, QUADRANGLE): rows with a
real drawing name and date were logged as Received; every project/discipline
combination without a logged drawing yet is seeded as Pending Entry with a
link straight to its Drive folder. The Document Controller / QS team keeps it
current by editing the sheet directly — add a row per drawing as it's
received, or change a Pending Entry row's status to In Progress /
Waiting / Received; the dashboard just reflects the sheet live, it never
invents a status.
Added 28-Oct-2026. The zameen-developments/ start screen has a QS Cost Control
card (?app=ra, password as the dashboard). It opens the QS Cost Control module on
its own (rate library, GRN / MRS / PBS rates, Rate Analysis, Project BOQ, RFQ
Tracker, Price Trends) with the other modules hidden, like the Payments,
Change Management, Calculator and Productivity cards.
QS Cost Control → GRN Price Register lists every item received on site with the rate of its latest GRN, the vendor, the number of receipts and the low–high range, plus the full receipt history per item. Seeded on 23-Sep-2026 from the ERP material receiving exports of Quadrangle (3,138 receipts, Mar-2021 to Aug-2025) and Phoenix (770 receipts, Nov-2022 to 07-Sep-2026): 1,775 items in total.
On 06-Oct-2026 the store's compiled workbook Material Received at Store 21
(one sheet per project) added 17,932 receipts: Opal, Mall 35, Aurum,
NEO, Jade (Arcs), DTR, ARX, Vault, GP (EDZD), GVR,
EON and Hive in full, plus the newer Quadrangle and Phoenix GRNs. The
register now holds 21,840 receipts of 14 projects, 11,305 items, Dec-2019 to
30-Sep-2026. That workbook mixes m/d/yyyy text, dd-mm-yyyy text and Excel dates
with day and month swapped, so the tool reads each GRN's date from the GRNs
numbered either side of it (checked against the ERP exports already held: 1,460 of
1,461 GRNs agree, the one left is entered differently in the workbook). Rows
repeated cell for cell are read once, rows without a rate are skipped, and a line
already held under the same site, GRN and item code keeps the ERP export's more
precise rate. Rates billed per cubic metre, metre or square metre are converted to Cft,
Rft and Sft; the GRN unit and rate stay in the history. + Rate DB copies an
item's latest GRN rate into the Rate Database as a verified line, with
<Site> GRN RCP-n, DD-Mon-YYYY — <vendor> in its remarks and the same date as
its effective date.
The data is embedded in zameen-developments/index.html (the
<script type="application/json" id="raGrnData"> block). To add another site or
a newer export, run:
pip install openpyxl # once
tools/grn_register.py NEW_RECEIVING.xlsx # one or more exports
Rate Database updated to the September GRNs (06-Oct-2026): every Rate Database line whose latest GRN — on any project — is dated September or October 2026 now carries that GRN's rate, date and remarks; lines whose latest GRN is older keep their rate. Changed: CEM 1,575 → 1,615 (ARX RCP-322, 27-Sep), STL60 242 → 238 (Jade RCP-526, 26-Sep), RMC-4000 337.25 → 356.79 (DTR RCP-218, 23-Sep), RMC-4500 331.31 → 362.46 (GVR RCP-20, 24-Sep), DIESEL 392 → 380.66 (quantity-weighted average of the 33 receipts of 30-Sep at five sites). SAND-CH 80, SILICA 130, BLK-S8 215, BLK-H4 135 and BLK-H8 210 keep their rates with the newer GRN as source and date. A saved library takes the new rates only where a line still holds the old published value; a rate typed in by hand is kept. BLK-S4 140 (Zarea quotation, 05-Sep) → 120 (NEO GRN RCP-3541, 15-Sep-2026 — Azmat Sons), updated the same day on request.
All Rate Database lines refreshed from the latest GRN (07-Oct-2026,
node tools/grn_rates.js, block raGrnLatest): for every line the Rate DB vs GRN
tab links to a GRN item, the same description is looked for on every project and
the receipts of the latest day are taken (quantity-weighted average when there
are several that day, converted to the line's unit). Only when that day is later
than the line's own date does the line take the rate, date and a
<site> GRN RCP-n, DD-Mon-YYYY — … remark; every other line keeps its rate. A
newer GRN at the same rate refreshes the date and source only. A change of more
than 3× either way is held for a decision, not applied (one: the Phoenix
self-tapping screw, 2.5 per piece against 250 on Vault RCP-128). Saved libraries
take a new rate only while the line still holds a value published earlier; a rate
typed in by hand is kept. Re-run the tool after each new GRN export
(tools/grn_register.py, then node tools/grn_rates.js).
Every sheet with GRN columns is read (the ERP export's Site / GRN # / Item Code / Item Description / Rec.Qty, or the compiled workbook's Location / GRN# / ITEMNO / ITEMDESC / Received Qty); --dry-run reports what would be added. Receipts
already in the register are skipped, so a cumulative export can be re-run safely. The raw exports are not committed.
Purchase orders (added 03-Oct-2026): the register also lists the item lines of
the Sage 300 PO books, printed from Sage as POPOR01 – PO Purchase Orders:
Mall 35 (179 POs, Dec-2019 to Sep-2026) and Zameen Omega → Phoenix
(99 POs, Jan-2023 to Oct-2026) — 704 lines, 543 items. Type picks GRN
receipts, purchase orders or both; a PO item is marked PO and has no item
code. Its rate is the rate ordered, before any PO-level discount and tax, and
+ Rate DB writes <Site> PO-n, DD-Mon-YYYY — <vendor> into the remarks (plus
the discount when the PO had one). PO lines are only shown in the register: the
Price Trends, the Rate Database check and the RFQ vendor suggestions still use
GRN receipts. The data is the raPoData block of the same page; to add newer PO
books (the PDFs from Sage's Universal Printer), run:
TK_LIBS=/path/with/node_modules node tools/po_register.js POPOR01.pdf [MORE.pdf ...] # needs pdfjs-dist
Every PO is checked before anything is written (its lines less any discount must
equal its subtotal, and subtotal + tax its total); PO lines already held are
skipped. The site comes from the company on the PO (Mall 35 → Mall 35, Zameen
Omega → Phoenix) or --site. A PO item takes the category of a GRN item with the
same description, else none. The PDFs are not committed.
QS Cost Control → KPK MRS Rates lists all 4,584 items of the Khyber
Pakhtunkhwa Finance Department (MRS Cell) Market Rate System MRS-2025 (1st
Bi-Annual), notified 07-Oct-2025 (No.MRS/FD/4-2/NOTIFICATION/2025), Peshawar
base rates. Items are kept separate by their 28 chapters (item types: carriage,
earthwork, concrete, brick masonry … electrical, photovoltaic, repair &
maintenance). Each item has its British and metric unit, labour and composite
rate exactly as printed, the specification reference, the MRS remarks and the
PDF page number. Units default to British (Cft / Sft / Rft); the metric column
is available as printed. A district or merged-area location factor (from the
schedule's own factor tables) can be applied to every rate shown. The filtered
CSV carries KPK MRS-2025 (1st Bi-Annual), 07-Oct-2025 — item <code> … in its
Source / remarks column and 2025-10-07 as its effective date.
Composite rates include 23.5% (4% KP sales tax, 2% overheads, 7.5% income tax, 10% contractor's profit). They are KPK government schedule rates, not Lahore market rates — a benchmark, not a substitute for a dated Lahore quote or GRN.
The data is embedded in zameen-developments/index.html (the
<script type="application/json" id="raKpkData"> block). To load a newer
bi-annual edition:
pip install pymupdf # once
tools/kpk_mrs.py "KPK Market Rate System 2026 (1st Bi Annual).pdf" \
--edition "MRS-2026 (1st Bi-Annual)" --notified YYYY-MM-DD \
--notification "No.MRS/FD/..."
The PDF is not committed.
.github/workflows/rate-watch.yml runs tools/rate_watch.py every day at 06:30
Pakistan time (and on demand from the Actions tab):
Anything new is committed to the rate-watch/update branch and offered as a
pull request — the live dashboard changes only when you merge it (check the
deploy preview first). A new KPK edition that fails the checks opens an issue with
the link instead and is retried daily. A run marked failed in the Actions tab means
the KPK site could not be reached or read that day. The Punjab site does not
answer GitHub's servers (first dry run, 24-Sep-2026: all three pages timed out), so
a Punjab timeout is only a warning on the run; the KPK site answered normally. State is kept in data/rate-watch.json.
For the bot to open pull requests, enable Settings → Actions → General → Allow GitHub Actions to create and approve pull requests (otherwise it opens an issue pointing at the branch).
QS Cost Control → Punjab MRS Rates is a read-only register of the Punjab
Finance Department's Market Rates System (MRS), next to the GRN Price
Register. Loaded on 23-Sep-2026 from the 1st Bi-Annual 2026, District
Rawalpindi edition (valid 01-Jan-2026 to 30-Jun-2026; Punjab rates 385_20260110213957.pdf from Google Drive): 1,539 rate lines from the
building-construction chapters — Loading/Unloading, Earthwork, Dismantling,
Concrete, Brickwork, Stone Masonry, Roofing, Flooring, Surface Rendering, Wood
Work, Painting & Varnishing, Plumbing/Sanitary/Gas, Iron Work and Miscellaneous.
Each line shows the MRS labour and composite (labour + material) rate in house
units — per 100 Sft, per 1000 Cft, per Cwt (→ Kg) and so on are converted — with
the figure and unit as printed and its chapter, item, line and page, so it can
be checked against the PDF. Search, filter by chapter, unit or metric check, and
export CSV. + Rate DB copies one line (composite or labour share) into the
Rate Database as a market-indication (I) rate — a published schedule, not a PO
or GRN — with location, effective date and the MRS reference in its remarks
(Punjab MRS 1st Bi-Annual 2026 (Rawalpindi), 01-Jan-2026 — Ch.6 item 9, line 19 (Concrete), p.39; ...). The register itself never changes the Rate Database
or any analysis until a line is added that way.
Checked against the PDF. MRS prints every rate twice on the same row, in British and metric units. The loader converts one to the other for every line: 1,453 lines agree, 26 are lines where the schedule's own two figures disagree (e.g. p.65 Multani tiles, 1,261.55 per Sft beside 4,137.80 per Sqm) — those carry a ⚠ check mark with the metric figure, and that note travels into the remarks if one is added to the Rate Database — and 60 use units that have no metric counterpart (Job, Point, Letter ...). Every figure was also found on its cited page by a second PDF reader.
The edition's period has lapsed, so the tab says so: treat these as a benchmark
and prefer a current, dated Lahore rate for a live BOQ (see CLAUDE.md). To
load a newer edition or another district — edition, district, period and
chapter pages are read from the PDF itself:
pip install pdfplumber # once
tools/mrs_register.py MRS.pdf # building chapters (default)
tools/mrs_register.py MRS.pdf --chapters all # or e.g. 2-13,19,24,25,26
python3 -m unittest tools/test_mrs_register.py # parser tests
MRS_PDF=MRS.pdf python3 -m unittest tools/test_mrs_register.py # + end-to-end
Left out by default: Ch.1 Carriage — its mile and km bands are printed over each
other in the PDF and cannot be read back reliably — Ch.5 Mortar (a material
consumption table, no rates), and the non-building chapters (canals, sheet
piling, roads, drainage, sewerage, wells, tubewells, electrical, HVAC; HVAC's
table layout is different and reads as 0 lines even with --chapters all). The
data lives in the <script type="application/json" id="raMrsData"> block of
zameen-developments/index.html.
Rate Analysis → Item Library now carries 24 generated design-mix RCC items (per Cft), built from two lab mix-design sheets received 23-Sep-2026:
RCC-DM-AR-<psi>; the second 6500 and 7000 psi rows (10mm-heavy, SP 534/40)
are RCC-DM-AR-6500B / -7000B.RCC-DM-ACI-<psi>.Batch weights per m³ are held in RA_DMIX and converted per Cft (÷ 35.3147):
cement ÷ 50 kg/bag; fly ash, silica and admixture in Kg; sand and crush in Cft
from the Al Rafiq sheet's own CFT columns (46.65 kg/cft sand, 41.00 kg/cft
crush — the same densities are used for the ACI sheet, flagged as an assumption);
water as an optional allowance. Labour and plant follow nominal-mix RCC. Sand and
crush sources can be changed on the item's parameter panel.
Two rate lines were added: ADMIX-SP (FosPak SP 568, 185/kg, Quadrangle GRN
RCP-1847, 24-Jul-2024 — latest GRN, no current Lahore rate found) and FLYASH
at 1.758/kg, ASSUMPTION — no dated source: the top of a Pakistan range of
Rs 2–1,758 per metric ton from a 23-Sep-2026 web-search summary (no seller, no
date). It is probably low, since fly-ash bricks sell at Rs 13–18 each. Replace it
with a dated quotation before pricing a live BOQ.
Rate Analysis → Concrete Mix Design – Lab Rate Analysis keeps every laboratory mix design as its own record, priced from the Rate Database. Seeded on 25-Sep-2026 from 15 photos → 21 records (photo 8 is a duplicate of photo 7):
| Source (as on the photos) | Records | Grades |
|---|---|---|
| Excel ACI-211.1 workbook, lab not shown (photos 1–6) | LMX-XL-01…06 | psi not shown (cement 150–530 kg/m³) |
| J7 Group QA/QC, Batching Plant Multi Garden B-17 (photos 7–8) | LMX-J7-<psi> | 3000, 4000, 4500, 5000, 5500 |
| ACI-211.1 5000 psi sheet, mixed 05-04-26, lab not shown (photo 9) | LMX-ACI5K-01 | 5000 |
| Ready-mix plant sheets, DHA Multan, BS 882 grading (photos 10–14) | LMX-MUL-<psi>, LMX-MUL-136 | 1000, 4000, 4500, 6000, 1:3:6 |
| "Concrete Mix Design ACI-211" batch-weight sheet (photo 15) | LMX-ACI-<psi> | 1500, 4000, 4500, 6000 |
Designs of the same psi from different labs stay separate. Figures are typed as printed (the Excel sheets' corrected weights are used; the uncorrected weights, volumes and slumps are kept in each record's notes). Anything a sheet does not show (lab name, psi, date, cut-off mix codes, unnamed admixtures, sand / crush sources) is listed under Needs Verification on the record.
Each record: lab kg/m³ → bags, Cft (sand 46.65 / crush 41.00 kg/cft, the Al Rafiq sheet
densities the Item Library design mixes use; editable per record), litres; linked Rate Database
line, qty in its unit, rate, amount per m³ and per Cft, and totals for a chosen volume in Cft.
Clicking a rate updates the shared Rate Database line (source and date required). Labour,
machinery, batching, mixing, transport, pumping, wastage, overheads and profit are separate
editable components at 0 until entered. Records can be added, edited, duplicated, archived and
deleted (deleted seed records are not re-added; Restore brings them back); print / PDF, Excel
and CSV per record, plus a register CSV. Records are stored in the rate library (RA.labMix,
browser storage key SAJ_QSCOST_v1) and travel with Backup JSON.
The seed is the <script type="application/json" id="raLabMixData"> block. To change a
transcription, edit tools/lab_mix_data.py, then:
tools/lab_mix_data.py zameen-developments/index.html
python3 -m unittest tools/test_lab_mix_data.py
A new seed revision refreshes only records nobody has edited.
Rate Analysis → Item Library carries 423 MEP items (Electrical 129, HVAC 130,
Plumbing 73, ELV 47, Fire Fighting 44), built on 24-Sep-2026 from the MAK
Contractors & Associates final bill for Mall-35 MEP (MAK Final Bill Checking.xlsx,
Final IPC-09, May-2025: electrical, plumbing, HVAC and all Non-BOQ additional scopes).
MAK worked on an installation-only contract (MEP Works Agreement, 25-Sep-2023: material and equipment by the Employer; rates include 7.5% income tax and exclude PRA). So each item is built up as:
GRN-… codes its
+ Rate DB button uses), or an existing Rate Database line (SAN-WC, SAN-WB).
Pipe fittings and tray accessories are a share of the pipe / tray value, taken from the
Quadrangle receipts: PPRC 1.054, uPVC 0.980, MS 0.483, tray (without covers) 0.224.
Insulation sheet and GI sheet are converted to per Sft. Each conversion is written in
the line's remarks.TRADE_DISC in tools/mep_rates.py) is taken off the list price,
giving for example 1C 25 mm² 378.52/Rft net (list 540.75; last GRN 227.10 on Quadrangle
RCP-2297, 25-Jan-2025). Each line's remarks give the list price, the discount, the Fast
cross-check and the last GRN, and the line is marked I (market indication). Neither
list covers 600/1000 V power cable, GI sheet, insulation or pipe, so those stay on GRN.MAK-<item> = the MAK rate for that item, read from the bill rows.
BOQ rates are dated 25-Sep-2023 (the contract). Non-BOQ rates are dated 31-May-2025,
because the certificate gives only the month.Per-point wiring quantities (for example 45 ft of run from the DB to a switch board, or 60
ft of Cat-6 per data point) are assumptions stated in the line notes, because the bill's
measurement sheets count points but do not give lengths. Materials with no GRN (97
lines, for example PICVs, patch panels, speakers and 8"–12" MS pipe) are kept at 0 and
marked ASSUMPTION — no dated source. The item then shows an unpriced gap. 133 of the
138 priced materials come from GRNs more than 12 months old (Quadrangle 2022–2025),
and their remarks say "reconfirm before use". Employer-supplied equipment (panels,
chillers, AHUs, FCUs, pumps, fans) is installation only. Where one exists, the note gives
the Quadrangle GRN supply price for reference.
Every item's spec names the bill item and row it came from. Its note gives the Mall-35 contract and final-bill quantities. Where several bill rows share one rate, they are grouped into one item (all DBs at 14,550; all FCU sizes at 2,659.38). Non-BOQ rows that repeat a BOQ rate rounded to 2 dp were left out of those groups.
The data is in the <script type="application/json" id="raMepData"> block. Saved
libraries get the new lines and items on their next load (missing codes only; nothing
already in the library is changed, except that a line or item still at a previously
published version is moved to the new one — the block keeps those versions in prevRates /
prevItems, and anything edited by hand is left alone). To rebuild from a newer bill or GRN register:
pip install openpyxl
tools/mep_rates.py "MAK Final Bill Checking.xlsx"
MAK_BILL="MAK Final Bill Checking.xlsx" python3 -m unittest tools/test_mep_rates.py
The build stops if any rows grouped into one item carry different rates. The bill workbook is not committed.
Added 26-Sep-2026. The brief it was built against, including what was changed in the original
prompt and why, is in docs/qs-rate-engine-brief.md.
I = tax % × (direct + G + H). The default
is in Settings and it can be overridden per item. The bases of G, H and I are printed.Amount = Qty × Rate, sub-totals, G / H / I); printable PDF sheets; a
material and labour breakdown.Seed corrections are applied only to items and lines still exactly as seeded. An item already edited by hand is left alone and listed, with a button to apply the builder, which saves a revision first. Applied on the first load after this change:
| Item | Error found | Correction |
|---|---|---|
| SC-420 screed 1" 1:4 | cement 0.0217 was the cement volume in cft, not bags (÷ 1.25 omitted); sand 0.1083 was the whole dry volume, not the 4/5 share — both +25 % | screed builder: 0.01733 bag, 0.08667 cft (+5 % wastage) |
| FN-500 / FN-505 tiles | grout 0.08 kg/Sft ≈ 10 × the joint volume for 24" tiles, 1/16" joints | tile builder |
| FN-550 gypsum ceiling | GYPBD 200/Sft was an installed rate entered as a material | gypsum builder (11 resources) |
| FN-530 / 535 / 540 paint | PUTTY, PRIMER, EMUL, WSHIELD were per-Sft systems | paint builder, priced per Ltr / Kg |
| PL-700 / PL-710 pipes, EL-600 conduit, EL-650 tray | pipe / tray + a percentage for fittings | counted fittings, clamps and supports from Quadrangle GRNs |
| EL-670 LT cable | glands and lugs not priced | allocated per run |
| FW-300 … 350 formwork | amortised per-Sft ply / timber lines | sheet price, uses and batten volume explicit |
| NAILS | 400/kg assumption | Phoenix GRN RCP-273, 21-May-2026 — 715/kg |
Flagged, not changed: FN-510 marble bed thickness is not stated (the quantities imply 7/8"); FN-560 door has no frame; EW-950 paving has no paver; EW-960 manhole has no materials; EX-130 compaction factor; EL-615 has one switch per light point; MEP items add house OH / profit on top of MAK rates that already include MAK's margin.
Rates. The new purchase-unit lines come from the GRN Price Register (same GRN-… codes as
its + Rate DB button, so lines the MEP analyses already use are shared), from dated published
pages (Reference-Based), or are left at 0 as ASSUMPTION — no dated source. From the build
environment, supplier and price-list sites (United Gypsum, Nippon, Brighto, OLX, icons.com.pk …)
were blocked by the network egress policy, and search results gave only installed ceiling rates.
The gypsum board, channels, angle, connectors, tape, compound, studs and tracks are therefore
unpriced, and the gypsum items show incomplete until a quotation is entered. The prompt's
PKR 500 / sheet board is used only as the test figure (500 ÷ 32 × 1.05 = 16.406 / Sft).
Data: the <script type="application/json" id="raQsEngine"> block, written by
tools/qs_engine_data.py (reads the GRN block of the same page). Tests:
tools/qs_engine_data.py --as-of YYYY-MM-DD # rebuild the data block
python3 -m unittest tools/test_qs_engine_data.py # data rules (source format, GRN match, guards)
python3 -m http.server 8765 & # then, with playwright installed:
node tools/test_qs_engine.js # 48 browser checks (QE_LIBS=… for offline Excel)
Added 26-Sep-2026 from Sajjad's list of missing civil analyses
(QS_Rate_Analysis_Lahore_2026_All_Missing.txt), reviewed line by line. The review, including every
rate side by side with the list, is in docs/civil-gap-rate-review.md.
CV-001 … CV-130 (site preparation, earthwork, concrete, formwork,
reinforcement, masonry, waterproofing, plaster, screed, flooring, doors / windows / joinery, painting,
ceilings, metal work, external works) and CV-R01 … CV-R03 (repair). Each carries its QS category.MRS-C… codes as the MRS register's + Rate DB button.
BM-CV-<n> line marked ASSUMPTION — no dated source, so they
show as Assumed until a quotation replaces them.L-HELPER 1,300 → 1,538 per day (Punjab minimum wage 40,000 per month from 01-Jul-2025 ÷ 26 days).
This raises almost every civil item.BRK-1 18 → 17.5, BRK-2 15 → 13,
GRAVEL-SB 120 → 100, and seven trade wages that were assumptions (plaster mason, carpenter, steel
fixer, tile fixer, electrician, plumber, foreman).Saved libraries pick the block up on their next load, the same way as the MEP block (raSyncBlk,
revision key civRev):
prevRates / prevItems) is moved to the new one;Data: the <script type="application/json" id="raCivilData"> block, written by tools/civil_gap_data.py
(it reads the GRN and MRS blocks of the same page).
tools/civil_gap_data.py --as-of 2026-09-26 # rebuild the data block
python3 -m unittest tools/test_civil_gap_data.py # data rules: sources, units, MRS match, worked examples
python3 -m http.server 8765 & # then, with playwright installed:
node tools/test_civil_gap.js # 18 browser checks: fresh and saved-library merge
Added 27-Sep-2026 from RA_Master_Pakistan_FINAL_Rev06_2026-09-27.xlsx (125 analyses). The updated workbook is
docs/RA_Master_Pakistan_FINAL_Rev07_2026-09-27.xlsx and the
full revision / validation report is docs/master-rate-analysis-rev07.md.
160 Item Library items under the workbook codes (CIV-CON-001 … MISC-SGN-001): the 125 workbook analyses
plus 35 new ones (floor-level extras from Punjab MRS, HDPE pipe, landing valve, signage, and vendor items for
gaps in both libraries — mobilization, site office, testing, FR / metal ceilings, carpet, wallpaper, GRC, EIFS,
canopy, skylight, urinal, CPVC, access control, fire stopping, escalator, irrigation, VRF, MDB). Each carries the
same description, unit, resource rows and 8% OH / 10% profit as the workbook; row quantities are the workbook's
adjusted quantities (consumption × (1 + wastage)). Sheet 18 of the workbook reconciles all 160 against the page.
One rate per shared resource: 36 workbook resources use the dashboard's own Rate Database line (CEM, SAND-,
CRSH-, STL60, BLK-, BRK-1, RMC-, L-* …). Workbook inputs moved to the dated dashboard rate for 11 of them;
the dashboard moved QE-TIMB-CFT to the workbook's Phoenix GRN (3,680/cft).
Crew productivity (workbook sheet 13) checked against Punjab MRS 2026 labour shares, MAK installation rates (÷ 1.18) and ConcretesMath Lahore piece rates; kept within ±35%, otherwise reset. 27 outputs corrected; 8 with no dated benchmark stay marked as assumptions.
Dashboard corrections: ST-200/205/210 rebar labour (36.80 → 11.08 per kg); brick generator labour now scales with wall thickness; plaster generator labour by thickness (MRS); saved libraries are migrated on their next load unless the item was edited by hand.
Rev07a assumptions (27-Sep-2026, on request): every rate that was still blank — 53 workbook inputs (gypsum
board and channels, MDF, ACP, props / mixer hire, release oil, lift, escalator, VRF, MDB, vendor items …) and 110
dashboard lines (97 MEP components of the MAK build, gypsum / drywall components, topsoil) — now carries an
assumed value whose remarks start with ASSUMPTION — no dated source and state the basis. Nothing in either file is
left unpriced; replace each with a quotation (workbook 16 RFQ col H, or the Rate Database). The full list is in the
report.
Rev07b remark dates (01-Oct-2026): every dated Rate Database line now reads <source>, DD-Mon-YYYY — <details>
with its Effective date as the only date before the dash. 62 price-list lines are dated by the list's effective
date instead of the day it was read (27-Sep-2026); GRN lines cite the receipt (Quadrangle GRN RCP-n, date — …);
MRS edition periods and other dated brackets moved behind the dash; four seed lines reworded. No rate changed.
Details in the report's Rev07b section.
Data: the <script type="application/json" id="raMasterData"> block, merged by raSyncBlk (key masRev) and
raSyncMaster. To rebuild after entering quotations in the workbook's 16 RFQ sheet:
python3 -m http.server 8765 & # repo root; needs LibreOffice Calc + playwright
tools/ra_master_build.sh RA_Master_Pakistan_FINAL_Rev06_2026-09-27.xlsx docs/
python3 -m unittest tools/test_ra_master_data.py
Added 01-Oct-2026. QS Cost Control → RFQ Tracker turns the lines that need a dated quotation into enquiries, and the quotes received into Rate Database rates with their source and date.
<Vendor> quotation <ref>, DD-Mon-YYYY — RFQ-2026-001 <title>: lowest of 3 quotes (range); <terms>; valid to … Applied <date> by <name> (CLAUDE.md form). Every change goes to the rate change log with the analyses it
re-priced; Revert puts a line back while nobody has edited it since.Records are kept in the rate library (RA.rfq, browser storage SAJ_QSCOST_v1) and travel with Backup JSON,
like the Lab Rate Analysis records. The code is the <!--zd:rfq--> block of zameen-developments/index.html.
python3 -m http.server 8765 &
node tools/test_rfq_tracker.js # 38 browser checks (QE_LIBS=… for the offline Excel check)
Added 01-Oct-2026. QS Cost Control → Price Trends, read-only, three tabs:
Last / Replaces … GRN RCP-n cross-check, against the latest receipt of
the same item. A receipt has to match the line by rate or by name; assumptions and composites that only
mention a receipt are not linked; receipts in another unit are listed as not comparable. Flags: off by more
than the tolerance (default ±10%) and newer GRN available. Ticked lines go straight to a new RFQ.The code is the <!--zd:pt--> block of zameen-developments/index.html; charts use Chart.js from the CDN
(the receipts table is shown when it cannot load).
node tools/test_price_trends.js # 29 browser checks, worked against the page's own GRN block
takeoff/)Added 01-Oct-2026 (Phase 1). Measure quantities straight off PDF drawings, in the browser — linked from the dashboard sidebar (QS Cost Control → PDF Takeoff) and the landing page.
Since 11-Oct-2026 the site's own address (https://sajjadsj44-max.github.io/ZD-Dashboard/) opens the PDF Takeoff:
the root index.html sends the browser on to takeoff/ (a location.replace, with a meta refresh and a plain link as
fallbacks), so the takeoff's projects — kept per site in the browser — are the same ones as before. The dashboards
list moved to dashboards/; every dashboard keeps its own address. tools/test_root.js checks the landing, that
takeoff/ does not loop, and that every dashboard link still opens.
Big PDFs and speed (28-Oct-2026): a PDF over 32 MB is opened as the file it is. pdf.js reads it a piece at a time
(its cross-reference, then only the pages drawn), first from the file added, then from the browser's copy, so opening and drawing
never hold the file whole (only its fingerprint is worked out on the file read once, at once up to 1 GB). On a 1 GB, 17-page set: added in about 25 s, a 64 MB scan page drawn in about 3 s, reopened
in seconds. pdf-lib only gets PDFs up to 320 MB; a bigger one's pages go into exports and plots as pictures. If the
browser has no room left for a copy, the PDF still opens for that visit; add it again later to re-attach it. Pages,
zooms and projects seen a moment ago show again at once, and whole-page pictures and thumbnails are kept in the
browser for the next visit. Tests: tools/test_takeoff_bigpdf.js (the 1 GB PDF is written by
tools/takeoff_bigpdf_fixture.js) and tools/test_takeoff_speed.js.
AutoCAD helper, started by itself (28-Oct-2026): a DWG is opened by the AutoCAD on this computer through
tools/cad-bridge.js (whole — the browser's own DWG reader loses most of some big drawings). Set it up once per
computer: double-click tools\cad-bridge-setup.cmd (needs AutoCAD and Node.js; no administrator rights). It copies the
helper to %LOCALAPPDATA%\ZD\cad-bridge, starts it with Windows, registers the zd-cad: link, and starts it now. If the
helper is not running when a DWG is added, the takeoff asks to start it and opens zd-cad:start (the browser asks once
whether the site may open it — tick Always allow); "Read in the browser" skips it until the page is opened again.
Run the setup again after cad-bridge.js changes; cad-bridge-setup.cmd -Remove takes it all away. Its log:
%LOCALAPPDATA%\ZD\cad-bridge\cad-bridge.log. Tests: tools/test_cad_bridge.js.
Command line (status bar, 11-Oct-2026): type an AutoCAD alias or a command's name and Enter — l, rec, ci,
pol 8, tr, ex, f 0.5, cha 0.5 0.75, o 0.375, ro 37, sc 1.5, qs, inv… Enter on an empty line repeats
the last command, ↑ / ↓ walk the history, : on the drawing puts the cursor there. It uses the same commands as the
Ctrl+K palette. Polygon (pol): a regular n-sided outline (centre, then a corner), kept as an ordinary area or
closed run so every edit and the sheet work on it. (), (by condition,
kind of measurement, markup type, check state; new / add / within) and — right-click the page.
Tests: . The audit behind these: .
QS controls (added 01-Oct-2026):
PD (perimeter less the door openings on the outline) and D
(door widths). Doors are openings whose schedule type is door, labelled D…, or 6 ft or taller, within 1.25 ft
of the room outline (either wall face); a typed value on the measurement overrides.Bluebeam / PlanSwift editing (added 02-Oct-2026 — compared against Bluebeam Revu 21 / Bluebeam Max and PlanSwift 11
v11.0.0.191 with Takeoff Boost; the full table is docs/takeoff-bluebeam-planswift-parity.md):
tools/test_takeoff_smart.js):
12'-6"
that has a dimension line (line along the text, a tick / arrow / extension line each side) gives pt per ft; three or more that
agree within 2 % (and at least half of those read) set the scale. It is marked not verified until one dimension is measured.REV tag) until they are ✓ checked. Nothing is re-measured.takeoff/ is an installable PWA (manifest + service worker): the app files are fetched fresh when online
(so the ?v= release rule holds) and kept for work with no signal; the pinned CDN libraries are cached after first use.
Projects and PDFs were already in the browser's IndexedDB. The dashboard password is still asked every time.Shift+O); Shift / Ctrl+click add or take out; Tab steps through objects lying on
top of each other; hover highlights the object and shows its quantity; a multiple selection shows its totals.Shift straight;
Alt+drag moves without selecting first); ; arrow keys nudge. / /
work on a whole selection (measurements and markups), on any page, pasted at the if the page's
scale differs; (typical floors); duplicates; (ft across / down, PlanSwift style); ; ;
rotate 90° / flip; bring to front / send to back; (: not moved, edited or deleted).QA pass (02-Oct-2026 — full audit, bug hunt and regression test; the report with the bug register,
calculation table and live-retest checklist is docs/takeoff-qa-report-2026-10-02.md):
F), fit width (Shift+F), dim the drawing, line weights on / off, PDF layers, hide
markups, labels; Home / End go to the first / last page. The header wraps on narrow screens instead of
pushing buttons off the edge.12'-0" x 14'-0") are measured
across the room and a scale note that disagrees is flagged with the scale they suggest.Free agents (03-Oct-2026 — in the Claude panel; no API key, no cost, nothing leaves the browser; they read the PDF's own lines and text, so vector drawings — a scanned sheet has neither):
Accuracy engine and QS commands (20-Oct-2026 — audit, fixes and tests; the full report with root causes, before / after
figures and limits is docs/takeoff-accuracy-engine-2026-10-20.md):
qs_command
tool for Claude / local AI); the measurement engine measures (Auto area, the walls agent, the tag scan, the sheet's rowsOf
and takeoff/measure.js — pure geometry and QS formulas, unit-tested in Node); the review says how far to trust it. A
quantity is never taken from a language model.Markup tools — Bluebeam Revu Basics (added 07-Oct-2026, ✎ Markup ▾ on the toolbar):
T) and callout (Q, leader with an arrow to the point): typed text, wrapped to the box, the
box growing to fit; font size in points on the sheet, so it prints at that size; font, bold, alignment, fill.Shift+L), polyline (Y), polygon (G), rectangle (Shift+R), ellipse (Shift+E): line
style (solid, dashed, dotted, dash-dot), arrow ends (arrow, open, dot, square, slash), fill and opacity, and
hatch patterns (diagonal, cross-hatch, grid, dots, brick, concrete, earth, insulation, or a custom angle /
spacing / crossed). Shift keeps lines straight and boxes square; polylines take typed lengths like runs.P) and highlighter pen (Shift+H): freehand, smoothed and simplified as it is drawn.X): Bluebeam's sixteen standard stamps (APPROVED, REVIEWED, REVISE AND RESUBMIT, REJECTED, FOR
CONSTRUCTION, AS BUILT, VOID…), your own text stamps, and picture stamps (a signature, a seal, a logo); a second
line filled when it is placed — {name} · {date} {time}, also {project} {sheet} {page}.I), hyperlink (to a web address or another page of the project — double-click to follow; a real
link in exported PDFs), file attachment (a pin that opens or saves the file; the file goes inside exported PDFs).Alt+L, ☰ List): every markup of the page or the whole project in a table under the drawing —
sort by any column, search, filter by type, status, author, layer or space, and save a filter with the project; set
statuses in the list (Bluebeam's, plus your own), reply to a markup (signed with your name); click a row to go to it.
(Layers tab) hide a whole set on the drawing and in exports. : the room each markup sits
in, from the named areas measured. Summaries of what is listed: CSV, XML, and a printable PDF with a picture of each.Phase 2 / 3 status: click-inside room areas, walls by thickness, symbol / tag counting, room sizes and door / window marks read from the drawing, the revision overlay and scanned-PDF measuring are in. Still planned: a command bar, typical-floor multipliers, sending quantities to the Project BOQ, OCR of scanned sheets, and page reorder / rotate inside a PDF.
takeoff/index.html (layout) and takeoff/takeoff.js (the app) load pdf.js 4.10.38 and ExcelJS from the jsDelivr
CDN. Tests use a hand-written 3-page vector PDF with known dimensions (tools/takeoff_fixture.js):
python3 -m http.server 8765 &
TK_LIBS=/path/with/pdfjs-dist+exceljs node tools/test_takeoff.js # 150 browser checks
TK_LIBS=/path/with/pdfjs-dist+exceljs+pdf-lib node tools/test_takeoff_qa.js # full QA audit: 460 checks in 24 sections
TK_LIBS=/path/with/pdfjs-dist+pdf-lib node tools/test_takeoff_markup.js # markup tools and the Markups list: 80 checks
node tools/test_lock.js # the dashboard password lock: 61 checks
The QA audit (tools/test_takeoff_qa.js, fixtures in tools/takeoff_qa_fixture.js) builds an 8-page drawing set
(a house at 1/4" = 1'-0" with known room areas, a rotated page, an offset page box, a blank page, a 1:50 metric
sheet, a sheet with a detail at another scale, angled / round / hatched rooms, an A4 page with no note), a 120-page
PDF, a 200 dpi scanned sheet and a 150,000-line CAD sheet, and checks every quantity against the hand-worked
figure. TK_REPORT=file.json writes every check, calculation and timing to a file.
Sidebar → Calculator (after Admin) is a QS / civil / structural / MEP calculator module, added 25-Sep-2026. Every calculation shows Input → Formula → Working (substituted values) → Result → Unit, multi-unit results (kg / ton / lb, kg/m / kg/ft, SFT / m², CFT / m³, litres / gallons) and a source panel naming the standard, whether the value is a published table value or calculated, and the density used (Standard density or User-defined density — never changed silently).
Nos × L × W × H strings and openings as separate negative rows.Data rules. Nothing standardised is typed into the UI code. Section and pipe tables
come from tools/calc_data.py, which reads published machine-readable sources
(eurocodepy, AISC Shapes Database v16 via steelpy, Osdag's IS 808 database, fluids'
ASME tables, structuralcodes EN dimensions) and writes the
<script type="application/json" id="calcData"> block. Where only dimensions are
published (UPN, UPE, IPN, HD, HP, EN angles) the mass is computed from the exact profile
(fillets, toe radii, taper) at 7850 kg/m³ and labelled calculated — checked against
catalogue values (UPN 100 13.47 vs 13.5 cm², IPN 300 69.00 vs 69.0 cm²). Values that
could not be verified are not invented: plastic pipe densities, paint coverage, grout
density, membrane consumption, putty / primer / paint coverage per coat, binding-wire
length per tie, soil / aggregate density and overall cable weight must be entered from the product
data sheet, and the calculator refuses to calculate until they are. QS conventions (dry-
volume factors 1.54 / 1.27, joint thickness, wastage) are editable and badged
convention. To rebuild the data:
pip install eurocodepy steelpy structuralcodes fluids shapely numpy
git clone --depth 1 https://github.com/osdag-admin/Osdag.git /tmp/osdag
tools/calc_data.py --osdag /tmp/osdag zameen-developments/index.html
Sidebar → Productivity (after Calculator), or the start screen's Productivity card
(?app=prod, password as the dashboard), added 20-Oct-2026. It answers "how many men, how
many days, how much material" for a QS / estimator:
Estimates, own outputs and own day-rates live in the viewer's browser only.
Data rules. No norm or coverage figure is typed into the UI code. tools/productivity_data.py
builds the <script type="application/json" id="prodData"> block from the RA Master Rev07
workbook, tools/productivity_refs.json (IS 7272 / CPWD constants and coverage rows, each with
the figure as printed, clause / page, date, link and a quote) and the page's own MRS register and
Rate Database blocks. Metric constants are converted with the exact foot; a constant (days of
each trade per unit) becomes a crew with the first skilled trade the source prints as 1.
pip install openpyxl
tools/productivity_data.py zameen-developments/index.html
python -m unittest tools/test_productivity_data.py
node tools/test_productivity.js # browser tests (python -m http.server 8765 from the repo root)
Pages Source is set to GitHub Actions, so
.github/workflows/deploy-pages.yml does the publishing on every push to main:
deploy packages the repo and deploys it to Pages.mirror force-pushes main onto a gh-pages branch, so switching
Source to Deploy from a branch (main or gh-pages, / (root)) would
also serve the current site without editing the workflow.Note for future changes: do not add actions/configure-pages with
enablement: true. The workflow GITHUB_TOKEN cannot create a Pages site
(Resource not accessible by integration) and it is not needed — the site
already exists.
The published file is a hardened build, not the authoring copy. Regenerate it rather than committing a new export directly:
npm install terser clean-css-cli # once
tools/harden.py NEW_VERSION.html zameen-developments/index.html
tools/harden.py states authorship in the markup, metadata, sidebar and at
runtime, then minifies the stylesheet and scripts. Pass --no-minify to inject
the ownership markers while keeping sources readable.
A published single-file dashboard can always be saved by anyone who can view it; that is how the web works and no setting changes it. The build exists to make an unattributed copy awkward to produce and easy to disprove, not to prevent copying.
The authoring copy is kept outside this repo (see .gitignore) so a clean,
readable version is not published beside the hardened one.
Create <dashboard-name>/index.html, then add a card for it in the root
index.html. Keep the filename index.html so the short folder URL works.
Each dashboard is one self-contained HTML file. External libraries (Chart.js, PapaParse) load from the jsDelivr CDN at runtime, so viewers need an internet connection.
index.html the site address: opens the PDF Takeoff (takeoff/), query and hash kept
dashboards/index.html landing page listing all dashboards
zameen-developments/index.html Zameen Developments dashboard
drawing-tracker/index.html Drawing Tracker dashboard
takeoff/index.html, takeoff.js PDF Takeoff (pdf.js viewer, scale, snapping, measurement sheet)
tools/grn_register.py merge GRN receiving exports into the GRN Price Register
tools/po_register.js merge Sage POPOR01 purchase order PDFs into the GRN Price Register (raPoData)
tools/mrs_register.py load a Punjab MRS PDF into the Punjab MRS Rates register
tools/test_mrs_register.py tests for the MRS loader
tools/mep_rates.py build the MEP rate analyses from the MAK final bill + GRN register
tools/test_mep_rates.py tests for the MEP rate analyses
tools/lab_mix_data.py lab concrete mix designs for the Lab Rate Analysis tab
tools/test_lab_mix_data.py tests for the lab mix-design transcription
tools/kpk_mrs.py load the KPK MRS PDF into the KPK MRS Rates tab
tools/rate_watch.py daily check for new KPK / Punjab (Lahore) rate schedules
tools/qs_engine_data.py build the QS Rate Analysis Engine data block (categories, rate lines, corrections)
tools/test_qs_engine_data.py tests for the engine data block
tools/test_qs_engine.js browser tests for the engine (playwright)
docs/qs-rate-engine-brief.md revised brief for the QS Rate Analysis Engine
tools/civil_gap_data.py build the civil gap-analysis data block (CV items, rate lines, seed repairs)
tools/test_civil_gap_data.py tests for the civil gap data block
tools/test_civil_gap.js browser tests for the civil gap merge (playwright)
docs/civil-gap-rate-review.md review of the missing-items rate list, with every rate side by side
tools/ra_master_config.py decisions for the Master Rate Analysis Rev07 (shared lines, rates, productivity, new items)
tools/ra_master_excel.py update the Master Rate Analysis workbook (Rev06 -> Rev07) and add sheets 17-19
tools/ra_master_data.py build the dashboard block #raMasterData from the Rev07 workbook
tools/ra_master_build.sh run the whole Rev07 build (workbook, recalculation, block, reconciliation, tests)
tools/test_ra_master_data.py tests for the block and the workbook
tools/test_ra_master.js browser tests for the Master Rate Analysis merge (playwright)
docs/master-rate-analysis-rev07.md revision and validation report of the Master Rate Analysis Rev07
docs/RA_Master_Pakistan_FINAL_Rev07_2026-09-27.xlsx the Rev07 workbook
tools/test_rfq_tracker.js browser tests for the RFQ Tracker (playwright)
tools/test_price_trends.js browser tests for Price Trends & Staleness (playwright)
docs/takeoff-bluebeam-planswift-parity.md PDF Takeoff vs Bluebeam Revu 21 / Max and PlanSwift 11 (Takeoff Boost), feature by feature
tools/takeoff_fixture.js hand-written 3-page vector test PDF for the takeoff tests
tools/takeoff_qa_fixture.js QA drawing set: 8-page house / odd-page PDF, 120-page PDF, scanned sheet, 150,000-line sheet
tools/test_takeoff_qa.js full QA audit of the PDF Takeoff (sections 1-23, playwright)
docs/takeoff-qa-report-2026-10-02.md QA audit report: bug register, calculation checks, performance, retest checklist
tools/test_takeoff.js browser tests for the PDF Takeoff (playwright)
takeoff/measure.js the takeoff's measurement engine: geometry and QS formulas (no DOM)
tools/test_takeoff_measure.js unit tests of the measurement engine (plain Node)
tools/takeoff_apartment_fixture.js apartment plan with known quantities on three pages / scales
tools/test_takeoff_accuracy.js accuracy and reconciliation of the takeoff against it (playwright)
tools/test_takeoff_agentcmds.js the agent's QS commands on it, done or refused (playwright)
docs/takeoff-accuracy-engine-2026-10-20.md accuracy audit: root causes, fixes, before / after figures, limits
tools/calc_data.py build the Calculator tab's section / pipe / material data block
tools/productivity_data.py build the Productivity tab's norms / coverage / day-rate data block
tools/productivity_refs.json IS 7272, CPWD DAR and data-sheet rows behind it (as printed, with quotes)
tools/test_productivity_data.py tests for the block
tools/test_productivity.js browser tests for the Productivity tab (playwright)
.github/workflows/rate-watch.yml runs the rate watch daily and offers updates as a pull request
.github/workflows/deploy-pages.yml deploy to Pages + mirror main onto gh-pages
.nojekyll serve files as-is (no Jekyll processing)
Ctrl+Itools/test_takeoff_cmdline.jsdocs/takeoff-cad-audit-2026-10-11.mdFree local AI (11-Oct-2026): the takeoff agent can run on Ollama on your own computer — free, offline once
the model is downloaded — with the same real tools as Claude (trace rooms, measure, count tags, walls, totals, explain a
quantity, undo). Agent panel → ⚙ Engine: choose Auto / Local AI only / Claude / Built-in rule agent, the Ollama
address and model, Test connection and Benchmark installed models (right tool, valid arguments, reply time,
tokens/s — measured on your PC). One-time setup: install Ollama, set OLLAMA_ORIGINS=https://sajjadsj44-max.github.io,
restart it, ollama pull a tool-capable model; allow Chrome's local-network prompt. If the local model cannot be
reached the built-in rule agent answers — never a cloud service. Every tool call is checked against its schema;
quantities in replies come from the measurement sheet. Chat history is kept per project, text only.
Agent instructions (Rules in the agent panel): working rules taught in the chat (“remember: exclude shafts from net flooring”) or typed — this request only / this session / this project / every project — with on / off, edit, delete and a conflict warning. They go with every message to the local AI and Claude; “show me the boundary before accepting” also switches on Auto area's preview.
Auto area record and preview: every Auto-area outline keeps how it was found (drawing image / vector lines, door
gap), its original outline, area and time; Properties show “as detected” or “edited (+x Sft)”, Show detected and
Restore detected; leaks, short traces and non-square outlines count as needs review. Auto area settings ⚙ →
“Show the outline before adding it”: Accept (Enter) / Tighter gap / Wider gap / Cancel (Esc).
Tests: tools/test_takeoff_localai.js (with the stand-in tools/mock_ollama.js). Report:
docs/takeoff-autoarea-agent-localai-2026-10-11.md.
Agent runs Auto area (auto_area_page): scale checked first, every named room traced, shafts / ducts / voids left
out (and deducted when inside a room), checked against written sizes and existing areas, previewed dashed until you
accept (accept_preview / discard_preview); validate_takeoff; subtotals by floor / room / page.
Project knowledge (agent panel → Knowledge): offline keyword search over the help, the PDFs' text, rules, measurements and documents you add (specs, schedules — .txt / .md / .csv / PDF), cited by file + page, measurement id or document. KPIs (agent panel): Auto-area accuracy from the recorded drawing suite, your own Auto-area and agent use, local-AI status — from recorded results only (local log, export / clear).
Drawing test suite: node tools/takeoff_drawings.js out.pdf writes 38 test pages (36 drawing conditions) with known
reference outlines; tools/test_takeoff_drawings.js [--write] runs Auto area on each (area error, IoU, flagged, time)
and saves takeoff/kpi/drawing-tests.json for the KPI dashboard. Agent workflow: tools/test_takeoff_agentflow.js.
Private by design: a PDF opens in the viewer's browser and is stored with the takeoff in that browser's IndexedDB — nothing is uploaded and nothing is committed here. Projects move between computers as Export → Project (.json); the PDF is re-attached by adding it again (matched by file name and size).
Scale: read from the drawing's scale note — 1/8" = 1'-0", 3/16"=1'-0", 1" = 20', 1:100 — including
@ A1-style paper sizes when the PDF page is printed smaller or larger than the drawing (the A3 copy of an
A1 sheet is corrected by 1190.55 / 2383.94). A scale from a note shows as not verified until a known
dimension is measured against it (scale chip → Verify, ±1%); Calibrate (K) sets it from two points and a
length typed in feet or ft-in. Pages with no note must be calibrated; measurements on such pages stay out of
the totals until they are.
Snapping to the drawing's own vector lines — endpoints, intersections, midpoints, nearest point on a line
(curves flattened) — plus points already measured. Vector PDFs exported from CAD snap; scanned PDFs can be
measured but have no lines to snap to. Shift keeps a run at 0° / 90°.
Conditions (what is measured) with presets per the house standards: floor area (Sft), RCC slab (cft, T), ceiling plaster, formwork soffit (5.00 Sft threshold), 9" and 13.5" brick walls (cft, H, T), 4.5" partition (Sft, thickness stated), internal plaster both faces / external plaster (Sft, H), skirting (ft), doors and windows (Nos). Heights and thicknesses are never assumed: a wall in Sft or cft cannot be created without H, a cft quantity without T.
Tools: draw (A — polygon / run / count per the condition), rectangle (R), deduction (D — void in an
area, length in a run), opening (O — door / window width measured on the plan, height typed), measure
(M, not saved), select and drag points (V), undo / redo, Nos multiplier per measurement.
Measurement sheet in the house format: every row Nos × L × W × H in decimal feet (3 dp), Sft / cft
/ ft (3 dp), Nos (whole); a quantity is the product of the dimensions as printed, so the sheet re-measures from its
own figures. Rectangles are one row L × W; any other outline is one row with its plan area by coordinates;
a run lists its legs (12.000 + 14.000 + …). Deductions are their
own negative rows; openings / voids at or under the condition's threshold (masonry and plaster 1.00 Sft,
formwork 5.00 Sft, concrete 0.50 cft) are listed but not deducted, saying why. Internal plaster carries both
faces in Nos.
Exports: Excel in the house colours (blue measured inputs, unlocked; green formulas =PRODUCT(D:G),
=-PRODUCT(…) for deductions, a run's length as =12.000+14.000+…; grey SUM totals; sheet protected) with
Summary, Scale & audit (how each page's scale was set and checked) and Assumptions (unverified scales,
heights / thicknesses and opening heights to confirm); CSV; the marked-up page as PNG; the project as JSON.
SAJ_QSCOST_v1ZD Rate Analysis <code>, DD-Mon-YYYY — built-up rate …Ctrl+CCtrl+XCtrl+VCtrl+Shift+V pastes in placeCtrl+DCtrl + arrow copies at a
distance or as an arrayCtrl+Shift+LCtrl+Z / Backspace take back the last click (an arc as one step) and Ctrl+Y puts it
back; Ctrl+Z or Esc during a drag cancels it; the undo / redo buttons name the change ("Undo: Move 3 objects"),
200 steps.A while drawing makes the next segment an arc (a point on it, then its end — one leg on the sheet);
type a length and Enter to place the next point at that distance (12'-6", 12.5; a rectangle takes 12 x 14);
Ctrl+click places a point with no snap.Shift+click, as in
Bluebeam); drag the + at the middle of a side to pull out a new point; a selected point goes with Delete.B) cuts a run in two where clicked, Shift+click with Break deletes one segment; Cut a gap
removes the part between two clicks (a door across a skirting); Join makes selected runs one; Continue drawing
carries a run on from its nearer end; Explode gives one run per segment; Close the run; Offset a run sideways
or an outline in / out (defaults to half the condition's thickness); an area's outline becomes a perimeter run
in a length condition, a run of 3+ points an area.F2), cut-out / opening, move to condition, select all of the condition, condition (edit,
colour, hide, show only), QA (checked / recheck), zoom to and delete. Selected objects also offer Set as default
and Add to Tool Chest. A right-drag still pans; on a tablet, press and hold. ? lists every shortcut; Z is a zoom window.D1, D-1, D.01, DR-02, DOOR 3, SD / FD / FRD / MD / GD / AD /
DD / RS, W1, WN-2, WIN 3, WINDOW 4, KW / TW / BW / CW / SW / FW / AW / SKY, V1, VT, VENT 1,
LV, DW, primed W1', suffixed W1A (D-01 and D1 are one mark) — including tags written in two pieces (a letter
over a number in a circle). Marks inside the door / window schedule table are not counted; the table's sizes (ft-in,
inches, decimal ft, or mm converted to ft) and quantities are read, a schedule quantity that differs from the count
is flagged, and the sizes can go straight into the opening schedule. On this page, every page of the PDF or the whole
project; you tick what to count (one condition per mark, or per type); markers are flagged AI until checked.
count door swings counts doors from their swing symbols (arcs of 1.2–6 ft; double doors once) on drawings with no
tags.Ctrl+S saves now; closing or hiding the tab saves at once; a second tab with the same project shows
a warning with Reload this one. A damaged project file is repaired on import (bad points, colours, conditions)
and the repairs are listed as Repaired rows in the import validation.#,##0.000), Nos whole; undo keeps 200 steps (fewer on very
large projects, never under 20).3/4" = 1'-6" is read as
0.5"/ft (was 0.75); a bare 1:12 (a ramp's slope) is no longer taken for a scale; a Bluebeam import keeps a verified scale.tools/test_takeoff_measure.js (62, plain Node), tools/test_takeoff_accuracy.js (181 — the apartment
tools/takeoff_apartment_fixture.js on three pages at 1/4" = 1'-0", 1:100 and 1/8" = 1'-0" turned 90°: every room's area,
perimeter and corners, walls, tags, zoom, sheet = drawing, save / reload, export / import, rooms turned 3°–30°, scale notes,
viewports, review status), tools/test_takeoff_agentcmds.js (36 — the fourteen commands above, done or refused, on the apartment, one of them over all three pages).gauges part of the
calcData block (built by tools/calc_data.py): MSG and GSG from the published charts,
stainless from the weight schedule of 15 U.S.C. §206 (oz ÷ 640 in), SWG, BWG and B&S from
the fluids package.10 cft to m3, 5 marla in sft (both conventions),
100 cft rcc to kg, 500 kg cement in cft. It knows site terms (sariya, eent, chunai,
bajri, ret, khudai, bharai, rang, taar, masala …) and tolerates typos.20mm rebar,
#5, ISMB 300, MS pipe 4 inch, 10mm plate, 25x25 angle, RHS 100x50x5,
W12x26, brickwork, paint, cable. Favourites (★), recent calculations (reopen /
copy / delete / clear), copy, print / PDF, CSV and Excel export. Favourites, history,
last inputs, density overrides and custom calculators live in the viewer's browser only.