The landing pages from PR #9 were functional. They were not, in any sense, good. This PR is the visual and editorial pass that turns them into something I'm willing to put on a business card.
Visual redesign
Inspired by GoHighLevel's marketing pages, which I think strike a nice balance between "looks like a real product" and "doesn't scream SaaS template":
- Light gradient hero — soft color wash behind the headline instead of the flat white it had before.
- Poppins font throughout — tight letter spacing in the headlines, looser in the body, pulls the whole page together.
- Gold CTA buttons on the dark sections, high contrast, unambiguous as the thing you're supposed to click.
- Dark navy sections alternating with the light hero and card sections — gives the page rhythm instead of one undifferentiated wall of white.
- Bolder cards with staggered entrance animations — cards fade and slide in sequentially on scroll, which is a small cosmetic thing but gives the page a sense of life without being obnoxious about it.
packages/landing/css/landing.css grew by a few hundred lines to support all of the above. +579 / −291 total for the PR.
SEO metadata on all four pages
Every landing page now carries a full metadata block:
- Open Graph — title, description, image (1200×630), url, site_name, type.
- Twitter Card —
summary_large_image, title, description, image. - Canonical URLs — explicit
<link rel="canonical">on every page, so/,/index.html, and?utm_source=…variants all point to the same canonical resource. - JSON-LD structured data —
Organizationschema on the index,Productschema on managers/owners/investors pages, both validated against Google's Rich Results Test in the test plan. theme-color— matches the dark navy sections, so mobile browser chrome blends into the page.
This is the stuff search engines and social previewers actually care about. It's also the stuff that's invisible to the user of the page, which is exactly why it's easy to forget until you notice a tweet of your page previewing as a blank card.
Conversion copy rewrite
The old copy was vague — "Modern property management software" type stuff. The rewrite leans on specific numbers and real questions the persona is already asking:
index.html— "Your condo runs on paper. We fixed that."managers.html— "940 documents. 17 deadlines. One afternoon. $6." (The real numbers from Bamboo House's first run through the pipeline. The $6 is the OCR API cost.)owners.html— "Your board spent $47,000 last quarter. Can you see the receipts?" (The answer is almost always "no" under a traditional PM, and "yes, one click" under honest-cam.)investors.html— "1.5 million HOAs. $50B in fees. Managed on paper."
Problem cards are phrased as questions ("Where did the money go?", "When is the SIRS deadline?"), because that's how the persona actually talks to themselves about their own pain. CTAs are specific and action-shaped ("See a sample report", not "Learn more").
Image caching
Also added cache headers in vercel.json for images: 1 day on the browser, 7 days on the CDN. Landing-page images change rarely, and there's no reason for the CDN to keep refetching them. Small win, but free.
Test plan
- Verify all four pages render cleanly on desktop and on an actual phone (not just the devtools emulator).
- Check OG previews via Facebook's Sharing Debugger and the Twitter Card validator.
- Validate JSON-LD with Google's Rich Results Test.
- Confirm the image cache headers in the response from Vercel.