0.02
The project is in a healthy, maintained state
TraitEngine replaces nested if/else logic with a concise DSL that maps data sources to derived attributes using reusable traits, transformations, and decision tables.
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
 Dependencies
 Project Readme

Kumi

CI Gem Version License: MIT

Try the interactive demo →


What is Kumi?

Kumi is a declarative DSL for building calculation systems.

Schemas define:

  • Input shape (scalars, arrays, nested structures)
  • Declarations (computed values and boolean conditions)
  • Dependencies between declarations

The compiler:

  • Performs type checking
  • Detects unsatisfiable constraints
  • Determines evaluation order
  • Generates code for Ruby or JavaScript

Use Cases

Calculation systems appear in: tax engines, pricing models, financial projections, compliance systems, insurance underwriting, shipping rate calculators.


Status: experimental. Public API may change. Typing and some static checks are still evolving.

Feedback: have a use case or hit a rough edge? Open an issue or reach out (andremuta+kumi@gmail.com).


Examples

  • US Tax Calculator (2024) — a single schema computes federal, state, and FICA taxes across multiple filing statuses. Open in the demo.
  • Monte Carlo Portfolio — demonstrates probabilistic simulations and table visualizations. Open in the demo.
  • Conway's Game of Life — showcases array operations powering a grid-based simulation. Open in the demo.

Install

gem install kumi

Requires Ruby 3.1+. Runtime dependencies: mutex_m and zeitwerk (bundled via Rubygems).

Quick Start

require 'kumi'

module Double
  extend Kumi::Schema

  schema do
    input { integer :x }
    value :doubled, input.x * 2
  end
end

# Execute in Ruby
result = Double.from(x: 5)
result[:doubled]  # => 10

# or just call the method directly
Double._doubled(x: 5) # => 10

# Export to JavaScript (same logic)
Double.write_source("output.mjs", platform: :javascript)
# ./output.mjs
# export function _doubled(input) {
#   let t1 = input["x"];
#   let t3 = t1 * 2;
#   return t3;
# }

You can also override the compilation strategy without touching code by setting KUMI_COMPILATION_MODE to jit or aot (e.g. export KUMI_COMPILATION_MODE=aot).

Try the interactive demo (no setup required).


Documentation

To regenerate function docs: bin/kumi-doc-gen


License

MIT License. See LICENSE.