Software, if you let machines write it, shouldn't be code.
Packages · Philosophy · Quick start · Showroom · Status
Nisc is a monorepo of small, opinionated libraries built around a single thesis: the next generation of software will be authored by language models, audited by humans, and executed by runtimes that refuse to run anything that isn't a validated tree of data.
Not "AI tools." Not "copilots." A stack where every layer — UI, data transforms, LLM calls, orchestration, queries — is a declarative JSON artifact a model can emit, a schema can validate, a runtime can walk, a cache can fingerprint, and a human can diff.
No eval. No generated TypeScript. No SQL string concatenation. No prompt-injected shell-outs.
The machines stop typing code and start emitting structure.
If that sounds austere: good.
Six libraries. Each one is self-sufficient. They also compose.
| Package | Description | Status | |
|---|---|---|---|
| 📡 | @niscorp/signal |
Universal LLM client — stateless, immutable, provider-agnostic. Structured output via Zod, tool calling, validation-retry. | |
| 🧊 | @niscorp/solid |
Structured output streaming — incremental JSON parser with structural sharing. Always-valid, schema-backed object stream over partial JSON. | |
| 💎 | @niscorp/prism |
JSON data-transformation DSL — ~50 ops, compile-time optimization, fingerprint-keyed cache, zero code execution. | |
| 🎨 | @niscorp/nova |
Declarative UI runtime — JSON layouts, actions, lifecycles, two-way bindings. Framework-agnostic core, React adapter shipped. | |
| 🧠 | @niscorp/cortex |
Agentic orchestration runtime — typed agents, tool-call loop, plan-mode tick loop, declarative rules engine, human-in-the-loop confirmation. | |
| 🔍 | @niscorp/vex |
Declarative query synthesis — English → constrained JSON DSL → SQL, with scope policies and shape-based caching. |
Each package ships its own
README.mdandDESIGN.md. Read the design doc before reading the source.
Five rules every package obeys, without exception. They're load-bearing.
Layouts, transforms, queries, plans — all plain JSON. Serializable, diffable, cacheable, persistable, LLM-emittable. The moment something wants to be a code string, we stop and ask why.
Every external input is parsed before it touches a runtime. Provider schemas are compliance hints; Zod is the truth. Errors are structured and, in LLM loops, fed back to the model.
If the thing-to-execute is data, the runtime can inspect, log, gate, replay, fuzz, cache, dry-run, and ship it over the wire. Imperative gives you none of that.
LLM-generated artifacts are untrusted by default. No eval, no SQL concat, no tool call without a policy check. If you can inject code into a Nisc runtime, it's a bug — file the report.
Nova has a React adapter; its core doesn't import React. Signal has no vendor SDK as a hard dep. Prism is a pure function. Use any one piece standalone — they don't phone home.
LLMs are structurally bad at unbounded code and structurally excellent at constrained grammars. Give them a schema and they behave. SQL solved this in 1974; we're doing it one layer up.
git clone https://github.com/moccadroid/niscorp.git
cd niscorp
pnpm install
pnpm buildRequires Node ≥ 18.18 and pnpm. Install pnpm with
brew install pnpmorcorepack enable.
A live demo + inspector for the shipping packages. Stories render side-by-side with their JSON definitions, runtime data, and error states.
pnpm --filter showroom devIf the showroom complains about missing dist/, warm the caches once: pnpm --filter showroom... build.
pnpm build # turbo build
pnpm test # turbo test
pnpm typecheck # tsc --noEmit across the workspace
pnpm lint # turbo lint
pnpm format # prettier writeWorking on one package? Filter it:
pnpm --filter @niscorp/nova test
pnpm --filter @niscorp/nova dev # tsup --watchniscorp/
├── packages/
│ ├── signal/ 📡 universal LLM client
│ ├── solid/ 🧊 structured output streaming
│ ├── prism/ 💎 JSON transform DSL
│ ├── nova/ 🎨 declarative UI runtime
│ ├── cortex/ 🧠 agentic orchestration
│ └── vex/ 🔍 query synthesis
├── apps/
│ └── showroom/ live demo + inspector
├── pnpm-workspace.yaml
└── turbo.json
Nisc is pre-1.0 and under active design.
- Shipping packages (Signal, Solid, Prism, Nova, Cortex) are tested and usable, but their public APIs are not frozen. Pin exact versions; expect to update.
- Design-only packages (Vex) have thorough
DESIGN.mddocuments and stub source files. Read the architecture; don't expect runnable code yet. - Breaking changes land without ceremony until each package hits 1.0.
Issues and PRs welcome. Read the relevant package's DESIGN.md before proposing anything bigger than a bug fix — the architecture has opinions, and the opinions are the product.
If a change makes the runtime less observable, less validated, or less declarative, it's probably going the wrong way.
MIT © Nisc contributors
Built with deliberate constraint. Powered by JSON.