| data/quests | Initial Quest Index release | |
| dist | Initial Quest Index release | |
| schema | Initial Quest Index release | |
| scripts | Initial Quest Index release | |
| .editorconfig | Initial Quest Index release | |
| .gitattributes | Initial Quest Index release | |
| .gitignore | Initial Quest Index release | |
| CONTRIBUTING.md | Initial Quest Index release | |
| index.html | Update index.html | |
| LICENSE.md | Initial Quest Index release | |
| package.json | Initial Quest Index release | |
| README.md | Update README.md | |
Quest Index
Quest Index is a static data index for OpenStreetMap survey quests. It stores plain-English quest metadata, applicability tags, location bounds, expected answer shapes, and the OSM tag edits implied by common answers.
What Is Included
data/quests/*.jsoncontains the source quest data, grouped by primary OSM key such asamenity,highway, orshop.schema/quest-category.jsondocuments the JSON shape.scripts/validate.mjsperforms structural and local logic checks.scripts/build.mjsbuildsdist/quest-index.jsonanddist/quest-index-data.js.scripts/audit-tags.mjschecks all referenced OSM keys and key/value pairs against Taginfo.index.htmlis the static Suggest-A-Quest form.browse.htmlis the static human-readable quest browser.
Data Layout
Quest files live at:
data/quests/<primary-key>.json
Each file has a properties.path and an items array:
{
"properties": {
"path": "quests/highway"
},
"items": [
{
"id": "crossing-island",
"displayName": "Crossing island",
"question": "Does this crossing have an island?",
"type": "bool",
"icon": "person_walking_on_crosswalk",
"answerKey": "crossing:island",
"locationSet": { "include": ["001"] },
"includeTags": [{ "highway": "crossing" }],
"excludeTags": [{ "crossing:island": true }]
}
]
}
Each key-level file can hold any quests whose intended scope is primarily keyed by that OSM key.
Quest Fields
displayName is a short plain-English label.
question is the plain-English question shown to the mapper.
type describes the answer shape:
bool: a yes/no quest. It requiresanswerKey;yesandnoanswers are implied andotherAnswersAcceptableis always false.list: one answer from a finite list.multi: one or more answers from a finite list. Consumers normally write multiple selected values as semicolon-delimited OSM values when the answers share oneanswerKey.number: an integer or decimal value written directly toanswerKey.text: freeform text written directly toanswerKey, including structured strings such asopening_hours.exists: a feature-existence check that does not write a key/value tag.
icon is a required Pinhead icon ID from pinhead.ink.
Store the bare icon ID, such as box_truck.
answerKey is the default OSM key edited by the quest.
locationSet follows Country Coder conventions. Use 001 for worldwide and
specific country or region codes only when the question is truly location-bound.
includeTags is an OR list of accepted tag groups. Each object is an AND group.
excludeTags is an OR list of rejected tag groups. If any group matches, the
quest should be suppressed.
Tag values may be:
"value"for an exact key/value match.["a", "b"]for any listed value.truefor key exists with any value.falsefor key is absent.nullinside an array to allow a missing key.
For example:
"includeTags": [
{ "amenity": "parking", "parking": [null, "yes"] },
{ "parking": "street_side", "parking:lane": [null, "yes"] }
]
answers lists common answer choices for list and multi quests. In the
common case, use value and let it apply to the quest's answerKey.
{
"answerKey": "parking",
"answers": [
{ "id": "surface", "displayName": "Parking lot", "value": "surface" },
{ "id": "underground", "displayName": "Underground garage", "value": "underground" }
]
}
An answer may override the edited key with key, write several tags with
tags, or remove keys with removeKey / removeTags.
otherAnswersAcceptable means OSM commonly accepts values beyond the listed
choices, even if a consuming app does not expose a free-form answer.
Checks
Run structural and local logic checks:
node scripts/validate.mjs
Build the distributable files:
node scripts/build.mjs
Run the full local check used before publishing:
node scripts/validate.mjs && node scripts/build.mjs
Run the live Taginfo audit when tag keys or values changed:
node scripts/audit-tags.mjs
When npm is available, the equivalent commands are:
npm run check
npm run audit:tags
The build also loads Country Coder location metadata. If metadata loads successfully, unknown location codes fail the build.
Static Sites
Open index.html to use Suggest-A-Quest.
Open browse.html to view the searchable quest table. The browser reads
dist/quest-index-data.js, so rebuild before publishing.
License
Quest Index is released under CC0 1.0 Universal. See LICENSE.md.