3D Structural Finite Element Analysis (FEA) engine with integrated design checks, running 100% in the browser.
Struxure lets you model, analyze, and verify bar-type structures (beams, columns, braces, trusses) with no backend or software installation required.
For education and preliminary design only. Struxure's results are not independently verified and are not a substitute for review by a licensed professional engineer. It is provided without warranty of any kind — see LICENSE and NOTICE.
- Interactive 3D modeling — Create and edit nodes, elements, supports, and loads with real-time visualization via Three.js
- Multi-material support — Steel (A992) and concrete with full property definitions
- AISC section library — Searchable database of W, HSS, and Pipe sections with auto-populated properties
- 8 built-in templates — Simple beam, cantilever, portal frame, Warren truss, parabolic arch, 3D building, and Eiffel Tower (88-element 3D lattice)
- DXF import — Drag-and-drop AutoCAD
.dxffiles to import geometry - IFC (BIM) import — Drag-and-drop
.ifcfiles with dual strategy: analytical model preferred, physical elements fallback
- Linear static analysis — Direct stiffness method with 3D frame elements (12x12 stiffness matrix)
- Web Worker solver — Non-blocking analysis runs in a background thread with progress feedback
- Cancellable operations — Cancel long-running analyses at any time
- 3D force diagrams — Moment (M3), shear (V2), and axial (N) ribbon diagrams with adjustable scale
- Heatmaps — Color-coded elements by D/C ratio, displacement, axial stress, or combined stress (Jet, Thermal, Blue-Red schemes)
- Animated deformed shape — Oscillate, pulse, or progressive animation modes with speed control
- 3D section rendering — Toggle between wireframe and 3D extruded section views
- Viewport controls — Orbit, pan, zoom extents, and grid toggle
- AISC 360 (Steel) — Tension (Ch. D), Compression (Ch. E), Flexure (Ch. F), Combined P-M interaction (Ch. H)
- ACI 318 (Concrete) — Beam flexure (Whitney block), Shear (Vc + Vs), Columns (simplified P-M interaction)
- D/C ratio visualization — Elements color-coded by demand/capacity ratio
- JSON — Save and reload complete structural models
- CSV — Export analysis results (displacements, reactions, element forces)
- PDF reports — Professional reports with cover page, project info, tables, screenshot, and color-coded design checks
- IFC export — Export model + results to IFC4 format with IfcStructuralAnalysisModel, boundary conditions, and reactions
| Template | Type | Description |
|---|---|---|
| Simple Beam | 2D | Simply supported beam with center load |
| Cantilever | 2D | Fixed-free beam with tip load |
| Portal Frame | 2D | 3-bay, 2-story moment frame |
| Truss Bridge | 2D | Warren truss with diagonal web members |
| Parabolic Arch | 2D | Two-hinged arch under gravity loads |
| 3D Building | 3D | 2x2 bay, 3-story space frame with wind |
| Eiffel Tower | 3D | 25-node, 88-element lattice tower with X-bracing |
| Cristo de la Concordia | 3D | 35-node statue frame with arms — Cochabamba, Bolivia |
| Layer | Technology |
|---|---|
| UI | React 19 + TypeScript |
| Bundler | Vite 7 |
| Styling | Tailwind CSS 4 |
| 3D | Three.js + React Three Fiber + Drei |
| FEA Engine | Pure TypeScript (main thread + Web Worker) |
| Linear Algebra | ml-matrix |
| State | Zustand |
| jsPDF + jspdf-autotable | |
| BIM/IFC | web-ifc (C++ WASM) |
| Persistence | IndexedDB (idb) |
| Analytics | Umami, opt-in via VITE_UMAMI_ID (privacy-first, cookieless) |
pnpm install
pnpm devOpen http://localhost:5173/struxure/ in your browser (Vite serves the app under the /struxure/ base path configured in vite.config.ts).
For a step-by-step guide on creating your first model, see the Quick Start Guide.
pnpm dev # Development server
pnpm build # Production build
pnpm typecheck # Type-check with tsc
pnpm test # Run tests
pnpm test:watch # Tests in watch mode
pnpm lint # Linting with ESLint
pnpm preview # Preview production build
pnpm deploy # Build and deploy to GitHub Pagessrc/
├── core/ # FEA engine (no UI dependencies)
│ ├── local-stiffness.ts # 12x12 local stiffness matrix
│ ├── transformation.ts # 3D coordinate transformation
│ ├── assembler.ts # Global stiffness assembly
│ ├── boundary-conditions.ts # Boundary conditions
│ ├── solver.ts # Solve K·u = F
│ ├── solver.worker.ts # Web Worker for non-blocking analysis
│ ├── solver-manager.ts # Spawns the solver Web Worker; no fallback of its own (see docs/ARCHITECTURE.md)
│ └── post-processor.ts # Internal forces and reactions
├── data/ # AISC section database
├── design/ # Design verification
│ ├── aisc360/ # Steel: tension, compression, flexure, combined
│ └── aci318/ # Concrete: flexure, shear, columns
├── components/ # React UI
│ ├── viewport/ # 3D visualization (meshes, diagrams, heatmaps)
│ ├── panels/ # Model editors (nodes, elements, materials, sections)
│ ├── shared/ # Dialogs (report, IFC import, analysis progress)
│ ├── layout/ # Sidebar, toolbar, status bar, results bar
│ ├── chat/ # AI assistant sidebar (local LM Studio or online model)
│ └── mobile/ # Mobile viewer and install prompt
├── store/ # Global state (Zustand)
└── utils/ # Templates, export, DXF/IFC import, color ramp, animation
Struxure ships with no analytics enabled. Nothing is sent from a fork, a self-hosted instance, or local development.
The maintainer's own deployment at alvarotech.dev/struxure sets VITE_UMAMI_ID in its build environment to enable Umami — privacy-first and cookieless, no personal data, GDPR-compliant.
You can enable it on your own deployment by setting VITE_UMAMI_ID (see .env.example). If you self-host Umami, VITE_UMAMI_SRC lets you point at your own script URL.
| Event | Description | Properties |
|---|---|---|
analyze |
User runs structural analysis | — |
template_load |
User loads a built-in template | { template } |
open_file |
User opens a saved .json model | — |
results_tab |
User switches to Results view | — |
results_switch |
User switches result sub-tab | { tab: shear/moment/deflection } |
export_pdf |
User generates a PDF report | — |
export_ifc |
User exports to IFC format | — |
animation_play |
User plays deformed shape animation | — |
All events go through track() in src/utils/analytics.ts, which checks typeof umami before calling and swallows any error from the script. The app works normally when analytics are disabled, when the script is blocked, or when it fails to load. Note that umami?.track() would not be safe here: optional chaining guards a null/undefined value, but throws ReferenceError when the binding was never declared.
- Bar-type (3D frame) elements only
- Linear static analysis only
- ~200 nodes recommended maximum
- No dynamic, modal, or P-Delta analysis
- Imperial units (kips, inches, ksi)
See ROADMAP.md for planned features and how these limitations are expected to be addressed.
Contributions are welcome. Start with CONTRIBUTING.md, which covers the development setup, the commit conventions, and the validation-test requirement for changes to the solver or the design checks.
By participating you agree to the Code of Conduct.
To report a vulnerability, see SECURITY.md. Please do not open a public issue for security problems.
Built by Alvaro Orellana (alvarotech.dev) with Claude Code.
Licensed under the Apache License, Version 2.0. See LICENSE for the full text and NOTICE for attribution and standards disclaimers.