Case study 01 / Hospitality / Portland, OR

ProperPint

Three neighborhood taprooms that had to stay three neighborhoods. One system, no house style flattening the rooms.

properpint.beer
Role
Design & build
Year
2026
Build
Next.js · WordPress migration
Scope
Site, UX, local SEO
01

The brief

A neighborhood bar, three times over. Same hospitality, three genuinely different rooms.

01

Find the nearest one fast. Woodstock, Multnomah Village or Slabtown, with directions one tap away.

02

Let each room keep its own material story. Black walnut, Oregon white oak, mahogany and copper.

03

Move off WordPress without losing the local search ranking three taprooms depend on.

02

Cream, gold,and the wool

Pulled off the Pendleton wool and the brass in the rooms, not out of a palette generator.

#F4F3EF

Cream, the page

#404040

Charcoal

#AA9247

Gold, every action

#2F3A2E

Forest

#DDDDDD

Divider

Warm cream instead of white, so the room photography reads as evening rather than showroom. Gold is reserved. It only ever appears on something you can press.

A proper pint

Montserrat · 700 · 66/50/36/24px · +0.04em

Every heading is Bold with positive tracking. Four sizes, nothing between.

If it's a pint, it's a true pint. We pour what we charge for.

Jost · 400 · 16/24 body · 20px quiet link

A geometric sans for everything that is read rather than scanned. One size, one leading, on every page.

03

Four parts,three rooms

A card, a table, a button, a divider. Swap the photography and the room changes; the site doesn't.

ALocation card

Woodstock

Neighborhood taproom, long tables, the original room.

Get Directions

A tall 683×1024 portrait with the location badge hung off the bottom-left corner, overhanging the frame by 50px.

BHours table

Hours

  • Monday2–9 PM
  • Tuesday2–9 PM
  • Wednesday1–11 PM
  • Thursday1–11 PM
  • Friday12 PM–12 AM
  • Saturday12 PM–12 AM
  • Sunday12–11 PM

Seven rows, one source. The same file feeds the visible table and the OpeningHoursSpecification in the structured data, so Google and the door never disagree.

CButtons, three ways
Get DirectionsTap ListSee all locations

Gold for the thing you want them to do, charcoal for the second option, a plain underlined Jost link for everything else. 3px radius, 0.08em tracking, and directions clicks fire as conversions.

DTilt divider

A proper pint

Same cut, every section change.

One SVG path, a 10:1 sliver, flipped and rotated per use. It is the only non-rectangular thing on the site. Every section change is this same 0.6° cut rather than a new color block.

04

Underthe hood

Off WordPress, onto typed content files. The local rankings came with it.

Framework

Next.js on Vercel, migrated off a WordPress install. The old export still sits in the repo for reference.

Content

Locations, hours and FAQs are typed content files. One location object drives its card, its page, its map and its schema.

Local SEO

Per-location LocalBusiness and FAQ structured data, canonical URLs and a dedicated page per neighborhood.

Tracking

Directions, tap list and phone taps are tagged at the button, so the owner sees which room people are actually driving to.

Tap lists

Untappd holds the live list per location. We link out rather than rebuild a menu that changes daily.

Events

Events stay on Facebook, where the regulars already are. The site points at them instead of duplicating a calendar.

Three rooms, one system.