Property info pages
/p/{token}/info is the property info hub for the booking’s unit.
Three sub-pages hang off it:
| Path | Content |
|---|---|
/p/{token}/info | Hub: WiFi, parking, amenities, kitchen, heating, address, links to walk-throughs |
/p/{token}/info/getting-in | Property-specific arrival walk-through (lockbox flow, keys, etc.) |
/p/{token}/info/leaving | Property-specific checkout walk-through |
/p/{token}/info/house-rules | Full 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:
| File | Property | Beds24 ID |
|---|---|---|
content/units/cc-223.md | Chateaux Chamonix #223 | 117485 |
content/units/ss-702.md | Steamboat Sheraton #702 | 117487 |
content/units/tp-501.md | Torian Plum #501 | 120202 |
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: 117485unitName: Chateaux Chamonix #223address: 2308 Ski Trail Ln, Steamboat Springs, CO 80487wifiNetwork: ChateauxChominoxwifiPassword: MontBlanc85googleMapsUrl: https://www.google.com/maps/d/edit?mid=...---
## ParkingProse paragraph(s).
## Amenities- Bullet list items become `type: "list"` sections.- Another bullet.
## Getting in1. Numbered list items also become `type: "list"`.2. Step two.Heading text is lowercased + hyphenated to form the section key
(## Getting in → getting-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:
vim content/units/cc-223.mdgit commit -am "CC: update arrival step 4"npx wrangler deployNo 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.tshandleInfoRoute+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.