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, or just describe the space — and read the work plane as a heatmap with engineering metrics. Direct light plus up to four diffuse bounces, calculated on your machine.
Free account No project uploads Installable 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 luminaires by hand, or stamp a block of them with grid placement, then tune 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. Up to three labelled isolux contours trace the levels that matter, and a maintenance factor turns as-new figures into the maintained values you specify against.
Type the room and the light you want — "20 × 15 m office, 500 lx" — and LuxLab builds the scene, sizes the layout by simulation and reports the result. With a project open, ask why the result looks the way it does or request a small change; LuxLab applies it, recalculates and shows before and after. The provider reads the brief or project summary; geometry, photometry and every lux value stay in the engine. Administrators choose DeepSeek or OpenCode Go and manage the encrypted key in Settings; each person can still hide the bar in their own browser. Select several lights to move them together, and export the whole study as a PDF plan, 3D view and results report.
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 project uploads and no server-side render. An account gates the tool; the geometry, photometry and results stay in the tab. If you use Ask LuxLab, the sentence and a list of fixture names go to the configured AI provider; turning the assistant off in Settings sends nothing. Projects and IES source text live in IndexedDB, and the service worker keeps the tool available offline. Close the lid and the room is still there.
No project uploads and no tracking cookies. Your project stays browser state, not a server record; page views are counted anonymously. The assistant is the one network feature, and it is opt-out.
The engine runs in a Web Worker. Edits debounce for 360 ms; only the latest calculation survives.
An installable PWA. The app shell and fonts are precached after one visit; a cold start still checks your session online.
Exports are self-contained .luxlab.json files with every referenced IES profile embedded.
04 The plan
v0.17.1 is tagged and in use. Undo and Redo now cover the whole project: a light move, a delete, a setting change and an assistant edit are each one step, and a drag undoes as a whole. The public handbook lives at /wiki/, and the workspace has a Help menu, a shortcut sheet and a status bar that names the current tool and calculation state. Deleting a room asks first and tells you how many lights go with it. Draw a room with a rectangle drag or an orthogonal outline, edit corners and walls with snapping, type exact wall lengths and move a room with its lights. The Projects lobby remains an OrbitX portfolio. Press Select in the luminaire list to choose lights explicitly, then move or delete them together. Export a full A4 PDF with a 2D plan of every room, a 3D view, all results and the schedules. Describe a space in the Ask bar and LuxLab builds, solves and calculates it; with a project open, ask why the result looks the way it does or request a small edit, with Undo behind it.
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 and the maintenance factor scale candela linearly, per luminaire.
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²
Up to four bounces
Bᵢ¹ = ρᵢ · Eᵢ
Bᵢk+1 = ρᵢ · Σⱼ Bⱼk Aⱼ cos θⱼ cos θᵢ / (π rᵢⱼ²)
Eref(p) = Σₖ Σᵢ Bᵢk Aᵢ cos θᵢ cos θₚ / (π rᵢ²)
Maintained
Em = MF · (Ed + Eref), MF = LLMF · LSF · LMF · RSMF
Bilinear candela in γ and C. One bounce by default and up to four; still 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 Changelog
Generated from the project changelog on every deploy, so the page cannot fall behind the release.
Delete or Backspace now opens the room-delete confirmation for the active room instead of doing nothing. Escape or Cancel leaves the room in place, and Undo restores it with its luminaires. With a light selected, Delete keeps targeting the lights.scripts/smoke-room.mjs covers Delete, Escape, the confirmation and Undo; the store tests cover request, cancel, confirm, the last-room guard and a project switch.Cmd/Ctrl+Z, Shift+Cmd/Ctrl+Z and Ctrl+Y work from both the plan and 3D views.src/lib/history.ts is pure and unit-tested.scripts/smoke-undo.mjs.docs/wiki/index.md, linked from the landing navigation and footer, and linked contextually from every workspace panel.npm run wiki:build renders the handbook, npm run wiki:check catches drift, and AGENTS.md requires the matching section to be updated in the same commit. npm run check includes the wiki check.scripts/smoke-help.mjs covers the Help and More menus, the shortcut dialog, add-dialog focus, the single-light delete and the 390 px layout.scripts/smoke-room.mjs now covers the prompt, its Cancel path, the empty-room copy and Undo after a confirmed delete.07 Ready when you are
One click from the project list: 6 × 4 × 3 m, six 2,400 lm downlights, 373 lx maintained at the default 0.80 factor. A free account keeps it yours; nothing you draw is uploaded.