Skip to content
Fair Maps
Federal HouseState House SoonState Senate Soon
All states

Changelog

What changed in each release of the code that draws the maps, the Census files they are drawn from, the maps, the file formats, this site and the documentation.

Engine changelog

2.0.1 (2026-10-14)

Every map is drawn exactly as in 2.0.0.

  • Each cut's record in `cut-stats.json` now counts the chunks of its main sweep that were split between threads while they ran (`splitChunks`), and of those, the chunks swept again whole on the calling thread (`resweptChunks`).
  • The cached list of a chain's trackers is now cleared at the moment a spare tracker is taken into a pass, so it can never be read out of date.

2.0.0 (2026-10-13)

Bug fixes:

  • Island links counted as zero length in a cut's border. A cut that separated land only at a link therefore had a border of zero and won however unevenly it split the people. A link now properly adds the distance between its two blocks' internal points (the same measure the link was built with) to the border of any cut whose sides meet across it.
  • Balancing ignored equal moves that shortened the border. A move was made only when it lowered the sum of squared differences (a gain above zero), so a move that left the districts exactly as close (a gain of zero) was never made, even when it gave a shorter border, which for a shortest-border method is clearly an error. A move with a gain of zero is now made when it strictly shortens the border: people first, then border (the opposite of the cut step, which is border first, then people).

Other changes:

  • Drawing is faster, with every map exactly as the rules draw it: neighbouring tie stretches are swept again with one shared start instead of one each, the trackers keep the direction points they reuse, and heavy chunks of a sweep are split between idle threads while they run. Texas's State Senate takes about 16 minutes instead of 42.

1.1.0 (2026-10-11)

  • The engine can now draw a State House or a State Senate map as well as a Federal House map. Every chamber is drawn by the same rule and held to the same equal-population standard.
  • A chamber's number of districts is the number of distinct districts in the Census Bureau's 2025 state legislative district files. Those files are pinned and their shapes are never used to draw.
  • Maps are published for each chamber, and a newer Census legislative district file can be checked for and adopted.
  • Federal House maps are drawn exactly as before.

1.0.0 (2026-10-11)

  • First release. Each state is cut, again and again, along the straight line on the globe whose real border is shortest among those that split its people in the required ratio and leave both sides in one piece, until every piece holds one seat.
  • Census blocks are always kept whole, and stray pieces join the side around them.
  • Balancing moves single border blocks between neighboring districts when that narrows the population gap, comparing border lengths exactly in whole micrometers.
  • Ties go to the shorter border, then the sides nearer their fair shares of people, then the GEOID. No tie is broken by direction.
  • The side holding a piece's lowest GEOID gets the lower district numbers.
  • The same engine version and Census input always draw the same map, whatever the computer or the number of threads.

Input changelog

census-2020 r2 (2026-10-11)

  • Added the Census Bureau's 2025 state legislative district files (State House and State Senate), each pinned by its SHA-256. They supply each chamber's number of districts and the comparison overlay.

census-2020 r1 (2026-10-11)

  • First release: the 2020 Census block populations and boundaries, each file pinned by its SHA-256.

Maps changelog

3 (2026-10-13)

  • Every State House, State Senate and Federal House map redrawn with engine 2.0.0.
  • Hawaii's State House is the one map whose cuts change: no cut now splits Oahu from Kauai at the island link, and its range falls from 4,757 people (16.7%) to 158 (0.55%). Every other map is cut exactly as before.
  • Balancing now also makes moves that keep two districts exactly as close to equal while shortening the border, so every map with more than one district has slightly different borders. Ranges stay within a few people of what they were.
  • One-district maps are unchanged.

2 (2026-10-11)

  • Added State House and State Senate maps for every state that has the chamber (Nebraska has no State House).
  • Federal House maps rebuilt; every one is unchanged.

1 (2026-10-11)

  • First release: congressional districts for all 50 states, drawn by engine 1.0.0 from the 2020 Census.

Schema changelog

1.4.0 (2026-10-31)

  • Each published map now has a badge beside its preview image (badge.png, badge@2x.png, badge-dark.png and badge-dark@2x.png), showing that chamber's districts and how many were drawn by the rule. Badges are redrawn whenever the map is.
  • The crest, seal and pledge badges and the photo frame ring are published under /badges/.
  • `npm run publish-data -- --badges-only` writes just the badge files from maps already published.

1.3.0 (2026-10-13)

  • Each plan's metrics in `stats.json` now carry `balanceMovesBorderOnly` and `peopleMovedBorderOnly`: the balancing moves that only shortened the border (gain 0) and the people they carried. Both are 0 before balancing.
  • A balancing move in `balance.json` may now record a `gain` of 0 (a move that leaves the districts exactly as close to equal and shortens the border), and a `pop` of 0 (a block with no people).
  • The How it works examples describe these moves and island link lengths.
  • The How it works examples are extracted in 8 GB of memory: states loaded only to find the passed-over line examples are let go once those examples are picked. The examples file is unchanged.

1.2.0 (2026-10-12)

  • Census names are read as UTF-8, so accented county names such as Doña Ana County publish correctly.
  • Each map now publishes the district neighbors of its before-balancing plan, so the viewer can color districts consistently before that plan loads.

1.1.0 (2026-10-11)

  • Published files now describe each chamber separately, so a state has a Federal House, a State House and a State Senate map wherever it has them.
  • When the comparison overlay is updated, every chamber is stamped again. Federal House files keep their format and paths.

1.0.0 (2026-10-11)

  • First release of the published and exported file formats.

Web changelog

1.12.3 (2026-11-05)

  • Every badge snippet now tells the visitor's browser to send the address of the page showing it, so a badge on any page of a site is found, not only one on the home page. /pledges is now just the list of sites, with a link to /badges to pick a badge, and its text column matches the other pages. When a site shows the badge on its home page and on inner pages, the list shows the home page, so a representative's site keeps their name. An inner page is never listed when it redirects elsewhere (a login page, say) or asks search engines not to index it, so private pages that carry a site-wide badge stay private, and a site's home page is always recorded however many inner pages came first.

1.12.2 (2026-11-03)

  • Zooming out in the profile picture ring now goes until your whole photo, corners included, fits inside the ring's opening, so nothing is hidden under the ring. A square photo can zoom out too.

1.12.1 (2026-11-03)

  • The Zoom slider in the profile picture ring now also zooms out, down to where your whole photo fits inside the ring.

1.12.0 (2026-11-03)

  • You can now place your photo in the profile picture ring: drag it (or use the arrow keys) to move it, and use the Zoom slider to get closer. The download is always the picture as you see it.
  • A profile picture can't carry a link, so the ring card now gives a line to post with your new picture or put in your bio. It links to the badges page, so people who see your ring can find the site and get one too.

1.11.0 (2026-11-01)

  • The badges page is for everyone, not just candidates. It now starts with the profile picture ring, which shows the ring itself until you choose a photo, then the badges for a website, then the badges with your state's map.
  • The Take action page has a Show your support block that links to the badges, and the page you see after confirming your signature suggests putting the ring on your profile picture. The footer link now reads Badges.
  • The Sites that show the badge page no longer runs off the side of the screen on phones.

1.10.0 (2026-10-31)

  • A new Badges for candidates page, linked from the footer and from the Pledges page, offers a crest, an end-gerrymandering seal, a pledge card, the "I back Fair Maps" button, a badge with your state's map for the U.S. House and for each state chamber, and a profile photo frame. Each badge has a light and a dark version, a snippet to copy, and files to download for the web and for print.
  • Every badge loads through the same address as the existing button, so a site that shows any of them is checked and listed on the Pledges page the same way. The button's snippet is unchanged, so sites that already show it keep working.
  • The photo frame puts your picture inside the Fair Maps ring in your browser. The photo is never uploaded, and the privacy page says so.

1.9.0 (2026-10-28)

  • The Pledges page now lists the websites that show the Fair Maps badge, each with a link to the page where it appears. Showing the badge is the only thing we check: there is nothing to apply for, and no claim is made about who supports what. Add the badge to your home page and link it to fairmaps.melson.us/pledges, and the site lists you within minutes of the first visit, or within a day. If the badge stays off for two daily checks, the site comes off the list. A representative whose own home page shows the badge is marked "Shows the Fair Maps badge" in the Take action list.
  • The privacy page says what is kept about a website that shows the badge: its page address, the page title, where the badge was found and when it was seen and checked, deleted after 60 days unseen.

1.8.0 (2026-10-27)

  • A new Take action page, linked from the header, shows who represents you today: your state senator and state representative, your U.S. House member and both U.S. senators. Enter a street address and the site finds your districts in your browser. Each representative has a ready-made letter asking them to support the Fair Maps rule, with their email, contact form, website and phone number where we have them. One button opens a single email to every representative who lists an address, and another copies all of the addresses.
  • You can sign on with just an email and your state. Adding a street address is optional and counts you in your district. The address is used only to find the district and is never kept. A confirmation email makes the signature count: its link opens a page that confirms you as soon as it loads. You can remove your signature at any time from the Remove page, linked from the privacy page and from every email.
  • A "Why I signed" note is optional. Every note is read by hand before it can appear. A note shows publicly only after it is approved and only if you chose to show your name and town. Notes with links, contact details, street addresses or blocked words are not added, and your signature still counts.
  • A Pledges page lists officeholders who have publicly said they support the rule, each with a link to their own statement, and a badge anyone can add to their site. Candidates stay hidden for now. Party is never shown.
  • Counts of people who signed stay hidden until the national total reaches 1,000.
  • The privacy page now explains what sign-on keeps, what is encrypted, what is public and how long things are kept. The footer is tidier.

1.7.0 (2026-10-27)

  • The site counts visits with Vercel Web Analytics, which sets no cookies. Each page view is sent with its path only, never the part of the address after a ? or #, where other sites add click and campaign codes.
  • A new Privacy page says what the site counts, what it keeps in your browser, and what it sends elsewhere. The footer links to it.

1.6.1 (2026-10-27)

  • The sitemap now lists every state map page and each State House and State Senate page, not only the home, How it works, FAQ and changelog pages.

1.6.0 (2026-10-27)

  • The FAQ answers what fair means here, set beside equal, proportional and equitable, and its terms add Fair and Proportional.

1.5.0 (2026-10-27)

  • The home page is less crowded: the second paragraph is shorter, How it works and the three questions share one row of links, and the note on Washington, D.C. and the territories now lives only in the FAQ.
  • State labels on the national map no longer overlap. A label can move within its state to make room for a neighbor's, and a state with no room gets a callout. Labels are drawn above every state, so a neighbor no longer covers one.
  • On a phone, the national map grows to hold its callout column instead of running into what follows it.
  • Pointing at a state's label lights the state with it, and a state with keyboard focus stays lit when the pointer moves away.
  • Every page's footer links to GitHub forms for asking a question or reporting a problem, and the FAQ points to the question form for anything it does not answer.

1.4.0 (2026-10-23)

  • Addresses are now real paths, such as /CO, /CO/d/3, /how and /faq, instead of #/ links. Old #/ links still work and are rewritten to the path form when they open.
  • Embedders that set only dataBase in STR_VIEWER_CONFIG stay in hash mode, so a host page's own address is never rewritten. Setting routing to path opts in to real paths.
  • The home, How it works, FAQ and changelog pages are built ahead of time with their text and structured data (site, author, dataset, breadcrumb and FAQ markup, and the same for each state and chamber page), so search engines and link previews can read them without running the viewer.
  • The site now publishes a sitemap, robots.txt, llms.txt and llms-full.txt, along with a favicon and a touch icon.
  • State share pages open the viewer directly.
  • The home page answers what gerrymandering is and how to stop it.
  • The national questions list sits in the wide grid.

1.3.0 (2026-10-13)

  • What happened in this state reports how many balancing moves only shortened the border, when the map's stats include the count.
  • The balancing replay reads moves that leave the districts exactly as close to equal, including moves of blocks with no people.
  • How it works, the FAQ and the page explainers describe island link lengths in borders and balancing as people first, then border.
  • Letters that stand for numbers in the explanations (such as the balancing score's p, a and b) are set in italics.

1.2.1 (2026-10-12)

  • The map before balancing now loads only when it is shown, so state chamber pages open faster.
  • District colors are fixed from the first paint.

1.2.0 (2026-10-11)

  • The viewer now shows State House and State Senate maps alongside the Federal House map, with the same cut-by-cut walkthrough and comparison.
  • The map credit, cut ticks, district names and national page wording follow the chamber being shown.
  • The Federal House map is still the default, and its links are unchanged.

1.1.0 (2026-10-11)

  • feat(web): put FAQ first in the masthead and add a GitHub link before the credit

1.0.0 (2026-10-11)

  • First release of the map viewer: every state's districts, the cut-by-cut walkthrough, address search, the How it works page with worked examples, and share links.

Docs changelog

1.2.5 (2026-11-05)

  • The README explains the referrer policy in the badge snippet, and that older snippets without it are found only on a site's home page.

1.2.4 (2026-11-05)

  • The README explains that the weekly representative data refresh carries no version bump, and that a district alias edit still counts as a web change.

1.2.3 (2026-10-31)

  • The README describes every badge, how each image is served, and how to make the badge files again.

1.2.2 (2026-10-31)

  • Described that the engine version follows the files the map generator imports.

1.2.1 (2026-10-28)

  • Described the badge: how sites that show it are noticed and checked, what is recognised, the limits on checking, and what is kept.

1.2.0 (2026-10-27)

  • Described how representative data is pinned, published and refreshed each week, how the sign-on backend and its automatic migrations work, how to add a pledge, and what the note rules block.

1.1.0 (2026-10-27)

  • Described the privacy page and the visit counter, and how the tests keep the page's claims true.

1.0.6 (2026-10-24)

  • Listed the Census cache workflow and said the code standards checks run on pull requests.

1.0.5 (2026-10-24)

  • Described the `splitChunks` and `resweptChunks` fields of `cut-stats.json`.

1.0.4 (2026-10-23)

  • docs: path URLs and embedding hash mode

1.0.3 (2026-10-12)

  • Described how an island link's length counts in a cut's border, and balancing as people first, then border, including what the metrics count.
  • Described the `balanceMovesBorderOnly` and `peopleMovedBorderOnly` fields of `stats.json`.
  • Set the letters that stand for numbers in italics.

1.0.2 (2026-10-12)

  • Listed `before-neighbors.json` among the published files and explained why the viewer reads it up front.

1.0.1 (2026-10-11)

  • Explained State House and State Senate maps: where each chamber's number of districts comes from, how the maps are drawn, and how the versions relate.
  • Corrected the wording about chambers so districts are named by the chamber they belong to.

1.0.0 (2026-10-11)

  • First release of the documentation of how districts are drawn.