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.
| Field | Type | What it does |
|---|---|---|
name | string | The 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. |
tagline | string | A short one-line description shown under the name. Also the default for the meta description. |
title | string (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. |
description | string (optional) | The search-result / social-preview snippet (the meta description and the Open Graph / Twitter description). Defaults to tagline when omitted. |
phone | string | A phone number. Renders as a tel: link a visitor can tap to call. |
email | string | A contact email. Renders as a mailto: link. |
address | string | A 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:
| Field | Type | What it does |
|---|---|---|
day | curated key | The weekday: one of monday, tuesday, wednesday, thursday, friday, saturday, sunday. |
open | string | Opening time. Accepts either 24-hour ("08:00") or 12-hour ("8am", "8:00 AM") form. Omit on a closed or all-day day. |
close | string | Closing time, same 24-hour or 12-hour forms as open. Omit on a closed or all-day day. |
allday | bool | Set true for a day that's open 24 hours; the row renders "Open 24 hours" and open/close are ignored. |
closed | bool | Set 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):
| Field | Type | What it does |
|---|---|---|
timezone | string | An 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
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:
| Field | Type | What it does |
|---|---|---|
label | string | The link text shown to visitors. |
url | string | The destination. Must be http or https. |
icon | curated 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
Logo
| Field | Type | What it does |
|---|---|---|
logo_ref | string | An 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.
| Field | Type | What it does |
|---|---|---|
theme | curated key | The colour scheme: warm, cool, forest, ink, paper, or coral. Default warm. |
layout | curated key | The page layout: page (full page) or card (a centred card). Default page. |
pattern | curated key | An opt-in background texture: dots, grid, confetti, squiggle, waves, topography, mesh, or crosshatch. Default is no pattern. |
time_format | curated key | How 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. |
gradient | bool | Adds a gradient accent. Default false. |
motion | bool | Enables subtle motion. Default false. |
flair | bool | A one-click bundle — implies a gradient, motion, and a vibrant accent together. Default false. |
shuffle | curated key | Randomises the look on each page load: scheme (vary the colour scheme) or all (vary the whole look). Default off. |
accent | string | A single emoji shown beside the name. |
Content extras
Optional extras that add a banner, a year, a button, or a directions link.
| Field | Type | What it does |
|---|---|---|
announcement | string | A short message (up to 280 characters) shown as a bar across the top of the page. |
marquee | bool | Scrolls the announcement across the bar. Default false. |
established | string | A four-digit year as a string (e.g. "1998" — quote it so YAML keeps it textual), rendered as "Est. <year>". |
cta | object | One prominent call-to-action button. Takes label (the button text) and url (the destination, http(s)). |
directions | bool | Shows 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.