Vog |>
Why Vog Footguns Glimpse Blog
|> A GLIMPSE

Real syntax. A taste, on purpose.

There’s no runnable playground yet — a philosophy you can’t run is just a vibe, so here is how the language actually reads. Three snippets, chosen so you meet its posture at a glance, not a tutorial.

Vog code moves through one result shape: Ok or Ng.

Ng
stands for “no good” — pronounced “N-G,” or “nog” as one syllable. It is a visible, typed failure value, not an exception hiding offscreen.  It combines absence, (Maybe types) and error (Result types) into a single shape.  Ok is the happy path, and Ng is the many ways you may stray from that path.

01 Division that can't crash
average.vog
pure average(total: Int, count: Int) -> Ok(Int) | Ng(:no_items)
    total
        |> divide(count)
        |> case {
            Ok(n)         -> Ok(n)
            Ng(:div_zero) -> Ng(:no_items)
        }
end
Division returns a result instead of crashing. The signature promises either Ok(Int) or Ng(:no_items), and the handler translates divide-by-zero into the domain error the caller understands.
02 Failure moves through the pipe
profile.vog
flex profile_label(id: Int) -> Ok(String) | Ng(:forbidden)
    id
        |> find_user()
        |> on
Ng(:none) -> Ok(guest_user()) } |> label_for() |> case { Ok(label) -> Ok(label) Ng(:forbidden) as err -> err } end
A Ng skips the ordinary stages until a handler catches it; the final case must cover what remains. Unhandled errors don’t slip through unnoticed — they won’t compile.
03 Red, green, red
clamp_low.vog
RED · TEST WRITTEN FIRST
pure clamp_low(x: Int, floor: Int) -> Ok(Int)
    unimplemented
end

assay clamp_low(x: Int, floor: Int) -> Ok(Int)
    clamp_low(x, floor: floor)
end

testrows clamp_low "floor is enforced"
    pending below_floor: 1, floor: 7 -> Ok(7)
end
GREEN · IMPLEMENTATION LANDS
pure clamp_low(x: Int, floor: Int) -> Ok(Int)
    Ok(max(x, floor))
end

testrows clamp_low "floor is enforced"
    pass below_floor: 1, floor: 7 -> Ok(7)
    pass above_floor: 9, floor: 7 -> Ok(9)
end
pending is the red state — the test exists before the function does. Promote it to pass when the code goes green. Then vog invert flips decisions like max → min and checks that a green test actually goes red again. No toothless green.
a sneak peek, limited on purpose · unstable surfaces held back · no runnable playground yet
Vog |>
Blog
a statically typed, immutable language for the AI coding agent era · in design |> coming soon