---
url: https://saas.dev/docs/site
md: https://saas.dev/docs/site.md
---

# Site

Leaseclock's home page, pricing page, terms, privacy policy, `llms.txt` and OpenAPI file are served at `leaseclock.com`. They are written from the definition and set in your theme, and you can replace any page with your own.

[Open leaseclock.com](https://leaseclock.com)

## In short

[Leaseclock's home page, with the Leaseclock Pro card at $29 a month](https://leaseclock.com)

| Page | Address | Written from |
| --- | --- | --- |
| Home | [leaseclock.com](https://leaseclock.com) | Who each Offer is for, and what each Verb does |
| Pricing | [leaseclock.com/pricing](https://leaseclock.com/pricing) | Each Offer's name, price and limits |
| Terms | [leaseclock.com/terms](https://leaseclock.com/terms) | Your business details in Stripe, and each Offer's price and billing period |
| Privacy | [leaseclock.com/privacy](https://leaseclock.com/privacy) | The personal data your Nouns keep, and who processes it |
| `llms.txt` | [leaseclock.com/llms.txt](https://leaseclock.com/llms.txt) | Every Noun, Verb, docs page and agent address |
| OpenAPI | [leaseclock.com/openapi.json](https://leaseclock.com/openapi.json) | Every API operation, with its input and response |

Sign in and Get started on every page open the app at `leaseclock.com/app`. Subscribe on the pricing page opens [Stripe Checkout](https://saas.dev/docs/stripe.md) for that Offer.

## Leaseclock's site

A property manager who lands on [leaseclock.com](https://leaseclock.com) sees Leaseclock's teal logo, then Pricing, Docs and Blog in the header, and Sign in and Get started on the right. The headline reads "No lease renewal slips past its date." Under it sits Leaseclock's own Leases list, framed, and then the Leaseclock Pro strip: up to 200 units, and "Subscribe · $29 a month". The footer links Terms, Privacy, `llms.txt` and OpenAPI.

Your home page shows your App's main list, captured from your Test copy on every push.

Each line on the page comes from a line of the definition:

| On leaseclock.com | From the definition |
| --- | --- |
| Leaseclock Pro, $29 a month | `name: Leaseclock Pro` and `price: { amount: 29, currency: USD, unit: month }` in `Offer/pro.mdx` |
| Up to 200 units | `limits: { Unit: 200 }` |
| For property managers and leasing coordinators | `personas: Property manager, Leasing coordinator` |
| "Move the end date forward" and "End the lease", in the feature list | Each Verb's `does` in `Noun/Lease.mdx` |
| The privacy policy's line "Leaseclock stores each renter's email address" | `renter: { type: email, required: true }` |
| Teal buttons and links, set in Inter | `"brand": "#0F766E"` and `"font": "Inter"` in `theme.json` |

The site follows the definition on the next request. Add a second Offer and the pricing page shows two cards. Add a `phone` field to Lease and the privacy policy lists phone numbers.

## Serve it on your domain

Add the domain once. The CLI prints the DNS record to set, waits for it and issues the certificate.

```bash
npx saas.dev domain add leaseclock.com
```

```text
Add this record at your DNS provider:

  leaseclock.com   CNAME   cname.saas.dev

Checking DNS... found.
Certificate issued for leaseclock.com.
leaseclock.com serves Leaseclock.
```

The whole product shares the domain. The site is at `/`, `/pricing`, `/terms` and `/privacy`, the app at `/app`, the [API](https://saas.dev/docs/api.md) at `/api`, the [docs](https://saas.dev/docs/your-docs.md) at `/docs`, the [blog](https://saas.dev/docs/blog.md) at `/blog` and the [MCP server](https://saas.dev/docs/mcp.md) at `/mcp`.

## Agent files

`llms.txt` tells an agent what Leaseclock is and where everything lives. It needs no key.

```bash
curl https://leaseclock.com/llms.txt
```

```md title="leaseclock.com/llms.txt"
# Leaseclock

> Leaseclock tracks lease renewals for property managers and leasing coordinators.

## Docs

- [Lease](https://leaseclock.com/docs/lease.md): unit, renter, endsOn, status. Verbs: renew (move the end date forward), end (end the lease).
- [Unit](https://leaseclock.com/docs/unit.md): label, building.
- [API](https://leaseclock.com/docs/api.md): REST at https://leaseclock.com/api

## For agents

- MCP server: https://leaseclock.com/mcp (tools: search, fetch, do)
- OpenAPI: https://leaseclock.com/openapi.json
- SDK: npm i leaseclock
- CLI: npx leaseclock

## Pricing

- [Leaseclock Pro](https://leaseclock.com/pricing): $29 a month, up to 200 units
```

The OpenAPI file describes every operation the API serves, so any client generator or agent framework can call Leaseclock.

```bash
curl -s https://leaseclock.com/openapi.json | jq '.paths | keys'
```

```json
[
  "/api/leases",
  "/api/leases/{id}",
  "/api/leases/{id}/end",
  "/api/leases/{id}/renew",
  "/api/units",
  "/api/units/{id}"
]
```

Both files are written from the current version of the definition, so a new Verb appears in them the moment it is served.

## Change a page

A file in `pages/` replaces the page at the same address. Write it in MDX to change the words and keep the generated layout:

```mdx title="pages/index.mdx"
---
headline: Every lease renewal, on time
lede: Leaseclock watches the end date of every lease across your units and renews it in two clicks.
---
```

Write it in React to replace the whole page. The header, footer, theme and Stripe Checkout stay generated, and you maintain only the page you wrote.

```tsx title="pages/pricing.tsx"
import { PricingCards } from 'saas.dev/site'

export default function Pricing({ offers }) {
  return (
    <main>
      <h1>Pricing</h1>
      <PricingCards offers={offers} />
      <p>Managing more than 200 units? Write to sales@leaseclock.com.</p>
    </main>
  )
}
```

Push, and leaseclock.com serves the new page on the next request.

```bash
npx saas.dev push
```

[Defaults and overrides](https://saas.dev/docs/overrides.md) covers the theme, fields, views and screens the same way.

## Add a page

A file in `pages/` with a new name adds a page. `pages/about.mdx` is served at `leaseclock.com/about`, set in Leaseclock's theme, listed in the sitemap and linked from the footer.

```mdx title="pages/about.mdx"
---
title: About Leaseclock
---

Leaseclock started inside a property management office that lost two renewals in one winter.
```

## Questions

### Who writes the words on the home page?

SaaS.Dev writes them from your definition: who each Offer is for, what each Verb does and what each plan costs. They change when the definition changes, except for the lines you set in `pages/`.

### Are the generated terms and privacy policy ready to publish?

They name your business from your Stripe account, your prices and billing periods, the personal data your Nouns keep, and Stripe as your payment processor. Have your lawyer read them before you sell in Live, and put their text in `pages/terms.mdx` or `pages/privacy.mdx` to replace either page.

### Can I keep my existing marketing site?

Yes. Add the product on a subdomain with [`npx saas.dev domain add app.leaseclock.com`](https://saas.dev/docs/saas-dev-cli.md), keep your own site at `leaseclock.com`, and point its Sign in and pricing buttons at `app.leaseclock.com`.

### How do search engines and agents find it?

Every page has its own title, description and social image, and is listed in `leaseclock.com/sitemap.xml`. Agents read `llms.txt`, and every page has a Markdown copy at its address plus `.md`, such as `leaseclock.com/pricing.md`.

### Where do the prices come from?

From your [Offers](https://saas.dev/docs/offers.md). Each Offer is one pricing card, and its price is the one Stripe charges, so the page and the checkout always agree.
