The rule is the program.

Declare the rules. Orb builds the app, or tells you why it can't.

1 curl -fsSL https://orb.almadar.io/install.sh | sh

Checkout

on Order · states: 3 · transitions: 3
Order { total }
PAY
(> @payload.amount 0)
SHIP
NEW_ORDER
nowpending
paid
shipped

An unpaid order cannot ship.

There is no SHIP out of pending.

Checkout

on Order · states: 3 · transitions: 4
emitsPAYemitsMOVED
INIT
PAY
(> @payload.amount 0)
SHIP
NEW_ORDER
nowpending
paid
shipped
The same file, running

Unpaid

checkout.lolololo
1app std-orb-sample-checkout "1.0.0" 2"std-orb-sample-checkout — the checkout program shown on orb.almadar.io's home page, running: an order that cannot ship before it is paid. The page shows this file as code beside the running trait, and each move is reported (MOVED) so its state machine can follow along." 3orbital Orders { 4 entity Order [runtime] { 5 id : string! 6 total : number 7 } 8 9 trait Checkout -> Order [interaction, instance] { 10 initial: pending 11 12 state pending { 13 INIT -> pending 14 (render-ui main { type: stack, gap: sm, children: [ 15 { type: typography, content: "Unpaid", variant: h4 }, 16 { type: button, label: "Pay 40", action: PAY, actionPayload: { amount: 40 } } 17 ] }) 18 PAY -> paid when (> ?amount 0) 19 (set @entity.total ?amount) 20 (emit MOVED { event: "PAY" }) 21 (render-ui main { type: stack, gap: sm, children: [ 22 { type: typography, content: "Paid 40", variant: h4 }, 23 { type: button, label: "Ship", action: SHIP } 24 ] }) 25 } 26 27 state paid { 28 SHIP -> shipped 29 (emit MOVED { event: "SHIP" }) 30 (render-ui main { type: stack, gap: sm, children: [ 31 { type: typography, content: "Shipped", variant: h4 }, 32 { type: button, label: "New order", action: NEW_ORDER } 33 ] }) 34 } 35 36 state shipped { 37 NEW_ORDER -> pending 38 (emit MOVED { event: "NEW_ORDER" }) 39 (render-ui main { type: stack, gap: sm, children: [ 40 { type: typography, content: "Unpaid", variant: h4 }, 41 { type: button, label: "Pay 40", action: PAY, actionPayload: { amount: 40 } } 42 ] }) 43 } 44 45 emits { 46 PAY { 47 amount : number! 48 } 49 MOVED -> external { 50 event : string! 51 } 52 @description "Each move names the event it took, so a diagram beside the order can follow it." 53 } 54 } 55 56 page "/checkout" -> Checkout 57}

Anything is a behavior.

Each one is a single .lolo file.

Orbital motion

STEP
TOGGLE_RUN
RESET
nowidle

Planets orbit a central mass under inverse-square gravity.

Running
Step 2

r=119.3px, v=2.25

Logic circuit

STEP
TOGGLE_RUN
RESET
nowidle

Logic gates combine inputs into outputs that follow their truth table.

Paused
Step 0

Circuit 1 — (A AND B) XOR (A OR B)

Output bulb = 0.

Galton board

STEP
TOGGLE_RUN
RESET
nowidle

Balls bounce off pegs and pile into a bell-shaped histogram.

Running
Step 2

0 ball(s) landed this step — bin 4 leads with 15 total

Every mistake gets a name and a line.

orb validate stops you with the code and the line.

orb validatebash
$ orb validate checkout.lolo ❌ [ORB_BINDING_PAYLOAD_FIELD_UNDECLARED] orbitals[0 (Orders)].traits[0 (Checkout)].stateMachine.transitions[1].guard[1]: Event 'PAY' uses @payload.amount (.lolo spelling: `?amount` or `@payload.amount`) but has no payload schema defined @ 16:27 💡 declare the field in the event's `emits` payload block: `PAY -> external { amount : <type> }` ❌ [CIRCUIT_DEAD_END_STATE] orbitals[0 (Orders)].traits[0 (Checkout)].stateMachine.states: State 'shipped' has no outgoing transitions - it may be a dead end @ 10:3 💡 Add outgoing transitions or mark as terminal state with isTerminal: true Error: Schema validation failed with 2 error(s)

Orb in numbers

5

languages it compiles to

194

behaviors in the standard library

3

keyword languages

0

warnings orb validate allows

Write the rule. Get the app.

Install in one line. Run your first program in the playground.

Orb

The language where the rule is the program.

© 2026 Almadar. Ljubljana, Slovenia.