---
chain: ["27 lines", "34 outputs", "216 screens", "$27.86 per subscriber", "44 Nouns · 190 Verbs"]
---

# Define Nouns and Verbs. The rest is generated.

Nouns are what your SaaS keeps; Verbs, what people and agents do. Leaseclock, below, is 27 lines, and nobody wrote anything else.

Your first product is free; each after it is $49 a month. You keep your files, your records and your Stripe account. [Export in one call](/docs/interfaces#export)

leaseclock.com · 4 files · 27 lines.

```mdx title="leaseclock.com/Startup/leaseclock.com.mdx"
---
$type: Startup
$id: leaseclock.com
name: Leaseclock
description: Tracks lease renewals for small property managers.
pitch: No renewal slips past its date.
icp: small property managers
brand: Leaseclock
---
```

```mdx title="leaseclock.com/Noun/Unit.mdx"
---
$type: Noun
$id: leaseclock.com/nouns/Unit
name: Unit
fields:
  label: { type: text, required: true }
  building: { type: text }
---
```

```mdx title="leaseclock.com/Noun/Lease.mdx"
---
$type: Noun
$id: leaseclock.com/nouns/Lease
name: Lease
fields:
  unit: { type: link, target: Unit, required: true }
  renter: { type: email, required: true }
  endsOn: { type: date, required: true, indexed: true }
  status: { type: choice, options: [{ key: active }, { key: ended }] }
verbs:
  renew:
    does: Move the end date forward
    input: { endsOn: { says: the new end date, type: date, required: true } }
    from: [active]
    fn: { kind: code, body: replace }
  end: { does: End the lease, from: [active], to: ended }
---
```

```mdx title="leaseclock.com/Offer/pro.mdx"
---
$type: Offer
$id: leaseclock.com/offers/pro
name: Leaseclock Pro
price: { amount: 29, currency: USD, unit: month }
limits: { Unit: 200 }
personas: Property manager, Leasing coordinator
status: Live
---
```

Rename Lease or renew. Every address reprints.

```bash
curl https://api.sb/leaseclock.com/leases/4b/renew
```

- App · `Leases › 4B › Renew`
- API · `POST /leases/4b/renew`
- CLI · `do Lease.renew 4b`
- MCP · `do Lease.renew`
- SDK · `$.Lease.renew('4b', { endsOn })`
- Site · `leaseclock.com/pricing`
- Docs · `leaseclock.com/docs/lease#renew`
- Blog · `leaseclock.com/blog`
- Stripe · `Leaseclock Pro · monthly`

## Generated, never scaffolded.

Your agent could write all 34 into your repo for you to maintain. Here nothing is copied; each improvement reaches you on the next request.

- **App** (4): A 9-screen Admin for your team · A button for every Verb · SaaS App for your Customers · Customer sign-in
- **API** (5): 18 operations on 2 Collections · Your own domain · Customer keys and Limits · One Tenant per Customer · Refusals that name the fix
- **CLI** (2): show for every record · do for every Verb
- **MCP** (2): search, fetch and do · Tools for your Customers’ agents
- **SDK** (3): A typed $ with 14 methods · TypeScript, Zod and JSON Schema · Packages under your name
- **Site** (2): Home, pricing and legal pages · /llms.txt, OpenAPI and agents.json
- **Docs** (3): A page per Noun and Verb · A Markdown twin of every page · Examples tested on every Interface
- **Blog** (2): /blog · A changelog
- **Stripe** (5): A Product and Price per Offer · Checkout and signed webhooks · Monthly subscriptions · A billing portal · Payouts to your own account
- **Underneath every Noun** (6): Four Access levels · Previews that run nothing · Try mode · Versions and undo · Test and Dev environments · Export in one call

34 outputs.

## Define your first Noun.

Step 0 needs no key, and every write has an undo.

0. This URL exists because Startup declares create.

```bash
curl https://api.sb/startups/create
```

1. Sign in once. Two export lines follow.

```bash
npx startup-builder login
```

2. Create your Startup: check it in try, then commit.

```bash
curl -X POST https://api.sb/startups/create \
  -H "authorization: Bearer $SB_TOKEN" \
  -H 'Prefer: mode=try' \
  -d '{"domain":"<your-domain>"}'
```

3. Send the files you wrote: try, then commit.

```bash
curl -X POST https://api.sb/<your-domain>/nouns \
  -H "authorization: Bearer $SB_TOKEN" \
  -H 'Prefer: mode=try' \
  -F file=@Noun/Unit.mdx -F file=@Noun/Lease.mdx
```

4. Your Site, Docs and llms.txt, on your own domain.

```bash
curl https://<your-domain>/llms.txt
```

## Batteries included.

Every output has a default. Override any style or component, and you maintain only what you override.

- Theme: you maintain the token values
- CSS: you maintain your rules
- A field’s input: you maintain that one input
- A Noun’s view: you maintain that view’s layout
- A page or screen: you maintain that page’s or screen’s layout
- A Function body: you maintain what the Verb does

6 overrides. Unit 96 · Lease 120: 216 screens, never drawn.

## Get paid with Stripe.

Write the price once. You never create a Stripe Product or Price.

- Leaseclock Pro · `amount: 29`
- /pricing · up to 200 units
- Checkout · signed webhook
- Subscription
- Billing portal
- Your Stripe account: $27.86 per subscriber, after Stripe's standard card rate (2.9% + 30¢)

Your Customers pay you $29 a month for Leaseclock Pro, through your own Stripe account.

## The constraints are the feature.

Every Noun takes one shape, SaaS.Dev's own included. That is why your agent gets yours right, and you can check all 27 lines yourself.

- **Unit**: fields label · building (2); verbs none (0)
- **Lease**: fields unit · renter · endsOn · status (4); verbs renew · end (2)
- **<your Noun>**: the same three keys.

api.sb's own, in the same shape: [44 Nouns · 190 Verbs](/docs/how-it-works#constraints), each with at least 3 Verbs.

> Read https://saas.dev/llms.txt. Write the Nouns, Verbs and Offer for <your product> in Leaseclock's shape. Check each file with Prefer: mode=try, fix every refusal, and show me the files before you commit.
