Inspiration
On September 2nd, a section of grandstand at Rogers Stadium in Toronto came down in a windstorm. What struck us wasn't that it failed — it's that the failure was boring. The venue sits on a former airport runway with nothing upwind to slow the gusts, and the temporary stands weren't held down well enough for the wind that site actually gets. No exotic engineering, no unforeseeable event. Just arithmetic nobody ran.
That arithmetic isn't secret. It's in calcuation, it's been public for decades, and almost nobody outside a structural engineering office has ever seen it applied to a building they recognize. We wanted to put it in a browser tab.
The second half of the idea is the part that makes it a climate project rather than a safety one. The easy way to make a building survive wind is to add mass and steel, and mass and steel are made of carbon. Every fix has a price. That tradeoff is the whole game.
What it does
Ballast is a browser-based structural sandbox.
Build a parametric building, pick a location, and Ballast pulls 40 years of gust data from the ERA5 archive to set a realistic design wind. A deterministic engine computes the loads and colours each storey by how hard it's working, so you can see where it fails instead of reading a verdict.
Then you rebuild it. Swap concrete for cross-laminated timber, add a shear wall, deepen the footings. Every edit updates three numbers at once: safety factor, embodied carbon, and cost. Safer usually means dirtier. Finding the design that's both is the puzzle.
One rule shaped everything: the engine computes, the AI explains. Every number comes from physics code. The model tells you why you're failing and what to try: it never produces a score. You can check our math; you can't check a model's vibes.
How we built it
React 19 + Vite + TypeScript, Tailwind, react-three-fiber for the 3D view, zustand, Supabase for auth and saved designs.
The engine is a pure, dependency-free TypeScript module with no React imports, implementing a simplified ASCE 7 wind procedure: velocity pressure qz = 0.613·Kz·Kzt·Kd·V², per-storey lateral force, base shear, overturning and sliding factors of safety, and storey drift against an h/500 limit. It returns a per-storey breakdown and raw values, not a collapsed 0–100 score that hides the tradeoff.
Eight structural materials with published density, strength, embodied carbon, and cost, each cited in-source. Tested with Vitest, including a case we worked out by hand with the arithmetic in the comments.
Challenges we ran into
Units. ASCE 7 wants m/s, wind data arrives in km/h, results are in pascals, materials in MPa. One missed conversion gives you a plausible wrong answer, the worst kind.
Kz interpolation across exposure categories. The tabulated values are coarse, and naive interpolation put discontinuities in the safety factor.
Accomplishments that we're proud of
Every number is defensible. It came from formulas and stuff. The carbon/safety tension is implemented.
What we learned
How much of structural safety is margin, not certainty. Building the engine made that concrete in a way reading about it didn't.
What's next for Ballast
Seismic, which inverts the lesson: in an earthquake, mass is the enemy. Real buildings, imported from OpenStreetMap footprints.
Built With
- featherless
- react
- tailwind.css
- typescript
- vite
Log in or sign up for Devpost to join the conversation.