lib/nockapp
the NockApp host's own effect vocabulary.
Import
A module arrives by name and nothing in it is ambient. Every arm below is reached as nockapp.<name>.
import nockapp;
The name is the file name minus .jock: nockapp is crates/jockc/hoon/lib/nockapp.jock, and it is found because the directory holding it was passed as a --data-dir. There is no search path and no implicit import; tools/libs.py holds the whole discovery rule, and the compiler itself is a pure function of source and libraries.
About
These two cases are the drivers every NockApp has: exit terminates the process with a code (drivers/exit.rs, matching eq_bytes(b"exit")) and markdown renders a cord (drivers/markdown.rs) --- the "print" of the nockapp world.
THE CASE NAMES ARE WIRE FORMAT. A Jock union erases to [tag payload], and that noun IS what the pinned drivers scan, so renaming a case is a protocol change rather than a refactor. String's erasure is its cord, so Effect.markdown("bye") is [%markdown 'bye'] verbatim.
This lived in the prelude until 2026-10-24. It left under the rule in docs/spec/runtime.md §8: the prelude carries only what is true in every world Jock targets, and a driver's vocabulary is not that. A kernel now names what it answers with.
Types
1 type. A type’s members ARE its interface, so each is shown whole rather than by name.
Effect
enum Effect { exit(@), markdown(String) }
No comment in the source. The signature above is the whole of what Effect states about itself.
used by examples/counter-v2.jock
class CounterV2(KS2) impl Kernel<nockapp.Effect> {
What no lane pins
Nothing. All 1 public declaration is named by an example that runs on every push.
Where it is used
4 examples import nockapp. Each is a complete program whose value tools/examples.sh pins on every push.
examples/counter-v2.jock— a useexamples/counter.jock— a useexamples/stoplight.jock— a useexamples/watcher.jock— a use
The worked examples page shows the shortest of these in full.