Setlist: A Feedback Loop for Climbing Gyms

Role
Product, Design & Build
Segment
Climbing Gyms
Stack
React 19, Firebase, styled-components
Status
In-Development Prototype
Research Methods
User interviewsCompetitive analysis
A QR tag mounted on a climbing hold, with the Setlist logo overlaid on the wall

Overview

Setlist is a feedback and analytics tool for climbing gyms. Climbers scan a QR tag at a climb and rate it in seconds, no app and no account. Setters and gym staff get a dashboard that turns those ratings into decisions: what to reset, what to leave up, and where the grading has drifted from what climbers actually feel.

I designed and built it solo. It's a working prototype rather than a shipped product, so what follows is the thinking behind it, not results it hasn't earned yet.

QR

QR code linking to the Setlist demo

Try the demo — scan the code with your phone to see Setlist in action.

Not optimized for desktop yet. It's also running on dummy seed data, so some climbs, ratings, or details may look incomplete or inconsistent.

The Problem

Gyms reset routes on gut feeling or timelines. Setters know what they like, not what members think. That opinion lives in passing conversation at the wall, or it never gets said.

The cost shows up as retention. A bored climber doesn't complain. They stop renewing, and by then there's no tracing it back to the stale wall section nobody reset.

A climber scanning a QR tag on a climb, rating it, and seeing the aggregate score

Research

From my experience and conversations with setters and climbers:

  • My gym runs on pen and paper. No feedback loop at all.
  • Climbers want a way of communicating with setters other than flagging them down in the gym.
  • Apps like Kaya bury feedback inside a social platform of video, feeds, and profiles. That's a lot of product to carry for a 10-second rating.
  • Setters want visibility into their own routes, what is working, what they can improve.
  • Grading consistency is the recurring climber complaint. Regulars build a felt sense of “this gym's V4” and notice when a climb misses it.

Decisions

  • No login. An account wall costs you the exact climber you most want to hear from, the one deciding between rating a climb and starting their next one. The tradeoff is anonymity: no per-climber history, and no way to weight a regular's read over a drop-in's. One rating per climb per device keeps it honest enough at gym scale without asking anyone to sign up.
  • No submit button. Every input saves the moment it's made. A climber who taps one star and walks away has already contributed. There's no half-filled form to abandon, and no last screen standing between the feedback and the database.
  • Tags belong to the wall, not the climb. A tag is bound to a wall position and stays there through resets, and the setter assigns the new climb to the existing tag in the app. Placing tags is a one-time job at install, not thirty minutes of extra work every reset day. Any tool that adds labor to a reset gets abandoned by week three.
  • Ask for felt grade, not just stars. A star rating tells a setter a climb was liked. It doesn't tell them a V3 climbs like a V5. The form captures perceived difficulty alongside the rating, which turns the most common climber complaint into something a setter can see on a dashboard instead of hearing secondhand at the wall.
  • Configurable, not opinionated. Climbing type, wall sections, anchor counts, and tape-color-to-grade mapping are all gym-set. Every gym does these differently, and a tool that assumes otherwise is wrong on day one at half of them.

The Build

Setlist is two products sharing a database. The climber side is one screen: camera, tap the link, tap a star, tap a suggested grade, comment if you feel like it. Three taps, saved as you go, back on the wall.

The gym side turns that into decisions. Climb entry reshapes itself by discipline, boulder grade or roped 5.x plus modifier, with location, hold and tape color, and a photo. The dashboard reports overview stats, grade distribution, top and lowest rated, oldest climbs still up, and grade drift: where posted grades and felt grades disagree. Everything else lands in a filterable inbox, one tap from the climb it belongs to.

Create Climb form, from an early wireframe to the shipped dark-mode UICurrent Set screen, from an early wireframe to the shipped dark-mode UIGym dashboard showing climb analytics and a filterable feedback inbox

Underneath, it's multi-tenant from the ground up, every gym isolated on one codebase with four permission tiers gated at the route level. The interface runs on a two-layer token system, semantic aliases like “radius.card” over primitives, never a raw pixel value, feeding shared components instead of one-offs per screen. Dark mode falls out of the same tokens for free.

Create Climb screen shown in light and dark theme, built from the same design tokens

I built it solo with Claude Code as a pair, which let a one-person team move at team speed. The clearest win was the design-system consolidation, finding and fixing dozens of small inconsistencies in hours instead of weeks.

What's Next

Getting Setlist in front of users in a gym. What exists today is a proof of concept. The core loop works end to end, enough to hand a setter and let them break it, but it isn't a finished product. The next milestone is the one that matters: a pilot gym, real climbers scanning real tags, and a list of everything I got wrong.

QR tags are the prototype, not the endpoint. They work today with zero setup, but they still ask a climber to find and scan a specific tag. A computer vision approach, where a photo of the wall alone identifies the climb, removes that step entirely. Worth exploring once there's real usage to learn from, not before.