What you call, and how it changes
Pick a row. Your code asks for the table by name and gets the value from memory. Functions and flows are called the same way.
| coverage.code | option.code | premium |
|---|---|---|
HigsonContext ctx = new HigsonContext(); ctx.set("coverage.code", "COLL"); ctx.set("option.code", "SILVER"); BigDecimal premium = engine .get("demo.motor.coverage.veh.premium", ctx) .getBigDecimal();
curl -X POST localhost:8081/api/execution/invoke \ -H 'Content-Type: application/json' -d '{ "ctx": {"properties": [ {"key": "coverage.code", "value": "COLL"}, {"key": "option.code", "value": "SILVER"}]}, "elements": [{"type": "PARAMETER", "code": "demo.motor.coverage.veh.premium"}]}'
- EditIn a private work session
- TestExpected results stored with the rules
- PublishOr reject the whole session
- LiveEvery runtime picks the change up within 3 s
Two parts and a database
Studio writes rules to your database. The runtime reads them and keeps them in memory. Your application calls the runtime, or embeds it as a library.
Any language calls a shared runtime over HTTP.
Rules live in memory
A call never waits for the database.
Changes arrive in 3 seconds
Watchers refresh only what changed.
Scales by adding instances
Each runtime holds its own copy of the rules, so there is nothing to coordinate.
Tests need no database
Load a snapshot ZIP as the data source.
Running on your machine in five minutes
You need Docker and a developer licence. Studio always runs with one; a developer licence is free for three months and anyone can ask for it.
$ git clone https://github.com/higson-io/business-rules-motor-insurance $ cd business-rules-motor-insurance $ docker compose up -d # first run pulls about 1 GB, then: # Studio localhost:38080/higson/app (admin / admin) # Runtime REST localhost:8081/swagger-ui # Sample app localhost:48080/demo
$ curl -X POST localhost:8081/api/execution/invoke \ -H 'Content-Type: application/json' \ -d '{"ctx": {"properties": [{"key": "coverage.code", "value": "BI"}]}, "elements": [{"code": "demo.motor.coverage.position", "type": "PARAMETER"}]}' # you should see # [{"element": {"code": "demo.motor.coverage.position", "type": "PARAMETER", …}, # "resultValue": [{"fields": [{"key": "position", "value": 1}]}]}]
# in Studio (localhost:38080/higson/app, admin / admin) # open demo.motor.coverage.position # set position for BI: 1 → 2 # Publish $ curl -X POST localhost:8081/api/execution/invoke … # same call as in step 2 # "resultValue": [{"fields": [{"key": "position", "value": 2}]}] # within 3 seconds, no restart, no redeploy
No Docker? Download the ZIP bundle.
Call it from your code
<!-- pom.xml --> <dependency> <groupId>io.higson</groupId> <artifactId>higson-runtime</artifactId> <version>4.3.3</version> </dependency> // once, at startup var factory = new HigsonEngineFactory(); factory.setDataSource(dataSource); HigsonEngine engine = factory.create(); // per request engine.get("…veh.premium", ctx); // decision table engine.call("…premium.total", ctx); // function engine.flow("…underwriting", ctx); // flow
<!-- pom.xml --> <artifactId>spring-boot-starter-higson-runtime</artifactId> # application.yml higson: database: url: jdbc:postgresql://localhost:5432/higson username: higson password: ${HIGSON_DB_PASSWORD} runtime: dev-mode-enabled: true # see unpublished changes username: jane // anywhere @Autowired HigsonEngine engine;
$ docker run -p 8081:8081 \ -e higson.database.url=jdbc:postgresql://db/higson \ decerto/higson-runtime-rest:4.3.3 $ curl -X POST localhost:8081/api/execution/invoke \ -H "Authorization: Bearer $HIGSON_TOKEN" \ -H 'Content-Type: application/json' \ -d '{"ctx": {"properties": [ {"key": "coverage.code", "value": "BI"}]}, "elements": [ {"code": "…coverage.position", "type": "PARAMETER"}, {"code": "…premium.total", "type": "FUNCTION"}]}' # Studio generates this JSON for any test case
An MCP server, built into Studio
Your coding agent
Claude Code · Cursor · Codex · VS Code
Higson Studio
MCP server, about 90 tools
Rules
Read · change · test · publish
Tables, functions, flows
The agent reads and edits them like a Studio user.
Tests before publish
Runs the same test packages a person would.
Change history
Every edit is signed by the token’s user and kept in the history.
// .mcp.json { "mcpServers": { "higson": { "type": "http", "url": "https://studio.example.com/higson/api/mcp", "headers": { "Authorization": "Bearer ${HIGSON_STUDIO_TOKEN}" } }}}
Measured, with the conditions stated
Released versions, one laptop, no tuning.
- 103 decision tables
- 43 functions
- Single thread
- Two tables in memory
- 1,000,000 + 100,000 rows
- 3 conditions, 1 output each
- 1,292 decision tables
- 3.56 million rows
- 1,182 functions
Intel Core i7-13700H, 14 cores, Java 17, Windows 11.
Our numbers are one thing. Yours are another.
Send us a sample of your rules. We run it in Higson and share the results, free.
What your architect will ask
Deployment
- Java 17 or newer
- Docker images, non-root
- WAR on Tomcat or executable JAR
- AWS Marketplace AMI
Databases
- PostgreSQL, Oracle
- SQL Server, MySQL
- H2 for demos and tests
- External SQL as a table source
Security
- CREST-certified pentests
- SAML 2.0, Active Directory, LDAP
- Roles and per-profile grants
- Expiring API tokens
Versioning
- Every table, function and flow
- Draft, active, archived
- Author on every change
- Effective date per version
Observability
- Diagnostic panel: JVM, GC, threads
- Profiler with flame graph
- Cache and JDBC monitors
- Spring Actuator endpoints
Testing
- Tester built into Studio
- Test packages, run in batch
- Unit tests from a snapshot ZIP
- Dev mode: unpublished rules visible
Everything else is one click away
Releases
Every line is supported for at least 18 months.
- 4.4 LTS · upcoming2027
- 4.3 LTS · latest4.3.3 · 8 Sep 2026
- 4.2 LTS4.2.9 · 7 Sep 2026
- 4.1 LTS4.1.28 · 7 Sep 2026
Ready to Get Started?
Run Studio, the runtime and a sample product on your machine in about five minutes.