Skip to content

Downloads

Grab the latest Kalix for your platform, or pip install it from PyPI.

Latest release

v0.4.42026-09-03
or via PyPIpip install kalix==0.4.4
  • Rating tables on Storage outlets. ds_N_outlet will 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_inflow property on confluence nodes can be used to control how much unregulated inflow confluences should account for when propagating orders. This is similar to expected_inflow on 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), and min and max variants 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): gives value where x is NaN, otherwise x.
    • New latch(x, condition, init): takes a new value of x if and only if condition is true. E.g. latch(aa_hp, fn.wy_start(), 0).
    • Static node and account properties such as node.my_catchment.area and acc.user1.size can now be recorded or referenced. E.g. subarea_km2 = 0.05 * node.my_catchment.area.
  • 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. Use Copy X axis, Paste X axis, Copy Y axis, and Paste Y axis to 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 key which 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_accounts property on regulated_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 when accounts is 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 regulated branch property: regulated = <comma separated node(s)> names the upstream regulated pathways. Specifying a single branch sends all orders there, while specifying two invokes harmony_fraction to 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 variables sim.days_in_month, sim.days_in_year, sim.is_leap. See expressions.
  • New account pair concept for modelling carryover, plus per-target self in 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 with phase = ras run in the ras phase interleaved with the [ras.*] sections, allowing designs such as daily evaluation and then allocate(var.assessment.aa) as required. See vars.
  • Use this in 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 for size and use, with size readable everywhere including announce-time assessments. ras.<name>.fired and .pct are now readable in expressions too. See accounts.
  • Routing pwl extrapolation 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 .pxt files in [data] autocomplete and checks for the named .pxb companion. See [data].
v0.4.12026-07-29
  • STATEFUL PYTHON API: a native Model class — 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) and roll_cap(n) — the latter gives a rolling n-water-year usage cap. See [ras.*].
  • New opportunistic_demand on 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 style data.*.
    • [constants] -> [const] and the reference prefix c. -> 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 include set_fraction, credit, debit, and more. The action allocate(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.
  • MAJOR FUNCTIONS UPGRADE!
    • [fn] defines true user defined functions: write a formula once in a [fn] section and call it as fn.name(...) from any expression. Inside a function body, the this. 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 as table.name(x) or table.name(x,y) from any expression.
    • New functions: moving_sum / moving_mean / moving_min / moving_max over an n-step window, and sum_since / min_since / max_since / count_since / steps_since which accumulate until a reset condition. New clamp(x, lo, hi) is simpler than nested min-max statements. Renamed avg() to mean() for technical clarity (breaking change).
    • New simulation flags sim.new_day, sim.new_month and sim.new_year mark calendar boundaries, simplifying some expressions (e.g. "start of the water year" is now sim.new_month && sim.month == 7).
    • New assert(x) function you can use to stop a run based on a custom condition. If a value x is 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) and nlm_k and nlm_m (for NLM).
    • Storage node exists parameter.
    • 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.
  • GUI STUFF:
    • Faster and more usable dialogs for Open File, Open Folder, Save File. (Especially better on network drives).
    • New Insert node option 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 kalix packaging slimmed down, ~3 or 4 MB.
v0.3.32026-07-06
  • Forced releases on storage nodes: new ds_*_force_release parameters 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_file property removed - please use dimensions instead.
  • The order_constraint renamed order_control for clarity (breaking change).
  • New recent folders menu that works like recent files.
  • Several node properties that previously failed to round-trip are now preserved on save: storage target_level and order_through, and unregulated_user account.
  • Smarter kalix executable 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.csv results 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 Data context 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 kalix engine 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 .ini files.
    • 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
  • Sneaky release with optimisation exposed to the Python API.
  • Also includes:
    • Some file-tree enhancements
    • Changes to node outputs (#258)
    • Inflow recession_factorexpected_inflow (#260)
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_user or unregulated_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.
  • 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.csv will 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_1 lines.
    • 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.usflow refers to the flow upstream of the current node.
    • Recorders for the following outputs have been moved to allow earlier access to those values:
      • usflow is recorded at start of flow phase
      • ds_1_order is recorded at start of order phase (same for other links)
      • other order-phase recorders moved to within the ordering phase as allowed
  • 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_level property.
v0.2.1
  • Auto-complete! Press ctrl+space in 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_fraction property for harmony functions. The confluence node also now automatically handles branches with different travel times.
  • Storage node outlets ds_1_outlet, ds_2_outlet etc now used to specify minimum operating levels on storage outlets.
  • Storage node meets ds_1 orders from spills first if possible.
  • New Storage node recorders for outlet flow (ds_1_outlet) and spillway flow (ds_1_spill).
  • New commandline flag -p reports 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+drag to rotate the node selection.
  • Ctrl+f on 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.step simulation variables.
  • Improvements to the order_constraint node 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.

Older releases on GitHub ↗