Inspiration Route setting is one of the most creative jobs in climbing, and one of the least supported by software. A setter stands in front of a blank wall with a bucket of holds and a brief like "we need a V4 with a heel hook", then has to picture the movement, the reach and the grade before a single bolt goes in. Then they forerun it, adjust, and do it again. This process takes up to hours for a single route.
We wanted to know whether AI could be a co-setter: something that suggests ideas quickly and explains its reasoning while the human stays in charge. It isn't meant to replace setters or certify climbs. Its job is to get a setter from a blank wall to three concrete starting points in under a minute.
What it does SetBeta has two workflows:
- Virtual wall: enter the wall's width, height and angle, a target grade (V0–V7), a style (technical, powerful, dynamic, balancy, flowy), a required move (heel hook, dyno, mantle, gaston…) and the climber's height. SetBeta proposes three materially different route concepts from a structured 15-hold inventory.
- Photo mode: upload a photo of loose holds. The AI labels each hold with a type, size and confidence, and you correct it: move, add, remove or relabel markers. Then upload the wall photo and tap its four corners to calibrate it. Routes are generated in wall coordinates and drawn back onto the photo.
Each concept shows numbered, colour-coded placements (start, hand, foot, finish), hold rotation, a step-by-step intended beta (which limb goes on which hold), the crux, an estimated grade range, a confidence score and warnings. A free-text "setter notes" box lets you iterate, e.g. "keep the heel hook but make the crux less reachy."
Every concept is labelled concept only — requires professional installation and forerunning.
How we built it
- Frontend: Next.js (App Router), React, TypeScript and Tailwind CSS in a single-page dark UI, with SVG overlays for markers, route lines and the wall-corner editor. Photos are compressed in the browser to fit an 8 MB image budget before upload.
- AI: server-side API routes keep every key off the client. The main provider is StepFun
step-5-previewthrough Chat Completions, with image inputs and a strict JSON Schema response format. An OpenAI Responses API path and an experimental Devin session path are also available behind anAI_PROVIDERswitch. - Two-stage photo pipeline: call 1 sees only the hold photo and returns an inventory. The human confirms it. Call 2 gets the wall photo, the confirmed inventory, the corner boundary and the brief.
- Calibration: the AI places holds in a rectangular wall frame $(u, v) \in [0,1]^2$, and we map each point onto the four tapped corners with bilinear interpolation:
$$ P(u,v) = (1-v)\big[(1-u)\,P_{TL} + u\,P_{TR}\big] + v\big[(1-u)\,P_{BL} + u\,P_{BR}\big] $$
- Deterministic validator: we never trust model output as-is. Every response is checked and, where possible, repaired. Coordinates are clamped to $[0,100]$, each physical hold is used at most once per route, routes need 5–9 placements with a start and a finish, every hold ID must exist in the inventory, and every beta step must reference a hold on the route. Any "safe" or "certified" language is removed. The validator also flags reach problems. For consecutive hand holds on a wall of width $W$ and height $H$:
$$ d = \sqrt{\left(\tfrac{\Delta x}{100}W\right)^2 + \left(\tfrac{\Delta y}{100}H\right)^2}, \qquad \text{warn if } d > 0.6\,h_{\text{climber}} $$
- Sample engine: a deterministic, seeded generator keeps the demo working with no key and no network. Its hand-move spacing comes from hand-authored setting heuristics, not learned biomechanics:
$$ s = (0.42 + 0.05\,g)\cdot \frac{h}{170\,\text{cm}} \cdot k_{\text{style}} \cdot k_{\text{notes}} $$
Here $g$ is the V-grade. Lower grades favour jugs and more footholds; higher grades favour crimps, slopers and pinches.
- Data exploration: a standard-library Python script computes descriptive statistics from the public ClimbDB attempt dataset (97 attempts, V1–V5). We used it to understand trends, such as mean moves and time rising with grade. We deliberately did not train on it, because it contains no hold coordinates or move sequences.
- Testing: a Vitest suite covers the validator, the sample engine, image handling, the photo workflow and the provider API routes, with mocked providers.
Challenges we ran into
- Vision models are imperfect at counting and locating holds. They merge holds, miss small footholds and guess types. Instead of fighting this, we made it part of the product: the AI proposes and the human corrects before any route is generated.
- A photo has no coordinate system. Pixel positions don't mean much on a tilted, perspective-skewed wall photo. Adding four-corner calibration and mapping wall-local coordinates back onto the photo made the overlays usable.
- Structured output isn't the same as a valid route. Even with strict JSON Schema, models produced duplicate holds, unknown IDs, missing finishes and huge moves. That's why the deterministic validator became the backbone of the app.
- Provider differences. Image size limits, token budgets, timeouts and error formats all differ between StepFun, OpenAI and Devin. We had to handle timeouts, HTTP errors and invalid answers separately, and show each one clearly without leaking keys, images or raw provider responses.
- Honesty in the UI. It was tempting to show a confident "V4". We show grade ranges, confidence scores and warnings instead. In photo mode, a failed AI call never quietly turns into sample routes, so users always know what's real.
- Hackathon logistics: venue Wi-Fi timed out
npm install, and we juggled several API keys that aren't interchangeable.
What we learned
- How route setting actually works: setting to a brief, forerunning, and why grades are a consensus reached after people climb, not a property you can compute up front.
- LLMs are good at producing movement ideas and explanations and weak at precise geometry. The best results came from letting the model be creative inside hard deterministic limits.
- Data matters more than model size. Useful training data would need hold positions, intended beta, climber height and wingspan, and attempt outcomes, and no public dataset we found has all of that yet.
What's next
- Hand-authored movement templates (flag, high step, deadpoint, compression…) to structure generation before placement.
- A feedback loop from forerunning, where setters record the actual grade, skipped holds and alternative beta, to calibrate grade ranges.
- Collecting the right dataset: installed route geometry, hold rotations, intended beta and attempt videos with limb-to-hold contacts.
Built With
- climbdb
- computer-vision
- devin
- github
- json-schema
- llm
- next.js
- node.js
- openai
- openai-responses-api
- python
- react
- step-5-preview
- stepfun
- structured-outputs
- svg
- tailwind-css
- typescript
- vitest
- zod
Log in or sign up for Devpost to join the conversation.