Skip to content

Property info pages

/p/{token}/info is the property info hub for the booking’s unit. Three sub-pages hang off it:

PathContent
/p/{token}/infoHub: WiFi, parking, amenities, kitchen, heating, address, links to walk-throughs
/p/{token}/info/getting-inProperty-specific arrival walk-through (lockbox flow, keys, etc.)
/p/{token}/info/leavingProperty-specific checkout walk-through
/p/{token}/info/house-rulesFull numbered house-rules list

Why it lives here

This content used to live publicly at steamboatbyowner.com/<unit>. Bill didn’t want it discoverable on stayonthesnow.com because it contains things like WiFi passwords and lockbox-area instructions. Now that the portal is gated behind a 256-bit token, that content has a proper home: every page is reachable only by holders of the booking’s token.

Where the content lives

Markdown files at the repo root, one per unit:

FilePropertyBeds24 ID
content/units/cc-223.mdChateaux Chamonix #223117485
content/units/ss-702.mdSteamboat Sheraton #702117487
content/units/tp-501.mdTorian Plum #501120202

Each file has YAML-ish frontmatter for structured fields (propertyId, unitName, address, wifi*, googleMapsUrl, etc.) and ##-delimited body sections for prose / lists. The worker bundles them at deploy time (wrangler.jsonc rules + find_additional_modules: true), parses them at module load with a tiny in-house parser (src/lib/markdown-content.ts), and the renderers see plain JS objects.

This format was deliberately chosen to match the wiki + the future P11 public-site rebuild — one content format for everything.

File format

---
propertyId: 117485
unitName: Chateaux Chamonix #223
address: 2308 Ski Trail Ln, Steamboat Springs, CO 80487
wifiNetwork: ChateauxChominox
wifiPassword: MontBlanc85
googleMapsUrl: https://www.google.com/maps/d/edit?mid=...
---
## Parking
Prose paragraph(s).
## Amenities
- Bullet list items become `type: "list"` sections.
- Another bullet.
## Getting in
1. Numbered list items also become `type: "list"`.
2. Step two.

Heading text is lowercased + hyphenated to form the section key (## Getting ingetting-in). The parser auto-detects list vs. prose based on whether all non-blank lines start with 1. / -.

Editing

Open the .md file, edit, commit, deploy:

Terminal window
vim content/units/cc-223.md
git commit -am "CC: update arrival step 4"
npx wrangler deploy

No D1 round-trip. The audit view at /admin/portal-preview and the live portal both pick up the change on next deploy.

The structure is rich enough that each property can carry different sections — TP501’s WiFi password is intentionally empty because it’s issued at the front desk; SS702 has 10 arrival steps where CC223 has 6.

Steamboatbyowner.com retirement

The intent is to retire steamboatbyowner.com as a public site once emails are fully cut over (P12.M7 burn-in window). Until then, both work — the new portal is the canonical source, the public site is the deprecated mirror.

Source

  • Routes: src/routes/portal.ts handleInfoRoute + renderInfoHub / renderGettingIn / renderLeaving / renderHouseRules
  • Content: src/property-content/*.ts
  • Tests: test/routes/portal.test.ts — 6 M8 cases covering hub render, property-specific data for CC/SS/TP, getting-in, leaving, house-rules.