May 18, 2026
Material properties in Studio, native UCP simulation for design optimization, SimplePipeline workflow, global search endpoint
Material properties in Studio
A new Materials section in the project sidebar lets you create materials within a project and attach measured property datasets (CSV / parquet) to each one. Upload, plot, edit, re-process, replace, and delete are all wired up. The Python SDK gains read-onlyclient.material
and client.material_property_dataset sub-clients with list, get,
get_units, and get_data (returns a polars.DataFrame); the REST
surface supports signed-URL downloads, on-the-fly downsampling, and
x-range filtering. A new docs page covers the UI workflow and REST
endpoints.Native UCP simulation for design optimization
DesignObjective gained a backend="ucp" option that runs UCP protocols
natively inside the optimization loop instead of converting them first.
This preserves UCP features that the conversion dropped — dynamic loops,
conditionals, gotos, set_variable, subroutines — and avoids
per-iteration overhead. EIS steps are now rejected up front in design
optimization (with a clear error both in the frontend form and at the
backend), because the UCP backend does not yet support frequency-domain
steps; standalone simulations remain the path for EIS.SimplePipeline workflow
A new lightweight pipeline variant for configs with at most one expensive element (one data fit or one validation). The whole config runs end-to-end as a single background job instead of fanning out to child jobs. CRUD endpoints under/simple_pipelines (POST returns 202;
LIST supports filters; PATCH for name/description; cancel and delete),
plus a client.simple_pipeline SDK sub-client with create, get,
list, update, cancel, delete, and wait_for_completion.Global search API
NewGET /search endpoint performs prefix full-text + substring
search across projects, studies, simulations, models, parameterized
models, optimizations, optimization templates, experiment templates,
pipelines, cell specifications, and materials within the authenticated
organization. There is no frontend search bar in Studio yet — the
new docs page makes this explicit so you don’t go looking for one.Studio
Studio
Improvements
- Optimizations table: bulk Delete restored next to the existing
bulk Cancel action, gated by
optimization:delete, with a confirmation dialog that pluralizes correctly and per-row error toasts. - Protocol simulator: Download CSV button next to “Configure Plot” exports the full time-series plus step-level columns (cycle count, step number, protocol variables) expanded to match each time point, regardless of zoom.
- Time-series measurement plot: overlay multiple variables sharing the
same unit on either Y-axis via a
+button — unit-filtered dropdown, distinct color cycle per series, individual×to remove, and selecting a primary variable with a different unit clears incompatible extras. - ECM models now expose
Anode potential [V],Cathode potential [V], and their open-circuit counterparts so BioLogic three-electrode EWE / ECE control limits can be reproduced from a simulation. NewLFP/Li metalhalf-cell chemistry added to the parameter library and the cell configuration UI. - Hover tooltips standardized to 3 decimal places across all plots.
- EIS Nyquist plot renders as markers-only scatter (no connecting lines), with a slightly larger marker.
- Cell-spec cascade delete now batches storage-path deletion and parallelizes per-measurement folder deletes, so one transient failure doesn’t abort cleanup for the others.
- Storage downloads now retry transient errors with exponential backoff — fixes job failures on intermittent non-JSON error responses.
- A new endpoint returns the parsed contents of a job’s metadata blob, giving the Python SDK a path to large validation payloads that the legacy result endpoint could not reach.
- Simulation submission unified to a two-step pattern (parse-to-template then simulate-with-template). Removed several redundant older simulation endpoints.
- Simulation dedup: removed a session-specific identifier from the uniqueness key used to detect duplicate simulations, so the “simulation already exists” path actually triggers and duplicate rows stop accumulating.
- Measurement details: Cycles tab is visible again and the cycle
filter slider’s range is correct after the
Cycle number→Cycle countcolumn rename. - Measurements of type
propertiesorfilenow show an informational alert pointing to the details panel or the SDK instead of rendering empty time-series tabs.
Pipeline
Pipeline
Improvements
ionworks-schemais now the single validation boundary for parser inputs across the pipeline, improving consistency between the SDK’s schema classes and pipeline execution.- Standardized user-facing optimizer kwargs across all fitting
backends:
max_iterationsreplaces older per-backend names, andpopulation_sizereplacespopsizeon the differential evolution optimizer. Old names continue to work with aDeprecationWarning. - A transient protocol solver failure during differential evolution now lands on the finite-penalty path instead of killing the optimization. Protocol and configuration errors still surface as errors so static bugs remain visible.
pybamm.Experimentperiodandtemperaturenow round-trip correctly through serialization (fix shipped inpybamm 26.4.3). Experiment schemas accept the new field set (per-stepperiod,temperature,tags,description,direction,start_time,skip_ok; experiment-levelperiod,temperature,termination);durationalso accepts human-readable strings like"287 seconds".- SimplePipeline jobs run data fits in-process and now establish their own connection to the compute backend, so distributed evaluation actually fires; when that connection fails, the fit falls back to its in-process path. Legacy element-type labels are now canonicalized consistently at ingress.
Python API
Python API
Improvements
client.simple_pipelinesub-client for the new SimplePipeline workflow.client.protocol.convert(protocol, target)returns aConvertResultwithprimary_bytes,text(), andsave(dir)helpers — exports a UCP YAML protocol to a native vendor file (Maccor, Arbin, Neware, BioLogic BT-Test, or Novonix). Maccor returns any drive-cycle MWF assets alongside the primary file.client.job.get_metadata(job_id)returns the parsed contents of a job’s metadata blob, giving the SDK access to large validation payloads the legacy result endpoint could not reach.
Protocol Simulator
Protocol Simulator
Improvements
- BioLogic
.mpsparser: User Profile (drive cycle) steps are now extracted from embedded Urban Profile Tables, or from sibling.txtfiles supplied viaadditional_contentwhen the.mpslacks embedded tables. Current sign is flipped on the way in so positive represents discharge for UCP/PyBaMM. - Arbin parser rewritten to keep the step list flat with raw gotos
instead of inferring loops from backward-goto patterns. Fixes
sibling backward gotos to the same target, cross-loop goto
resolution, and digit-bearing formula labels like
F_EIS_10%_capacity_change. Pause steps emit UCP’s first-class auxiliaryPausestep. - More Arbin / Maccor step types recognized:
Arbin
Internal Resistance→Restwith aUserWarning, additional Arbin step variants mapped to their UCP types, bracketedMV_UD[n]normalised, leading-negative current expressions classified asDischarge. MaccorUser Def CYCLE <op> Ntranslated to a UCPVariableEndagainst the runtimeCYCLEalias. - Per-step overhead trimmed substantially on long protocols, speeding up simulation of protocols with many steps.
- Solver failures are now distinguished from protocol and configuration errors, which keep their original error types and gain step context.
- Real Maccor
.MWFexports that include a multi-line preamble plus a header row now parse correctly. Files containing only data rows still parse unchanged.
Skills
Skills
Improvements
- New
run-simple-pipelinesskill walks through the SimplePipeline client end-to-end. process-data: clarified thatprotocolholds test conditions that affect the electrochemical outcome (temperature, C-rate, SoC, DoD, pressure) whiletest_setupholds physical logistics (cycler model, operator, lab, channel) that do not.test_setuplives only on measurements, not on cell instances.process-data:set_step_countwith a step column is now the unambiguous default, so decreasing / repeating step ids from GITT or RPT-with-substeps work the same as monotonic ones; the sign-based fallback is reframed as a fallback for when no step column exists at all. Added a caveat for cyclers that emit duplicateTime [s]rows at step transitions.process-data: mandatory header-audit step codifies eight rules (walk every file, group by cohort × column-set, classify Standard / Auxiliary / Drop, diff reader output, preserve aux columns, keep multi-thermocouple channels separate, confirm units / sign per cohort, surface missing-temperature as a finding) and a required confirmation-report shape, so silent column drops between cycler families are caught before any standardized parquet is written.