About this tracker
An unofficial, independently built record of Atlanta City Council activity — every meeting, paper, and roll-call vote, updated nightly.
Coverage
| Meetings | 1,483 | Coverage | Jan 2, 2018 → Aug 24, 2026 |
|---|---|---|---|
| Legislation | 22,514 | Last updated | Aug 3, 2026 |
| Individual votes | 536,251 | Documents indexed | 46,141 |
| Papers with $ amounts | 9,142 | Papers mapped | 5,320 |
Where the data comes from
The council record is collected from the Atlanta City Council legislative portal (IQM2/Granicus) — the same public record the city clerk publishes. A nightly job picks up new agendas about a week ahead, re-checks recent meetings while minutes settle, and refreshes papers still moving through the process. Every meeting, paper, and vote on this site links back to its source page on the city portal, and the raw pages are archived permanently so any figure here can be re-verified against what the portal said at the time.
A few sections draw on other public sources: Zoning Review Board cases come from the city's Accela permitting system and the Department of City Planning's published ZRB agendas; the settlements map additionally matches crash-related settlements against Georgia DOT crash records. Each of these is likewise archived at capture time and linked back to its origin.
Data is stored as published, including the clerk's occasional typos. The legislative record — meetings, papers, votes, attendance — is never manually edited and contains no AI-generated prose. The exceptions are the settlements map, where a language model reads each settlement resolution to pull out where and when the underlying crash happened; some news-article links, which are labeled "matched by AI" wherever they appear; and the topic/mechanism tags on legislation pages, which carry a small "AI" mark. Legislation pages also list the code sections a paper cites — those are quoted word-for-word from the paper, not written by a model, though a model is what located them. All are described below.
What is derived, and how
- Seat assignments (District 3, Post 1 At Large, …) are observed from roll-call listings over time. Recurring clerk mislabels are detected and suppressed automatically. Council President is the one seat added by hand: presidents preside rather than vote, so roll calls are structurally blind to them — they are shown separately on people pages for periods where they preside.
- Dollar amounts are extracted from legislation text by pattern matching. Papers with many figures (bond schedules, TAD tables) are flagged and excluded from money totals by default, because summing every number on such a paper would overstate it.
- Map locations come from addresses and parcel IDs in the text, matched against the city's GIS layers. District, NPU, and neighborhood labels are computed against current boundaries at query time — historical items are never permanently stamped with a district, because boundaries get redrawn. Maps say "current boundaries" for this reason.
- Attendance, blocs, and divided votes are arithmetic over recorded roll calls — no modeling. A member "attended" a roll call if they cast any vote other than absent/away/excused; bloc agreement is the share of divided roll calls two members voted the same way on. Excused absences count as missed because the source rarely distinguishes them — a few hundred instances across half a million recorded votes; the exact numbers are on the attendance page.
- Topic and mechanism tags (marked with a small ✨ next to the tag) come from a language model that reads each paper's full text and assigns it one mechanism (appropriation, rezoning, contract award, settlement, …) from a fixed list of 16 and one or more topics (housing, transportation, parks, …) from a fixed list of 29. Tagging that text requires sending it to the model regardless, so the same pass also drafts a short summary and pulls out other structured facts — those are stored for internal quality checks only and are never published here.
- Code sections cited are the city Code and Charter sections named in a paper's own text, quoted word-for-word — the model locates the citation, it does not write or interpret it. Each one that can be identified with certainty links to that section on Municode, the city's official code publisher. The mapping from section number to Municode page comes from the city's own bulk code export (the 2026-07-28 edition), never from guesswork: Municode's internal page identifiers cannot be computed from a section number, and a link to the wrong law would be worse than no link. So a citation stays plain text whenever it names state law (which Municode does not publish), points at a whole chapter rather than a section, names a section the export does not contain, or is a bare number that two different laws both use — the Charter and the Code each have a "Section 2-101", and a citation that says only that is left alone.
- News links connect papers to press coverage. Where the article itself prints a paper number the link is exact; otherwise a language model reads the article and the connection is made only when a single paper clearly fits — those links carry a "matched by AI" label, and no link is made when the match is ambiguous.
- Settlement claims are the other place a language model is used. Settlement resolutions describe the underlying claim in prose; a model reads that text to classify what kind of claim was settled (city-vehicle collision, roadway liability, police conduct, premises, employment) and — for motor-vehicle incidents — to pull out the incident date and the streets involved, which are then geocoded and matched against Georgia DOT crash records. The resolution amounts and votes are taken verbatim from the record — only the category, incident location, and date are model-derived, and the map labels its markers as block-level approximations.
Community annotations
Plain-language summaries and tags on 52 papers come from the Atlanta Community Press Collective's vote tracker and are always shown attributed, verbatim, with a link to support their work. Their editorial judgment is theirs; this site adds no commentary of its own. (Their recorded vote tallies were also used to cross-check this site's roll-call data — every one matched.)
News coverage
The news section links council papers to press coverage: the city's own press releases and a few independent Atlanta newsrooms. Only the headline, source, date, and a link to the outlet's own site are shown — article text is never republished here (short excerpts appear only for the city's press releases, which are public records). Coverage is collected politely: through outlets' published feeds and APIs, rate-limited, and identified with a contact address.
Member "in the news" links are also discovered through the Brave Search API's news index. For outlets we don't have a feed relationship with, we store and display only the headline, outlet, date, and link — never article text. Paywalled outlets are marked $. A link is coverage, not endorsement.
If you run one of these outlets and want your links removed or the recurring checks stopped, email [email protected] and it will be done promptly, no questions asked.
Accuracy & corrections
This is an unofficial tracker built and maintained by an Atlanta resident, unaffiliated with the city or any organization. It can lag the portal by a day and inherits any errors in the source record. For anything consequential, verify against the linked portal page — and if you spot something wrong here that the portal has right, please email [email protected]; fixes ship fast.
The mark
The C in the site icon is drawn from the council's own geometry rather than illustrated. The three concentric bands symbolize the three at-large posts. The twelve navy seams running through them are the twelve council districts — each one its real boundary shape, taken from the city's official council district layer and placed in district order from the lower terminal around to the upper. It is generated by a script straight from the same polygons the maps on this site use, so when the districts are redrawn, the mark changes with them.