Skip to main content

Data model primer

The technical version, with columns and indexes, is in Architecture → Data model. This page is the plain-language version: what these things are in the real world, and why the model is shaped the way it is.

If a term is unfamiliar, the glossary has it.

Crag

A place you go climbing. Stanage Popular. Céüse. A specific chunk of rock with a name, a car park, and a walk-in.

A crag is the unit people plan around ("we're going to Stanage on Saturday") and the unit they download for offline use. It carries the practical information you need before you leave the house:

  • Where to park — which is often nowhere near the crag itself, so it is a separate coordinate
  • How long the walk-in is, and what it is like
  • Which direction it faces and what the rock is — together these tell you whether it will be dry and in the sun
  • Access restrictions — nesting bans, private land, seasonal closures. This one matters.

Sector

A named part of a crag. Stanage Popular is a mile of rock; nobody says "meet me at Stanage", they say "meet me at the Tower".

Sectors are ordered by the order you meet them walking along the crag, not alphabetically — because that is how you use them. A sector has its own approach note ("five minutes further along the base"), its own aspect, and its own photos.

Photo

A picture of a bit of rock, taken from where you would stand. This is the topo image: the thing routes get drawn on.

We record where the photo was taken from and which way the camera pointed. That is not for the photo credit — it is so a future version can work out which topo matches the wall the phone is currently pointing at. See the wishlist.

Route

A specific line up the rock, with a name and a grade.

The fields that matter:

  • Name. Routes have names, often silly ones, and that is how people refer to them.
  • Grade, in the system it was published in. See grading systems for why we do not convert between them.
  • Stars — 0 to 3, the guidebook convention for quality. Three stars means "do this one".
  • Type — sport, trad, boulder, and so on. This changes what gear you bring and what the grade even means.
  • Gear notes for trad routes: "small wires, cams to #3". Safety information.
  • First ascent and the year. Climbing cares about its history.

Route line

A route drawn onto a photo. The join between a route and a photo.

Stored as a list of points in normalised coordinates — each point is a fraction of the way across and down the image, between 0 and 1, rather than a pixel. That means the same line renders correctly whether the photo is shown as a thumbnail or full-screen, and survives the image being re-encoded at a different size.

One route can have lines on several photos — a long route photographed from two angles. One photo carries lines for every route on it. That is why the line is its own record rather than a column on either side.

Ascent

A record that you climbed something. A "tick".

  • Style — onsight, flash, redpoint, and so on. These are not decorations; among climbers they are the substance of the claim. The glossary explains them.
  • Date, as a calendar day rather than an instant. Ascents belong to a day out.
  • Partners. Both tagged Crag Topo users and free-text names, because most of the people you climb with will not have the app.
  • Your own opinion of the grade and quality. Collected from the start, used later.

Wishlist item

A route you want to climb. With a note and a rough priority.

Trivial as a record; the value is entirely in what surrounds it — "show me things on my wishlist at the crag I am going to on Saturday, in a grade I can actually do".

The bits that are deliberately missing

  • No "guidebook" entity. A crag is not owned by a book. If we license published guidebooks later, that is an attribution layer, not a hierarchy change.
  • No pitch-level records yet. Routes have a pitch count; multi-pitch routes do not yet have a record per pitch. That is a real gap for alpine and big-wall use and is on the roadmap.
  • No areas above crag. "The Peak District" is currently just a region string. When browsing by area matters, it becomes a real entity — and an ADR.