Every release, newest first, exactly as shipped to evaluators. Nothing here is planned — if it’s listed, it exists and is covered by the test suite.
A new subscription edition joins the licence file (purely additive — every licence already issued keeps its exact behaviour). A subscription is judged against time, not build date: while it runs, every current build works fully, offline, and inside the last 30 days the licence chip warns with days remaining. When it ends, the app switches to the watermarked evaluation mode — every project still opens, nothing is deleted, everything already exported stays valid — and installing a renewed licence file restores full access instantly, offline. Rolling the system clock back does not resurrect an expired subscription. Paid modules ride the subscription and can carry their own end date. Ten new backend tests and four new frontend tests cover the term boundaries, the clock guard and the expiry states; suite now 369.
Candidates become designs only by your explicit hand. The sandbox shows the current design against a candidate — both actually solved — with each changed parameter as current → candidate. Acceptance is one canonical, undoable commit: it applies the parameters, records the acceptance in the project file, and correctly marks simulation results stale. One Ctrl+Z reverts everything, and the browser test presses it to prove it. An infeasible candidate's Accept stays disabled, with the reason.
DROPLET LAB publishes a droplet-evaluation capability through the module registry; "hit a target droplet size" becomes an ASSAYFORGE objective scored by the validated model. A candidate the model refuses to predict is marked infeasible with the model's own explanation — never ranked on an invented number — and with DROPLET LAB unlicensed the engine refuses outright rather than substituting its own droplet physics. Reference test: target 210 µm plugs → the engine finds the 100 µm channel exactly.
Deterministic-grid search over a study's allow-listed variables: bounded (hard cap 500 evaluations), byte-for-byte reproducible, and with zero physics of its own — every candidate is the full project solved by the core solver, and a test re-solves candidates by hand to one part in a million. Hard constraints reject outright and an infeasible candidate can never outrank a feasible one. Validated by a found optimum: on the four-outlet flow balancer the engine must rank the known symmetric design first, at 0.00% outlet variation, or the release doesn't ship.
A stated vocabulary — balance the outlets, hit a target flow, minimise pressure; max pressure, min/max width, max Reynolds — where every entry names the solver quantity it is evaluated against. The editors render from the vocabulary itself, so UI and validator cannot drift. Validation is project-aware: flow balance demands real outlets, targets must name real objects, and a study without an objective says plainly that the engine will refuse it.
Droplet performance and manufacturing feasibility, side by side: the designed generator is checked against the FABRIX process minimums through the module registry — a 50 µm dispersed arm against a 75 µm CNC floor reads NOT MANUFACTURABLE with both numbers. The process's own tolerance figure prefills the robustness study. Without FABRIX, predictions run unchanged and the panel says why no check appears.
Fabrication tolerance → droplet variability, through Fluidraft's canonical tolerance conventions: designed 100 µm ± 5 µm → plug 210 µm, range 195–227 µm. Depth varies only when you state a depth tolerance; samples that leave the model's domain are counted and excluded, never extrapolated; and the band is explicitly not a yield figure.
Bounded 1D sweeps and the Qc × Qd regime map — every point one canonical model evaluation, out-of-domain points shown as such with no number attached. Grids are hard-capped in the domain layer; results export as CSV with the validity column.
Assign phases with traceable properties (your measured interfacial value wins; the cited pair library is labelled indicative; an unknown pair stays unknown), set the flows, and the answer leads with MODEL STATUS. Two significant figures on screen — ≈ 210 µm, never false precision — and every run persists as the project's droplet system.
The Garstecki T-junction model is validated by automated test against the coefficient band an independent published study fitted to the original experimental data (α = 1.13 ± 0.16 — Nekouei & Vanapalli, Phys. Fluids 2017; primary source Garstecki et al., Lab Chip 2006), plus two mandatory out-of-domain cases that must refuse to answer. Only because that gate passed does the prediction API exist.
Pair-interfacial properties with one strict rule (measured value → cited library → explicitly unknown, never invented); dimensionless utilities with exact definitions; the model registry with five machine-readable validity states; the T-junction component gains junction angle and independent arm depth with defaults that reproduce the previous geometry to the nanometre; and a geometry-extraction service that both the workspace and the optimiser consume.
ASSAYFORGE (Module 002) and DROPLET LAB (Module 003) register through the same module system FABRIX introduced — each independently licensed, each honestly locked when absent, each carrying its mark on its own launcher. The module registry gains capabilities, so modules compose without ever importing each other (enforced by test); the right-panel tab strip gets a dedicated plug-in row that never clips a module's name; and DROPLET LAB ships with a written audit of the droplet science Fluidraft already carried. The variables system (v1.3.5) makes studies editable: an allow-list with bounds, validated against the real project.
Module 001 is finished. This release makes the paid module sellable without changing anything for anyone who already holds a licence.
.fldlic may now carry an entitlements map (core, fabrix, …). Every licence issued before this release keeps verifying and resolves to core only — zero breakage. Module update windows are independent of the core window, in both directions.Test state: 185 backend + 19 gateway + 45 frontend unit + Playwright E2E including the complete FABRIX workflow, on the app and the offline demo.
One zip for the shop, assembled from exporters Fluidraft already ships — nothing redrawn, nothing converted through a lower-quality intermediate (tests compare the packaged geometry to the core exporters byte for byte).
01_GEOMETRY (SVG / DXF / GDSII / STEP), 02_SPECIFICATION (flattened device spec + the canonical project file), 03_DFM (self-contained HTML manufacturing report + findings CSV), 04_TOLERANCE (results + settings), 05_METADATA (full rule profile + reproducibility stamp), with MANIFEST.json and a README at the root.The question this release answers: the shop will miss nominal by a few microns — does the device still behave?
FABRIX now looks like what it is: a product inside Fluidraft. A branded launcher carrying the FABRIX mark sits next to the FLUIDRAFT wordmark in the toolbar; the same mark appears on the module tab, the workspace header and the activation panel. Launchers render generically from the module registry — the toolbar names no module, so future modules get the same treatment by supplying an icon. The mark ships embedded, so it survives the app, the single-file demo and the evaluation kit offline.
The module starts earning its place: can this design be made with the process you chose, and what exactly is in the way?
fabrix_dfm_reference): 62 µm throat, 50 µm wall gap, 45 µm bend radius against CNC thermoplastic — so the engine is never validated only on designs that pass. Process profiles gained versioned metadata and an indicative tolerance figure, backward-compatibly.The architecture release: first-party modules, compiled into the product and activated by entitlement — FABRIX first, with the registry built so later modules need no changes to the app shell.
GET /api/modules lists them with live entitlement state; the web app renders module tabs and panels generically.Physical honesty drove this release: a real microfluidic chip is ONE continuous cavity — component boundaries exist in the CAD, not in the glass. The 3D view now renders it that way.
Note: the view STL export mirrors the display mesh, so at connected ports it is open-ended by design; fabrication exports (GDSII, DXF, STEP, STL from the solid model) are unaffected.
Close-up inspection (user-reported, third pass) exposed three remaining construction defects, all now fixed at the geometry level:
transparent even at 100% opacity, which forced them into the blended render pass — interior and back faces showed through as dark grey triangular flaps near junctions. Bodies are now truly opaque whenever the style's opacity is 1 (Drafting/Clay/Tech); Holo and flow playback keep their translucency.No solver, export or API changes; canonical geometry is untouched — these are pure view-construction fixes, verified against close-zoom screenshots of the reported scenes.
Geometry (user-reported, second pass):
round_corners() is now ported to the demo engine verbatim (same clamping, arcs at 28 segments/90°), so demo canonical centerlines match the backend's.Brand: the division identity is now ALIANTICO RESEARCH SYSTEMS with the tagline "Scientific Software for Research & Engineering" — applied to the boot screen, fluidraft.com and the division hub site.
Close inspection of canonical-mode channels exposed two real construction defects in the 3D sweeps — geometry bugs, not styling:
Both fixes apply to all three cross-section profiles (rect/dome/circle) and to every render style; Canonical remains the exact solver polyline.
The Fluidraft logo (the F carrying its own microchannel) becomes the product icon and favicon: inlined as a data URI in both the app and the single-file demo (which therefore stays fully offline), with a reversed variant for dark surfaces. fluidraft.com gains the mark in the navigation and hero, plus a full favicon set (ICO + PNG + apple-touch).
A fourth viewport style alongside Drafting/Clay/Holo, bringing the visual language of plant-CAD renders to Fluidraft's true geometry — and nothing but the true geometry (no invented flanges or hardware):
The two loudest "does not do" lines shrink — honestly, with real implementations, not copy edits:
A real B-Rep kernel (ADR-035). STEP export on OpenCascade: rectangular processes as exact footprint prisms (holes honored), circular and dome processes as true profile sweeps along the channel centerlines — the same process-true cross-sections the solver uses. Round-trip verified with the kernel itself (write → read → count solids). Optional heavy dependency (requirements-step.txt); without it the endpoint answers 501 with install guidance, never a fake file. STEP joins the toolbar export menu.
Distributed 1D transients (ADR-036). Each channel becomes an R-C transmission line (~100 µm segments): pressure events now propagate ALONG channels, settle times are position-dependent, and P(x,t) is reported and plotted. The Lab's Transient card gains a Lumped 0D / Distributed 1D model toggle. Steady limits provably match the exact steady solver; agreement with the 0D model in its own regime is tested.
Droplet generator prediction (ADR-037). In the squeezing regime, droplet T-junctions now predict plug length, volume, generation frequency and spacing from the Garstecki et al. (2006) scaling — labeled a reduced-order correlation, and WITHHELD with a stated reason outside its validity envelope rather than extrapolated. Shown in the results panel next to the regime estimate; the single-phase caveat never leaves.
OpenFOAM case export — the honest CFD bridge. When a design does need field CFD, Fluidraft now hands off instead of walling off: one click exports a meshing-ready case (true fluid-domain STL from the B-Rep solids, fitted blockMesh, snappyHexMesh with locationInMesh inside a real channel, transportProperties from the actual case fluid, and a README that lists the solved per-port velocities as boundary anchors and names the one remaining manual step — patch splitting — instead of hiding it).
Test state: backend 110 (+10: STEP round-trips and process-true profiles, 1D transient consistency, droplet correlation exactness and withholding, OpenFOAM case physics), gateway 19, frontend unit 16, 3 Playwright suites.
Aliantico's existing Stripe account (Managed Payments, proven on the Chromastore launch) becomes Fluidraft's checkout rail. The one piece Stripe lacks natively — per-customer licence issuance — now lives in the gateway (services/ai-gateway/stripe_fulfillment.py):
checkout.session.completed webhook → Stripe-Signature verified (raw HMAC, no SDK; timestamp tolerance; idempotent by event id) → a signed .fldlic is issued server-side and served via a 24-hour download link.invoice.paid / subscription_cycle) reissue with updatesUntil extended one year from max(today, previous window) — renewing early never costs entitlement days.FLUIDRAFT_SIGNING_KEY_FILE (environment only — like the company Anthropic key, never in the repo or any kit). Unconfigured deployments 503 with the exact reason./admin/product-licenses lists issued product licences (admin token); .env.example and compose document the two new variables.Fluidraft becomes a licensable product, with the Aliantico group's annual-licence promise implemented as the mechanism itself:
.fldlic): licensee, edition, seats, updatesUntil. No activation server, no phone-home, no telemetry — verification is fully offline (public key in the app, private key held by Aliantico only, never in any kit).tools/license_issuer.py): gen-keys / issue / verify — a licence in one command. docs/LICENSING.md documents the model and its honestly-stated threat model; EULA-DRAFT.md awaits legal review.The Research Runtime splash regains its third dimension, per the original "2D front + static 3D hologram backgrounds" direction: two static isometric wireframe projections of the same Y-junction co-flow chip float behind the plot (projection base, light beam, slab wireframe, cyan/violet co-flow streams with the dashed diffusive interface, corner fiducials, 75.00 × 25.00 mm dimension callouts). Still pure SVG/CSS — no WebGL on the loader — with a slow breathing glow, hidden on narrow screens, and disabled under prefers-reduced-motion. Boot-gate contract unchanged; all suites green.
The loader is redesigned as a scientific instrument warming up, not a sci-fi splash: an annotated Y-junction co-flow device rendered as an engineering plot, with axes, dimension leaders, a pressure probe, and a live solver-convergence strip (normalized residual 1.0e+0 → 1.0e-6).
.splash-enter.armed, ENTER key, leave transition), so all three Playwright suites pass untouched; the live registry line still reports the real component count from the backend, and the demo build boots it identically offline.Rather than only *labeling* the gap between viewport and CAD kernel, this release ships the part of it that customers actually need:
Version 0.10.8 everywhere (enforced by the release-hygiene tests).
Closes every P0/P1 and the agreed P2 items from the CTO's v0.10.6 technical evaluation, in his stated order: configuration security first, then E2E coverage of the viewport and recorder, then release-package hygiene.
P0 — deployment security
docker-compose.yml no longer ships a default admin token: FLUIDRAFT_ADMIN_TOKEN is a required variable (:? — compose refuses to start without it) and FLUIDRAFT_ENV defaults to production.change-me, admin, password, …) or shorter than 16 characters disables the entire admin API with an explicit 503, and config_problems reports it. Covered by a dedicated gateway test.P1 — verification
tests/e2e/test_viewport.py (in CI): all three view styles, display modes, perspective/orthographic, section planes, board Solid/Ghost/Off, fit/actual substrate, view-cube snaps, two-point measure, dimension callouts, PNG snapshot download, and a real MP4 recorder download — run against both the full stack and the offline demo file.avc1 baseline) with WebM fallback, feature detection (button disabled where unsupported), watermark line "steady-state replay (0D/1D network) — not transient CFD" baked into every frame, and clean teardown on unmount.P2 — robustness & hygiene
__MACOSX/ .DS_Store in the tree.Deliberately deferred (tracked, not hidden): the multi-temperature fluid property editor (UI edits the single active property set; the schema already supports multiple) and the experimental Q–ΔP validation campaign on fabricated chips — the latter is the first item of the commercial roadmap and the CTO's stated gate for "validated".
Test state: 91 backend + 13 gateway + 16 frontend unit (Vitest) + 3 Playwright E2E suites (editor, interactions, viewport/recorder — the last also against the offline demo). All green on this build.