Datatypes

Approach

Description (approach.description)

The description should provide a concise overview that whould be relevant to someone using the approach: - is it a trail, access road, paved street, or something else? - what quality is the trail in? - it the approach quality unpredictable, e.g., does it wash out in heavy rain? does it get overgrown in the summer? - other noteworthy features...

Examples

Valid values for an Approach's description attribute.

"don't even bother from May through August, the \"trail\" is just thick jungle"
[no description]

Name (approach.name)

is there an official name for this trail? if not then a concise, descriptive placeholder works fine.

Examples

Valid values for an Approach's name attribute.

"Billy Goat Trail"
for the rocks around Great Falls (near Washington D.C.)

Path (approach.path)

A GPS path for the approach. This is a list of points

Examples

Valid values for an Approach's path attribute.

[
  {
    "longitude": 0,
    "latitude": 0
  },
  {
    "longitude": 0,
    "latitude": 0
  },
  {
    "longitude": 0,
    "latitude": 0
  },
  {
    "longitude": 0,
    "latitude": 0
  },
  {
    "longitude": 0,
    "latitude": 0
  }
]
FIXME! goes nowhere. use a real path

UUID (approach.uuid)

A universally unique identifier. Under nearly all circumstances, this should be autogenerated and never changed.

Examples

Valid values for an Approach's uuid attribute.

"90c0ab19-b6ff-4645-b00c-0364042d77fe"
[no description]
"0393e141-7a63-44b2-95dc-4c5aa2410d93"
[no description]

Area

Alternate Names (area.alternateNames)

A list of other names that the area can go by. This can be important to reduce confusion and/or to respect historical names.

Examples

Valid values for an Area's alternateNames attribute.

[
  "Underworld Boulder"
]
for the Spragueasorus Boulder in Rumney
[
  "Manure Pile Buttress"
]
for what is now Ranger Rock in Yosemite

Fields (area.fields)

a set of fields and their values. these names describe the area.

Examples

Valid values for an Area's fields attribute.

{
  "orientation": "north east"
}
TODO: explain this
{
  "sun": "all day"
}
TODO: explain this

Location (area.location)

GPS coordinates for the boundary of the area. To mirror the GeoJSON Spec, the first and last points of a polygon must be identical (to form a ring), and the points should wind counterclockwise. These two rules are in place . The perimeter is a single ring. Unlike many geospatial polygon representations, an area doesn't contain holes and is not a multi-polygon.

Examples

Valid values for an Area's location attribute.

{
  "type": "approximation",
  "circle": {
    "longitude": 0,
    "latitude": 0,
    "meterRadius": 5
  }
}
FIXME: use real points
{
  "type": "perimeter",
  "polygon": [
    {
      "longitude": 0,
      "latitude": 0
    },
    {
      "longitude": 25,
      "latitude": 0
    },
    {
      "longitude": 25,
      "latitude": 25
    },
    {
      "longitude": 0,
      "latitude": 25
    },
    {
      "longitude": 0,
      "latitude": 0
    }
  ]
}
FIXME: use real points

Name (area.name)

the primary name of the area.

Examples

Valid values for an Area's name attribute.

"Yosemite"
...
"Éléphant"
a Fontainebleau area

Notes (area.notes)

plain text descriptions about various aspects of the area. notes are divided into topics for easy organization and simple inclusion and exclusion in different publishing formats.

Examples

Valid values for an Area's notes attribute.

[
  {
    "topic": "elevator pitch",
    "content": "unless you love choss and poison ivy and getting lost don't bother hiking out"
  }
]
must be a terrible area
[
  {
    "topic": "Elevator Pitch",
    "content": "an excellent winter climbing destination in North Carolina. The granite/gneiss here provides any style of climbing you could ask for"
  },
  {
    "topic": "History",
    "content": "The first routes were established in the early 1970s ..."
  }
]
for Rumbling Bald in North Carolina
[
  {
    "topic": "Elevator Pitch",
    "content": "Solid, sticky rock with all clibing over 8,000'"
  },
  {
    "topic": "History",
    "content": "Developed almost entirely by Mike and Tommy Caldwell [...]"
  },
  {
    "topic": "Approach",
    "content": "expect many turns: from the town of Drake, [...]"
  }
]
The Monastery in Colorado

Tags (area.tags)

a tag is a single word or phrase to highlight _something unique_ about the area. that isn't covered by other features. useful labels help climbers identify areas with unique aspects.

Examples

Valid values for an Area's tags attribute.

[
  "beginner friendly",
  "simple approach"
]
for Sandstonia at the New River Gorge
[
  "moderate approach",
  "good for groups"
]
this imaginary distant is less frequently traveled and has many routes close to one another
[
  "frequently crowded",
  "beginner friendly"
]
for The Black Corridor at Second Pullout in Red Rock

UUID (area.uuid)

A universally unique identifier. Under nearly all circumstances, this should be autogenerated and never changed.

Examples

Valid values for an Area's uuid attribute.

"93ef6423-2bf4-4b5b-929c-91f89e03d943"
[no description]
"580f443e-9593-4dd0-8bad-857eec248978"
[no description]

Climb

Alternate Names (climb.alternateNames)

A list of alternate names for the climb. When there is history, confusion, or disagreement in the community, alternate names keep climbs discoverable and reinforce a common idea moving forward. This issue comes up most frequently when different guides use different names or more rarely more direct naming conflicts (e.g., , Realization vs. Biographie Rastaman SDS vs. Lucid Dreaming Veritas Right Project becoming Hypnotized Minds)

Examples

Valid values for a Climb's alternateNames attribute.

[
  "Realization"
]
a non-empty list of names for "Biographie"
[
  "S.S.S.",
  "SSS",
  "Shipley's Shivering Shimmy"
]
a non-empty list of names for Triple S" at Seneca

Ascents (climb.ascents)

Most commonly this will be a single line with the first free ascent. Depending on the area or history, the first ascent on aid, top-rope, lead, or any other significant first could be worth mentioning. suggested format is "YYYY[-MM[-DD]] [(STYLE)] " (separating party members with a comma). Noting "FA" or "FFA" is almost always redundant and sometimes incorrect when earilier ascents are discovered.

Examples

Valid values for a Climb's ascents attribute.

[
  "1991 Wolfgang Güllich"
]
info for Action Directe
[
  "1957 (Aid) Warren Harding, Mark Powell, Bill \"Dolt\" Feuerer",
  "1993 (Free) Lynn Hill"
]
info for The Nose

Fields (climb.fields)

a set of fields and their values. fields are useful to describe the climb in a slightly-standard way.

Examples

Valid values for a Climb's fields attribute.

{
  "sun": "all day",
  "rain": "ok in light rain",
  "descent": "walk off"
}
an imaginary climb

Length (climb.length)

Length answers a single question about a climb: how far does a climber travel from start to finish? Length can be imagined as if a climber dragged a tape measure along the wall from start to finish. This is not the height of a climb; a 7 meter traverse that stays a few feet off the ground will have a length of 7 meters.

Examples

Valid values for a Climb's length attribute.

{
  "lowerEstimate": 20,
  "upperEstimate": 25,
  "unit": "meters"
}
a rough guess at a climb
{
  "lowerEstimate": 30,
  "upperEstimate": 30,
  "unit": "feet"
}
an accurate of a short route

Location (climb.location)

The GPS location for the start of climb. In addition to the longitude and latitude (in decimal degrees), an accuracy measure (in meters) can specify an margin of error for the coordinates

Examples

Valid values for a Climb's location attribute.

{
  "latitude": 37.728367,
  "longitude": -119.637183,
  "meterRadius": 5
}
The Nose in Yosemite

Name (climb.name)

the name of the climb

Examples

Valid values for a Climb's name attribute.

"Mañana"
[no description]
"Biographie"
[no description]

Notes (climb.notes)

plain text descriptions about various aspects of the climb. notes are divided into topics for easy organization and simple inclusion and exclusion in different publishing formats.

Examples

Valid values for a Climb's notes attribute.

[
  {
    "topic": "elevator pitch",
    "content": "unless you love unpleasant choss, don't climb it"
  }
]
must be a terrible climb
[
  {
    "topic": "Elevator Pitch",
    "content": "non-stop quality climbing with a stellar view and a rich history makes this one of Yosemite's greatest routes"
  },
  {
    "topic": "FFA Story",
    "content": "It was May 1975. John Bachar, John Long, and Ron Kauk were ..."
  }
]
for Astroman
[
  {
    "topic": "Elevator Pitch",
    "content": "a beautiful roof crack"
  },
  {
    "topic": "Approach",
    "content": "this boulder is hard to find and looks tiny from the front ... "
  }
]
an imaginary boulder

Project Status (climb.projectStatus)

This indicates whether this is a known climb awaiting an ascent. for areas where ethics support the idea of closed/reserved projects, this can include relevant info.

Examples

Valid values for a Climb's projectStatus attribute.

null
the climb it not a project; it's seen an ascent
"open"
the value for a climb that is an "open" project
"closed"
the climb hasn't been redpointed, but attempts from the community are discouraged
"closed until 2050"
the equipper requests nobody try it until 2050

Rating (climb.rating)

a concise summary of what it takes to climb a route or problem.

Examples

Valid values for a Climb's rating attribute.

{
  "difficulty": "5.14c",
  "style": "sport"
}
Just Do It in Smith Rocks, OR
{
  "difficulty": "E11"
}
Rhapsody on Dumbarton Rock in Scotland
{
  "difficulty": "5.7",
  "protection": "R",
  "style": "trad"
}
Snake Dike on Half Dome in Yosemite
{
  "style": "boulder"
}
a boulder-problem project with no established difficulty rating or relevant safety rating
{
  "difficulty": "V11",
  "protection": "X",
  "style": "boulder"
}
Ambrosia on Bishop's Grandpa Peabody boulder

Resources (climb.resources)

Offers an opportunity for developers to record info about where to find further info.

Examples

Valid values for a Climb's resources attribute.

[
  {
    "title": "2012 Trip Report",
    "resource": "https://southernsierraclimber.blogspot.com/2012/12/blog-post.html",
    "description": "From Southern Sierra Climber, this offers the only well-documented ascent of this obscure route"
  }
]
Potential links for the East Face Route on Moro Rock in Sequoia National Park
[
  {
    "title": "FA Video by Ben May",
    "resource": "https://www.youtube.com/watch?v=_VtpZ9GtNP4"
  },
  {
    "title": "Third Ascent Video by Matt",
    "resource": "https://www.youtube.com/watch?v=QnYS1x9t16Y",
    "description": "shows alternative, much more dynamic, beta"
  }
]
a boulder problem in San Diego

Steepness (climb.steepness)

this respresents the steepness of the wall as the climber progresses. the "startingAt" value can be anything from 0 to 1 and seach segment must be in order

Examples

Valid values for a Climb's steepness attribute.

[
  {
    "startingAt": 0.0,
    "degreesOverhung": 45
  },
  {
    "startingAt": 0.1,
    "degreesOverhung": 25
  },
  {
    "startingAt": 0.25,
    "degreesOverhung": 10
  },
  {
    "startingAt": 0.8,
    "degreesOverhung": -5
  }
]
starts steep, eases up to slightly overhung, and finishes as slab
[
  {
    "startingAt": 0,
    "degreesOverhung": 0
  },
  {
    "startingAt": 0.75,
    "degreesOverhung": 90
  },
  {
    "startingAt": 0.8,
    "degreesOverhung": 0
  }
]
perfectly vertical to a perfect roof and back to vertical
[
  {
    "startingAt": 0,
    "degreesOverhung": 5
  }
]
slightly overhung the whole way

Tags (climb.tags)

a tag is a single word or phrase to highlight _something unique_ about the climb. that isn't covered by other features. In many bouldering areas, it might be worth having a `highball` tag. In Bishop though, it might be better to have `fluttering-heart` field. useful labels help climbers identify climbs with unique aspects.

Examples

Valid values for a Climb's tags attribute.

[
  "manufactured"
]
a climb with chipping or glued-on holds
[
  "area classic",
  "crimpy"
]
for Slash And Burn at the New River Gorge
[
  "classic",
  "exposed"
]
for Zoo View at Moore's Wall in North Carolina
[
  "top-out crux",
  "bad fall",
  "slopey"
]
these imaginary tags describe an usettling problem

Terrain (climb.terrain)

this respresents the type of rock climbing as a climber progresses the "startingAt" value increases from 0 (the start of the climb) towards 1 (the end of the climb) and seach segment must be in order

Examples

Valid values for a Climb's terrain attribute.

[
  {
    "startingAt": 0,
    "description": "crack :: 3inches"
  }
]
a continuous 3" crack from start to finish
[
  {
    "startingAt": 0.0,
    "description": "pockets"
  },
  {
    "startingAt": 0.25,
    "description": "jugs"
  },
  {
    "startingAt": 0.75,
    "description": "crimps"
  }
]
an imaginary climb that you might find at The Red
[
  {
    "startingAt": 0.0,
    "description": "corner :: right-facing :: 1 inch"
  },
  {
    "startingAt": 0.5,
    "description": "crack :: 0.5 inches"
  },
  {
    "startingAt": 0.6,
    "description": "seam"
  },
  {
    "startingAt": 0.8,
    "description": "face"
  }
]
a disappearing corner

UUID (climb.uuid)

A universally unique identifier. Under nearly all circumstances, this should be autogenerated and never changed.

Examples

Valid values for a Climb's uuid attribute.

"0cf19a54-4af9-44db-9de3-dfecb700c3ce"
[no description]
"6833840f-d801-43c6-a2d7-7da71a6ed1c8"
[no description]

Metadata

Authors (metadata.authors)

people credited with the guide

Examples

Valid values for a Metadata's authors attribute.

[
  "John Doe",
  "Jane Doe"
]
husband & wife guidebook authors

Description (metadata.description)

a sentence or two about what the guidebook covers.

Examples

Valid values for a Metadata's description attribute.

"all the crashpad-protectable boulders in Joshua Tree"
for a generic Joshua Tree Bouldering guide
"The highest quality, most accessible routes in Yosemite"
for a generic Select Yosemite Climbs book

Name (metadata.name)

the name of the guidebook

Examples

Valid values for a Metadata's name attribute.

"New River Gorgeous"
...

UUID (metadata.uuid)

A universally unique identifier. Under nearly all circumstances, this should be autogenerated and never changed.

Examples

Valid values for a Metadata's uuid attribute.

"c5ae7ddd-243d-47bf-8a6e-aa456d2f54c2"
[no description]
"4c7efeb1-aa50-4ddc-ae6d-84a908ae8a15"
[no description]

Parking

Capacity (parking.capacity)

the number of cars that the parking can hold.

Examples

Valid values for a Parking's capacity attribute.

200
a large parking area, like what you'd get for some of the bouldering areas in RMNP
5
a modest parking area
1
space to fit a single car, perhaps a small pullout at a local crag.

Description (parking.description)

info about the parking area: - does it close at dusk? - are break-ins a concern? - do you need to pay? - is it hard to find? - is there a towing policy?

Examples

Valid values for a Parking's description attribute.

"this is a school bus turnaround; do not use on the weekdays"
"a gravel strip on the side of the road. rarely maintained, frequently covered in trash"

Location (parking.location)

a point for the entrance to the parking area.

Examples

Valid values for a Parking's location attribute.

{
  "longitude": -74.200394,
  "latitude": 41.735855
}
the main parking area for the most popular climbing at The Gunks

Name (parking.name)

is there an official name for this parking area? if not then a concise, descriptive name works fine.

Examples

Valid values for a Parking's name attribute.

"Camp 4 Day Use Parking"
a section of the Camp 4 lot that doesn't allow overnight parking

UUID (parking.uuid)

A universally unique identifier. Under nearly all circumstances, this should be autogenerated and never changed.

Examples

Valid values for a Parking's uuid attribute.

"23ff1c9b-43a0-41ce-88f3-385d8736b176"
[no description]
"24a899f8-a1e1-4d6f-a066-c1a3424eb13b"
[no description]

Photo

Area Layers (photo.areaLayers)

a collection of polygons that identify areas on a photo It's suggested that the first point be on or near the approach trail, and that the points wind counterclockwise.

Examples

Valid values for a Photo's areaLayers attribute.

[
  {
    "areaUuid": "c3056703-ee36-4312-8913-4ce8b444476f",
    "polygon": [
      {
        "topOffset": 0.9,
        "leftOffset": 0.1
      },
      {
        "topOffset": 0.3,
        "leftOffset": 0.5
      },
      {
        "topOffset": 0.9,
        "leftOffset": 0.9
      },
      {
        "topOffset": 0.9,
        "leftOffset": 0.1
      }
    ]
  }
]
[no description]

Climb Layers (photo.climbLayers)

a collection of lines it's suggested that the first point be the start of the climb

Examples

Valid values for a Photo's climbLayers attribute.

[
  {
    "climbUuid": "0d3fdc6b-a4c3-4036-afe6-ed524a1b44f7",
    "path": [
      {
        "topOffset": 0.9,
        "leftOffset": 0.1
      },
      {
        "topOffset": 0.3,
        "leftOffset": 0.1
      }
    ]
  },
  {
    "climbUuid": "b3422197-b4c4-4b07-bcdd-74a77d787941",
    "path": [
      {
        "topOffset": 0.9,
        "leftOffset": 0.4
      },
      {
        "topOffset": 0.2,
        "leftOffset": 0.4
      }
    ]
  },
  {
    "climbUuid": "a4f519cb-4aeb-4814-aa52-4cdcc292402e",
    "path": [
      {
        "topOffset": 0.9,
        "leftOffset": 0.7
      },
      {
        "topOffset": 0.1,
        "leftOffset": 0.7
      }
    ]
  }
]
[no description]
[
  {
    "climbUuid": "080c90a0-adbb-4a42-9bed-3008166530f9",
    "path": [
      {
        "topOffset": 0.1,
        "leftOffset": 0.05
      },
      {
        "topOffset": 0.9,
        "leftOffset": 0.05
      },
      {
        "topOffset": 0.9,
        "leftOffset": 0.5
      }
    ]
  },
  {
    "climbUuid": "8aa562cc-85c4-4f3d-a585-a7e31b546323",
    "path": [
      {
        "topOffset": 0.05,
        "leftOffset": 0.75
      },
      {
        "topOffset": 0.8,
        "leftOffset": 0.75
      }
    ]
  }
]
[no description]

Fields (photo.fields)

a set of fields and their values. fields are useful to describe the climb in a slightly-standard way.

Examples

Valid values for a Photo's fields attribute.

{
  "captured from": "air (via drone)",
  "credit": "Jane Doe"
}
credit to the photographer and info about where the photo was taken from

Real DateTimeOriginal (photo.realDatetimeoriginal)

This will be used instead of the data found in a photo's EXIF data. It can be useful for in giving a hint about shade and vegitation at certain times of the day or year.

Examples

Valid values for a Photo's realDatetimeoriginal attribute.

"2000-02-01"
a photo taken on the first day of February 2000

Real Location (photo.realLocation)

The GPS coordinates for where the photo was taken from. This will be used instead of the EXIF Coordinates

Examples

Valid values for a Photo's realLocation attribute.

{
  "longitude": 0,
  "latitude": 0,
  "meterRadius": 1
}
FIXME: use plausible coordinates

Real Orientation (photo.realOrientation)

This will be used instead of the EXIF orientation. some combo of "{no,}flip,rotate{90,180,270}" 1: ⮳ 2: ⮲ 3: ⮰ 4: ⮱ 5: ⮶ 6: ⮴ 7: ⮵ 8: ⮷ 1: ╒ 2: ╕ 3: ╛ 4: ╘ 5: ╓ 6: ╙ 7: ╜ 8: ╖ 1: ↾ 2: ↿ 3: ⇃ 4: ⇂ 5: ↽ 6: ↼ 7: ⇀ 8: ⇁

Examples

Valid values for a Photo's realOrientation attribute.

3
exif orientation should be ignored and the photo should be rotated 180 degrees

UUID (photo.uuid)

A universally unique identifier. Under nearly all circumstances, this should be autogenerated and never changed.

Examples

Valid values for a Photo's uuid attribute.

"b644e46c-e690-4af0-ae25-80230ea23de1"
[no description]
"66a0bb80-1364-478c-8800-487d6d2efb86"
[no description]

On the Filesystem

project.json

metadata for the project

stele1.txt

contains the schema's version info

climbs

contains a file for each climb

climbs/{climb.uuid}.json

a spec-conforming json object for a climb

areas

contains a file for each area

areas/{area.uuid}.json

a spec-conforming json object for an area

approaches

contains a file for each approach

approaches/{approach.uuid}.json

a spec-conforming json object for an approach

parkings

contains a file for each parking

parkings/{parking.uuid}.json

a spec-conforming json object for a parking

photos

contains a file for each photo

photos/{photo.uuid}.json

a spec-conforming json object for a photo

photos/{photo.uuid}_image.{extension}

the raw photo data. filetype (e.g., JPEG, HEIF, PNG, GIF) and extension (e.g. .JPG, .jpg, .JPEG) support are left to the implementation

extensions

contains a directory for each extension used in the project

extensions/{extension.name}

A self-contained directory for everything related to an extension. Its contents are at the discretion of the extension.