A note before you read

The ideas on this platform are shared under the TIC-OHSL licence — an open licence that lets you build on these ideas freely, as long as you share your results openly in return.

By continuing you acknowledge these terms. You won't be asked again on this device.

Read the full licence ↗

Pod Simulator — Phase 1 Build Brief

Scope

Phase 1 is a focused proof-of-concept covering two things only:

  • Shell renderer — the parametric three-layer sphere, establishing the visual quality bar
  • Real CSG window/door placement — true boolean subtraction through all three shell layers, with proper jamb/sill/head reveals, in both Radial-cut and Level-sill modes
  • Thermal model tab — material-agnostic layer-by-layer thermal efficiency calculator, with a built-in material library and comparison mode

Everything else (floors, floor plan tool, derived openings, stairs, polish pass) is explicitly out of scope for Phase 1. The goal is to prove the hardest geometry problem early, before committing to the full architecture.

Stack

  • React Three Fiber (R3F) — Three.js rendered declaratively in React
  • drei — R3F helper library: orbit controls, environment maps, HDRI lighting, soft shadows, post-processing
  • three-bvh-csg — real boolean subtraction, actively maintained, handles thin-shell geometry properly. This is the library that was blocked in the chat-artifact sandbox — using it properly via npm is the whole point of moving to this stack.
  • Zustand — lightweight state management for the pod data model
  • Vite — build tooling, instant hot reload

Ships as a browser web app (shareable URL, no install). Electron wrap possible later for more GPU/memory headroom if needed.

Phase 1 Deliverable — Shell Renderer

A parametric sphere with three independently adjustable concentric layers:

  • Armor (outer) — dense cast geopolymer / granite-like. Typical: 100–150 mm
  • Insulation (middle) — foamed geopolymer. Typical: 300–400 mm
  • Thermal mass (inner) — dense cast geopolymer / granite-like. Typical: 500 mm+

The outer radius and each layer thickness are independently adjustable via UI controls.

Visual quality bar

This is where we establish what "game-quality UI" means for this tool. The shell renderer should use:

  • PBR materials — stone/concrete texture for armor and thermal mass layers, lighter foamed appearance for insulation
  • HDRI environment lighting (drei's <Environment>)
  • Soft shadows
  • Smooth-shaded sphere geometry (not faceted)

Phase 1 Deliverable — Thermal Model Tab

Design principle: material-agnostic

The thermal model does not care what a material is — only what its thermodynamic properties are. This means:

  • Any layer can be assigned any material from the library, or a custom material with user-supplied values
  • Comparing geopolymer recipe A vs. B vs. Portland cement vs. hempcrete is just a material swap — the model reruns instantly
  • When better lab-measured values arrive, you update the material entry and every calculation updates automatically

Material library (built-in defaults)

Each material entry stores four properties:

  • k — thermal conductivity (W/m·K) — controls steady-state heat flow rate
  • ρ — density (kg/m³) — affects thermal mass
  • c_p — specific heat capacity (J/kg·°C) — energy stored per kg per degree
  • α = k / (ρ · c_p) — thermal diffusivity (m²/s) — derived automatically; controls how fast temperature changes propagate through the material

Starting material library:

Materialk (W/m·K)ρ (kg/m³)c_p (J/kg·°C)α (×10⁻⁶ m²/s)Notes
Granite2.527007901.17Mid-range; k spans 1.7–4.0 in nature
Dense concrete (stone)1.723008800.84Good Portland cement stand-in
Foamed geopolymer (insulation)0.156008800.28Placeholder — replace with lab values
Lightweight concrete0.208008800.28
Hempcrete0.0640010000.15Excellent insulator, low mass
[Custom]editableeditableeditableautoUser-defined entry

The physics: radial conduction through a composite sphere

The shell is modelled as three concentric spherical layers. For each layer, the thermal resistance to steady-state radial heat flow is:

R_layer = (1/4πk) × (1/r_inner − 1/r_outer)

Total shell resistance: R_total = R_armor + R_insulation + R_mass

Steady-state heat loss for a given indoor/outdoor temperature difference ΔT:

Q = ΔT / R_total (watts)

Effective R-value (for comparison with conventional construction, expressed per unit area at the inner surface):

R_eff = R_total × A_inner (m²·K/W)

Why layer order matters — and why this design is exceptional

In a conventional wall, thermal mass is thermally coupled to the outdoor temperature swing — it absorbs outdoor heat by day and re-radiates it inward at night, partially working against you.

In the pod, the thermal mass sits inside the insulation. It is thermally decoupled from the outdoors. It only "sees" the interior. This means:

  • The mass acts as a pure interior flywheel — absorbing heat from people, cooking, and sunlight through windows, then releasing it slowly
  • Outdoor temperature swings are attenuated by the insulation layer before they reach the mass at all
  • The sphere's minimum-surface-area geometry reduces total heat loss area by roughly ⅓ vs. an equivalent rectangular room

The result is a structure that can stay within a comfortable temperature band year-round with minimal active heating or cooling — in almost any climate — if the layer thicknesses are correctly balanced.

Dynamic model: interior time constant

Beyond steady-state, the model should calculate the interior thermal time constant τ — how long the interior takes to respond to a sudden change in heat input or outdoor temperature:

τ = R_total × C_mass
where C_mass = ρ · c_p · V_mass (thermal capacitance of the inner layer, joules per kelvin)

A large τ means the interior temperature changes very slowly — the home is stable. The thermal model tab should show τ in hours.

UI design for the thermal model tab

Three panels:

1. Shell configuration

  • Outer radius slider (e.g. 3–10 m)
  • Per-layer controls: thickness slider + material picker (dropdown from library + "custom" option)
  • When "custom" is selected: editable k, ρ, c_p fields; α shown as derived/read-only

2. Climate profile

  • Indoor setpoint temperature (°C)
  • Outdoor average temperature (°C)
  • Outdoor daily swing ±°C
  • Outdoor seasonal swing ±°C
  • Presets: Temperate (e.g. Vancouver Island), Mediterranean, Desert, Subarctic

3. Results

  • Effective R-value of the shell (m²·K/W) — with a plain-language label (e.g. "equivalent to R-60 in North American units")
  • Steady-state heat loss Q (watts) at peak ΔT
  • Interior time constant τ (hours)
  • Comfort envelope chart — for the selected climate, a 2D contour plot showing which combinations of insulation thickness and thermal mass thickness keep the interior within ±2°C of setpoint year-round. This is the primary design tool: find the region of the chart where the pod is passively comfortable, then choose the point within it that also meets structural and aesthetic targets.
  • Comparison mode: run two material configurations side-by-side (Config A vs. Config B) — all result fields show both columns

Data model

Pod {
  shell: {
    outerRadius: number,          // metres
    layers: [
      { name: "armor",     thickness: number, material: MaterialRef },
      { name: "insulation",thickness: number, material: MaterialRef },
      { name: "mass",      thickness: number, material: MaterialRef }
    ]
  },
  openings: [ { mode: "radial"|"level-sill", ... } ],
  floors: [ ... ]                 // Phase 2+
}

MaterialRef {
  id: string,                     // library key, or "custom"
  overrides: { k?, rho?, cp? }   // only present for custom entries
}

MaterialLibrary {
  [id: string]: { name, k, rho, cp }  // α is always derived
}

This doubles as the save/load JSON format and the rendering source of truth.

Build sequence

  1. Shell renderer — establish the visual quality bar
  2. Real CSG window/door placement — hardest geometry problem, proven early
  3. Thermal model tab — material library, steady-state model, time constant, comfort envelope chart
  4. Floor system — Phase 2
  5. Floor plan tool with dead-zone metric — Phase 2
  6. Polish pass — Phase 2