All work

Beer Trails

A travel-diary style web app that turns every beer you drink into a pin on a globe. I designed it in Figma, then built and launched it as a working app anyone can try.

Role
Product design, UX, UI and front-end build
Type
Personal project, live and installable
Tools
Figma, JavaScript, d3, Claude
Two phones showing the Beer Trails globe with beer pins and a trail list

Overview

Beer Trails sits somewhere between a travel diary and a beer log. You can see where you were, what you were drinking and who you were with, all on one map.

The globe is the home screen. Every beer you log becomes a pin, so over time the app turns into a map of your own trips, nights out and discoveries.

Lineup of Beer Trails mobile screens: globe, explore, log a beer, friends and profile

The gap

Travel logs remember the places. Beer apps remember the pints. Nothing I found put the two memories on one map, so I made the globe the home screen and every beer a pin on it.

Venn diagram: where you were and what you drank combine in Beer Trails

The brief I set myself

  • Make logging a beer feel as quick as taking a photo.
  • Make the result worth looking at, so people come back to the globe.
  • Keep it calm and uncluttered, with one job done well.

Process

I worked in five loops: frame the problem, design in Figma, build, test and refine, then launch. Design and build overlapped, so I was always judging screens in a real browser on a real phone, not only on a canvas.

Five-step process: frame, design, build, test and refine, launch

How it works

The app has five sections: Globe, Explore, Log a beer, Friends and Me. The big button in the middle logs a beer from anywhere.

User flow from welcome to the globe, logging a beer and saving it

Logging a pint in three taps

Find the beer, say where you drank it, then rate it. When you save, a short pour animation plays and the globe flies to the new pin, so every log ends with a small reward.

Three-step storyboard of logging a beer

Search that forgives typos

People misspell breweries and use the names printed on the can, not the marketing name. Search folds accents, ignores filler words like “brewery” and “grupo”, tolerates typos and knows common alternate names.

“Heinekin”, “Guiness” and “Grupo Dam” all find the right result. Searching for a beer only shows beers, never breweries.

Examples of typo-tolerant search finding the right brewery

Never a dead end when picking a place

Some venues aren't in any map database. Rather than stopping people with an empty list, the app keeps what they typed and asks for the nearest town or city, so every beer can still land on the globe. “Use my current location” stays available, with a friendly message if location permission is off.

Custom place fallback when a venue isn't found

Design

A warm, calm palette of cream, ink and gold, with a dark theme tuned separately rather than simply inverted. Bricolage Grotesque carries headings and numbers; Figtree handles everything else.

Colour, type and component board in light and dark themes

Light and dark

Both themes were designed screen by screen, so the globe, gold accents and cards feel equally at home at noon or in a dim pub.

Accessibility

I audited the app by rendering each screen and checking every text pairing for contrast. Muted text, gold links and tags, the active tab label and star ratings were all below 4.5:1, and now pass WCAG AA. Touch targets are at least 44px and the smallest text is 11–12px.

Contrast ratios before and after the accessibility pass

Works on desktop too

The layout is built for phones but responds all the way up to desktop, so nobody needs to install anything to try it.

What I cut

I built a daily mini-game, and it worked. But it asked people to do something other than log a beer, so I removed it to keep the app focused on its one job.

The daily mini-game that was removed

Under the hood

One self-contained HTML file with a canvas globe drawn by d3. Data stays on the device, in the browser's local storage. Fonts and libraries are self-hosted, so the app makes no third-party requests on load. Place search uses OpenStreetMap-based services, and only when someone searches.

It's hosted as plain files on a subdomain and can be added to a phone's home screen like an app.

Architecture: a single HTML app, local storage, open map services and static hosting

By the numbers

beers in the catalogue
238
breweries
200
countries
55
beer styles
18
city shortcuts
57
third-party requests on load
0

Walkthrough

A full tour of the app in just over a minute: the globe, exploring the catalogue, logging a beer, friends and your profile.

Try it here

This is the real app, not a recording. Spin the globe, explore the catalogue or log a beer of your own. It's in demo mode, and anything you log stays on your device.

On your phone, open it full screen and add it to your home screen to use it like an app.

Carried into the next project

Lessons learned

  1. One clear job makes every decision easier

    Including what to delete. Once the app's job was “log a beer and see it on the globe”, cutting the mini-game was obvious, even though it worked.

  2. Search is part of the interface

    Forgiving matching and a way out of every empty state mattered more than extra features. Most frustration lives in the moments where an app says “no results”.

  3. Automate the accessibility checks

    Contrast checks are quickest when they run on every screen automatically, rather than relying on spotting problems by eye one screen at a time.