Build my app
Say "build the app my customers sign in to" and get an App per Persona over your API, with screens inside each Access level and a workspace per Customer.
In the design, an App is where the people at each Customer sign in and work with your records. Each kind of person is a Persona, and each sees the screens its Access Level reaches.
| Before it runs | |
|---|---|
| Needs | A Startup with its Nouns, such as Property and Lease in leaseclock.com |
| Who says yes | You. Your agent shows you the run and waits for your Approval. |
| You leave the chat | Never: it all happens in the chat |
| First question at Idea | "Who signs in, and what is the first thing they do?" |
| First question at Live | "Preview it with one customer first?" |
What you get
In the design, leaseclock.com gets these parts from one App file and its definition. The screens for your own team come first, and derive today.
| What you get | Is | |
|---|---|---|
| 1 | product your customers use, leaseclock.com | Software |
| 1 | App at leaseclock.com/app, under your Brand | App |
| 3 | Personas, one per kind of person who signs in: manager, assistant, landlord | Persona |
| 1 | list and record page for each Noun a Persona may read | App rules |
| 1 | form for each Verb a Persona may call, with its declared inputs | Verb |
| 1 | Access level behind every screen and button | Access Level |
| 1 | workspace per Customer, holding its records apart from every other | Tenant |
| 1 | Markdown and JSON rendering of every screen, for agents | Renderings |
| 4 | screens per Noun for your own team: a list, a record page and two forms | Give my team an admin |
Your agent does
Your agent creates the Software, writes the App file, then publishes the App. Each tab is the same run.
Build the app my property managers sign in to.
Give each customer a list of their leases and renewal dates.
Make an app where a manager sees which renewals are due this month.Between the first call and the last, your agent writes the App file. It names each Persona, the Access level it holds and the list it opens on.
---
kind: saas
mount: /app
nouns: [Property, Lease]
personas:
manager: { access: admin, opens: leases }
assistant: { access: member, opens: leases }
landlord: { access: viewer, opens: properties }
---In the design, App.publish ends done, and every Customer's Tenant runs the new build.
{
"api": "https://api.sb/leaseclock.com",
"app": {
"$id": "https://api.sb/leaseclock.com/apps/app_1",
"$type": "App",
"kind": "app"
},
"action": {
"$id": "https://api.sb/leaseclock.com/actions/action_3",
"operation": "App.publish",
"status": "done"
},
"links": {
"self": "https://api.sb/leaseclock.com/actions/action_3"
}
}| At | Your agent calls |
|---|---|
| Idea | Software.create, App.publish |
| Live | Change.review, Version.deploy |
A manager at Harbor Lets signs in and opens on the Lease list. A landlord at Harbor Lets opens on Property, and reads every lease without a form or a button.
Change it
In the design, each ask changes the App file or the definition, and the screens follow on the next publish.
| Say | What changes |
|---|---|
| "Add an owner view that shows every property at once." | A fourth Persona, owner: { access: viewer, opens: properties } |
| "Let the landlord read leases and change nothing." | Nothing: the viewer Access level grants no write, so the landlord gets no form and no button |
| "Add a renewal calendar to the home screen." | A screen the definition cannot derive, built in a slot: see Change what a screen shows |
Under the hood
| Part | Entries |
|---|---|
| Nouns | Software, App, Persona, Access Level, Tenant, Permission |
| Calls | Software.create, Interface.list, App.publish |
| Events | Software.created, App.published |
| Systems | Customer access, Sites |
| Rules | Each Persona's rules; the rules for your own team |
Give my team an admin
Say "give my team an admin" and every Noun gets a list, a record page and two forms, derived from its definition with nothing else to write.
Change what a screen shows
Say "show a renewal countdown on each lease" and a Component fills one named slot of a derived screen, while every other part keeps deriving.