A local web app for designing a fully custom, print-ready poster map of Sweden.
Every layer is live-adjustable (color, stroke, opacity, draw order, per-layer filters),
every design is a reproducible JSON recipe, and exports are true vectors at exact
physical size. Design decisions are documented in SPEC.md.
| Fjällrelief (Imhof-style relief) | Polarnatt (aurora night) |
|---|---|
![]() |
![]() |
brew install gdal # one-time system dependency for the data pipeline
pnpm install
pnpm pipeline # downloads ~1.7 GB source data, processes to ~10 MB TopoJSON (15–30 min, resumable)
pnpm dev # → http://localhost:5173- Layers panel (left) — click to select,
●toggles visibility, drag⋮⋮to change draw order (top of list = drawn on top). Hover⧉duplicates a layer into an independent instance — e.g. big lakes bold above a faint all-lakes wash — renameable and deletable in the Inspector. - Inspector (right) — the selected layer's colors, widths, opacity, and filters (road classes with per-class overrides and casings, E-road shields, min lake area, river/ferry/trail length thresholds, contour interval, waterline ring count, city population thresholds…). The Paper tab sets size (A0/A1/A2/50×70/custom) and the optional white frame; the Layout tab drives title, legend, scale bar, north arrow, attribution — plus color harmony (derive all tints from one anchor color, optionally locked to the land color) and palette-from-image (extract a photo's palette onto the map).
- Presets (top) — seventeen styles in the gallery picker, each a starting point into a
different corner of map art: Nordic (minimalism), Pappersklipp (cut-paper pastels),
Fjällrelief (Imhof-style relief hero), Höjdkurvor (contour-line art), Topo (the full
reference sheet), Skolatlas (antique atlas with banded county borders), Sjökort (nautical
chart), Vildmark (roadless parks & trails), Sextiotal (mid-century tourism), Risograf
(two-ink print), Etsning (b/w etching), Cyanotype (blueprint), Vägnät (roads-only data
art), Blågul (flag duotone), Dark, Polarnatt (aurora night), Neonstad (synthwave).
Presets lean on layer instances — dual lakes, double-line atlas borders, index contours,
a faint road web under amber arteries — so they double as worked examples of the layer
system. Applying one replaces the design but keeps your paper size;
?preset=aurorain the URL opens any preset fresh. - Labels button — label-edit mode: drag any place name; offsets persist in the recipe. Undo with ⌘Z.
- Viewport — wheel scrolls, pinch or ⌘-wheel zooms, drag pans, double-click fits,
1:1shows true print size. - Save / Load — recipes as
.jsonfiles (also autosaved to localStorage).
| Format | Path | Notes |
|---|---|---|
| SVG | Export → SVG | Vector master, print-tier detail, styles inlined. Install the Inter font locally for identical text rendering in Illustrator/Inkscape. |
| Export → PDF | Opens a print route sized exactly to the paper; use the browser dialog's "Save as PDF" for a vector file a print shop can use. | |
| PNG | Export → PNG 300/150 dpi | Raster proof / online print services. |
Terrain relief is the one raster layer — hide it before exporting for a 100 % vector file. Its blend mode is switchable: multiply darkens (light themes), screen inverts the shade into a glow (dark themes).
| Source | Used for | License |
|---|---|---|
| Geofabrik Sweden extract (OSM) | borders, lakes, rivers, roads, E-routes, railways, ferries, hiking trails, parks, places, lighthouses, airports, castles | ODbL — keep the attribution line on published posters |
| osmdata land polygons | coastline & islands | ODbL |
| Natural Earth 10m | neighbor national borders | public domain |
| Copernicus DEM GLO-90 | hillshade, contour lines | free, © ESA attribution |
| NOAA ETOPO 2022 | bathymetry depth bands | public domain, attribution appreciated |
Lantmäteriet's CC0 Topografi products (Geotorget account required) can later replace borders/railways — drop the GeoPackage layers into the pipeline and re-run.
Projection: SWEREF99 TM (EPSG:3006); data is pre-projected in the pipeline.
pipeline/src/ numbered steps: download → gpkg → extract → curated → shape → terrain → manifest
data/raw|work/ downloads & intermediates (gitignored)
app/ Vite + React + TS studio; public/data/ holds the generated TopoJSON (gitignored)
pnpm pipeline is resumable via data/work/.done-* markers; FORCE=1 pnpm pipeline re-runs everything.
Every country-specific fact lives in pipeline/country.json: the Geofabrik extract URL,
projection EPSG + CRS label, OSM country name and admin levels, the projected frame, the DEM
tile sweep, graticule extents, curated sea/neighbor labels, always-shown priority cities, and
the chrome/legend label strings. The pipeline reads it in every step and bakes it into
manifest.json, which is where the app learns all of it — the app source contains no
hardcoded country facts.
To try, say, Norway: edit country.json (extract URL, epsg: 25833, osmCountryName: "Norge",
admin levels 4/7, a new frame, curated content), then FORCE=1 pnpm pipeline. Layer ids
(sweden, lan, kommun, …) are stable slot names used by recipes — only their labels change.
Preset titles ("SVERIGE") are design content; edit them in the Layout tab.


