Build write-up · 3 min read

How I built Door County Found

A curated guide to a Wisconsin peninsula, built as a real product: every place is structured data, the filters are real, and the person who keeps it current has never touched the code.

Role
Everything: product, identity, build
Built with
Astro 5, markdown content collections, Leaflet, Pages CMS
Runs on
Cloudflare Pages and one edge function, about $12 a year all in
Editor
My sister, through a web form
The Door County Found identity laid out flat: at left the Door County Found logo — a white lighthouse in a navy disc, gold beams spreading either side of it, the name in navy capitals above the word “found” underlined in rust script — then the headline “Found slowly, shared honestly.” and beneath it “a digital guide to Door County, Wisconsin.” At right a laptop stands open on the site’s front page — “Door County, the way we know it,” a drawn map of the peninsula, and pinned polaroids of Sister Bay, Baileys Harbor and Jacksonport. Around it on cream paper: a folded nautical chart of the shoreline, a Baileys Harbor lighthouse postcard, a leather motel keyfob stamped “stay curious,” a fifteen-cent cherry stamp, a strip of five cloth swatches in navy, gold, rust, teal and green, and a handwritten note reading “pack light, leave room for unexpected finds.”

My approach

  1. 01Research

    • Decades on the peninsula, in every season, in one long family document
    • 49 places seeded by script, then geocoded
    • No AI: the knowledge is the product
    The problem
  2. 02Design

    • Hand-built identity from an approved brand board
    • The real design is a typed schema: town, dog policy, veg flags
    • Every filter is a query over it
    Every place is data
  3. 03Build

    • Astro 5, statically built, markdown validated by a Zod schema
    • Leaflet map, Python image ladder, one Cloudflare edge function
    • AI wrote the code. I chose the stack and cut what needed a server
    Boring technology
  4. 04Handover

    • Pages CMS: a hosted form over the private repo, no code added
    • A push to main is live about two minutes later
    • A half-filled form cannot break the build
    Built for its editor

The problem

Decades of family time on the peninsula built up real knowledge of it, and not the summer kind only. Door County is a year-round place, with one set of places worth the drive in February and another in July, and the family knew which. That knowledge lived where it usually lives: in heads, in a long document, in “ask your aunt.” The big guide sites, meanwhile, compete on completeness and list every restaurant whether or not anyone would send a friend there.

So the product bet is the opposite: fewer places, every one vouched for, each led by a “why we love it” written the way the family actually talks. Best perch you will ever have. Real goats on the roof. Sentences a directory cannot produce.

The same bet reaches the pictures. A guide like this runs on trust, and there is a real difference between an illustration in the spirit of the peninsula and an image that appears to document what a place looks like. So invention has a place, and it is the identity: the campaign art, the drawn map, the cut-out ephemera. It has no place beside a real restaurant or trail, where the photograph has to be the place. The brand rules say it in one line, that generated imagery is never used as if it depicts an actual venue, dish, room, trail or view, and the build holds to it: the stand-in photographs that let an image-heavy layout be judged before the real ones arrived sit behind a flag and cannot reach a build.

Every place is data, not a blog post

The decision everything else hangs on: a place is a structured record, not an article. Name, town, category, address, dog policy, vegetarian flags, badges, good-to-know notes, photos, and one paragraph in the family voice. There are 58 live today.

The index page: a count reading 58 places above a row of three cards — Al Johnson’s Swedish Restaurant, Analog Ice Cream & Coffee, and Barringer’s — each with its own photograph, its town and category stamped above the name, and its own row of badges.
The index, counting itself. Three categories, three different badge rows, and not one stamp on any of them typed by hand: every one renders from the record.

Because everything is a field, the product parts come free:

  • Dog-friendly and vegetarian are real filters, not tags someone remembers to add
  • Every card’s town and category stamps render from the record
  • The directions button and the good-to-know panel draw from the same place, so nothing drifts
A place page for Al Johnson’s Swedish Restaurant: the photograph runs behind a card carrying the category and town, the name, and badges reading Found Favorite, Kid Approved and Live Music, above a Why we love it paragraph beside a panel with the address, a directions link, and good-to-know notes on dogs and vegetarian options.
A place page: the voice on the left, the record on the right, and the badges over the photograph drawn from the same fields. The dog line reads “we need to check” — a policy field can hold an honest gap as well as a caveat.

The signature feature is a filter

The first note in the family document was “add where dogs are welcome.” That became the sharpest edge: every place carries a dog policy with room for the caveat that matters, leashed at all times, keep them back from the edge. A dedicated Door County with your dog page is built from those fields, and vegetarian and vegan flags get the same treatment on every restaurant.

One deliberate omission: no lodging. That is where every competitor fights, and skipping it keeps the guide personal and maintainable.

The Door County with your dog page: three cards each badged Dogs welcome, and under them a heading reading With caveats, 9, over the line “usually trails yes, beach no — the caveat is on each card and page.”
The dogs page is not an article somebody wrote. It is a query over the records, sorted into the places where the answer is plainly yes and the nine that come with fine print.

Boring technology, chosen on purpose

Every piece is chosen so there is nothing to maintain:

  • Astro, statically built; the vintage identity of cream paper, harbor navy, and beacon gold is hand-built, not themed
  • Cloudflare Pages hosting, about $12 a year all in, nothing to patch
  • Pages CMS for editing: a hosted form over the repository’s own content, zero code added to the site
  • An honest exit: everything is structured markdown, so migrating it anywhere is mechanical, not a rewrite

The one mid-build switch proves the criterion. The first editing tool turned out to need a server runtime and a GitHub App, exactly the moving parts this site exists to avoid, so it went.

  1. The map on a phone: filter chips reading All 57, Eat 15, Drink 10, Do 20, Art 8, Shows 4 and Dogs 11, above a map of the peninsula where every town carries its own count and a circle sized to it.

    The map, and chips that count themselves

  2. The dog guide on a phone: the headline Door County with your dog, a paragraph on how the list is checked, two polaroids of dogs named Lucia and Scout, and the start of the Dogs welcome list beneath them.

    The dog guide, polaroids intact

Hand-built holds up at phone size, and so does the one moving part — the whole peninsula and every filter fit on a phone screen. Nothing here is a theme.

Built for its editor, not its builder

The real user of the workflow is my sister, who is not a developer and should never have to become one. She signs into a web form, fills in the fields, hits save, and the change is live about two minutes later. The product ships with its own operating manual, down to how the photo cropping works.

That is the part I would show a client. Building the site is the visible work; designing the workflow so the right person can keep it alive without me is the product thinking, whether the editor is my sister or your content team.