Stapel

NL

Contribute

Something missing, or something wrong? Almost none of it belongs to me, and that is on purpose. Only a missing chain has no upstream.

Four cases, three different destinations.
What is missing Where it goes Why there
A branch of a chain Stapel already knows OpenStreetMap Fixes it for everyone and returns through the normal build
A shop that has closed OpenStreetMap The only route that fixes closures at the source. I cannot see them
A chain or brand missing entirely To me There is no upstream. This is the catalogue, and I maintain it
One local shop round the corner Nowhere Pin it in the app. That works completely and needs to go nowhere

A shop that is missing or closed

Add it to OpenStreetMap, with the editor on the site or with StreetComplete on your phone. What helps: the brand name exactly as the chain writes it, and the correct shop type. Stapel fetches stores through Wikidata brand identifiers, so a correct brand tag arrives.

In the meantime: pin it yourself

Open your card at the till while no known store of that chain is nearby, and the app asks whether you are standing there. One tap, and arrival detection works with it immediately.

  • The coordinates are the record; an address is decoration. Everything works without one.
  • Pins live in their own table, which the sync never touches.
  • They outrank bundled stores when proximity alerts are armed.
  • If the shop later arrives through OpenStreetMap, your pin is superseded rather than deleted, and you are told it landed.

The shape of a store record

For anyone reading the files themselves

Records are positional arrays: across the whole published dataset, key names cost more than the data.

["ah", 52.38312, 4.88594, "Haarlemmerdijk 108", "1013JG", "Amsterdam"]
 chain key, latitude, longitude, street, postcode, city

Coordinates carry five decimals, about a metre. Street, postcode and city may be empty; the coordinates never are.

A chain that is missing

The catalogue holds Dutch chains and chains from the countries listed under Features. Most carry a card; the rest are there so that a shop has a name. What is in it is in brands.v1.signed. If one is missing, or a colour or name is wrong, that is a real bug; six of the Dutch programmes were renamed during 2025 and 2026.

What to send

The format of a catalogue entry

Send this, or as much of it as you know:

{
  "key": "fitfun",
  "name": "Fit&Fun Ledenpas",
  "chain": "Fit&Fun",
  "chains": ["fitfun"],
  "aliases": ["Fit en Fun", "FitFun"],
  "colorHex": "#1D4E8F",
  "icon": "fitness_center",
  "preferredFormat": "CODE_128",
  "kind": "MEMBERSHIP",
  "confidence": { "color": "guess", "format": "guess" }
}
  • key — short, lowercase, unique. I will invent one if you do not.
  • name is what the programme is called, chain is what the shop is called. Often not the same thing.
  • chains — the store chains the card works at, as keys from the store database. Usually one, the card's own key. One card for several chains, like Colruyt Xtra at Colruyt, OKay and Bio-Planet, lists them all.
  • colorHex — the brand colour, if you have a source. Without one, leave it out rather than guess.
  • icon — a name from Material Symbols. The build rejects a name that does not exist.
  • preferredFormat — only if you actually know. For most rows this is a guess, which is why it counts only as a hint for hand-typed numbers.
  • kind — LOYALTY, VOUCHER or MEMBERSHIP. A paid subscription is not a points card.
  • confidence — be honest here. guess is a fine answer and far more useful than a wrong verified.

Where to send it

A report on GitHub, preferably. It costs you no email address, the JSON pastes as a code block, and you can watch what happens to it.

Open a report

Rather send mail? hallo@square-management.nl. A dedicated address, never a personal one. A report is still handier because you can follow it, but not everyone wants an account on a code site to pass on a shop address.

What happens when you send something

  • From inside the app, a suggestion is attached to a mail that you send. You see what is in it and can cancel. The app sends nothing itself and never learns your address.
  • One item per message, never in bulk. A bulk export of every shop you pinned is a map of where you shop and when.
  • A suggestion for the store database may be published under the ODbL. The app says so at the moment of sending.
  • Hand triage is fine up to roughly five to ten submissions a week.

Supporting Stapel

The app is free and carries no advertising. If you would like to contribute anyway, you can through GitHub Sponsors, once or monthly.

It pays for the hours that go into the catalogue: which format a chain uses, which colour belongs to it, and where the shops are. That part is never finished, because shops close and chains change.

It buys no priority and no features on request. I work on this alone, so I would rather say so up front.

Are you a chain?

If you would rather not see your name, colour or logo here or in the app, I take it out. One message is enough. If you would rather your real logo were shown, that needs written permission, recorded per entry with its source and licence.