Skip to content

Put up a page

Say "put up a page" and get a home page live on a free address in minutes, with terms, privacy, your Brand and HTTPS.

For developers

Get a page live tonight on a free address, under your Brand. Move it to your own Domain whenever you buy one.

For developers

Needs Startup

What you get

  • 1free address, yours until you release itDomain
  • 1home page: headline, promise and one call to actionPage
  • 2pages for terms and privacyPage
  • 1logo, colors and type from your BrandBrand
  • 1certificate, so it serves over HTTPSDomain
  • 1Markdown copy of every page and an llms.txt, for agentsSite
  • 1count of visits from the first viewVisit

Your agent does

Domain.claim → Site.publish
You, to your agent

Put up a page.

Launch a landing page tonight.

Make me a landing page on a free address.

# Look up the Startup: Startup.list
STARTUP=$(curl "https://api.sb/leaseline.app/startups?limit=1" \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" | jq -r '.startups[0]["$id"] | split("/") | last')

# 1. Domain.claim
curl -X POST https://api.sb/leaseline.app/domains/claim \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"hostname":"leaseline.headless.ly","startup":"'"$STARTUP"'"}'

# Look up the Site: Site.list
SITE=$(curl "https://api.sb/leaseline.app/sites?limit=1" \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" | jq -r '.sites[0]["$id"] | split("/") | last')

# 2. Site.publish
curl -X POST https://api.sb/leaseline.app/sites/$SITE/publish \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"
import { $ } from 'startup-builder'

const [startup] = await $.Startup.list({ limit: 1 })
await $.Domain.claim({ hostname: 'leaseline.headless.ly', startup: startup.$id })
const [site] = await $.Site.list({ limit: 1 })
await $.Site.publish({ site: site.$id })
STARTUP=$(npx startup-builder do Startup.list --json '{"limit":1}' | jq -r '.startups[0]["$id"] | split("/") | last')
npx startup-builder do Domain.claim --json '{"hostname":"leaseline.headless.ly","startup":"'"$STARTUP"'"}'
SITE=$(npx startup-builder do Site.list --json '{"limit":1}' | jq -r '.sites[0]["$id"] | split("/") | last')
npx startup-builder do Site.publish --json '{"site":"'"$SITE"'"}'
{
  "name": "do",
  "arguments": {
    "code": "const [startup] = await $.Startup.list({ limit: 1 })\nawait $.Domain.claim({ hostname: 'leaseline.headless.ly', startup: startup.$id })\nconst [site] = await $.Site.list({ limit: 1 })\nreturn await $.Site.publish({ site: site.$id })"
  }
}

The same sentence does more as the business grows:

StateCallsAsks first
IdeaDomain.claim, Site.publishWho is it for, and what does it fix, in one line?
BuildingDomain.connect, Site.publishMove it to your own domain now?
LiveContent.draft, Content.publishA new page, or a change to the home page?

Change it

  • Make the headline shorter.
  • Add a pricing section.
  • Put it on leaseline.app.
  • Add a waitlist to it.

Under the hood

Systems
Sites, CMS, Product analytics
Nouns
Site, Page, Brand, Domain, Visit
Events
Domain.claimed, Site.published

Domain.claim gives the Startup one label under an issuing Domain, free. Site.publish puts the Site live there, and every page has a Markdown copy that agents read.