The AI-native app framework.
The whole application is data, so an AI can read all of it and write any of it, safely, while it runs.
Your whole app is data an AI can read and write, safely, while it runs.
Ask for a screen:
Your app, while it writes
A recorded run, replayed in your browser. The screen is drawn from the JSON as it arrives, and it works when the last line lands.
Full-stack, and built for AI at every layer.
Most frameworks were designed for people to write code in, and AI was added later. Nisc was designed the other way round: screens, server, data, permissions and automations are all checked JSON, so a model can write any of them. It runs on Node and Postgres, with your React or Vue components, or with none.
Now make it do something stupid.
An agent can only write what the vocabulary has words for. Here are three things it has no word for. Hand them to the checker.
Read the salaries table
{
from: ['salaries'],
fields: ['salaries.amount'],
}
Invent a component
{
component: 'FluxCapacitor',
props: { gigawatts: 1.21 },
}
Slip in some code
{
component: 'Button',
props: { label: 'Launch' },
onClick: "fetch('skynet.example')",
}
A program catches these before the app runs, on every change. With generated code, you are the one who has to.
Shipping it is ticking a box.
It is launch day. Margaret is the flight director and Wesley is the intern. Each has their own running app. A screen is data, and so is who gets it. One box each.
Nobody rebuilt anything. The server keeps one running app per person and sends each of them what they have.
Three models work on a Nisc app. None of them runs it.
The rule is the same for all three. The model writes a document, a program checks it, and what runs afterwards is ordinary software.
Then your users start asking for features.
A Nisc agent can write almost anything the app is made of, and it cannot write code. So it is safe to let one work while the app is running, for one person, with that person's rights.
—
Each one lands on her phone as a new tile. Open it. It is her screen, built from your components, reading only what she may read, and nobody else has it until somebody ticks a box.
It can do what you can do. Except press the button.
It reads what you can read and prepares what you can do, then shows it to you. Ask it to prepare the launch, as Margaret and then as Wesley.
—
Say what you want. Say what shape.
Nobody writes SQL here, and nobody talks to a model. Your code, your coding agent or the assistant sends Vex a sentence and an example of the result. Vex answers in exactly that shape.
This is the whole request
intent:shape:What comes back
Same sentence, different shape, different query. The query is compiled under the permissions of whoever asked, which the model never sees.
Then it never asks a model again.
The query you just made has a name now. Your app keeps the name and sends that, plus any values that change. Postgres answers. No model is involved.
{
fingerprint: 'fp_9c1e04',
context: {},
}Postgres answers
Written once. Run by a clock.
Somebody says what they want automated. An agent writes it down as a small document and a plain scheduler runs it, reading through a stored query with the permissions of whoever saved it.
It looks like your product. Not like ours.
You write the components once. The agent arranges them and cannot invent, restyle or import one. Here is Telemetry, drawn by three sets of components.
Telemetry
What draws the components is an adapter. Nisc ships adapters for React, Vue, plain DOM and two kinds of terminal. Anything else is one more adapter, and the contract is a document your coding agent can read.
Nisc will change. What you stored still works.
Prism is the mapping layer under all of Nisc: data in, data out, written as JSON. Strata puts versions on top of it. Every change to a format ships with a Prism mapping from the old shape to the new, and an old document is run through those mappings whenever it is read.
Stored, written at v1
{
component: 'Button',
props: {
colour: 'red',
label: 'Launch',
},
}
{
description: "Button: 'colour' is now 'ink'",
steps: [{
kind: 'document',
at: 'nisc.nova/layout',
transform: { $update: {
from: { $ref: '$.document' },
path: ['props'],
value: { $renameKeys: {
from: { $var: 'current' },
map: { colour: 'ink' },
} },
} },
}],
}Handed to your app, v2
{
component: 'Button',
props: {
ink: 'red',
label: 'Launch',
},
}
AI in every part of the app. Trusted in none of them.
Every demo above is one idea used again. Whatever a model produces is a document. A program checks it against one permissions file. Software runs it. That is why the parts fit: the assistant can open a screen an agent wrote a minute ago, an automation reads through a query a user asked for, and a new feature ships when somebody ticks a box.
It fits into what you already run.
pnpm add @niscorp/nisc zodNo rockets were launched in the making of this page. One was prepared.