Changelog

A versioned record of calculation-affecting and notable changes. Every PDF report footer carries the version string - use this page to trace what the tool computed.

Grouped under Corrections (recompute affected results), Features, and Improvements.

v0.1.70 - 2026-08-20

Improvements

  • Internal improvements and refinements.

v0.1.61 - 2026-08-17

Corrections

  • All-LVL-C circular bolt patterns in TTM connections now use the LVL Handbook Table 5.3 column-3 spacing (which accounts for the double-shear middle member) instead of the uniform column-2 values. The middle member gains larger end and edge distances and the on-circle spacing widens from 4d to 5d. Re-check any all-LVL-C circular TTM connection - some layouts that passed may now require wider spacing.

v0.1.60 - 2026-08-16

Corrections

  • On LVL circular TTM connections the spacing-check section headings previously cited EC5 Table 8.4 while the printed values came from the LVL Handbook Table 5.3; the headings now name the correct source. Printed numbers are unchanged - only the source attribution is corrected.

Improvements

  • TTM circular connection reports now state which LVL Handbook Table 5.3 column produced the spacing minima, and correctly attribute LVL circular spacing to Table 5.3 rather than to EC5.

v0.1.59 - 2026-08-16

Improvements

  • The single-screw spacing panel now shows the load-to-grain angle used for each member's spacing, replacing a heading that described nail-regime spacing as angle-independent - the spacing does vary with angle, and the panel now states which angle it used.

v0.1.58 - 2026-08-15

Corrections

  • TTM circular bolt patterns in LVL now use the LVL Handbook Table 5.3 circular values instead of the generic 5d convention, selected by veneer lay-up. All-P connections tighten (on-circle spacing 5d to 6d, end distance to 6d); all-C connections relax; a C-sided connection with a P middle takes different end and edge distances in the middle member than in the side members. Re-check any TTM circular connection using Kerto LVL - some all-P layouts that passed may now fail.

v0.1.57 - 2026-08-15

Corrections

  • Single-screw connections (d<=6mm) with an angled load-to-grain on the head-side member now compute the head-side spacing at that angle. Previously the head-side spacing was evaluated as if parallel to grain regardless of the entered angle, understating the loaded-edge distance a4t by up to 29 percent (softwood) or 42 percent (LVL) and over-stating a1 and a3t. Re-check any small-screw connection where the head-side member has a load-to-grain angle other than zero. Nails, staples, larger screws and panel head members were not affected.

v0.1.56 - 2026-08-15

Corrections

  • STS and TST connection spacing checks now gate on the same EC5-correct minimum that the report prints, resolving a split where the pass/fail used a different value from the printed one. For LVL members this closes an unconservative case - a bolt connection could pass the geometry check while the report showed a failing spacing row (parallel-to-grain minimum was gated at the generic value, not the wider LVL value); re-check any LVL STS or TST connection, as some may now fail. For dowel connections the gate was over-strict (perpendicular spacing required 4d where EN 1995-1-1 Table 8.5 requires 3d); some dowel layouts that failed will now pass.

v0.1.55 - 2026-08-15

Corrections

  • Nail and small-screw (d<=6mm) spacing for LVL members now uses the Handbook Table 5.1 edge-face values, selected by material rather than by density. Kerto LVL 32 P previously routed to a sparser density band and understated parallel-to-grain and end distances by up to a third; the perpendicular-edge distance also gains the correct diameter-dependent value at d>=5mm. Re-check any LVL nail or small-screw connection.

v0.1.54 - 2026-08-15

Improvements

  • Extended the Handbook 9.8 nail regression anchor to run through the full single-nail solver, adding member-ordering and rope-effect coverage.

v0.1.53 - 2026-08-15

Corrections

  • Corrected EN 1995-1-1 equation 8.6(e) in the single-shear timber-to-timber capacity kernel, which used the wrong member's embedment strength - affecting bolts, dowels, nails, screws and staples. For connections with unequal member grades where mode (e) governs, capacity was overstated by up to about 25 percent when the pointside member is denser than the headside; equal-grade connections were unaffected. Re-check any single-shear connection with different grades on the two members.

v0.1.52 - 2026-08-15

Corrections

  • Saved projects using the previous Kerto grade names are automatically migrated to the new names on load; without this a saved LVL project would have silently reverted to softwood density and generic spacing while keeping the LVL modification factor.

Improvements

  • Added Kerto LVL 32 P (stud grade) to the timber grade catalogue, and renamed the two existing Kerto LVL grades to their full strength-class names (Kerto LVL 48 P, Kerto LVL 36 C) to match Metsa's own designation.

v0.1.51 - 2026-08-15

Improvements

  • Added a regression anchor verifying the LVL nail lateral capacity kernel against LVL Handbook Europe 2025 Example 9.8.

v0.1.50 - 2026-08-15

Corrections

  • Single bolt and single dowel calculators now apply the wider LVL edge-face spacing minima for Kerto members - parallel-to-grain a1 rises to (4+3|cos a|)d (7d at 0 degrees) and the loaded-end floor to 105 mm, matching the connection calculators; the dowel value also rises at 90 degrees (3d to 4d). Re-check any LVL single-fastener spacing, as the printed minima were previously understated.

v0.1.49 - 2026-08-15

Corrections

  • TTM connection drawings previously reddened bolts against an over-strict spacing minimum (7d where the solver governs at 5d), overstating the drawn requirement by up to 40 percent; the drawing now mirrors the solver, so valid layouts no longer show red. Only the drawing was affected - calculated capacity and the PDF report were always correct.

Improvements

  • TTM drawings now show LVL-aware per-axis spacing minima, matching the solver and PDF for Kerto members.

v0.1.48 - 2026-08-15

Improvements

  • LVL connection drawings now show the correct 7d parallel-to-grain spacing minimum, matching the solver and PDF report (ST/TT/TTT).

v0.1.47 - 2026-08-15

Corrections

  • LVL (Kerto) connection spacing now applies the wider Handbook edge-face minima - parallel-to-grain a1 rises from 5d to 7d at 0 degrees, and the loaded-end floor from 80 to 105 mm below d roughly 15 mm; generic softwood values previously applied and understated both. Re-check any LVL connection, as spacing utilisation may rise and previously passing layouts may need wider spacing.
  • TT/TTT/TTM/TST bolted connections: washer bearing (the rope-effect basis) was computed from EC5's steel-plate bound instead of a real washer, overstating capacity wherever a hinge mode governs - falls by up to 15%, and can flip a passing design to failing. Re-run any TT/TTT/TTM/TST design where a hinge mode governed (TT: d, e or f; TTT/TTM: j or k); ST/STM/STS are unaffected.

Features

  • Screw calculator: Paslode PSTS declared-values source (DoP-ITW-PSTS-2021) - declared withdrawal, head pull-through and yield moment values.
  • TTM: second bolt circle now reachable - "Add second circle" toggle, with chord and inter-circle spacing checks.

v0.1.46 - 2026-08-14

Corrections

  • PDF report footer: the standards line could cite standards no check had run. Values unchanged; reissue only if the footer's standards line was relied on.
  • Screw calculator, ETA source: axial capacity was missing the head-side limit (ETA-11/0190 p.20). Capacities fall up to 63% axial / 32% lateral - re-run any ETA-source design. Custom and DIN 571 unchanged.

Features

  • Screw calculator: Würth ASSY plus VG ETA source - declared withdrawal and tensile values replace the EC5 generic formulas.
  • Moment connections: optional counterbore for recessed heads/nuts - bearing length follows the bore, with a choice of end/edge distance treatment.
  • Timber grade catalogue: Kerto-S and Kerto-Q LVL (EN 14374) selectable across all lateral and moment configs, edgewise values.

Improvements

  • PDF reports: every page now carries a footer - the standards the report's checks actually ran, version, and a QR to the assumptions page - and a reserved bottom margin.
  • Ledger calculator: specify bolt length instead of embedment - h_ef is derived and shown. Mechanical anchors keep their setting depth.
  • Exported PDFs are now named after the calculator, prefixed by the project reference when one is entered - "24-117 - Timber Ledger Anchorage.pdf" rather than "connection-report.pdf".
  • PDF reports: a table continuing onto the next page now repeats its column header.

v0.1.45 - 2026-08-08

Features

  • Screw calculator: DIN 571 coach screw source - pick size and length, geometry prefills.

v0.1.44 - 2026-08-04

Improvements

  • Feedback improvements - clearer attachment labelling and confirmation; feedback is now for signed-in users.

v0.1.43 - 2026-08-04

Corrections

  • The a1, a2, a3,t and a4,t spacing minimums in the moment configs (STM, STSM, TSTM) now swap axes with the member direction and the load angle together. Re-run any moment design entered at column orientation with 90° to grain, or beam orientation with 0°: at those two combinations the along-grain and across-grain minimums exchange axes, so one axis tightens from 4d to 5d while the other relaxes from 5d to 4d, and a3,t and a4,t exchange in the same move. A design that passed may now FAIL, and one that failed may now pass. The two default combinations - column + 0° and beam + 90° - are unaffected. Each view has a default angle at which the grain runs along spacingX; away from it the grain is on spacingY and the minimums follow. For M10: column + 0° → a1 = 50, a2 = 40; column + 90° → a1 = 40, a2 = 50; beam + 0° → a1 = 40, a2 = 50; beam + 90° → a1 = 50, a2 = 40
  • This supersedes v0.1.29 (52a-i) by name. That release removed the swap and pinned a1 to spacingX at every angle, on the reasoning that the solver works in a fixed grain frame in which only the load rotates. That reasoning was wrong and the pinning with it. The v0.1.29 entry has been marked superseded in place, and its re-run advice - which told users a1 had been under-required at these same two combinations - is withdrawn and replaced by the advice above, which points the opposite way on the a1 axis. Releases v0.1.29 through v0.1.42 computed the pinned values; reports stamped with those versions carry them
  • orientation is now a calculation input. It had been documented and used as display-only. The spacing block reads it - the only place in the solver that does - because it is the sole input stating which way the member runs, and the grain runs with it. Two designs differing only in that field now correctly differ in their spacing minimums, where before they were byte-identical
  • The book anchor is untouched, and confirms the rule. P&K Ex 12.8.1 is a horizontal beam member at 90° to grain - the beam default - so its minimums stay on spacingX, which is the axis the book itself calls parallel to grain (a1 = 90 mm; a2 = 85 mm perpendicular). Every printed value still reproduces: nef = 2.342548585 against the printed 2.34, F1h = 5.8981 kN against 5.9, critical bolt α = 54.8072° against 54.81, Fd = 2714.899 N per shear plane against 2.71 kN. Two fixtures carried orientation: 'column' for what is the book's horizontal beam; both are corrected, which is a labelling fix on a field that was inert until this release
  • Byte-check: 2 of 14 stored STM fixtures move, and both are the genuinely off-default ones - beam + 0°. Every beam + 90° and column + 0° fixture is byte-identical, as are all 8 TTM fixtures (solveTTM is untouched). On the two movers: a1min 60 → 48, a2min 48 → 60, a3tmin 84 → 48, a4tTimberMin 46.39 → 84 and 48.00 → 84. Those four spacing fields are the only ones that move in any fixture - no bolt force, angle, embedment strength, Johansen mode, capacity, utilisation, nef, splitting result, connection-zone shear or designPass differs anywhere. solverBaselines.json regenerated for those 8 numbers: 8 insertions, 8 deletions, all of them a1min/a2min/a3tmin/a4tTimberMin lines
  • The grain glyph on the drawing rotates with the angle again, so the direction visibly switches when the setting changes and tracks the axis carrying the 5d minimum. The v0.1.42 freeze, which held it along the member, is reverted; that entry is marked accordingly
  • Test guards rewritten rather than deleted: the nefGrainAxis cases that pinned the invariant frame now pin the swap, including a case asserting that the same angle gives opposite pairs in the two views. Full suite 657 passing, tsc -b clean

v0.1.42 - 2026-08-04

Improvements

  • PARTLY SUPERSEDED by v0.1.43 - the premise below, that the grain runs along the member at every load angle, was wrong: the grain rotates with the angle, and v0.1.43 reverts the glyph freeze this release shipped. What v0.1.42 did is described as published, because it is what this version computed and drew: the glyph WAS frozen along the member, and drawings produced under it show that. The report and input wording changes - "Member axis", "Shear-to-grain angle" - stand and are unaffected.
  • The grain-direction drawing and the report wording in the moment configs (STM, STSM, TSTM) now reflect what those solvers actually assume: the grain runs along the member's length, at every load angle. No calculation changed - no solver file is in this release's diff, and every capacity, force, spacing minimum, geometryPass and designPass is identical. Three artifacts implied the opposite, and between them they made a wrong reading of the angle input look confirmed. Closes backlog (63), (64) and (65)
  • The grain glyph rotated with angleToGrain, contradicting the drawing's own dimension chains. a3t (loaded END distance) is dimensioned on the fastener-column axis and a4t (EDGE distance) on the fastener-row axis, at every angle and in both views - a member cannot have its end on one axis and its grain on another. The glyph nonetheless swung 90° with angleToGrain, and in column view it was additionally inverted, so it also contradicted the Vz axis arrow at both settings. It is now constant and runs along the member: verified on the emitted SVG at all four combinations in all three configs - column view draws it vertical, beam view horizontal, matching the member each time. Only the two off-default combinations move - column at 90° and beam at 0°. The two default combinations (column 0°, beam 90°) are byte-identical, and outside the glyph lines nothing in the SVG differs across the angle at all. The lateral configs are untouched and their glyph still rotates, which is correct for them - verified: ST, STS and TST all still swing between 0° and 90°
  • The PDF read as though the member were cross-grain. The design-basis block printed Grain direction | Column beside Angle to grain | 90° - two rows that together parse as "the grain is at 90° to the column". They are now Member axis | Column and Shear-to-grain angle | 90°, and the moment page's input label matches. "Shear", not "load", because the axial force N is taken as grain-parallel at every setting - at 90° it is the shear that crosses the grain while N still runs along it, so the broader word would have been literally false whenever N ≠ 0. Every instance of the pattern was found and fixed: it occurred once, in buildSTMReport. The TTM report uses a different and already-explicit scheme, naming each member's grain per row (∥ col. grain, ⊥ beam grain), and is unchanged; the lateral pages keep "Grain direction", which is correct for their convention
  • The docs page now states both conventions and the unsupported case. One input name carries two meanings: in the moment configs the member's direction is given by the column/beam selector and the angle input orients the applied LOAD against a member-fixed grain; in the lateral configs, which have no member selector, the same input rotates the GRAIN against a fixed vertical load, and their a1/a2 axes swap with it. Both are correct for their own configs. Recorded alongside it: cross-grain members are NOT supported by the moment configs - a member whose grain runs across its own length cannot be entered, no input encodes it, and the entire solve assumes grain-along-length (spacing axes, nef lines, splitting h, connection-zone shear depth, every Hankinson angle). Selecting a column at 90° means a horizontal load on a normally-grained column, not a column with horizontal grain
  • Full suite 648 passing, tsc -b clean. The suite cannot see a glyph or a table caption, so both are closed on the artifacts instead - the generated SVG was parsed for glyph geometry at all four combinations, and the report strings are literals

v0.1.41 - 2026-08-03

Improvements

  • The spacing labels and the bolt colours in the moment configs (STM, STSM, TSTM) now follow the solver's grain convention. No calculation changed - the solver files are untouched by this release, so every capacity, force, spacing minimum, geometryPass and designPass is identical. v0.1.29 moved these solvers to a fixed grain frame - spacingX is a1 (∥ grain) and spacingY is a2 (⊥ grain) at every load angle - and two display sites were left on the old keying, where the grain rotated with angleToGrain and with the drawing orientation. Closes backlog (36)
  • The input labels flipped their ∥ / ⊥ glyphs with the grain setting while the axis they name does not move. At column orientation with 90° to grain - and at beam orientation with 0° - the page printed a2 ∥ spacing beside a minimum of 4d, which is Table 8.4's perpendicular value, and a1 ⊥ spacing beside 5d, the parallel value. Each label contradicted the number next to it and the axis the solver checks it on. Both are now fixed: a1 ∥ spacing and a2 ⊥ spacing at every angle and in both views. The minimums themselves never moved and were never wrong - a1 is pinned at the 5d end of (4 + |cos α|)·d for the moment group, which is the maximum the formula can return, so it can never under-require
  • The drawing was painting valid bolts red. buildConnectionSvg recomputed its own spacing pair for this family and swapped the two away from each view's default angle, so its bolt-colour check demanded a2 ≥ 5d where the solver requires 4d. On a 10 × 2 M10 group at a1 = 200 / a2 = 40, column orientation, switching to "90° - shear ⊥ grain" turned all 20 bolts red while geometryPass was true - the picture and the badge disagreed on the same connection. The drawing now reads the solver's spacingChecks.a1min / .a2min instead of deriving its own, so bolt colour and geometryPass are one number. Verified on that geometry at both angles and both orientations: 20 amber, 0 red, agreeing with geometryPass in all four; and the colour still tracks genuine failures - a2 = 30 mm and a1 = 45 mm each give geometryPass = false with all 20 bolts red
  • The drawing keeps a fallback for callers that pass no solver result, and that fallback now reproduces the fixed frame (a1 for spacingX, a2 for spacingY) rather than the swap. ST, STS, TST, TT, TTT and TTM are untouched: they key spacing to the load angle in both solver and drawing, which is self-consistent for that family, and the drawing's branch for them is unchanged
  • Full suite 648 passing, tsc -b clean. The test suite cannot see a label string or a fill colour, so those two are closed on the rendered artifact instead - the generated SVG was parsed for bolt fills at both angles, and the label change is a literal
  • A documentation claim on /docs/assumptions-and-limitations was wrong and is corrected; no calculation changed. The spacing section stated that none of the moment configs' four minimums depends on the load-to-grain angle. That holds for a1, a2 and a3,t, but not for a4,t, which is evaluated at the largest per-fastener FORCE angle in the group - Table 8.4's own definition of α. It therefore moves with the load case: on a 10 × 2 M10 group with M = 8.85 kNm and V = 30 kN, a4,t,min is 32.66 mm at 0° and 40.00 mm at 90°, and at a fixed 0° it moves 32.66 → 40.00 mm between two different load cases on the same geometry. The page now says so, and records that a group maximum is never below the per-fastener requirement at the loaded edge - conservative when the largest-angle fastener is not one of the edge fasteners, by 27% on the shipped STM defaults, where the α = 90° fastener sits at mid-depth and loads neither edge. The claim predates this release; nothing about the calculation moved with it. Backlog (62) holds the open question - a per-fastener, directional edge check needs the printed Table 8.4 angle ranges and a per-bolt result list on the lateral solvers

v0.1.40 - 2026-08-03

Corrections

  • The EC3 bolt-shear check in ST, STS and TST used fub = 800 N/mm² for grade 4.6 and 5.6 fasteners, where the property-class table gives 400 and 500. The check was unconservative by exactly 2× on 4.6 and 1.6× on 5.6. Re-run any ST, STS or TST design that used a 4.6 or 5.6 fastener - bolt OR dowel - with steel plate checks enabled: the fastener-shear resistance halves on 4.6, so a design that passed on the overstated value may now FAIL. Three solvers computed the EC3 fub as boltGrade === '10.9' ? 1000 : 800 - a two-branch expression standing in for a four-entry table, correct only for 8.8 and 10.9. All three now call the same getBoltFu helper every other site uses
  • One term moved, not two. Fv,Rd = αv · fub · As / γM2, and only fub changed: αv comes from boltShearAlphaV, which this commit does not touch and which already read the grade correctly (0.6 for 4.6/5.6/8.8, 0.5 for 10.9). As is unchanged, γM2 is unchanged. So the resistance change is exactly the fub ratio - ×0.5000 on 4.6 and ×0.6250 on 5.6, no compounding and nothing worse than 2×. Verified by decomposing every grade and diameter and checking the reconstructed Fv,Rd against the live solver value to within 0.05 N
  • The report has been printing the right number beside the wrong calculation this whole time. ST, STS and TST reports take fub from the property-class table, so a 4.6 design printed f_ub = 400 N/mm² in its fastener line while the bolt-shear resistance beside it had been computed at 800 - a document that contradicted itself for any reader who multiplied it through. Printed and computed fub now agree at every grade, verified: 4.6 → 400/400, 5.6 → 500/500, 8.8 → 800/800, 10.9 → 1000/1000
  • Direction and magnitude - the resistance halves on 4.6 and drops to 0.625 on 5.6. On the shipped ST defaults with an M12 4.6, the bolt-shear resistance falls from 32 371.2 N to 16 185.6 N and utilisation doubles; on an M20 4.6, from 94 080.0 N to 47 040.0 N. For 5.6 the factor is 0.6250 (M12 32 371.2 → 20 232.0 N; M20 94 080.0 → 58 800.0 N). The ratios are exactly 400/800 and 500/800, as they must be - nothing but fub moved
  • A design that passed can now fail, and the margin was large enough for that to be reachable in ordinary use. On the ST defaults with an M12 4.6 at V = 60 kN the EC3 bolt-shear check moves from η = 0.6604, PASS to η = 1.3208, FAIL - both measured. At V = 40 kN it moves 0.4403 → 0.8805, still passing but no longer with the margin the old number implied
  • Byte-check: 343 fixtures, 24 moved, and the 24 are exactly the affected set - ST, STS and TST × bolt and dowel × grades 4.6 and 5.6 × M12 and M20 × steel checks ON. Every other case is byte-identical: all 8.8 and 10.9, every case with steel checks off, TT, TTT, STM, TTM, the single-fastener bolt and dowel calculators, the ledger, and all 22 moment book-anchor fixtures. Only the boltShear check within steelEC3 moves - no timber capacity, no Johansen mode, no spacing check, no splitting result and no designPass outside the EC3 block
  • Dowels are affected too, which the defect's shape does not make obvious. The EC3 block is not gated on fastener type - a dowel in a steel-plate arrangement transfers load through the plate and is checked for shear the same way - so a dowel specified at 4.6 or 5.6 moved identically to a bolt. The 24 movers are 12 bolt cases and 12 dowel cases. Dowel designs are not exempt from the re-run advice
  • Unaffected and needing no re-run: any 8.8 or 10.9 fastener (the two grades the old expression got right, which includes every shipped default); any design with steel plate checks disabled; and TT, TTT, STM and TTM, which already read the table
  • Backlog (59) opened for the last unfunnelled fu read: buildSTMReport still resolves fu through a local seven-grade map (adding 4.8, 5.8 and 6.8) rather than the kernel helper. Deliberately untouched here, because closing it either narrows those three grades to the 800 fallback or extends the shared table - and extending it would add three selectable grades to every dropdown, a user-facing change that does not belong inside a correction. Recorded with it: getBoltFu('6.8') returns 800 while the settings reference table displays 600 for that class, a live disagreement independent of which option is chosen

v0.1.39 - 2026-08-03

Corrections

  • ST (steel plate to timber, single) resolved the applied load into the grain axes without using the load-to-grain angle, and pinned the embedment angle to the entered one instead of deriving it. Re-run every ST design, at BOTH grain settings - this is not an α = 0 correction only. Other configs are unaffected. At α = 0 the per-bolt force was understated wherever shear and axial act together, so a design that passed may now fail. At α = 90 the demand is unchanged but capacity was understated, so a design that FAILED may now pass - if an ST connection at "90° - shear ⊥ grain" was rejected on utilisation and redesigned or upsized, re-run it before assuming the redesign was needed. Both directions are quantified below. ST assigned Fx = N and Fz = V unconditionally, so the per-bolt resultant came out as √(N² + V²) at every angle, and it set the Hankinson angle to the entered α rather than to the critical bolt's own force direction. STS, TST and the rest of the family have always done both correctly. ST now matches them exactly: Fx = N + V·cos α, Fz = V·sin α, and α_resultant = arctan(|Fz| / |Fx|) taken from the governing bolt
  • Direction and magnitude - unconservative at α = 0, conservative at α = 90, and both are corrected. At "0° - shear ∥ grain" the UI states V acts along the grain, collinear with N, so the two add: ST was summing them in quadrature and reporting a per-bolt force that is too small. On the shipped defaults (GL24h, M12 8.8, 2×2 at 80 mm, medium-term) with V = 10 kN and N = 10 kN the critical bolt force rises from 4 861.4 N to 6 011.1 N and utilisation from 0.495 to 0.619, a factor of 1.2488. Across sampled α = 0 load pairs the factor runs 1.1062 to 1.2488 where both V and N are present, and 1.0281 at V = 20 / N = 0 where only the angle correction applies. Two of six sampled α = 0 cases flip PASS to FAIL - V = 20 / N = 20 (η 0.991 → 1.237) and V = 10 / N = 30 (η 0.928 → 1.122)
  • At "90° - shear ⊥ grain" the demand is unchanged - √(N² + V²) is already the right resultant there - but the pinned angle forced fh,α to the fully-perpendicular value even for loads that are mostly axial, understating capacity. Utilisation now falls by a factor of 0.7094 to 0.9799 on the sampled pairs; at V = 0 / N = 20 (pure axial, wholly grain-parallel) fh,α corrects from 18.158 to 27.782 N/mm² and η from 0.718 to 0.510. One sampled case flips FAIL to PASS (V = 10 / N = 30, η 1.309 → 0.982), so an ST design previously rejected at α = 90 may now be adequate - worth re-running for that reason as well as for correctness. On the shipped defaults (V = 20, N = 0) η moves 1.0236 → 1.0030, failing either way
  • Byte-check: 193 solver fixtures, 83 moved, all of them ST. Every STS, TST, TT, TTT, STM, TTM and ledger case is byte-identical (69 of 69), including all 22 moment-family fixtures - the P&K Ex 12.8.1 and 12.8.3 ring anchors among them. The demand and the capacity move separately, and only the capacity moves at α = 90. Projecting each ST result onto its demand fields alone (per-bolt V and N, critFx, critFz, Fd, the eccentricity terms), 22 of 31 α = 0 cases move substantively while every α = 90 case is unchanged to within 3.6 × 10⁻¹² N - floating-point dust from V·cos 90° evaluating to 6.1 × 10⁻¹⁷·V rather than exactly zero. So the force correction is α = 0-only, as intended; what moves at α = 90 is fh,α and everything downstream of it
  • A spacing regression was introduced and removed inside this release. ST feeds its EC5 Table 8.4 minimums from a single angle argument, and that argument was resultantAngle - harmless while the angle was pinned to the entered one, since the two were then the same value. Separating them silently re-keyed a1, a2 and a4,t off the resultant force direction, which STS and TST both explicitly forbid in comments at the equivalent site; a4,t,min on the shipped defaults drifted 48.00 → 47.15 mm. ST now passes input.angleToGrain, matching them. Verified after the correction: every spacing minimum, every spacing check and geometryPass are byte-identical across all 193 fixtures. Nothing shipped in the intermediate state
  • The PDF was printing arithmetic that could not be true, which is how this was pinned as a defect rather than a convention. The shared ST/STS/TST report states α = arctan(|Fz| / |Fx|) against EC5 §8.5.1 and then prints the operands beside the result; with the angle pinned, an ST report at α = 0 with V = N = 10 rendered arctan(3437.5 / 3437.5) = 0.0°, and one at α = 90 with V = 0 rendered arctan(0.0 / 5000.0) = 90.0°. All three rendered cases checked now agree with their own operands to within 0.05°
  • The §8.1.4 splitting path is unchanged in behaviour. It already applied the family convention through a local V·sin α term added specifically to work around ST's decomposition; that workaround is now redundant and the check reads the bolt's own Fz, as STS and TST do. Splitting demand, applicability and pass/fail are identical on every fixture
  • Origin: this was a regression, not an original omission. ST shipped the correct decomposition and the correct resultant angle until commit bcc93c9 (11 April 2026) deleted both. That commit's subject was an EC3 plate-side bolt-shear fix; the timber-side deletion was unexplained collateral and predates the versioned changelog, so every ST result this tool has ever published carries it. The claim in v0.1.33 that ST's force angle is "the entered angle passed straight through, with no per-fastener selection to re-rank" described that defect accurately at the time and no longer holds; the argument it was supporting - that the EC3 axis fix did not move f_h - is unaffected and still verified, now by comparison with the plate checks off and on rather than by pinning the angle to 90°
  • Test coverage: the assertion in the splitting suite that recorded critFz > 7000 at α = 0 was an explicit witness to this bug and is inverted to the correct 2 195.12 N, which is the eccentricity moment's share alone. Full suite 648 passing

v0.1.38 - 2026-08-03

Improvements

  • TTM DXF drawings now carry a fastener-count note in the design basis for every pattern, as STM/STSM/TSTM always have - grid and circular previously had none, and ring had one only since v0.1.34. It names the pattern (5 x 3 grid = 15 bolt(s)) rather than rows and columns, because the two families' row/col conventions differ and each is correct for its own geometry. The count is the solver's fastener count, not rows × cols, which disagree for a ring and do not exist for a circular pattern. Drawing geometry and every calculation are unchanged.

v0.1.37 - 2026-08-03

Features

  • Show/hide password toggle on the auth screen - check a typo before submitting. UI only.

v0.1.36 - 2026-08-03

Improvements

  • The auth overlay no longer closes when you drag-select text out of a field, which was dismissing it and losing whatever had been typed. UI only.

v0.1.35 - 2026-08-03

Features

  • Ring bolt pattern selectable. STM/STSM/TSTM gain a Grid/Ring control; TTM's Grid/Circular becomes Grid/Ring/Circular. A ring is the perimeter of the rows×cols array (interior omitted) - a 5×5 ring is 16 fasteners. Domain, drawing, DXF and reports have carried it since v0.1.34; this release makes it selectable.
  • Ring is offered from 3×3 upward, greyed below with the reason on hover (an array with no interior has nothing to omit; the solver normalises such a case to a grid regardless).
  • Fix, same release: the moment configs never passed the pattern to the drawing (only TTM did) - a ring would compute, export and report as a ring while the on-screen and PDF drawings showed the full grid. Six sites now carry it. Nothing shipped in this state, as the pattern wasn't selectable before this release.
  • The ring is the arrangement all three Porteous & Kermani moment worked examples use, enabling ConnForge to reproduce their printed values through the solver rather than an adaptation. Its fastener lines have unequal counts (a 3×3 ring's outer grain-parallel lines hold 3, its middle line 2), so group effect, connection-zone shear and net section are each evaluated per line.

v0.1.34 - 2026-08-02

Corrections

  • Connection-zone shear reported a misleading working on connections where no fastener line sheds net transverse force. Where the direct-load share equals or exceeds the moment couple at every line - a single line of fasteners on the group centroid, or a shear-dominated case - the governing-line search fell back to a synthetic zero and reported the line as "none" with a moment term of 0.00 kN. The PDF then printed the F1v,vd working as 0.00 − 10.05 = 0.00 kN where the moment term was really 4.44 kN. Report text only: no stress, no utilisation and no pass/fail verdict changed, because the net force - and therefore τc,s - was correctly zero in every such case either way. Affected moment designs exported since v0.1.32 need no re-run; the printed working on those specific geometries was simply less informative than it should have been

Features

  • Ring bolt pattern for the moment configs - domain layer. boltPattern: 'grid' | 'ring' on STM, STSM and TSTM, and 'ring' added to TTM's existing pattern union. A ring is the PERIMETER of the same rows × cols envelope, from the same two pitch inputs, with the interior omitted. This is the arrangement all three Porteous & Kermani moment examples use, and it is what unblocks true book anchors for the moment family: on Ex 12.8.1's geometry the solver now reproduces the printed critical fastener - 2714.90 N per shear plane at 54.807° against the book's 2.71 kN at 54.81° - which the full 3×3 grid could not (it gives 2654.09 N at 54.06°, because the centre fastener adds nothing to the moment but still takes a ninth of the direct load). The published step-10 line force reproduces too: F1v,vd = 5774.48 N against the book's 5.7 kN
  • A ring's fastener lines have unequal counts, and every check that reads a line now handles that. On a 3×3 ring the outer grain-parallel lines hold 3 fasteners and the middle line holds 2. Line grouping is now by COORDINATE rather than by index arithmetic - the old slice(r·cols, …) and idx % cols walked a full row-major grid and, handed a ring, returned lines that do not exist without failing. Consequences now carried per line: n_b, n_ef and F1h in the group-effect row check; the hole count and net depth in the connection-zone shear; and the reported group n_ef, which is composed as a per-line sum (Eq 8.34 is not linear in n_b, so no single per-line value scales up). The governing line is now the one with the highest UTILISATION rather than the highest demand - with unequal n_b the line capacities differ, so the two questions come apart. On a uniform grid every line shares one F1h and the two orderings coincide exactly
  • A ring with fewer than 3 rows or 3 columns is normalised to a grid by the solver, because such an array has no interior to omit and the two names would otherwise describe one layout. TTM's 'circular' is deliberately NOT normalised the same way and must not be: a ring is a derived subset of the grid from the same pitches, whereas a circle is a separate generator whose rows/cols are vestigial, with its own applicable: false contract for the checks that cannot apply. The asymmetry is documented at the normalisation site
  • The EC3 plate checks are fed the fullest line on each axis for a ring - the most holes deducted from the net area, the longest tear path assumed - because net-section tension and block shear are single-section checks with no notion of which section they cut. Conservative, and identical to the grid values on any grid. Letting those two checks pick the section they actually act on is backlogged
  • No existing result moves. The 22-fixture solver baseline - the 14 pre-existing entries plus 8 new ring fixtures - is byte-identical on all 14 originals, and a separate 17-fixture comparison with the EC3 plate checks enabled moves one reported field, the line id corrected by the fix above. Splitting needed no change at all: it consumes a position-and-force list with no counts or indices, so a ring flows through it unaltered
  • UI, drawing, DXF and report support for rings follow in a later release; no control can select one yet, and the drawing layer renders a ring input as its full grid until then

v0.1.33 - 2026-08-02

Corrections

  • The EC3 steel plate checks read two of their geometric inputs off the wrong axis. Re-run any ST, STS, TST, STM, STSM or TSTM design that was run with "steel plate checks" ENABLED. Designs with that setting off are unaffected - nothing outside the EC3 block changed. The shared helper took parameters named a1, a2, nRows, nCols, a3t_steel, a4t_steel - names that state no axis - and its four callers did not agree on what they meant. ST, STS and TST passed the across-grain spacing as the along-grain one and vice versa; STM had the spacings on the right axes but the counts transposed against them. Every geometric parameter is now named for the axis it is measured on (spacingAlongGrain, spacingAcrossGrain, nBoltsAlongGrain, nLinesAcrossGrain, endDistanceAlongGrain, edgeDistanceAcrossGrain, plateDepthAcrossGrain), so the convention lives in the signature instead of in each caller's head
  • ST, STS and TST additionally fed a synthesised end distance that was neither an end nor an edge distance: (plateHeight − (rows−1)·spacingX)/2, which is the a4,t edge-distance formula with the wrong spacing substituted. It now passes the user's own a3,t end-distance input. On the shipped defaults this is the dominant change
  • Direction and magnitude - mixed, and NOT uniformly conservative. On the ST/STS/TST defaults (80 mm both ways, 2×2) block shear Rd falls from 1 484.0 kN to 1 401.4 kN, −5.6%: the previous value was over-credited, because the synthesised 110 mm end distance overstated the tear length against the true 84 mm. On a non-square grid (spacingX 120, spacingY 60, 3 rows × 2 cols) the errors ran the other way: block shear Rd +35.0% (1 315.7 → 1 776.6 kN), bolt bearing Rd +30.0% (79.4 → 103.2 kN, α_b released from a spurious 0.77 throttle to 1.0), and net-section tension Rd −4.7% (848.3 → 808.1 kN). Mirror that geometry (spacingX 60, spacingY 120) and the signs flip again: net tension +5.0%, block shear −23.7%. STM/STSM/TSTM are unchanged on any square grid - the count transposition is inert when rows = cols, which is why the Ex 12.8.1 fixture never showed it - and on non-square grids their capacities rise: on the STM defaults the across-grain plate extent corrects from 220 mm to the true 300 mm, lifting net tension Rd +33.7% and block shear Rd +14.6%; on a 1-column × 3-row grid the extent corrects from 124 mm to 294 mm, lifting them +129.7% and +67.2%
  • No pass/fail verdict flips on any fixture examined: these five checks run at well under 2% utilisation on every default, where the governing EC3 item is bolt shear (32.8% on Ex 12.8.1), which reads none of the affected parameters. The correction matters for plates that are genuinely worked hard, not for the defaults
  • Nothing outside the EC3 block moved. Verified by full-result diff across fifteen fixtures spanning all four callers, and again by a symmetric key-aware diff over thirty ST/STS/TST fixtures (five geometries × both load-to-grain angles), where 108 fields moved and every one of them was inside the EC3 block. Embedment specifically does not move: f_h,α depends only on the bolt diameter, the grade's density and k90, and the force angle to grain - in ST the last is the entered angle passed straight through, with no per-fastener selection to re-rank - and no EC3 output is fed back into the timber path. Across those fixtures nothing moved outside the EC3 block: no change to the washer diameter dw, F1ax,Rk, F2ax,Rk, Fax,Rk, the rope term, any Johansen mode, Fv,Rk, Fv,Rd, any utilisation, any spacing or splitting check, or designPass. Two regression tests hold that line - one asserts the entire result is identical with the plate checks off and on, the other pins f_h,α, the resultant angle, Fax,Rk and dw specifically. No washer or rope-effect correction is claimed or made in this release: dw = min(12·t, 4·d) takes a thickness, not a spacing, and ST's derivation of it is identical to STM's and STS's. The EC3 block reads no timber quantity and writes none
  • The result field plateWidth is renamed plateExtentAcrossGrain, which is what it always was. With the axes correct it now reconstructs the entered plate height exactly, for every caller - that identity is the regression test, and it could not hold before
  • Two limitations this does NOT fix, both now stated in the code, in the capability entry and on the assumptions page: net-section tension is driven by the axial load (along grain) while block shear is driven by the shear (across it), yet both still read the same net width, so one axis pair cannot serve both; and the plate's extent ALONG the grain is not an input to any config. Net-section tension and block shear should be read as indicative
  • Test coverage: the axis convention is now pinned from all four callers with fixtures where spacingX ≠ spacingY and rows ≠ cols, so a transposed mapping cannot pass. The previous default fixtures were degenerate in exactly that way - equal spacings in the ST family, a square grid in STM - which is how this shipped unnoticed. The (52c) solver baseline could not have caught it either: it is captured with plate checks off, and that blindness is now recorded in its header

v0.1.32 - 2026-08-02

Corrections

  • New enforced check: timber shear at the connection zone (EC5 §6.1.7, Porteous & Kermani step 10) in all four moment configs - STM, STSM, TSTM and TTM. Re-run every moment design. The check can fail a connection that previously passed, and nothing else in ConnForge was checking the timber for shear. Two stresses per timber member, both enforced. τc,s is the connection-zone stress: the bolt line furthest from the group centroid hands its whole transverse force to the timber across a section its own holes pass through, so the depth is a NET one, h − n_holes·(d + 1), with one hole per bolt ROW for a section cut across the grain - the transpose of the grain-parallel lines the group effect uses. The line force F1v,vd is the sum of the moment-induced transverse components on that line minus that line's share of the applied transverse load, floored at zero. τb,s is the ordinary member shear at the connection on the GROSS depth under the applied transverse load; only the component perpendicular to that member's grain shears it, so at load parallel to grain it is zero. Both run against fv,d = kmod·fv,k/γM,timber
  • TTM applies the pair once per member, for the same reason its row checks are paired: the grains are perpendicular, so a section normal to one member's axis runs ALONG the other's and cuts a different set of holes. The beam loses one hole per row across its depth and is sheared by V; the column one per column across its own and is sheared by the horizontal N. A failure on either member fails the design. Circular patterns define no net section through a bolt line, so τc,s is reported not applicable with the reason printed; τb,s still applies and is still enforced
  • The width b is the physical section - the single member for STM and STSM, both cheeks (2 × t) for TSTM, each member's own width for TTM - and is the same b the §8.1.4 splitting check resists the crack over, so the two checks cannot disagree about the section. This diverges from Ex 12.8.1 as printed, which uses 2·t2 for a connection with one central 72 mm member; ConnForge's physical width is exactly 2× more onerous there. Recorded on the verification page, and the printed form is reproduced as printed in the helper test so the divergence stays visible
  • NOT included, both unconservative to omit: no kcr width reduction (EC5 §6.1.7(2) with the UK NA would reduce b to kcr·b, ~0.67 for solid timber and glulam - about 1.5× on both stresses), and no check of the applied transverse load on the NET section, which on a section through the bolt line nearest the span would exceed both stresses computed here. Both are stated in the report, in the capability entry and on the assumptions page, and both are on the backlog
  • Correction to the verification record: P&K Ex 12.8.1 uses a ring of 8 bolts - a 3×3 grid with the centre omitted - not 9. The book's own printed values force it: Fh,d = 62.5 N is Hd/(nsp·nbolt) = 1000/16, and the printed Fd = 2.71 kN at α = 54.81° reproduces at 8 and not at 9 (2.65 kN at 54.06°). The centre bolt sits at r = 0, contributing nothing to Σr² or any moment term, which is why every moment quantity matched the 9-bolt reading and only the direct-load shares did not. No shipped calculation changes - ConnForge has no ring pattern (backlogged) - but the Ex 12.8.1 fixture is now labelled an ADAPTATION: its Fd, α and its 53.3% utilisation are self-computed on 9 bolts at kmod = 0.80. The book prints no utilisation percentage at all, so the 53.3% previously recorded on the verification page as "the published utilisation" was never published; on the book's own printed values (Fv,Rd = 5.58 kN per shear plane at kmod = 0.9 against Fd = 2.71 kN) the ring runs at 48.6%. That printed Fv,Rd is itself a third confirmation of the ring - it is what α = 54.81° gives, where the 9-bolt α = 54.06° gives 5.61 kN. Its step 9 anchors (nef = 2.34, F1h = 5.9 kN) survive untouched, the outer grain-parallel lines still holding 3 bolts. True moment-family book anchors are gated on ring-pattern support
  • Both published step-10 workings are reproduced through the shipped helper, where the ring can be built explicitly: Ex 12.8.1 τc,s = 0.24 and τb,s = 0.36 N/mm² (its F1v,vd computes to 5.77 kN against a printed 5.7 - a 1.3% gap consistent with the book carrying Fm,d,max to 3 s.f., which does not reach either stress; the member depth h = 290 mm is provisional, inferred from the two printed stresses, which force it into 287-295 mm). Ex 12.8.3 D = 114 150 mm², F1v,vd = 7.10 kN (the printed 7.11 follows from the book rounding D to 1.14 × 10⁵), τc,s = 0.61 and τd = 1.08 N/mm². The through-solver pins are labelled characterisation, not anchors, and become anchors when ring patterns land
  • Characteristic shear strength fv,k was added to the shared timber grade catalogue (EN 338:2016 Tables 1 & 3, EN 14080:2013 Table 5 - 3.5 for every glulam class, 3.2-4.0 across C16-C40, 3.9-4.8 across D30-D60). The ledger keeps its own older table, which differs at D60 (5.3 there, 4.8 here); the two are not yet merged and the ledger is unaffected by this release
  • No capacity, force, embedment, rope-effect, splitting, nef, spacing or geometry quantity changed. Verified field by field against a baseline captured from the previous solvers across fourteen fixtures - the STM and TTM defaults, the Ex 12.8.1 geometry at two durations, all three STM sub-configurations, load parallel and perpendicular to grain, a dowelled glulam case, both TTM sub-configurations, a circular pattern and an asymmetric two-grade grid: every pre-existing field is identical. That baseline is now a committed regression fence
  • Report: both the STM/STSM/TSTM and the TTM reports carry a new "Timber Shear at the Connection" section - the net-depth working spelled out, F1v,vd shown as moment minus direct share, and both stresses against fv,d with PASS/FAIL; TTM shows one pair of rows per member and N/A for a circular pattern's net check. The condensed report style carries both stresses in its results summary

v0.1.31 - 2026-08-02

Corrections

  • New enforced check: grain-parallel row checks for TTM (EC5 §8.5.1.1(4) group effect, Porteous & Kermani step 9), one per member. Re-run every T|T|T moment design - the check can fail a connection that previously passed. This completes the moment family; STM, STSM and TSTM gained the equivalent check in v0.1.30. TTM needed a different shape because a T|T|T connection joins two members whose grains are perpendicular: the same physical line of bolts is a grain-parallel line for one member and a grain-perpendicular one for the other, so a single check cannot cover both. Each member is now reduced on its own axis, with its own bolt count, its own a1 and its own fh,0,k from that member's grade - the column member (grain vertical) on lines of rows bolts at a1 = the vertical spacing, checked on the vertical force component; the beam member (grain horizontal) on lines of cols bolts at a1 = the horizontal spacing, checked on the horizontal component. F1v,Rk,a for each is the governing Johansen mode at the force direction that puts that member at 0° to grain, which - the grains being perpendicular - puts the other at 90°, so one capacity evaluation serves each check consistently. A failure on either member fails the design, mirroring the paired §8.1.4 splitting checks
  • The two members are genuinely independent, and either can govern. On a 4-row × 2-column grid at 100 mm vertical and 70 mm horizontal spacing, the column member is reduced to nef = 3.12 of 4 (a factor of 0.779) while the beam member is reduced to 1.53 of 2 (0.764), and the beam check runs at 96% utilisation where the column check sits at 24%. Connections with few bolts per line in one direction at tight spacing in that direction are the most exposed, and the exposure is not visible from the per-bolt utilisation: the worked case above fails the beam row check at 116% while the critical bolt is at 80% and both splitting checks pass
  • Circular bolt patterns take no row check. The bolts form no lines parallel to either grain, so Eq 8.34 has no row to reduce. Both checks are reported as not applicable with that reason printed, and neither can fail a design - consistent with the long-standing nef = n treatment for circular patterns, which is unchanged
  • No capacity, force, embedment, rope-effect, splitting, spacing or geometry quantity changed. Verified field by field across five TTM fixtures - the grid and circular defaults, both sub-configurations, an asymmetric two-grade grid and a splitting-smoke geometry: every field is identical. Unlike v0.1.30, the reported nef does not move either, because TTM never carried the load-angle exemption that release removed - it has no load-to-grain angle input, taking its grain directions from the sub-configuration instead. The only new behaviour is the row checks themselves and the designs they fail
  • Report: the "reported for information - NOT applied" box introduced in v0.1.28 is superseded and removed from the TTM report. It now carries a Group Effect - Grain-Parallel Row Checks section with one row per member, each showing the line (nb @ a1), nef and the nef/nb factor, FH,a, F1h with utilisation, and a PASS/FAIL status; circular patterns show both rows as N/A above the stated reason. The condensed report style carries both check rows in its results summary

v0.1.30 - 2026-08-02

Corrections

  • New enforced check: the grain-parallel row check for the moment configs STM, STSM and TSTM (EC5 §8.5.1.1(4) group effect, Porteous & Kermani step 9). Re-run every moment design in these three configurations - the check can fail a connection that previously passed. The per-bolt check these configs have always performed resolves each bolt's resultant against the capacity at its own angle to grain, and carries no group effect at all; nef was computed and printed but never applied. The row check supplies it: on each grain-parallel line - a row of cols bolts at a1 = the along-grain spacing - the grain-parallel force component per bolt per shear plane FH,a is checked against F1h = (nef/nb) × F1v,Rk,a × kmod/γM, with F1v,Rk,a the governing Johansen mode evaluated at fh,0,k. The worst line governs and a failure fails the design. On Ex 12.8.1's geometry (3 bolts per line at a1 = 90 mm, M12) the group factor nef/nb is 0.781 - the line capacity is reduced by roughly a fifth. Connections whose bolt forces are grain-parallel dominated, and those with many bolts per line at tight along-grain spacing, are the most exposed; a connection at 80% per-bolt utilisation can exceed 100% on the row check
  • The Eq 8.35 exemption that suppressed nef whenever the load was not parallel to grain has been removed from these configs. It does not hold for a moment connection: the moment produces a grain-parallel force on every bolt offset across the grain, whatever the direction of the applied shear. On the Ex 12.8.1 fixture, entered at 90° to grain, 3004 N of the critical bolt's 3115 N grain-parallel component is moment-induced - that connection previously carried no group reduction whatsoever. Designs entered at 90° to grain are therefore the most likely to change. The reported nef on that fixture moves from 9.00 (unreduced) to 7.03
  • Ex 12.8.1's step 9 is now reproduced through the solver: nef = 2.34 and F1h = 5.9 kN, the latter at the short-term kmod = 0.9 the book works that step at. One deliberate divergence is recorded on the verification page: the book divides the direct axial load by the bolts in one row while dividing the moment term across the whole group, reaching FH,a = 1.67 kN where ConnForge's consistent whole-group divisor (following Ex 12.8.3) gives 1.56 kN. The difference is 111 N per bolt per shear plane on that example, in the book's unconservative direction
  • No capacity, force, embedment, rope-effect, splitting, spacing or steel-plate quantity changed. Verified field by field on the Ex 12.8.1 bolt, dowel and short-term fixtures, the three config defaults and a 5×5 TSTM: the only value that moves outside the new row-check fields is the reported nef at load angles other than 0°, which is the exemption removal above
  • TTM is not covered by this release and still reports nef without applying it. Its two members carry perpendicular grain, so each needs its own line, nef and embedment basis, and circular patterns have no grain-parallel lines at all. A group-effect reduction on a TTM connection remains the designer's to apply
  • Report: the "reported for information - NOT applied" box introduced in v0.1.28 is superseded and removed. The moment reports now carry a Group Effect - Grain-Parallel Row Check section showing nef, the nef/nb factor, F1v,Rk,a, F1h, FH,a, the governing line and a PASS/FAIL row. The condensed report style carries the check row in its results summary

v0.1.29 - 2026-08-02

Corrections

  • SUPERSEDED BY v0.1.43 - the spacing change in this release was wrong, and its re-run advice is withdrawn. Read the v0.1.43 entry for the behaviour that is correct. This bullet is left describing what v0.1.29 DID, because releases v0.1.29 through v0.1.42 computed it and reports stamped with those versions carry it. What it did: it removed the a1/a2/a3,t/a4,t spacing-axis swap from the moment configs, pinning a1 to spacingX at every angle and orientation, on the reasoning below - that the solvers work in a fixed grain frame in which only the load rotates. It further instructed re-running designs at column + 90° or beam + 0° because a1 had supposedly been under-required there; that advice pointed the wrong way and is replaced by v0.1.43's, which tightens the opposite axis. The original reasoning, as published: "These solvers work in a fixed grain frame - x is the grain axis and z is perpendicular to it at every load angle - as their force path, their §8.1.4 splitting check and the Porteous & Kermani Ex 12.8.1 anchor all require." Two blocks did not follow it: the spacing checks and the nef calculation both assumed the grain rotated with angleToGrain and with the drawing orientation. Spacing minimums were assigned to the wrong axes at the two combinations away from each view's default angle - column orientation at 90° to grain, and beam orientation at 0°. At those combinations a1 (parallel to grain, 5d) and a3,t (loaded end, max(7d, 80 mm)) were UNDER-required - a1 was checked at the a2 value of 4d, and a3,t at 4d - while a2 (perpendicular, 4d) was over-required at the a1 value and a4,t was over-required at max(7d, 80 mm) instead of the perpendicular-edge formula. For M12 bolts that is a1 checked at 48 mm instead of 60 mm and a3,t at 48 mm instead of 84 mm. Re-run any moment design entered at column orientation with 90° to grain, or beam orientation with 0° to grain: a connection that passed its geometry checks may now fail on a1 or a3,t, and one that failed on a2 may now pass. Designs at column + 0° or beam + 90° - the two default combinations, which include the Ex 12.8.1 class - are unaffected: every spacing minimum there was already correct
  • nef now reads Eq 8.34 on the grain-parallel axis. The reduced line is a row of cols fasteners at a1 = spacingX, with rows such lines unreduced between them; previously it reduced rows at spacingY, which is the across-grain axis. nef remains reported-for-information in the moment configs and still does not reach the pass/fail result, so this changes no design outcome - it corrects the number printed in the report and prepares the value for the row check that will apply it. The Eq 8.35 exemption at load angles other than 0° is unchanged in this release and is addressed with that row check
  • No capacity, force, embedment, rope-effect, splitting or steel-plate quantity changed. The Ex 12.8.1 bolt and dowel anchor fixtures return identical values for every asserted field, including the critical bolt at 54.1°, Fv,Rk = 16.19 kN, Fv,Rd = 9.96 kN, the 53.3% utilisation, and both geometryPass and designPass; only their reported spacing minimums move, and they still pass

v0.1.28 - 2026-08-02

Improvements

  • Documentation: the moment configs (STM, STSM, TSTM, TTM) compute and print an effective fastener count nef, but that value has never been applied to their design result - the check is the critical bolt from the polar moment distribution (Fd / Fv,Rd) plus the §8.1.4 splitting check on each timber member, with no group-effect reduction. The reports previously printed nef alongside the utilisation with nothing to distinguish them, which could be read as though nef governed. The nef section of every moment report now states, in the section itself, that the value is reported for information only and is not applied; the same statement is on the assumptions page and in the capabilities list, which now scopes nef as applied in the lateral configs (ST, STS, TST, TT, TTT - with linear interpolation on load-to-grain angle in TT and TTT) and reported-only in the moment configs. Presentation only - no calculation changed, no result changed, and no previously issued moment design is affected. Designers who need a group-effect reduction on a moment connection must still apply it separately
  • The moment reports and the assumptions page also now state that nef in the moment configs is evaluated at the angle as entered - Eq 8.34 at 0° to grain, nef = n at every other angle, with no interpolation between them. This was already the behaviour and remains unchanged; it was previously undocumented

v0.1.27 - 2026-08-01

Improvements

  • Documentation: the assumptions page now lists axial withdrawal capacity (EC5 §8.3.2 Eq 8.23/8.24 for nails, §8.7.2 Eq 8.38/8.39 for screws) as a check performed by the standalone nail and screw calculators - it was computed and reported but never stated in the capabilities list - and records two scope limits on it. First, withdrawal uses the full embedded pointside penetration with no deduction for the tapered point, matching the Porteous & Kermani reading of EN 1995-1-1:2004; second-generation EC5 (prEN 1995-1-1) prescribes a point-length deduction which is not applied here, so withdrawal capacities are higher than the second-generation rule would give, proportionally more so at shallow penetrations. Second, threaded nails are modelled as threaded over the full embedded length (there is no thread-length input), whereas §8.3.2(2) transmits axial load through the threaded part only. Documentation only - no calculation changes, no results affected

v0.1.26 - 2026-08-01

Features

  • Splitting capacity perpendicular to grain (EC5 §8.1.4, Eq 8.4) is now computed AND enforced for the five lateral configs - ST, STS, TST, TT and TTT. Previously it was computed for the moment configs only, and v0.1.25 documented the gap; that gap is now closed. Every timber member of a lateral connection is checked on its own grain direction, both potentially-loaded edges are evaluated, and a splitting failure fails the design. Re-run any lateral design with a perpendicular-to-grain load component (angle to grain greater than 0°): a connection that passed before may now fail on splitting. Designs at exactly 0° to grain are unaffected - the member has no perpendicular-to-grain edge on the checked axis there, so the check is reported as not applicable
  • F90,Ed is the perpendicular-to-grain force the fastener group delivers toward the checked edge: the full V·sinα for a single fastener row, and roughly half of it for a symmetric multi-row group. Where a member terminates at the connection (a beam-end detail), §8.1.4's Fv,Ed can approach the whole shear on one side - that case is not covered and remains the designer's to check. The eccentricity moment My,ad = −V·ex is included in the fastener forces; on a symmetric grid its contribution cancels exactly, and matters only once large enough to reverse a fastener's force
  • The T|T|T capacity path is anchored to a published worked example: Porteous & Kermani, "Structural Timber Design to Eurocode 5", Example 10.13.3 §6 - b = 50 mm, he = 75 mm, h = 150 mm, kmod = 0.80, γM = 1.30 - reproduced through the solver as F90,Rd = 5.28 kN. This anchors the capacity side; the F90,Ed demand side and the choice of which fasteners load a given edge are not covered by that example

v0.1.25 - 2026-07-31

Improvements

  • Documentation: the assumptions page now states explicitly that splitting capacity perpendicular to grain (EC5 §8.1.4, Eq 8.4) is computed for the MOMENT configs only (STM, STSM, TSTM, TTM) and is NOT computed for the lateral configs (ST, STS, TST, TT, TTT); where a lateral connection carries a perpendicular-to-grain load component that member check remains the designer's. The "brittle splitting risk" advisory those lateral configs emit is an edge-distance-proximity heuristic, not an Eq 8.4 check. Documentation only - no calculation changes, no results affected

v0.1.24 - 2026-07-31

Features

  • Staple calculator (/single/staple) - lateral Johansen capacity per leg (nail rules per §8.4(1), embedment Eq 8.15 / 8.20 / 8.22), the §8.4(5) crown-angle factor converting per-leg to per-staple capacity (two legs, ×0.7 when the crown is within 30° of the grain), yield moment Eq 8.29 (A2:2014, 150·d³) on the derived leg diameter d = √(b₁·b₂), Table 8.3 minimum spacings, §8.4(3) crown-width and penetration checks, per-duration design values and PDF report. Lateral only - §8.4 provides no withdrawal model, so Fax,Rk = 0 and the rope effect is zero

v0.1.23 - 2026-07-23

Corrections

  • Corrected in a July 17 update, previously unannounced: nef group-effect reduction in TT/TTT was applied along the wrong axis at 0° load-to-grain, up to ~7% unconservative on bolt grids with more rows than columns. Re-run TT/TTT designs with asymmetric grids created before 17 July 2026.
  • Corrected the nef group-effect reduction in TT (T|T) and TTT (T|T|T) at intermediate load-to-grain angles: a connection loaded between 0° and 90° to the grain previously received no group reduction at all (nef = n), overstating group capacity - the shortfall is largest near 0°. nef is now linearly interpolated between the parallel-to-grain value (EC5 Eq 8.34) and n per EC5 §8.5.1.1(4). Re-run any TT/TTT design with a load-to-grain angle strictly between 0° and 90°; connections at exactly 0° or 90° are unaffected

v0.1.22 - 2026-07-23

Features

  • Improved in-app feedback options.

v0.1.21 - 2026-07-22

Improvements

  • C18 and C22 timber grades are now available in timber-to-timber configurations

v0.1.20 - 2026-07-22

Improvements

  • Sitemap now reports per-page modification dates

v0.1.19 - 2026-07-21

Improvements

  • Linked documentation from the site navigation

v0.1.18 - 2026-07-21

Corrections

  • TST (T|S|T) derived the washer bearing diameter from half the outer timber thickness instead of the full member thickness. In T|S|T the steel plate is central and never contacts the timber, so the bolt head and nut bear on the outer timber member and dw = min(12·t1, 4·d) must use that member whole - as TT, TTT and TTM already did. The 4·d branch governs for any outer member thicker than 2d/3 (10.7 mm at M16), so the halved value was already correct for every realistic geometry, and the 25% rope cap (EC5 §8.2.2(2)) binds ahead of Fax,Rk in typical connections regardless: no capacity change in practice and no design needs re-running
  • STS reports printed the wrong rope contribution for outer plates between 0.5d and d thick, showing the thick-plate mode-m rope rather than a value interpolated on the same 2·(t/d) − 1 ramp as the capacity - so the printed rope could belong to a mode that does not govern, and jumped discontinuously at t = 0.5d while the capacity stayed smooth. Display value only: capacities, utilisations and pass/fail were never affected, but re-generate STS reports in that thickness band for a rope figure consistent with the printed capacity

Features

  • Added GL30c timber grade (EN 14080:2013 combined class, ρk = 390 kg/m³)

v0.1.17 - 2026-07-17

Corrections

  • nef for the steel-to-timber moment connections (STM, STSM, TSTM) was wrong in two ways: it reduced the horizontal bolt row where the grain-parallel row is vertical at 0°, and it applied the Eq 8.34 reduction at 90° where EC5 §8.5.1.1(4) Eq 8.35 gives nef = n for loads perpendicular to grain. A 2-column × 4-row M12 grid at 80 mm gave nef 6.32; correct is 5.90 at 0° (capacity drops ~7%) and 8.0 at 90° (capacity rises, the reduction should not have applied). Re-run STM/STSM/TSTM designs - capacity moves in both directions and a pass at 0° with rows > columns can turn into a fail

Improvements

  • Report prints the grain-parallel spacing as a1 in the nef derivation

v0.1.16 - 2026-07-17

Corrections

  • nef (effective number of fasteners, EC5 §8.5.1.1(4) Eq 8.34) reduced the wrong row when the load is parallel to the grain. At 0° the grain runs vertically, so the grain-parallel row is the vertical one; the solvers reduced the horizontal row instead. Affects ST, STS, TST, TT and TTT. Group capacity was overstated where rows > columns (a 2-column × 4-row M12 grid at 80 mm gave nef 6.32 against a correct 5.90, ~7% high), exact on symmetric grids, and understated where columns > rows. 90° loading is unaffected (load perpendicular to grain, nef = n). Re-run any design with an asymmetric bolt grid at 0° - capacity may drop and a pass can turn into a fail

Improvements

  • Reports now print the grain-parallel spacing as a1 in the nef derivation, so the printed formula produces the printed nef

v0.1.15 - 2026-07-17

Corrections

  • STS (S|T|S) reports printed the wrong bearing-mode formula beside the correct value - thick showed "fh,α,k · t1 · d" (which evaluates to 2× the value printed next to it), thin showed "0.4 · fh · t2 · d" (0.8×), while the solver always used the correct 0.5 · fh,2,k · t2 · d per EC5 Eq 8.12/8.13. This is a printout error, not a calculation error: no capacity, utilisation or pass/fail is affected and no design needs re-running, but a hand-check of an STS derivation wouldn't reconcile - re-generate STS reports for a correct derivation
  • Johansen yield modes were cited as "EC5 Table 8.2 / 8.3" - those are the nail and staple spacing tables and have nothing to do with yield modes; now cited as the actual expressions (Eq 8.6/8.7 timber-timber, Eq 8.9/8.10 steel-to-timber single shear, Eq 8.11-8.13 double shear) and ST thick mode letters corrected f,g,h → c,d,e. Affects reports, the single-fastener calculators and the docs capabilities page - citations only, no values change
  • Bolt nef and the fastener-group polar-moment method cited §8.3 (the nails clause); nef now cites §8.5.1.1(4) Eq 8.34 and the polar-moment method is labelled standard elastic analysis rather than an EC5 clause - citations only, no values change
  • Two knowledge articles (dowels-in-timber-connections, bolts-vs-dowels) cited EC5 Tab 8.4 for dowel spacing minima - Table 8.4 is the bolt table, dowels are Table 8.5, so a reader following the citation would have found the bolt formula (4 + |cos α|)d instead of the dowel's (3 + 2|cos α|)d; the articles' own printed formulas were correct throughout, citation only

Improvements

  • STS reports now show the ×2 both-planes doubling explicitly (Fv,Rk = 2 × min(...)) - previously computed but not displayed

v0.1.14 - 2026-07-16

Corrections

  • STM/STSM/TSTM and TTM reports now print timber edge/end-distance advisories (a4t < EC5 min, a3t < EC5 min) - the report builder read a different bucket than the solver filled, so these were computed but silently dropped. A moment-connection report issued before this version may have shown sub-minimum edge or end distances with no advisory; re-generate affected moment-connection reports to see them
  • Overall PASS badge now gated on internal integrity errors - a connection whose governing Fv,Rk contradicts its own Johansen modes can no longer display PASS. These invariants are unreachable from valid input; defensive only, no known case affected

Improvements

  • Fv,Rk integrity invariants (endpoint ≤ each Johansen mode) added to TT/TTT/TTM - ST/STS/TST already had them
  • High-utilisation advisory no longer printed twice in STM/TTM reports

v0.1.13 - 2026-07-16

Features

  • Knowledge-article equations now render as typeset maths via KaTeX - previously shown as raw LaTeX source (e.g. M_{y,Rk} = 0.3 · f_u · d^{2.6}); affects the 5 articles using EquationBlock

Improvements

  • Sitemap lastmod derived per route from real content dates (frontmatter, CHANGELOG version) instead of the build date - no more false "modified today" on unchanged routes

v0.1.12 - 2026-07-16

Corrections

  • k90 in PDF reports is now grade-aware - TTM and STM/STSM/TSTM printed the softwood k90 (1.35 + 0.015·d) for D-class grades (D30-D60), and ST/TST/TT/TTT printed the correct value under a "1.35 + 0.015·d" label. Capacity always used the correct k90, so results are unchanged; re-generate any D-class report already issued
  • EC5 §8.1.4 splitting check (Eq 8.4) now performed for STM, STSM and TSTM (previously T|T only) and contributes to design pass/fail - a connection that passed before can now fail with no input change. Re-run any STM/STSM/TSTM design issued earlier

Features

  • TTM eaves moment connection (T|T) takes a different grade per member - grade1 outer plies, grade2 central. Embedment, k90, fc,90,k for washer bearing (weaker member) and §8.1.4 splitting γM evaluated per member. Saved projects migrate automatically on load

Improvements

  • Saved projects load fields added after they were saved with the current default instead of undefined, across all connection types
  • Removed the density-override control from Settings - choosing "override" had no effect on any calculation

v0.1.11 - 2026-07-06

Features

  • Dowel calculator (/single/dowel) - lateral Johansen capacity (EC5 §8.6 → §8.5.1), rope effect zero for dowels (§8.2.2(2)), Table 8.5 minimum spacings, per-duration design values

Improvements

  • Panel headside thickness clamped to each grade's practical production range (OSB 6-25, P5 6-38, plywood 6-30 mm) with an advisory; re-clamps immediately on panel-type change
  • Dowel spacing table (Table 8.5) implemented as a distinct kernel sibling - a1/a2 differ from bolts at every angle ≠ 0

v0.1.10 - 2026-07-06

Features

  • Nail calculator (/single/nail) - lateral Johansen (nail rules, Eq 8.15/8.16), axial withdrawal (Eq 8.23/8.24), rope caps per nail subtype (§8.2.2(2)), smooth-nail axial duration bar (§8.3.2(1)P)

Improvements

  • Nail type drives My,Rk (Eq 8.14: 0.30 round / 0.45 square), rope cap, axial model and penetration thresholds
  • 2/3 near-fibre-saturation reduction toggle (§8.3.2(8)); predrilling forced per §8.3.1.1(2) (ρk > 500 or d > 6 mm)
  • Added C18 grade (EN 338:2016, ρk 320)

v0.1.9 - 2026-07-06

Corrections

  • Screw pointside bearing length = embedded penetration (capacities lower where screw stops short)
  • Screw withdrawal length capped at embedded thread

Features

  • Screw & coach screw calculator (/single/screw)
  • Mobile support for single-fastener calculators

Improvements

  • Screw input by length ℓ; penetration derived
  • Predrilling enforced per §10.4.5 (hardwoods, d > 6 mm)
  • Invalid inputs show N/A without hiding output
  • Single-fastener tabs are now a type registry (bolt, screw open independently)
  • Added C22 grade (EN 338:2016)

v0.1.8 - 2026-07-06

Corrections

  • EC3 bolt shear uses ISO 898-1 stress area (~8% lower; more for 10.9)
  • Glulam ρk to EN 14080:2013 (GL24h +1.3%, GL28h +9%)

Improvements

  • Grade-catalogue integrity test (pins EN 338 / EN 14080 values)
  • /single/bolt: advisory at the 90 mm thickness cap

v0.1.7 - 2026-07-06

Corrections

  • fc,90,k to EN 338:2016 (D-class real values; softwood 2009→current)
  • ρk fixed: D40 570→550 (~3.5% lower), D60 670→700 (~4.5% higher)

v0.1.6 - 2026-07-06

Features

  • Changelog (/changelog), version-linked from the report footer

Improvements

  • Build fails if APP_VERSION has no matching changelog entry
  • PDF export overflow lock (layout-shift defence)

v0.1.5 - 2026-07-05

Corrections

  • Rope effect restricted to plastic-hinge modes (timber-timber mode c up to 20% lower)
  • Grade-aware k90 + per-grade fc,90,k in the rope-effect basis

Features

  • Bolt calculator (/single/bolt)

Improvements

  • Shared per-fastener Johansen kernel (fastenerKernel)
  • EC3 bolt-shear area uses the ISO 898-1 table
  • Single-fastener PDF report cleaned up (one row per mode)

v0.1 - 2026-04-26 (baseline, incl. pre-0.1.5 updates)

Features

  • Lateral (ST, STS, TST, TT, TTT) + moment (STM, STSM, TSTM, TTM) bolt connections; EC5 + EC3
  • Dowels (Table 8.5; rope 0%); anchorage ledger (EN 1992-4)
  • Grades GL20h-GL36h, C16-C40, D30-D60; classes 4.6-10.9; national-annex selection
  • Cloud projects, PDF + DXF export, knowledge library (/knowledge, /docs)