Home/Developers
Download, install, wire a source to a destination, and curl it. No sales engineer required, no licence server to phone home to, no three-day environment build.
# 1. unpack the releasetar -xzf linkiir-grid-3.4.1-linux-amd64.tar.gzcd linkiir-grid # 2. bring up the runtime, broker and console./grid init --license ./linkiir.lic./grid up # runtime online :7440# broker online :9092# console online http://localhost:8080# archiver-1 online # 3. create the demo project./grid project create "Getting Started" --template http-echo
-- Transform node: HL7 v2 ADT in, FHIR Patient outlocal fhir = require "fhir" function main(Data) local Msg, MsgType = hl7.parse{ schema='adt.json', data=Data } local patient = fhir.Patient{ identifier = {{ system = 'urn:oid:2.16.840.1.113883.3.42', value = Msg.PID[3][1][1]:nodeValue() }}, name = {{ family = Msg.PID[5][1][1]:nodeValue(), given = { Msg.PID[5][1][2]:nodeValue() }}}, birthDate = date.iso(Msg.PID[7][1]:nodeValue()) } if not patient.valid() then return queue.dead{ reason = 'PID incomplete', data = Data } end queue.push{ data = patient:json() }end
{ "name": "epic-adt-to-fhir", "nodes": [ { "type": "source.llp", "name": "Epic ADT IN", "port": 5245, "ackMode": "enhanced" }, { "type": "transform.custom", "script": "main.lua", "libraries": ["fhir", "date"] }, { "type": "destination.custom", "adapter": "azure-fhir", "resource": "Patient", "retry": 5 } ], "durability": "at-least-once", "replay": true}
# 4. call itcurl -X POST http://localhost:7440/v1/workflows/epic-adt-to-fhir \ -H "Authorization: Bearer $GRID_TOKEN" \ -H "Content-Type: application/hl7-v2" \ --data-binary @sample-adt-a08.hl7 { "messageId": "01JR8W2XQ4T7N9", "status": "accepted", "parsedAs": "ADT^A08", "parseMicros": 380, "destinations": [ { "adapter": "azure-fhir", "http": 201, "ms": 11 } ], "replayable": true}
Tabs advance on their own. Click to take over.
Getting started, interface development, the node reference, administration, deployment and licensing, troubleshooting and the FAQ.
help.linkiir.com
Every endpoint on the Grid control plane: projects, workflows, nodes, schemas, messages, replay, users and audit, each with request and response examples.
help.linkiir.com/docs/api/
Which is why it tells you the awkward part instead of skipping it.
Four steps from a downloaded package to a live HTTP endpoint you can call with curl. Receive HL7 v2 over MLLP. Connect your own Kafka or Redpanda.
Open ↗Source, Transform and Destination nodes: every configuration option, the Lua scripting API, shared libraries, and worked samples per message type.
Open ↗Installation, licensing, deployment topologies, broker and log-archive database choices, security configuration, upgrades and troubleshooting.
Open ↗Database choices, licensing limits, operating practices, and the questions people actually email us at 11 p.m.
Open ↗Transforms run sandboxed Lua 5.4: no host filesystem, no shell. What you get instead is a message API that makes the common thing one line and the awkward thing possible.
Full signatures, arguments and worked examples in the API reference ↗.
Everything the console does, the API does. Deploy interfaces from CI, gate promotion on a passing run-test, replay a window from a script.
# promote a reviewed branch into productioncurl -X POST \ https://grid.example.org/v1/projects/regional/deploy \ -H "Authorization: Bearer $GRID_TOKEN" \ -d '{"ref":"release/2026.08","runTests":true}' { "deployment": "dpl_01JR8W", "tests": "42 passed", "workflows": 18, "rollbackTo": "dpl_01JR3K" }
Bearer tokens scoped per project and action, or mTLS client certs. Tokens are revocable and audited.
Subscribe to deploys, dead-letters, threshold breaches and replay completions.
A published spec, so your client is generated rather than hand-written.
/v1 is stable. Breaking changes get a new path and twelve months of overlap.
A single tarball or container image, plus a licence file. Works offline, with nothing calling home. Ask for an evaluation licence and you'll have it the same day.
grid init then grid up. Runtime, broker, notification engine, archiver and console. The bundled broker is fine to start with; point it at your own Kafka or Redpanda when you're ready.
Start from the http-echo or llp-passthrough template, then swap the destination for a real one. The node parameter docs are in the panel beside each field.
curl it, or point your test MLLP sender at port 5245. Watch it land in the Monitor, open the parsed tree, then break it on purpose and replay it.
Is there a way to make mapTree skip a segment? I want everything except ZPD.
Yes. MsgOut:mapTree(MsgIn, {skip={'ZPD'}}). It takes a table of segment names or a predicate. I'll add the example to the docs page today, it's under-documented.
Perfect, thanks.
Raise it in Jira Service Management and it reaches the people who build Grid, not a bot, not a triage script, and not a case number that sits until someone reassigns it. Median first reply last quarter was seven minutes.