A code compliance checklist instrument. Tests a building design against ASHRAE Standard 90.1 prescriptive provisions and produces a stamped checklist deliverable certifying conformance.
ASSAY is Field Instrument 048 of the Green Shoe Garage series. It is the natural downstream consumer of WATTMETER (FI-045): import a WATTMETER project JSON and the lighting, envelope, building, and climate data pre-populate the checklist, ready for review.
The name traces to the historical assay office, where silver and gold were tested for purity and stamped with a hallmark certifying conformance to the standard. ASSAY does the same for buildings: provision by provision, compare the design against the code threshold, and stamp the deliverable when every test passes.
ASSAY presents the ASHRAE 90.1 prescriptive compliance provisions as a structured checklist organized by chapter. Each provision shows the section reference (e.g., 9.5.1 Table 9.5.1), a plain-English paraphrase of the requirement, the code threshold for the project's climate zone and building type, the project's actual value where data is available, and an auto-evaluation hint when both threshold and project value are present. The reviewer accepts the auto-evaluation or sets the status manually: Comply, Does Not Comply, Not Applicable, or Pending.
The dashboard summarizes compliance across the full provision set. When every provision in scope is marked Comply, ASSAY stamps the review with a hallmark indicator. The deliverable prints to a clean reviewer's checklist suitable for inclusion in a code submittal package.
As of v0.4.0, every provision can carry evidence photos. Each provision card includes an "Add Photo" button that opens the device file picker with the camera-capture hint enabled, so on a phone the native camera launches directly; on a desktop the standard file picker opens for selection of existing images. Multi-select is supported. Captured photos store as Blob records in IndexedDB rather than localStorage, because typical evidence photos run 2-5 MB each and localStorage caps at roughly 5-10 MB across browsers; IndexedDB allows essentially unlimited capacity on most browsers with persistent storage.
Photo thumbnails generate client-side via canvas at 240 px maximum dimension and 78 percent JPEG quality, sufficient for inline preview without re-decoding the full blob. Tap any thumbnail to open the lightbox modal, which shows the full-size image with caption editing (auto-saved as you type), file metadata, a download button that saves the original to disk preserving filename and EXIF, and a remove button with confirmation. Removing a provision photo deletes it from IndexedDB.
The textarea export continues to show structured-only JSON without photos so quick copy/paste handoffs remain fast and human-readable. When photos exist anywhere in the review, a "Download full bundle" button appears in the export modal; clicking it serializes every referenced photo as base64 inside the JSON under a _photos key and downloads the whole package as a .assay.json file. Import auto-detects the _photos array, decodes each entry back to a Blob, writes it to IndexedDB under its original ID, and restores the references.
Storage diagnostics in the IO modal show current IndexedDB usage and quota for the ASSAY origin. Photo EXIF metadata (including GPS coordinates from the capture device) is preserved as-is for evidentiary purposes; if you share a bundle externally, location and timestamp data is embedded in the JPEGs.
When the Compliance Report deliverable is generated, photo thumbnails embed inline within each provision's row in the findings table at print-friendly size (110 pt squares with caption underneath). This turns the report from a checklist into evidence-backed documentation suitable for code reviewer handoff. Photos appear in the print version at 1.5 inch square with no chrome around them, suitable for inclusion in a binder or filing cabinet.
The Compliance Report button in the top bar generates a self-contained HTML report in a new tab, structured as a code review submittal package suitable for inclusion in a permit application or design-team handoff. The report opens with its own sticky toolbar containing Print / Save as PDF and Close actions; print mode produces a clean letter-size document.
Report structure follows the convention familiar to code reviewers and authorities having jurisdiction:
- Cover page with project name, address, building type, area, climate zone, code edition, reviewer, and review date. If every reviewed provision is marked Comply, a hallmark stamp appears.
- Table of contents
- Executive summary with a six-tile dashboard (compliance rate, complying count, non-complying count, N/A, pending, total reviewed)
- Project description with full header data as a key-value table
- Compliance findings by section, organized by ASHRAE 90.1 chapter, with each provision presented as a row showing section reference, title, summary, code limit, project value, and status. Non-complying rows are tinted; reviewer notes are included inline where present.
- Non-compliance summary box (only included if there are non-complying items) listing each failure with its section reference and the gap between code limit and project value.
- Methodology and disclaimer appendix referencing the specific tables used for envelope, lighting, HVAC, SHW, and motor efficiency thresholds, with the explicit statement that the report is screening-level engineering and requires PE review for binding work.
The report's CSS is embedded and independent of ASSAY's working theme; it uses serif body type with sans-serif headers and brass-toned dividers for a clean, professional document appearance regardless of which working theme is selected in the app.
ASSAY ships with four themes as of v0.3.0. The Theme button in the top bar opens the picker.
- Hallmark (default): deep teal frame with brass bezels and verdigris green for compliance. The signature ASSAY palette evoking the historical assay office aesthetic.
- Parchment: light mode with aged paper background, sepia ink, and brown leather accents. Easier on the eye in bright daylight; useful for field review on a tablet in a sunlit conference room.
- Slate: cool dark grey with steel-blue accent and brass bezels. Modern engineering review aesthetic.
- Sealing Wax: dark burgundy with antique gold and a brighter signal red. Formal seal-and-stamp aesthetic for high-stakes review work.
Selection persists across sessions under a separate localStorage key from the project state. Switching themes does not modify project data. Themes affect only the working interface; the compliance report deliverable uses its own fixed paper-document aesthetic regardless of selection.
The current version covers twenty-eight provisions across five ASHRAE 90.1 chapters:
Envelope (Section 5, seven provisions): opaque wall U-factor, roof U-factor, floor U-factor, vertical fenestration U-factor, fenestration SHGC, window-to-wall ratio, air barrier and continuous insulation.
HVAC (Section 6, nine provisions): cooling equipment minimum efficiency (SEER / EER / IEER by capacity class), heating equipment minimum efficiency (AFUE / Et / Ec / HSPF by equipment type), air-side economizer requirement (climate-zone-driven), demand controlled ventilation, energy recovery ventilation, off-hour and setback controls, hydronic system variable flow with VSD pumps, supply duct insulation minimum R-value, HVAC piping insulation.
Service Water Heating (Section 7, four provisions): water heater minimum efficiency by fuel type (electric, gas small, gas large commercial, heat pump), service water pipe insulation, recirculation system controls, heat traps on storage water heaters.
Power (Section 8 and Section 10, three provisions): feeder and branch circuit voltage drop limits, electrical sub-metering (with automatic N/A for buildings under 25,000 sf), motor efficiency referencing NEMA Premium (NEMA MG 1 Table 12-12, federal DOE 10 CFR 431).
Lighting (Section 9, five provisions): automatic shut-off, occupancy sensors in required spaces, daylight responsive controls, interior LPD by whole-building method, exterior lighting controls.
The provision text is original paraphrase. No verbatim text from any published edition of ASHRAE 90.1 or IECC is reproduced. Section pointers direct the reviewer to the published standard for the binding wording, exceptions, and details.
The auto-evaluation engine handles all fifteen ASHRAE Standard 169 climate zones (1A through 8) and thirteen building types. Envelope U-factor and SHGC thresholds reference representative values from ASHRAE 90.1-2019 Tables 5.5-1 through 5.5-8 (and 2022 tightened equivalents); LPD thresholds reference 90.1-2019 Table 9.5.1 whole-building method (and tightened 2022 values). HVAC equipment thresholds reference Table 6.8.1 representative values for the common capacity classes. SHW thresholds reference Table 7.8 representative values. Motor efficiency thresholds reference NEMA Premium for TEFC 4-pole representative values. All values are illustrative; specific construction classes, capacity sub-ranges, motor pole and enclosure variations, and the space-by-space LPD method are deferred to later phases.
The edition selector in the project header switches between ASHRAE 90.1-2010, 2013, 2016, 2019, 2022 and IECC 2018, 2021, 2024 (Commercial Energy Code). For 90.1-2019 and 90.1-2022, ASSAY has primary threshold tables for envelope U-factors and lighting power density. For other editions (older 90.1 and all IECC), the engine uses the 2019 baseline values as a working approximation and annotates the displayed threshold with a note directing the reviewer to consult the published edition for binding values. This convention is the same one used by WATTMETER's CODEX module: provide a working number, surface the uncertainty, never claim authority the tool doesn't have.
HVAC and SHW equipment efficiency tables in ASSAY are 90.1-2019 values throughout. Most equipment minimums change slowly across editions because federal DOE conservation standards set a floor that all editions must meet or exceed. The reviewer should still consult the specific edition for exact values.
Each provision card carries an inline input panel for the project value(s) the auto-evaluation engine needs. Number fields accept U-factors, watts, area, efficiency percent, voltage drop percent, and similar metrics. Select fields handle equipment type classification (heating equipment kind, water heater type). Tri-state selects (yes / no / unset) handle binary provisions (economizer provided, DCV provided, photocontrol provided). The fields persist into state.measuredValues and feed both the threshold display and the auto-evaluation function.
For reviewers without a WATTMETER project to import, this means ASSAY is fully usable as a standalone tool: open it, set the project header (especially climate zone and building type, which drive most thresholds), then walk through each provision entering project values and accepting or overriding the auto-evaluation hint.
Number fields update state live but defer the full re-render until the field loses focus, so the input keeps focus while typing. The dashboard updates live as values change.
ASSAY accepts three import formats via the Import button:
WATTMETER project JSON (wattmeter/project@1 schema): the primary path. Pre-populates:
- Header (project name, address joined from components, building type, area, climate zone, year built, auditor name and organization)
- Envelope from CHAMBER assemblies: wall U, roof U, floor U, window U, window SHGC
- Lighting watts from BALLAST fixtures: sum of qty x proposedWatts across all fixtures, with the project area as the LPD denominator
- Heating equipment from COMBUSTION: the largest unit by input kBtu/h sets the representative heating efficiency and equipment type (boiler-small, boiler-medium, boiler-large, or furnace based on equipment type string and capacity)
- Motor data from ARMATURE: the largest motor by hp sets the representative motor efficiency and horsepower
After WATTMETER import, roughly twelve to fifteen of the twenty-eight provisions auto-evaluate immediately; the rest are reviewer-set via the inline input fields on each provision card.
BuildingSync XML (v2.x): header-only import. Reads project name, address, OccupancyClassification (mapped to ASSAY building type), gross floor area, year of construction, ASHRAE climate zone, and auditor contact. Envelope and lighting measured values are not pulled because the BuildingSync export from WATTMETER carries those under Measures (retrofit proposals) rather than current-state characteristics. Reviewer must enter values manually after this import.
ASSAY review JSON (assay/project@1 schema): a previously saved ASSAY review. Restores complete state including provision statuses and notes.
Paste any of the three formats into the import textarea, or upload a file. Format is auto-detected by leading character (< for XML, { for JSON) and by schema field for JSON.
ASSAY saves the current review to browser localStorage under assay/project@1. State persists across page reloads automatically. The Export button generates the JSON for offline backup or sharing. The New Review button clears the current state after confirmation.
Photo attachments are deferred to v0.2.0 or later; the Phase 1 deliverable is text-only.
Deep teal frame with brass bezels and verdigris green highlights for compliance indication. Family-resemblance to WATTMETER via the brass dial and panel-instrument layout patterns, distinct primary hue (teal instead of WATTMETER's navy). Sealing-wax red marks non-compliance. The hallmark stamp visual on full compliance evokes the historical assay office certifying stamp.
Dark mode is the default. Print mode flips to white background with black ink and reformats provisions for letter-size paper with no chrome.
This is screening-level engineering software. It is suitable for prescriptive compliance review of new construction and major retrofit projects under ASHRAE 90.1, helping the reviewer identify provisions where the project meets or fails the prescriptive limits. It is not appropriate for compliance certification submissions without a registered Professional Engineer or licensed practitioner reviewing the work product per the authority having jurisdiction.
Specific limitations:
- Provision coverage in v0.2.0 is twenty-eight of approximately one hundred prescriptive provisions in ASHRAE 90.1. Coverage extends across all five major chapters (Envelope, HVAC, Service Water Heating, Power, Lighting), but each chapter includes only the most commonly cited provisions. Within HVAC, fan power limits, refrigeration equipment, swimming pool covers, and several controls sub-provisions are deferred. Within Lighting, the space-by-space LPD method, retail display lighting allowances, and specific exterior power density limits per surface type are deferred.
- Threshold values reference representative ASHRAE 90.1-2019 and 90.1-2022 values per climate zone, building type, equipment class, and motor size. Specific construction classes (mass walls vs metal-frame vs wood-frame), envelope mass exclusions, fenestration trade-off paths, skylights, motor pole counts and enclosures, and HVAC equipment sub-capacity ranges are not separately handled. Reviewers must consult the published standard for the specific case and the relevant tables.
- Edition support has primary tables for 90.1-2019 and 90.1-2022. For 90.1-2010, 2013, 2016 and IECC 2018, 2021, 2024 the engine uses 2019 baseline values with an annotation directing the reviewer to the published edition. Specific tightening or relaxation across editions is not encoded.
- Envelope trade-off, performance path, and energy cost budget methods are out of scope. ASSAY is a prescriptive-path checklist.
- Provision text is original paraphrase. The intent is identification of the requirement, not reproduction of the standard. For binding work, the reviewer must consult the published edition of ASHRAE 90.1 for the wording, exceptions, and details.
For permitting submittals, utility incentive applications, or any compliance review with binding consequences, the final compliance determination must be made by a qualified practitioner reviewing the published standard against the construction documents and submittals.
ASSAY has two supported deployment modes as of v0.5.0.
Save assay.html anywhere on disk and open it directly in a modern browser (Chrome, Firefox, Safari, Edge) via file://. All assets are embedded in the file. State persists in browser localStorage; photos persist in IndexedDB. No network required after the page loads. This mode is sufficient for desk work, single-reviewer audits, and quick sharing of the tool. The browser's Add to Home Screen function still works on mobile and gives a standalone-looking shortcut, but PWA install per se is unavailable from file://.
Deploy the complete bundle to a single HTTPS origin (e.g., https://greenshoegarage.com/assay/). The bundle contains seven files:
assay.htmlmanifest.jsonsw.jsicon-192.pngicon-512.pngicon-512-maskable.pngicon-180.png
When the page loads at the HTTPS URL, the service worker registers and precaches the app shell. After first visit, ASSAY works fully offline including on cold starts. The browser exposes Install / Add to Home Screen prompts: on iOS use Safari's Share menu, on Android use Chrome's Install App option, on desktop Chrome the install icon appears in the address bar.
The service worker uses cache-first for the precached shell and falls back to network for any uncached asset. The cache version string in sw.js is tied to the ASSAY version; bumping it on a new release triggers the standard SW update flow, and the page shows a discreet "Update available" banner with an Update Now button. Users dismiss the banner if they want to defer; the next page reload picks up the new version automatically.
The two modes share the same assay.html file. The service worker registration code feature-detects and silently skips when running under file:// (which can't register service workers), so a single shipped HTML works for both deployments.
Version 0.5.0 (Phase 5).
Twenty-eight provisions across five ASHRAE 90.1 chapters: Envelope (Section 5, seven provisions), HVAC (Section 6, nine provisions), Service Water Heating (Section 7, four provisions), Power (Section 8 and 10, three provisions), and Lighting (Section 9, five provisions). Edition selector spans ASHRAE 90.1-2010, 2013, 2016, 2019, 2022 and IECC 2018, 2021, 2024. Four visual themes (Hallmark, Parchment, Slate, Sealing Wax). Compliance Report deliverable in a new tab with print-to-PDF. Photo attachments per provision with IndexedDB storage and report embedding. PWA install supported. v0.5.0 adds Phase 5: full PWA package with manifest.json, service worker (sw.js), and a complete icon set (192, 512, 180 apple-touch, 512 maskable). ASSAY now ships as a multi-file bundle. The HTML still runs standalone when opened directly via file://; PWA install with offline-first cache requires the full bundle served from a single HTTPS origin. Cache version tied to the build version, with an in-app update banner when a new service worker is waiting. v0.4.0 added photo attachments. v0.3.0 added the Compliance Report and theme system. v0.2.0 added the HVAC, SHW, and Power chapters and the edition selector. v0.1.0 shipped the shell, header, WATTMETER and BuildingSync import, and the initial twelve provisions across Envelope and Lighting.
- HTML, CSS custom properties, vanilla JavaScript (no frameworks)
- Fraunces, Oswald, Inter, JetBrains Mono (Google Fonts)
- localStorage for state persistence
- DOMParser for BuildingSync XML import
- No external dependencies, no network calls, no telemetry
GPL-3.0
ASSAY is part of the Field Instruments series by M.B. Parks (Green Shoe Garage, Cumberland, Maryland).
Copyright (C) 2026 M.B. Parks.
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program. If not, see the standard GPL-3.0 license text from the Free Software Foundation.