Nicolas Seriot

Drawing > Cartopolis

July 2026

Cartopolis: Rendering Maps Like It's 1999

In the late 1990s, online cartography services such as MapQuest or Yahoo! Maps provided maps as small, static GIF files. You clicked an arrow, waited, and a new pane appeared: jagged roads, plain colors, bitmap labels, and fixed zoom steps.

Cartopolis brings that visual language to present-day OpenStreetMap data, without emulating MapQuest or any other original software. It is a modern static website that draws today's maps as they could have been served to Netscape Navigator.

Even the name is period dressing: Cartopolis could have been an actual mapping service of the era, somewhere between eAtlas and CyberMaps. The result can be exported as a GIF89a using the classic 216-color web-safe palette.

Lausanne, rendered by Cartopolis

Live: seriot.ch/cartopolis — the whole of Switzerland as static files.

The Late-1990s Map Look

The easy way to fake this look is a beige palette and a pixelation filter. Cartopolis does neither. The style is not applied afterwards. Instead, it emerges from the pipeline the way grain emerges from film. The renderer enforces a handful of deliberately chosen rules, and the look follows on its own:

Plus a few period props: hand-drawn 17 px shields, a red star marker, and a 1 px border.

Today's OpenStreetMap contains far more detail than a late-1990s web map could display, so the geometry is cut until curves become short, jagged polylines.

The result is crisp and high-contrast — a look that feels almost novel now that design tendencies point the opposite way, toward soft gradients, translucency, and muted low-contrast palettes.

Side by Side with 1999

Stefan Marti saved MapQuest maps of his hometown in 1999 and still hosts them today. Below is his map of Trimbach, Solothurn, side by side with Cartopolis centered on the same location and rendered at the same horizontal scale, about 4 meters per pixel. The red star marks the same spot in both panes. Click either map for full resolution.

Trimbach on MapQuest, 1999
Trimbach on MapQuest, 1999. Archived by Stefan Marti.
Trimbach rendered by Cartopolis, 2026
Trimbach on Cartopolis, 2026. Similar constraints, not the same software.

This is not a pixel-perfect reproduction. The differences are as instructive as the similarities.

MapQuest, 1999 Cartopolis, 2026
Street labels rotated along roads horizontal
Scale bar top-right bottom-left
Palette 20 colors in this pane; 3 are web-safe 216-color web-safe
Pixel scale north–south scale ≈16% larger than east–west square-pixel Web Mercator

MapQuest rendered on a non-square pixel grid. Fitting its street network against today's OpenStreetMap geometry puts one 1999 pixel at about 4.2 m east–west but 4.9 m north–south: the map is squeezed vertically by roughly 16%. The proportions would be correct at about 38°N — the middle of the continental United States, an ocean away from Trimbach.

Cartopolis is stricter than this MapQuest example in some respects: it limits every color to the web-safe palette, and its square-pixel projection means the single scale bar holds in both axes. It is cruder in others: horizontal labels, more aggressively simplified geometry, and auto-generalized coastlines where 1999 cartographers worked by hand.

Explore and Export

Cartopolis supports smooth drag-to-pan with inertia, discrete zoom levels, and offline place and street search, all from static files. With smooth panning, labels are re-placed when the map settles.

A view can be shared through its URL or saved as a GIF, produced by the project's own LZW encoder.

Poster mode renders canvases up to 4000×4000 pixels and exports them at 2× scale: an 8000×8000 web-safe GIF poster. An optional Aerial Photo view shows current swisstopo imagery for comparison.

An Efficient Static Architecture

An offline compiler turns an OpenStreetMap extract into compact binary vector packs. The page fetches only the pieces it needs — HTTP Range requests pull individual byte ranges out of the packs — rasterizes world-aligned tiles in JavaScript, and LZW-encodes the pixels itself. There is no tile server and no database, merely static files that any web host can serve. All of Switzerland is about half a gigabyte.

Lightning-fast modern JavaScript is working hard to impose dial-up-era limits on itself.

Cartopolis architecture

Build Your Own

Cartopolis is open source, built with assistance from Claude Code. The compiler is a few files of Python, the renderer a few files of JavaScript. Any Geofabrik extract works. You can bake your own city, region, or country and upload the result to any static host. Full instructions are in the GitHub repository.

Conclusion

Cartopolis shows today's map, dressed like it's still 1999. Three things carried the project:

  1. The constraint-first approach produces an authenticity that styling never could.
  2. The fully static architecture — binary packs on any web host, sliced by HTTP Range requests — is an efficient engineering design.
  3. The side-by-side with an archived 1999 pane turns nostalgia into measurement.

The reconstruction wins on rigor and loses on craft, but the language survives, and it still reads.

As a mapping service, its practical advantage is deliberately questionable. As an artistic and engineering experiment, less so.


Map: seriot.ch/cartopolis (all of Switzerland, static files)

Source: github.com/nst/Cartopolis

Map data © OpenStreetMap contributors. Aerial imagery © swisstopo.