docs

UrPage profile reference

An UrPage business page is generated from a single structured profile — a small YAML file describing your business: its name, contact details, opening hours, and the links you want up front. The profile is the source of truth; the page is generated from it. Every field is optional — a minimal profile is just a name and a link or two. You author the profile, publish it under a handle, and the server renders the page at <handle>.urpage.net.

Early access

UrPage is in development and not yet open to everyone. The profile format and the renderer described here are real and in use; the authoring flow is still being finished. This page is a factual reference for the profile format as it stands today.

This page lists every field a profile can set, grouped by what it controls. Several fields take a curated key — one of a fixed, named set of values (themes, patterns, link icons, and so on). An invalid value for a curated-key field is rejected when you publish, so a typo surfaces immediately rather than rendering something unexpected. URLs must be http(s). Booleans default to false.

Minimal profile

name: Joe's Coffee
links:
  - label: Menu
    url: https://joescoffee.example/menu

A name and one link is enough to publish. Everything below is optional and adds to the page when present.

Fully populated example

This profile exercises the main fields — identity (with head title/description overrides), contact, hours with a timezone, links with icons, appearance, an announcement, and a call-to-action button.

name: Joe's Coffee
tagline: Fresh roasts daily
title: Joe's Coffee — Anytown's neighborhood roaster
description: Fresh-roasted coffee and pastries, open seven days in Anytown.
phone: "+1-555-0100"
email: hello@joescoffee.example
address: 1 Bean St, Anytown
established: "1998"

hours:
  - day: monday
    open: "08:00"
    close: "17:00"
  - day: saturday
    open: "09:00"
    close: "14:00"
  - day: sunday
    closed: true
timezone: America/Los_Angeles

links:
  - label: Menu
    url: https://joescoffee.example/menu
    icon: menu
  - label: Instagram
    url: https://instagram.com/joescoffee
  - label: Order online
    url: https://order.joescoffee.example

logo_ref: https://assets.example.com/joes-logo.png

theme: warm
layout: page
pattern: dots
accent: "☕"

announcement: Closed July 4th for the holiday.
cta:
  label: Order ahead
  url: https://order.joescoffee.example
directions: true

Identity & contact

The business identity and the ways a visitor can reach you. Contact fields that map to an action (phone, email) render as the corresponding link.

FieldTypeWhat it does
namestringThe business display name, shown as the page heading. This is distinct from the handle (the <handle> in <handle>.urpage.net). Also the default for the page title and the Open Graph title.
taglinestringA short one-line description shown under the name. Also the default for the meta description.
titlestring (optional)The browser-tab / search-result title (the HTML <title> and the Open Graph / Twitter title). Defaults to name when omitted — set it only when you want a head title that differs from the on-page heading.
descriptionstring (optional)The search-result / social-preview snippet (the meta description and the Open Graph / Twitter description). Defaults to tagline when omitted.
phonestringA phone number. Renders as a tel: link a visitor can tap to call.
emailstringA contact email. Renders as a mailto: link.
addressstringA street address, shown on the page. Also required for the directions link (see Content extras).

Hours

hours is a list — one entry per day you want shown. List only the days you want to appear; omitted days simply aren't listed. Opening hours drive a live "open now" badge on the page.

Each entry in the list:

FieldTypeWhat it does
daycurated keyThe weekday: one of monday, tuesday, wednesday, thursday, friday, saturday, sunday.
openstringOpening time. Accepts either 24-hour ("08:00") or 12-hour ("8am", "8:00 AM") form. Omit on a closed or all-day day.
closestringClosing time, same 24-hour or 12-hour forms as open. Omit on a closed or all-day day.
alldayboolSet true for a day that's open 24 hours; the row renders "Open 24 hours" and open/close are ignored.
closedboolSet true for a day with no hours. When set, open/close are omitted for that day. (closed wins if both closed and allday are set.)

Alongside the list, two top-level fields tune how hours show. timezone lives here; time_format is an Appearance field (it selects how every row's times are written):

FieldTypeWhat it does
timezonestringAn IANA timezone name, e.g. America/Los_Angeles. Makes the "open now" badge correct for visitors in any zone.
hours:
  - day: monday
    open: "08:00"
    close: "17:00"
  - day: sunday
    closed: true
timezone: America/Los_Angeles

links is a list of labelled outbound links shown on the page — your menu, socials, an order page, whatever you want up front. Add one entry per link.

Each entry:

FieldTypeWhat it does
labelstringThe link text shown to visitors.
urlstringThe destination. Must be http or https.
iconcurated key (optional)The icon shown beside the link. Leave it off to auto-detect from the URL (a github.com link gets the GitHub icon, and so on); set it explicitly to override.

icon accepts a curated key. Brand icons include github, twitter, instagram, linkedin, youtube, facebook, tiktok, spotify, soundcloud, bandcamp, twitch, discord, telegram, whatsapp, patreon, kofi, substack, reddit, pinterest, bluesky, gitlab, and mastodon; utility icons include email, phone, web, map, menu, calendar, shop, reviews, document, download, rss, music, video, photos, podcast, link, heart, and chat. An empty icon is auto-detected from the URL.

links:
  - label: Menu
    url: https://joescoffee.example/menu
    icon: menu
  - label: Instagram
    url: https://instagram.com/joescoffee
FieldTypeWhat it does
logo_refstringAn http(s) URL to a logo image. Renders in the page header.

Appearance

Appearance fields select the page's look from curated presets. Each defaults to a sensible value, so you can ship without setting any of them. The curated-key fields (theme, layout, pattern, shuffle, time_format) reject an invalid value on publish.

FieldTypeWhat it does
themecurated keyThe colour scheme: warm, cool, forest, ink, paper, or coral. Default warm.
layoutcurated keyThe page layout: page (full page) or card (a centred card). Default page.
patterncurated keyAn opt-in background texture: dots, grid, confetti, squiggle, waves, topography, mesh, or crosshatch. Default is no pattern.
time_formatcurated keyHow the opening hours are written: 24h (09:00) or 12h (9:00 AM). Default 24h. Controls only the display — open/close can be authored in either form.
gradientboolAdds a gradient accent. Default false.
motionboolEnables subtle motion. Default false.
flairboolA one-click bundle — implies a gradient, motion, and a vibrant accent together. Default false.
shufflecurated keyRandomises the look on each page load: scheme (vary the colour scheme) or all (vary the whole look). Default off.
accentstringA single emoji shown beside the name.

Content extras

Optional extras that add a banner, a year, a button, or a directions link.

FieldTypeWhat it does
announcementstringA short message (up to 280 characters) shown as a bar across the top of the page.
marqueeboolScrolls the announcement across the bar. Default false.
establishedstringA four-digit year as a string (e.g. "1998" — quote it so YAML keeps it textual), rendered as "Est. <year>".
ctaobjectOne prominent call-to-action button. Takes label (the button text) and url (the destination, http(s)).
directionsboolShows a "Get directions" maps link. Default false. Requires address to be set.
announcement: Closed July 4th for the holiday.
established: "1998"

cta:
  label: Order ahead
  url: https://order.joescoffee.example

directions: true

Publishing

Scaffold a starting profile with yourspace page init (it writes a commented urpage.yml), fill in your details, then publish it. Re-publishing an unchanged profile is a no-op. Validation runs on the server, so an invalid curated-key value or a non-http(s) URL is rejected at publish time with a message naming what was wrong.