Import real photometry
Drop in an LM-63 Type C file. The parser reads the angle tables, symmetry and candela, draws a polar distribution, and surfaces the lumens, watts and maximum candela behind it.
01 Local-first IES simulation
A local-first IES lighting simulator for the browser: import real photometry, model a room, aim your luminaires, and read the work plane as a heatmap with engineering metrics — direct light plus one diffuse bounce, calculated on your machine.
No account No upload Installable offline PWA
01 What it does
Photometry, geometry and result stay visible and editable. No hidden defaults, no black-box solver.
Drop in an LM-63 Type C file. The parser reads the angle tables, symmetry and candela, draws a polar distribution, and surfaces the lumens, watts and maximum candela behind it.
Set a rectangular room, work-plane height and surface reflectances. Place each luminaire, then tune X/Y, mounting height, aim, tilt and dimming in the inspector.
Switch between total, direct and reflected illuminance. Track average, minimum, maximum and uniformity, check a target-lux threshold, and hover the grid for a point reading.
02 How it works
A short loop: edit, debounce, calculate. The worker keeps the interface responsive while the grid runs.
Open the IES library and load a Type C file. LuxLab checks the header and angle tables, expands symmetry, and builds a bilinear candela sampler.
Set the room and work plane, then place luminaires in plan. Use the inspector for mounting height, aim, tilt and dimming. The 3D view is read-only.
Recompute and read the false-colour map. Compare total, direct and reflected views, then check the metrics and the target threshold.
03 Local-first
No account, no upload, no server-side render. Projects and IES source text live in IndexedDB; the service worker keeps the tool available offline. Close the lid and the room is still there.
No analytics, accounts or uploads. Your project is browser state, not a server record.
The engine runs in a Web Worker. Edits debounce for 360 ms; only the latest calculation survives.
An offline PWA. The app shell, fonts and the lazy 3D preview are precached after one visit.
Exports are self-contained .luxlab.json files with every referenced IES profile embedded.
04 The plan
v0.5.0 is tagged and in use. The next work is geometry, shadows and reporting — in the order the method can support honestly.
The goal
Make a credible IES illumination study as quick as opening a tab: fast enough to iterate, private enough for client work, and accessible enough that photometry isn't locked inside desktop software.
No dates. Scope follows what the method can support honestly.
05 Method
Parse, interpolate, integrate, display. Every result is reproducible from the inputs, in the browser.
Type C, TILT=NONE, header variants and symmetry expansion. Unsupported photometry is rejected, not approximated.
Vertical and horizontal interpolation with 360° wrap-around. Dimming scales candela linearly.
The pure engine runs off the main thread. Edits debounce for 360 ms and the latest request wins.
The inferno scale is driven by the data's min and max. No random dithering, no per-frame noise.
Projects and IES source text persist in the browser. Exports embed every referenced profile.
The app shell, fonts and lazy 3D chunk are precached after the first visit. No CDN in the path.
Calculation
E = I(γ, C) · cos ε / r²
One bounce
Bᵢ = ρᵢ · Eᵢ
Eref(p) = Σ Bᵢ Aᵢ cos θᵢ cos θₚ / (π rᵢ²)
Bilinear candela in γ and C. One bounce only; treat reflected light as an estimate, not a full radiosity solve.
Fixture check
750 lm declared 748 lm integrated
A public Cooper Lighting MRZ Type C profile was integrated at 1°. The check exercises angle handling and flux integration — it is not a certification.
Third-party fixture Not a compliance claim
06 Ready when you are
The demo atelier loads on first open: 6 × 4 × 3 m, six 2,400 lm downlights, 467 lx mean. No sign-in, no upload.