01 Local-first IES simulation

Light, before
the room exists.

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

LM-63 · Type C
TILT=NONE photometry
Direct + 1 bounce
Convex-room estimate
Local-first
IndexedDB · offline PWA
Plate 01 / Plan Atelier · 6.00 × 4.00 × 3.00 m
LuxLab plan view: a 6 by 4 metre room with a false-colour work-plane heatmap, six downlights and a 105 to 741 lux legend.
Average
467 lx
Uniformity
23%
Target
79% ≥ 300 lx
Fig. 01 — Demo atelier: six 2,400 lm downlights, a 64 × 43 grid and 450 surface patches. Mean 467 lx.

01 What it does

A lighting study, not a render.

Photometry, geometry and result stay visible and editable. No hidden defaults, no black-box solver.

01 / Input

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.

LM-63 Type C TILT=NONE
02 / Model

Build the room, aim the light

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.

X/Y Mount Aim Tilt Dim
03 / Result

Read the work plane

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.

Average Min Max U0 Target

02 How it works

From .ies to lux in three moves.

A short loop: edit, debounce, calculate. The worker keeps the interface responsive while the grid runs.

01 Parse

Import and validate

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.

Rejects TILT=INCLUDE Type A/B

02 Model

Place and aim

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.

Convex room No shadows in v0.1

03 Read

Calculate and inspect

Recompute and read the false-colour map. Compare total, direct and reflected views, then check the metrics and the target threshold.

Direct + one diffuse bounce

03 Local-first

The calculation never leaves the tab.

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.

Private by default

No analytics, accounts or uploads. Your project is browser state, not a server record.

Instant feedback

The engine runs in a Web Worker. Edits debounce for 360 ms; only the latest calculation survives.

Install it and unplug

An offline PWA. The app shell, fonts and the lazy 3D preview are precached after one visit.

Portable projects

Exports are self-contained .luxlab.json files with every referenced IES profile embedded.

IES Parser Worker Canvas IndexedDB
Plate 02 / 3D preview No network after load
LuxLab 3D preview: a transparent room shell containing six luminaires above a false-colour work-plane heatmap.
6 luminaires 450 patches 467 lx mean
Fig. 02 — Work-plane illuminance in the read-only 3D preview. Same 450 patches; rendered locally.

04 The plan

Credible studies, at browser speed.

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.

Shipped now

Shipped
  • Single rectangular room with a horizontal work plane
  • Type C, TILT=NONE IES import with polar preview
  • OrbitX catalogue: 97 IES profiles across 20 families
  • Direct illuminance plus one diffuse bounce
  • 2D plan editor and read-only 3D preview
  • Average, min, max, U0 and target compliance
  • IndexedDB projects with self-contained JSON export
  • Installable, fully offline PWA

Next

Unscheduled
  • Polygon rooms and multi-room geometry
  • Openings, furniture and shadow rays
  • CSV/PDF reports and isolux contours
  • Glare metrics, including UGR
  • Type A/B photometry and TILT data
  • Multi-bounce or path-traced verification

No dates. Scope follows what the method can support honestly.

05 Method

A short, inspectable pipeline.

Parse, interpolate, integrate, display. Every result is reproducible from the inputs, in the browser.

  1. 01LM-63
  2. 02Bilinear
  3. 03Worker
  4. 04Typed arrays
  5. 05Canvas
  6. 06IndexedDB
01

LM-63 parser

Type C, TILT=NONE, header variants and symmetry expansion. Unsupported photometry is rejected, not approximated.

02

Bilinear candela

Vertical and horizontal interpolation with 360° wrap-around. Dimming scales candela linearly.

03

Web Worker

The pure engine runs off the main thread. Edits debounce for 360 ms and the latest request wins.

04

Deterministic heatmaps

The inferno scale is driven by the data's min and max. No random dithering, no per-frame noise.

05

Local IndexedDB

Projects and IES source text persist in the browser. Exports embed every referenced profile.

06

Offline PWA

The app shell, fonts and lazy 3D chunk are precached after the first visit. No CDN in the path.

Calculation

Direct 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

Start with a room.
Leave with a number.

The demo atelier loads on first open: 6 × 4 × 3 m, six 2,400 lm downlights, 467 lx mean. No sign-in, no upload.

Open LuxLab See what's next

v0.5.0 Local-first Metric

LM-63 Type C Direct + 1 bounce Metres · lux IndexedDB Offline PWA