Downloads¶
Grab the latest Kalix for your platform, or pip install it from PyPI.
Latest release
v0.4.42026-09-03
or via PyPI
pip install kalix==0.4.4- Rating tables on Storage outlets.
ds_N_outletwill now accept a table of level-flow pairs (ds_2_outlet = 80, 0, 81, 0, 81.5, 100, 82, 100) as an alternative option to the old MOL and MOL-with-capacity forms. Ratings are linarly interpolated in level and repeated levels give a step. All three forms now solve via Backward-Euler: i.e. capacity is based on the end-of-timestep level. Rating capacities must be non-decreasing and every outlet level must lie within the dimensions table. See storage. - New
expected_inflowproperty on confluence nodes can be used to control how much unregulated inflow confluences should account for when propagating orders. This is similar toexpected_inflowon inflow nodes. See confluence. - Dynamic expression improvements:
- New temporal-window functions:
moving_sum_years(x, n_years, wy_month),moving_sum_months(x, n_months),moving_sum_days(x, n_days), andminandmaxvariants of each. E.g.moving_sum_years(node.tws.diversion, 3, 7)is the total diversion over the last three water-years (starting July). See expressions. - New
infill(x, value): givesvaluewherexis NaN, otherwisex. - New
latch(x, condition, init): takes a new value ofxif and only ifconditionis true. E.g.latch(aa_hp, fn.wy_start(), 0). - Static node and account properties such as
node.my_catchment.areaandacc.user1.sizecan now be recorded or referenced. E.g.subarea_km2 = 0.05 * node.my_catchment.area.
- New temporal-window functions:
- KalixIDE plotting improvements:
- Tabs can be named. Plot tabs can be reset.
- Axis range control:
Set axis limits…on the plot's right-click menu can be used to set exact bounds. UseCopy X axis,Paste X axis,Copy Y axis, andPaste Y axisto copy ranges between plots. - The plot key can now be hidden entirely by using the show/hide button in the toolbar. The plot's right-click menu now has
Reset keywhich brings the key back to its default position. - Plot value hints are now written in natural notation (avoiding scientific notation) in most cases.
- Fixed issue whereby unticking a series while the outputs tree is filtered used to clears the plot.
- Python: fixed loading of time indexes for long runs under pandas 2.x.
Release history
v0.4.32026-08-06
- New
order_accountsproperty onregulated_user: order-authorisation accounts with debit-on-order semantics. They never supply or cap deliveries, and undelivered orders are not refunded. Uses include an "order bridge" letting users keep ordering across an accounting reset, and pure order-debit accounting schemes whenaccountsis left empty. See regulated_user. - Fixed a storage solver mass-balance bug affecting timesteps where the ds_1 order is very close to the interpolated spill. The solver now solves the release/spill crossing exactly instead of interpolating across it. See storage.
v0.4.22026-08-05
- Confluence
regulatedbranch property:regulated = <comma separated node(s)>names the upstream regulated pathways. Specifying a single branch sends all orders there, while specifying two invokesharmony_fractionto determine the fraction of orders sent to the first branch. See confluence. - New calendar functions:
is_leap_year(y),month_at(n),days_in_month_at(n)and simulation variablessim.days_in_month,sim.days_in_year,sim.is_leap. See expressions. - New account
pairconcept for modelling carryover, plus per-targetselfin RAS action arguments (self.balance,self.size,self.allocation,self.pair.*). Carryover actions can be like:set(0.9 * self.pair.balance). See accounts and[ras.*]. - Vars in ras phase:
[var.*]blocks withphase = rasrun in the ras phase interleaved with the[ras.*]sections, allowing designs such as daily evaluation and thenallocate(var.assessment.aa)as required. See vars. - Use
thisin a var definition to refer to the var's own series, e.g.my_var = this[-1,0] + 1. See vars. - New account and group results:
acc.<name>.use(water taken since the last reset). Group aggregates forsizeanduse, withsizereadable everywhere including announce-time assessments.ras.<name>.firedand.pctare now readable in expressions too. See accounts. - Routing
pwlextrapolation now uses flat extrapolation (constant final value) for mass-balance safety. Tables no longer need a huge-flow guard. See routing. - Pixie format input data:
[data]now accepts Pixie files as model inputs. Pixie is smaller and faster than CSV. KalixIDE offers.pxtfiles in[data]autocomplete and checks for the named.pxbcompanion. See[data].
v0.4.12026-07-29
- STATEFUL PYTHON API: a native
Modelclass — load, inspect, edit and run models entirely in memory, with results and mass balance returned as DataFrames. See Python. - New RAS actions
credit_fraction(x)androll_cap(n)— the latter gives a rolling n-water-year usage cap. See[ras.*]. - New
opportunistic_demandon regulated user nodes. See regulated user. - GUI stuff: live search and counter in Find; node labels can be toggled off/on in the map.
v0.4.02026-07-22
- NEW WEBSITE:
kalixproject.org - BREAKING CHANGES: I have made the following changes so that section names are consistent with referencing semantics across the model file. Sorry this is a one-time change:
[inputs]->[data]to match the referncing styledata.*.[constants]->[const]and the reference prefixc.->const..;is no longer allowed to indicate comments (please use#instead).
- WATER ACCOUNTING & RESOURCE ALLOCATION SYSTEMS!
- New
[acc.*]section declares a group of user accounts as a simple table. See[acc.*]. - New
[ras.*]section defines resource allocation system events: on this trigger, do this action, to these account groups. Triggers can be based on the calendar (start_water_year(m),start_month, …) or written as an expression; actions includeset_fraction,credit,debit, and more. The actionallocate(pct)assess resources and announces an allocation level as a percentage of entitlement for the group. See[ras.*]. - Recorders and linting for accounts and resource alloction systems.
- New
- MAJOR FUNCTIONS UPGRADE!
[fn]defines true user defined functions: write a formula once in a[fn]section and call it asfn.name(...)from any expression. Inside a function body, thethis.keyword rebinds to the calling node.[var.*]defines standalone variables: these variables live between the nodes, and are computed at their position in the model file. They are usable in any expression and recordable in[outputs].- Any expression can now be a program block
{ ... }. You can use local variables to make complex rules readable by breaking the calculation into smaller steps. - 1D and 2D tables can be defined in
[table.*]and called astable.name(x)ortable.name(x,y)from any expression. - New functions:
moving_sum/moving_mean/moving_min/moving_maxover an n-step window, andsum_since/min_since/max_since/count_since/steps_sincewhich accumulate until a reset condition. Newclamp(x, lo, hi)is simpler than nested min-max statements. Renamedavg()tomean()for technical clarity (breaking change). - New simulation flags
sim.new_day,sim.new_monthandsim.new_yearmark calendar boundaries, simplifying some expressions (e.g. "start of the water year" is nowsim.new_month && sim.month == 7). - New
assert(x)function you can use to stop a run based on a custom condition. If a valuexis zero (or NaN) the run halts immediately and tells you which statement failed, and at which timestep. - All the above is documented here.
- CALIBRATION STUFF:
- Routing params exposed to the optimiser:
pwl_tt_<i>(for PWL) andnlm_kandnlm_m(for NLM). - Storage node
existsparameter. - Rainfall weights: switched to a new Beta-corrected stick-breaking parameterisation for optimising the weights of a linear-combination rainfall input (
rf_bias+rf_d*). This is a statistically unbiased method that restores some interpretability of the parameter bounds.
- Routing params exposed to the optimiser:
- GUI STUFF:
- Faster and more usable dialogs for Open File, Open Folder, Save File. (Especially better on network drives).
- New
Insert nodeoption from the editor's context menu, or from the map context menu. - The Run Manager's outputs tree now uses checkboxes so that selection is maintained while user interacts with the tree.
- zip and unzip files directly from the file-tree context menu.
- Colours in the file tree.
- Bug fixes:
- Renaming file in file tree maintains connection to file in open tab.
v0.3.62026-07-13
- This is a preview of the big release coming in 0.4.0.
- Details T.B.A.
v0.3.52026-07-11
- Re-release of 0.3.4 with refreshed distribution packages for Windows and Linux.
- Includes all of 0.3.4's improvements: the engine performance overhaul, the faster plotting and file IO, the new dark themes, and the launch of kalixproject.org — see the 0.3.4 notes for the full list.
- Recommended upgrade for all 0.3.4 users; models and results are fully compatible.
v0.3.42026-07-07
- Kalix has a new home on the web: kalixproject.org, with the full documentation, tutorials, downloads, and live code-health and performance stats.
- A permanent speed-test suite now tracks kalix engine performance from release-to-release — performance can't regress without us seeing it.
- Major engine speed-up from a top-to-bottom performance review: leaner simulation hot loop, allocation-free expression evaluation, faster CSV and Pixie file IO, and tuned release builds. Large models load and run faster.
- Hydrology correction: Sacramento upper-zone free-water evaporation was computed incorrectly in edge circumstance.
- Model optimisations can now be stopped over CLI.
- Revamped dark themes, including the flagship "Kalix Dark". Plot colours follow the active theme.
- Plotting tool is dramatically faster (up to ~50× on flow-difference transforms, ~23× on daily aggregation).
- CSV import/export in the IDE is far quicker, and number formatting is now locale-proof. Compressed timeseries (Pixie/Gorilla) encode ~4.7× and decode ~3.2× faster in the IDE, with codec correctness fixes applied to the engine and IDE in lockstep.
- Editor and linter polish: every issue on a line is reported (not just the last), error navigation goes in line order, hover tooltips show live schema documentation, and files with Windows line endings lint identically.
- Map improvements: much faster rendering on mouse move, keyboard shortcuts for navigation, zoom anchored at the viewport centre, and cleaner click-vs-drag behaviour.
- Find/replace dialogs are now non-modal and independent per window.
pip install kalixpackaging slimmed down, ~3 or 4 MB.
v0.3.32026-07-06
- Forced releases on storage nodes: new
ds_*_force_releaseparameters let you override the ordering phase and push a specified release down a chosen outlet — useful for operational rules that aren't demand-driven. - Fixed extrapolation behaviour for loss and splitter tables, and updated the corresponding linting rules — flows beyond the table's range are now handled predictably.
- Loss tables are no longer spuriously rejected by a floating-point tolerance issue in validation.
- Storage
dimensions_fileproperty removed - please usedimensionsinstead. - The
order_constraintrenamedorder_controlfor clarity (breaking change). - New
recent foldersmenu that works likerecent files. - Several node properties that previously failed to round-trip are now preserved on save: storage
target_levelandorder_through, and unregulated_useraccount. - Smarter
kalixexecutable discovery - project folder first, then alongside the IDE itself. - Faster linting on large models. The editor now re-validates only the sections you actually changed.
v0.3.2
- Kalix now reads and writes the
res.csvresults format, so results from other modelling platforms can be loaded, plotted and compared directly. - The CSV reader now accepts single-digit day and month entries in dates.
- GR4H (the hourly variant of GR4J) is now available as an option on the GR4J node, for sub-daily rainfall-runoff modelling.
- Loaded data files (CSV, Pixie, res.csv) now collate into the same tree structure as live model runs. Res csv gets heuristic tree segmentation, so large result sets stay navigable.
- UX stuff:
- New Save All button for saving every modified tab at once.
- New "Remove all" action in the Run Manager's run tree to clear the session in one click.
- Open a terminal at any folder from the project file tree's context menu — robust and cross-platform.
- Duplicate files in the project tree with
Ctrl+drag. - Undo/redo now behaves correctly per tab, with each editor keeping its own history.
- Context menus made more consistent.
- Sharper toolbar logo rendering on high-resolution displays.
v0.3.1
- Plot lines now break at missing data instead of drawing a false connection across the gap. A new
Missing Datacontext menu on the plot lets you choose how gaps are treated per tab. - Aggregation now respects missing data, and statistics handle gappy series consistently.
- Input file aliasing: give a data file a name and use that name everywhere. Aliases can be created, renamed and managed from the editor's context menu.
- The IDE now also searches the open project folder for a
kalixengine executable, making project-local engine versions easy to use. - UX stuff:
- Rename files directly from the IDE.
- Reorder editor tabs by drag and drop.
- Drop any text file onto the IDE to open it in a tab — no longer limited to
.inifiles. - Reveal input and tree files in your system file manager.
- Duplicate files straight from the project file tree.
- Hover tooltips on parameters in the editor.
v0.3.0
- New GR4J recorders for the internal production and routing stores.
- UI enhancements:
- Drag items from the data tree straight out of the main window — into the Run Manager, your desktop or other applications.
- Close editor tabs with a middle-click.
- New keyboard shortcuts for everyday actions: Save (
Ctrl+S), Save As (Ctrl+Shift+S), New Model, Open File (Ctrl+O), Open Folder (Ctrl+Shift+O), Open Preferences (Ctrl+,).
- File dialogs now show hidden files and folders by default.
- Menu bar text now follows the active theme, fixing hard-to-read menus on some colour schemes.
- The full model regression suite now runs automatically on GitHub servers on every push (tested = Windows, Linux, macOS).
v0.2.9
v0.2.8
- File tree (NEW!!!)
- Compare files
- Compare files to active editor
- Move, copy, delete, right in the file tree
- Copy file paths (absolute, relative, trailhead-relative to your model file)
- Have multiple models (or files) open at once and switch between them seamlessly.
- Icon set migrated to FA6.
- Kalix tutorials published.
v0.2.6
- Routing node now supports the "Nonlinear Muskingum" (
nlm) model. - Linting performance improvements.
- Custom line style extended to the envelope drawing mode used when data density is too high. Line styles are now visible on exceedance plots after this change.
v0.2.5
- Custom colour palettes (colour and style) in the plotting tool. Custom palettes are automatically saved in your preferences file. The association between data and line can be chosen by the user, and consistency is maintained across tabs.
- Performance and reliability: Stats tab performance improved by better mask design, and shared prep work across stats. Revised approach to series tracking under the hood, eliminating minor bugs related to series selection.
- Changed optimisation UX so that multiple new configs may be prepared simultaneously before starting the runs. Cleaned up optimisation result presentation.
- Table View (
ctrl+t) is now available for the "rain" property, making it easier to copy rainfall weighting coefficients from model to report. - Loss node was previously saving the "table" property back out after optimisation finished even if it was not supplied in the original model. Fixed now.
- Kalix can now be installed as a Python package (
pip install kalix) directly from PyPI. The package currently supports:- loading and running models
- reading and writing Pixie compressed timeseries datasets
- Automatic unit testing in the cloud (Windows, Linux, macOS) on every repository push.
- Automatic deployment (Windows, Linux only) upon a new tag starting with "v", e.g. "v0.2.5".
v0.2.4
- Resource management:
- Accounts [BETA]
- User accounts form the basis of resource management systems.
- Accounts are implicitly created when mentioned in user nodes (
regulated_userorunregulated_user). They are given any name you like, e.g. "brwss_0031". Multiple users may refer to the same account. - Model results associated with accounts are recordable using the prefix "acc.", e.g.
acc.brwss_0031.balance.
- Accounts [BETA]
- Support for non-daily timesteps (only required minor tweaks):
- CSV I/O format clarification
- Internal logic for handling start and end timestamps
- Performance improvements:
- Internal function engine now caches function pointers rather than switching in the hot path (previously the execution tree matched on function name during evaluation).
- Support for compressed data on STDIO for faster loading of very long model result sets (now on by default). This uses Kalix's Gorilla-based compression algorithm.
- Optimisation enhancements:
- Multi-objective optimisation enabled by arbitrary combination of fitness terms. The modeller defines individual fitness terms and then combines them as they like.
- Model parameter expressions are now full-blown functions, allowing modellers to articulate more complex relationships between optimisable parameters.
v0.2.3
- User-interface stuff:
- The new Parameter Sheet tool (Tools > Parameter Sheet).
- Plotting — lasso zoom by shift + click and drag.
- Plotting — undo/redo on plots!
- Plotting — new mask button for filtering to overlapping data.
- Plotting — added 2 new plot types, "Residual Mass" and "Double Mass".
- Plotting — different plot tabs now have independent datasets, so changing the data selection in one doesn't affect the other.
- Reference data using Trailhead Paths! This is a new type of relative path that starts with a "^" symbol meaning "the current folder or some parent folder". For example,
^/data/evap.csvwill match data in./data/evap.csv,../data/evap.csv,../../data/evap.csv, etc, whichever comes first. Trailhead paths let models reference data relative to some parent location without having to know how far below the parent we are. - Other minor things:
- Tweaked storage algorithm to avoid floating-point noise in storage release values.
- Routing node performance improvements and bugfix for
x=1. - Ordering through 100% loss now results in 0 order.
v0.2.2
- User-interface stuff:
- Autocomplete added to editor context menu.
- New "Copy Location" item in map context menu.
- New "Go to Node Definition" in editor context menu when clicking on node names in links.
- Linting rules expanded to handle comments on
TYPE,LOC,DS_1lines. - Linting rules now see
[inputs]and[outputs]sections as optional. - Fixed sticky timeseries selection in Run Manager when filtering.
- Dynamic expression improvements:
- New "this" syntax allows functions to refer to the current node more cleanly. E.g.
this.usflowrefers to the flow upstream of the current node. - Recorders for the following outputs have been moved to allow earlier access to those values:
usflowis recorded at start of flow phaseds_1_orderis recorded at start of order phase (same for other links)- other order-phase recorders moved to within the ordering phase as allowed
- New "this" syntax allows functions to refer to the current node more cleanly. E.g.
- Can now launch KalixIDE from the CLI (if on the path). The command accepts one optional argument, the filename of a model to open.
- Ordering stuff:
- Loss node ordering calc correction.
- Loss node ordering calc now handles loss segments with slope=0 through slope=1. The latter represents a situation where additional inflow produces no additional outflow; in this case order is capped at the minimum value that produces some additional flow.
- Storage nodes can now propagate orders verbatim using
order_through = true. - Storage nodes can now generate orders to maintain target level using the
target_levelproperty.
v0.2.1
- Auto-complete! Press
ctrl+spacein the text editor to see suggestions. This gives you easy access to all timeseries in your defined input data, and all model variables. It filters as you type, and is context-aware, so what you see depends on where you are. - Confluence node has a new
harmony_fractionproperty for harmony functions. The confluence node also now automatically handles branches with different travel times. - Storage node outlets
ds_1_outlet,ds_2_outletetc now used to specify minimum operating levels on storage outlets. - Storage node meets
ds_1orders from spills first if possible. - New Storage node recorders for outlet flow (
ds_1_outlet) and spillway flow (ds_1_spill). - New commandline flag
-preports simulation times for performance benchmarking. - Improved error reporting with context tracking for hot-path panics.
- Cut/copy/paste selected nodes and links in the schematic map.
- Right-click menu in schematic map with handy things including Rename node and Zoom to fit.
- With selected nodes in the schematic, use
ctrl+dragto rotate the node selection. Ctrl+fon the map to Find node.- Right-click in the text editor to access Show on Map. This selects the node you are working on and brings it to the centre of the screen.
- Map shows mouse coordinates in the bottom left.
- Run Manager window has a new filter above the Timeseries tree. Find the thing you want to plot more easily!
- Linting performance improvements to reduce sluggishness when multiple errors or warnings are displayed.
- Linting rules (editor warnings) for
sim.year,sim.month,sim.day,sim.day_of_year,sim.stepsimulation variables. - Improvements to the
order_constraintnode type. New icon. - Improved case-sensitivity in functions, data references and model variables. Result recording now preserves case (used in the output section) for output file columns.
- Bug fixes:
- Fixed Hadis's issue whereby saving a calibrated model reverted the version property (#198).
- Fixed issue with plot sometimes not automatically updating.
- Fixed issue with auto-Y not going small enough to see small values.
v0.2.0
- Ordering system.
- Removed the "user" node type and replaced it with "unregulated_user" and "regulated_user".
- New node type "order_constraint" to implement minimum orders, maximum orders, or to set order. This node type also has the ability to delay orders (for advanced applications).
- Reversed convention for data access offset. Negative offsets now refer to the past, e.g.
data.file_csv.by_name.myflow[-3, 0.0]means the value 3 timesteps ago. - New "Table View" context tool in KalixIDE, available for most tabular properties.
- New aliases "sim" and "opt" for the CLI commands.
- Pyramid storage generation tool improved and moved to the Table View.
- CSV reader improvements — handling trailing commas in the header row.
- Node execution order now always follows the definition sequence (automatic execution order removed).
- Storage node enhancement — binary search for a more efficient solution, and added pond diversion functionality.
v0.1.2
- More robust internal case-insensitivity for node names. Fixes an issue with optimisation of models with uppercase nodes.
v0.1.1
- New recorders for Sacramento internal fluxes —
roimp,flosf,floin,flobf. - Windows icon fixes.
- Good error messages when a data reference is not found.
- Simplified status-bar messaging.
- RSyntaxArea initialisation improvements.
v0.1.0
- Gauge node can force flows, and can report the difference between modelled flow (upstream) and an input reference flow. Details are in the gauge node documentation.