Want to take your software engineering career to the next level? Join the mailing list for career tips & advice Click here


CartoCSS port of Toner

Subscribe to updates I use toner-carto

Statistics on toner-carto

Number of watchers on Github 139
Number of open issues 54
Average time to close an issue 15 days
Main language CartoCSS
Average time to merge a PR 4 days
Open pull requests 1+
Closed pull requests 1+
Last commit over 2 years ago
Repo Created over 6 years ago
Repo Last Updated over 2 years ago
Size 35.1 MB
Homepage http://maps.stame...
Organization / Authorstamen
Latest Releasev1.0.0
Page Updated
Do you use toner-carto? Leave a review!
View open issues (54)
View toner-carto activity
View on github
Book a Mock Interview With Me (Silicon Valley Engineering Leader, 100s of interviews conducted)
Software engineers: It's time to get promoted. Starting NOW! Subscribe to my mailing list and I will equip you with tools, tips and actionable advice to grow in your career.
Evaluating toner-carto for your project? Score Explanation
Commits Score (?)
Issues & PR Score (?)


Toner is the name of Stamen's black and white map tiles. It was originally designed for the Dotspotting project by Geraldine Sarmiento, although many others have been involved since.

The original Toner was developed as part of Stamen's Citytracking initiative, funded by the Knight Foundation. The old repository can be found here, for historical interest.

Toner screenshot



  • PostgreSQL
  • PostGIS
  • Node.js
  • GDAL
  • TileMill 1@master (this includes the latest Mapnik): github.com/mapbox/tilemill
  • Imposm 3, which includes dependencies of its own: go, leveldb, and protobuf.

On OS X, installation with Homebrew looks like this:

brew install postgis gdal node go leveldb protobuf

# follow instructions to start postgresql

mkdir -p /tmp/imposm
cd /tmp/imposm
export GOPATH=`pwd`
git clone https://github.com/omniscale/imposm3 src/imposm3
go get imposm3
go install imposm3

# bin/imposm3 is your new binary; either add $GOPATH/bin to your PATH or copy
# it to /usr/local/bin (or similar)

Toner Itself

  • Clone this repo
  • Run make link to sym-link the project into your TileMill project directory
  • Run make db/shared to fetch and transform Natural Earth and OSM coastline data
  • Run make db/ca (or similar; see PLACES in the Makefile for a list of registered extracts and expand it as desired).
  • Run make to generate the project.mml file. (Alternatively, make toner-background, toner-buildings, toner-hybrid, toner-lines, toner-labels, or toner-lite to work on the variant styles)
  • Start TileMill by running npm start from the TileMill repo
  • Open http://localhost:20009/#/project/toner

make db/<place> will write to the database specified in .env (with a default value of postgres:///toner). If you experience trouble connecting, try adding credentials, e.g. postgres://user:password@localhost/toner (it will use $USER with no password otherwise). Barring that, check your pg_hba.conf to ensure that access is configured correctly.

(We primarily develop on OS X where PostgreSQL from Homebrew works out of the box.)

NOTE: Changes to project settings (i.e. not stylesheets) in TileMill will not persist the changes. To make changes, edit the relevant .yml file and re-run make [variant] to re-generate the project.mml that TileMill reads.


See DEPLOY.md for instructions.


What's the deal with the Makefile? Why is it so complicated?

Magic, mostly. It probably can (and should) be simplified! Consider this another, in-progress make for data approach (which actually uses make).

The goal here is to provide an idempotent process for bootstrapping the project that uses as few additional dependencies as possible. make is the age-old solution to this problem, although it takes a more file-focused approach. Put another way, it attempts to efficiently encapsulate otherwise complicated and error-prone operations.

The Makefile here attempts to replicate make's behavior relative to rebuilding files with database tables. In other words, if a Postgres relation already exists, it will be left as-is. If it doesn't exist (has been dropped or hasn't been created), it will be created on-demand.

Why do I have to install pgexplode?

libpq (which underlies PostgreSQL's command-line tools) supports a number of environment variables which can be used to avoid repetition (and avoid errors). However, each component of the connection information is separate, and is more easily and concisely encoded in a URI (i.e. DATABASE_URL). pgexplode is aware of libpq's environment variables and will expand DATABASE_URLs components (which is simpler than managing multiple values and constructing a URL for imposm3 and other tools).

toner-carto open issues Ask a question     (View All Issues)
  • almost 4 years toner-labels returns 503s in some places
  • almost 4 years white highway=footway causes breaks in road casing
  • almost 4 years highway=living_street is not rendered
  • about 4 years Remove duplicate labels for parallel roads
  • about 4 years toner-lite building stroke is too pale
  • about 4 years Missing label for Monrovia, Liberia
  • about 4 years Update data
  • over 4 years multiple labels
  • over 4 years Problems installing from source.
  • over 4 years Marshalltown, MN should be Marshall
  • over 4 years one way arrows
  • over 4 years bridge=yes with highway=residential doesn't render
  • over 4 years How to add labels? merged_labels/Makefile depends on missing inputs
  • almost 5 years Important cities missing in the Netherlands
  • almost 5 years rainbow texture repeat is broken
  • almost 5 years Update from OpenStreetMap data
  • almost 5 years Error running 'make db/%place%'
  • almost 5 years Lhasa, Tibet missing
  • almost 5 years merter keresteciler: strange double city in Turkey
  • almost 5 years Incorporate latest placename fixes
  • about 5 years inconsistent/broken tiles
  • about 5 years Error when trying to run 'make'
  • about 5 years Effective text-dy is reversed with MVT
  • over 5 years Build new version (to pick up fixes to tilelive-cache)
  • over 5 years Darken building outlines on toner-lite
  • almost 6 years Add FORCE to ignore relation checks
  • almost 6 years Image optimization
  • almost 6 years render barriers and fences?
  • almost 6 years Look into more optimized formats
  • almost 6 years Remove simplified osm shapefiles
toner-carto open pull requests (View All Pulls)
  • Treat living-street like residential.
toner-carto list of languages used
Other projects in CartoCSS
Powered by Autocode - Instant Webhooks, Scripts and APIs
Autocode logo wordmark