Rip is a zero-build, full-stack language for reactive UI, schemas, ORM, and server code. It runs directly under Bun, emits clean JavaScript, type-checks through TypeScript 7, and ships a full LSP.
This repository owns the complete Rip product:
- the lexer, grammar, parser generator, and compiler;
- precise bidirectional mappings between Rip and generated artifacts;
- reactive, schema, ORM, component, and standard-library runtimes;
- package and application infrastructure, including
rip/sites(Agent, edge, demos); - VS Code/Cursor, Vim, and highlight.js integrations;
- language, mapping, type, runtime, corpus, and editor test contracts.
Every capability must preserve the compiler's mapping architecture and carry correctness tests at the surfaces it affects.
Open product work is tracked in docs/ROADMAP.md and
package-local TODO.md files (for example
packages/sites/TODO.md).
Working docs (read / rewrite while shipping):
- AGENTS.md — mandatory repository rules and invariants
- packages/AGENTS.md — first-party package mold and earned shapes
Understanding (permanent contracts under docs/):
- docs/SERVER.md — Sites, Janus, manager, worker architecture
- docs/WORKSPACE.md — browser publication / apply contract
- docs/TYPES.md — type-system and editor architecture
- docs/VARIANTS.md —
VARIANTdocuments from SQL, Rip and the harbor REPL - docs/HMR.md — hot-module-replacement design
- docs/FRAME.md — Rip-native hypermedia design
- docs/ROADMAP.md — current open product work
- docs/CLEANROOM.md — clean-room engine rewrite plan
bun run test:rip # language suite (PR code check)
bun run test # fast compiler/runtime suite
bun run test:all # exhaustive: extended tier + every package
bun run test:tui # the same lanes, drawn live on packages/tui
rip check [paths...] # headless TypeScript checking over Rip source
bun run parser # regenerate src/parser.js
bun run corpus
bun run auditPackage work: bun run test from that package directory (for example
packages/sites). Browser smoke: bun run test:browser.
rip file.rip, rip test, and the Sites bundler compile .rip modules
through an on-disk cache at .rip/cache/compile/ in this checkout
(src/cacher.js), so a spawned process re-reads an unchanged module's
emission instead of recompiling it. Any edit under src/ invalidates
every entry, and compile errors are never cached. RIP_CACHE_DIR=<dir>
relocates the cache and RIP_NO_CACHE=1 disables it. Entries unread for
a week are pruned; rm -rf .rip/cache is the full reset.
bun run test:tui runs the lanes test:all runs, with the same
scheduler, the same verdict and the same exit code, and draws them
live: a cell per lane, a bar for the whole run with its ETA, a bar per
lane in flight against its last duration, each finished lane scrolled
into the scrollback as one aligned row, and a card for the first
failure of each failing lane (↑/↓ choose, Enter opens the lane's
output, f shows only the failing lanes, q stops the run and every
lane's process group). At the end each failing lane's output is printed
as test:all prints it, then a summary card. Each complete run leaves
the lanes' times and counts in .rip/test-last.json for the next run's
bars and ETA. Piped, under CI, or with --plan it is test:all
itself. It takes test:all's flags; both front ends are
scripts/lanes.mjs underneath.
test:all needs janus on PATH for the Sites integration lane. Install
Janus, or put a Janus
build on PATH. The lane exercises that binary and rejects a local Go module
replacement; it does not build a separate edge.
rip on a TTY (or rip -r) starts the interactive REPL: reactive
bindings persist across lines, input is syntax-highlighted live from
the real lexer, themes auto-detect the terminal background (.theme
to override), imports resolve against the session cwd, and -e
evaluates one entry. .help inside the session lists the commands.
Two conveniences worth knowing by heart:
-
A trailing
;suppresses the echo. The entry still evaluates and still sets_— only the display goes quiet. The companion of anything that already printed its own answer:show User;prints the table without the REPL then dumping the returned instances. -
A
repl.ripin your cwd is the project's own console. It auto-loads at startup and states only what cannot be guessed — usually one line,import './api/db.rip'. Its exports, every schema the app registered, and the rip/db toolkit (sql,findAll,findOne,transaction,show) become your starting bindings, announced by provenance:schemas → User, Patient, Order, … · rip/db → sql, findAll, findOne, transaction, show rip> show User.where(lastName: /pat/i);
janus autostart # once: the edge, as a service
rip sites add packages/sites/demos/hello
rip sites start hello
# https://hello.via.rip/Postures and LAN/local trust: packages/sites/README.md.