Engineering simulation and code-compliance tools for grain handling and dust-collection systems. Bring in the CAD and the duct layout and get a stress or airflow answer with its source attached. Where the inputs run out, the tools stop and say so.
Built by a working mechanical engineer and a software architect, and tested against the engineer's own field jobs.
Dust collection in grain handling is a safety system. Most of the sizing still happens in spreadsheets and rules of thumb.
In 2025 the U.S. still had 7 grain dust explosions, killing 4 people and injuring 10 (Purdue University), including one each in Minnesota and Nebraska.
OSHA 29 CFR 1910.272 sets the federal baseline for grain handling. State air, fire and licensure rules sit on top of it and change from one state to the next.
Duct sizing, structural checks and code requirements are usually separate tasks. These tools keep them in one place and connect each result to its source.
Real screens from the working app. Sample geometry only; no customer data.
Lay out a dust-collection run from the filter outlet: straights, elbows with editable centerline radius, reducers, wyes, isolation valves and fans in 3D. The full view plays the airflow through the run. Each branch is sized for transport velocity, and fitting losses come from cited ACGIH tables. The family tree shows CFM, FPM and velocity pressure for every duct.
A STEP or Onshape part is meshed in Gmsh and solved in CalculiX, then rendered as a von Mises plot. The deformed shape is drawn over the undeformed one so you can see how the part moves.
Inspect a model's real CAD faces, then click to set fixed and loaded faces, or place round load patches. The app shows the node counts before you solve.
Enter flow rate, duct size and run length to get velocity, velocity pressure and friction loss, plus a warning when grain dust would drop out of the airstream. An OpenFOAM run backs it up.
For a site walk: see where a filter's explosion vent points relative to buildings and egress, with an estimated fireball and keep-clear zone. It is labelled as illustrative and is not a stamped design.
Two products on one engineering core.
3D duct layout, branch sizing at transport velocity, pickup airflow worksheets, fitting losses from cited tables, and layouts saved and reloaded with every branch kept.
STEP, STL or Onshape in, mesh and solve, then a rendered stress plot. Materials range from steel and aluminum to 3D-print plastics for fixtures and prototypes.
A same-day screening run for "will this fan or cyclone do the job", built on local OpenFOAM and kept separate from full studies.
Published university grain-resistance data crossed with a fan curve to find the operating point, with the source cited next to the answer.
Each jurisdiction's rules are stored as structured requirements. Minnesota's snow-load rule reaches a real pass/fail against a structural solve. Nebraska's elevator inspection rule renders as a checklist.
Sourced registers of workplace-safety, air-permit, fire-code and engineer-licensure rules for California, Oregon, Arizona, U.S. federal, international and the PE pathway. Each entry is marked verified or still under research.
A click-by-click flip book of real captured screens, short clips, and live flowcharts. It doubles as the operating manual and the customer demo.
Turn an AI design chat or a script into a 3D model, then send it straight into a stress solve. The AI drafts the model and the solver computes the stresses.
Every solver above was run on a known reference case and checked against the expected answer before it was listed.
Process flowcharts, simplified from the app's own training charts.
flowchart LR
subgraph IN[Inputs]
CAD([CAD: Onshape, STEP, STL]):::start
FIELD([Field markups and site notes]):::start
CHAT([AI design chat]):::start
end
subgraph KJ[KJLabs Simulators]
FEA[FEA pipeline]:::act
DUCT[3D duct designer]:::act
AIR[Airflow and loss simulator]:::act
FEAS[Fan and cyclone quick-look]:::act
end
subgraph SOLVE[Open-source solvers]
S1[CalculiX, Code_Aster, Elmer, FreeFEM]:::res
S2[OpenFOAM, Code_Saturne]:::res
end
subgraph CS[CompliSpec]
REQ[Requirements as code]:::act
CHK{Can the rule be checked?}:::dec
end
CAD --> FEA
CHAT --> FEA
FIELD --> DUCT
FEA --> S1
AIR --> S2
FEAS --> S2
DUCT --> AIR
S1 --> REQ
DUCT --> REQ
REQ --> CHK
CHK -->|yes| PF[Pass or fail with source]:::res
CHK -->|procedural| CL[Inspection checklist]:::res
CHK -->|inputs missing| NC[Not computable: says what is missing]:::warn
classDef start fill:#ede9fe,stroke:#7c3aed,stroke-width:2px,color:#1e1b4b
classDef act fill:#dbeafe,stroke:#2563eb,stroke-width:2px,color:#0f172a
classDef dec fill:#fef3c7,stroke:#d97706,stroke-width:2px,color:#422006
classDef res fill:#dcfce7,stroke:#16a34a,stroke-width:2px,color:#052e16
classDef warn fill:#fee2e2,stroke:#dc2626,stroke-width:2px,color:#450a0a
flowchart TD
S([Start at the filter or cyclone outlet]):::start --> A[Append straights, elbows, reducers]:::act
A --> W{Need a branch?}:::dec
W -->|yes| WY[Drop in a wye and pick its side and angle]:::act
WY --> SZ[Size the branch for transport velocity]:::act
SZ --> P[Attach pickups at each hood]:::act
W -->|no| P
P --> Q{Is each pickup's airflow known?}:::dec
Q -->|yes| FAM[Family tree totals CFM, FPM and velocity pressure per duct]:::res
Q -->|no| HELP[Airflow worksheet: displacement, entrainment, hood capture]:::act
HELP --> Q
FAM --> L{Is the fitting in a cited loss table?}:::dec
L -->|yes| LOSS[System loss with table reference]:::res
L -->|no| NC[Loss left unresolved and flagged]:::warn
LOSS --> SAVE[Save the layout or export geometry for CFD]:::res
classDef start fill:#ede9fe,stroke:#7c3aed,stroke-width:2px,color:#1e1b4b
classDef act fill:#dbeafe,stroke:#2563eb,stroke-width:2px,color:#0f172a
classDef dec fill:#fef3c7,stroke:#d97706,stroke-width:2px,color:#422006
classDef res fill:#dcfce7,stroke:#16a34a,stroke-width:2px,color:#052e16
classDef warn fill:#fee2e2,stroke:#dc2626,stroke-width:2px,color:#450a0a
Checked against a real job: within 3% on a redacted real two-pickup dust system (smooth-elbow method; per-component losses still differ).
flowchart LR
S([Part from Onshape, STEP or STL]):::start --> M[Choose material]:::act
M --> F{How are supports and loads placed?}:::dec
F -->|quick| AX[Axis band: min end fixed, max end loaded]:::act
F -->|precise| PK[Click real CAD faces or place round load patches]:::act
AX --> PV[Preview node counts]:::act
PK --> PV
PV --> MS[Mesh with Gmsh]:::act
MS --> SV[Solve with CalculiX]:::act
SV --> LOG{Did the solver log converge?}:::dec
LOG -->|yes| PNG[Rendered stress plot and saved example]:::res
LOG -->|no| FIX[Read the log, fix supports, mesh or material]:::warn
FIX --> MS
classDef start fill:#ede9fe,stroke:#7c3aed,stroke-width:2px,color:#1e1b4b
classDef act fill:#dbeafe,stroke:#2563eb,stroke-width:2px,color:#0f172a
classDef dec fill:#fef3c7,stroke:#d97706,stroke-width:2px,color:#422006
classDef res fill:#dcfce7,stroke:#16a34a,stroke-width:2px,color:#052e16
classDef warn fill:#fee2e2,stroke:#dc2626,stroke-width:2px,color:#450a0a
flowchart LR
K([Engineer's markup or field request]):::start --> C[Change the design tool]:::act
C --> T[Automated tests check real geometry and node graph]:::act
T --> TC[Truth checks: every public number has a source]:::act
TC --> G{All green?}:::dec
G -->|no| C
G -->|yes| LIVE[Walk it live the way the engineer clicks]:::act
LIVE --> MK{Matches the original markup?}:::dec
MK -->|no| C
MK -->|yes| REL[Release with changelog]:::res
classDef start fill:#ede9fe,stroke:#7c3aed,stroke-width:2px,color:#1e1b4b
classDef act fill:#dbeafe,stroke:#2563eb,stroke-width:2px,color:#0f172a
classDef dec fill:#fef3c7,stroke:#d97706,stroke-width:2px,color:#422006
classDef res fill:#dcfce7,stroke:#16a34a,stroke-width:2px,color:#052e16
The work behind this project, sorted by the skills a mechanical design engineer uses every day.
| Skill | Where it shows up here |
|---|---|
| Fact-based concept evaluation | Every number is tied to a cited table, a solver log or a validation case. When an input is missing, the tool reports "not computable" instead of guessing. |
| 3D CAD and models | STEP, STL and Onshape geometry feed meshing and FEA directly. The duct designer builds its own 3D geometry and exports it for CFD. |
| Engineering calculations | Velocity pressure, Darcy-Weisbach friction, ACGIH fitting losses, branch balance, pickup airflow, fan duty points, explosion-vent planning estimates. |
| Prototype and validate | Solvers are checked against textbook and reference cases. Duct losses are compared with a real installed system, and 3D-printed test fixtures are modeled before printing. |
| Standards and specifications | OSHA 29 CFR 1910.272, ACGIH ventilation practice, NFPA combustible-dust standards, state rules stored as code, and sourced regulatory registers. |
| Grain systems and material handling | Dust collection at transfer points, bucket elevator and conveyor pickups, cyclones and filters, bin aeration. |
| Technical documentation | A training film, a demo book, live flowcharts and step-by-step guides, all checked against the real screens. |
| Working with customers | Field markups, texts and voice notes feed a review queue. Each release is checked against the engineer's original markup, not a summary of it. |
| Continuous improvement | Versioned releases with a public changelog, automated regression tests, and an audit cycle that rechecks status claims. |
Sets the engineering requirements from real grain-handling and dust-collection work. He marks up each release, reviews the physics, and supplied the field job used to validate duct losses. The tools are built around the way he designs.
Designs the software, the solver orchestration and the compliance data model. He runs the build process, in which AI coding agents drive open-source solvers under strict evidence rules.
AI agents generate input decks and read solver logs. They never invent a stress, a velocity or a convergence result.
A value without a source is either removed or labelled as an estimate that still needs checking.
Customer jobs appear only in redacted form, with no company, people, site or order identifiers.