Paris · Space Invaders · fastest known time

The shortest walk past every Space Invader in Paris.

Invadrun takes the walls still standing inside the city limits, the OpenStreetMap footpath network and a travelling-salesman solver, and turns them into one GPX track and a stage-by-stage route book for a fastest-known-time attempt.

The game

Why anyone would run past a thousand mosaics.

Since 1998 the artist Invader has been cementing small tiled aliens onto the walls of Paris, each one numbered: PA_0001 near the Bastille, PA_1434 somewhere in the suburbs, and everything in between. The FlashInvaders app turns the city into a board: photograph a mosaic in place and it is yours, with points attached.

Most players collect over years. The idea here is the opposite: visit every wall inside the périphérique in one continuous, timed effort, the way trail runners set a fastest known time on a route. That needs an order to visit them in, honest distances along real streets, and a plan that survives contact with a phone battery.

Invadrun computes the order. The rest is running.

How the route is built

Five steps, all reproducible from the repository.

Every arrow is a file on disk, so any step can be re-run alone: swap the dataset, widen the scope to the suburbs, or give the solver more time.
  1. Clean the dataset. The locations are a uMap layer with broken accents and codes written five different ways. Each wall gets its list of codes, a readable address, its arrondissement and a flag for whether it sits inside Paris. The current status, points, installation date and pictures of every invader come from invader-spotter.art; walls reported destroyed or hidden are left out.

  2. Download the footpath network. OpenStreetMap's walkable ways for Paris and a small margin around it, cached once as GraphML.

  3. Measure every pair. Each wall is snapped to its nearest node, then one single-source Dijkstra per wall fills the whole distance matrix.

  4. Find the order. OR-Tools solves an open travelling-salesman path: start and finish are free, so the solver picks them. Guided local search polishes the tour for as long as you let it.

  5. Write the plan. Shortest paths between consecutive walls give the geometry; the path is cut into stages at the nearest wall and exported as GPX for the watch, KML and GPX pins for Organic Maps (one per place, with pictures), JSON and these pages.

Where the walls are

Walls on the route, by arrondissement.

Reproduce it

Python 3.11+, uv, and a few minutes.

# install
git clone https://github.com/alexduros/invadrun && cd invadrun
uv sync

# full pipeline: clean → graph → matrix → solve → export
uv run invadrun all --time-limit 240

# or step by step, e.g. a fixed start and more search time
uv run invadrun solve --start PA_0041 --time-limit 900
uv run invadrun export --stage-km 50 --pace 6:00 --flash-seconds 30

# preview docs/ locally
make serve

Sources & fair play

Wall locations are a uMap export built from invader-spotter.art; statuses, points, dates and pictures are read from the same site and the Organic Maps pins link straight to its photos. Walls get destroyed, covered and restored all the time, so refresh before an attempt (invadrun spotter --refresh). Newer invaders that are not yet in the location layer cannot be routed.

Streets are © OpenStreetMap contributors, ODbL, fetched with osmnx. Routing uses the walking network only.

Solver is Google OR-Tools; the matrix is scipy's sparse Dijkstra. The code is public domain (Unlicense).

The art belongs to Invader. Flash it, don't touch it, and treat the walls, courtyards and neighbours the same way a walker would.