{
  "version": 2,
  "entries": [
    {
      "id": "2026-10-04-votes-business-spellings-grouped",
      "date": "2026-10-04",
      "type": "feature",
      "title": "One business, one card, with every spelling the minutes print",
      "summary": "The business cards on Votes used to split one company across several cards because the minutes print its name different ways. Spellings that differ only in capitalization, punctuation or an abbreviation now share a card. A card can also group different legal forms, but only where the minutes print the same projects under each spelling: Jackson Creek Enterprises, printed five ways across 2016 to 2024 (plain, Inc., L.C., a typo and a fragment), is one card of 30 votes. Each card lists the exact spellings with counts and dates and says why they were grouped. The minutes do not say whether Inc. and L.C. are one company, so the card says that too. A different legal form never groups on its own.",
      "areas": [
        "council",
        "votes"
      ],
      "links": [
        "/votes/"
      ]
    },
    {
      "id": "2026-10-04-story-comments",
      "date": "2026-10-04",
      "type": "feature",
      "title": "Comment on a story: read by the editor before anything shows",
      "summary": "Each story page has a Comments section with a short form. A comment appears right away under the display name the reader picks, with no account and no outside service. The editor is alerted to each one and can hide it; a comment containing a link, email address or phone number is held until the editor approves it.",
      "areas": [
        "news"
      ],
      "links": [
        "/news"
      ]
    },
    {
      "id": "2026-10-04-roundup-surveillance-capital",
      "date": "2026-10-04",
      "type": "roundup",
      "title": "The surveillance-capital page: the question, the City's own words, and the neighbors beside Altoona",
      "summary": "The page behind the masthead question now holds the record it can stand on: Altoona's portal figures and rates, the City's own account of the program, and every nearby city's portal count with a size-adjusted neighbor rate, each with what it cannot show. The measures table leads with the community-mapped count inside the city limits, with the vendors' portal figures labeled as one vendor's.",
      "areas": [
        "alpr"
      ],
      "links": [
        "/alpr/surveillance-capital"
      ],
      "changes": [
        {
          "id": "2026-10-04-surveillance-capital-city-words",
          "date": "2026-10-04",
          "type": "feature",
          "title": "The surveillance-capital page opens with the City's own words",
          "summary": "The page now quotes the police department's 2025 annual report calling ARTIC the first real-time crime center in Iowa, with a link to the report and to our notes on the police page, before it tests the masthead question against the records.",
          "areas": [
            "alpr"
          ],
          "links": [
            "/alpr/surveillance-capital"
          ]
        },
        {
          "id": "2026-10-04-surveillance-capital-community-first",
          "date": "2026-10-04",
          "type": "feature",
          "title": "The surveillance-capital table leads with the cameras residents have mapped",
          "summary": "The measures table now starts with the community-mapped camera count inside Altoona's city limits and that count per 1,000 residents, labeled unverified and following the Community cameras setting. The Flock rows are labeled as one vendor's portal figures, not the City's camera total.",
          "areas": [
            "alpr"
          ],
          "links": [
            "/alpr/surveillance-capital"
          ]
        },
        {
          "id": "2026-10-04-surveillance-capital-neighbors-rates",
          "date": "2026-10-04",
          "type": "feature",
          "title": "Surveillance-capital page: every nearby city's portal count, a size-adjusted neighbor rate and per-camera rates",
          "summary": "The neighbors section now lists every nearby city with the count its own transparency portal prints and its date, including Bondurant, whose mayor said its police do not use ALPR, and the cities that publish no count. One line gives the pooled rate per 10,000 residents for Altoona and for the nearby cities with a portal count or a no-ALPR statement, marked as this site's arithmetic. The measures table adds detections per camera per day and hotlist hits per 1,000 detections, each with what it cannot show. The council-versus-public comparison is not built: it needs official or resident locations, which the site does not use.",
          "areas": [
            "alpr"
          ],
          "links": [
            "/alpr/surveillance-capital"
          ]
        },
        {
          "id": "2026-10-04-surveillance-capital-page",
          "date": "2026-10-04",
          "type": "feature",
          "title": "The masthead question now has a page: \"The surveillance capital of Iowa?\"",
          "summary": "The tagline links to a page that sets Altoona's published camera, detection, search and hotlist figures beside the Census population estimate and the nearby cities' portal counts, and says plainly which measures cannot answer the question. It describes the record and makes no claim about whether the cameras work.",
          "areas": [
            "alpr"
          ],
          "links": [
            "/alpr/surveillance-capital"
          ]
        }
      ]
    },
    {
      "id": "2026-10-04-roundup-reading-and-footer",
      "date": "2026-10-04",
      "type": "roundup",
      "title": "Easier to read at the end of a page: reading guides, the page history line and footer links",
      "summary": "Three same-day changes to how a page reads. Every \"how to read it\" guide now shows the mark it explains, a swatch, ramp, line or dot, beside a bold term and its meaning, with limits set apart by an open amber ring. The \"this page has changed N times\" line and its sparkline moved up beside the page feedback row, above the footer. The footer's column headings open their section's main page. And each section's main page now opens with a card for every page under it.",
      "areas": [
        "alpr",
        "council",
        "local",
        "news",
        "site"
      ],
      "links": [
        "/whats-new",
        "/alpr/coverage",
        "/alpr/camera-check",
        "/alpr/court-rulings",
        "/votes"
      ],
      "changes": [
        {
          "id": "2026-10-04-footer-headings-link",
          "date": "2026-10-04",
          "type": "feature",
          "title": "Footer column headings now open their section's main page",
          "summary": "The Council, Police and ALPR, Local, Tools, News and research and About headings in the footer are now links to the same pages the header tabs open, so a reader at the bottom of a page can jump to a section without scrolling back up. They keep their heading look, with the site's hover and focus styling.",
          "areas": [
            "site"
          ],
          "links": [
            "/whats-new"
          ]
        },
        {
          "id": "2026-10-04-footer-home-card",
          "date": "2026-10-04",
          "type": "feature",
          "title": "A Home card in every page's footer",
          "summary": "Every page's footer now has the same small Home card under the share links, so the front page is one tap away from the bottom of any page. On the front page the card is marked as the current page.",
          "areas": [
            "site"
          ],
          "links": [
            "/whats-new"
          ]
        },
        {
          "id": "2026-10-04-page-history-in-feedback-band",
          "date": "2026-10-04",
          "type": "feature",
          "title": "The \"this page has changed N times\" line now sits beside the page feedback row, above the footer",
          "summary": "Every page's update count and its weekly sparkline used to print below the footer, where few readers scrolled. The line now sits on the right of the \"Was this page useful?\" row at the end of the content, above the footer, and folds under that row on a phone. It opens to the same counts by week as before.",
          "areas": [
            "site"
          ],
          "links": [
            "/whats-new"
          ]
        },
        {
          "id": "2026-10-04-reading-guides",
          "date": "2026-10-04",
          "type": "feature",
          "title": "Every \"how to read it\" guide now shows the mark it explains next to its meaning",
          "summary": "The reading notes under the coverage map, the camera check, the court rulings list and the vote rows used to be plain bullet lists, so a reader had to match a color or line in the chart to a sentence by guesswork. Each guide is now a grid of cards: the swatch, ramp, line, dash, dot, hollow point or glyph on the left, its name in bold, and what it means in one or two sentences. Limits and caveats carry an open amber ring so they read apart from the key. The cards wrap to one column on a phone and follow the site's dark mode and value-color settings.",
          "areas": [
            "site",
            "alpr",
            "council"
          ],
          "links": [
            "/alpr/coverage",
            "/alpr/camera-check",
            "/alpr/court-rulings",
            "/votes",
            "/whats-new"
          ]
        },
        {
          "id": "2026-10-04-section-hubs",
          "date": "2026-10-04",
          "type": "feature",
          "title": "Each section's main page now opens with cards for every page under it",
          "summary": "The Council, Police and ALPR, Local, Tools, News and research and About pages now carry a card grid under the tab strip: one card per page in that section, with its title, one line on what it holds, and the date it last changed. The footer headings and header tabs open these pages, so a reader can see a whole section at a glance and pick a page without the menu.",
          "areas": [
            "site",
            "council",
            "alpr",
            "local",
            "news"
          ],
          "links": [
            "/council",
            "/police",
            "/local",
            "/local/civic",
            "/news",
            "/about",
            "/whats-new"
          ]
        }
      ]
    },
    {
      "id": "2026-10-04-roundup-news-stories",
      "date": "2026-10-04",
      "type": "roundup",
      "title": "Two Flock stories now say what they mean for Altoona",
      "summary": "A new story covers a Virginia police employee charged with misusing Flock and sets Virginia's deletion and audit rules beside what Altoona's own pages state. The September analysis of Altoona's place in the Flock sharing snapshot gained a \"Why it matters in Altoona\" section and now says plainly which way the sharing runs: its 232 is other portals naming Altoona as a recipient, not Altoona's own outgoing sharing.",
      "areas": [
        "alpr",
        "news"
      ],
      "links": [
        "/news/story/virginia-flock-misuse-charge-altoona-rules-2026-10-04.html",
        "/news/story/altoona-flock-sharing-footprint-analysis-2026-09-24.html"
      ],
      "changes": [
        {
          "id": "2026-10-04-sharing-story-why-it-matters",
          "date": "2026-10-04",
          "type": "feature",
          "title": "The Flock sharing story gains \"Why it matters in Altoona\"",
          "summary": "The site's analysis of Altoona's place in the Flock sharing snapshot, published in September, now says plainly which way the sharing runs: its 232 is other portals naming Altoona as a recipient, not Altoona's own outgoing sharing, which the department's records-request export counts separately. The headline and summary were reworded to match, and the story carries the site's own view under the Analysis / opinion label: what the City says about its visitors and perimeter cameras, what the police annual reports show, what the City's own words and the department's ARTIC center suggest about who the program is aimed at, and what the record leaves open. Every point rests on a record this site already posts. Analysis stories may now carry this block, still under the Analysis / opinion label and the desk byline.",
          "areas": [
            "news",
            "alpr"
          ],
          "links": [
            "/news/story/altoona-flock-sharing-footprint-analysis-2026-09-24.html"
          ]
        },
        {
          "id": "2026-10-04-story-virginia-flock-charge",
          "date": "2026-10-04",
          "type": "feature",
          "title": "News: a Virginia police employee charged with misusing Flock, and how Altoona's posted rules compare",
          "summary": "A story page covers a Chesterfield County, Virginia police employee charged after coworkers reported the use of police systems, including Flock, and an audit found suspicious searches, as WRIC and VPM News reported. It credits how the case was caught and sets Virginia's 21-day deletion and 30-day audit rules beside what Altoona's own pages state, labeled analysis. This site has seen no Altoona audit. Reader question: what safeguards does Altoona say it has, and can residents check them?",
          "areas": [
            "news",
            "alpr"
          ],
          "links": [
            "/news/story/virginia-flock-misuse-charge-altoona-rules-2026-10-04.html"
          ]
        }
      ]
    },
    {
      "id": "2026-10-04-roundup-camera-tools",
      "date": "2026-10-04",
      "type": "roundup",
      "title": "Camera check and coverage map: more detail, a longer slider, two separate tools",
      "summary": "The camera check now opens with the nearest mapped camera and the four nearest, adds how far each 5% of Altoona sits from one, and a heat map of nearest-camera distance against cameras in range. The coverage map is its own page again, with a preview on the home page, and its distance slider now reaches five miles.",
      "areas": [
        "alpr",
        "maps"
      ],
      "links": [
        "/alpr/camera-check",
        "/alpr/coverage"
      ],
      "changes": [
        {
          "id": "2026-10-04-camera-check-joint",
          "date": "2026-10-04",
          "type": "feature",
          "title": "Camera check: how close the nearest camera is, against how many are in range",
          "summary": "Under More detail, the camera check adds a heat map of Altoona homes and businesses by distance to the nearest mapped camera and the number of mapped cameras within half a mile: 68% of those within a tenth of a mile of one have four or more in range, against 9% at four to five tenths. Every cell holds at least five parcels, and the map is community-mapped and unverified.",
          "areas": [
            "alpr"
          ],
          "links": [
            "/alpr/camera-check#more"
          ]
        },
        {
          "id": "2026-10-04-camera-check-nearest-cameras",
          "date": "2026-10-04",
          "type": "feature",
          "title": "Camera check: the nearest camera and the four nearest mapped cameras now lead the result",
          "summary": "Tap the camera check's map and the result now opens with the distance to the nearest mapped camera in feet, big and full width, then lists the four nearest community-mapped cameras with how far each is, which way, and which city it sits in. The same four are numbered on the map. The counts within a mile and the comparison with Altoona sit below as context. They are the volunteers' unverified dots, a street block still gets bands only, and the list is never included in a share or summary.",
          "areas": [
            "alpr",
            "maps"
          ],
          "links": [
            "/alpr/camera-check"
          ]
        },
        {
          "id": "2026-10-04-camera-check-percentiles-100ft",
          "date": "2026-10-04",
          "type": "feature",
          "title": "Camera check shows how far each 5% of Altoona sits from a mapped camera",
          "summary": "Under More detail the camera check now lists the distance within which each 5% of Altoona's homes and businesses have a mapped camera, marks where the reader's spot falls, and the within-distance chart steps every 100 feet instead of every tenth of a mile.",
          "areas": [
            "alpr",
            "maps"
          ],
          "links": [
            "/alpr/camera-check"
          ]
        },
        {
          "id": "2026-10-04-coverage-own-page-again",
          "date": "2026-10-04",
          "type": "feature",
          "title": "The coverage map is its own page again, with a preview on the home page",
          "summary": "The coverage map and the camera check are separate tools again: the camera check for one street or spot, the coverage map for the whole city with its distance slider, area choices and city table. The home page now shows a picture of the coverage map's default view beside the camera check box, with one link to the full page.",
          "areas": [
            "alpr",
            "maps"
          ],
          "links": [
            "/alpr/coverage",
            "/alpr/camera-check"
          ]
        },
        {
          "id": "2026-10-04-coverage-slider-five-miles",
          "date": "2026-10-04",
          "type": "feature",
          "title": "The coverage map's distance slider now reaches five miles, with twelve marked distances",
          "summary": "The distance slider used to stop at one mile, which clipped the farthest places on the map. It now slides smoothly from 250 feet to five miles, the chart and city table gain twelve marked distances, and the default is still 528 feet.",
          "areas": [
            "alpr",
            "maps"
          ],
          "links": [
            "/alpr/coverage"
          ]
        }
      ]
    },
    {
      "id": "2026-10-04-roundup-4-0-coat-of-paint",
      "date": "2026-10-04",
      "type": "roundup",
      "title": "4.0: one coat of paint on every page",
      "summary": "Every page now reads its type sizes, spacing, corners and row shading from one shared set, so the site looks and behaves the same from the Council record to the camera tools. Settings has a Density choice: Comfortable, or Compact to fit more rows and figures on the screen. Figures too small to show, missing or still pending are printed in words, and every table and tile that loads from a feed shows a loading and an error state. The three ALPR tools share one layout: a tool row, the answer first, then one Settings card with the same control names on each. The design page shows each shared piece in every state.",
      "areas": [
        "about",
        "alpr",
        "council",
        "local",
        "maps",
        "news",
        "pay",
        "people",
        "police",
        "records-requests",
        "site",
        "sources",
        "votes",
        "whats-new"
      ],
      "links": [
        "/whats-new",
        "/votes",
        "/alpr/camera-check"
      ],
      "changes": [
        {
          "id": "2026-10-04-4-0-coat-page-pass-1",
          "date": "2026-10-04",
          "type": "feature",
          "title": "4.0 coat: /local, /pay, /police and /council read their sizes from the shared tokens; Census tiles and numbers tables use the shared pieces",
          "summary": "Four pages drop their own font sizes, paddings and card styling for the shared tokens, so Compact density and the coat reach them. On /local the Census figures are shared stat tiles with the Iowa and U.S. comparison line, the numbers tables are shared data tables, and loading, empty and failed states use the shared boxes. On /pay the headline figures follow the shared tile size. Look only; no wording, figure or control changed.",
          "areas": [
            "local",
            "pay",
            "police",
            "council"
          ],
          "links": [
            "/local",
            "/pay",
            "/police",
            "/council"
          ]
        },
        {
          "id": "2026-10-04-4-0-coat-page-pass-2",
          "date": "2026-10-04",
          "type": "feature",
          "title": "4.0 coat: /sources, /records-requests, /news and /whats-new read their sizes from the shared tokens; loading and empty states use the shared boxes",
          "summary": "Four more pages drop their own font sizes, paddings and card styling for the shared tokens, so Compact density and the coat reach them. The news feed status, the What's New log status and its empty filter result use the shared empty, loading and error boxes. The source entries on the Sourcebook lose their gold top rule, since gold marks only Altoona. Look only; no wording, figure or control changed.",
          "areas": [
            "sources",
            "records-requests",
            "news",
            "whats-new"
          ],
          "links": [
            "/sources",
            "/records-requests",
            "/news",
            "/whats-new"
          ]
        },
        {
          "id": "2026-10-04-4-0-coat-page-pass-3-votes",
          "date": "2026-10-04",
          "type": "feature",
          "title": "4.0 coat, page pass 3: the Votes page body reads the shared tokens",
          "summary": "The Votes page's own styles now use the site's shared type, spacing, radius and density tokens and the shared stat tiles, data tables and empty-state box for its headline figures, the roll-call table, the cumulative and participation tables and the quick-hitter tables. Look only: no figure, wording or control changed. The member profile cards keep their own pass.",
          "areas": [
            "votes",
            "site"
          ],
          "links": [
            "/votes"
          ]
        },
        {
          "id": "2026-10-04-camera-check-4-0-pass",
          "date": "2026-10-04",
          "type": "data-fix",
          "title": "Camera check and heat map read the shared type, spacing and density tokens",
          "summary": "The merged camera check page's own styles (and the heat map's) now use the shared font, text-size, spacing and Density tokens, the shared band meter, and the shared tool nav, so the Density setting reaches the page. No wording, figure or control changed.",
          "areas": [
            "alpr",
            "maps"
          ],
          "links": [
            "/alpr/camera-check"
          ]
        },
        {
          "id": "2026-10-04-coat-about-meeting-person-pages",
          "date": "2026-10-04",
          "type": "feature",
          "title": "4.0 look pass: /about and the generated meeting and person pages read the shared tokens",
          "summary": "The /about page's inline style and the /council/meetings template (so every generated meeting page) swap private font stacks, sizes, paddings and gaps for the shared tokens, with the density setting on paddings. Person pages inherit /people's tokens when regenerated. Look only: no wording, figure or control changes, no new colors.",
          "areas": [
            "about",
            "council",
            "people"
          ],
          "links": []
        },
        {
          "id": "2026-10-04-people-4-0-coat",
          "date": "2026-10-04",
          "type": "data-fix",
          "title": "4.0 coat: /people and the /votes profile cards read the shared tokens",
          "summary": "The /people page styles and the /votes profile cards use the shared sizes, spacing, corners, lift and density tokens (the Density setting now reaches them); the record card's six figures are shared compact stat tiles, each cited meeting is a shared disclosure card, and the record card's loading line is the shared loading state. Look only: no wording, figure or control changed.",
          "areas": [
            "people",
            "votes"
          ],
          "links": []
        },
        {
          "id": "2026-10-04-tracker-tokens",
          "date": "2026-10-04",
          "type": "feature",
          "title": "ALPR tracker: inline styles read the shared tokens",
          "summary": "The tracker's page-private font stacks, small font sizes and block spacing now come from site-shell.css's tokens (--font-ui, --font-read, --step-*, --space-* with --density), so the Density setting reaches the page. Look only; page height moves by under half a percent. Off-scale values were left alone, and the private .counterpoint rule still duplicates the shared one.",
          "areas": [
            "alpr"
          ],
          "links": [
            "/alpr/tracker"
          ]
        },
        {
          "id": "2026-10-04-tracker-tool-pattern",
          "date": "2026-10-04",
          "type": "feature",
          "title": "The ALPR tracker joins the camera check's layout: a tool row, the answer first, and one Settings card",
          "summary": "The ALPR tracker now opens like the camera check: a row linking the two tools, then \"How many cameras\" with a one-sentence answer before any control (Altoona's community-mapped count and where it stands among its neighbors, with its sources and dates). The community-mapped switches, the map base and the value colors moved into one Settings card, folded on phones.",
          "areas": [
            "alpr"
          ],
          "links": [
            "/alpr/tracker",
            "/alpr/camera-check"
          ]
        }
      ]
    },
    {
      "id": "2026-10-04-outside-report-cited-not-checked",
      "date": "2026-10-04",
      "type": "feature",
      "title": "An outside report's findings now sit beside the records they concern",
      "summary": "Where another outlet's reporting on Altoona's plate readers bears on a record, the page now says what the outlet reported, cites its report with date and link, and shows the posted record's own wording beside it, without ruling on which is right. Added to Records requests (contracts, audit policy, sharing network, a new retention-schedule note), the Police page, and the ALPR tracker's statements and approvals sections. The Sourcebook entry now says the report is cited, not re-verified, and that its figures never enter a count or chart.",
      "areas": [
        "alpr",
        "records"
      ],
      "links": [
        "/records-requests",
        "/police",
        "/alpr/tracker",
        "/sources"
      ]
    },
    {
      "id": "2026-10-04-flock-portal-reading",
      "date": "2026-10-04",
      "type": "data-update",
      "title": "Flock's portal for Altoona, read October 4: 580,997 vehicles detected, 208 searches, 8,242 hotlist hits",
      "summary": "A new reading of Altoona PD's Flock transparency portal (page dated October 4, 2026) replaces the October 2 reading on the tracker, the homepage and the usage figures. Against October 2: vehicles detected in 30 days rose from 567,797 to 580,997, searches in 30 days fell from 222 to 208, and hotlist hits in 30 days fell from 8,263 to 8,242. The portal still lists 51 cameras and 30-day retention, and its policy wording (acceptable use, prohibited uses, access, hotlist policy) is word for word the same as in the earlier readings. The figures are the portal's own, provided by Flock Safety, as read in a browser on October 4.",
      "areas": [
        "alpr"
      ],
      "links": [
        "/alpr/tracker"
      ]
    },
    {
      "id": "2026-10-04-feature-council-by-era",
      "date": "2026-10-04",
      "type": "feature",
      "title": "The council by era: who was named in roll calls in 2014 to 2019 and 2020 on",
      "summary": "/council has a new section that sets the two eras of the record side by side: meetings and roll calls in each, the absent share of named positions, and each member named in the era with their first and last roll call, roll calls named, absences and decisions with a nay vote, linked to their profile. The figures come from the roll-call baselines feed, which now carries each member's absent share and dates and the list of members in each era, so the page only formats them. Records before 2020 are thinner; the page says so beside the numbers.",
      "areas": [
        "council",
        "votes"
      ],
      "links": [
        "/council",
        "/votes/baselines.json"
      ]
    },
    {
      "id": "2026-10-04-external-reports-simplified",
      "date": "2026-10-04",
      "type": "feature",
      "title": "Outside reports are now short, credited links",
      "summary": "Each outside-report card shows the outlet's headline, outlet and date, a short summary and a link to the report. The per-claim comparison tables against our records are gone: this site links outside reporting for context and does not check each claim.",
      "areas": [
        "alpr",
        "news"
      ],
      "links": []
    },
    {
      "id": "2026-10-04-correction-remarks-cut-short",
      "date": "2026-10-04",
      "type": "correction",
      "title": "Three 2014-2019 Council remarks no longer cut short by a redaction",
      "summary": "Three remarks from 2014-2019 meetings, on a water-line repair, a flood-plain survey and a footing-drain reimbursement, had part of a sentence replaced by the words \"property owner\" while private names were being removed, which cut them short. They now read as the minutes print them, still without residents' full names. The business name Fireside Grille is also restored where it had been shortened. No vote, count or attendance figure changed.",
      "areas": [
        "council",
        "votes"
      ],
      "links": [
        "/votes"
      ]
    },
    {
      "id": "2026-10-04-correction-meeting-counts-2015-2019",
      "date": "2026-10-04",
      "type": "correction",
      "title": "Two 2014-2019 meeting counts corrected, and five consent-agenda votes named",
      "summary": "The 2015 record counted the March 3 agenda as its own regular meeting; the agenda is headed a Monday, March 3 that was a Tuesday, and the minutes approval line calls it the March 2 meeting, so it is the same meeting. The May 21, 2019 session is now an additional session the day after the regular May 20 meeting, not a regular meeting. The record now reads minutes for 22 of 24 regular meetings in 2015 and 24 of 24 in 2019. Five votes that were all titled \"Consent Agenda\" now carry the item they decided, read from the minutes scans.",
      "areas": [
        "council",
        "votes"
      ],
      "links": [
        "/votes",
        "/council"
      ]
    },
    {
      "id": "2026-10-04-correction-fact-check-sweep",
      "date": "2026-10-04",
      "type": "correction",
      "title": "Corrections from a fact check of last night's changes",
      "summary": "Several descriptions were wrong or out of date. The coverage map's slider runs from 50 feet to five miles with fourteen marked distances, not 250 feet and twelve, and the option to add or leave out what-if cameras was removed. The camera check shows the nearest camera in feet only when it is under half a mile. The color entry's \"Police and ALPR magenta\" applies to the ALPR tracker, and the Council tone is a slate-blue. Meeting pages now say the Mayor was on the roll call rather than presided unless the minutes show who presided, and Mayor pages count sessions on the roll call, including workshops. Member pages say no votes out of decisions they voted on. A Virginia story and its report card now say an audit found suspicious transactions, and no longer call it a supervisor's audit or say the audit caught it. The ALPR report cards now cite three 2022 camera-count memos, not two. The surveillance-capital page now says detections are events, not people, in its opening sentence. The WeAreIowa story's headline now says what the station reported, in plain words.",
      "areas": [
        "alpr",
        "council",
        "people",
        "news"
      ],
      "links": [
        "/alpr/coverage",
        "/alpr/camera-check",
        "/alpr/surveillance-capital",
        "/whats-new"
      ]
    },
    {
      "id": "2026-10-04-color-by-job",
      "date": "2026-10-04",
      "type": "feature",
      "title": "Color now means one thing at a time: gold is Altoona, status is red, amber, green or blue, and each part of the site has its own tone",
      "summary": "Gold used to mark section bars, badges, buttons and the news flags on every page, so a reader could not tell a mark that meant something from one that did not. Now gold marks Altoona only where it sits beside other places. A status reads in its expected color beside its word: Breaking is red, New is green, Updated is blue, a figure the City has not posted yet is amber, an error is red. Section bars, kickers and fold cues take the tone of the part of the site you are in: Council blue, Police and ALPR magenta, Local green, Tools teal, News and the home page the site's dark red. Value scales on maps, tables and charts are unchanged, still green to red or gray from Settings, with every number printed.",
      "areas": [
        "site",
        "alpr",
        "council",
        "news"
      ],
      "links": [
        "/whats-new"
      ]
    },
    {
      "id": "2026-10-04-camera-check-land-use-withdrawn",
      "date": "2026-10-04",
      "type": "correction",
      "title": "Camera check: land-use view withdrawn",
      "summary": "The camera check's land-use view (homes, commercial, industrial and tax-exempt properties on their own) was removed after a privacy review found that, compared with the citywide chart, it could reveal groups of fewer than five properties. The citywide chart and the other charts are unchanged.",
      "areas": [
        "alpr"
      ],
      "links": [
        "/alpr/camera-check#more"
      ]
    },
    {
      "id": "2026-10-03-votes-pulled-consent-items",
      "date": "2026-10-03",
      "type": "correction",
      "title": "Nine roll calls on items pulled off the consent agenda now carry their own titles",
      "summary": "At six meetings the Council pulled a sub-item off the consent agenda and voted on it separately, and the vote tracker filed that separate vote as the consent agenda. Those roll calls now carry the sub-item's own title and a note. The one that changes a count: on Dec. 16, 2024, the 3-2 vote (Evans and Stewart voting nay) was on item 16k, giving notice to withdraw from the BRAVO Greater Des Moines 28E agreement, not on the consent agenda, which then passed 5-0. The others are May 18, 2020 (13h), Nov. 16, 2020 (14b, B8), Feb. 7, 2022 (17t and 17u), Jan. 16, 2023 (14m, the reopened item 7 rezoning, four roll calls) and Nov. 18, 2024 (11L). No tally changed. On Council's cost tables, the yearly counts of agenda items voted on and of unanimous consent-agenda votes move by one to four in 2020, 2022, 2023 and 2024, and the cost per agenda item moves with them.",
      "areas": [
        "votes",
        "council"
      ],
      "links": [
        "/votes",
        "/council"
      ]
    },
    {
      "id": "2026-10-03-votes-meeting-date-links",
      "date": "2026-10-03",
      "type": "feature",
      "title": "Vote dates on /votes open that meeting's page",
      "summary": "In the vote table each date links to that meeting's own page, and each day in the tree has an Open this meeting's page link. A day with two sessions links to both.",
      "areas": [
        "votes",
        "council"
      ],
      "links": [
        "/votes",
        "/council/meetings"
      ]
    },
    {
      "id": "2026-10-03-tools-menu-camera-tools",
      "date": "2026-10-03",
      "type": "feature",
      "title": "The camera check and coverage map are in the Tools menu",
      "summary": "The site menu's Tools list now includes the camera check and the coverage map, and the two tools and the ALPR tracker link to each other.",
      "areas": [
        "alpr"
      ],
      "links": [
        "/alpr/camera-check",
        "/alpr/coverage"
      ]
    },
    {
      "id": "2026-10-03-roundup-telling-the-desk",
      "date": "2026-10-03",
      "type": "roundup",
      "title": "Telling the desk what you think, and following what it finds",
      "summary": "The message page opens with six topics, each with a note on what helps the desk most and what happens next, and can carry the page you were reading. The \"Was this page useful?\" row under every page records a Yes or No the moment it is tapped; an optional Add details button then asks what helped or what was missing and links straight to an error report when something looks wrong. Each official now has a feed of their roll-call positions and remarks, linked from their profile, and What's New has one feed per topic.",
      "areas": [
        "contact",
        "council",
        "feeds",
        "people",
        "site"
      ],
      "links": [
        "/contact",
        "/whats-new"
      ],
      "changes": [
        {
          "id": "2026-10-03-contact-topics-feedback-followup",
          "date": "2026-10-03",
          "type": "feature",
          "title": "Leave a message: pick a topic, and page feedback asks what helped",
          "summary": "The message page now opens with six topics (something is wrong, missing context, a tip or a record, a question, a site problem, something else), each with a note on what helps the desk most and what happens next, and it can carry the page you were reading. The \"Was this page useful?\" row at the bottom of every page now asks what helped or what was missing with a few one-tap reasons, links straight to an error report when something looks wrong, and settles into one thank-you line.",
          "areas": [
            "contact"
          ],
          "links": [
            "/contact"
          ]
        },
        {
          "id": "2026-10-03-follow-feeds",
          "date": "2026-10-03",
          "type": "feature",
          "title": "Follow one official or one topic in a feed reader",
          "summary": "Each Council member, the Mayor and other officials with a record in the minutes now have an Atom feed of their newest roll-call positions and remarks, linked from their profile, with each item opening its citation page; procedural motions are left out. What's New adds one feed per topic: the ALPR program, City Council, Council votes, People, Police, Pay and Local.",
          "areas": [
            "people",
            "council",
            "feeds"
          ],
          "links": [
            "/people",
            "/whats-new"
          ]
        },
        {
          "id": "2026-10-03-page-feedback-one-tap",
          "date": "2026-10-03",
          "type": "feature",
          "title": "Page feedback counts with one tap",
          "summary": "Tapping Yes or No under \"Was this page useful?\" now records the answer right away, with nothing to fill in. An optional Add details button then opens the reasons and a note; skipping it still leaves the tap counted. The picked thumb fills in and picked reasons gain a check mark, so the choice shows without relying on color.",
          "areas": [
            "site"
          ],
          "links": [
            "/"
          ]
        }
      ]
    },
    {
      "id": "2026-10-03-roundup-screens-and-dark",
      "date": "2026-10-03",
      "type": "roundup",
      "title": "Pages fit every screen better, and dark mode has an AMOLED black option",
      "summary": "Pages use the whole width on a phone, every toggle and list link is easy to tap, split and short windows show the page sooner, and wide monitors show more of each chart and table. Settings adds a Dark style choice: AMOLED black sets dark pages on pure black for OLED screens, and the Year choice now also opens the Council roster, a person's remarks and the meetings list on that year. The layout changes alter no figure, label or source. A figure a correction changed now carries a dated \"Corrected\" marker on its tile that opens the correction. The Sourcebook says which pages use each source and what the site takes from it and leaves out, and lists the site's data files for download. On About, the reads-per-day chart can add raw hits from the server's access logs, every page sent to anyone, bots included, and numbered lines mark the days What's New lists items. About's traffic chart can also show a running total since counting began, and About lists the days the public data changed.",
      "areas": [
        "about",
        "charts",
        "council",
        "people",
        "site",
        "sources",
        "transparency"
      ],
      "links": [
        "/"
      ],
      "changes": [
        {
          "id": "2026-10-03-about-data-change-log",
          "date": "2026-10-03",
          "type": "feature",
          "title": "About lists the days the public data changed",
          "summary": "Under How changes are recorded, About now lists each day the site's public data files changed, newest first, with how many updates that day and which files, dates only. It is built from the same dataset history that traces every published figure.",
          "areas": [
            "about",
            "transparency"
          ],
          "links": [
            "/about#changes"
          ]
        },
        {
          "id": "2026-10-03-about-hourly-markers-ranges",
          "date": "2026-10-03",
          "type": "feature",
          "title": "About's hourly reads chart gets the daily chart's markers and running total, and can reach further back",
          "summary": "The reads-per-hour chart on About now carries the same numbered What's New markers as the daily chart, at the first hour of each day with items, and a Per hour or Running total switch. Its range choices grow with what the counter keeps: 7, 30 and 90-day views appear as those hours are counted, with dates on the axis.",
          "areas": [
            "about",
            "transparency"
          ],
          "links": [
            "/about#site-traffic"
          ]
        },
        {
          "id": "2026-10-03-about-raw-hits",
          "date": "2026-10-03",
          "type": "feature",
          "title": "Site traffic adds raw hits per day from the server logs",
          "summary": "The reads-per-day chart on About can show raw hits beside reads: every page the server sent to anyone, people, search crawlers, link previews and AI fetchers alike, before any filter, tallied once a day from the access logs. A Count switch shows both, reads only or raw hits only, and the daily table gains a raw-hits column. It answers how much of the traffic the reads counter leaves out.",
          "areas": [
            "about",
            "charts"
          ],
          "links": [
            "/about#site-traffic"
          ]
        },
        {
          "id": "2026-10-03-about-reads-running-total",
          "date": "2026-10-03",
          "type": "feature",
          "title": "Site traffic can show a running total since counting began",
          "summary": "The reads-per-day chart on About gains an As switch: Per day, or Running total since counting began on September 21, 2026, for reads and raw hits alike. The total keeps adding the earlier days even when the chart shows only the last 7 or 30, and a day not yet tallied stays blank rather than guessed.",
          "areas": [
            "about",
            "charts"
          ],
          "links": [
            "/about#site-traffic"
          ]
        },
        {
          "id": "2026-10-03-about-reads-whats-new-marks",
          "date": "2026-10-03",
          "type": "feature",
          "title": "Reads per day marks the days What's New lists items",
          "summary": "On About, the reads-per-day chart draws a numbered line on each day with items on What's New, keyed below the chart with the day's item count and its first item, so a day's reads can be read beside what the site published that day. Context only, not a claim that one caused the other.",
          "areas": [
            "about",
            "charts"
          ],
          "links": [
            "/about#site-traffic",
            "/whats-new"
          ]
        },
        {
          "id": "2026-10-03-dark-style-amoled",
          "date": "2026-10-03",
          "type": "feature",
          "title": "Dark mode has an AMOLED black option",
          "summary": "Settings has a new Dark style choice, shown while the site is dark: AMOLED black sets every page on pure black, for phones and monitors with OLED screens. Standard dark stays the default. The Map base and Value colors choices in Settings now sit under their labels on phones instead of squeezing them.",
          "areas": [
            "site"
          ],
          "links": []
        },
        {
          "id": "2026-10-03-global-year-setting-more-pages",
          "date": "2026-10-03",
          "type": "feature",
          "title": "The Year setting reaches the roster, remarks and meetings list",
          "summary": "The Year choice in Settings now also opens the Council roster on that year (and moves it as soon as the setting changes), filters a person's remarks to that year when they spoke in it, and opens that year in the full meetings list. Votes and Council profiles already followed it; charts keep their own range setting.",
          "areas": [
            "council",
            "people",
            "site"
          ],
          "links": [
            "/council",
            "/council/meetings"
          ]
        },
        {
          "id": "2026-10-03-responsive-pass-touch-and-sheet",
          "date": "2026-10-03",
          "type": "feature",
          "title": "Pages fit phones, tablets, split screens and wide monitors better",
          "summary": "On a phone each page now uses the whole screen width, so text and tables get more room. On a phone or tablet, every toggle and list link is at least a finger's width to tap. A phone on its side or a half-screen window shows the page's own content sooner, and a wide monitor shows more of each chart and table while keeping paragraphs to a comfortable line length. The ALPR tracker no longer scrolls sideways in a half-screen window. No figure, label or source changed.",
          "areas": [
            "site"
          ],
          "links": []
        },
        {
          "id": "2026-10-03-sourcebook-downloads",
          "date": "2026-10-03",
          "type": "feature",
          "title": "Download the data from one list on the Sourcebook",
          "summary": "The Sourcebook gains a Download the data section: one list of the data files the site's pages read, grouped into Council, ALPR, police and records, and site files, each beside the page that shows it. Every row in those files links to the record it came from. It answers where to get the data without opening each page's Cite and download button.",
          "areas": [
            "sources"
          ],
          "links": [
            "/sources#downloads"
          ]
        },
        {
          "id": "2026-10-03-sourcebook-how-data-is-used",
          "date": "2026-10-03",
          "type": "feature",
          "title": "The Sourcebook says how each source is used",
          "summary": "Every source on the Sourcebook now lists the pages that use it and, under How this data is used, what the site takes from it and what it leaves out. A short section up top explains how the site cites: each figure links to its record, the publisher's own copy comes first, outside reporting and vendor figures are credited as theirs, and map data carries its OpenStreetMap license. The list adds the sources the site already relied on but did not list: the archived Council minutes before 2020, the police contract on file with the state labor board, court opinion archives, OpenStreetMap, Restoring Democracy's Promise and the news outlets stories link to. The Census link now goes to the Altoona tables the site actually uses. It answers where a number came from and what was held back.",
          "areas": [
            "sources"
          ],
          "links": [
            "/sources"
          ]
        },
        {
          "id": "2026-10-03-stat-tile-corrected-marker",
          "date": "2026-10-03",
          "type": "feature",
          "title": "A figure that a correction changed now says so on its tile",
          "summary": "When a correction changes a number shown in a stat tile, that tile carries a small \"Corrected\" marker with the date for 30 days. The marker opens the correction on What's New, which says what changed and why. It appears only on the tile or row of tiles a correction names, never on a whole page, and it uses words and an edit mark, not color alone.",
          "areas": [
            "site"
          ],
          "links": [
            "/whats-new"
          ]
        }
      ]
    },
    {
      "id": "2026-10-03-roundup-plate-readers-in-court",
      "date": "2026-10-03",
      "type": "roundup",
      "title": "New page: plate readers in court, from 1928 to this week",
      "summary": "A sortable list of court rulings on whether police use of license plate readers is a Fourth Amendment search, with the Supreme Court location-tracking cases they rest on back to 1928, each checked against the opinion itself and marked when later overruled. A timeline shows every listed ruling at its date, and pointing at a year lists the rulings decided then. A section explains the third-party doctrine, with the site's view labeled analysis and opinion.",
      "areas": [
        "alpr"
      ],
      "links": [
        "/alpr/court-rulings"
      ],
      "changes": [
        {
          "id": "2026-10-03-alpr-court-rulings-page",
          "date": "2026-10-03",
          "type": "feature",
          "title": "New page: plate readers in court",
          "summary": "A sortable list of court rulings on whether police use of license plate readers is a Fourth Amendment search, with the Supreme Court location-tracking cases they rest on. It answers a reader's question of where the law stands and which rulings bind Iowa: each row gives the case number, court, date, the holding in one sentence, where it binds, whether it is on appeal, and the opinion we read to check it. Filter by outcome or court, sort any column, and download the rows.",
          "areas": [
            "alpr"
          ],
          "links": [
            "/alpr/court-rulings"
          ]
        },
        {
          "id": "2026-10-03-court-rulings-by-decade",
          "date": "2026-10-03",
          "type": "feature",
          "title": "Plate readers in court: the rulings on a timeline",
          "summary": "A timeline under the rulings list puts each listed ruling at the date it was decided, in a row for what it decided. Pointing at or tapping any year lists the rulings decided that year with their holdings, so a reader can follow how the courts' answers changed from the 1920s to now.",
          "areas": [
            "alpr"
          ],
          "links": [
            "/alpr/court-rulings"
          ]
        },
        {
          "id": "2026-10-03-court-rulings-five-more",
          "date": "2026-10-03",
          "type": "data-update",
          "title": "Plate readers in court: five more rulings, including Iowa's",
          "summary": "Five more rulings, each read in full: the Iowa Supreme Court's 2021 decision that its own constitution requires a warrant to take and search trash left for collection; the Fourth Circuit's 2021 ruling that a city-wide aerial surveillance program was a search; its 2016 cell-site ruling that the Supreme Court later contradicted; the Fifth Circuit's 2024 geofence ruling; and the Supreme Court's 1986 aerial-observation case.",
          "areas": [
            "alpr"
          ],
          "links": [
            "/alpr/court-rulings"
          ]
        },
        {
          "id": "2026-10-03-court-rulings-history",
          "date": "2026-10-03",
          "type": "data-update",
          "title": "Plate readers in court: the Supreme Court cases back to 1928",
          "summary": "Seven earlier Supreme Court decisions that plate-reader cases build on are added, each read in full: the 1928 wiretap ruling later overruled, the 1967 phone-booth ruling that set the reasonable-expectation-of-privacy test, the 1976 and 1979 third-party records rulings, the 1984 beeper-in-a-home ruling, the 2001 thermal-imaging ruling and the 2014 cell-phone ruling. Each row's note says when a later decision overruled or narrowed it.",
          "areas": [
            "alpr"
          ],
          "links": [
            "/alpr/court-rulings"
          ]
        },
        {
          "id": "2026-10-03-court-rulings-third-party-doctrine",
          "date": "2026-10-03",
          "type": "feature",
          "title": "Plate readers in court: records someone else holds",
          "summary": "A new section explains the third-party doctrine from the Supreme Court's own opinions: bank records and dialed numbers held by a business needed no warrant, until the Court declined to extend that rule to cell-site location records in 2018. It sets Altoona's plate-reader policy beside those rulings, then gives the site's view, labeled analysis and opinion, that a vendor holding a month of plate reads does not make searching them anything other than a search.",
          "areas": [
            "alpr"
          ],
          "links": [
            "/alpr/court-rulings#third-party"
          ]
        }
      ]
    },
    {
      "id": "2026-10-03-roundup-oklahoma-flock-ruling",
      "date": "2026-10-03",
      "type": "roundup",
      "title": "An Oklahoma federal ruling on a warrantless Flock search, a Virginia misuse charge, story pages and record images",
      "summary": "A federal court in Oklahoma ruled on a warrantless Flock search; the site covers it on News, Police and Why, under a breaking band on the homepage. Every story now has its own page, and pages from the police records appear where the site cites them. Two outside reports on a Chesterfield County, Virginia police employee charged with misusing Flock sit on Records requests beside what Altoona's own rules say on audits, retention and warrants. A WeAreIowa TV report dated September 24, on police entering a suspect vehicle's plate into Flock before a burglary arrest, is on News and in the outside reports, newest first, with no one charged and no juvenile named.",
      "areas": [
        "alpr",
        "design-system",
        "homepage",
        "news",
        "police",
        "records",
        "records-requests"
      ],
      "links": [
        "/news",
        "/police#oklahoma-flock-ruling"
      ],
      "changes": [
        {
          "id": "2026-10-03-external-report-chesterfield-flock-misuse",
          "date": "2026-10-03",
          "type": "data-update",
          "title": "Outside reports: a Virginia police employee charged with misusing Flock, beside Altoona's own rules",
          "summary": "Two external report cards on Records requests cover a Chesterfield County, Virginia police employee charged with misusing the Flock plate-reader system, as reported by WRIC and VPM News. Beside each point is what Altoona's own posted rules say: Virginia's law caps plate data at 21 days and requires an internal audit at least every 30 days, while Altoona's Flock portal posts 30 days of retention and the City says its systems are audited quarterly. This site has not seen an Altoona audit. The section is renamed \"What outside outlets report\". Reader question: could what happened in Chesterfield be caught here, and what do Altoona's safeguards say?",
          "areas": [
            "alpr",
            "records-requests"
          ],
          "links": [
            "/records-requests#external-reports-heading"
          ]
        },
        {
          "id": "2026-10-03-external-report-weareiowa-burglary-arrests",
          "date": "2026-10-03",
          "type": "data-update",
          "title": "Outside report: TV story on plate readers in a burglary arrest",
          "summary": "The outside-reports section adds WeAreIowa's report dated September 24 video story, credited to the outlet, which reports, citing police, that a suspect vehicle's plate was entered into Flock before two men were arrested in connection with burglaries. Each fact is attributed to the outlet, and this site notes that it holds no record of the case. The people charged and the juveniles in the story are not named. Nothing is added to any count or chart.",
          "areas": [
            "alpr"
          ],
          "links": [
            "/records-requests#external-reports-heading",
            "/alpr/external-reports.json"
          ]
        },
        {
          "id": "2026-10-03-homepage-breaking-band",
          "date": "2026-10-03",
          "type": "feature",
          "title": "Homepage: breaking band under the masthead",
          "summary": "The top of the homepage now shows the newest featured story in a Breaking band for three days from its own date, then the band goes away on its own.",
          "areas": [
            "design-system",
            "news",
            "homepage"
          ],
          "links": []
        },
        {
          "id": "2026-10-03-news-weareiowa-burglary-arrests",
          "date": "2026-10-03",
          "type": "data-update",
          "title": "News: TV report on plate readers in a burglary arrest",
          "summary": "The news page adds WeAreIowa's report dated September 24, credited to the outlet, that Altoona police entered a suspect vehicle's plate into Flock before two men were arrested in connection with burglaries. It is filed as external reporting with a link to the outlet's piece. The people charged and the juveniles in the story are not named.",
          "areas": [
            "news",
            "alpr"
          ],
          "links": [
            "/news"
          ]
        },
        {
          "id": "2026-10-03-oklahoma-flock-ruling",
          "date": "2026-10-03",
          "type": "data-update",
          "title": "News, Police and Why: an Oklahoma federal ruling on a warrantless Flock search",
          "summary": "A new external report leads the newsroom: on October 1, 2026, a federal district judge in Oklahoma held that a deputy's warrantless plate-reader search for a driver's past locations, Flock among the systems, was a Fourth Amendment search without probable cause, one of two grounds for suppressing the evidence (Case No. 4:26-cr-00189-SEH, ECF No. 62). The police page carries it beside the Fifth Circuit ruling the City cites, quoting the court's Opinion and Order with page numbers and showing the bodycam frames of the deputy's plate-reader query that the court reproduced, and Why this site exists cites it where it makes the warrant point. It is a Tenth Circuit trial-court ruling and is not binding in Iowa, which is in the Eighth Circuit.",
          "areas": [
            "alpr",
            "news"
          ],
          "links": [
            "/news",
            "/police#oklahoma-flock-ruling",
            "/why#legal-not-right"
          ]
        },
        {
          "id": "2026-10-03-record-images",
          "date": "2026-10-03",
          "type": "feature",
          "title": "Pages from the police records, shown where the site cites them",
          "summary": "Three passages from records the site already posts now appear as images beside the claims they support: the police department's first Flock update to the Mayor and Council (June 3, 2022) and its plan for 52 cameras (February 2024 white paper) on the records-requests page, and the white paper's own usage tally on the police page. Each image opens the full page of the PDF and carries its source and a Cite button. Reader question: what did the department actually write?",
          "areas": [
            "alpr",
            "police",
            "records"
          ],
          "links": [
            "/records-requests#records-history",
            "/records-requests#camera-orders",
            "/police"
          ]
        },
        {
          "id": "2026-10-03-story-pages",
          "date": "2026-10-03",
          "type": "feature",
          "title": "News: every story has its own page",
          "summary": "Each story on the News page, and the newsroom headlines on the homepage, now open the story's own page: its label, date and summary, every source with where in it to look, the people it names, and any corrections. A story can also show source images and set officials' own words beside what the source says, and it can carry the site's view of why it matters, kept apart under an Analysis / opinion label. The first is the Oklahoma federal ruling on a warrantless Flock search, which quotes each place the City and the police department point to the courts for the cameras beside what the October 1 order says.",
          "areas": [
            "news",
            "homepage"
          ],
          "links": [
            "/news"
          ]
        }
      ]
    },
    {
      "id": "2026-10-03-roundup-new-pages-4-0",
      "date": "2026-10-03",
      "type": "roundup",
      "title": "Council meetings get a page each and a handout; the ALPR tracker adds its approval steps, statements beside records, officials on the record, and portal wording over time",
      "summary": "Every Council meeting now has its own page with attendance, votes, remarks, public comment and any missing records, and the Council meetings page prints a one-page handout for the next meeting with its agenda, how to be heard, each vendor's own plate-reader figures and the last meetings whose records name the cameras. The ALPR tracker gains a Statements and records section that sets what the City's ALPR page and the Flock and Axon portals say about retention, searches, audits and sharing beside the Police Department's Policy 424 and retention schedule, quoted and dated. A second new section, Officials on the record, lists what the Mayor, the police chief and a lieutenant have said about the plate readers, each line with its source. A third, Portal wording over time, quotes the Flock and Axon portals' policy statements from saved copies and dates any change. The tracker now opens with the program's approval steps as the City describes them, each beside what the Council record shows. The tracker also opens with a short explainer for first-time readers. Two new data files go with the records page: counts from the Flock sharing-network export the Police Department released (a configured share is not proof of a search), and the plate-reader outcomes the department's own memos and white papers report, each row quoting its page. Beside the nearby-jurisdictions table, a new section lists how long Altoona and each nearby agency keep plate reads and the uses each lists as prohibited, in its own words. A Selling the data row sets the City's line that its contracts prohibit selling the data beside the 2022 Flock agreement's terms, which never mention selling it and license Flock to use anonymized aggregated data, including for marketing.",
      "areas": [
        "alpr",
        "council",
        "people",
        "police",
        "records",
        "records-requests",
        "votes"
      ],
      "links": [
        "/council/meetings",
        "/alpr/tracker#statements",
        "/alpr/tracker#on-record",
        "/alpr/tracker#portal-wording",
        "/alpr/tracker#approvals",
        "/alpr/sharing-network-counts.json",
        "/alpr/outcomes-in-records.json",
        "/alpr/tracker#nearby-policies"
      ],
      "changes": [
        {
          "id": "2026-10-03-alpr-approvals-timeline",
          "date": "2026-10-03",
          "type": "feature",
          "title": "ALPR tracker opens with how the program was approved",
          "summary": "The top of the ALPR tracker now shows the plate-reader program's approval steps in order, as the City's own ALPR page describes them (the 2022 pilot, ongoing budget funding, the 2024 Flock expansion, and the July 2025 Axon agreement), each beside what the Council record shows. Only the Axon agreement matches a Council vote record, and it was approved on the consent agenda with one roll call for the whole agenda. On a phone the steps fold behind one line. It answers a reader question: when, and how, did the Council approve the cameras?",
          "areas": [
            "alpr",
            "council"
          ],
          "links": [
            "/alpr/tracker#approvals"
          ]
        },
        {
          "id": "2026-10-03-alpr-nearby-policies-section",
          "date": "2026-10-03",
          "type": "feature",
          "title": "The ALPR tracker shows each nearby agency's retention window and prohibited uses, as posted",
          "summary": "A new section beside the nearby-jurisdictions table lists how long Altoona and each nearby agency with a Flock transparency portal keep plate reads and the uses each one lists as prohibited, in the agency's own words, with a link to its portal and the date the portal was last updated. Altoona comes first. The wording is shown as posted, with no scoring or comparison; a listed prohibition is an agency's stated policy, not a record of how its system is used.",
          "areas": [
            "alpr",
            "police"
          ],
          "links": [
            "/alpr/tracker#nearby-policies",
            "/alpr/nearby-portal-policies.json"
          ]
        },
        {
          "id": "2026-10-03-alpr-officials-on-record",
          "date": "2026-10-03",
          "type": "feature",
          "title": "ALPR tracker: officials on the record about the plate readers",
          "summary": "The ALPR tracker has a new Officials on the record section: what the Mayor, the police chief and the lieutenant who reported on the program have said about Altoona's plate readers, oldest first, each line with its source. The lines come from records the site already publishes: Council minutes, the department's memos and white paper to the Mayor and Council, its replies to a records request (dated by season), and an outside outlet's report, marked External report. Chips show one official at a time, and each name links to that official's profile. On a phone the list folds behind one line. It answers a reader question: what have the officials responsible for the program said about it, and where?",
          "areas": [
            "alpr",
            "police",
            "people"
          ],
          "links": [
            "/alpr/tracker#on-record"
          ]
        },
        {
          "id": "2026-10-03-alpr-outcomes-in-records",
          "date": "2026-10-03",
          "type": "data-update",
          "title": "Plate-reader outcomes the police records report, as a dataset",
          "summary": "A new dataset holds what the Police Department told the Mayor and Council its plate readers produced, from the records-request production: the running totals in the three 2022 update memos and the December 2022 and February 2024 white papers (leads, suspects, arrests, charges), the 30-day hit counts, and all 24 titled case examples with their crime category and how each record says the camera was used (an NCIC alert, a custom hot list alert, a search of stored reads, or not stated). Two of the 2024 examples are blacked out in the released copy. Each row quotes its page. These are the department's own claims; nothing here says what the cameras caused.",
          "areas": [
            "alpr",
            "records"
          ],
          "links": [
            "/alpr/outcomes-in-records.json",
            "/records-requests"
          ]
        },
        {
          "id": "2026-10-03-alpr-promises-vs-records",
          "date": "2026-10-03",
          "type": "feature",
          "title": "ALPR tracker: what the City and the plate-reader portals say, beside the department's own records",
          "summary": "The ALPR tracker has a new Statements and records section. It sets what the City's ALPR page and the Police Department's Flock and Axon transparency portals tell residents about seven topics (how long plate reads are kept, what a search must record, audits, sharing, prohibited uses, hotlist alerts, and who can get in) beside what Policy 424 and the department's records retention schedule say on the same topic. Every statement is quoted word for word with where it appears and the date it was saved; portal settings and the sharing export's counts are filled from their own data files; each topic lists the parts of the records request still open on it. On a phone the table folds behind one line. The section compares wording only and does not say whether any rule was followed. It answers a reader question: on each topic, what do the department's public statements say, and what do its own written rules say?",
          "areas": [
            "alpr",
            "police"
          ],
          "links": [
            "/alpr/tracker#statements",
            "/records-requests"
          ]
        },
        {
          "id": "2026-10-03-alpr-selling-beside-terms",
          "date": "2026-10-03",
          "type": "feature",
          "title": "Statements and records: the City's no-selling line beside the Flock agreement's data terms",
          "summary": "The ALPR tracker's Statements and records section adds a Selling the data row. The City's ALPR page says Altoona's contracts prohibit its providers from selling the department's data, and the Flock portal says the data is never sold. Beside them are the 2022 Flock agreement's own terms from the released records: no sentence in them mentions selling the agency's data or footage, the agency owns its data, and the agency grants Flock a perpetual license to use and distribute anonymized Aggregated Data, including for marketing. The 2024 order form says it is under that earlier agreement. The row quotes each with its page and draws no conclusion.",
          "areas": [
            "alpr",
            "police"
          ],
          "links": [
            "/alpr/tracker#statements",
            "/records-requests#flock-proposal-and-agreement-2021-2022"
          ]
        },
        {
          "id": "2026-10-03-alpr-sharing-network-counts",
          "date": "2026-10-03",
          "type": "data-update",
          "title": "How far Altoona's Flock sharing network reaches, counted from the released export",
          "summary": "A new data file counts the Flock sharing-network export the Police Department released (June 10, 2026 by its file name). Altoona's network is configured to share with 1,405 organizations; 2,355 list networks shared with Altoona, 887 of them both ways; at least 59 of the 1,405 are in Iowa, the rest carry codes for 41 other states and DC, and 4 are tagged federal. The 2024 white paper named 7 local agencies. A configured share is not proof of a search. The records page now reads its export sentence from this file. The export itself stays unposted.",
          "areas": [
            "alpr",
            "records"
          ],
          "links": [
            "/records-requests",
            "/alpr/sharing-network-counts.json"
          ]
        },
        {
          "id": "2026-10-03-council-meeting-handout",
          "date": "2026-10-03",
          "type": "feature",
          "title": "A one-page handout to bring to the next Council meeting",
          "summary": "The Council meetings page now prints a one-page handout for the next meeting: its date, place and posted agenda, how the public comment item works, each plate-reader vendor's own portal figures side by side (never added together), and the last three meetings whose agendas or minutes name the cameras, every figure with its source line. Meeting pages also print cleanly, without the menus and Cite buttons. It answers \"what can I bring to say my piece at the meeting?\"",
          "areas": [
            "council",
            "alpr"
          ],
          "links": [
            "/council/meetings?handout=next"
          ]
        },
        {
          "id": "2026-10-03-council-meeting-pages",
          "date": "2026-10-03",
          "type": "feature",
          "title": "Every Council meeting gets its own page",
          "summary": "A new Council meetings page lists every known meeting, and each meeting has its own page: who was present and who presided, the City officials listed, every roll-call vote with decisions apart from procedure (agenda, minutes, adjournment), the officials' remarks, public comment with any reply the minutes label, and which records are missing and why. Same-day sessions, such as the April 1, 2024 regular and budget meetings, get separate pages. It answers \"what happened at that meeting?\" in one place instead of four.",
          "areas": [
            "council",
            "votes"
          ],
          "links": [
            "/council/meetings"
          ]
        },
        {
          "id": "2026-10-03-meeting-pages-own-address",
          "date": "2026-10-03",
          "type": "feature",
          "title": "Each Council meeting has its own address",
          "summary": "Every Council meeting page now lives at its own address, such as /council/meetings/2024-04-01, and leads with the one fact from the minutes that stands out: a split or failed vote, an absence streak, a first appearance on the roll call, or how many decisions passed without a single no vote. Each page has its own title, description and a short summary (who presided, who was present, each decision's outcome) that reads without scripts. Old meeting links still work and move to the new address.",
          "areas": [
            "council",
            "votes"
          ],
          "links": [
            "/council/meetings"
          ]
        },
        {
          "id": "2026-10-03-person-pages-own-address",
          "date": "2026-10-03",
          "type": "feature",
          "title": "The Mayor and each Council member have their own profile address",
          "summary": "Each current and former Mayor and Council member's profile now also lives at its own address, such as /people/scott-duer, with its own title, description and share card, and leads with the one fact from the minutes where that member stands out: the most no votes, never a no vote, how often they voted no, or the meetings a mayor presided at. The profile below it is the same one /people shows.",
          "areas": [
            "people",
            "council"
          ],
          "links": [
            "/people"
          ]
        },
        {
          "id": "2026-10-03-pilot-city-page-timeline",
          "date": "2026-10-03",
          "type": "data-update",
          "title": "Camera orders on the record: the City page's pilot count sits beside the department's 18",
          "summary": "The camera-orders timeline on Records requests now shows the City's ALPR page count for the 2022 pilot (10 cameras) next to the department's own pilot records: the December 2022 white paper's 18 cameras and its plan to scale down to about 10 after the free 45-day pilot, then the 18-camera order form.",
          "areas": [
            "records-requests",
            "alpr"
          ],
          "links": [
            "/records-requests"
          ]
        },
        {
          "id": "2026-10-03-portal-wording-log",
          "date": "2026-10-03",
          "type": "feature",
          "title": "ALPR tracker: what the plate-reader portals say about their policies, and when the wording changes",
          "summary": "A new section on the ALPR tracker, Portal wording over time, quotes what the Flock and Axon transparency portals say under each policy heading (what is and is not detected, acceptable use, prohibited uses, access, hotlist policy) from this site's saved copies, and lists every change in wording with the dates of the copies before and after. Axon's page is saved daily; Flock's is saved when a reading is entered by hand. No wording has changed in the copies saved so far. It answers a reader question: have the portals quietly changed what they promise?",
          "areas": [
            "alpr"
          ],
          "links": [
            "/alpr/tracker#portal-wording"
          ]
        },
        {
          "id": "2026-10-03-tracker-five-minutes",
          "date": "2026-10-03",
          "type": "feature",
          "title": "The ALPR tracker opens with a five-minute explainer",
          "summary": "A folded \"New here?\" card at the top of the ALPR tracker explains, in plain words and without new figures, what a plate reader is, which two vendors Altoona police use, how the City describes the program's approval, what the portal figures count, what the records don't show, and where the courts and the site's own view come in, linking to the section that holds each record. It answers where a first-time reader should start.",
          "areas": [
            "alpr"
          ],
          "links": [
            "/alpr/tracker#five-minutes"
          ]
        }
      ]
    },
    {
      "id": "2026-10-03-roundup-mapped-cameras",
      "date": "2026-10-03",
      "type": "roundup",
      "title": "Community-mapped cameras: a camera check, a coverage map, city counts by distance, and a map choice",
      "summary": "A new camera check at /alpr/camera-check shows how far the nearest community-mapped plate camera is from your street or a spot you tap, how many are nearby, and how that compares across Altoona, with an Area setting for nearby cities; shares name no street or spot. A coverage map at /alpr/coverage shades how much of Altoona sits farther than a chosen distance from any mapped camera, with what-if cameras a reader can add or remove; positions are sampled to a grid. The tracker's nearby-jurisdictions table now counts, for each city, the mapped cameras within 1, 3 and 10 miles of that city's own limit, its own included, and every map lets readers choose no map, street lines, or OpenStreetMap, and maps, tables and charts that shade a value use green to red or a neutral gray scale instead of gold (the Value colors row in Settings). A camera check result now leads with three numbers, its charts mark where the checked spot falls, and a box on the home page opens it with your street typed in, kept in your browser. The cameras are community-mapped and unverified.",
      "areas": [
        "alpr",
        "camera-check",
        "charts",
        "home",
        "local",
        "maps",
        "site"
      ],
      "links": [
        "/alpr/camera-check",
        "/alpr/coverage"
      ],
      "changes": [
        {
          "id": "2026-10-03-alpr-coverage-what-if",
          "date": "2026-10-03",
          "type": "feature",
          "title": "How far to the nearest camera? A what-if map",
          "summary": "A new tool answers a reader question: how much of Altoona sits farther than a chosen distance from any camera on the community map. Slide the distance and the map, the share of the city and a chart update in your browser. More settings widen the area to the land around Altoona or a nearby city, change units and shading, and let you add or leave out what-if cameras. It works only from the community map's unverified, grid-sampled positions, counts no cameras, and is not a safety or privacy score.",
          "areas": [
            "alpr"
          ],
          "links": [
            "/alpr/coverage"
          ]
        },
        {
          "id": "2026-10-03-bench-charts-lead-facts",
          "date": "2026-10-03",
          "type": "feature",
          "title": "Camera check and civic charts lead with their key number",
          "summary": "Each chart under the camera check's More detail, and the civic lookup's street-block chart, now opens with the number it shows: for example, the share of Altoona homes and businesses with a mapped camera within the ring you pick, or how far apart two precincts are on blocks with no mapped camera within a quarter mile. The numbers are read from the same published tables as the charts and change with the ring, band and area pickers.",
          "areas": [
            "alpr",
            "local"
          ],
          "links": [
            "/alpr/camera-check#more",
            "/local/civic#precinct-cameras"
          ]
        },
        {
          "id": "2026-10-03-camera-check-answer-first",
          "date": "2026-10-03",
          "type": "feature",
          "title": "Camera check leads with three numbers, and the home page has a street box",
          "summary": "A camera check result now opens with three numbers: the distance to the nearest community-mapped camera, how many are within a mile, and the share of Altoona homes and businesses with fewer nearby (a street block shows its bands). The charts under More detail mark the bars the checked spot or block falls in. A new box on the home page opens the camera check with your street already typed; what you type stays in your browser and never enters a link or a request.",
          "areas": [
            "alpr",
            "home"
          ],
          "links": [
            "/alpr/camera-check",
            "/"
          ]
        },
        {
          "id": "2026-10-03-camera-check-finer-landuse-nearby",
          "date": "2026-10-03",
          "type": "feature",
          "title": "Camera check adds 50-foot distances and nearby cities",
          "summary": "Under More detail, the camera check now shows the closest 1,000 feet in 50-foot steps (a third of Altoona's homes and businesses are within 1,000 feet of a mapped camera), and, with the Area setting on nearby cities, compares the share of places in Altoona and 11 nearby cities with a mapped camera within the chosen ring. The civic lookup's street-block chart adds finer distance steps down to 100 feet. Mapped positions are accurate to roughly 16 to 50 feet, and the pages say so.",
          "areas": [
            "alpr",
            "local"
          ],
          "links": [
            "/alpr/camera-check#more",
            "/local/civic#precinct-cameras"
          ]
        },
        {
          "id": "2026-10-03-camera-check-ring-chart",
          "date": "2026-10-03",
          "type": "feature",
          "title": "Camera check charts follow your ring and show where your spot falls",
          "summary": "Under More detail, the chart of mapped cameras near Altoona homes and businesses now follows a ring picker (a quarter mile to three miles) instead of always showing one mile, a new chart adds up the share of homes and businesses within each distance of a mapped camera, and after a map tap a line under each chart says which bar your spot falls in. Distances follow the miles or feet setting. It answers the question \"how does my spot compare across rings, not just one?\" from the same citywide table, with nothing new published.",
          "areas": [
            "alpr",
            "camera-check"
          ],
          "links": [
            "/alpr/camera-check#more"
          ]
        },
        {
          "id": "2026-10-03-camera-check-tool",
          "date": "2026-10-03",
          "type": "feature",
          "title": "Camera check: how close are the mapped cameras to your street?",
          "summary": "A new tool at /alpr/camera-check. Type a street or tap the map to see how far the nearest community-mapped plate camera is, how many are within a half mile and a mile, and how that compares with the rest of Altoona. A street gives its block's bands (blocks of at least five addresses, never one home), a tap is measured in your browser against the same mapped positions the tracker shows, and an Area setting checks nearby cities too. More detail opens every ring from a quarter mile to three miles and how Altoona compares: a tap is placed against a citywide table of Altoona's homes and businesses, summarized into groups of at least five with no addresses or rows. Shares and images name no street or spot. The cameras are community-mapped and unverified, and a band is not a safety, privacy or risk score. Answers a reader's question: how many of these cameras are near me?",
          "areas": [
            "alpr"
          ],
          "links": [
            "/alpr/camera-check"
          ]
        },
        {
          "id": "2026-10-03-civic-block-bands",
          "date": "2026-10-03",
          "type": "feature",
          "title": "Street blocks by mapped-camera band, for each precinct and police district",
          "summary": "The civic lookup's mapped-cameras section adds a chart of Altoona's published street blocks by distance to the nearest community-mapped camera, or by cameras within 528 feet or a quarter mile, for each election precinct or police district. Each cell is that band's share of the area's blocks, shaded by the Value colors setting. It answers \"which parts of town sit closest to mapped cameras?\" by counting the published address scorecard's blocks in each area.",
          "areas": [
            "local",
            "alpr"
          ],
          "links": [
            "/local/civic#precinct-cameras"
          ]
        },
        {
          "id": "2026-10-03-coverage-by-city",
          "date": "2026-10-03",
          "type": "feature",
          "title": "Coverage map: the same share for every nearby city",
          "summary": "Under the coverage map, one bar per city on the community map shows how much of that city's area is farther than the slider's distance from a mapped camera, Altoona in gold and every share printed. It follows the slider and the Cameras that count setting. It answers how Altoona compares with the cities around it; mapping completeness differs from city to city, so it is not a ranking of cameras.",
          "areas": [
            "alpr",
            "charts"
          ],
          "links": [
            "/alpr/coverage#by-distance"
          ]
        },
        {
          "id": "2026-10-03-coverage-heat-map",
          "date": "2026-10-03",
          "type": "feature",
          "title": "Coverage map: a smooth distance slider and a heat map",
          "summary": "The coverage map's distance slider now moves smoothly anywhere from 250 feet to one mile instead of jumping between six presets, and the share, typical and farthest distances update as it moves. The map is now a heat map by default: red near a community-mapped camera and inside the distance picked, shading to green farther from every one, with a key that prints the distances along the scale. A new Cameras that count setting limits the cameras to those inside Altoona or within 1 or 3 miles of its city limit, to show how much cameras in the nearby cities change the map. Two shades and five steps stay under More settings, and the Value colors setting still switches it to the gray scale. It answers how close any part of Altoona is to a mapped camera at a glance; it says nothing about cameras nobody has mapped.",
          "areas": [
            "alpr",
            "maps"
          ],
          "links": [
            "/alpr/coverage"
          ]
        },
        {
          "id": "2026-10-03-coverage-merged-into-camera-check",
          "date": "2026-10-03",
          "type": "feature",
          "title": "The coverage map is now part of the camera check",
          "summary": "One camera tool instead of two. The camera check keeps its street box and three numbers on top; the heat map with its free distance slider, the area and cameras-that-count settings and the table of tracked cities now sit below it on the same page. The old coverage address forwards to the heat map, and shared links keep their distance and area settings.",
          "areas": [
            "alpr",
            "maps"
          ],
          "links": [
            "/alpr/camera-check"
          ]
        },
        {
          "id": "2026-10-03-coverage-wide-views",
          "date": "2026-10-03",
          "type": "feature",
          "title": "Coverage map: a 10-mile view, a metro view, and a lead line for the city table",
          "summary": "The coverage map's Area setting adds Altoona and 10 miles around it, and the metro, all twelve tracked cities together; Cameras that count adds a 10-mile choice. The community camera map was fetched for a fixed box that ends a few miles east of Altoona, so land past it is left out of an area and marked with a dashed line rather than read as having no camera. The city table pins the picked ring or metro on top and opens with one line comparing Altoona's share within the distance to the median of the other tracked cities.",
          "areas": [
            "alpr",
            "maps"
          ],
          "links": [
            "/alpr/coverage"
          ]
        },
        {
          "id": "2026-10-03-local-property-bands",
          "date": "2026-10-03",
          "type": "feature",
          "title": "Sale prices by distance to a mapped camera on /local",
          "summary": "The property section of /local now charts Altoona's median residential sale price each year in four bands of distance from the sold home to the nearest community-mapped camera, from under 528 feet to half a mile or more. A band-year with fewer than 20 sales is a gap. The chart describes what sold where: the bands differ in the age, size and type of their homes and camera install dates are unknown, so it does not show that cameras changed any price.",
          "areas": [
            "local",
            "alpr"
          ],
          "links": [
            "/local#property-values"
          ]
        },
        {
          "id": "2026-10-03-map-base-every-map",
          "date": "2026-10-03",
          "type": "feature",
          "title": "Every map: choose no map, street lines, or OpenStreetMap",
          "summary": "The precinct map on Find your civic districts and the camera tracker's nearby map now offer the same three map bases: None (outlines only), Street lines (major roads drawn on this site), or OpenStreetMap (street-map tiles from OpenStreetMap, an outside service that sees the map area being viewed). Street lines are the default, so the civic map now shows major roads without loading anything from outside the site. Settings has a Map base row for a site-wide default; a choice made on one map stays with that map.",
          "areas": [
            "local",
            "alpr"
          ],
          "links": [
            "/local/civic",
            "/alpr/tracker#nearby-jurisdictions"
          ]
        },
        {
          "id": "2026-10-03-map-colors",
          "date": "2026-10-03",
          "type": "feature",
          "title": "Maps that shade a value: green to red or neutral, not gold",
          "summary": "Maps that shade a value (cameras per city on the tracker's nearby map, distance to a camera on the coverage map, and the rings on the camera check) now use green to red or a neutral gray scale instead of shades of gold, so gold marks only Altoona. Settings has a Value colors row for a site-wide default, and each of those maps has its own Colors choice that stays with that map. Color is never the only cue: counts, key labels and ring dashes say the same thing. The camera check's map also gets the same None, Street lines or OpenStreetMap choice as every other map; its old street-map switch had stopped working.",
          "areas": [
            "alpr"
          ],
          "links": [
            "/alpr/tracker#nearby-jurisdictions",
            "/alpr/coverage",
            "/alpr/camera-check"
          ]
        },
        {
          "id": "2026-10-03-nearby-rings-from-each-city",
          "date": "2026-10-03",
          "type": "data-fix",
          "title": "ALPR tracker: each nearby city's distance columns now measure from that city's own limit",
          "summary": "The nearby-jurisdictions table's distance columns used to split every city's mapped cameras by distance from Altoona, in separate bands. Each row is now measured from its own city limit, and the bands add up: how many community-mapped cameras lie outside that city within 1 mile, within 3 miles and within 10 miles of its limit, each including the smaller ring. A ring that reaches past the area mapped here is marked with \u2265, since it may undercount. The counts come from the map's dots, not the table's city totals. It answers a reader question: how many mapped cameras are near this city, whichever city it is?",
          "areas": [
            "alpr"
          ],
          "links": [
            "/alpr/tracker#nearby-jurisdictions"
          ]
        },
        {
          "id": "2026-10-03-nearby-rings-include-own",
          "date": "2026-10-03",
          "type": "data-fix",
          "title": "Nearby cities' distance columns now include each city's own mapped cameras",
          "summary": "On the ALPR tracker's nearby-jurisdictions table, each city's 1-, 3- and 10-mile columns now start from that city's own community-mapped total and add the mapped cameras beyond its limit within that distance, so Altoona reads its 67 plus those nearby. Where only 1 or 2 cameras lie beyond a limit, the cell shows a range. Community-mapped and unverified.",
          "areas": [
            "alpr"
          ],
          "links": [
            "/alpr/tracker#nearby-jurisdictions",
            "/alpr/nearby-limit-rings.json"
          ]
        },
        {
          "id": "2026-10-03-nearby-rings-per-city",
          "date": "2026-10-03",
          "type": "feature",
          "title": "Nearby jurisdictions: each city's mapped cameras by distance from Altoona",
          "summary": "The nearby-jurisdictions table on /alpr/tracker has a new column that splits each city's community-mapped total (unverified) by straight-line distance from Altoona's city limit: 0 to 1, 1 to 3, 3 to 5, 5 to 10 and over 10 miles. A totals row carries the ring counts for every mapped camera outside Altoona within 10 miles, replacing the separate ring table. Counts of 1 or 2 show as fewer than 3. Answers: how close each neighbor's mapped cameras sit to Altoona.",
          "areas": [
            "alpr"
          ],
          "links": [
            "/alpr/tracker#nearby-jurisdictions"
          ]
        },
        {
          "id": "2026-10-03-value-colors-tables-charts",
          "date": "2026-10-03",
          "type": "feature",
          "title": "Tables and charts shade values in gray, or green to red, instead of gold",
          "summary": "Shaded table cells and heatmap charts now use a gray scale by default instead of shades of gold, so gold marks only Altoona and a plain count is never colored as good or bad. The Value colors row in Settings switches every table, chart and map to green to red at once; each shaded cell still prints its number.",
          "areas": [
            "site"
          ],
          "links": [
            "/whats-new"
          ]
        }
      ]
    },
    {
      "id": "2026-10-03-roundup-council-records",
      "date": "2026-10-03",
      "type": "roundup",
      "title": "Council records reach back to 2014, plus turnout from the scanned minutes and a Nay rate that counts decisions",
      "summary": "Coverage and detail drop off before 2020: the City's website no longer posts most minutes from those years, some meetings have no minutes in the City's archive or in web archives, and these records come from archived copies of the minutes rather than from the City's postings at the time. With that said up front on every page that shows them, the votes, attendance, public comment, officials' remarks and meeting list now include 2014 through 2019, each cited to an archived copy of the minutes, and the officials first seen in those years have People profiles. Charts open on all years with the earlier span marked. Pay estimates still start in 2020. Public turnout now covers the eight 2022-23 meetings the City posted as scans, Mayor Pro Tem Boka's labeled reply in the May 1, 2023 public comment is on his record, and each member's Nay rate now counts the decisions they voted on, leaving out approving the agenda, approving minutes and adjourning.",
      "areas": [
        "council",
        "people",
        "votes"
      ],
      "links": [
        "/votes",
        "/council",
        "/people"
      ],
      "changes": [
        {
          "id": "2026-10-03-audience-scanned-minutes",
          "date": "2026-10-03",
          "type": "data-update",
          "title": "Public turnout now covers the eight scanned sets of minutes",
          "summary": "The Audience Present line from the eight 2022-23 meetings the City posted as scans (Nov. 7, Nov. 21, Dec. 5 and Dec. 19, 2022; Feb. 20, March 6, May 1 and May 15, 2023) is now counted in Public turnout, so 161 of 164 minutes documents record the audience. An AI model re-read each line from the scan; each record cites page 1. The Dec. 5, 2022 minutes now show the mayor as signer, with a note that the attest line names the Economic Development Director and no City Clerk signed.",
          "areas": [
            "council",
            "votes"
          ],
          "links": [
            "/council#audience-presence",
            "/votes#audience-participation"
          ]
        },
        {
          "id": "2026-10-03-boka-reply-2023-05-01",
          "date": "2026-10-03",
          "type": "data-update",
          "title": "Mayor Pro Tem Boka's reply in the May 1, 2023 public comment is now on his record",
          "summary": "The scanned May 1, 2023 minutes print a reply labeled as Mayor Pro Tem Jeremy Boka's to an online-chat comment. It is now listed as his reply to public comment, citing page 1, item 4. An AI model read it from the scan.",
          "areas": [
            "votes",
            "people"
          ],
          "links": [
            "/votes#remarks",
            "/people/jeremy-boka"
          ]
        },
        {
          "id": "2026-10-03-council-records-2014",
          "date": "2026-10-03",
          "type": "data-update",
          "title": "Council records now reach back to 2014",
          "summary": "Coverage and detail drop off before 2020: the City's website no longer posts most minutes from those years, some meetings have no minutes in the City's archive or in web archives, and these records come from archived copies of the minutes rather than from the City's postings at the time. With that said up front on every page that shows them, the votes, attendance, public comment, officials' remarks and meeting list now include 2014 through 2019, each cited to an archived copy of the minutes, and the officials first seen in those years have People profiles. Charts open on all years with the earlier span marked. Pay estimates still start in 2020.",
          "areas": [
            "votes",
            "council",
            "people"
          ],
          "links": [
            "/votes",
            "/council",
            "/people",
            "/about#missing-records"
          ]
        },
        {
          "id": "2026-10-03-council-roster-seat-years",
          "date": "2026-10-03",
          "type": "feature",
          "title": "The Council roster gives every member their seat and roll-call years, 2014 members included",
          "summary": "Each row on /council's roster now names the seat and the years of the person's first and last roll call in it, the same way for members from 2014 to 2019 as for members from 2020 on. Dean O'Connor's row reads Council Member 2014\u20132017, then Mayor 2018\u20132026. These are roll-call years, not term dates.",
          "areas": [
            "council"
          ],
          "links": [
            "/council"
          ]
        },
        {
          "id": "2026-10-03-cumulative-tenure-bars",
          "date": "2026-10-03",
          "type": "feature",
          "title": "Council and Mayor names show total time on the roll calls instead of a term countdown",
          "summary": "Next to every Council member's and Mayor's name, the small bar now shows their total time in the record: years and meetings on the Council roll calls across every seat, with the line filled to that share of the whole record since February 2014. It replaces a countdown of an assumed two- or four-year term, which read \"0 days left\" for every former member. Time before the retained minutes is not counted, and term dates stay on each profile. On /votes, the Mayor now has one profile card instead of two.",
          "areas": [
            "council",
            "people",
            "votes"
          ],
          "links": [
            "/council",
            "/people?category=council",
            "/votes"
          ]
        },
        {
          "id": "2026-10-03-mayor-table-year-holder",
          "date": "2026-10-03",
          "type": "data-fix",
          "title": "The /votes Mayor table shows the Mayor in office for the chosen year",
          "summary": "Choosing a year before 2018 in the /votes Mayor table now shows that year's Mayor, J.M. Skip Conkling, taken from the Mayor's seat on that year's roll calls, instead of the current Mayor. Meetings Dean O'Connor presided over from his earlier Council seat appear as one note on his row, not as separate rows under his own name. In the member filter he is listed as the current Mayor with his Council vote years.",
          "areas": [
            "votes"
          ],
          "links": [
            "/votes?year=2017#mayor-table"
          ]
        },
        {
          "id": "2026-10-03-member-record-cards",
          "date": "2026-10-03",
          "type": "feature",
          "title": "Every Mayor and Council profile opens with a printable record card",
          "summary": "Each Mayor and Council member's /people profile now starts with a record card: their seats and roll-call years, time and meetings on the roll calls, presence, times presided and minutes signed, named roll-call positions with the Aye share and the Nay rate of decisions, and remarks in the minutes, with the source line underneath. \"Print this card\" prints it on its own, and a link opens the profile straight to it. Every figure comes from the same shared calculations as the rest of the profile.",
          "areas": [
            "people"
          ],
          "links": [
            "/people?person=dean-oconnor&card=1#record-card"
          ]
        },
        {
          "id": "2026-10-03-people-pre-2020-seats",
          "date": "2026-10-03",
          "type": "feature",
          "title": "Profiles list each 2014\u20132019 seat with its roll-call presence and the meetings that have no minutes",
          "summary": "Every Council and Mayor profile with service on the 2014\u20132019 roll calls now lists each seat from those years: its first and last roll call, the roll calls the person was present for and marked absent on, and how many known meetings in that span have no minutes on file, with links to the first and last minutes. The record card adds the no-minutes count. Members seen only before 2020 show \"Roll calls:\" with the months of their first and last roll call beside their name, since no term dates are on file. Before 2020, presence counts only meetings with minutes in the archive.",
          "areas": [
            "people",
            "votes"
          ],
          "links": [
            "/people?person=mike-harmeyer#backfill-seats"
          ]
        },
        {
          "id": "2026-10-03-people-roster-charts-year-range",
          "date": "2026-10-03",
          "type": "feature",
          "title": "The /people roster charts follow the year range in Settings",
          "summary": "\"Who was in the room\" and \"Time in the record\" on /people now follow the year range in Settings \u203a Charts, like the remarks chart beside them and the charts on other pages. Choose Since 2020, Last 10 years or Last 5 years and both count only the roll calls and \"City Officials Present\" listings in those years, with a line naming the years shown. All years shows the whole record.",
          "areas": [
            "people"
          ],
          "links": [
            "/people#overview"
          ]
        },
        {
          "id": "2026-10-03-people-table-seat-rows",
          "date": "2026-10-03",
          "type": "feature",
          "title": "The /people table gives a row to each seat, so the Mayor's Council votes count",
          "summary": "In the /people table, anyone who held two seats now has a row for each. Dean O'Connor's Council Member row, 2014 through 2017, shows that seat's presence and its 1,411 roll-call votes, and his Mayor row shows presence from 2018 with no votes, since the Mayor's office casts none. Tenure now lists each stretch on the roll calls, so Kyle Mertz's 2014 to 2021 seat and his 2025 to 2026 temporary seat read as two spans instead of one.",
          "areas": [
            "people"
          ],
          "links": [
            "/people?display=table"
          ]
        },
        {
          "id": "2026-10-03-pre-2020-era-band",
          "date": "2026-10-03",
          "type": "feature",
          "title": "Year charts from the Council minutes mark the years before 2020",
          "summary": "Line and bar charts by year on /council, /votes and /people now shade the years before 2020, tag them \"Before 2020\", and say in the caption that Council records from those years are less complete. The shading and caption come from the same meeting-coverage feed as the page notes. No count changed.",
          "areas": [
            "council",
            "votes",
            "people"
          ],
          "links": [
            "/council",
            "/votes#official-remarks"
          ]
        },
        {
          "id": "2026-10-03-presence-chart-seat-bands",
          "date": "2026-10-03",
          "type": "feature",
          "title": "Presence charts shade each seat and join the line across missing minutes",
          "summary": "On /votes, the presence chart for someone who held two seats now shades the Council and Mayor years as separate bands with the seat named inside each. Every presence chart now joins a person's line across meetings with no readable minutes, dashed there, instead of breaking it into scattered dots, so the 2014 to 2019 years read as one line. No count changed.",
          "areas": [
            "votes"
          ],
          "links": [
            "/votes#presence-dean-oconnor"
          ]
        },
        {
          "id": "2026-10-03-seat-gaps",
          "date": "2026-10-03",
          "type": "feature",
          "title": "Council records mark long stretches a member was off the roll call",
          "summary": "When a Council member or Mayor is missing from four or more roll calls in a row, their /people profile and /votes presence row now say how many meetings and between which dates, and the Time in the record timeline breaks their bar there. Where the Council appointed someone to fill the seat temporarily, the profile names that appointment and its dates. No count changed.",
          "areas": [
            "votes",
            "people"
          ],
          "links": [
            "/people?person=josh-dunwoody",
            "/votes#presence-kyle-mertz"
          ]
        },
        {
          "id": "2026-10-03-seats-within-a-tenure",
          "date": "2026-10-03",
          "type": "feature",
          "title": "Council and Mayor records show each seat a person held: Council Member, then Mayor",
          "summary": "The Council roll calls record which seat each person sat in at every meeting. The /votes presence row now names each seat with the years of its first and last roll call, and anyone who held two seats gets that seat's share of meetings and a chart line styled by seat. Their /people profile gives present counts per seat, and the Time in the record timeline colors each seat separately. Dean O'Connor sat as a Council Member from 2014 through December 2017 and as Mayor from January 2018. No count changed.",
          "areas": [
            "votes",
            "people"
          ],
          "links": [
            "/votes#presence-dean-oconnor",
            "/people?person=dean-oconnor"
          ]
        },
        {
          "id": "2026-10-03-votes-nay-rate-decisions",
          "date": "2026-10-03",
          "type": "data-fix",
          "title": "The Nay rate now counts decisions, not every roll call",
          "summary": "Each member's Nay rate on Votes, Council and People is now nays as a share of the decisions the member voted on. It leaves out procedural roll calls (approving the agenda, approving earlier minutes, adjourning), which are about a quarter of all roll calls and have never drawn a nay, and votes the member missed. The rate goes up for everyone who has dissented; the nay counts and every other figure are unchanged. Each vote record now says whether it is procedural.",
          "areas": [
            "votes",
            "council",
            "people"
          ],
          "links": [
            "/votes",
            "/council",
            "/people"
          ]
        }
      ]
    },
    {
      "id": "2026-10-03-court-rulings-read-in-full",
      "date": "2026-10-03",
      "type": "correction",
      "title": "Plate readers in court: every ruling now checked against its own opinion",
      "summary": "The seven rows that rested on another court's description are now checked against the decisions themselves. Two holdings were overstated and are corrected: the August 2025 Northern District of Oklahoma ruling turned first on the defendant lacking standing, with the plate-reader finding only in the alternative, and the January 2026 Eastern District of Oklahoma ruling was a magistrate judge's recommendation about turnpike plate-reader records obtained by subpoena, finding no Fourth Amendment violation. Two rulings were added: the Fifth Circuit's March 2026 decision that the Altoona Police Department cites, and the Eastern District of Virginia's January 2026 summary judgment for the City of Norfolk, now on appeal.",
      "areas": [
        "alpr"
      ],
      "links": [
        "/alpr/court-rulings"
      ]
    },
    {
      "id": "2026-10-03-community-caveat-per-area",
      "date": "2026-10-03",
      "type": "correction",
      "title": "Community-mapped camera note now says where positions and area counts appear",
      "summary": "The camera tracker's community-mapped note said locations and per-area counts were not published. Since October 2 the tracker's nearby map shows community-mapped cameras as unlabeled dots, and today the civic districts page added those dots and counts by precinct and police district. The note now says where each appears; the method behind the city total is still not published.",
      "areas": [
        "alpr",
        "local"
      ],
      "links": [
        "/alpr/tracker#community-camera-total",
        "/local/civic#precinct-cameras"
      ]
    },
    {
      "id": "2026-10-03-civic-map-community-cameras",
      "date": "2026-10-03",
      "type": "feature",
      "title": "Civic districts: one address box, community-mapped cameras on the map, and counts by precinct",
      "summary": "The precinct and police-district map on Find your civic districts can now show the cameras volunteers have mapped on OpenStreetMap, the same unverified dots as the camera tracker's nearby map, behind the same Show community-mapped cameras switch. The dots are drawn over the precinct and police-district outlines, and the address lookup never uses them. The lookup is now one box: type an address the way you would say it, or just a street, and close spellings still match; suggestions show the precinct as you type, and a street on its own lists its blocks with each one's precinct and police district. The page also moved onto the site's black-and-gold accents and its shared figure frame. Below the lookup, two new figures count the map's dots inside each precinct and police district, with each area's share and dots per square mile, so a reader can see which precinct has the most mapped cameras. They count the map's unverified dots, not the tracker's city total.",
      "areas": [
        "local",
        "alpr"
      ],
      "links": [
        "/local/civic",
        "/local/civic#precinct-cameras"
      ]
    },
    {
      "id": "2026-10-03-charts-follow-settings",
      "date": "2026-10-03",
      "type": "feature",
      "title": "Charts follow your Settings, and every chart over time can be cut to the years you want",
      "summary": "The Settings menu has a new Charts section: show every chart as a chart or as its data table, and pick the years shown (all years, since 2020, the last 10 or the last 5). Every chart follows those choices until you change that chart; a change you make on one chart is kept for that chart only. Each chart over time has a Years choice of its own, a From and To pair under Options, and, where the records are dated by month or day, a Last 12 months choice and month-by-month From and To. A chart's Options can make its choice your setting for every chart, or forget it and follow Settings again. Downloads hold the years shown.",
      "areas": [
        "site",
        "data"
      ],
      "links": []
    },
    {
      "id": "2026-10-03-audience-comment-match",
      "date": "2026-10-03",
      "type": "correction",
      "title": "Public comment counts fixed for 14 meetings in 2023",
      "summary": "Fourteen 2023 meetings in Public turnout all showed the same single public-comment speaker and topic, copied from one meeting. Each now shows its own record: 9 of them had a different speaker count (four had no speakers, five had two or three). The 2023 public-comment total and the Council cost per public-comment speaker changed with them.",
      "areas": [
        "council",
        "votes"
      ],
      "links": [
        "/council#audience-presence",
        "/votes#audience-participation"
      ]
    },
    {
      "id": "2026-10-03-audience-2026-09-21-count",
      "date": "2026-10-03",
      "type": "correction",
      "title": "Sept. 21, 2026 audience count corrected to 16",
      "summary": "Public turnout showed 15 people named under Audience Present for the Sept. 21, 2026 meeting. The minutes print 16 names, none of them an official, so the count is now 16.",
      "areas": [
        "council"
      ],
      "links": [
        "/council#audience-presence"
      ]
    },
    {
      "id": "2026-10-02-whats-new-roundups",
      "date": "2026-10-02",
      "type": "feature",
      "title": "What's new folds a busy day into a few roundups",
      "summary": "Reader question: what changed, without reading fifty entries for one day? On a day when many related changes shipped at once, What's new now lists a short roundup per theme (the Council page, the ALPR tracker, charts on phones, and so on) with the individual changes folded underneath, each still at its own link. Corrections and reviews are never folded into a roundup; they stay listed one by one. The feeds, site search, and the homepage's What's new column list the roundups, and the Changes over time chart still counts every individual change.",
      "areas": [
        "site",
        "feeds"
      ],
      "links": [
        "/whats-new",
        "/whats-new/feed.json"
      ]
    },
    {
      "id": "2026-10-02-sheriff-line-incomplete-fbi-years",
      "date": "2026-10-02",
      "type": "correction",
      "title": "The Polk County Sheriff's crime-rate line no longer drops to zero in 1991 and 1992",
      "summary": "On the violent and property offense rate charts on /local and /alpr/tracker, the dashed Polk County Sheriff's Office line fell to zero in 1991 and nearly zero in 1992. Neither was a real drop. The Sheriff's Office sent the FBI no report for 1991, a year almost no Iowa agency reported, and its 1992 report lists only 1 violent and 4 property offenses for the whole year, against hundreds a year around it. Both years are now a gap in that line with a note saying why. The charts also note that rates divide by the FBI's own population estimate, which for a small city can stay flat for years and then jump. The offense count charts now say that Iowa and the nation are compared with Altoona as rates per 100,000 in the chart above them, since their raw counts are far too large to share an axis with Altoona's. Altoona's own figures did not change. Reader question: why does the Sheriff's line crash around 1991?",
      "areas": [
        "local",
        "alpr",
        "data"
      ],
      "links": [
        "/local#fbi-heading",
        "/alpr/tracker#crime-context"
      ]
    },
    {
      "id": "2026-10-02-scanned-minutes-hand-check",
      "date": "2026-10-02",
      "type": "correction",
      "title": "Votes from eight scanned sets of Council minutes, re-read from the scans",
      "summary": "Eight sets of Council minutes from November 2022 to May 2023 were posted by the City as scanned images with no text. This site had read them by machine text recognition (OCR), which missed some roll calls entirely and dropped marks on others. Every page image has now been re-read with an AI model and each roll call compared with the published record; no person has reviewed this pass. Votes the OCR missed were added, so all eight meetings show every roll call the minutes print. Votes where the OCR had lost a member's yes, the mover or the seconder now match the page, and two votes filed under the wrong agenda item were moved to the right one. Each vote from these meetings now names the page it is on. Motions to deny a request or to put items off carry a note, so a passing vote is not read as approval. In one, the written motion and the marks name different movers, so no mover is listed. Attendance and presiding officers already matched the scans.",
      "areas": [
        "votes",
        "council",
        "data"
      ],
      "links": [
        "/votes",
        "/about#known-limits"
      ]
    },
    {
      "id": "2026-10-02-roundup-records-requests-page",
      "date": "2026-10-02",
      "type": "roundup",
      "title": "A Records requests page, police annual reports year over year, and fewer, fuller pages",
      "summary": "A new page, /records-requests, tracks public-records requests to the Altoona Police Department about its plate-reader program: what each item asked for, what came back, and how long the department took, grouped by topic, with released records posted as redacted copies. It now also holds what the released records show (the former research notebook) and the Iowa records request guide, as four pages were folded into the pages that already covered the same ground. The research notebook carries outside reporting on records other requesters got from the City, labeled as external reports and set beside this site's own records. The Police page adds a year-over-year table of figures the department printed in its 2023, 2024, and 2025 annual reports, each with its report and page. The dated keyword search of every Council agenda and minutes since 2020 now looks for \"Axon\" too, and finds four documents from three meetings: the July 21, 2025 consent agenda that carried the Axon agreement, and public comment on September 8 and 21, 2026. Contracts and invoices adds the eight released Flock invoices by year, billed as printed ($185,750 in all), with the gaps named: a bill is not proof of payment, and the release holds no Axon invoice.",
      "areas": [
        "alpr",
        "council",
        "data",
        "local",
        "navigation",
        "records",
        "site"
      ],
      "links": [
        "/records-requests",
        "/records-requests#tracker",
        "/police#year-over-year",
        "/records-requests#external-reports-heading",
        "/records-requests#history-keyword-search",
        "/records-requests#history-contracts"
      ],
      "changes": [
        {
          "id": "2026-10-02-invoice-years",
          "date": "2026-10-02",
          "type": "feature",
          "title": "What the released Flock invoices bill, year by year",
          "summary": "On /records-requests, Contracts and invoices now has a table of the eight Flock invoices in the released records, grouped by invoice year with each year's billed total as printed and each invoice linked: $72,000 in 2023, $109,850 in 2024, $1,300 in 2025 and $2,600 in 2026, $185,750 in all. A bill is not proof of payment, and these are only the invoices in the release: the order forms describe charges with no matching invoice, and the release holds no Axon invoice, so a year with no invoice is a gap, not a zero. The total in the page's summary now reads from the same records instead of being typed in. Reader question: how much have the cameras been billed, and when?",
          "areas": [
            "alpr",
            "records"
          ],
          "links": [
            "/records-requests#history-contracts"
          ]
        },
        {
          "id": "2026-10-02-keyword-search-axon",
          "date": "2026-10-02",
          "type": "data-update",
          "title": "The Council keyword search now looks for \"Axon\" too",
          "summary": "The dated search of every Council agenda and minutes the City has posted since January 6, 2020 now looks for \"Axon\" beside \"Flock\", \"ALPR\", \"license plate reader\" and \"plate reader\". It finds four documents from three meetings: the July 21, 2025 agenda and minutes, where the Axon agreement sat on the consent agenda, and the September 8 and 21, 2026 minutes, both in public comment. Eight image-only scans still cannot be searched. Reader question: how often has ALPR come up in the Council record at all?",
          "areas": [
            "alpr",
            "council"
          ],
          "links": [
            "/records-requests#history-keyword-search",
            "/alpr/tracker#council-keyword-search"
          ]
        },
        {
          "id": "2026-10-02-page-consolidation",
          "date": "2026-10-02",
          "type": "feature",
          "title": "Fewer, fuller pages: records, meeting prep, and how the site works",
          "summary": "Four pages were folded into the pages that already covered the same ground, so each page carries more and nothing is said twice. Records requests now holds what the released records show (the old research notebook) and the Iowa records request guide. The Local corner now holds the meeting cheatsheet's public-comment checklist and recent split votes. About now holds the old Transparency page: data sources, known limits, missing records, and site traffic. Camera counts and orders are charted in one place, the ALPR tracker, with a short summary and link on Records requests. Every old address still works and forwards to the matching section.",
          "areas": [
            "site",
            "navigation",
            "local",
            "alpr"
          ],
          "links": [
            "/records-requests#records-history",
            "/records-requests#ask-yourself",
            "/local#before-the-meeting",
            "/about"
          ]
        },
        {
          "id": "2026-10-02-police-annual-reports-year-over-year",
          "date": "2026-10-02",
          "type": "feature",
          "title": "Police annual reports, year over year",
          "summary": "/police has a new year-over-year table of figures the Police Department printed in its 2023, 2024 and 2025 annual reports: calls and patrol, staffing and programs, investigations and records, and technology and plate readers. Each figure gives its report and page. It answers what the department itself reported, year to year. Where two reports count something differently, such as incidents, the row says so instead of comparing them, and a blank means the report does not state it. The 2023 and 2024 reports came through a public-records request and are not posted; only their figures are.",
          "areas": [
            "site",
            "data"
          ],
          "links": [
            "/police#year-over-year",
            "/records-requests#held-back"
          ]
        },
        {
          "id": "2026-10-02-records-requests",
          "date": "2026-10-02",
          "type": "feature",
          "title": "Records requests: police records, redacted, with each request's status",
          "summary": "A new page, /records-requests, tracks public-records requests to the Altoona Police Department about its plate-reader program: what every item asked for, what came back, and how long the department took to respond, shown by season. It posts 20 released records as redacted copies (order forms, invoices, Policy 424, the retention schedule, the 2022 memos to the Mayor and Council, two white papers, and a state-restrictions screen), each with what was removed and the pages that cite it. A step timeline of the camera orders and invoices, with the department's own counts beside them, appears there and on /research, and the research notebook's camera-count table adds the counts these records state, and /research, /alpr/tracker, /police and /why now link to the records they rely on.",
          "areas": [
            "site",
            "alpr",
            "data"
          ],
          "links": [
            "/records-requests",
            "/research#camera-counts-heading",
            "/alpr/tracker#collection-heading",
            "/police",
            "/why#legal-not-right"
          ]
        },
        {
          "id": "2026-10-02-records-requests-by-topic",
          "date": "2026-10-02",
          "type": "feature",
          "title": "Records requests grouped by topic, with the people in the records",
          "summary": "/records-requests now groups what was asked of the Police Department by topic (cameras, contracts, and costs; searches, audit logs, and sharing; policy, retention, and oversight; approvals and reports to the Council) instead of request by request. Overlapping asks are combined, the questions about how the records fee was calculated sit with the costs they concern, the fee itself is shown as a range rather than an exact figure, and every topic reads Pending. A new list, People in these records, names the officials and department staff who appear in the records or the department's replies, says what the records show each of them doing, and links each to their profile and to every record that names them, with what that record shows them doing and the page it is on. It answers a reader's question about who handled the program, from the records alone. The timeline now shows the department's steps and how long each took, rounded to the week. /records-requests and the research notebook link to each other near the top, and links from /research, /police and the outside-reporting comparisons point at the matching topic.",
          "areas": [
            "site",
            "alpr",
            "data"
          ],
          "links": [
            "/records-requests#tracker",
            "/records-requests#people"
          ]
        },
        {
          "id": "2026-10-02-research-external-reports",
          "date": "2026-10-02",
          "type": "feature",
          "title": "What other records requests found, beside our own records",
          "summary": "The research notebook now carries outside reporting on records other requesters got from the City, as a labeled external report credited to its outlet and author, with links to the sources it cites. Each fact is attributed to the outlet and set beside what this site's own records say: whether they match, differ, or this site has no record, or what this site found when it checked the cited source. It answers a reader's question about what else the City bought and released. The first report describes Axon readers in patrol cars and a Motorola (Vigilant) subscription that this site's records do not cover, a retention-schedule wording that differs from this site's copy, arrest and clearance figures the outlet says do not show cause, a statewide poll, and an Iowa Court of Appeals ruling on records a vendor holds. None of it is added to any count or chart.",
          "areas": [
            "alpr",
            "data"
          ],
          "links": [
            "/research#external-reports-heading",
            "/alpr/external-reports.json"
          ]
        }
      ]
    },
    {
      "id": "2026-10-02-roundup-people-links-previews-and-footer",
      "date": "2026-10-02",
      "type": "roundup",
      "title": "Officials' names link to their profiles, every page previews itself when shared, the footer lists each page once, and the header gets one Settings menu",
      "summary": "Wherever the site names an official who has a People profile, the name now links to it, and each profile lists where that person appears across the site. Every page has its own link-preview card, each profile previews with that person's name and role, and the Cite button on each vote, remark, and released police record hands out a link of its own; four household addresses printed in Council minutes are withheld. The footer lists each page once, a row above it asks whether the page was useful (Yes or No, plus an optional note sent to the site's editor with no name or account attached), grouped like the menus, a menu item that jumps into another page names that page first, and long filter rows on What's new fold behind a More button. In the header, the theme button and View menu are now one Settings button that explains each choice in Display, Data and Map sections (theme, detail, heat coloring, the year Council pages open on, and map defaults), and the floating \"On this page\" button sits beside the ALPR estimate.",
      "areas": [
        "alpr",
        "council",
        "design",
        "navigation",
        "people",
        "site",
        "votes",
        "whats-new"
      ],
      "links": [
        "/people",
        "/votes",
        "/about",
        "/whats-new"
      ],
      "changes": [
        {
          "id": "2026-10-02-filter-chip-more-button",
          "date": "2026-10-02",
          "type": "feature",
          "title": "Long filter rows fold behind a More button",
          "summary": "Reader question: why is the filter list longer than the change log I came to read? On What's new, a row of filter chips that would run past two lines (three on a phone) now shows the first chips, then \"More\" with how many are folded away; \"Fewer\" folds them again. The chip you picked always stays in view. The area filters also read better: \"SEO\" is spelled as an acronym, and \"Design\" and \"Design system\" are one chip. Every page that uses the shared filter chips gets the same button.",
          "areas": [
            "whats-new",
            "design"
          ],
          "links": [
            "/whats-new"
          ]
        },
        {
          "id": "2026-10-02-footer-site-map",
          "date": "2026-10-02",
          "type": "feature",
          "title": "A shorter footer that lists each page once",
          "summary": "The footer's site map now lists each page once, grouped like the menus at the top of the page, with an About group for About this project, Leave a message, Report an error, What's new, and the community discussion link. Links that repeated another footer link are gone. The groups fill balanced columns, two across on a phone, so the footer is about 40 percent shorter there.",
          "areas": [
            "site"
          ],
          "links": [
            "/about"
          ]
        },
        {
          "id": "2026-10-02-header-settings-menu",
          "date": "2026-10-02",
          "type": "feature",
          "title": "One Settings menu in the header, and the floating buttons side by side",
          "summary": "The header's theme button and View menu are now one Settings button with a gear. It holds Theme (Light, Dark or Auto), Detail (Brief or Full) and Heat coloring (On or Off), and each one says in a line what it does. Choices you already picked stay picked. The floating \"On this page\" button now sits beside the ALPR estimate in the bottom right corner, and both match the header's square style. The header's counter reads \"page views today\" and the ALPR line reads \"last 30 days\" and \"your visit\".",
          "areas": [
            "site"
          ],
          "links": [
            "/"
          ]
        },
        {
          "id": "2026-10-02-menu-section-links",
          "date": "2026-10-02",
          "type": "feature",
          "title": "Menu links to a section of another page name that page",
          "summary": "A menu item that jumps to a section of a page filed under a different menu now names that page first, so \"Police pay\" under Police & ALPR reads \"Public pay \u203a Police pay\" and you know it opens the pay page. The same label appears in the header menus, the phone menu, and the footer, and screen readers hear \"Public pay: Police pay\". Every page on the site is listed in the menus or the footer.",
          "areas": [
            "site"
          ],
          "links": [
            "/pay#police"
          ]
        },
        {
          "id": "2026-10-02-page-feedback-row",
          "date": "2026-10-02",
          "type": "feature",
          "title": "Every page asks whether it was useful",
          "summary": "A small row above the footer of every page asks \"Was this page useful?\" with Yes and No buttons and an optional one-line note. It goes to the site's editor through the same channel as the contact form; no name, address or account is attached. Pages viewed without JavaScript show no row.",
          "areas": [
            "site"
          ],
          "links": [
            "/contact"
          ]
        },
        {
          "id": "2026-10-02-people-linked-where-named",
          "date": "2026-10-02",
          "type": "feature",
          "title": "Officials' names link to their profiles, and each profile lists where they appear",
          "summary": "Wherever the site names an official who has a People profile, the name itself now links to that profile: in remarks and public-comment summaries on Votes, in news story summaries, in What's new, and in page text. Each profile has a new \"Where this person appears\" list linking back to every page section, story and released record that names the person. Answers: where else on this site does this person come up?",
          "areas": [
            "people",
            "site"
          ],
          "links": [
            "/people",
            "/votes#official-remarks",
            "/news"
          ]
        },
        {
          "id": "2026-10-02-profile-previews-and-withheld-addresses",
          "date": "2026-10-02",
          "type": "feature",
          "title": "Profiles get their own link previews; four household addresses withheld",
          "summary": "Reader question: when I share someone's profile, does the preview say who it is? Each /people profile now has a Cite button under its header, and its link previews with that person's name and role instead of the general People page. Separately, four household addresses printed in Council minutes (fee-waiver and utility-relief requests) were still showing on /votes and in search because they had no street type such as \"Street\"; they now read \"[address withheld]\", like other household addresses on the site.",
          "areas": [
            "site",
            "people",
            "votes"
          ],
          "links": [
            "/people",
            "/votes",
            "/search"
          ]
        },
        {
          "id": "2026-10-02-settings-map-defaults",
          "date": "2026-10-02",
          "type": "feature",
          "title": "Settings: Display, Data and Map sections, with map defaults and a reset",
          "summary": "The header's Settings menu is now grouped into Display (Theme, Detail, Heat coloring), Data (Year) and Map. Map holds Streets and Community-mapped cameras, each Default, on or off, and the ALPR tracker's maps follow a change right away. Choices made with a page's own switches update these too, and Reset to site defaults clears them all. Nothing is set until you set it.",
          "areas": [
            "site",
            "alpr"
          ],
          "links": [
            "/alpr/tracker"
          ]
        },
        {
          "id": "2026-10-02-settings-year",
          "date": "2026-10-02",
          "type": "feature",
          "title": "Pick the year Council pages open on, in Settings",
          "summary": "The header's Settings menu has a Year choice: All years, the ALPR era (2022 to now), or a single year. Votes and Council profiles open on it, and changing the year on either page updates it too. A shared link that names a year still opens on that year.",
          "areas": [
            "site",
            "votes",
            "council"
          ],
          "links": [
            "/votes"
          ]
        },
        {
          "id": "2026-10-02-share-previews",
          "date": "2026-10-02",
          "type": "feature",
          "title": "Shared links now preview the page or record they point to",
          "summary": "Reader question: when I post a link to a vote, what will people see? Every page now has its own link-preview card naming that page instead of the homepage's. The Cite button on each Council vote, official remark and released police record now hands out a link of its own, so a post or message previews that record's title and description (the vote's item, result and mover, the remark's speaker and words, the record's title) and opens the record on the site. The Cite panel also gains a Share button on phones, says when a link or citation is copied, and adds the date you read it to the citation. Public-comment entries keep their page links only, since their speakers are private residents.",
          "areas": [
            "site",
            "votes",
            "alpr"
          ],
          "links": [
            "/votes",
            "/records-requests"
          ]
        }
      ]
    },
    {
      "id": "2026-10-02-roundup-pay-and-votes-pages",
      "date": "2026-10-02",
      "type": "roundup",
      "title": "Public pay rebuilt, and the Votes page's business, presence, public-comment and official-remarks tabs reworked",
      "summary": "Public pay is rebuilt on the site's shared figures with a police step ladder. On /votes, Addresses & businesses shows one list at a time under one set of filters, with a chart of property and business matters per year, and Presence lists one row per person with the share of meetings the record documents; open a row for the facts and its chart, and the Public and Others totals now chart by year. Public comment puts what residents said right under the topic chart that filters it, filed by year, month, meeting and item like the Official remarks list. Official remarks opens with four headline figures and a chart of remarks per year by role, browses by year, month, meeting and agenda item, and lists who spoke as one compact row per official. The tabs now share one layout, each in its own color. Deeper tables open on request. The counts are unchanged.",
      "areas": [
        "charts",
        "council",
        "design",
        "pay",
        "site",
        "votes"
      ],
      "links": [
        "/pay",
        "/votes#property-business",
        "/votes#council-presence",
        "/votes#public-comment",
        "/votes#official-remarks"
      ],
      "changes": [
        {
          "id": "2026-10-02-pay-page-redesign",
          "date": "2026-10-02",
          "type": "feature",
          "title": "Public pay: rebuilt on the site's shared figures, with a police step ladder",
          "summary": "The Public pay page now uses the same pieces as the rest of the site. The headline row is four stat tiles, each with its source: the Mayor's and a Council member's annual pay (with the City Code section), the police officer hourly range by step (with the date the last union contract expired), and the estimated stipend paid to all Mayor and Council seats since January 6, 2020 (the same total the stipend table sums). Mayor and Council pay is a before-and-after table with the change for each office. The combined stipend estimate now leads the per-person table instead of trailing it, and the per-year check against the Council page folds into a disclosure whose summary gives the answer. The most recent police contract gets one chart, each step's hourly rate in the contract's last raise column, with the printed wage schedule beneath it; assignment, shift, and longevity pay is a table with a source link per row; and each earlier contract's wage table opens from a labeled summary. Every figure still comes from the published pay feed, and every link from the Council, Police, People, and Local pages still lands where it did.",
          "areas": [
            "pay",
            "charts",
            "design"
          ],
          "links": [
            "/pay",
            "/pay#police",
            "/pay#stipend-earned"
          ]
        },
        {
          "id": "2026-10-02-public-comment-grouped",
          "date": "2026-10-02",
          "type": "feature",
          "title": "Public comment is filed by year, month, meeting and item",
          "summary": "The Public comment list on /votes now folds the same way as the Official remarks list: by year, then month, then meeting, with each meeting's agenda item above its speakers. The newest meeting opens first, Expand all and Collapse all open or close every group, and the search box, Topic filter and \"Only meetings where someone spoke\" switch work inside the groups. Speakers are still shown as first name and last initial. No figure changed.",
          "areas": [
            "votes"
          ],
          "links": [
            "/votes#public-comment"
          ]
        },
        {
          "id": "2026-10-02-votes-layers-fold",
          "date": "2026-10-02",
          "type": "feature",
          "title": "Votes: Public comment's participation tables open on request",
          "summary": "On the Public comment tab of /votes, the participation share by year, the most frequent speakers and the meetings with the most participation now sit closed beneath the comments, each with a one-line summary; open one for the full chart or table. Choosing Full detail in Settings opens them all. The figures are unchanged.",
          "areas": [
            "votes",
            "site"
          ],
          "links": [
            "/votes#public-comment",
            "/votes#public-speakers"
          ]
        },
        {
          "id": "2026-10-02-votes-official-remarks-tab",
          "date": "2026-10-02",
          "type": "feature",
          "title": "Votes: Official remarks leads with a chart and browses by year, month and meeting",
          "summary": "The Official remarks tab on /votes now opens like the other tabs: four headline figures and a chart of remarks per year by role. The remarks themselves browse by year, then month, then meeting and agenda item, the same way Vote search does. Who spoke is one compact row per official with a per-year sparkline, and the busiest meetings and agenda topics sit in one fold, with long agenda titles shortened until opened. The remarks, counts and names are unchanged.",
          "areas": [
            "votes",
            "council",
            "site"
          ],
          "links": [
            "/votes#official-remarks"
          ]
        },
        {
          "id": "2026-10-02-votes-presence-rows",
          "date": "2026-10-02",
          "type": "feature",
          "title": "Votes: Presence lists one row per person",
          "summary": "The Presence tab on /votes now lists each documented person as one row with their role, years in the record and the share of meetings the record documents (out of the meetings in their tenure for the Mayor and Council, out of every meeting held for everyone else), with a small bar beside it. Open a row for the facts, the cited records, remarks and the cumulative chart. The list folds after 12 people, and the chart key is explained once above the list instead of under every chart. The Public and Others totals each open to a per-year bar chart of the same counts, with a table and CSV. The counts are unchanged.",
          "areas": [
            "votes",
            "council",
            "site"
          ],
          "links": [
            "/votes#council-presence"
          ]
        },
        {
          "id": "2026-10-02-votes-property-business-refresh",
          "date": "2026-10-02",
          "type": "feature",
          "title": "Votes: a cleaner Addresses & businesses tab, with matters per year",
          "summary": "The Addresses & businesses tab on /votes now shows one list at a time (projects, businesses and applicants, or addresses) under one set of filters, as compact cards that fold after 12. A new chart counts the property and business matters the Council voted on each year; click a year to narrow the page to it. Each project lists its matters as dated links, and long pay-application titles are trimmed to three lines with the full record one click away. The records, counts and withheld names and addresses are unchanged.",
          "areas": [
            "votes",
            "site"
          ],
          "links": [
            "/votes#property-business"
          ]
        },
        {
          "id": "2026-10-02-votes-public-comment-order",
          "date": "2026-10-02",
          "type": "feature",
          "title": "Votes: Public comment puts the comments right under the topic chart",
          "summary": "On the Public comment tab of /votes, the list of what residents said now sits directly under the topic chart that filters it, under its own heading, and shows the 10 most recent meetings with the rest one click away. The participation figures follow it: the yearly share chart leads, with the year-by-year table folded beneath it. The comments, counts and names shown are unchanged.",
          "areas": [
            "votes",
            "council",
            "site"
          ],
          "links": [
            "/votes#public-comment"
          ]
        },
        {
          "id": "2026-10-02-votes-shared-section-pattern",
          "date": "2026-10-02",
          "type": "feature",
          "title": "Votes: the three record tabs share one layout, each in its own color",
          "summary": "Addresses & businesses, Presence and Public comment on /votes now open the same way: a heading with what the records hold and their caveat, a row of headline figures, the chart, then the list to browse. Each keeps its own accent color. Presence and Public comment gain headline figures that restate counts the tab already showed. The records and counts are unchanged.",
          "areas": [
            "votes",
            "site"
          ],
          "links": [
            "/votes#property-business",
            "/votes#council-presence",
            "/votes#public-comment"
          ]
        }
      ]
    },
    {
      "id": "2026-10-02-roundup-known-cameras-lead-and-nearby-map",
      "date": "2026-10-02",
      "type": "roundup",
      "title": "The tracker and homepage lead with the cameras residents have mapped; the nearby map gains streets and camera points",
      "summary": "Because the police department publishes no list of its cameras, the ALPR tracker's How many cameras section and the homepage camera figure now open with the counts volunteers have mapped, labeled community-mapped and unverified, with the vendors' own counts beneath, and a new card on /why says why. The nearby-cities map shows each city's community-mapped count, draws major streets, and marks each camera mapped in OpenStreetMap as of October 2, 2026, with a switch for each layer; its table gains a Distance from Altoona column and, with community-mapped totals on, the ring cards read as running totals within 1, 3, 5 and 10 miles; a new Heat control shades reported agencies by their vendor-reported count. The Flock source card checks each hand reading against Eyes On Flock's copy and says that copy stopped updating after September 23. Two new Flock portal readings, September 30 and October 2, are in. A short note beside the combined 30-day figures, labeled as the site's position, explains why nearly every plate read matching no hotlist matters.",
      "areas": [
        "alpr",
        "homepage",
        "pay",
        "site"
      ],
      "links": [
        "/alpr/tracker#community-camera-total",
        "/alpr/tracker#nearby-jurisdictions",
        "/",
        "/why"
      ],
      "changes": [
        {
          "id": "2026-10-02-flock-cross-check-table",
          "date": "2026-10-02",
          "type": "feature",
          "title": "Flock portal readings compared with Eyes On Flock's copy",
          "summary": "The Flock Safety source card on the ALPR tracker now lists each reading of Flock's portal beside Eyes On Flock's copy of the same day and says whether they match. Eyes On Flock's copy stopped updating after September 23, and the card now says so instead of showing that date alone.",
          "areas": [
            "alpr"
          ],
          "links": [
            "/alpr/tracker"
          ]
        },
        {
          "id": "2026-10-02-flock-portal-readings",
          "date": "2026-10-02",
          "type": "data-update",
          "title": "Flock portal readings for September 30 and October 2 added to the ALPR tracker",
          "summary": "Two new readings from Flock's own Altoona transparency portal. September 30, 2026: 51 cameras, 568,309 plate reads, 235 searches and 8,310 hotlist hits over the last 30 days. October 2, 2026: 51 cameras (unchanged), 567,797 plate reads (down 5,151 from the September 28 reading), 222 searches (down 1) and 8,263 hotlist hits (down 294). Both show 30-day retention and the same two hotlists (NCIC and NCMEC Amber Alert). Flock labels the plate-read figure vehicles detected; it counts plate reads, not unique vehicles. Every figure is a rolling 30-day total, so a change between readings is not the number of events on any one day. No new Flock figures were recorded for September 29 or October 1. The portal's policy statements read word for word as they did on September 28.",
          "areas": [
            "alpr"
          ],
          "links": [
            "/alpr/tracker"
          ]
        },
        {
          "id": "2026-10-02-heat-preference-and-pay-figure-fixes",
          "date": "2026-10-02",
          "type": "feature",
          "title": "Maps and tables can shade by value; the Heat control remembers your choice",
          "summary": "A new \"Heat\" control in the utility bar (next to Detail) turns value-intensity coloring on or off, on by default: the /alpr/tracker nearby-jurisdictions map now shades each reported agency by its own vendor-reported camera count instead of one flat color for every agency, with a legend scale, and DataView's table view can shade its numeric cells the same way. Numbers are always printed either way. Also: every /pay figure was walked through every form it offers at desktop and phone widths; the fixes are in the internal notes. Sideways-scrolling tables now show a soft shadow on the side that still has columns off-screen, so a wide table no longer looks clipped at phone width.",
          "areas": [
            "site",
            "alpr",
            "pay"
          ],
          "links": [
            "/alpr/tracker",
            "/pay"
          ]
        },
        {
          "id": "2026-10-02-homepage-known-cameras-and-new-tiles",
          "date": "2026-10-02",
          "type": "feature",
          "title": "Homepage: known cameras lead, plus Police, Records requests, and Research tiles",
          "summary": "The homepage camera figure now leads with the cameras residents have mapped in Altoona, labeled community-mapped and unverified, with the count within 10 miles and the vendors' own counts beneath it, matching the ALPR tracker's How many cameras section, where the link now lands. If you switched community-mapped figures off on the tracker, the homepage shows the vendor count instead. Explore the record gains tiles for the Police page, Records requests, and the Research notebook, and the hero links to Why this site exists. Answers: where do I start, and how many cameras are there?",
          "areas": [
            "homepage",
            "alpr"
          ],
          "links": [
            "/",
            "/alpr/tracker#community-camera-total",
            "/police",
            "/records-requests",
            "/research"
          ]
        },
        {
          "id": "2026-10-02-nearby-distance-and-running-ring-totals",
          "date": "2026-10-02",
          "type": "feature",
          "title": "Nearby jurisdictions: how far each city is from Altoona, and running ring totals",
          "summary": "The nearby-jurisdictions table on /alpr/tracker has a Distance from Altoona column: whether each city borders Altoona or which of the map's 1, 3, 5 and 10-mile rings its limit first reaches, measured between city limits on OpenStreetMap outlines. With community-mapped totals switched on, the ring cards now read as running totals (everything within 1, 3, 5 and 10 miles, inner rings included), with the per-band counts listed under them. Answers: which neighbors are closest, and how many community-mapped cameras (unverified) sit within a given distance.",
          "areas": [
            "alpr"
          ],
          "links": [
            "/alpr/tracker#nearby-jurisdictions"
          ]
        },
        {
          "id": "2026-10-02-nearby-map-community-numbers",
          "date": "2026-10-02",
          "type": "feature",
          "title": "The nearby-cities map shows each city's community-mapped count",
          "summary": "Reader question: how many cameras have residents mapped in each nearby city? With \"Show community-mapped totals\" on (the default), each city on the ALPR tracker's nearby map now shows its community-mapped total, marked \"mapped\" and unverified; turn the switch off to see each police department's own vendor-reported count instead. Totals only, from the same September 27 mapping snapshot as the table below the map.",
          "areas": [
            "alpr"
          ],
          "links": [
            "/alpr/tracker#nearby-jurisdictions"
          ]
        },
        {
          "id": "2026-10-02-nearby-map-points-and-streets",
          "date": "2026-10-02",
          "type": "feature",
          "title": "Streets and community-mapped camera positions on the nearby-cities map",
          "summary": "Reader request: show where the community has mapped cameras. The nearby-jurisdictions map on the ALPR tracker now draws major streets (on by default, with a switch to hide them) and a dot for each camera mapped in OpenStreetMap as of October 2, 2026, shown with the community-mapped switch. The dots are community-mapped and unverified, carry no brand, owner or ID, and are not counted: each city's number still comes from the published community snapshot's own classification, so a city's dots and its number can differ, and a line under the map says so.",
          "areas": [
            "alpr"
          ],
          "links": [
            "/alpr/tracker#nearby-map"
          ]
        },
        {
          "id": "2026-10-02-tracker-known-cameras-lead",
          "date": "2026-10-02",
          "type": "feature",
          "title": "The ALPR tracker now leads with the known cameras residents have mapped",
          "summary": "Reader question: how many cameras are there, really? The police department doesn't publish a list of its cameras, so the tracker's \"How many cameras\" section now opens with the counts volunteers have mapped: the known cameras presumed inside Altoona, and the known cameras within 10 miles of the city outside its limits. Both are community-mapped and unverified, totals only, with no locations. A small switch in the same section shows only the vendors' own reported counts instead, and the nearby-cities map follows. The tracker's top tiles now include the known cameras in Altoona too. The mapped counts stop at 10 miles. The nearby-cities map now shows its community-mapped totals by default as well.",
          "areas": [
            "alpr"
          ],
          "links": [
            "/alpr/tracker#community-camera-total"
          ]
        },
        {
          "id": "2026-10-02-tracker-why-reads-matter",
          "date": "2026-10-02",
          "type": "feature",
          "title": "The ALPR tracker says why nearly every plate read matching no hotlist matters",
          "summary": "Reader question: why point out that almost every read matched nothing? Beside the tracker's combined 30-day figures, a short note labeled as the site's position explains it: the cameras read the plates of cars that pass them whether or not anyone is looking for them, nearly all of those reads matched no hotlist, and they are still kept and searchable for the vendors' retention window while both portals say their access logs are stored indefinitely. It links to the Why page's reasoning and to the department's own account on the police page. The figures in the note come from the same vendor feeds as the tiles beside it; reads are plate reads, not unique vehicles or people, and the existing caveat that a read without a hit does not establish a false alert, an identity, or an enforcement outcome stays in place.",
          "areas": [
            "alpr"
          ],
          "links": [
            "/alpr/tracker",
            "/why#word-games",
            "/police#alpr-basics-label"
          ]
        },
        {
          "id": "2026-10-02-why-counting-cameras",
          "date": "2026-10-02",
          "type": "feature",
          "title": "Why we lead with the cameras residents have mapped",
          "summary": "A new card on /why explains why the site starts with the camera count residents have mapped: the department publishes no inventory, so that map is the picture people live with. It links to the tracker's camera count.",
          "areas": [
            "site"
          ],
          "links": [
            "/why",
            "/alpr/tracker"
          ]
        }
      ]
    },
    {
      "id": "2026-10-02-roundup-homepage-countdown-and-agenda",
      "date": "2026-10-02",
      "type": "roundup",
      "title": "Homepage: a countdown to the next Council meeting, its agenda, and links that open the exact record",
      "summary": "The next-meeting tile on the homepage, the Local corner's meeting banner, and the meeting cheatsheet now count down to the meeting's start in Altoona time, read Under way once it begins beside this year's average meeting length, and name the first items on the next posted agenda with a card listing every item in the agenda's own wording. The Local corner's recent roll-call list covers the last two meetings that decided something, skipping procedure-only ones. On the homepage, each newest official remark, public-comment line, and story headline opens its own record, and the nameplate follows the domain you arrived on, with a question underneath.",
      "areas": [
        "activist",
        "homepage",
        "local",
        "navigation",
        "site"
      ],
      "links": [
        "/",
        "/local#before-the-meeting",
        "/activist"
      ],
      "changes": [
        {
          "id": "2026-10-02-homepage-links-land-on-their-record",
          "date": "2026-10-02",
          "type": "feature",
          "title": "Homepage links open the exact remark, speakers, and story",
          "summary": "On the homepage, each newest official remark now opens that remark on the Votes page instead of the newest-first list of every remark, each public-comment line opens that meeting's speakers, and story headlines open the story's own card on News (with its source and any opinion label) instead of jumping straight to the outside source. The corrections tile now opens the list of published corrections on What's new, where its count comes from. Answers: where does this card actually take me?",
          "areas": [
            "homepage",
            "navigation"
          ],
          "links": [
            "/",
            "/whats-new?type=correction",
            "/news"
          ]
        },
        {
          "id": "2026-10-02-homepage-nameplate-domain",
          "date": "2026-10-02",
          "type": "feature",
          "title": "Homepage nameplate follows the domain, with a question underneath",
          "summary": "The homepage nameplate reads Deaxon Altoona when you arrive on deaxonaltoona.com and Deflock Altoona on deflockaltoona.com, and a line under it asks: The surveillance capital of Iowa? Answers: which site am I on?",
          "areas": [
            "homepage"
          ],
          "links": [
            "/"
          ]
        },
        {
          "id": "2026-10-02-meeting-under-way",
          "date": "2026-10-02",
          "type": "feature",
          "title": "The meeting countdown says when a meeting is under way",
          "summary": "Reader question: is the Council meeting going on right now, and how long do they usually run? When a meeting starts, the countdown on the homepage, the Local Corner and the Meeting Cheatsheet now reads \"Under way\" with how many minutes it has been going, next to this year's average length of a meeting from the minutes (for example, 17 timed meetings in 2026 averaged 20 minutes). Once a meeting has run as long as this year's longest timed meeting, the pages move on to the next one.",
          "areas": [
            "site"
          ],
          "links": [
            "/",
            "/local",
            "/activist"
          ]
        },
        {
          "id": "2026-10-02-next-meeting-countdown",
          "date": "2026-10-02",
          "type": "feature",
          "title": "A countdown to the next Council meeting",
          "summary": "Reader question: how long until the Council meets next? The Next Council meeting tile on the homepage, the Local Corner meeting banner and the Meeting Cheatsheet now count down to the meeting's start in Altoona time (for example, \"Starts in 2 hours, 5 minutes\"). A meeting whose agenda is not posted yet reads \"Expected in ...\", since its date comes from the usual schedule. Once a meeting starts, all three move on to the following one. Without JavaScript the pages still show the meeting's date.",
          "areas": [
            "site"
          ],
          "links": [
            "/",
            "/local",
            "/activist"
          ]
        },
        {
          "id": "2026-10-02-recent-items-skip-procedure-only-meetings",
          "date": "2026-10-02",
          "type": "feature",
          "title": "Recent roll-call items cover the last two meetings with business",
          "summary": "The Local corner's \"Before the meeting\" list showed only the latest meeting's roll calls, and the September 28 workshop's minutes record just one vote: to adjourn. The list now shows the two most recent meetings that decided something, each under its own date and meeting type, and leaves out approving the agenda, approving the minutes and adjourning. The Meeting cheatsheet's recent vote signals leave those motions out too.",
          "areas": [
            "local",
            "activist"
          ],
          "links": [
            "/local",
            "/activist"
          ]
        },
        {
          "id": "2026-10-02-upcoming-agenda-home-and-local",
          "date": "2026-10-02",
          "type": "feature",
          "title": "The next meeting's agenda, on the homepage and the Local corner",
          "summary": "Answers \"what is the Council voting on next?\". Below the homepage's key figures, and in the Local corner's meeting banner, a short line now names the first items on the next posted agenda (right now, October 5), with a Full agenda card that lists every item in the agenda's own wording and links to the City's agenda PDF. It updates by itself each time the City posts a new agenda, and before an agenda is posted it says so and links to the City's archive.",
          "areas": [
            "local",
            "site"
          ],
          "links": [
            "/",
            "/local#before-the-meeting"
          ]
        }
      ]
    },
    {
      "id": "2026-10-02-roundup-flock-camera-counts-from-the-records",
      "date": "2026-10-02",
      "type": "roundup",
      "title": "ALPR tracker: every Flock camera count the records state, Axon's own figures, and a by-year camera line with its math",
      "summary": "The ALPR tracker now charts every Flock camera count a City or police record states, each as its own dated point linked to its record: the 2022 pilot as the City describes it, the police memos of June, July, and September 2022 (the July 25 memo is newly added), the 2024 overview, and the 2024 annual report's statements about dash-camera plate readers and Fusus, beside the archived portal captures and this site's daily collection. The chart and the dated memo timeline point to each other, a dashed straight line carries the counts two years past the latest one and is labeled as this site's arithmetic, and the community map's own count at past dates is shown from OpenStreetMap's history. The Research notebook's records history lists the same counts in each record's own words, and the search of every Council agenda and minutes for plate-reader terms was re-run and dated October 2, 2026. The charts on /local mark the Flock rollout steps the released records state beside the Council's approval stages. The by-year panel beside reported crime now carries one line of the best-known Flock camera count each year from the 2022 pilot, with each year's source and any arithmetic listed under it (2024 is this site's sum of three Flock invoices, 18 + 2 + 29 = 49 cameras billed), and the Vehicles detected and Hotlist hits views add Axon's own 30-day figures as a separate line, never added to Flock's, and the Axon source card lists every Axon reading collected. Axon's plate readers are not in any camera count, because no source states one. The Cameras view is now one 'Cameras discovered in Altoona' line through every dated count (records, invoices, then Flock's portal) with each step listed under it, the community-mapped count beside it as its own switchable line, a change-from-the-previous-reading column for the 30-day figures, a toggle for each line of the crime-rate chart, and a second chart of Altoona's offenses reported and cleared, as Altoona PD reported them to the FBI.",
      "areas": [
        "alpr",
        "council",
        "data",
        "local",
        "police",
        "research",
        "site"
      ],
      "links": [
        "/alpr/tracker#camera-history",
        "/research#camera-counts-heading",
        "/records-requests#camera-orders",
        "/local"
      ],
      "changes": [
        {
          "id": "2026-10-02-camera-counts-in-records",
          "date": "2026-10-02",
          "type": "data-update",
          "title": "Camera counts from City records, before the vendor readings begin",
          "summary": "Reader question: how many cameras did the program have before the vendor's own readings start? The Research notebook's records history now lists every camera count a City record states outright, each in that record's own words: the 2022 pilot as the City's ALPR page describes it (10 Flock cameras) and as the Police Department's 2025 annual report describes it (eighteen ALPR units), the two 2022 update memos (12 installed and 10 working in June; 14 in September), and the 2024 expansion, for which the City gives no number. The earliest archived vendor reading closes the list. The documents count different things, so the rows are not a trend and are not charted, and years with no record stay gaps.",
          "areas": [
            "alpr",
            "research",
            "data"
          ],
          "links": [
            "/research#camera-counts-heading"
          ]
        },
        {
          "id": "2026-10-02-camera-counts-july-2022-memo",
          "date": "2026-10-02",
          "type": "data-update",
          "title": "Camera counts: the July 25, 2022 memo added",
          "summary": "The Research notebook's camera-counts table now includes the Police Department's July 25, 2022 update memo to the Mayor and Council, which says 12 of the pilot's 18 cameras were installed and all 12 were working, between the June 3 count (12 installed, 10 working) and the September 26 count (14 and 14). The row quotes the memo exactly and links its redacted copy on the Records requests page.",
          "areas": [
            "alpr",
            "research",
            "data"
          ],
          "links": [
            "/research#camera-counts-heading",
            "/records-requests#apd-memo-2022-07-25"
          ]
        },
        {
          "id": "2026-10-02-community-camera-history",
          "date": "2026-10-02",
          "type": "feature",
          "title": "Camera-order timeline: the community map's count at past dates",
          "summary": "The camera-order timeline on /records-requests and /research now also shows how many cameras were on the community map (DeFlock/OpenStreetMap, presumed inside Altoona city limits, unverified) on July 23, 2025 and today, taken from OpenStreetMap's own history of the map on each date. These count when volunteers mapped cameras, not when they were installed, and are not comparable to the order or portal figures. No camera was mapped inside Altoona before April 2025, so earlier dates have no community figure. A switch hides these items.",
          "areas": [
            "alpr",
            "data"
          ],
          "links": [
            "/records-requests#camera-orders",
            "/research",
            "/alpr/community-camera-history.json"
          ]
        },
        {
          "id": "2026-10-02-council-keyword-search-refresh",
          "date": "2026-10-02",
          "type": "data-fix",
          "title": "A fresh, dated search of every Council agenda and minutes for plate-reader terms",
          "summary": "Reader question: has the Council ever talked about the cameras on the record? The ALPR tracker and the Research notebook used an undated figure for how many Council minutes and agendas were searched. That search was re-run on October 2, 2026 over every Council agenda and minutes the City has posted since January 6, 2020, and both pages now read the dated result from one data file. Two documents mention the terms, the September 8 and September 21, 2026 minutes, both under the \"Citizens request to address council\" item, not a Council action. Eight scanned minutes from 2022 and 2023 have no text a search can read. On the tracker, the 2022 update memos' camera counts are now quoted from each memo and linked to its redacted copy, the July 25, 2022 memo is included, and \"Councilpersons\" links to the Council page.",
          "areas": [
            "alpr",
            "council",
            "research"
          ],
          "links": [
            "/alpr/tracker#collection-heading",
            "/research#records-history",
            "/alpr/council-document-keyword-search.json"
          ]
        },
        {
          "id": "2026-10-02-day-chart-record-counts",
          "date": "2026-10-02",
          "type": "feature",
          "title": "One Flock camera chart on the ALPR tracker, from the 2022 pilot to today",
          "summary": "Reader request: keep the camera rollout in one chart. The ALPR tracker's \"Flock's figures over time\" chart now carries, in its Cameras view, a third category beside this site's daily collection and the archived captures: the counts City and police records state on their own dates (12 installed in June and July 2022, 14 in September 2022, 18 devices in February 2024), plus the February 2024 overview's planned total of 52, marked as a plan, not a count. Each record point opens its record, on a calendar axis. Orders and invoices are numbered marks and are never added up; nothing is filled in between records. The separate \"Flock cameras over time, as the records state them\" chart added earlier today is folded into it. The marks are now numbered from 1 in this chart, replacing a lone \"9\".",
          "areas": [
            "alpr"
          ],
          "links": [
            "/alpr/tracker#camera-history"
          ]
        },
        {
          "id": "2026-10-02-rollout-milestones",
          "date": "2026-10-02",
          "type": "feature",
          "title": "Charts on /local mark the Flock rollout steps the records state",
          "summary": "The numbered milestone lines on /local's crime, pay and income charts now include the Flock rollout steps the released records state, beside the Council's approval stages: the 2022 pilot order, the September 26, 2022 memo's 14 installed and functional cameras, the March 31, 2023 order, the February 12, 2024 white paper's 18 devices and 52 expected, the May 8, 2024 order, and the June 3, 2024 invoice. Each key line names its record and page. Figures are never added together, and a marker shows when something happened, not that it changed the line. Milestones in the same year now share one numbered tag.",
          "areas": [
            "alpr",
            "site"
          ],
          "links": [
            "/local",
            "/records-requests#camera-orders"
          ]
        },
        {
          "id": "2026-10-02-tracker-2024-report-milestones",
          "date": "2026-10-02",
          "type": "feature",
          "title": "The 2024 police annual report's plate-reader and Fusus statements on the ALPR tracker's charts",
          "summary": "The ALPR tracker's history charts now also mark two statements from the Police Department's 2024 annual report, in the report's own words with its page: that plate readers were added to patrol-car dash cameras that year (page 14), and its description of Fusus by Axon and the real-time center (page 15). Fusus is the department's camera integration platform, not a plate reader, and the mark does not call it one. On the Police page's year-over-year table, the 2024 real-time entry now quotes the report's sentence naming Fusus by Axon.",
          "areas": [
            "alpr",
            "police"
          ],
          "links": [
            "/alpr/tracker#camera-history",
            "/police"
          ]
        },
        {
          "id": "2026-10-02-tracker-altoona-offenses-vs-clearances-chart",
          "date": "2026-10-02",
          "type": "feature",
          "title": "Tracker: Altoona's offenses and clearances get their own chart under the crime rates",
          "summary": "On /alpr/tracker, the clearances line came off the crime-rate chart, which now has toggles for Altoona, Iowa, the U.S. and the Polk County Sheriff's Office. A second chart under it shows only Altoona: offenses reported and offenses cleared each year, as the counts Altoona PD reported to the FBI.",
          "areas": [
            "alpr",
            "local"
          ],
          "links": [
            "/alpr/tracker#crime-context"
          ]
        },
        {
          "id": "2026-10-02-tracker-axon-daily-lines",
          "date": "2026-10-02",
          "type": "feature",
          "title": "Axon's own 30-day figures join the tracker's figures-over-time chart",
          "summary": "On /alpr/tracker, the Vehicles detected and Hotlist hits views of the figures-over-time chart now draw Axon's own 30-day figures (plate reads retained, and hotlist hits) as a separate line from this site's daily collection of Axon's public page, never added to Flock's. Flock's own 30-day lines now show every daily reading collected, not just the latest. Axon publishes no camera or search count, so those views stay Flock only. The chart heading now names the figure you picked. Reader question: does Axon's system report activity on the same scale as Flock's, and how has each changed day to day?",
          "areas": [
            "alpr"
          ],
          "links": [
            "/alpr/tracker#camera-history"
          ]
        },
        {
          "id": "2026-10-02-tracker-axon-readings-table",
          "date": "2026-10-02",
          "type": "feature",
          "title": "The tracker's Axon source card lists Axon's collected readings",
          "summary": "On /alpr/tracker, \"Where the tracker gets its figures\" now gives the Axon card a table of every Axon reading this site has collected, newest first: plate reads retained and hotlist hits, each a 30-day figure on Axon's own data date, matching the Flock card's table. Axon publishes no camera or search count.",
          "areas": [
            "alpr"
          ],
          "links": [
            "/alpr/tracker#collection-heading"
          ]
        },
        {
          "id": "2026-10-02-tracker-camera-trend-line",
          "date": "2026-10-02",
          "type": "feature",
          "title": "The tracker's camera chart adds a trend line and drops the planned total",
          "summary": "On the ALPR tracker, \"Flock's figures over time\" now draws one dashed straight line through every camera count on the chart (the counts the City and police records state, archived portal captures and the daily collection), carried two years past the latest count. It is this site's arithmetic, not a forecast by the City, the police or Flock, and the chart's notes say how it is drawn. The planned total from a 2024 police record is no longer drawn on the chart; the record itself is still quoted in the memo timeline.",
          "areas": [
            "alpr"
          ],
          "links": [
            "/alpr/tracker#camera-history"
          ]
        },
        {
          "id": "2026-10-02-tracker-camera-years-best-known",
          "date": "2026-10-02",
          "type": "feature",
          "title": "The tracker's by-year camera line now reaches back to the 2022 pilot, with its math shown",
          "summary": "On /alpr/tracker, the by-year camera panel beside reported crime is now one line of the best-known Flock camera count each year, not just 2025 and 2026: 2022 from the Police Department memo's installed count, 2023 from Flock's invoice, 2024 as this site's arithmetic of three Flock invoices (18 + 2 + 29 = 49 cameras billed, each order counted once), then Flock's portal. A note under the chart lists every year's source. Invoices show cameras billed, not installed; orders are never counted; Axon's plate readers are not in the count because no source states one. Reader question: how many Flock cameras did Altoona have each year since the pilot?",
          "areas": [
            "alpr"
          ],
          "links": [
            "/alpr/tracker#crime-context"
          ]
        },
        {
          "id": "2026-10-02-tracker-chart-timeline-links",
          "date": "2026-10-02",
          "type": "feature",
          "title": "The tracker's camera chart and its memo timeline point to each other",
          "summary": "On the ALPR tracker, each record-stated camera count in \"Flock's figures over time\" now opens that record's entry in the dated memo timeline, and each timeline entry with a count links back to the chart. Both read the same camera-count data, so a date or count cannot differ between them.",
          "areas": [
            "alpr"
          ],
          "links": [
            "/alpr/tracker#camera-history"
          ]
        },
        {
          "id": "2026-10-02-tracker-crime-lines-with-clearances",
          "date": "2026-10-02",
          "type": "feature",
          "title": "Tracker: Altoona's FBI clearances on the same crime chart as the offense rates, with a toggle for each line",
          "summary": "On /alpr/tracker, the reported-crime panel draws Altoona PD's clearances as a dotted line on the same chart and scale as the offense rates (clearances per 100,000 residents, this site's arithmetic from the FBI's own rate), instead of behind a separate measure. Each line (Altoona, Iowa, U.S., Polk County Sheriff's Office, Altoona cleared) has its own toggle, and the table lists the clearances as reported. The note says a clearance counts an offense closed that year, not the year it happened, and that the figures cannot show whether cameras changed crime.",
          "areas": [
            "alpr",
            "local"
          ],
          "links": [
            "/alpr/tracker#crime-context"
          ]
        },
        {
          "id": "2026-10-02-tracker-memo-timeline",
          "date": "2026-10-02",
          "type": "feature",
          "title": "Flock camera counts over time on the ALPR tracker, and the police memos as one dated list",
          "summary": "Reader request: chart the growth of Altoona's Flock cameras from the records. The ALPR tracker now has a chart of every Flock camera count the records state, each as its own dated point linked to its record: the police memos of June, July and September 2022, the February 2024 overview (with its expected total marked as a plan, not a count), and Flock's own portal count from July 2025. Orders and invoices are marked as events and never added up, since the records do not say whether a later order adds to an earlier one; nothing is projected. The chart has a table and a CSV. The memo card is now a dated list of the same memos and the overview: the people each names, linked to their profiles, the counts in the record's own words, a link to its redacted copy, and the next Council meeting with what a keyword search found in its minutes. The tracker's camera-history charts also mark the rollout steps the records state.",
          "areas": [
            "alpr"
          ],
          "links": [
            "/alpr/tracker#flock-camera-growth",
            "/alpr/tracker#collection-heading",
            "/records-requests#records"
          ]
        },
        {
          "id": "2026-10-02-tracker-one-camera-line-community-clearances",
          "date": "2026-10-02",
          "type": "feature",
          "title": "Tracker: one 'Cameras discovered in Altoona' line with the community-mapped count beside it, change between readings, and FBI clearances",
          "summary": "On /alpr/tracker, the Cameras view is now one line, 'Cameras discovered in Altoona', through every dated count: the records' stated counts from June 3, 2022, the cameras Flock's invoices bill (18 + 2 = 20 by June 3, 2024 and 18 + 2 + 29 = 49 by July 5, 2024, this site's arithmetic), then Flock's portal. Every step is listed under the chart. The community-mapped count (42 on July 23, 2025, 67 on September 27, 2026; unverified) is its own line beside it and can be switched off. The separate by-year camera panel folded into this chart. The 30-day views' table adds the change from the previous reading. The crime panel adds the clearances Altoona PD reported to the FBI as a second measure, with the caveat that clearances are not cases solved and cannot show whether cameras helped. Reader question: how many cameras has Altoona had over time, by every count on file?",
          "areas": [
            "alpr",
            "local"
          ],
          "links": [
            "/alpr/tracker#camera-history",
            "/alpr/tracker#crime-context"
          ]
        }
      ]
    },
    {
      "id": "2026-10-02-roundup-council-record-timeliness-types-and-presence",
      "date": "2026-10-02",
      "type": "roundup",
      "title": "Council record: how late the City posts records, meeting types, officials present back to 2020, and the September 21 and 28 minutes",
      "summary": "The Council page now shows, for every known meeting since 2020, how many whole days ahead the City posted the agenda and how many days after the meeting it posted the minutes, with the median by year as a chart. Every known meeting carries its type (regular, special, budget, or workshop), each meeting total says how it splits and whether workshops are included, and the April 1, 2024 budget hearing keeps its own records instead of borrowing the regular meeting's. City officials listed in the minutes are now recorded for 27 more meetings, five late arrivals and one presiding officer are added, and each records block says how current it is. The September 21, 2026 Council minutes and the September 28 workshop minutes are on the site.",
      "areas": [
        "charts",
        "council",
        "data",
        "local",
        "pay",
        "people",
        "research",
        "site",
        "transparency",
        "votes"
      ],
      "links": [
        "/council#records-timeliness",
        "/council#presence-grid-section",
        "/votes",
        "/transparency#missing-records"
      ],
      "changes": [
        {
          "id": "2026-10-02-council-records-timeliness",
          "date": "2026-10-02",
          "type": "feature",
          "title": "How late the City posts Council agendas and minutes",
          "summary": "The Council page now shows, for every known meeting since 2020, how many days ahead the City put the agenda on its website and how many days after the meeting it put up the minutes, measured from each file's save time on the City's web server, with the median by year as a chart and every meeting in a table you can filter by year and meeting type. Where a file time can't stand for the first posting (the City re-uploaded most 2020 to 2022 files in batches), the meeting shows a gap and the reason, never an estimate. Answers: does the City get its Council records out promptly?",
          "areas": [
            "council",
            "data",
            "charts"
          ],
          "links": [
            "/council#records-timeliness"
          ]
        },
        {
          "id": "2026-10-02-council-records-timeliness-whole-days",
          "date": "2026-10-02",
          "type": "data-update",
          "title": "Agenda posting lead now counted in whole days",
          "summary": "The Council page's agenda and minutes posting times are now both counted in whole calendar days, Central time: an agenda put up on a Friday for a Monday meeting is 3 days ahead. Earlier today the agenda figure was shown to a tenth of a day from the file's save time. No meeting moved from measured to a gap or back.",
          "areas": [
            "council"
          ],
          "links": [
            "/council#records-timeliness"
          ]
        },
        {
          "id": "2026-10-02-data-freshness-stamp",
          "date": "2026-10-02",
          "type": "feature",
          "title": "Each records block says how current it is",
          "summary": "Reader question: is this the latest, or has the site just not caught up? The vote tracker, the City Council page, Public pay, the Transparency archive chart, the Census and FBI sections of the Local corner, and the research notebook's camera-count table now each show a short line with the newest record they hold (for example \"Roll calls through September 28, 2026\") and, where the data carries one, when it was last updated or retrieved.",
          "areas": [
            "site",
            "votes",
            "council",
            "pay",
            "local",
            "research",
            "transparency"
          ],
          "links": [
            "/votes",
            "/council",
            "/pay",
            "/transparency",
            "/local#numbers-heading",
            "/research#camera-counts-heading"
          ]
        },
        {
          "id": "2026-10-02-meeting-count-labels-name-their-set",
          "date": "2026-10-02",
          "type": "data-fix",
          "title": "Meeting counts say whether they include workshops",
          "summary": "Answers \"why does one page say 164 of 166 meetings and another 162 of 164?\". With a second Council workshop now on the record, the homepage and /votes count every known meeting, workshops included, while /council and /people count Council meetings only. Each count now says which it is. The homepage and Local corner's \"Latest minutes\" line names the kind of meeting (the latest is now the September 28 workshop), and /council's presence line says it runs through the latest Council meeting. No figure changed.",
          "areas": [
            "votes",
            "council",
            "people",
            "local",
            "site"
          ],
          "links": [
            "/",
            "/votes",
            "/council",
            "/people",
            "/local"
          ]
        },
        {
          "id": "2026-10-02-meeting-types",
          "date": "2026-10-02",
          "type": "feature",
          "title": "Workshops and other meeting types counted as their own kind",
          "summary": "Every known Council meeting now carries its type (regular, special, budget, or workshop), and each meeting total on the homepage, the vote tracker, and the Transparency page says how it splits by type. Figures that leave workshops out, such as meeting length and attendance on the Council page, now say so beside the count. Answers: what kinds of meetings are in each total?",
          "areas": [
            "council",
            "votes",
            "data"
          ],
          "links": [
            "/council",
            "/votes",
            "/transparency#missing-records"
          ]
        },
        {
          "id": "2026-10-02-officials-present-backfill",
          "date": "2026-10-02",
          "type": "data-fix",
          "title": "City officials' attendance now covers every readable Council meeting since 2020",
          "summary": "Reader question: who from City staff was in the room? The Council page's \"Presence over time\" chart and the People pages now show the City officials listed in the minutes for 27 more Council meetings: 26 from May 2022 through December 2023, and July 20, 2026. Eight of those minutes are scanned images; their lists were read from the page and are marked as such in the data. Every readable Council meeting since 2020 now shows who was listed under City Officials Present, and each official's meeting count rose to match (the longest-listed official now appears at 159 meetings). The July 27, 2026 workshop and the meetings with no readable minutes are unchanged.",
          "areas": [
            "council",
            "people",
            "data"
          ],
          "links": [
            "/council#presence-grid-section",
            "/people"
          ]
        },
        {
          "id": "2026-10-02-roll-call-late-arrivals",
          "date": "2026-10-02",
          "type": "data-fix",
          "title": "Five late arrivals and one presiding officer added to the Council record",
          "summary": "Reader question: who was in the room when each meeting started? Five Council roll calls print a member as present with an arrival time, such as \"present @ 6:32\": December 20, 2021; January 3, 2023; February 20, 2023; March 6, 2023; and July 6, 2026. Those members were already counted present; the Council page's \"Presence over time\" chart and the meeting records now also show them as arriving late, with the printed time. The December 19, 2022 meeting now names Mayor Pro Tem Jeremy Boka as presiding, since the mayor was absent and the minutes have him running the meeting, and his two recorded requests from that meeting now appear among officials' remarks.",
          "areas": [
            "council",
            "votes",
            "data"
          ],
          "links": [
            "/council#presence-grid-section",
            "/votes"
          ]
        },
        {
          "id": "2026-10-02-same-day-sessions-keep-their-own-records",
          "date": "2026-10-02",
          "type": "data-fix",
          "title": "April 1, 2024 budget hearing no longer borrows the regular meeting's records",
          "summary": "April 1, 2024 had two sessions: a short budget hearing at 6:15 pm and the regular meeting at 6:30 pm. The budget hearing's minutes list no City officials present, no public comment and no remarks. /votes showed the regular meeting's 12 officials, 3 public comments and 8 remarks under the budget hearing too, which is why /council's attendance grid looked like it disagreed. Both pages now decide which session a record belongs to with one shared rule, based on the minutes file it came from. The budget hearing now says its minutes print no officials list, and the grid's note for that column says the same. No count changed.",
          "areas": [
            "votes",
            "council"
          ],
          "links": [
            "/votes",
            "/council"
          ]
        },
        {
          "id": "2026-10-02-sept-21-minutes-and-sept-28-workshop",
          "date": "2026-10-02",
          "type": "data-update",
          "title": "September 21 minutes and the September 28 workshop are in",
          "summary": "Answers \"what happened at the last Council meetings?\". The City posted the September 21, 2026 Council minutes and the minutes of a September 28 Council workshop, and both are now on the site: 8 roll-call votes with movers and seconders, who was present (Council Members Dunwoody and McFadden were absent on September 21; McFadden and Stewart on September 28), the workshop's discussion topics, official remarks, City officials present, and the four residents who spoke during public comment on September 21, all on the cameras. Known Council meetings since 2020 rise from 165 to 166 with the second workshop, and the September 21 meeting leaves the Missing records list. The October 5 agenda is on /local.",
          "areas": [
            "votes",
            "council",
            "people",
            "local"
          ],
          "links": [
            "/votes",
            "/council",
            "/transparency#missing-records",
            "/local"
          ]
        }
      ]
    },
    {
      "id": "2026-10-02-roundup-charts-and-about",
      "date": "2026-10-02",
      "type": "roundup",
      "title": "Charts: the data comes first, readings connect across gaps, milestone tags keep clear, hover cards rank by value, sale prices draw as lines in color, and /local compares with the area; About's costs add up",
      "summary": "Line charts across the site now join two readings across dates with no reading using a thin dashed line, leaving the dates between blank rather than zero, and the numbered milestone tags above the crime charts stagger so they no longer print over each other or the end value. The median home sale price chart on /local opens as a line graph with Altoona in bold city gold and the nearest metro cities in their own colors, and every multi-line chart's hover card now lists lines from highest to lowest on the hovered date. The Census and offense-rate charts on /local gain a Compare with switch that adds Polk County, nearby cities, other Des Moines-area places, Iowa or the U.S. as gray dashed reference lines, each naming its source. About's site-traffic charts gain day and hour range switches, its project-costs total is now calculated from its own lines (under $1,000, with request fees as one under-$200 figure), and its archive coverage chart becomes a one-sentence summary above the by-year table.",
      "areas": [
        "about",
        "alpr",
        "local",
        "site",
        "transparency",
        "votes"
      ],
      "links": [
        "/alpr/tracker#camera-history",
        "/local#property-values",
        "/about#costs",
        "/about#site-traffic",
        "/local"
      ],
      "changes": [
        {
          "id": "2026-10-02-about-costs-calculated",
          "date": "2026-10-02",
          "type": "data-update",
          "title": "About: project costs total is calculated from its lines",
          "summary": "The \"What the project costs\" section on About now works out its total and its as-of date from the cost categories themselves, so the sentence, the table and the total always agree. Public-records request fees are shown as one \"under $200\" figure, and the total as an upper bound (under $1,000).",
          "areas": [
            "site",
            "transparency"
          ],
          "links": [
            "/about#costs"
          ]
        },
        {
          "id": "2026-10-02-altoona-city-gold",
          "date": "2026-10-02",
          "type": "feature",
          "title": "Altoona's line is the city's gold on every chart",
          "summary": "Wherever a chart compares Altoona with other places, Altoona's line, key entry, switch and hover-card mark are now the city's gold in light and dark mode. The other lines keep colors that stand apart from gold: on /local, Iowa moves to blue and the Polk County Sheriff's Office to purple. No figure changed.",
          "areas": [
            "site",
            "local"
          ],
          "links": [
            "/local#property-values",
            "/local#by-the-numbers"
          ]
        },
        {
          "id": "2026-10-02-archive-coverage-summary",
          "date": "2026-10-02",
          "type": "feature",
          "title": "About: the archive coverage chart becomes a one-line summary",
          "summary": "The chart of agendas and minutes the City's archive posted each year drew two flat lines near 100%, so it is gone. In its place, one sentence says how many agendas and minutes are missing and in which years, above the same by-year table. The date line above it now reads as two separate dates.",
          "areas": [
            "votes"
          ],
          "links": [
            "/about#archive-coverage-heading"
          ]
        },
        {
          "id": "2026-10-02-chart-hover-order-and-line-colors",
          "date": "2026-10-02",
          "type": "feature",
          "title": "Chart hover cards list the highest value first, and more lines get their own colors",
          "summary": "Reader question: which line is on top on this date, and which line is which? On every chart with several lines, the hover card now lists the lines from highest to lowest value on the hovered date, with any line that has no reading that date at the bottom. Lines beside a bold main line now take colors from a larger eight-color set instead of all being gray, so the median sale price chart on /local shows Altoona in bold blue and the nearest cities in their own colors; past eight lines the rest stay gray. Each line, its key entry, its switch and its hover-card mark now always show the same color. No figure changed.",
          "areas": [
            "site",
            "local"
          ],
          "links": [
            "/local#property-values"
          ]
        },
        {
          "id": "2026-10-02-chart-milestone-tags-keep-clear",
          "date": "2026-10-02",
          "type": "feature",
          "title": "Chart milestone numbers keep clear of each other and of the end value",
          "summary": "The numbered milestone tags above the crime-context panels on /alpr/tracker and the FBI rate figures on /local now stagger by their real width, so a grouped tag such as \u201c5\u201310\u201d no longer prints over its neighbor. A tag that would land on the chart\u2019s end value moves up a row instead. A reference line\u2019s label (the base year on the /design indexed demo) now stays inside the chart.",
          "areas": [
            "site",
            "alpr",
            "local"
          ],
          "links": [
            "/alpr/tracker",
            "/local"
          ]
        },
        {
          "id": "2026-10-02-charts-connect-readings",
          "date": "2026-10-02",
          "type": "feature",
          "title": "Line charts now connect readings across dates with no reading",
          "summary": "Line charts across the site, including Flock's figures on the ALPR tracker and the reported-crime charts on /local, now join two readings with a thin dashed line when there are dates with no reading between them, so a dotted series reads as one line. The dates between stay blank, never zero, and each chart's notes say the dashed lines are not readings. Only the tracker's camera chart carries a trend line past the latest reading.",
          "areas": [
            "alpr",
            "local"
          ],
          "links": [
            "/alpr/tracker#camera-history",
            "/local"
          ]
        },
        {
          "id": "2026-10-02-data-first-design-pass",
          "date": "2026-10-02",
          "type": "feature",
          "title": "Charts put the data first, and long pages are easier to scan",
          "summary": "Every chart's controls are smaller: the view switch is one compact bar, series switches are small pills, extra options sit behind one Options button, and citing, copying the link and downloading the data share one Cite & download button under the chart. The key to a chart's numbered lines folds behind a one-line summary. Across the site, a gold-and-black accent marks where sections start, what kind of content each figure is, and every section that opens for more; the tracker's records timeline leads each step with the record's own words and folds the rest. No figure changed.",
          "areas": [
            "site",
            "alpr"
          ],
          "links": [
            "/alpr/tracker#camera-history",
            "/local"
          ]
        },
        {
          "id": "2026-10-02-local-compare-with-reference-levels",
          "date": "2026-10-02",
          "type": "feature",
          "title": "Compare Altoona's Census and crime-rate charts with Polk County, nearby cities, Iowa and the U.S.",
          "summary": "The Census charts and the two offense-rate charts on /local now have a Compare with switch. It adds Polk County, the cities within 10 miles, other Des Moines-area places, Iowa or the U.S. as gray dashed lines beside Altoona's own line, wherever the published reference figures cover those years. Each added line names its source and, for a group of places, every place behind it, in the chart's notes; the table and downloads include it. Answers: is Altoona's figure typical for the area?",
          "areas": [
            "local"
          ],
          "links": [
            "/local"
          ]
        },
        {
          "id": "2026-10-02-reads-chart-range-switch",
          "date": "2026-10-02",
          "type": "feature",
          "title": "Site traffic charts get day and hour range switches",
          "summary": "The reads per day chart on About can now show the last 7 days, the last 30 days, or every day since counting began, and the reads per hour chart the last 24 or 48 hours. The choice stays in the page address so a view can be shared. Labels no longer collide: a partial hour near zero is labeled above its point instead of over the time axis, and a first point sitting on the baseline no longer shows a number that looked like an axis tick.",
          "areas": [
            "about"
          ],
          "links": [
            "/about#site-traffic"
          ]
        },
        {
          "id": "2026-10-02-sale-price-trend-lines",
          "date": "2026-10-02",
          "type": "feature",
          "title": "Home sale prices now draw as a line graph",
          "summary": "Reader question: how have Altoona's home sale prices moved next to nearby cities? The median residential sale price chart on the Local page now opens as a line graph, with Altoona in color and the other metro cities as gray lines behind it. Hover or tap a year to see every city's figure. Years without enough sales stay gaps, and 2026 is still marked partial. Small multiples, the table and the list are still there, and the table's value sort now says which city it sorts by.",
          "areas": [
            "site"
          ],
          "links": [
            "/local#property-values"
          ]
        }
      ]
    },
    {
      "id": "2026-10-02-no-hand-checked-claims",
      "date": "2026-10-02",
      "type": "correction",
      "title": "The site no longer says its records were checked or reviewed by hand",
      "summary": "Several pages said records were reviewed or checked by hand, including the votes from eight scanned sets of minutes, which were re-read from the scan images with an AI model. No person reviewed them that way, so those words are gone and the source lines say what was actually done.",
      "areas": [
        "votes",
        "about",
        "people"
      ],
      "links": [
        "/about#known-limits",
        "/votes"
      ]
    },
    {
      "id": "2026-10-02-flock-readings-not-read-by-hand",
      "date": "2026-10-02",
      "type": "correction",
      "title": "The tracker no longer says Flock readings were read by hand",
      "summary": "The ALPR tracker labeled the figures taken from Flock's own portal as read by hand. The record shows only that they were recorded from the portal, which blocks automated tools, rather than by the site's daily collection; it does not show that a person read them. They are now labeled Flock portal readings, and the figures are unchanged.",
      "areas": [
        "alpr"
      ],
      "links": [
        "/alpr/tracker"
      ]
    },
    {
      "id": "2026-10-02-council-year-meeting-count",
      "date": "2026-10-02",
      "type": "correction",
      "title": "Council page: yearly meeting count no longer counts workshops on one side only",
      "summary": "The Meeting time table on the Council page showed 2026 as 18 of 20 meetings: the 18 left workshops out but the 20 counted the year's two workshops, so it looked as if two meetings had no minutes. It now reads 18 of 18 plus 2 workshops. No meeting or minutes count changed.",
      "areas": [
        "council"
      ],
      "links": [
        "/council#meeting-length-section"
      ]
    },
    {
      "id": "2026-10-02-auto-refresh-area-context-camera-total",
      "date": "2026-10-02",
      "type": "data-update",
      "title": "Daily data refresh: Altoona by the numbers, community camera total",
      "summary": "Automatic daily refresh. Altoona by the numbers 16 to 16; community camera total 67 to 67.",
      "areas": [
        "alpr",
        "local"
      ],
      "links": [
        "/alpr/tracker",
        "/local",
        "/research"
      ]
    },
    {
      "id": "2026-10-02-audience-couples-counted",
      "date": "2026-10-02",
      "type": "correction",
      "title": "Public turnout counted couples as one person",
      "summary": "When the minutes list a couple in the audience as \"Pat & Kim Sample\", the public turnout count on /council treated them as one person; \"Pat and Kim Sample\" was already counted as two. Fifteen meetings from 2023 to 2026 each gain one to four people, 23 in all (2023 +4, 2024 +11, 2025 +5, 2026 +3). No vote, attendance, or public-comment record changed.",
      "areas": [
        "council",
        "votes"
      ],
      "links": [
        "/council"
      ]
    },
    {
      "id": "2026-09-28-why-page",
      "date": "2026-09-28",
      "type": "feature",
      "title": "A new page says why this site exists",
      "summary": "Reader question: why does this site exist, and what does it believe? The new Why page opens with the site's mission, including what it does not argue: whether the cameras work. Seven cards, each labeled as the site's position, then set out why, with the records behind each: the vendors' own read counts and our per-day average, every camera item in the Council minutes since 2020 and how it passed, the City's approval timeline checked against the minutes, how often the Council's roll calls draw a no vote, Flock camera counts for nearby police departments from archived snapshots, officials' recorded words quoted from the minutes, two Supreme Court location-tracking rulings, and labeled outside reporting. The police page now shows the site's position, marked as such, under each of the department's and City's stated claims, with the original statements unchanged. Linked from the News & research menu, the footer, About, the police page and the ALPR tracker.",
      "areas": [
        "site"
      ],
      "links": [
        "/why",
        "/police"
      ]
    },
    {
      "id": "2026-09-28-roundup-vote-record-reparse-and-consistent-counts",
      "date": "2026-09-28",
      "type": "roundup",
      "title": "Vote record: minutes re-parse finished, a directory review pass, and consistent meeting counts",
      "summary": "The Council minutes re-parse is complete: remarks grew from 844 to 882, public-comment coverage from 152 to 160 meetings (adding hand-curated comment for the eight scanned 2022 and 2023 meetings), and minutes mentions from 3,922 to 4,076, with every vote record reconciled against the live feed. A review pass on the Property and business directory resolved 79 queued candidates: 72 entities promoted, 3 reclassified as household matters, and 17 rejected as parse artifacts. Meeting counts now say what they count (161 Council meetings with a recorded roll call, or 162 counting the July 2026 workshop, against 164 and 165 known meetings), the Mayor's card is labeled Mayor and explains presided versus present, and remarks and mentions use the one label, address withheld. The Transparency page lists five known limits of the vote record.",
      "areas": [
        "council",
        "data",
        "people",
        "site",
        "votes"
      ],
      "links": [
        "/votes",
        "/people",
        "/council#meeting-time",
        "/transparency"
      ],
      "changes": [
        {
          "id": "2026-09-28-business-directory-review-pass",
          "date": "2026-09-28",
          "type": "data-update",
          "title": "Property & business directory: 79 review-queue candidates resolved",
          "summary": "Worked the 207-item property/business linkage review queue down against explicit rules: 72 entities promoted (a business-form/institutional token, a public body, a corpus match to an already-promoted entity, or a named plat/addition/development, each verified against the printed text; some after correcting a truncated or over-captured extraction span to the complete printed name), 3 reclassified household (a bare landowner name in a Plat-of-Survey request position; id and matter type only, no name), and 17 rejected as parse artifacts (a parcel/lot identifier, or a garbled/truncated span with no usable name). A grammar fix along the way (case-insensitive plat-name matching, a curly-apostrophe character-class gap) surfaced and closed a real classification bug: a joined clause naming a private individual together with a business co-party is now never classified business (it would have published the private party's name) or household (it would have hidden the real business match) -- left unclear for an editor to split. 4 candidates stay unclear as genuinely ambiguous (capped, for a human editor); 148 stay unclear because they fall outside the four reviewed promotion rules entirely (mostly consent-list license-holder trade names with no business-form token) -- flagged as a separate, larger policy question rather than mixed into the small ambiguous list. related_entity across the vote corpus: 692 to 764; project_key: 284 to 336 (171 to 205 distinct projects); related_address unchanged at 132 (0 new addresses promoted -- every candidate address either failed the single-unambiguous-address test or its unit already carried a more precise address from the base collector). The MAT residential veto ran against all 6 addresses printed on any queue candidate; 0 vetoed.",
          "areas": [
            "votes"
          ],
          "links": [
            "/votes#property-business"
          ]
        },
        {
          "id": "2026-09-28-council-meeting-count-labels",
          "date": "2026-09-28",
          "type": "data-fix",
          "title": "Council page meeting counts say what they count",
          "summary": "The Council page's meeting-time section said 161 of 165 known Council meetings had readable minutes, but the 161 left out the one workshop while the 165 counted it. It now reads 161 of 164 with workshops left out, and 162 of 165 counting the workshop, the same total the homepage and the votes page show. The public-turnout summary now says its count is meetings whose minutes record the audience, not a total of meetings. No figure below either line changed.",
          "areas": [
            "council"
          ],
          "links": [
            "/council#meeting-time"
          ]
        },
        {
          "id": "2026-09-28-known-limits-vote-record-transparency",
          "date": "2026-09-28",
          "type": "feature",
          "title": "Transparency page now lists known limits of the vote record",
          "summary": "Five editor-reviewed limits on vote tallies, People profiles and Council presence now appear on /transparency as a short, collapsed \"Known limits of the vote record\" list, right under the Missing records table.",
          "areas": [
            "votes",
            "site"
          ],
          "links": [
            "/transparency",
            "/votes/meeting-coverage.json"
          ]
        },
        {
          "id": "2026-09-28-mayor-card-label-and-presided-note",
          "date": "2026-09-28",
          "type": "data-fix",
          "title": "Mayor's card is labeled Mayor and explains presided vs. present",
          "summary": "On the People page the Mayor's card was labeled \"Council member\". It now reads Mayor. The Mayor's cards on People and Council showed 132 meetings present but 134 presided, which read as a contradiction. At two April 2020 remote meetings the minutes' opening roll call reads absent while the same minutes record the Mayor chairing the meeting. Both counts stay as the minutes print them, and the cards now say \"presided 134 (2 where the roll call reads absent)\".",
          "areas": [
            "people",
            "council"
          ],
          "links": [
            "/people?category=council",
            "/council"
          ]
        },
        {
          "id": "2026-09-28-minutes-reparse-and-ocr-remarks",
          "date": "2026-09-28",
          "type": "data-update",
          "title": "Public comment from eight scanned 2022 and 2023 meetings added",
          "summary": "Public comment from eight Council meetings whose minutes survive only as scans (November 7 and 21 and December 5 and 19, 2022; February 20, March 6, May 1 and May 15, 2023) is now on the Votes page, including eight residents who spoke at the December 5, 2022 annexation public hearing, each shown as first name and last initial. One more speaker is left out because only a surname survived in the scanned text. A fresh read of every known meeting's minutes, January 6, 2020 through September 8, 2026, also fixed scanning errors that hid some officials' remarks (\"Mavor\" now reads as \"Mayor\"), and every vote record matched the earlier read. Public comment now covers 160 meetings, 58 of them with recorded speakers, and official remarks grew from 844 to 882.",
          "areas": [
            "votes",
            "people"
          ],
          "links": [
            "/votes",
            "/people"
          ]
        },
        {
          "id": "2026-09-28-one-address-redaction-label",
          "date": "2026-09-28",
          "type": "data-fix",
          "title": "Remarks and mentions now say \"[address withheld]\", matching Votes",
          "summary": "Council remarks and People's minutes mentions printed a resident's redacted street address as \"[address omitted]\"; Votes already used \"[address withheld]\" for the same kind of redaction. Both now use the same label. No address, redaction rule, or matching pattern changed -- only the bracketed wording a reader sees.",
          "areas": [
            "votes",
            "people",
            "council"
          ],
          "links": [
            "/votes",
            "/people"
          ]
        },
        {
          "id": "2026-09-28-roll-call-meeting-count-label",
          "date": "2026-09-28",
          "type": "data-fix",
          "title": "Council's meeting-length line and People's roster note name the 161-meeting count plainly",
          "summary": "The Council page's meeting-length line and the People page's roster note said \"meetings with readable minutes\" for a count of 161, while the homepage, Votes and People use the same phrase for 162 meetings, which includes the July 27, 2026 workshop. Both numbers were right. The 161 count, which leaves out the workshop, now reads \"Council meetings with a recorded roll call\" wherever it appears, and the People note states both counts in short sentences. A new automated check compares every shared headline number across pages against its source feed.",
          "areas": [
            "council",
            "people"
          ],
          "links": [
            "/council",
            "/people"
          ]
        }
      ]
    },
    {
      "id": "2026-09-28-roundup-shared-chart-component-and-lighter-pages",
      "date": "2026-09-28",
      "type": "roundup",
      "title": "Every chart on one shared component; the homepage and Activist page load far less data",
      "summary": "The Council, Votes, People, Local, Pay, and ALPR-tracker charts now share the site's figure controls: switch between chart forms and a table, filter, sort, download CSV or JSON, cite, and share a link that remembers the view. Every number is unchanged; the Census and FBI figures keep their modeled-trend bands, and the tracker's day-by-day chart still never models a trend. Two new charts on /pay show the police pay-step range by year and the stipend estimate as a share of the full rate. The homepage reads a 52 KB summary instead of 3.7 MB of vote, meeting, and remarks records, and the Activist page loads only the recent meetings it shows.",
      "areas": [
        "activist",
        "alpr",
        "charts",
        "council",
        "data",
        "homepage",
        "local",
        "pay",
        "people",
        "votes"
      ],
      "links": [
        "/council",
        "/votes",
        "/people",
        "/local",
        "/pay",
        "/alpr/tracker",
        "/"
      ],
      "changes": [
        {
          "id": "2026-09-28-activist-recent-votes-slice",
          "date": "2026-09-28",
          "type": "data-update",
          "title": "The activist page now loads only the recent meetings it shows",
          "summary": "/activist showed the four most recent Council meetings with a notable roll call, but it downloaded the entire vote tracker feed to do it. The page now loads a small slice with just the newest meetings' votes instead, and falls back to the full feed automatically if that slice is ever unavailable.",
          "areas": [
            "activist",
            "votes"
          ],
          "links": [
            "/activist"
          ]
        },
        {
          "id": "2026-09-28-council-votes-people-charts-on-dataview",
          "date": "2026-09-28",
          "type": "feature",
          "title": "Council, Votes, and People charts now share the site's figure controls",
          "summary": "The Council, Votes and People charts now share the site's figure controls: switch chart form, table or list, filter, sort, download, cite; time series that run to the present show a modeled range.",
          "areas": [
            "council",
            "votes",
            "people"
          ],
          "links": [
            "/council",
            "/votes",
            "/people"
          ]
        },
        {
          "id": "2026-09-28-homepage-summary-feed",
          "date": "2026-09-28",
          "type": "feature",
          "title": "The homepage loads a small summary instead of the full vote records",
          "summary": "The homepage used to download the complete vote, meeting and remarks records, about 3.7 MB, to show a few Council figures. It now reads a small summary built from those same records, about 52 KB (6 KB compressed), so it loads faster on phones and slow connections. Every figure on the homepage is unchanged, and the full records stay on the votes page and in the data downloads.",
          "areas": [
            "homepage",
            "data"
          ],
          "links": [
            "/",
            "/votes/homepage-summary.json"
          ]
        },
        {
          "id": "2026-09-28-local-alpr-pay-charts-on-dataview",
          "date": "2026-09-28",
          "type": "feature",
          "title": "Local, pay, and ALPR-tracker charts move onto the shared chart component",
          "summary": "The Census and FBI charts on /local (\u201cAltoona by the numbers\u201d), the Flock-figures-by-day chart on /alpr/tracker, and two new charts on /pay (a police pay-step range by year, and this page's own stipend estimate as a share of the full Mayor + Council rate) now use the site's shared interactive-chart component: a Form control (switch between a line, a range, bars, or a table, whichever apply), a Trend control on the figures that already modeled a trend, CSV/JSON download, a shareable link that remembers the chosen view, and a Cite button. Every number is unchanged; only how each chart is shown and controlled has changed. The Census and FBI figures keep the same modeled-trend bands they already showed, and the ALPR tracker's day-by-day chart still never models a trend, per the site's existing editorial decision that a projected line next to camera figures would misleadingly read as a prediction about cameras.",
          "areas": [
            "local",
            "alpr",
            "pay"
          ],
          "links": [
            "/local",
            "/pay",
            "/alpr/tracker"
          ]
        }
      ]
    },
    {
      "id": "2026-09-28-roundup-sale-price-trend-and-civic-map-privacy",
      "date": "2026-09-28",
      "type": "roundup",
      "title": "A residential sale-price trend for Altoona and 16 metro-ring cities since 1990; the civic map stops contacting outside servers",
      "summary": "/local adds a Residential sale-price trend, 1990 to present: the median arm's-length residential sale price and sale count each year from Polk County Assessor sales exports, first for Altoona, Pleasant Hill, Ankeny, and Bondurant and then all 17 incorporated Polk County places in the Des Moines metro ring, sorted nearest to Altoona first. A city-year with fewer than 20 sales shows as a gap, never a small unreliable number, and the notes say which nearby counties have no comparable public data. The civic district map now serves its map code from this site and makes no outside requests by default; OpenStreetMap street tiles are an opt-in switch whose label says they load from an outside service.",
      "areas": [
        "alpr",
        "data",
        "design-system",
        "local",
        "privacy"
      ],
      "links": [
        "/local#property-values",
        "/local/civic"
      ],
      "changes": [
        {
          "id": "2026-09-28-civic-map-no-outside-requests",
          "date": "2026-09-28",
          "type": "feature",
          "title": "Civic district map no longer contacts outside servers",
          "summary": "The civic district lookup's map used to load its map code from a public code host and its street tiles from OpenStreetMap, so both saw each visitor's IP address. The map code is now served from this site and the street tiles are gone: the map draws the precinct and police district outlines only, and the page makes no requests outside deflockaltoona.com. Lookups work as before.",
          "areas": [
            "local",
            "privacy"
          ],
          "links": [
            "/local/civic"
          ]
        },
        {
          "id": "2026-09-28-opt-in-street-basemap",
          "date": "2026-09-28",
          "type": "feature",
          "title": "An opt-in street map can now show under /local/civic's district map",
          "summary": "The civic district-lookup map can now show OpenStreetMap street tiles under the precinct and police-district outlines, off by default: a labeled switch says turning it on \"loads map tiles from OpenStreetMap, an outside service,\" and the page's privacy sentence changes to say so. The choice is remembered (one shared localStorage key) and ?basemap=on|off in the URL overrides it. No locations or lookups are ever sent to OpenStreetMap; only map-tile requests are, and only once the reader turns the switch on.",
          "areas": [
            "local",
            "alpr",
            "design-system"
          ],
          "links": [
            "/local/civic"
          ]
        },
        {
          "id": "2026-09-28-property-value-trend-all-polk-ring-cities",
          "date": "2026-09-28",
          "type": "data-update",
          "title": "Residential sale-price trend now covers all 17 Polk County cities in the metro ring",
          "summary": "The property-value trend on /local grew from 4 cities to all 17 incorporated Polk County places in the Des Moines metro ring around Altoona (Des Moines, West Des Moines, Urbandale, Clive, Johnston, Windsor Heights, Grimes, Polk City, Carlisle, Mitchellville, Runnells, Elkhart, and Alleman join Altoona, Pleasant Hill, Ankeny, and Bondurant), using the same public Polk County Assessor sales-export pattern already archived for the original four. Rows sort nearest-to-Altoona first, with the site's Series control folding anything past the 6 closest cities into a \"Show more\" list. Small towns with fewer than 20 sales in a given year show as a gap rather than a small, unreliable number -- Runnells and Alleman are suppressed in every year on file. Dallas, Story, and Marshall counties have property-value data but not sale-price data; Jasper, Warren, Marion, Boone, and Madison counties have no comparable public data collected at all -- both are stated in the figure's own notes.",
          "areas": [
            "local",
            "data"
          ],
          "links": [
            "/local#property-values"
          ]
        },
        {
          "id": "2026-09-28-property-value-trend-local",
          "date": "2026-09-28",
          "type": "feature",
          "title": "New: residential sale-price trend, Altoona and peer cities, 1990-present",
          "summary": "/local now has a \"Residential sale-price trend, 1990-present\" figure: the median arm's-length (\"Good\" analysis quality) residential sale price and sale count each year, for Altoona, Pleasant Hill, Ankeny, and Bondurant, drawn from Polk County Assessor sales exports. This is a sold-parcel sample, not a total assessed value and not a residential/commercial split -- the archived Assessor exports are residential sales files only, with no multi-year full parcel-roll census. A city-year with fewer than 20 sales is shown as a gap (suppressed), never a small, unreliable number. The yearly figures are also published as a downloadable data file.",
          "areas": [
            "local",
            "data"
          ],
          "links": [
            "/local#property-values"
          ]
        }
      ]
    },
    {
      "id": "2026-09-28-roundup-police-pay-across-contracts",
      "date": "2026-09-28",
      "type": "roundup",
      "title": "Police pay charted across every contract on file, 2007 to the most recent",
      "summary": "The Public pay page opens Earlier contracts with a chart of police pay from the lowest to the highest step in every Altoona police contract on file with the Iowa Public Employment Relations Board, each in its own printed unit (annual salaries through June 2012, hourly rates after). The 2016 to 2021 contract's last two raise columns, printed with typo dates, are now dated July 1, 2019 and July 1, 2020 from the contract's term and column order, so both charts show those years.",
      "areas": [
        "local",
        "pay"
      ],
      "links": [
        "/pay#history",
        "/local#pay-context"
      ],
      "changes": [
        {
          "id": "2026-09-28-pay-2019-2020-police-rates-charted",
          "date": "2026-09-28",
          "type": "feature",
          "title": "2019 and 2020 police hourly rates added to the pay charts",
          "summary": "The July 1, 2016 to June 30, 2021 police contract prints the dates of its last two raise columns as \"7/1/209\" and \"7/1/2010\". The pay feed now records their effective dates, July 1, 2019 and July 1, 2020, read from the contract's term and column order and noted beside the contract, so the police pay chart on /pay and the Census income comparison on /local show 2019 and 2020. The contract's table keeps the dates as printed.",
          "areas": [
            "pay",
            "local"
          ],
          "links": [
            "/pay#history",
            "/local#pay-context"
          ]
        },
        {
          "id": "2026-09-28-pay-contract-history-chart",
          "date": "2026-09-28",
          "type": "feature",
          "title": "Police pay charted across every contract on file",
          "summary": "Earlier contracts on /pay now opens with a chart of police pay from the lowest to the highest step in every Altoona police contract on file with the Iowa Public Employment Relations Board, 2007 to the most recent. Contracts through June 30, 2012 printed annual salaries and later ones print hourly rates, so each is charted in its own printed unit and neither is converted. Answers: how has police pay moved from contract to contract? Also fixed on every range chart on the site: a click or tap on a row now opens that row's own card instead of the first row's.",
          "areas": [
            "pay"
          ],
          "links": [
            "/pay#history"
          ]
        }
      ]
    },
    {
      "id": "2026-09-28-roundup-navigation-feeds-and-link-previews",
      "date": "2026-09-28",
      "type": "roundup",
      "title": "Navigation: the menu marks every page, links land on their target, and What's new has a feed",
      "summary": "The menu now names the page you are on even outside its five sections, Police Department is renamed Police accountability, and Council, Votes, and News get On this page lists. A link to part of a page drawn after it loads scrolls there, and short or mistyped addresses like /alpr go to the page they name. Every page shares one header line and one footer line, page titles shrink rather than split a word on phones, and the floating ALPR estimate steps aside for the On this page button. Shared links always carry a title, description, and preview image, and What's new and News can be followed as Atom or JSON feeds. Each day on What's new groups its changes by type.",
      "areas": [
        "council",
        "feeds",
        "navigation",
        "people",
        "seo",
        "site",
        "site-shell",
        "votes"
      ],
      "links": [
        "/whats-new",
        "/news",
        "/transparency"
      ],
      "changes": [
        {
          "id": "2026-09-28-contents-on-council-and-votes",
          "date": "2026-09-28",
          "type": "feature",
          "title": "On this page lists on Council, Votes and News; clearer menu names",
          "summary": "The Council page's On this page list now includes Public turnout and opens it when picked, and long pages with two main sections, like Votes and News, now get the list and the floating jump button too. In the menu, Police Department is now Police accountability and Meeting guide is now Meeting cheatsheet, matching the titles of the pages they open. The footer now links to the component gallery.",
          "areas": [
            "navigation",
            "council",
            "votes",
            "site"
          ],
          "links": [
            "/council",
            "/votes",
            "/news"
          ]
        },
        {
          "id": "2026-09-28-discoverability",
          "date": "2026-09-28",
          "type": "feature",
          "title": "Better link previews, and feeds for What's New and News",
          "summary": "Sharing a Deflock Altoona link now always shows a proper title, description, and preview image, even on the pages that were missing pieces of that before. The What's New log and the News archive can now be followed as a feed (RSS/Atom or JSON) the same way News already could, and every public data feed on the site now has a short, machine-readable description of what it is.",
          "areas": [
            "seo",
            "feeds",
            "navigation"
          ],
          "links": [
            "/whats-new",
            "/news"
          ]
        },
        {
          "id": "2026-09-28-links-land-on-their-target",
          "date": "2026-09-28",
          "type": "feature",
          "title": "Shared links land on the record they point to",
          "summary": "A link to part of a page that is drawn after it loads, such as a person's term dates on their profile, now scrolls to that spot instead of leaving you at the top. Short or mistyped addresses like /alpr, /tools, or /Council now go to the page they name, and any other missing page offers a site search for the words in the address.",
          "areas": [
            "navigation",
            "people",
            "site"
          ],
          "links": [
            "/people",
            "/alpr/tracker"
          ]
        },
        {
          "id": "2026-09-28-nav-marks-every-page",
          "date": "2026-09-28",
          "type": "feature",
          "title": "The menu shows where you are on every page",
          "summary": "About, Leave a message, Transparency, What's new, Search and the component gallery sit outside the five menu sections, so the menu used to mark nothing on those pages. It now names the page you are on at the end of the menu row whenever there is room, and the footer marks it too. The footer's Report an error link now opens the message form with the subject set to a correction request, and Transparency has its own footer link.",
          "areas": [
            "navigation",
            "site"
          ],
          "links": [
            "/transparency",
            "/contact?topic=correction"
          ]
        },
        {
          "id": "2026-09-28-one-header-footer-and-phone-pill",
          "date": "2026-09-28",
          "type": "feature",
          "title": "Same header line and footer on every page; the phone ALPR estimate shows its number",
          "summary": "Every page now shows the same \"Altoona, Iowa / Independent public-records desk\" line at the top and ends with one footer line, \"Deflock Altoona / public records and ALPR oversight\", with any page's own sourcing note below it. On phones the floating ALPR estimate shows its label and running number instead of an empty bubble, and it steps aside while a chart, table or filter sits under it rather than whenever one is anywhere on screen. Only one menu tab is marked as the current page, pages with their own jump links no longer show them twice beside \"On this page\", and a one-section list reads \"1 section\".",
          "areas": [
            "site-shell",
            "navigation"
          ],
          "links": [
            "/pay",
            "/votes",
            "/council"
          ]
        },
        {
          "id": "2026-09-28-titles-fit-and-one-floating-button",
          "date": "2026-09-28",
          "type": "feature",
          "title": "Page titles never split a word; phones show one floating button at a time",
          "summary": "A page title whose longest word is too wide for a phone screen, such as \"accountability\" on Police or \"Transparency\", now shrinks just enough to keep the word whole instead of breaking it mid-word. On phones, the floating ALPR estimate steps aside while the \"On this page\" button is showing, so the two no longer stack over the content.",
          "areas": [
            "site-shell",
            "navigation"
          ],
          "links": [
            "/police",
            "/transparency",
            "/people"
          ]
        },
        {
          "id": "2026-09-28-whats-new-grouped-by-type",
          "date": "2026-09-28",
          "type": "feature",
          "title": "What's new groups each day's changes by type",
          "summary": "Reader question: what changed on a busy day, without reading every entry? Each day on What's new now lists its changes under New features, Data fixes, Data updates, Corrections and Reviews, each with its count. On a day with more than six changes, each type folds to one row with its count under the header's Detail: Brief (the default); Detail: Full opens them. A link to one entry still opens straight to it, day headings are written out in full, and the newest year and month stay open under Brief as they did before.",
          "areas": [
            "site"
          ],
          "links": [
            "/whats-new"
          ]
        }
      ]
    },
    {
      "id": "2026-09-28-roundup-charts-and-pages-on-phones",
      "date": "2026-09-28",
      "type": "roundup",
      "title": "Charts and pages read cleanly on phones",
      "summary": "Charts that were drawn at desktop width and shrunk now draw at the screen's own width, so labels stay readable, and a tap opens the point you tapped, even while a readout is open. The public-comment topics heatmap fits the screen, prints each count in its cell, and its Bars and Sort options work. The Votes page draws its per-person presence charts only when that tab opens, so it loads much faster, and links into Votes open the right tab and scroll to the item. Vote counts carry one label, Named positions, with thousands separators; table captions stay on screen; the Activist page leads each roll call with its result; and printed pages no longer show chart buttons that do nothing on paper.",
      "areas": [
        "activist",
        "alpr",
        "charts",
        "council",
        "design",
        "homepage",
        "local",
        "news",
        "pay",
        "people",
        "public-comment",
        "search",
        "site",
        "transparency",
        "votes"
      ],
      "links": [
        "/votes#public-comment",
        "/votes#council-presence",
        "/council",
        "/people",
        "/activist"
      ],
      "changes": [
        {
          "id": "2026-09-28-activist-results-and-plain-source-lines",
          "date": "2026-09-28",
          "type": "feature",
          "title": "Activist roll calls show the result, and figure source lines read in words",
          "summary": "Each roll call on the Activist page now opens with its result and aye count before the nays, abstentions and absences, and each meeting says what makes a roll call listed: a nay, an abstention, or an absence. Figure source lines name their feeds in words instead of code names. People's Time in the record caption writes its dates out, and the Local page's presence line counts roll calls.",
          "areas": [
            "activist",
            "people",
            "local",
            "charts"
          ],
          "links": []
        },
        {
          "id": "2026-09-28-chart-taps-and-heatmap-names",
          "date": "2026-09-28",
          "type": "feature",
          "title": "Chart taps open the point you tapped; heatmap topic names read in full",
          "summary": "On phones and tablets, tapping a point in a Votes or Council chart always opened the readout for the last point (for example \"2026 \u00b7 Other\" on the public-comment topics heatmap). A tap now opens the readout for the point tapped. Topic names on the heatmap wrap onto a second line instead of being cut off, and the year row keeps the starred years (2022*, 2026*) at every screen width.",
          "areas": [
            "votes",
            "council",
            "charts",
            "public-comment"
          ],
          "links": [
            "/votes#public-comment",
            "/council"
          ]
        },
        {
          "id": "2026-09-28-chart-taps-with-an-open-card",
          "date": "2026-09-28",
          "type": "feature",
          "title": "Tapping chart points works while a readout is open",
          "summary": "On phones, a second tap on the public-comment topics heatmap or the Council roll-call charts often showed the previous point's readout, or nothing, because the open readout covered the next cell. Each tap now opens the readout for the point under your finger, whether or not a readout is already open, and opening one no longer scrolls the page.",
          "areas": [
            "votes",
            "council",
            "charts",
            "public-comment"
          ],
          "links": [
            "/votes#public-comment",
            "/council"
          ]
        },
        {
          "id": "2026-09-28-charts-readable-on-phones",
          "date": "2026-09-28",
          "type": "feature",
          "title": "Charts stay readable on phones",
          "summary": "Several charts were drawn at desktop width and shrunk to fit a phone, leaving their labels as small as 4px. The profile \"Meetings present per year\" chart, the Council meeting-length chart and the Council presence grid now draw at the screen's own width, and year labels that would run together are shortened or thinned. The two People overview charts now open the site's standard hover card (with each person's rate and dates) instead of a browser tooltip. The Council presence grid now gives the 2024-04-01 budget session its own column instead of folding it into that evening's regular meeting, so it shows 164 meetings.",
          "areas": [
            "people",
            "council",
            "alpr"
          ],
          "links": [
            "/people",
            "/council#presence-grid-section",
            "/alpr/tracker"
          ]
        },
        {
          "id": "2026-09-28-page-by-page-phone-polish",
          "date": "2026-09-28",
          "type": "feature",
          "title": "Links into Votes land where they point, and pages read cleanly on phones",
          "summary": "Links to a presence card, a shared public-comment permalink, or the most frequent public speakers on the Votes page now open the right tab and scroll to the item; tab links scroll to the tabs. Vote counts carry one label, Named positions, on Votes, Council and People, with thousands separators. Votes lists the Mayor and current members before former members, and the Mayor's office table splits a stand-in's presided meetings by the role they presided in. On phones, table captions no longer run off the edge, People's time-in-the-record chart shows whole names, date axes on day-by-day charts show month and year, series chips match their line colors, and the ALPR tracker no longer prints its camera note twice. The homepage tells apart two same-titled votes and links each to its own record, and Local Corner's most-frequent-speakers button now opens that list. The ALPR tracker's nearby-jurisdictions sort headers and What's new's Count by buttons match the site's other controls. Answers: where does this link take me, and what does this chart or table say on my phone?",
          "areas": [
            "votes",
            "council",
            "people",
            "homepage",
            "alpr",
            "charts",
            "pay",
            "news",
            "search",
            "transparency"
          ],
          "links": [
            "/votes#public-speakers",
            "/council",
            "/people",
            "/",
            "/alpr/tracker",
            "/pay"
          ]
        },
        {
          "id": "2026-09-28-public-comment-charts-fixed",
          "date": "2026-09-28",
          "type": "feature",
          "title": "Public-comment charts on Votes: readable heatmap, working Bars and Sort, no repeated colors",
          "summary": "Reader question: which topics do residents raise at Council, and how often do they speak? The topics heatmap on the Votes page's Public comment tab cut off every topic name and shrank to unreadable text on phones; it now fits the screen, prints each count in its cell, leaves years with no comments unshaded, and honors Per-row scale. The participation chart's Bars option showed \"not yet implemented\" and now draws bars. Sort buttons appear only where they reorder something (rows of a table, list, heatmap or small multiples). Lines and grouped or stacked bars are no longer offered when a chart has more series than the site has colors, since eleven topics shared three colors. A starred year on a chart is now named in the note below it, hovering any row of a small-multiples or heatmap chart shows that row's numbers, and the non-working Compare button is gone. On the Council page, the chart controls and chart readouts now use the site's own styles instead of bare browser buttons and a full-size list, and a readout for several lines names each line once and gives a shared caveat once.",
          "areas": [
            "votes",
            "council",
            "charts",
            "public-comment"
          ],
          "links": [
            "/votes#public-comment",
            "/council"
          ]
        },
        {
          "id": "2026-09-28-site-qa-pass",
          "date": "2026-09-28",
          "type": "feature",
          "title": "Printed pages no longer show dead chart buttons",
          "summary": "A site-wide quality pass found that printing /people, /alpr/tracker, /votes, or any chart on /design left \"Show as a table\" and \"Download CSV\" buttons visible on the printed page, even though they do nothing on paper. Both are now hidden when printing, matching how the newer chart component (used on /council) already behaved.",
          "areas": [
            "site",
            "design"
          ],
          "links": [
            "/people",
            "/alpr/tracker",
            "/votes"
          ]
        },
        {
          "id": "2026-09-28-votes-presence-fast-and-readable",
          "date": "2026-09-28",
          "type": "feature",
          "title": "The Votes page loads faster, and its presence charts read on phones",
          "summary": "The Presence tab's per-person charts are now drawn only when that tab is opened and at the width of the screen, so the Votes page loads much faster on a phone and the chart labels stay readable. Each chart's dashed line now counts every session, so it ends at the same 164 known meetings its caption names (two sessions were held on 2024-04-01). Links copied from the Votes page no longer carry empty filter settings.",
          "areas": [
            "votes"
          ],
          "links": [
            "/votes#council-presence"
          ]
        }
      ]
    },
    {
      "id": "2026-09-28-roundup-brief-and-full-detail",
      "date": "2026-09-28",
      "type": "roundup",
      "title": "A Detail switch: pages open brief, with every card and chart one click away",
      "summary": "A site-wide Detail: Brief | Full switch in the header, remembered between visits, lets each page open with what it answers and keep sources, methods, and secondary sections behind a short line; Full opens the cards and charts but leaves source and citation panels closed until clicked, and Expand all still opens everything. Under Brief, the Council roster is one row per member, the People directory is one row per person, Altoona by the numbers is ten Census tiles each with its trend a click away, the Projects section on Votes shows 12 of 205 projects with search and filters, and the design page shows one example per rule. A shared glossary explains a term like ALPR, hotlist, or margin of error the first time it appears on a page.",
      "areas": [
        "council",
        "design",
        "design-system",
        "local",
        "navigation",
        "people",
        "site",
        "site-shell",
        "votes"
      ],
      "links": [
        "/council",
        "/people",
        "/local#by-the-numbers",
        "/votes#property-business"
      ],
      "changes": [
        {
          "id": "2026-09-28-council-roster-brief-rows",
          "date": "2026-09-28",
          "type": "feature",
          "title": "The Council roster reads as one short list, and the header's Detail switch brings the full cards back",
          "summary": "Reader question: who is on the Council and how often are they there, without scrolling past a card per member. Under the header's Detail: Brief (the default), the Mayor and Council roster on /council is one list with a row per member (name, days left in the term, role, presence and participation, with the Mayor's presided note beside his figure), and the meeting-time sections below it read as one list of rows with their numbers. Detail: Full shows the separate cards and their term dates as before. Opening a member still shows their positions and links.",
          "areas": [
            "council"
          ],
          "links": [
            "/council"
          ]
        },
        {
          "id": "2026-09-28-density-pass-and-readability",
          "date": "2026-09-28",
          "type": "feature",
          "title": "Pages now lead with what they answer; details are one click away",
          "summary": "Added a site-wide \"Detail: Brief | Full\" switch (in the header, next to the theme control) and a per-page \"Expand all / Collapse all\" control, both remembered between visits. Brief keeps sources, methods, and secondary sections tucked behind a short summary line; Full opens everything. A shared glossary now explains a term like ALPR, hotlist, consent agenda, roll call, margin of error, or PERB the first time it appears on a page, with a plain-language definition on hover, tap, or keyboard focus. On City Council, one shared Expand all / Collapse all replaces two different controls that used to do the same job in different places on the same page.",
          "areas": [
            "site-shell",
            "navigation",
            "design-system"
          ],
          "links": []
        },
        {
          "id": "2026-09-28-design-page-opens-brief",
          "date": "2026-09-28",
          "type": "feature",
          "title": "The design page opens brief: one example per rule, every variant under Full",
          "summary": "The design page opens brief: one example per rule, every variant under Full. /design's two sections that showed several worked examples (the design-guideline rules, and DataView's edge cases) now show one canonical example under the site's existing Detail: Brief | Full control, with the rest folded into an \"All variants\" disclosure that opens under Full, on Expand all, or on a link straight to a demo inside it. A site-wide link into a collapsed section now opens it, whichever page that section is on.",
          "areas": [
            "design",
            "site-shell"
          ],
          "links": []
        },
        {
          "id": "2026-09-28-detail-full-cards-only",
          "date": "2026-09-28",
          "type": "feature",
          "title": "Detail: Full shows the cards and charts, not every source and citation panel",
          "summary": "The header's Detail: Full now opens a page's cards and chart sections but leaves Sources and caveats, Cite and permalink panels and method notes closed until you click them, so Full reads as the full layout rather than every fold at once. The Expand all button on a page still opens everything.",
          "areas": [
            "site"
          ],
          "links": [
            "/council",
            "/local"
          ]
        },
        {
          "id": "2026-09-28-local-census-tiles",
          "date": "2026-09-28",
          "type": "feature",
          "title": "Altoona by the numbers opens as ten Census tiles, each with its trend one click away",
          "summary": "Reader question: what are Altoona's Census figures at a glance. Under the header's Detail: Brief (the default), the ten Census estimates on /local show as a grid of tiles (estimate, margin of error, who it counts, Iowa and U.S. figures where published), each with a \"Trend since ...\" fold that opens its chart. Detail: Full opens every chart as before. The margin-of-error caveat stays visible under the tiles.",
          "areas": [
            "local"
          ],
          "links": [
            "/local#by-the-numbers"
          ]
        },
        {
          "id": "2026-09-28-people-directory-brief-rows",
          "date": "2026-09-28",
          "type": "feature",
          "title": "The People directory reads as a list of rows, with the full cards under Detail: Full",
          "summary": "Reader question: who is in the directory and what records each person has, without scrolling past a tall card per person. Under the header's Detail: Brief (the default), /people lists each person as one row: name and term countdown, role and affiliation on one line, presence and presided figures, records on file, and the role tag. The police units' folds read as one list. Detail: Full shows the cards as before.",
          "areas": [
            "people"
          ],
          "links": [
            "/people"
          ]
        },
        {
          "id": "2026-09-28-votes-projects-fold",
          "date": "2026-09-28",
          "type": "feature",
          "title": "The Projects section on /votes now folds instead of showing every card",
          "summary": "The Projects group under /votes#property-business used to render every grouped plat/site-plan/rezoning/development-agreement project as a card with no fold: 205 projects on one long page. It now shows 12 by default with a \"Show N more\" expander, a search box, Kind and Year filters, a Most matters/Latest matter/A-Z sort, and a Table view. A deep link to #property-business opens the section, not every card.",
          "areas": [
            "votes"
          ],
          "links": [
            "/votes#property-business"
          ]
        }
      ]
    },
    {
      "id": "2026-09-28-roundup-alpr-tracker-community-totals-and-fbi-1985",
      "date": "2026-09-28",
      "type": "roundup",
      "title": "ALPR tracker: community-mapped totals shown by default, a new Flock reading, and FBI figures back to 1985",
      "summary": "The tracker's community-mapped camera total (67 presumed inside Altoona city limits, unverified) now shows by default, with a third card giving the difference from Flock's reported 51 and the assumptions behind it, and the homepage camera tile mentions the same total. The nearby-jurisdictions map adds a Polk County (unincorporated) row. Flock's portal reading for September 28: 51 cameras, 572,948 plate reads, 223 searches, and 8,557 hotlist hits over 30 days, each a rolling total. The FBI offense and clearance figures on /local and the tracker now run back to 1985 instead of 2020, with two reporting-method changes noted; 1991 shows as withheld, not zero, because Iowa's FBI reporting coverage collapsed that year. The tracker's crime panel adds the Polk County Sheriff's Office series.",
      "areas": [
        "alpr",
        "data",
        "local"
      ],
      "links": [
        "/alpr/tracker",
        "/alpr/tracker#crime-context",
        "/local#fbi-heading",
        "/"
      ],
      "changes": [
        {
          "id": "2026-09-28-community-camera-default-visibility-and-unincorporated-county",
          "date": "2026-09-28",
          "type": "feature",
          "title": "Community-mapped camera totals now show by default on the tracker; the nearby map adds unincorporated Polk County",
          "summary": "On /alpr/tracker's \"How many cameras\" cards, the community-mapped camera total (presumed inside Altoona city limits, unverified) now shows by default instead of behind a hidden switch; the switch now hides it instead. The nearby-jurisdictions map, legend, jurisdiction picker, and table gain a Polk County (unincorporated) row for the Sheriff's Office patrol area between tracked cities (no public transparency portal); its community-mapped figure still follows the same off-by-default switch as every city's figure. Both community-mapped switches on the page now share one remembered choice (?community=show|hide in the URL wins, else the reader's last choice, else the surface's own default) instead of resetting on every load. The distance-ring cards get a one-line explanation that a ring count is not split by jurisdiction.",
          "areas": [
            "alpr"
          ],
          "links": [
            "/alpr/tracker"
          ]
        },
        {
          "id": "2026-09-28-fbi-reporting-collapse-years-withheld",
          "date": "2026-09-28",
          "type": "data-fix",
          "title": "1991's FBI figures now show as withheld, not zero",
          "summary": "Widening the FBI series to 1985-present (see the companion entry) surfaced a real problem: 1991 has all 12 months reported, so it passed the usual completeness check, but almost no Iowa agencies reported to the FBI that year at all, and Altoona's own reported counts were all literally zero -- a reporting collapse, not a crime-free year. The /local and /alpr/tracker figures now withhold every offense, clearance, and rate figure for a year where Iowa's or the U.S.'s own FBI reporting coverage falls below 50%, showing a named gap in the chart and a \"reporting coverage collapsed\" row in the table instead of a zero. 1991 is the only year in the published range this affects.",
          "areas": [
            "local",
            "alpr"
          ],
          "links": [
            "/local#fbi-heading",
            "/alpr/tracker#camera-history"
          ]
        },
        {
          "id": "2026-09-28-fbi-series-back-to-1985",
          "date": "2026-09-28",
          "type": "data-update",
          "title": "FBI offense/clearance figures now run back to 1985",
          "summary": "The \"Offenses reported to the FBI\" figures on /local and the crime-context panel on /alpr/tracker previously started in 2020, the live research window's own start. The FBI Crime Data Explorer's summarized-agency endpoint returns figures for Altoona PD back to 1985, so the figures now run from 1985, with a note naming two FBI reporting-method changes inside that range (the 2013 revised rape definition and the 2021 move from the Summary Reporting System to NIBRS). The 2020-present figures are unchanged.",
          "areas": [
            "local",
            "alpr",
            "data"
          ],
          "links": [
            "/local#fbi-heading",
            "/alpr/tracker#camera-history"
          ]
        },
        {
          "id": "2026-09-28-flock-portal-reading",
          "date": "2026-09-28",
          "type": "data-update",
          "title": "Flock portal reading for September 28 added to the ALPR tracker",
          "summary": "New figures read from Flock's own Altoona transparency portal, last updated September 28, 2026: 51 cameras (unchanged), 572,948 plate reads (up 309 from the September 26 reading), 223 searches (down 21), and 8,557 hotlist hits (down 117) over the last 30 days, with 30-day retention and the same two hotlists (NCIC and NCMEC Amber Alert). Flock labels the plate-read figure vehicles detected; it counts plate reads, not unique vehicles. Every figure is a rolling 30-day total, so a change between readings is not the number of events on any one day. The portal's policy statements read the same as when the site last recorded them.",
          "areas": [
            "alpr"
          ],
          "links": [
            "/alpr/tracker"
          ]
        },
        {
          "id": "2026-09-28-homepage-community-camera-mention",
          "date": "2026-09-28",
          "type": "feature",
          "title": "Homepage hero camera tile now mentions the community-mapped total",
          "summary": "The homepage's camera tile now also says \"Community-mapped: 67 presumed inside city limits, unverified\": a total only, with no brand or owner split, matching the tracker's own card.",
          "areas": [
            "alpr"
          ],
          "links": [
            "/"
          ]
        },
        {
          "id": "2026-09-28-presumed-beyond-flock-count-card",
          "date": "2026-09-28",
          "type": "feature",
          "title": "The tracker's community-mapped card now shows a Flock comparison",
          "summary": "/alpr/tracker's \"How many cameras\" section gains a third card, \"Presumed, not counted\", computed live as the community-mapped total minus Flock's own reported count (16 = 67 - 51 today; reads \"none implied\" if the difference isn't positive), always carrying the caveat that community tracking is unverified and may over- or under-count, with the assumptions behind the figure listed (map completeness, one tag per device, city-limit classification, differing snapshot dates).",
          "areas": [
            "alpr"
          ],
          "links": [
            "/alpr/tracker"
          ]
        },
        {
          "id": "2026-09-28-tracker-crime-panel-polk-sheriff-series",
          "date": "2026-09-28",
          "type": "data-fix",
          "title": "The tracker's year-by-year crime comparison now includes the Polk County Sheriff's Office",
          "summary": "The /alpr/tracker page's \"reported crime beside Flock's readings\" chart was missing the Polk County Sheriff's Office reference series that /local's identical FBI rate chart already draws from the same FBI data. It now shows Altoona, Iowa, the U.S., and (where the feed carries it) the Sheriff's own series, with the same caveat that the Sheriff's figures are one agency's own reported offenses, not a county-wide total.",
          "areas": [
            "alpr"
          ],
          "links": [
            "/alpr/tracker#crime-context"
          ]
        }
      ]
    },
    {
      "id": "2026-09-28-police-report-in-their-words",
      "date": "2026-09-28",
      "type": "feature",
      "title": "The department's 2025 report, in its own words",
      "summary": "The police page now quotes the department's 2025 annual report directly on where the program is headed, its scale, its results, audits, drones and camera sharing, with the site's position beside each quote. /why cites the same report.",
      "areas": [
        "site"
      ],
      "links": [
        "/police",
        "/why"
      ]
    },
    {
      "id": "2026-09-28-pay-typo-column-year-fix",
      "date": "2026-09-28",
      "type": "correction",
      "title": "Correction: a false 2010 police hourly pay range removed from /pay and /local",
      "summary": "The July 1, 2016 to June 30, 2021 police contract prints its last two raise columns with typo dates (\"7/1/209\" and \"7/1/2010\"). The police pay chart on /pay and the Census income comparison on /local read \"7/1/2010\" as a real 2010 hourly range ($27.73 to $35.62 an hour), though police contracts in 2010 set annual salaries. Both charts now leave out any column dated outside its own contract's term and say so beside the chart; those two columns' rates remain in the contract's table.",
      "areas": [
        "pay",
        "local"
      ],
      "links": [
        "/pay#history",
        "/local#pay-context"
      ]
    },
    {
      "id": "2026-09-28-nearby-jurisdictions-unincorporated-figure-fix",
      "date": "2026-09-28",
      "type": "correction",
      "title": "Fixed the Polk County (unincorporated) camera figure on the nearby-jurisdictions map",
      "summary": "The Polk County (unincorporated) row on /alpr/tracker's nearby-jurisdictions map and table had shown 103 community-mapped cameras, a six-county-area figure that did not match the map's own 10-mile view. It now shows 2, computed the same way as the distance-ring counts next to it (cameras within 10 miles of Altoona's city limit that fall outside every tracked city). The Sheriff's-office status line no longer repeats an unverified contract claim that turned out to describe a different, same-named county in Florida; it now says plainly that no record establishes the Sheriff's own ALPR contract status. The civic-page street-basemap privacy sentence now also says OpenStreetMap's tile servers can see the map area being viewed.",
      "areas": [
        "alpr",
        "privacy"
      ],
      "links": [
        "/alpr/tracker"
      ]
    },
    {
      "id": "2026-09-27-roundup-votes-consent-items-topics-and-directory",
      "date": "2026-09-27",
      "type": "roundup",
      "title": "Votes: consent-agenda items listed, public comment by topic, a year-to-date row, and a rebuilt directory",
      "summary": "Every consent-agenda roll call now lists the lettered items the minutes bundle into it (1,981 items across 152 consent votes), each searchable, so the July 21, 2025 Axon agreement can be found under the vote that approved it. The Public comment tab groups every speaker entry into plain topics such as traffic, police and records, and cameras, charted by year. The Roll calls over time chart stacks Aye, Nay, Abstain, and Absent per year, the current year gets its own year-to-date row with All years and ALPR-era totals, and the sortable Table view adds a category column, a tally bar, and a per-year member grid. The Property and business directory was rebuilt from a new extraction grammar: named businesses and applicants grew from 494 to 692, with 171 projects grouped across plats, rezonings, and agreements; household matters are never named. Private requesters' names in vote titles are shortened to first name and last initial, and a private speaker who shared an official's first name is listed again.",
      "areas": [
        "alpr",
        "charts",
        "council",
        "data",
        "people",
        "privacy",
        "research",
        "votes"
      ],
      "links": [
        "/votes",
        "/votes#public-comment",
        "/votes#vote-cumulative",
        "/votes#property-business",
        "/votes?q=Axon"
      ],
      "changes": [
        {
          "id": "2026-09-27-consent-agenda-bundled-items",
          "date": "2026-09-27",
          "type": "data-fix",
          "title": "Votes: consent-agenda items are now listed and searchable",
          "summary": "A consent-agenda roll call used to show only its umbrella title (\"Item 12: Consider Consent Agenda\"), so a search for something the City actually approved by consent -- for example the July 21, 2025 Axon Enterprise, Inc. agreement, sub-item 12(c) -- found nothing. Every consent-agenda vote record now lists the lettered sub-items the minutes bundle into it (152 of 162 consent roll calls since 2020; the other 10 are later roll calls on the same item), each individually searchable by title or named business/applicant, and labeled \"Approved together in one roll call -- the record does not show a separate vote on any single item.\" A private landowner's name in an easement or right-of-way payee clause is withheld the same way a private requester's name is elsewhere; a business, HOA, or other institution named the same way is kept. No vote's tally, mover/seconder, or id changed.",
          "areas": [
            "votes",
            "alpr",
            "research",
            "data"
          ],
          "links": [
            "/votes?q=Axon",
            "/research#records-history",
            "/alpr/tracker"
          ]
        },
        {
          "id": "2026-09-27-property-business-directory-rebuilt",
          "date": "2026-09-27",
          "type": "data-update",
          "title": "Property and business directory rebuilt",
          "summary": "The /votes Property & business directory was sparse: only 80 of 2,010 vote records named a business, even though roughly 500 agenda items describe a plat, site plan, rezoning, development agreement, urban renewal plan, easement, annexation, or liquor/tobacco license. A new extraction grammar classifies every vote record and consent-agenda sub-item by matter type, captures the business or applicant named in the printed forms Council minutes actually use, and groups the same plat or development project across matter types. Named businesses/applicants grew from 494 to 692 (across top-level records and consent-agenda sub-items); 1,206 records now carry a matter type; 284 records group into 171 distinct projects (the same plat, rezoning, site plan, and development agreement, linked by name). Household matters (fee waivers, sewer relief, individual variances, a private person with no business form) are never named -- they show up by matter type only, the same privacy rule as everywhere else on this site. The view adds a matter-type filter and a Projects section, one card per project.",
          "areas": [
            "votes"
          ],
          "links": [
            "/votes#property-business"
          ]
        },
        {
          "id": "2026-09-27-public-comment-topics",
          "date": "2026-09-27",
          "type": "feature",
          "title": "Public comment: see what residents raise, by topic and year",
          "summary": "Answers the question \"What do residents bring to the Council, and has that changed?\" The Public comment tab on /votes now groups every speaker entry into plain topics (such as traffic and crossings, police and records requests, property and City code, and cameras and license plate readers) and charts them by year, with a table view and CSV download. Pick a topic chip, or the new Topic filter beside the search, to list only those comments; each entry shows its topic, search terms are highlighted, and the topic and search are kept in the link so a filtered view can be shared. \"How to be heard\" is shorter. Topics come from keyword rules on this site's summaries, never from names or addresses, and \"How topics are assigned\" lists every rule.",
          "areas": [
            "votes",
            "charts"
          ],
          "links": [
            "/votes#public-comment"
          ]
        },
        {
          "id": "2026-09-27-public-speakers-official-collision-fix",
          "date": "2026-09-27",
          "type": "data-fix",
          "title": "Most frequent public speakers: a shared first name no longer drops a different person",
          "summary": "The Most frequent public speakers table on the Votes page had fallen from 14 rows to 10: since the table shows a bare first name, its guard against listing an official was comparing that displayed first name against every official's first name, so a private speaker who merely shared an official's first name (but was a different person) was being left out along with the official. The guard now matches on the full printed name and known aliases, never the shortened display name, so a genuinely different private person is listed again. The table is back to 14 rows.",
          "areas": [
            "votes",
            "data"
          ],
          "links": [
            "/votes#public-speakers"
          ]
        },
        {
          "id": "2026-09-27-vote-parser-b1-fixes",
          "date": "2026-09-27",
          "type": "data-fix",
          "title": "Votes: every consent-agenda item is now listed, and private requesters' names are shortened",
          "summary": "Answers \"what exactly did Council approve by consent?\". On 65 consent-agenda votes the item list stopped early wherever the minutes printed the next letter on the same line, so later items (most often the beer and liquor permits) were folded into the item before them and one item ran on into the meeting discussion. Those votes now list every item: 1,981 items across the 152 consent votes, up from 1,689. A private person who asked Council for something or applied for a rezoning is now shown by first name and last initial in vote titles, the same as a public speaker; businesses, institutions and officials keep their full names. No vote's tally, mover, seconder or id changed.",
          "areas": [
            "votes",
            "privacy",
            "data"
          ],
          "links": [
            "/votes"
          ]
        },
        {
          "id": "2026-09-27-votes-outcome-stack",
          "date": "2026-09-27",
          "type": "feature",
          "title": "/votes: Roll calls over time now shows Aye, Nay, Abstain, and Absent, and its cards filter it",
          "summary": "The Roll calls over time chart on /votes now stacks every named position per year (per month or meeting when the filters above narrow to one year or month) into Aye, Nay, Abstain, and Absent, from the same tallies as the cards above it, so the bars add up to the cards. It replaces the aye and absent share lines and the unlabeled meeting bars. Click the Aye, Nay, Abstain, Absent, or Named positions card (or a key chip) to show only those outcomes; a filtered view uses its own scale, so the small Nay and Abstain counts stay readable. The view can be shared by link, read as a table, or downloaded as CSV. The current year is drawn in progress, years with incomplete minutes keep their asterisk, and each period's absent share is still colored against the all-time average in the readout and table. Clicking a bar still opens that year by month, or that month by meeting. Answers: how did the Council vote each year, and how often were members absent?",
          "areas": [
            "votes"
          ],
          "links": [
            "/votes#vote-cumulative"
          ]
        },
        {
          "id": "2026-09-27-votes-table-presence-remarks-redesign",
          "date": "2026-09-27",
          "type": "feature",
          "title": "Redesigned the vote-record Table view, merged Presence into role chips, and added an Official Remarks quick-hitters view",
          "summary": "The Table (sortable) view replaces the Address/Business/Motion columns with a Category column (the same roll-call classifier /council already uses), a merged Related column (address and business, muted dash when neither is cited), a stacked aye/nay/abstain/absent tally bar, and a per-year member-position dot grid (mover/seconder marked, each dot linking to a profile). A row expands (button or row click) into the full motion, consent bundled_items, official remarks joined on that meeting date and agenda-item number, and the roll-call names -- the same detail panel the By-meeting view already used. Adds a Category filter, column show/hide, CSV export of the filtered rows, and sort/filter/column state kept in the URL. \"Council presence\" and \"City officials present\" are now one Presence tab with six role chips (Mayor, Council, City officials, Police, Public, Others); Public and Others are counts only from the audience/public-comment record, never names. The Mayor now gets a real presence card (built from meeting attendance, not a vote share the Mayor's office never casts) and a separate Mayor's-office table next to \"Roll calls over time\" -- meetings in period, present/absent, meetings presided, minutes signed, official remarks, and a presiding-timeline cross-check against the Mayor's own roll-call status -- plus presided/signed counts on every Council member's card. Fixed a bug where the page-level Year and Member filters never reached the Presence tab. The Official Remarks tab adds three quick-hitter tables (most distinct meetings with remarks by role, meetings with the most official remarks, busiest agenda topics) and, under \"All officials,\" per-official cards with a remark count, distinct meetings, and a per-year sparkline; its remarks list is now grouped into collapsible by-meeting stack cards. \"Most frequent public speakers\" and \"Meetings with the most public participation\" are now sortable by column. All of /votes' scrollable tables are keyboard-reachable regions (tabindex, role=\"region\", a label). A direct link to one roll-call record's permalink (already used by /alpr/tracker and /research) now actually opens it: the linked filters apply, its day group or table row expands, and it scrolls into view with a brief highlight and keyboard focus, in whichever layout (By-meeting or Table) is active.",
          "areas": [
            "votes",
            "people",
            "council"
          ],
          "links": [
            "/votes"
          ]
        },
        {
          "id": "2026-09-27-votes-year-to-date-and-all-years",
          "date": "2026-09-27",
          "type": "feature",
          "title": "Votes list: 2026 year-to-date row, plus All years and ALPR era totals",
          "summary": "Answers \"how is this year going compared with past years?\" on /votes. The current year now has its own year row, labeled year to date, with the same absent, result, and aye figures and absent trend as 2020 to 2025; it opens to its months, including this month. A new All years section below Earlier years totals every year in view and splits the record before the ALPR era (2020 to 2021) and during it (2022 to present), the same split the year filter's ALPR era option uses. These rows describe the record in each span; they do not measure any effect of the cameras. Meeting counts on these rows now read \"meetings with votes\", because they count only meetings with a recorded roll-call vote, which is why they can be lower than the known-meeting totals in the coverage table. A trend that ends in a period still in progress ends with a hollow point and a dashed segment, and a month with one meeting no longer shows an empty trend label.",
          "areas": [],
          "links": []
        }
      ]
    },
    {
      "id": "2026-09-27-roundup-site-wide-search",
      "date": "2026-09-27",
      "type": "roundup",
      "title": "Site-wide search, from every page",
      "summary": "A search box in the header of every page (and the / shortcut) now searches Council votes, official remarks and public comment, people, news, public pay, ALPR figures, and the Census and FBI figures the site already publishes. Pressing Enter opens a results page you can share, narrowed by type, year, page, or date range, and picking a result opens the page scrolled to that exact record. The header is now two rows, with the vendor-reported ALPR figures for the last 30 days on the second. The index is built from the same public feeds every other page reads.",
      "areas": [
        "alpr",
        "local",
        "pay",
        "people",
        "search",
        "site",
        "votes"
      ],
      "links": [
        "/search",
        "/"
      ],
      "changes": [
        {
          "id": "2026-09-27-add-site-wide-search",
          "date": "2026-09-27",
          "type": "feature",
          "title": "Added site-wide search",
          "summary": "A search icon in the top utility bar on every page (persistent input on wide desktop windows when there's room, otherwise a click/tap-to-expand icon, and the \"/\" keyboard shortcut) now searches Council votes, official remarks and public comment, people, news, public pay, ALPR transparency and camera-count figures, and Altoona-by-the-numbers Census/FBI figures already published on this site. Results open a grouped typeahead with the top matches, or a full results list at /search. The search index (src/search-index.json) is generated from the same already-public feeds every other page reads -- nothing private or previously unpublished is exposed -- and is rebuilt every publication run.",
          "areas": [
            "site",
            "votes",
            "people",
            "pay",
            "alpr",
            "local"
          ],
          "links": [
            "/search",
            "/votes",
            "/people",
            "/pay",
            "/alpr/tracker",
            "/local"
          ]
        },
        {
          "id": "2026-09-27-header-two-rows-search-box",
          "date": "2026-09-27",
          "type": "feature",
          "title": "Site header: a real search box, a working theme menu, and ALPR hits back in view",
          "summary": "Reader question: where do I search, and how many hotlist hits did the plate readers report? The header at the top of every page is now two rows. The first has the site's name, today's reads, a search box you can type in right away (no icon to find first), and the theme button, whose light, dark and system menu opens fully again. The second shows the vendor-reported ALPR figures for the last 30 days: combined Flock and Axon detections, combined hotlist hits, this visit's estimate, and the vendors' data dates, with each vendor's own numbers in the link's description and on the ALPR tracker. On a phone the rows wrap instead of dropping figures.",
          "areas": [
            "site",
            "search",
            "alpr"
          ],
          "links": [
            "/",
            "/search",
            "/alpr/tracker"
          ]
        },
        {
          "id": "2026-09-27-search-results-page",
          "date": "2026-09-27",
          "type": "feature",
          "title": "Search: a full results page with filters, and results that open on the exact record",
          "summary": "Pressing Enter in the search box, or choosing See all results, now opens a results page you can share (/search?q=...). It lists every match with its page, section, date, and a snippet with your words marked, and it can be narrowed by type, year, page, date range, and exact phrase, or sorted by date. Picking a result opens the page scrolled to that vote, remark, public comment, story, or update, outlined, with your words marked. This answers the question of where exactly a word or name appears in the record. The search box itself is fixed: it no longer drops under its icon, its suggestions list is no longer cut off, the icon opens it on wide screens, and a search word now matches only at the start of a word, so Axon no longer matches longer words that merely contain those letters.",
          "areas": [
            "search",
            "site"
          ],
          "links": [
            "/search",
            "/votes"
          ]
        }
      ]
    },
    {
      "id": "2026-09-27-roundup-people-overview-presence-and-remarks",
      "date": "2026-09-27",
      "type": "roundup",
      "title": "People: an overview with tenure, presence, and remarks charts, and vote outcomes on each profile",
      "summary": "The People glossary opens with an overview: counts by role, a Time in the record timeline, a Who was in the room presence figure covering the Mayor, Council, police, and City officials (with officials' counts never presented as comparable to elected members' rates), and official remarks by role per year with a Public row of comment appearances, counts only. Cards and profiles show meeting presence as a rate against expected meetings, and the Mayor's card shows meetings present and presided. Each Council profile charts Aye, Nay, Abstain, and Absent per year with the cards as filters. A sortable table view replaced one that rendered blank, and chart colors were fixed for dark mode.",
      "areas": [
        "council",
        "data",
        "people",
        "votes"
      ],
      "links": [
        "/people",
        "/people?display=table",
        "/people?person=dean-oconnor"
      ],
      "changes": [
        {
          "id": "2026-09-27-people-cards-show-meeting-presence",
          "date": "2026-09-27",
          "type": "feature",
          "title": "People cards show meeting presence; the Mayor's card no longer shows a vote stat",
          "summary": "The People glossary's Mayor card and profile did not show a roll-call vote statistic (that line is on the /council roster, not here), but they also never showed the meeting presence that does apply to the Mayor's office. Both now do: the Mayor's card and profile read \"Present at N of M meetings\" plus how many meetings he presided over, where M is Council meetings with readable minutes during the term; Council members keep their vote-tally Participation figure lower on the profile and gain a separate \"Present at N of M meetings (X%)\" roll-call attendance stat; City officials and police show \"Listed present at N meetings\" from the City Officials Present record, or nothing when undocumented. Every stat names its source feed and links to the Votes page -- to that person's specific presence card for everyone with one, or to the presence tab itself for the Mayor, whose office never casts a named vote and so never gets a card there. Profiles also gained a small Presence section near the top with the same figures and a note that meetings without readable minutes are not counted, linking to the Votes page's presence chart rather than redrawing it.",
          "areas": [
            "people",
            "votes",
            "data"
          ],
          "links": [
            "/people",
            "/people?person=dean-oconnor",
            "/votes#council-presence"
          ]
        },
        {
          "id": "2026-09-27-people-gains-overview-tenure-presence-remarks-charts",
          "date": "2026-09-27",
          "type": "feature",
          "title": "/people gains an overview with tenure, presence and remarks charts, a table view, and role-coded cards",
          "summary": "The People glossary gains a new overview band above the roster: counts of current and former Mayor, Council, Police, and City officials; a tenure timeline showing each Council/Mayor person's sourced term(s) since 2020; a Council/Mayor meeting-presence chart (a rate, with the denominator shown); City officials'/police's listed-present counts (shown as counts, not a rate, since they have no roll-call seat); and official remarks by role, per year. Every chart has a title, a caption naming its source and denominator, a role-coded legend, and a \"Show as a table\" toggle so its data is always available as text. Roster cards, filter chips, and the roster's new sortable table view (toggle beside the filters; both the filter and the view are in the URL) now carry one of four role classes (Mayor, Council, Police, City official; a Former modifier dashes rather than recolors), so a reader learns one color-to-role mapping across cards, chips, table rows, and chart legends. Council and Mayor profiles gain small per-year charts (meetings present, roll-call votes cast) and remarks-per-year charts where the data supports them, each linking to the fuller record on the Votes page rather than duplicating it. Roster cards and profiles now also show meeting presence as a rate against expected meetings (e.g. \"Present 98.0% (150 of 153)\"), matching the wording on the Council roster; Council members keep a separately computed, vote-based Participation percentage beside it.",
          "areas": [
            "people",
            "votes",
            "data"
          ],
          "links": [
            "/people",
            "/people?display=table",
            "/people?person=dean-oconnor",
            "/people?person=scott-duer"
          ]
        },
        {
          "id": "2026-09-27-people-overview-chart-fixes-and-public-row",
          "date": "2026-09-27",
          "type": "data-fix",
          "title": "/people charts: officials' listed-present counts now draw, and roles get distinct colors",
          "summary": "Two fixes to the \"People at a glance\" charts on /people. (1) \"City officials and police, meetings listed present\" always showed \"Not enough data is documented yet\" next to a working data table -- a contradiction that hid real data. It now draws a sortable bar chart (alphabetical by default, or by count) with a value at each bar's end. (2) On \"Remarks by role, per year,\" city officials' bars could render solid black in dark mode (and gray in a chart legend), and Mayor and Police read as nearly the same orange in both themes; both were fixed, and each row's tallest bar is labeled with its count.",
          "areas": [
            "people"
          ],
          "links": [
            "/people"
          ]
        },
        {
          "id": "2026-09-27-people-presence-combined-view",
          "date": "2026-09-27",
          "type": "feature",
          "title": "People at a glance: one combined presence figure and one combined tenure figure",
          "summary": "The overview band on /people previously split meeting presence into two separate figures (\"Council and Mayor meeting presence\", a rate; \"City officials and police, meetings listed present\", a count) and showed a tenure timeline for elected members only. They're now one \"Who was in the room\" figure covering all four roles (Mayor, Council, police, city official), with a shared role-chip filter (default Mayor + Council), an A-Z/By count/By rate sort, and a Denominator/Rate/Listed span set of table columns that read \u2014 for officials and police, who have no roll-call seat to be present-or-absent against \u2014 so the count is never presented as comparable to the elected rows' rate, and a low count still reads against its own documented span rather than as low attendance. The tenure timeline is now \"Time in the record\": the same role filter adds police's and city officials' documented spans (first-to-last \"City Officials Present\" listing), drawn as an outline bar distinct from a sourced term, with a \"Show all N\" expander once a role passes about 15 rows. Both figures keep their existing Show-as-a-table toggle and add a Download CSV button. No new computation: both read PeopleViz.combinedPresenceRows()/allTenureRows(), themselves built from the same councilPresenceRows()/officialsPresenceRows()/tenureRows() the previous three figures already used.",
          "areas": [
            "people"
          ],
          "links": [
            "/people"
          ]
        },
        {
          "id": "2026-09-27-people-remarks-by-role-public-row",
          "date": "2026-09-27",
          "type": "feature",
          "title": "Remarks by role, per year: a Public row",
          "summary": "Remarks by role, per year now includes a Public row: how many public-comment appearances the minutes record each year. Counts only; no names.",
          "areas": [
            "people"
          ],
          "links": [
            "/people"
          ]
        },
        {
          "id": "2026-09-27-people-table-view-fix",
          "date": "2026-09-27",
          "type": "data-fix",
          "title": "/people table view displays correctly again",
          "summary": "The Table view on /people (and every overview-chart \"Show as a table\" toggle) showed only a \"Name\" column header and a single row reading \"undefinedundefinedundefined...\" instead of the roster. The shared table builder appended each finished row to the table but then immediately overwrote them with the result of the step that built them, which produced nothing usable. The table now shows every person the current filter matches, sortable by any column, as before.",
          "areas": [
            "people"
          ],
          "links": [
            "/people?display=table"
          ]
        },
        {
          "id": "2026-09-27-profile-outcome-chart-filters",
          "date": "2026-09-27",
          "type": "feature",
          "title": "Council profiles chart every vote outcome per year, and the cards filter it",
          "summary": "On each Council member's profile, the per-year chart now stacks Aye, Nay, Abstain, and Absent for every year, using the same positions as the summary cards, so the bars add up to the cards. Click a card (Tracked entries, Participation, Aye, Nay, Abstain, Absent) or a key chip to show only those outcomes; the filtered view can be shared by link, read as a table, or downloaded as CSV. The current year is marked in progress, and years with no recorded positions show as empty rather than being skipped. Remarks per year is now a bar chart too, and clicking a year lists that year's remarks. Answers: how did this member vote, and how often were they absent, year by year?",
          "areas": [
            "people"
          ],
          "links": [
            "/people?person=josh-dunwoody#votes-per-year"
          ]
        }
      ]
    },
    {
      "id": "2026-09-27-roundup-pay-income-and-stipends",
      "date": "2026-09-27",
      "type": "roundup",
      "title": "Pay: Census income beside police pay, estimated stipends per official, and a narrower scope",
      "summary": "Altoona by the numbers again charts Census income beside the hourly step range in Altoona's police contract, on one axis as hourly equivalents of a full-time year, with three income lines (per household, per person, and per earner) explained in a plain note, Polk County Sheriff and Iowa and U.S. reference figures, and each table row able to open its own chart. The FBI charts mark the ALPR program's steps for reference only. The Public pay page adds a sortable estimate of each Mayor and Council member's cumulative stipend over their documented service, reconciled against the Council page's full-year figures and laid out to fit a phone. The pay page and income chart now cover Council, Mayor, and police only.",
      "areas": [
        "charts",
        "data",
        "local",
        "pay",
        "people"
      ],
      "links": [
        "/local#pay-context",
        "/pay#stipend-earned",
        "/pay"
      ],
      "changes": [
        {
          "id": "2026-09-27-pay-and-crime-chart-context",
          "date": "2026-09-27",
          "type": "feature",
          "title": "Census income is back beside police pay, and FBI charts mark ALPR milestones",
          "summary": "Altoona by the numbers again shows the Census Bureau's median earnings and median household income, with their margins of error, in a dollars-a-year chart beside the hourly pay range in Altoona's police contract. The two stay in their own units: the contract prints hourly rates with no scheduled hours, so nothing is converted. The FBI offense, clearance, and rate charts now mark the year of each step in Altoona's ALPR program as the City describes it (the 2022 Flock pilot, the 2024 Flock expansion, and Council's July 21, 2025 Axon approval), for reference only; they cannot show whether cameras changed anything. The rate charts keep their Iowa and U.S. lines. A partial year, like 2026 so far, is now joined to the last full year by a dashed line instead of left floating, and the same applies to every chart built from the site's shared series chart. Reader question answered: what did residents earn beside what police are paid, and when did the ALPR program change relative to reported offenses?",
          "areas": [
            "local",
            "charts"
          ],
          "links": [
            "/local#pay-context",
            "/local#fbi-heading"
          ]
        },
        {
          "id": "2026-09-27-pay-chart-household-and-per-person",
          "date": "2026-09-27",
          "type": "feature",
          "title": "Police pay chart shows income per household, per person, and per earner",
          "summary": "The Incomes and police pay chart on Altoona by the numbers now shows three Census income lines beside the police contract's hourly step range, each as an hourly equivalent of a full-time year with its margin of error and each labeled with what it is per: median income per household (which can include more than one earner), income per person (per capita, counting every resident including children and retirees), and median earnings per earner. Dashed chart lines, such as the Polk County Sheriff's Office rate on the FBI charts, now show a small dashed key in the legend instead of an oversized bar.",
          "areas": [
            "local",
            "charts"
          ],
          "links": [
            "/local#pay-context"
          ]
        },
        {
          "id": "2026-09-27-pay-chart-one-axis-polk-county-drilldowns",
          "date": "2026-09-27",
          "type": "feature",
          "title": "Pay/income comparison moves to one chart; Polk County and Iowa/U.S. lines; row drilldowns",
          "summary": "A same-day follow-up to \"Census income is back beside police pay\" (this entry supersedes that one's pay-chart description; its milestone and dashed-partial-segment description still stands). The income-vs-pay comparison now shares one chart and axis instead of two separate ones: Census median household income and median earnings are converted to an hourly equivalent of a full-time year (divided by 2,080 hours -- the chart's own note says Census income is not an hourly wage) and plotted beside the police contract's hourly step range as a whisker with no invented single value. ALPR-timeline markers are now read from the public ALPR vote cross-reference feed's own stage_id/vote_id fields at render time, rather than typed directly into the chart code, so they can never drift from that record. The FBI offense-rate charts and tables gain a fourth reference line and column for the Polk County Sheriff's Office (FBI ORI IA0770000) -- that one agency's own series, not a county-wide total -- and the Census income cards gain the matching Iowa and U.S. medians with their own margins of error, both fetched through the private workspace's archive_sources.py conventions and reconciled against the retained source snapshots. Each row of the Census and FBI tables can now expand into that row's own chart in context, via a new small shared helper (src/row-drilldown.js) built for reuse on other pages.",
          "areas": [
            "local"
          ],
          "links": [
            "/local#pay-context",
            "/local#by-the-numbers"
          ]
        },
        {
          "id": "2026-09-27-pay-chart-unit-note",
          "date": "2026-09-27",
          "type": "feature",
          "title": "Income chart says what per household, per person, and per earner mean",
          "summary": "A plain line under the Incomes and police pay chart now explains its three income lines: per household adds up everyone in one home, often more than one earner; per person spreads all income across every resident, including children and retirees; per earner is the middle value among people 16 and older who had any earnings.",
          "areas": [
            "local"
          ],
          "links": [
            "/local#pay-context"
          ]
        },
        {
          "id": "2026-09-27-pay-estimated-cumulative-stipend",
          "date": "2026-09-27",
          "type": "feature",
          "title": "/pay now estimates each Council member's and the Mayor's cumulative stipend over their documented service",
          "summary": "The elected-officials section of /pay adds a sortable table estimating what each current and former Mayor and Council member has been paid in stipend so far: their documented service window (from the People glossary's term history, or a sitting member's first appearance on the Council roll call), the City-ordinance rate in effect on each day served, and a resulting estimate, plus a combined all-seats total and a per-year reconciliation against the /council stipend row's full-year figures that explains the handful of short gaps (the record starting January 6, 2020 rather than January 1; brief vacancies between a departure and the next appointment). Elizabeth Burns-Thompson's estimate stops at her last documented roll call, not her term's official end date, because she left the seat early. Josh Dunwoody's shows two figures: a headline total that excludes his documented military-leave window (when Kyle Mertz held the seat), and a separate, not-combined leave-window figure, because the record does not say whether his stipend continued during it. Everything recomputes client-side from the published pay, people, and session feeds; nothing is a hard-coded total.",
          "areas": [
            "pay",
            "people",
            "data"
          ],
          "links": [
            "/pay#stipend-earned"
          ]
        },
        {
          "id": "2026-09-27-pay-scope-council-mayor-police-only",
          "date": "2026-09-27",
          "type": "data-update",
          "title": "Pay page and income chart narrowed to Council, Mayor and police",
          "summary": "Pay page and income chart now cover Council, Mayor and police only; other departments removed to keep the site's focus on Council, police and the ALPR program.",
          "areas": [
            "pay",
            "local"
          ],
          "links": [
            "/pay",
            "/local#pay-context"
          ]
        },
        {
          "id": "2026-09-27-stipend-estimate-layout",
          "date": "2026-09-27",
          "type": "feature",
          "title": "Public pay: the stipend estimate fits a phone, with each person's notes one tap away",
          "summary": "The estimated stipend table no longer scrolls sideways. Each person's service dates, sources and notes open under their row instead of a long numbered list, the rates used are one short line, and the check against the /council stipend row leads with its answer and opens each year's explanation on its own row. Reader question: how much has each Mayor and Council member been paid, and does it add up?",
          "areas": [
            "pay"
          ],
          "links": [
            "/pay#stipend-earned"
          ]
        }
      ]
    },
    {
      "id": "2026-09-27-roundup-menus-sharing-and-page-tools",
      "date": "2026-09-27",
      "type": "roundup",
      "title": "Menus, sharing, page contents, and plainer caveats",
      "summary": "Menu tab names now open their section, and a Tools menu gathers the district lookup, meeting guide, and records-request guide. Long pages open with an On this page list and a floating button to jump between sections. Every page has a Share menu (Reddit, Facebook, Twitter, Nextdoor, Bluesky, email, and Copy link) with no tracking scripts, and each story on /news has its own link. Long notes under charts show their most important caveat as one line, with the full sources one click away. A missing address now shows a site page instead of a raw server error, the reads counter shows who is here now and links to a site-traffic chart, the About page states what the site has cost, and What's new gained a changes-over-time chart and year, month, and day groups with filters.",
      "areas": [
        "charts",
        "council",
        "local",
        "news",
        "pay",
        "site",
        "site-shell",
        "transparency"
      ],
      "links": [
        "/about#costs",
        "/transparency#site-traffic",
        "/whats-new",
        "/local/civic"
      ],
      "changes": [
        {
          "id": "2026-09-27-about-costs-related-projects",
          "date": "2026-09-27",
          "type": "feature",
          "title": "About: what the project costs, and related independent projects",
          "summary": "The About page now states plainly what building and running the site has cost as of September 27, 2026: under $1,000 paid personally (public-records request fees, domain registrations, hosting, and development and AI tools), with no ads, sponsorships, or outside funding. It also lists related independent projects tracking ALPR use and surveillance records (DeFlock, EyesOffCR, Eyes On Flock, and Restoring Democracy's Promise), none of them affiliated with this site.",
          "areas": [
            "site",
            "transparency"
          ],
          "links": [
            "/about#costs",
            "/about#related-projects"
          ]
        },
        {
          "id": "2026-09-27-caveat-line-and-expander",
          "date": "2026-09-27",
          "type": "feature",
          "title": "Easier-to-read sources and caveats",
          "summary": "Answers \"what's the one thing I need to know about this number?\" without a wall of fine print. Long notes under charts and tables now show their most important caveat as one line, with a \"Sources and caveats\" link that opens the full sources, method, and remaining caveats. On the crime charts the visible line is that the numbered ALPR milestones are context only, not evidence of any change. On /pay the police rate table now says above it, plainly, that the contract expired and no later one exists. Nothing was removed: every source and caveat is one click away, opens from the keyboard, and prints open.",
          "areas": [
            "site",
            "local",
            "council",
            "pay"
          ],
          "links": [
            "/local#by-the-numbers",
            "/pay#police",
            "/council",
            "/research"
          ]
        },
        {
          "id": "2026-09-27-custom-404-page",
          "date": "2026-09-27",
          "type": "feature",
          "title": "A real page for a missing address, instead of a raw server error",
          "summary": "A link that no longer exists, or a mistyped address, used to show a bare AWS error message. It now opens a Deflock Altoona page in the site's own look, with links back to the homepage, the vote tracker, City Council, the local corner, and a way to report the broken link.",
          "areas": [
            "site"
          ],
          "links": [
            "/404.html"
          ]
        },
        {
          "id": "2026-09-27-here-now-site-traffic",
          "date": "2026-09-27",
          "type": "feature",
          "title": "Reads counter adds \"here now\" and links to a site-traffic chart",
          "summary": "The reads counter at the top of every page now shows how many people have the site open right now, alongside reads today and all time, and \"today\" now resets at midnight Central time instead of UTC. Clicking the counter opens a new Site traffic section on the Transparency page with reads per day and reads per hour over the last 48 hours, plus a table. It stays cookie-free: each open tab that is on screen checks in every 30 seconds (replacing the old 15-second refresh), and only running counts are stored, never IP addresses or visitor IDs. Automated test browsers no longer count as readers.",
          "areas": [
            "site-shell",
            "transparency"
          ],
          "links": [
            "/transparency#site-traffic"
          ]
        },
        {
          "id": "2026-09-27-nav-tab-labels-link",
          "date": "2026-09-27",
          "type": "feature",
          "title": "Menu tab names now open their section",
          "summary": "Reader question: where does clicking \"Council\" in the menu go? Each tab name now opens its section: Council goes to the City Council page, Police & ALPR to the Police Department page, Local to Local Corner, Tools to Find your districts, and News & research to News. The list of pages still opens when you point at a tab, and the small arrow beside each name opens it by tap or keyboard. In the phone menu, each section heading is a link too.",
          "areas": [
            "site"
          ],
          "links": [
            "/council",
            "/police",
            "/local",
            "/local/civic",
            "/news"
          ]
        },
        {
          "id": "2026-09-27-news-item-links",
          "date": "2026-09-27",
          "type": "feature",
          "title": "Link straight to a story on /news",
          "summary": "Answers \"how do I send someone this one item?\" Every story on /news, and the Current and Archived sections, now has a Copy link button that copies a link to that exact item (on phones it opens your share sheet). Opening one of those links scrolls to the item and highlights it. Site search results for stories now land on the story itself instead of the top of /news. No story, source, or date changed.",
          "areas": [
            "news",
            "site"
          ],
          "links": [
            "/news"
          ]
        },
        {
          "id": "2026-09-27-page-contents",
          "date": "2026-09-27",
          "type": "feature",
          "title": "Long pages get an \"On this page\" list and shorter card runs",
          "summary": "Long pages now open with an \"On this page\" list of their sections, and once you scroll past it an \"On this page\" button at the bottom left opens the same list, marks the section you're in, and has a Back to top link. Each entry is a link you can share. Long runs of similar cards now show the first few with a \"Show more\" button: the People directory shows 12 before \"Show more people\", and each day on What's New shows 10 changes before the rest. Linked and searched records open their group automatically. The roster on the Local corner is now a grid of compact cards. Answers the reader question: what else is on this page, and how do I get to it without scrolling past everything?",
          "areas": [
            "site"
          ],
          "links": [
            "/local",
            "/people",
            "/whats-new"
          ]
        },
        {
          "id": "2026-09-27-share-links-ai-discovery",
          "date": "2026-09-27",
          "type": "feature",
          "title": "Share any page to Reddit, Facebook, Twitter, Nextdoor, Bluesky, or email",
          "summary": "Every page now has a small Share menu under its title and a share row at the top of the footer, with Reddit, Facebook, Twitter, Nextdoor, Bluesky, email, and Copy link (plus the phone's own share sheet where available). They are plain links: no social-media scripts, cookies, or tracking parameters are added, and the shared link keeps the current filters and record anchor. For search engines and AI assistants, the site now publishes llms.txt (a plain-text guide to its pages and data feeds, with citation guidance), and the Votes, Pay, and ALPR tracker pages describe their data feeds as datasets.",
          "areas": [
            "site",
            "site-shell"
          ],
          "links": [
            "/votes",
            "/llms.txt"
          ]
        },
        {
          "id": "2026-09-27-tools-menu",
          "date": "2026-09-27",
          "type": "feature",
          "title": "New Tools menu for the district lookup, meeting guide, and records guide",
          "summary": "Answers \"where do I look up my precinct or get ready to speak at a meeting?\" from any page. The site menu now has a Tools section with Find your districts, the Meeting guide, and the Records request guide. The large district-lookup box that sat under the menu on the City Council and Police pages is gone, so those pages open straight to their content. On narrower laptop and tablet screens the menu switches to the Menu button a little sooner so it stays on one line.",
          "areas": [
            "site"
          ],
          "links": [
            "/local/civic",
            "/activist",
            "/local/records-guide"
          ]
        },
        {
          "id": "2026-09-27-whats-new-changes-over-time-chart",
          "date": "2026-09-27",
          "type": "feature",
          "title": "What's new charts how often the site changes, and what kind of change",
          "summary": "Reader question: how often does this site change, and are the changes new features or fixes to its data? What's new now opens with a \"Changes over time\" chart: logged changes per day for the last 30 days, or per week or month across the whole log, stacked by type (feature, data fix, data update, and correction or review together). The type and area filters apply to the chart, the key works as a type filter, the view is saved in the link, and the counts are available as a table and a CSV download. Click a bar to open that day's changes. Today's bar is drawn pale and dashed because the day is not over.",
          "areas": [
            "site",
            "charts"
          ],
          "links": [
            "/whats-new"
          ]
        },
        {
          "id": "2026-09-27-whats-new-grouped-by-date-with-filters",
          "date": "2026-09-27",
          "type": "feature",
          "title": "What's new: grouped by year/month/day with type filters",
          "summary": "The /whats-new change log had grown to nearly 80 entries in one flat list. Entries now nest into collapsible Year \u2192 Month \u2192 Day groups (native details/summary, matching the site's data-disclosure pattern), each summary showing its count and a type breakdown (e.g. \"September 2026 \u00b7 12 changes \u00b7 8 features, 3 data fixes\u2026\"); only the newest day (and its parent month and year) opens by default, with Expand all / Collapse all controls. Filter chips for type (feature, data fix, data update, correction, review) and for area (votes, people, council, alpr, etc.) let a reader narrow the log; chip counts and group counts update live, empty groups disappear, and matching groups open automatically. Filters are reflected in the URL (?type=...&area=...) and a direct link to one entry (#entry-id) still opens that entry's year, month, and day groups.",
          "areas": [
            "site"
          ],
          "links": [
            "/whats-new"
          ]
        }
      ]
    },
    {
      "id": "2026-09-27-roundup-meeting-schedule-and-records",
      "date": "2026-09-27",
      "type": "roundup",
      "title": "Meeting schedule from the City's archive, a public Missing records list, and eight more meetings' votes",
      "summary": "The Council meeting schedule now comes from the City's posted agendas, read twice daily, instead of a hand-typed first-and-third-Monday guess, and the meeting guide shows the same next meeting as the homepage. Every page counts known Council meetings the same way, including workshops and the April 1, 2024 budget session, and the Transparency page lists each known meeting whose minutes are not on this site yet. Eight 2022 and 2023 meetings whose minutes were image-only scans are now parsed from OCR transcriptions, adding 69 vote records and 8 sessions; June 20 and December 12, 2022 remain the only Council meetings with no minutes on the site. The meeting records table is shorter, with one Minutes posted column.",
      "areas": [
        "activist",
        "council",
        "data",
        "local",
        "search",
        "votes"
      ],
      "links": [
        "/local",
        "/transparency#missing-records",
        "/votes#meeting-coverage",
        "/activist"
      ],
      "changes": [
        {
          "id": "2026-09-27-council-meeting-schedule-from-city-archive",
          "date": "2026-09-27",
          "type": "feature",
          "title": "Council meeting schedule now comes from the City's posted agendas, not a hand-typed guess",
          "summary": "newsroom/meetings.json was hand-maintained from an old cadence guess (first and third Monday), so it had gone stale: it still showed an October date as \"expected\" while the City's own archive already listed a September 28 Council Workshop with a posted agenda and a September 21 meeting held with minutes not yet posted. A new daily collector (scripts/collect_meeting_schedule.py) now reads the City's official agendas-and-minutes archive directly, reads each posted agenda's first page for the meeting kind, date, time, venue, and agenda item titles, and records whether minutes are posted -- never a Zoom join link, meeting ID, passcode, or dial-in number, which are stripped before anything else is read. The feed went from 2 hand-typed placeholder records to 5 records reflecting what the City has actually posted (one with posted minutes, one held with minutes pending, one upcoming workshop with a posted agenda, plus 2 cadence-derived placeholders for dates nothing is posted for yet), and now runs twice daily.",
          "areas": [
            "local",
            "council",
            "data"
          ],
          "links": [
            "/local",
            "/"
          ]
        },
        {
          "id": "2026-09-27-known-meetings-missing-records",
          "date": "2026-09-27",
          "type": "data-fix",
          "title": "One count of Council meetings on every page, and a public Missing records list",
          "summary": "Answers \"which Council meetings since 2020 have no records, and why?\". Every page now counts known Council meetings the same way: each session the City's archive lists or a later record shows was held, including workshops and the April 1, 2024 budget session, which has its own minutes. Before, the coverage chart, the meeting-length figures, and the public turnout table disagreed for 2022, 2024, and 2026; they now all read 25 for 2022, 25 for 2024, and 19 for 2026 so far. The Transparency page lists each known meeting whose minutes are not on this site yet. No vote, tally, or attendance record changed.",
          "areas": [
            "votes",
            "council",
            "data"
          ],
          "links": [
            "/transparency#missing-records",
            "/votes#meeting-coverage",
            "/council"
          ]
        },
        {
          "id": "2026-09-27-meeting-guide-shared-roster-and-schedule",
          "date": "2026-09-27",
          "type": "data-fix",
          "title": "Meeting guide shows the next posted meeting and reads its roster from the People records",
          "summary": "The meeting guide (/activist) guessed the next meeting from the calendar on its own, so it skipped posted workshops and could land on the wrong Monday; it now shows the same next meeting as the homepage and Local corner, with the posted agenda. Its roster and term dates now come from the People records instead of a typed-in list, recent vote signals are in agenda order with readable dates, and search results show dates as \"Sep 26, 2026\".",
          "areas": [
            "activist",
            "search"
          ],
          "links": [
            "/activist",
            "/search"
          ]
        },
        {
          "id": "2026-09-27-meeting-records-table-simpler",
          "date": "2026-09-27",
          "type": "feature",
          "title": "Meeting records table: one Minutes column",
          "summary": "Answers \"did the City post this year's agendas and minutes?\" in a glance. The Council meetings by year table on /transparency and /votes is shorter: one Minutes posted column, and a note cut to the partial-year line and one caveat. No meeting, vote, or date changed.",
          "areas": [
            "votes",
            "data"
          ],
          "links": [
            "/transparency#archive-coverage",
            "/votes#meeting-coverage"
          ]
        },
        {
          "id": "2026-09-27-same-day-sessions-vote-counts",
          "date": "2026-09-27",
          "type": "data-fix",
          "title": "Votes: the April 1, 2024 budget session now counts as its own meeting",
          "summary": "Answers \"how many meetings do these votes come from?\". On April 1, 2024 the Council held a regular session and a separate budget session, each with its own minutes. The meeting counts on /votes treated them as one meeting, while the Transparency page and the meeting coverage chart counted two. Every vote now carries the session it was taken in, so /votes counts 10 votes in the regular session and 1 in the budget session, and two meetings that day, the same as every other page. No vote, tally, or date changed.",
          "areas": [
            "votes",
            "data"
          ],
          "links": [
            "/votes",
            "/transparency#missing-records"
          ]
        },
        {
          "id": "2026-09-27-supplied-scan-votes-eight-meetings",
          "date": "2026-09-27",
          "type": "data-update",
          "title": "Eight more 2022-2023 Council meetings' votes and sessions, from scanned minutes",
          "summary": "The six image-only scanned Council minutes this site could not previously read (2022-11-07, 2022-11-21, 2023-02-20, 2023-03-06, 2023-05-01, 2023-05-15) are now parsed from an editor OCR transcription of the same scans, reconciled to each roll call's own printed tally. Two more 2022 meetings the City's online archive did not previously link (2022-12-05, 2022-12-19) are also newly readable, from this site's own OCR of the same scanned PDFs. Together these add 69 vote records and 8 Council sessions. A small number of severely damaged tally marks could not be reconciled to the printed total and are left out, per this site's rule of never guessing a blank or unreadable mark; two of the printed totals on 2022-12-05 do not match the recovered marks and are noted as printed rather than corrected. 2022-06-20 and 2022-12-12 remain the only Council meetings with no minutes on this site at all. Public comment and \"Audience Present\" attendance for these eight meetings are not yet reviewed and are not part of this update.",
          "areas": [
            "votes",
            "council"
          ],
          "links": [
            "/votes",
            "/council",
            "/transparency#missing-records"
          ]
        }
      ]
    },
    {
      "id": "2026-09-27-roundup-homepage-front-door",
      "date": "2026-09-27",
      "type": "roundup",
      "title": "The homepage is now a front door built from live figures; stories move to /news",
      "summary": "The homepage leads with one line on what the site is, then live figures: 30-day vendor-reported ALPR detections from both Flock and Axon, vendor and community-mapped camera counts, the next Council meeting, and a recap of the last one (roll calls, absences, public-comment speakers, and remarks). Tiles lead into Council and votes, People, the ALPR tracker, Local, Pay, and Transparency, each with a live teaser, and the full newsroom layout moves to /news. The Local corner gets the same next-meeting block, the last agenda in agenda order, and a live roster. Those blocks are saved into the page at each deploy, so they show without scripts and in link previews. Pages no longer jump while loading, and a late arrival noted in the minutes no longer counts as absent in the recap.",
      "areas": [
        "alpr",
        "home",
        "homepage",
        "local",
        "news",
        "people",
        "site",
        "votes"
      ],
      "links": [
        "/",
        "/news",
        "/local"
      ],
      "changes": [
        {
          "id": "2026-09-27-home-front-door",
          "date": "2026-09-27",
          "type": "feature",
          "title": "Home page now leads with live figures and a guide to the site; stories moved to /news",
          "summary": "Reader request: the homepage was dominated by the full newsroom feed (a lead report, external reports, and an opinion column), and /news already covers that ground. The homepage is now the site's front door: one line on what the site is, then large live figures (30-day vendor-reported ALPR detections, vendor and community-mapped camera counts, the next Council meeting, and a one-line recap of the last one), an \"Explore the record\" set of tiles into Council & votes, People, the ALPR tracker, Local & civic lookup, Pay, and Transparency & corrections (each with one live teaser figure), the existing compact Latest grid, and a short \"From the newsroom\" strip (the lead headline plus a few recent ones) linking to /news. The full lead-report layout, the external-report column, the opinion column, and every story's source-resource links now live on /news. Every figure is still computed from the same public feeds the rest of the site uses, never typed into the page.",
          "areas": [
            "homepage",
            "news"
          ],
          "links": [
            "/",
            "/news"
          ]
        },
        {
          "id": "2026-09-27-homepage-and-local-corner-refresh",
          "date": "2026-09-27",
          "type": "feature",
          "title": "Homepage and the local corner, rebuilt on the feeds the site already has",
          "summary": "The homepage now shows a little of everything, computed live from the public feeds rather than typed by hand: a \"heads up\" on the next Council meeting (derived from the record's own meeting cadence, or the archived schedule when a specific date is posted) plus a recap of the last one (roll calls, pass/fail, absences, public-comment speakers, and 1-2 official-remarks headlines); a \"Latest\" strip of the newest votes, official remarks, public comments, stories, and What's new entries; \"Council at a glance\" (the current roster with term status and a presence stat); \"ALPR now\" (the vendor-reported camera, detection, and hotlist-hit readings, dated, linking to the full tracker); and a three-figure \"Altoona by the numbers\" preview linking to /local. The /local corner gets the same heads-up block, a live council roster with an official-contact-only \"how to reach\" line, what was on the last meeting's agenda, and the existing \"how to be heard\" guidance and civic-lookup entry point grouped into one \"Before the meeting\" section. The hand-typed \"first and third Monday\" date math and the two hard-typed upcoming meeting dates are gone in favor of a shared derivation module (src/local-heads-up.js) both pages call, so the homepage and /local can never disagree about the next meeting or the last one's recap. The #pay-context and FBI offense/clearance sections on /local are unchanged.",
          "areas": [
            "site",
            "local",
            "votes",
            "people",
            "alpr"
          ],
          "links": [
            "/",
            "/local"
          ]
        },
        {
          "id": "2026-09-27-homepage-flock-plus-axon",
          "date": "2026-09-27",
          "type": "feature",
          "title": "Homepage ALPR figures now cover both Flock and Axon",
          "summary": "Reader question: how many plates did all of Altoona PD's license-plate readers record in the last 30 days, not just Flock's? The homepage figure now adds Flock's vehicles-detected count and Axon's plate reads (kept under its 30-day retention rule), shows each vendor's number and data date beside the total, and notes that neither vendor counts unique vehicles. The camera figure stays Flock's reported count and says Axon's portal does not publish one. The homepage ALPR tile now shows combined hotlist hits for the last 30 days. The homepage, the ALPR tracker, and the site header all read these totals from one new file, /alpr/vendor-combined.json.",
          "areas": [
            "alpr",
            "homepage"
          ],
          "links": [
            "/",
            "/alpr/tracker",
            "/alpr/vendor-combined.json"
          ]
        },
        {
          "id": "2026-09-27-homepage-without-javascript-and-share-image",
          "date": "2026-09-27",
          "type": "feature",
          "title": "The homepage shows its figures before scripts load, and links get a preview image",
          "summary": "Reader question: what does the homepage say if my browser blocks scripts, or when someone shares a link? Before, the top story, Latest, next meeting, Council roster, ALPR figures, and Census/FBI figures all read \"Loading\" until JavaScript ran, so search results and link previews showed no numbers. Each deploy now saves a copy of those blocks, rendered from the same public feeds by the page's own code, into the homepage; the page still refreshes them from the feeds when scripts run. Shared links now show a large preview card in the site's masthead style. The meeting guide (/activist) is now linked from the homepage and the Local corner, and the next-meeting time reads 6:30 P.M. instead of 18:30.",
          "areas": [
            "homepage",
            "local"
          ],
          "links": [
            "/",
            "/activist",
            "/local"
          ]
        },
        {
          "id": "2026-09-27-local-agenda-order-and-grouping",
          "date": "2026-09-27",
          "type": "data-fix",
          "title": "Local corner: last agenda now in agenda order",
          "summary": "\"What was on the last agenda\" on /local listed roll-call items in an arbitrary order (a generated record id), which could put Adjournment first. It's now ordered by agenda item number, with repeated readings of the same ordinance (first reading, second & third reading, publish) collapsed into one line. A title truncated in the source record (e.g. a sewer-fee waiver missing its dollar amount) is trimmed to its last complete clause rather than shown mid-word, and the Consent Agenda line expands to its own bundled items. Each line links to its /votes record.",
          "areas": [
            "local"
          ],
          "links": [
            "/local#before-the-meeting"
          ]
        },
        {
          "id": "2026-09-27-meeting-recap-late-arrivals-not-absent",
          "date": "2026-09-27",
          "type": "data-fix",
          "title": "Meeting recaps no longer list late arrivals as absent",
          "summary": "The homepage and /local \"last meeting\" recap counted anyone marked absent on the printed roll call as absent for the whole meeting, even where the minutes note a later arrival time (for example, \"arrived per Zoom at 6:31pm\"). src/vote-stats.js's /people attendance figures already counted a noted later arrival as present; the recap now shares that same rule (a small addition to src/vote-stats.js, reused by src/local-heads-up.js), so a late arrival is no longer counted toward the recap's absence line. The recap module now also computes a separate late-arrivals list with each person's printed arrival time, for a future recap line; it is not yet shown on the live page. No vote or session record changed; the recap for the most recent meeting (2026-09-08) is unaffected, since that roll call has no recorded late arrival.",
          "areas": [
            "site",
            "local",
            "votes",
            "people"
          ],
          "links": [
            "/",
            "/local"
          ]
        },
        {
          "id": "2026-09-27-readability-and-layout-shift",
          "date": "2026-09-27",
          "type": "feature",
          "title": "Pages stop jumping while they load, and easier-to-read meeting and profile cards",
          "summary": "Pages no longer jump down while the header, menu and news list load. The next-meeting preview also skips minutes approval and \"Perfecting and approval of the agenda\", dates on the homepage read as \"September 25, 2026\", and the latest-minutes figure is shorter. Term counters on Council cards now say \"days left\", vote totals on /votes use thousands separators, and links everywhere use the site's link color.",
          "areas": [
            "home",
            "local",
            "votes",
            "news"
          ],
          "links": [
            "/",
            "/local",
            "/votes",
            "/news"
          ]
        }
      ]
    },
    {
      "id": "2026-09-27-roundup-council-page-roll-calls-presence-and-pay",
      "date": "2026-09-27",
      "type": "roundup",
      "title": "Council page: what roll calls are on, presence rates, pay per meeting hour, and public turnout",
      "summary": "The Council page groups all 1,941 recorded roll-call votes since January 2020 by the kind of agenda item they were taken on, charts each year's share, and adds each member's longest and current run of consecutive meetings present. Roster cards lead with presence as a rate against expected meetings, and the Mayor's card shows meetings present and presided instead of a vote statistic that cannot apply to the office. The Mayor and Council pay table now works each finished year's stipend out per meeting, meeting hour, roll-call vote, agenda item, dissenting vote, absence, and public-comment speaker, always as an aggregate of the office rather than one person's pay against their own record, with a figure for every year the records support and the current year left out until it ends. A Public turnout section reads the minutes' Audience Present line, counts only. Each section now opens from a one-line preview computed from its own data.",
      "areas": [
        "council",
        "data",
        "pay",
        "people",
        "votes"
      ],
      "links": [
        "/council#roll-call-topics",
        "/council#attendance-streaks",
        "/council#meeting-pay",
        "/council#audience-presence"
      ],
      "changes": [
        {
          "id": "2026-09-27-audience-presence-turnout",
          "date": "2026-09-27",
          "type": "feature",
          "title": "Public turnout: what the minutes document about who else showed up",
          "summary": "A new feed reads the retained Council minutes' \"Audience Present\" line, the only consistently printed audience indicator found across all 159 minutes since 2020 (no printed attendance headcount, and no other label such as \"Others Present\" or \"Visitors,\" was ever found). The Council page's new Public turnout section shows, per year, how many meetings have a documented audience count, the total named others present, and total public-comment speakers, with a trend chart. The Votes page's Public comment tab adds \"Meetings with the most public participation,\" ranked by meeting rather than by person, beside the existing Most frequent public speakers table, with each row linking to that meeting. Only counts are published; no audience member's name is. A meeting with no printed indicator is marked as a gap, not zero attendance.",
          "areas": [
            "council",
            "votes",
            "data"
          ],
          "links": [
            "/council#audience-presence",
            "/votes#audience-participation"
          ]
        },
        {
          "id": "2026-09-27-council-cost-per-meeting-hour-vote-item",
          "date": "2026-09-27",
          "type": "feature",
          "title": "What Mayor and Council pay works out to per meeting hour, vote, and agenda item",
          "summary": "Answers the question \"what does an hour of Council meeting time, or one agenda item, cost in elected officials' pay?\" On the City Council page, the Average meeting length by year table now shows Mayor and Council pay per meeting hour beside each year's total meeting time. The pay-per-meeting table now gives, for each finished year, the year's stipend and what it works out to per meeting, per meeting hour, per roll-call vote, and per agenda item voted on, each for the Mayor and all five seats together with the Mayor's office and one Council seat beneath, plus a row for all finished years combined. Rates are the annual stipends set by City ordinance (adopted September 5, 2023). These are estimated ratios, not hourly wages: pay covers every duty of the office. A figure is left blank when the year is still under way or its minutes are incomplete, so it cannot overstate the cost.",
          "areas": [
            "council",
            "pay",
            "data"
          ],
          "links": [
            "/council#meeting-pay",
            "/council#meeting-time"
          ]
        },
        {
          "id": "2026-09-27-council-pay-per-dissenting-vote",
          "date": "2026-09-27",
          "type": "data-update",
          "title": "Council pay table adds per-dissenting-vote, per-absence, and public-comment ratios",
          "summary": "The Mayor and Council pay table on /council adds five more ratios beside the existing per-meeting, per-roll-call, and per-agenda-item figures: pay per recorded dissenting (nay) vote, per non-unanimous roll call, per unanimous consent-agenda item, per recorded absence, and per public-comment speaker. Every figure is the same kind of aggregate as before -- the Mayor's office, one Council seat, or the body together, never one member's own votes or absences divided by that person's own pay. A year with zero recorded dissenting votes (2023, so far) says so in words instead of showing a dash or a division, and a year with incomplete minutes or public-comment records is marked with the same asterisk-and-note system as the rest of the table.",
          "areas": [
            "council"
          ],
          "links": [
            "/council"
          ]
        },
        {
          "id": "2026-09-27-council-pay-ratios-show-all-years",
          "date": "2026-09-27",
          "type": "data-update",
          "title": "Council pay-per-meeting table: every year now shows its figures",
          "summary": "The Mayor and Council pay table on /council used to leave a year blank -- a dash -- whenever a record was missing, even years where most of the meetings were fully documented. It now shows every figure the records support for every year, including 2022 (two meetings with no minutes), 2023 and 2024 (some meetings with no printed times), and 2026 (the year in progress). A superscript asterisk marks a figure built on incomplete records, linking to a note that says what is missing and, for the roll-call and agenda-item figures, that the number may run high because the missing meetings' votes aren't counted either. The current year's figure is now its pay to date, not a dash, and the totals row adds every year instead of skipping the ones with a gap.",
          "areas": [
            "council"
          ],
          "links": [
            "/council"
          ]
        },
        {
          "id": "2026-09-27-council-roll-call-categories-and-attendance-streaks",
          "date": "2026-09-27",
          "type": "feature",
          "title": "Council page: what roll calls are on, and consecutive meetings present",
          "summary": "The Council page now groups all 1,941 recorded roll-call votes since January 2020 by the kind of agenda item they were taken on (resolutions, ordinance readings, consent agendas, agenda and minutes approvals, adjournments, fee-waiver requests, agreements, and more), with each year's share charted and every count in a table. The rules that assign each category are listed on the page. A consent agenda bundles several items into one roll call, and each ordinance reading is its own roll call. One roll call in the period failed, and the page links to it. A new table beside the presence grid shows each Council member's and the mayor's longest and current runs of consecutive meetings present, counted only while they held a seat; meetings with no readable minutes and meetings during a leave neither break nor extend a run, and the table notes when a run crosses them.",
          "areas": [
            "council",
            "votes",
            "data"
          ],
          "links": [
            "/council#roll-call-topics",
            "/council#attendance-streaks"
          ]
        },
        {
          "id": "2026-09-27-council-roll-call-stipend-cost",
          "date": "2026-09-27",
          "type": "feature",
          "title": "Council roll-call table now links to what those meetings cost in stipend pay",
          "summary": "The /council roll-calls-by-category table now has a \"Stipend pay, Mayor + Council\" row below \"All roll calls\": for each year, the Mayor and five Council seats' combined annual pay (set by City ordinance, from /pay#elected) shown as a per-meeting rate multiplied back by that year's known Council meetings (from the session log, not the roll-call count \u2014 one meeting can hold several roll calls), with an All-years total that sums each year's own rate rather than applying today's rate to every year. Labeled stipend pay only, not total compensation, and linked to /pay#elected for the full breakdown; a year the published pay dataset does not cover would say \"Rate not established for this period\" instead of guessing (none of 2020\u20132026 hit that).",
          "areas": [
            "council",
            "pay"
          ],
          "links": [
            "/council",
            "/pay"
          ]
        },
        {
          "id": "2026-09-27-council-roster-presence-rate",
          "date": "2026-09-27",
          "type": "feature",
          "title": "Council roster cards show presence as a rate against expected meetings",
          "summary": "Every card on /council now leads with meeting presence as a percentage of expected meetings, not just a raw count: the Mayor's card reads \"Present 82% (126 of 153) \u00b7 presided 128\"; a Council member's reads \"Present 98% (150 of 153) \u00b7 Participation 97.8%\". Participation stays the separate, vote-based figure it always was. The rate is computed with the existing VoteStats.presenceStats helper (src/vote-stats.js), the same one /people and /votes already use; no new math and nothing hard-coded. The existing Presence record links are unchanged, including the Mayor's link to /votes#council-presence.",
          "areas": [
            "council",
            "votes",
            "data"
          ],
          "links": [
            "/council"
          ]
        },
        {
          "id": "2026-09-27-council-roster-shows-meeting-presence",
          "date": "2026-09-27",
          "type": "feature",
          "title": "Council roster cards show meeting presence; the Mayor's card no longer shows a vote stat",
          "summary": "The Mayor's card on /council previously showed \"Roll-call vote: not listed\", implying a roll-call vote statistic that can never apply to the Mayor's office. It now shows \"Present at N of M meetings\" plus how many meetings he presided over, using the same VoteStats.presenceStats helper and wording as the People glossary's cards and profiles (added for /people on 2026-09-27). Council members keep their Participation percentage and gain the same \"Present at N of M\" line. Every card also gained a Presence record link to that person's presence card on the Votes page; the Mayor's points to the Council-presence tab itself, not a per-person card, since the Mayor never has a recorded vote for that directory to key one to (matching the same fix on /people, 2026-09-27).",
          "areas": [
            "council",
            "people",
            "votes",
            "data"
          ],
          "links": [
            "/council",
            "/votes#council-presence"
          ]
        },
        {
          "id": "2026-09-27-council-sections-start-collapsed",
          "date": "2026-09-27",
          "type": "feature",
          "title": "/council sections now start collapsed with a one-line preview",
          "summary": "/council packed meeting time and attendance, roll-call categories, pay per meeting, attendance streaks, the presence grid, city officials, and public turnout into one long, dense scroll. Each of those now opens from a closed, collapsible disclosure whose one-line teaser is computed live from that section's own data -- for example \"153 meetings with readable minutes \u00b7 longest 1 hr 30 min (Apr 2022) \u00b7 shortest 2 min (Aug 2020)\" or \"1,941 roll calls \u00b7 Resolutions is the largest share (33.0%)\" -- so the number updates on its own as new minutes are added, rather than as separate static copy. New Expand all / Collapse all controls open or close every section at once. A URL hash that targets something inside a collapsed section (such as /council#attendance-streaks) still opens that section and scrolls to it, on first load and on an in-page hash change, and a chart that measures its container's pixel width redraws once its section actually opens (it reads 0 while closed). The roster and page heading are unchanged and stay open by default.",
          "areas": [
            "council",
            "data"
          ],
          "links": [
            "/council",
            "/council#attendance-streaks",
            "/council#roll-call-topics"
          ]
        },
        {
          "id": "2026-09-27-council-stipend-excludes-partial-current-year",
          "date": "2026-09-27",
          "type": "data-fix",
          "title": "Council stipend-per-meeting row no longer counts 2026 until the year ends",
          "summary": "The \"Stipend pay, Mayor + Council\" row under /council's roll-call-category table divided each year's full annual stipend by that year's known Council meetings; for the current year that meant dividing a full year's pay by a still-partial meeting count, overstating the per-meeting figure and shrinking it with every meeting added afterward. The current year's cell now shows a dash with the same \"left out until the year ends\" note the older pay-per-meeting table on the same page already uses, and the row's All-years total now sums only complete years (2020-2025: $242,000) instead of also folding in the still-open year's full annual rate ($299,000 before this fix).",
          "areas": [
            "council",
            "pay",
            "data"
          ],
          "links": [
            "/council#roll-call-topics",
            "/pay#elected"
          ]
        }
      ]
    },
    {
      "id": "2026-09-27-roundup-charts-modeled-trends-and-readouts",
      "date": "2026-09-27",
      "type": "roundup",
      "title": "Charts: modeled trends, richer readouts, one notes panel per section, and Census back to 2009",
      "summary": "Charts that run to the present now continue as a modeled trend with a shaded range, marked modeled and explained in each section's notes; totals and meeting counts are not modeled. Hover cards give each value's share of its year, the change from the year before, and per-meeting rates where they apply. Charts in a section share one collapsed notes-and-sources panel, and figures can be switched between chart forms, a table, and a list with the chosen view kept in the link. Census five-year estimates on /local now cover 16 vintages, 2009 through 2024. The district lookup map shows OpenStreetMap streets by default, with a note that its tile servers see your IP address and a switch to turn them off.",
      "areas": [
        "alpr",
        "charts",
        "council",
        "design",
        "local",
        "people",
        "site",
        "votes"
      ],
      "links": [
        "/local#by-the-numbers",
        "/local#fbi-heading",
        "/people#overview-heading",
        "/local/civic"
      ],
      "changes": [
        {
          "id": "2026-09-27-census-estimates-back-to-2009",
          "date": "2026-09-27",
          "type": "data-update",
          "title": "Census estimates on /local now go back to 2009",
          "summary": "The Census five-year estimates on /local (population, income, poverty, housing costs, and since 2011 the labor-force and employment measures) now cover 16 vintages, 2009 through 2024, instead of starting in 2021. Three employment measures (labor-force participation, employment-to-population, and unemployment) are not published for the 2009 and 2010 vintages -- the chart shows those as a marked gap rather than starting later, and a short note explains why. Every figure is still the Census Bureau's own citywide estimate with its margin of error; nothing is address- or parcel-derived.",
          "areas": [
            "local"
          ],
          "links": [
            "/local#by-the-numbers"
          ]
        },
        {
          "id": "2026-09-27-chart-group-notes",
          "date": "2026-09-27",
          "type": "feature",
          "title": "Chart sections share one notes-and-sources panel",
          "summary": "Charts in a section now share one collapsed notes-and-sources panel; footnote markers on each chart link to it. Previously each chart in a group (like /local's six FBI offense charts) repeated the same milestone legend, modeled-trend method, and marker caveat under its own figure.",
          "areas": [
            "local",
            "alpr"
          ],
          "links": [
            "/local",
            "/alpr/tracker"
          ]
        },
        {
          "id": "2026-09-27-chart-hover-cards",
          "date": "2026-09-27",
          "type": "feature",
          "title": "Chart readouts say more: share, change from last year, and per-meeting rates",
          "summary": "Hovering, tapping, or tabbing to a chart now shows more than the one number. Each card gives that part's share of its year, the change from the year before, and, where the chart has one, a rate with its basis named. On /people, Remarks by role now answers how much of a year's official remarks each role made and how often per Council meeting with readable minutes. Its table now lists every role together and the meetings counted. Changes are never shown into a year still in progress, beside a gap, or between two survey estimates, and at an ALPR milestone the card says the marker explains no change. The cards now open on a tap on phones and close when you tap elsewhere, and the remarks chart can be read with the arrow keys.",
          "areas": [
            "site",
            "charts",
            "people",
            "votes",
            "council"
          ],
          "links": [
            "/people#overview-heading",
            "/votes",
            "/council"
          ]
        },
        {
          "id": "2026-09-27-civic-street-map-on-by-default",
          "date": "2026-09-27",
          "type": "feature",
          "title": "District lookup map shows streets by default",
          "summary": "The /local/civic map now shows the OpenStreetMap street layer by default, so precincts and districts are easier to place. The street tiles come from OpenStreetMap's servers, which see your IP address; you can turn the street map off and the page remembers that choice on your device.",
          "areas": [
            "local"
          ],
          "links": [
            "/local/civic"
          ]
        },
        {
          "id": "2026-09-27-data-view-switch-forms",
          "date": "2026-09-27",
          "type": "feature",
          "title": "A shared way to switch a figure between chart forms, a table, and a list",
          "summary": "Figures can be switched between chart forms, a table, and a list, with the same filters, sorting, notes, download and citation everywhere; the view you choose is in the page link.",
          "areas": [
            "design",
            "people"
          ],
          "links": [
            "/people"
          ]
        },
        {
          "id": "2026-09-27-modeled-trend-local-charts",
          "date": "2026-09-27",
          "type": "feature",
          "title": "Modeled trend on the /local income and crime-rate charts",
          "summary": "Answers \"where is this heading now?\" for charts whose records stop before today. The income and police pay chart and the violent and property offense rate charts on /local now continue each line through the end of next year as a modeled trend: a dashed line over a shaded range in a zone marked Modeled, labeled \"modeled, not reported\" everywhere it appears. A note under each chart gives the method (the yearly change of a straight line fitted to the series' own reported years, continued from the latest reported value), the years used, and its limits: it assumes the recent trend continues, ignores policy and contract changes, widens further out, is no agency's forecast, and is not an estimate of what cameras did or would do. Police pay rates and the Iowa, U.S., and Polk County Sheriff lines are not modeled. No reported figure changed.",
          "areas": [
            "local",
            "charts"
          ],
          "links": [
            "/local#pay-context",
            "/local#fbi-heading"
          ]
        },
        {
          "id": "2026-09-27-modeled-trend-ranges-site-wide",
          "date": "2026-09-27",
          "type": "feature",
          "title": "Charts that run to the present now continue as a modeled trend, where it makes sense",
          "summary": "Charts that run to the present now continue as a modeled trend with a shaded range, marked as modeled and explained in each section's notes. Totals and meeting counts are not modeled. On the Local corner, each Census \"by the numbers\" measure with at least four published estimates now shows a modeled continuation the same way the FBI offense-rate charts already did.",
          "areas": [
            "local",
            "alpr",
            "site"
          ],
          "links": [
            "/local#by-the-numbers",
            "/local#fbi-heading"
          ]
        }
      ]
    },
    {
      "id": "2026-09-27-roundup-alpr-tracker-history-and-neighbors",
      "date": "2026-09-27",
      "type": "roundup",
      "title": "ALPR tracker: readings back to July 2025, nearby jurisdictions, and one community-mapped estimate",
      "summary": "The tracker's camera-count history now includes 29 Eyes On Flock readings for Altoona PD captured by the Internet Archive from July 24, 2025 through September 10, 2026, beside this site's own daily readings since September 22, 2026, and the chart switches between cameras, vehicles detected, hotlist hits, and searches, with reported crime charted beside it (side by side, not as cause and effect). The archived-readings table also covers eight nearby agencies. A Nearby jurisdictions section opens with a city-limits map of Altoona and 11 nearby cities and leads with each police agency's own vendor-reported count; community-mapped totals are optional, unverified, and off by default. One community-mapped estimate of cameras presumed inside Altoona city limits (67, beside Flock's reported 51) is published as a single reviewed aggregate, with no locations or per-area counts. The page opens summary-first, and the vendor camera-count chart waits for enough history before it draws.",
      "areas": [
        "alpr",
        "council",
        "data",
        "people"
      ],
      "links": [
        "/alpr/tracker",
        "/alpr/tracker#camera-history",
        "/alpr/tracker#nearby-jurisdictions"
      ],
      "changes": [
        {
          "id": "2026-09-27-alpr-tracker-community-camera-estimate",
          "date": "2026-09-27",
          "type": "feature",
          "title": "ALPR tracker adds one community-mapped camera estimate, clearly separate from vendor figures",
          "summary": "The tracker now shows one new figure alongside the vendor-reported camera counts: a community-mapped estimate of cameras presumed to be inside Altoona city limits (67, from DeFlock/OpenStreetMap volunteer mapping), with Flock's own reported camera count (51) beside it. This is a single, reviewed exception to Deflock Altoona's standing rule that community-mapped camera data stays private: only this one aggregate is published, dated by its mapping snapshot, and labeled \"Community-mapped estimate -- not vendor-reported\" in its own card, separate from the Axon/Flock vendor sections and the vendor camera-count chart. No camera location, per-area count, individual record, tag, id, coordinate, or link to the mapping tool is published, and the classification method stays private. The gated \"still collecting data\" panel under the vendor camera-count chart now mentions this estimate in one sentence (linked, not charted) while that chart waits for more history.",
          "areas": [
            "alpr",
            "data"
          ],
          "links": [
            "/alpr/tracker"
          ]
        },
        {
          "id": "2026-09-27-alpr-tracker-summary-first-layout",
          "date": "2026-09-27",
          "type": "feature",
          "title": "ALPR tracker: fixed the footer position, and made the page summary-first",
          "summary": "Fixed a layout bug where the site-wide footer (site map, About/Contact/Report links) rendered midway down the tracker page, with the \"Sources and collection\" section appearing below it -- caused by that section having been marked up as the page's footer element, which the shared site footer script treats as sign-off content to place after its own site-map block. That section is now a regular page section, and the footer is a short one-line credit at the very end, matching every other page. Separately, the hero was rebalanced: the live \"estimated ALPR detections\" card is now a compact headline number plus one summary line (modeled hotlist hits and rate) beside the title, with the modeled-rate explanation, the hit/no-hit trend chart, and \"What the asterisk means\" moved into a click-to-open disclosure below. The long \"Council record context,\" \"Documented 2022 launch-update roles,\" and \"Mayor context\" articles keep their lead sentence visible and move their sourced detail, lists, and per-year Council records into the same click-to-open pattern. No figure, asterisk, or caveat changed meaning.",
          "areas": [
            "alpr",
            "council",
            "people"
          ],
          "links": [
            "/alpr/tracker"
          ]
        },
        {
          "id": "2026-09-27-archived-vendor-history-neighbor-agencies",
          "date": "2026-09-27",
          "type": "data-update",
          "title": "Archived vendor history now covers nearby agencies too",
          "summary": "The archived-readings table on /alpr/tracker (Internet Archive Wayback Machine captures of Eyes On Flock) now covers Altoona PD's eight curated nearby agencies as well, each already reporting its own vendor camera count elsewhere on this page. An Agency filter defaults to Altoona PD; select \"All agencies\" to see every reading. Vendor-reported figures only, dated by the portal's own \"data as of\" date.",
          "areas": [
            "alpr"
          ],
          "links": [
            "/alpr/tracker"
          ]
        },
        {
          "id": "2026-09-27-archived-vendor-history-wayback",
          "date": "2026-09-27",
          "type": "feature",
          "title": "Tracker: 29 archived vendor readings back to July 2025, via the Internet Archive",
          "summary": "The camera-count history chart on the tracker now includes 29 Eyes On Flock readings for Altoona PD, captured by the Internet Archive Wayback Machine from July 24, 2025 through September 10, 2026 -- shown with a hollow, dashed marker and their own legend entry, separate from this site's own direct daily collection that started September 22, 2026. Each archived point links to its Wayback capture in a new table below the chart. Combined with the archived history, the chart now has enough distinct dates (28, with a real change from 51 to 50 cameras in one archived reading) to show as a chart instead of the \"still collecting\" panel. Archived data currently covers only Altoona PD; no nearby-agency archived captures have been found yet.",
          "areas": [
            "alpr",
            "data"
          ],
          "links": [
            "/alpr/tracker"
          ]
        },
        {
          "id": "2026-09-27-auto-refresh-camera-total",
          "date": "2026-09-27",
          "type": "data-update",
          "title": "Daily data refresh: community camera total",
          "summary": "Automatic daily refresh. community camera total 67 to 67.",
          "areas": [
            "alpr"
          ],
          "links": [
            "/alpr/tracker"
          ]
        },
        {
          "id": "2026-09-27-gate-vendor-camera-chart-behind-data-threshold",
          "date": "2026-09-27",
          "type": "feature",
          "title": "Gate the vendor camera-count chart until there's enough history to read",
          "summary": "The /alpr/tracker \"Cameras, as each vendor reports them\" chart currently has just 3 distinct collection dates (Sep 22, 23, 26, 2026), 2 blank days with no new vendor data, all flat at 51 cameras. That reads as a trend when it is really just the first few days of collection, so the chart now only renders once the series has earned it: at least 14 distinct vendor-data-dates AND at least one real change in the reported count, or at least 30 distinct dates regardless of variation (a long flat run is a legitimate reading once it is genuinely established, not just a few days old). Below that threshold, the section shows a plain \"Still collecting data\" panel instead: what's being collected (Flock's and Axon's vendor-reported figures; Axon's portal doesn't publish a camera count), since when, the current Flock reading, progress toward the threshold, and a rough \"check back in about N days\" estimate from the current collection cadence. Daily collection into src/alpr/vendor-camera-counts.json is unaffected \u2014 only what renders is gated, so the chart appears automatically once there's enough history. The two thresholds live in one named config (CAMERA_HISTORY_CHART_GATE in the new src/alpr/tracker/camera-history-gate.js) with the reasoning in a comment, so they're easy to revisit. Covered by tests/test_camera_history_gate.py (pure threshold logic plus a Playwright check that the below-threshold fixture draws no chart/SVG and the above-threshold fixture draws no collecting panel) and verified in headless Chromium at 1280/390px, light and dark.",
          "areas": [
            "alpr",
            "data"
          ],
          "links": [
            "/alpr/tracker#camera-history"
          ]
        },
        {
          "id": "2026-09-27-nearby-jurisdictions-altoona-row",
          "date": "2026-09-27",
          "type": "feature",
          "title": "Tracker: Altoona now sits in the Nearby jurisdictions map and table like its neighbors",
          "summary": "Altoona is now shown in the Nearby jurisdictions section the same way as the 11 nearby cities. On the map, Altoona carries its vendor-reported camera count as its label, and selecting it fills the detail line with that count, Altoona PD, and the vendor data date. In the table, an Altoona row is pinned first and marked, with the same columns, and the Jurisdiction menu's Altoona option filters to that row. The figures come from the same vendor and community feeds as the sections above, so they always match. The unverified community-mapped total appears only when Show community-mapped totals is on. Answers: how does Altoona's vendor-reported camera count look beside its neighbors'?",
          "areas": [
            "alpr"
          ],
          "links": [
            "/alpr/tracker#nearby-jurisdictions"
          ]
        },
        {
          "id": "2026-09-27-nearby-jurisdictions-camera-comparison",
          "date": "2026-09-27",
          "type": "feature",
          "title": "Tracker: a nearby-jurisdictions camera comparison",
          "summary": "The tracker now shows, for 11 nearby Polk County jurisdictions, a community-mapped (DeFlock/OpenStreetMap) camera count presumed inside each city's own limits next to that agency's own vendor-reported figure, sortable and filterable by jurisdiction, plus counts by distance from Altoona's city limit (0-1, 1-3, 3-5, and 5-10 miles). Most neighbors' mapped counts are within a few cameras of their vendor-reported count. Des Moines PD (Motorola contract) and Bondurant PD (confirmed no ALPR) are marked as having no public transparency portal rather than left blank. This does not compare to crime, ACS, or address-level data, and is not an official inventory for any of these cities.",
          "areas": [
            "alpr",
            "data"
          ],
          "links": [
            "/alpr/tracker"
          ]
        },
        {
          "id": "2026-09-27-nearby-jurisdictions-city-limits-map",
          "date": "2026-09-27",
          "type": "feature",
          "title": "Tracker: vendor camera counts lead Nearby jurisdictions, now with a city-limits map",
          "summary": "The Nearby jurisdictions section of /alpr/tracker now leads with each nearby police agency's own vendor-reported camera count and opens with a map of city limits for Altoona and the 11 nearby cities in its table, so readers can see where each city sits relative to Altoona and which of their police agencies publish a vendor camera count. Each city is shaded by that status (publishes a count, with the number shown; no public portal or no data found; confirmed no ALPR), and rings mark 1, 3, 5, and 10 miles from Altoona's city limit. Select a city on the map to filter the table to it. The map shows city limits only and no camera locations; boundaries come from OpenStreetMap contributors (ODbL) and are simplified, so distances are approximate. Community-mapped figures are now off by default: a Show community-mapped totals switch adds one unverified community-mapped total per city (all brands and owners together) and the distance-band totals, and that view can be shared by link. The Difference column was removed. Answers: where are these nearby cities relative to Altoona, and which of their police agencies publish a vendor camera count?",
          "areas": [
            "alpr"
          ],
          "links": [
            "/alpr/tracker#nearby-jurisdictions"
          ]
        },
        {
          "id": "2026-09-27-tracker-history-and-crime-context",
          "date": "2026-09-27",
          "type": "feature",
          "title": "ALPR tracker charts Flock's figures over time, with reported crime beside them",
          "summary": "Reader question: how have the figures Flock reports for Altoona PD changed since mid-2025, and what did reported crime look like across the ALPR program's steps? The tracker chart now switches between cameras, vehicles detected, hotlist hits, and searches (30-day figures), shows this site's daily readings beside archived Internet Archive captures, marks the July 21, 2025 Axon agreement, and has a table, CSV download, and a shareable link. A second chart shows the FBI's reported violent or property offense rate for Altoona, Iowa, and the U.S. by year above Flock's last reading of each year, on separate scales and a shared year axis, with the ALPR program's steps marked. It says plainly that the two are shown side by side and cannot show whether cameras changed crime, and that the FBI's rates end with 2025.",
          "areas": [
            "alpr"
          ],
          "links": [
            "/alpr/tracker#camera-history",
            "/local#fbi-heading"
          ]
        }
      ]
    },
    {
      "id": "2026-09-27-private-names-in-remarks",
      "date": "2026-09-27",
      "type": "correction",
      "title": "Private residents' names in remarks and public comment now shown consistently",
      "summary": "Names of private residents in official remarks now appear as first name and last initial. A public-comment speaker's name was already shortened this way; a private person an official's own remark or a public-comment summary names in passing -- a plat applicant, a sewer-waiver requester, a business petitioner, a developer, an audience member who answered a question -- is now shortened the same way on /votes and on People minutes-mention pages. Officials, Council members, police, and organizations continue to show their full names.",
      "areas": [
        "votes",
        "people",
        "data"
      ],
      "links": [
        "/votes",
        "/people"
      ]
    },
    {
      "id": "2026-09-27-pay-chart-per-person",
      "date": "2026-09-27",
      "type": "correction",
      "title": "Income beside police pay now compares person to person",
      "summary": "The Incomes and police pay chart on Altoona by the numbers compared one police officer's hourly step range with median household income turned into an hourly figure. A household can have several earners, so that line made residents look better paid, next to one officer, than any one person is. The chart now shows two per-person Census figures instead: income per resident (per capita, which counts every resident including children and retirees) and median earnings per earner, each as an hourly equivalent of a full-time year with its margin of error. Household income is still listed with the other Census figures above.",
      "areas": [
        "local",
        "charts"
      ],
      "links": [
        "/local#pay-context"
      ]
    },
    {
      "id": "2026-09-27-number-verification-pass",
      "date": "2026-09-27",
      "type": "correction",
      "title": "Verification pass: site search showed blank ALPR figures, and meeting presence now reads the same on every page",
      "summary": "Answers \"do the numbers match wherever I look?\". A check of every published figure against its feed found three search results that were wrong: the Flock camera-count result read \"\u2014 cameras reported as of \u2014\" instead of 51 as of September 26, 2026; the Flock portal result showed dashes instead of its 30-day figures; and the police pay result linked to a broken anchor. All three now read from the feeds, and search results format large counts with commas. Meeting presence was printed as a whole percent on the Council page (\"Present 82%\"), one decimal on People (\"Present 82.4%\"), and with no percent on the homepage; all three now show the same \"Present 82.4% (126 of 153)\" form. The Council page's per-meeting pay note now takes its pay rates from the published pay data instead of typed-in text. No vote, presence count, pay rate or camera count changed.",
      "areas": [
        "search",
        "alpr",
        "pay",
        "council",
        "people",
        "data"
      ],
      "links": [
        "/search",
        "/council",
        "/people",
        "/"
      ]
    },
    {
      "id": "2026-09-27-next-meets-banner-shows-the-next-posted-meeting",
      "date": "2026-09-27",
      "type": "correction",
      "title": "The \"next meets\" banner shows the next posted meeting, not a stale guess",
      "summary": "The homepage and /local corner's \"next meets\" banner previously showed a cadence-derived placeholder date and an old \"last checked\" note even after the City posted a real agenda for an earlier date. It now prefers any meeting the City has actually posted something for over a cadence guess, labels a workshop as \"Council workshop\" rather than \"Council meeting,\" shows the first agenda items with a link to the posted agenda, and separately reports the latest meeting the City's archive shows was held (even when its minutes are not posted yet) alongside the latest meeting whose minutes have been reviewed. The hard-coded \"last checked\" sentence is gone; the date shown now always comes from the feed. This logic lives once in src/local-heads-up.js so the homepage and /local never disagree.",
      "areas": [
        "local",
        "home"
      ],
      "links": [
        "/",
        "/local"
      ]
    },
    {
      "id": "2026-09-27-nearby-jurisdictions-correction",
      "date": "2026-09-27",
      "type": "correction",
      "title": "Correction: Nearby jurisdictions now leads with vendor counts; community totals are optional and unverified",
      "summary": "An earlier entry today, \"Tracker: a nearby-jurisdictions camera comparison,\" described community-mapped camera counts set beside each agency's vendor-reported figure, with a difference between the two. The editor withdrew that framing. The Nearby jurisdictions section of /alpr/tracker now leads with each agency's own vendor-reported count. Community-mapped data appears only as an optional, unverified total per city, all brands and owners together, and it is off unless a reader turns it on. It is neither a comparison with, nor a count of, any agency's or brand's cameras. The Difference column was removed.",
      "areas": [
        "alpr"
      ],
      "links": [
        "/alpr/tracker#nearby-jurisdictions",
        "/whats-new#2026-09-27-nearby-jurisdictions-camera-comparison"
      ]
    },
    {
      "id": "2026-09-27-meeting-records-match-city-archive",
      "date": "2026-09-27",
      "type": "correction",
      "title": "Meeting records table now matches what the City posted",
      "summary": "Answers \"did the City post the agenda and minutes for each meeting?\". The Council meetings by year table on /transparency and /votes understated what the City's online archive posts: it showed, for example, 8 agendas and 6 sets of minutes for 2023 and 11 agendas for 2024, when the archive lists an agenda and minutes for every meeting in both years. Checked against the archive's full listing, it now shows only what the City posted: every meeting since 2020 has both, except two February and March 2021 meetings posted without an agenda, two 2022 meetings that are not listed at all, and the newest meeting, whose minutes are approved later. The Missing records list on /transparency now says only whether the City posted each record and that it is not on this site yet. No vote, tally, or attendance record changed.",
      "areas": [
        "votes",
        "data"
      ],
      "links": [
        "/transparency#archive-coverage",
        "/transparency#missing-records",
        "/votes#meeting-coverage"
      ]
    },
    {
      "id": "2026-09-27-meeting-dates-in-city-time",
      "date": "2026-09-27",
      "type": "correction",
      "title": "Next-meeting labels use Altoona's clock, not UTC",
      "summary": "On Sunday evening the homepage called Monday's Council workshop \"Tonight\" and listed it as the last meeting held, because the page compared dates in UTC, which is already the next day after 7 p.m. Central. Dates now use Altoona's time zone everywhere, a meeting dated today counts as held only once its record says so, the date is spelled out beside \"Tonight\" or \"Tomorrow\", and the agenda preview skips procedural items like Call to Order.",
      "areas": [
        "homepage",
        "local"
      ],
      "links": [
        "/",
        "/local"
      ]
    },
    {
      "id": "2026-09-27-mayor-2020-absence-presiding-conflict-reviewed",
      "date": "2026-09-27",
      "type": "review",
      "title": "The Mayor's two April 2020 meetings: absent on the roll call, but presiding",
      "summary": "A data check on /council noticed the Mayor's presided count (128) exceeding his present count (126) across the 154 reviewed Council sessions. Re-read against both source minutes PDFs: both meetings' opening roll call prints \"Mayor O'Connor\u2013 absent\", and neither prints an arrival time, a remote marker, or any other attendance event for him, but each minutes document separately records \"Mayor Dean O'Connor requested to approve the agenda as presented.\" This is a contradiction printed in the minutes themselves, not a parsing error: the collector already recorded the roll call as printed (absent), credited the printed presiding claim, and added a public note naming the conflict, matching the site's rule that a printed inconsistency stays as printed with a note rather than being resolved by inference. No session data changed. Added an automated check asserting a presiding Mayor must be present or have arrived, unless a documented note already explains the conflict, plus regression tests against the real minutes text pattern. Swept all 154 sessions: no other meeting, and no officer besides the Mayor at these two 2020 dates, has an undocumented version of this conflict.",
      "areas": [
        "council",
        "votes",
        "data"
      ],
      "links": [
        "/council",
        "/votes"
      ]
    },
    {
      "id": "2026-09-27-community-camera-total-correction",
      "date": "2026-09-27",
      "type": "correction",
      "title": "Tracker: corrected the community-mapped camera card",
      "summary": "Tracker: corrected the community-mapped camera card. It previously presented a 16-camera difference as a brand estimate; that label was removed.",
      "areas": [
        "alpr",
        "data",
        "privacy"
      ],
      "links": [
        "/alpr/tracker"
      ]
    },
    {
      "id": "2026-09-27-community-brand-split-removed",
      "date": "2026-09-27",
      "type": "correction",
      "title": "Tracker: community-mapped cameras no longer split by brand",
      "summary": "The tracker's camera section now shows the vendors' own figures (Flock's reported count for Altoona PD with its date, and a note that Axon's portal doesn't publish one) and a single community-mapped total, labeled unverified, which is off by default and appears with the Show the community-mapped total switch. We removed the cards and text that split community-mapped cameras by brand, compared a brand count with Flock's figure, or tied cameras to a business. Community tags can't say which vendor or owner a camera belongs to, so those figures weren't reliable. Answers the reader question: how many cameras does Altoona PD have, by the vendors' own account?",
      "areas": [
        "alpr",
        "data"
      ],
      "links": [
        "/alpr/tracker#community-camera-total"
      ]
    },
    {
      "id": "2026-09-26-roundup-vote-record-re-extracted",
      "date": "2026-09-26",
      "type": "roundup",
      "title": "Vote record re-extracted: 1,940 roll calls, movers and seconders, and workshops",
      "summary": "The vote tracker now lists 1,940 roll calls, up from 1,882, after re-extracting every retained set of minutes; tally lines printed without a Roll Call Vote heading had been missed, and each ordinance reading is now its own record. 1,911 of 1,929 archived votes list who moved and 1,907 who seconded, with a note on the 31 votes where the marks and the printed totals disagree. Roll calls group by meeting day with coverage by year and month, the July 27, 2026 workshop joins the record behind a Meeting type filter, and reviewed business and public-building addresses get a Find on OpenStreetMap link; household addresses are never linked.",
      "areas": [
        "council",
        "people",
        "votes"
      ],
      "links": [
        "/votes",
        "/votes?kind=workshop",
        "/votes#property-business",
        "/transparency"
      ],
      "changes": [
        {
          "id": "2026-09-26-business-location-links",
          "date": "2026-09-26",
          "type": "feature",
          "title": "Find business addresses on OpenStreetMap",
          "summary": "On the Votes page, addresses of businesses and public buildings named in Council records now carry a Find on OpenStreetMap link that opens in a new tab. Only reviewed addresses get a link: the printed address must be complete and must match that building in Altoona, Iowa. Nothing is sent to OpenStreetMap unless you click, and household addresses are never linked.",
          "areas": [
            "votes"
          ],
          "links": [
            "/votes#property-business"
          ]
        },
        {
          "id": "2026-09-26-council-roll-call-reextraction",
          "date": "2026-09-26",
          "type": "data-fix",
          "title": "Council vote records re-extracted from every retained set of minutes",
          "summary": "The vote tracker now lists 1,940 roll calls, up from 1,882. Some tally lines are printed without a \"Roll Call Vote\" heading, and the old extractor missed them. For example, it found 4 of the 8 roll calls on June 15, 2026. It also attached some votes to the wrong agenda item, such as consent-agenda votes shown under \"Department Head Reports.\" Each ordinance reading (1st Reading, 2nd & 3rd Reading, To Publish) is now its own record. Address and business links now appear only when the name is printed in the cited agenda item.",
          "areas": [
            "votes",
            "council",
            "people"
          ],
          "links": [
            "/votes"
          ]
        },
        {
          "id": "2026-09-26-vote-mover-seconder-and-notes",
          "date": "2026-09-26",
          "type": "data-update",
          "title": "Votes now show who moved and seconded",
          "summary": "1,911 of 1,929 archived votes now list the mover (1,907 the seconder), read from the 1 and 2 marks in the minutes, which match the written motions in 374 of 382 cases. 31 votes carry a note where the minutes leave a mark blank, where the printed total does not match the marks, or where a member listed absent at roll call is marked as voting. The vote key now explains that absent means absent for that vote.",
          "areas": [
            "votes"
          ],
          "links": [
            "/votes",
            "/transparency"
          ]
        },
        {
          "id": "2026-09-26-vote-tracker-by-meeting-day",
          "date": "2026-09-26",
          "type": "feature",
          "title": "Votes grouped by meeting day, with coverage by year and month",
          "summary": "The vote tracker groups roll calls by meeting day, shows which meetings have roll-call records by year and month, and adds attendance and term information for each member.",
          "areas": [
            "votes"
          ],
          "links": [
            "/votes"
          ]
        },
        {
          "id": "2026-09-26-workshops-in-vote-tracker",
          "date": "2026-09-26",
          "type": "feature",
          "title": "Council workshops in the vote tracker",
          "summary": "The July 27, 2026 Council workshop, the only workshop with minutes in the City's online archive, is now in the Votes page with its adjournment roll call and the topics the minutes record. A Meeting type filter shows Council meetings, workshops, or budget meetings. On the Council page, a * beside a year's meeting count lists the known meetings without readable minutes.",
          "areas": [
            "votes",
            "council"
          ],
          "links": [
            "/votes?kind=workshop",
            "/council#meeting-time"
          ]
        }
      ]
    },
    {
      "id": "2026-09-26-roundup-public-pay-page",
      "date": "2026-09-26",
      "type": "roundup",
      "title": "A Public pay page: Mayor, Council, police, and fire pay from official records",
      "summary": "A new Public pay page lists every Altoona pay rate found in official records: Mayor and Council pay, firefighter and police step schedules, assignment and longevity pay, and earlier contracts back to 2007, each linked to its record. Under Meeting time on the Council page, a table divides each year's Council and Mayor pay by the meetings held, meeting hours, and roll-call votes, shown as ratios rather than hourly wages. The Pay, Council, Police, and People pages link to one another.",
      "areas": [
        "council",
        "pay",
        "people",
        "police"
      ],
      "links": [
        "/pay",
        "/council#meeting-pay"
      ],
      "changes": [
        {
          "id": "2026-09-26-council-pay-per-meeting",
          "date": "2026-09-26",
          "type": "feature",
          "title": "What Council pay works out to per meeting",
          "summary": "Under Meeting time on the Council page, a new table divides each year's pay for a Council seat and the Mayor (from the September 5, 2023 minutes) by the meetings held, meeting hours, and roll-call votes. In 2025, one Council seat's $9,000 came to $375 per meeting and $32.85 per roll-call vote. A figure is shown only when that year's minutes are complete, and pay covers all duties, so these are ratios, not hourly wages.",
          "areas": [
            "council",
            "pay"
          ],
          "links": [
            "/council#meeting-pay",
            "/pay#elected"
          ]
        },
        {
          "id": "2026-09-26-pay-cross-links",
          "date": "2026-09-26",
          "type": "feature",
          "title": "Public pay now leads with Council and police, and links both ways",
          "summary": "The Public pay page now opens with Mayor and Council pay, then police, then firefighters, and keeps the site navigation at the top. It links to the Council roster, the Police page, and the People profiles, and those pages link back: Mayor and Council profiles link to the pay set for their office, and police profiles and the Police page link to the police pay schedules.",
          "areas": [
            "pay",
            "council",
            "police",
            "people"
          ],
          "links": [
            "/pay",
            "/council",
            "/police",
            "/people"
          ]
        },
        {
          "id": "2026-09-26-public-pay-records",
          "date": "2026-09-26",
          "type": "feature",
          "title": "Public pay records for Altoona",
          "summary": "A new Public pay page lists every Altoona, Iowa pay rate we found in official records: Mayor and Council pay (raised January 1, 2024), firefighter step schedules from the 2025-2030 contract, the police step schedule from the Teamsters contract that expired in June 2025, assignment and longevity pay, earlier police and fire contracts back to 2007, and rates the City published for seasonal and special census work. Each figure links to its record. Two annual figures the fire contract prints do not match its own hourly rates, and the page shows both.",
          "areas": [
            "pay"
          ],
          "links": [
            "/pay"
          ]
        }
      ]
    },
    {
      "id": "2026-09-26-roundup-public-comment-and-official-remarks",
      "date": "2026-09-26",
      "type": "roundup",
      "title": "Public comment and official remarks, straight from the minutes",
      "summary": "The Votes page gains a Public comment tab covering 152 retained Council minutes since 2020: who spoke, the topic, and any official reply the minutes record, with names as printed and never addresses, plus a participation chart by year and a Most frequent public speakers table shown by first name only. An Official remarks tab searches all 844 remarks the minutes attribute to named officials, filtered by official, role, context, and year. Every comment and remark carries a source line, a permalink, and a Cite button; official replies name the speaker they answer; and each meeting card shows its public comment and remarks in place.",
      "areas": [
        "people",
        "public-comment",
        "votes"
      ],
      "links": [
        "/votes#public-comment",
        "/votes#official-remarks",
        "/votes"
      ],
      "changes": [
        {
          "id": "2026-09-26-citable-public-comment",
          "date": "2026-09-26",
          "type": "feature",
          "title": "Public comment entries are citable; how to be heard comes first",
          "summary": "Every public-comment entry and official reply on the Votes page now has its own source line, a permalink, and a Cite button that copies a full citation to the minutes. The How to be heard section opens the public-comment view. Two online-chat entries from October 16 and December 18, 2023, which raise complaints about Police Chief Greg Stallman, are now summarized with the minutes' own words as attributed statements rather than by topic only.",
          "areas": [
            "votes"
          ],
          "links": [
            "/votes#public-comment",
            "/votes#public-comment-2023-12-18-1"
          ]
        },
        {
          "id": "2026-09-26-meeting-cards-records",
          "date": "2026-09-26",
          "type": "feature",
          "title": "Meeting cards show public comment and official remarks",
          "summary": "Each meeting card in Vote search now shows the meeting's public comment (who spoke, or that no one came forward) and its official remarks (count by official). Both expand in place with the same entries, permalinks, and Cite buttons as their own tabs. Names in the roll call, presiding officer, and City officials present link to profiles, and a title appears where the minutes printed one for that period.",
          "areas": [
            "votes"
          ],
          "links": [
            "/votes"
          ]
        },
        {
          "id": "2026-09-26-official-remarks-and-titles",
          "date": "2026-09-26",
          "type": "feature",
          "title": "Official remarks and titles from the minutes",
          "summary": "844 remarks that the Council minutes attribute to named City officials, and the titles printed beside their names, now appear on People profiles for the mayor and Council, and on Council presence cards for other officials. Addresses in remark text are omitted.",
          "areas": [
            "votes",
            "people"
          ],
          "links": [
            "/votes#council-presence",
            "/people?person=dean-oconnor#remarks"
          ]
        },
        {
          "id": "2026-09-26-official-remarks-role-filter",
          "date": "2026-09-26",
          "type": "feature",
          "title": "Official remarks can be filtered by Mayor, Council, Police, or City officials",
          "summary": "The Official remarks tab on the Votes page now opens with a role filter: Mayor, Council (including mayor pro tem), Police, and City officials, each with its remark count. A remark's role comes from the title the minutes print beside the name, or the person's role on that date. The official and context menus now show only choices that have remarks under the other filters, with counts, and the filters are kept in the page address so a filtered view can be shared. Police remarks are few because the minutes list the police chief's department report by name only.",
          "areas": [
            "votes"
          ],
          "links": [
            "/votes#official-remarks"
          ]
        },
        {
          "id": "2026-09-26-official-remarks-search",
          "date": "2026-09-26",
          "type": "feature",
          "title": "Search every official remark in the minutes",
          "summary": "The Votes page adds an Official remarks tab. It searches all 844 remarks the Council minutes attribute to named officials, filtered by official, by context (agenda item or public-comment reply), and by the page's year, with matches highlighted. Each remark has the same source line, permalink, and Cite button as public comments, and profile pages use the same citation line and link into the search.",
          "areas": [
            "votes",
            "people"
          ],
          "links": [
            "/votes#official-remarks"
          ]
        },
        {
          "id": "2026-09-26-participation-chart",
          "date": "2026-09-26",
          "type": "feature",
          "title": "Public participation charted by year",
          "summary": "Under the public-participation table on the Votes page, a chart shows the share of Council meetings with at least one public-comment speaker each year, with the high, low, and latest values labeled and hollow points for years with incomplete minutes. Hover for every figure in the table; click a year to show that year's public comment. The table highlights the year chosen in the page's Year filter and labels each value on phones.",
          "areas": [
            "votes"
          ],
          "links": [
            "/votes#public-comment"
          ]
        },
        {
          "id": "2026-09-26-public-comment-record",
          "date": "2026-09-26",
          "type": "feature",
          "title": "Public comment record and participation trends",
          "summary": "The Votes page adds a Public comment tab covering 152 retained Council minutes from 2020 onward. It lists who spoke under \"Citizens request to address council\" (names as printed, never addresses), the topic, and any official reply the minutes record. It also shows yearly participation counts and how residents can be heard. Residents spoke at 55 of those meetings; at 89, the minutes record that no one came forward.",
          "areas": [
            "votes"
          ],
          "links": [
            "/votes#public-comment"
          ]
        },
        {
          "id": "2026-09-26-public-comment-reply-context",
          "date": "2026-09-26",
          "type": "feature",
          "title": "Official replies show which speaker they answer",
          "summary": "Each official remark recorded during public comment now names the speaker it answers, or the speaker it calls on, and links to that speaker's entry. In the Official remarks tab and on meeting cards, the reply shows the speaker's summary above the official's words. In the Public comment tab, replies sit directly under the speaker they answer. People profiles show the same line. Replies that name a speaker by title and surname alone (for example \"Mr.\" plus a surname) now show only the surname's initial, matching how speakers are shown elsewhere.",
          "areas": [
            "votes",
            "people"
          ],
          "links": [
            "/votes#official-remarks",
            "/votes#public-comment"
          ]
        },
        {
          "id": "2026-09-26-public-speakers-first-name-only",
          "date": "2026-09-26",
          "type": "data-fix",
          "title": "Public speakers table now shows first names only",
          "summary": "The \"Most frequent public speakers\" table on the Votes page drops the last initial and shows a first name only. Two different people who share a first name are still counted and shown separately, never merged, with a number in parentheses if needed to tell the rows apart. The public-comment record itself is unchanged and still shows a first name and last initial.",
          "areas": [
            "votes"
          ],
          "links": [
            "/votes"
          ]
        },
        {
          "id": "2026-09-26-public-speakers-leaderboard",
          "date": "2026-09-26",
          "type": "feature",
          "title": "Votes: most frequent public speakers",
          "summary": "The Public comment tab on the Votes page now thanks the members of the public who address the Council most often. A plain table lists the top 10, with every tie at 10th place shown, counting the meetings from January 2020 through September 2026 at which the official minutes record each person under \"Citizens request to address council\" (at least 2 meetings to be listed). Names are shown as first name and last initial only, and the list does not link to anyone's comments or describe what they said. Council members, the mayor, City officials and staff, police, and people speaking for an office, business, or organization are not counted. Meetings without readable minutes are listed as not counted. Counts are a best effort from automated parsing of the minutes; corrections and removal requests go through the contact form.",
          "areas": [
            "votes",
            "public-comment"
          ],
          "links": [
            "/votes#public-comment"
          ]
        }
      ]
    },
    {
      "id": "2026-09-26-roundup-people-officials-and-police",
      "date": "2026-09-26",
      "type": "roundup",
      "title": "People profiles for City officials and police, with their records on file",
      "summary": "The People glossary adds 80 source-bound profiles: every City official named in the Council minutes and everyone on the Police Department's 2025 annual-report roster, grouped by rank and unit. Each card lists the records on file that name that person (vote positions, roll calls, meetings presided, remarks, replies, news coverage, and cited sources), and the glossary opens with how profiles are built and their limits. The Police page lists the roster and all seven K9 teams as printed in the 2025 annual report.",
      "areas": [
        "people",
        "police"
      ],
      "links": [
        "/people",
        "/people?category=police",
        "/people#method",
        "/police#roster"
      ],
      "changes": [
        {
          "id": "2026-09-26-people-methodology",
          "date": "2026-09-26",
          "type": "feature",
          "title": "People glossary explains its methods and limits",
          "summary": "The top of the People glossary now explains how profiles are built (sources for Council, City officials, and police; how remarks and mentions are matched), the assumptions behind them (name matching, what a printed title means, the roster's as-of date), and their limitations (retained and image-only minutes, paraphrase, self-reported annual report, no private-resident profiles). It also links to corrections.",
          "areas": [
            "people"
          ],
          "links": [
            "/people#method"
          ]
        },
        {
          "id": "2026-09-26-people-officials-police",
          "date": "2026-09-26",
          "type": "feature",
          "title": "People profiles for City officials and police",
          "summary": "The People glossary adds 80 source-bound profiles: every City official in the Council-minutes datasets, and everyone on the Police Department's 2025 annual-report roster. Each profile combines titles, remarks, and every mention in Council minutes (listed present, sworn in, promoted, recognized, or named in public comment) with the City staff page or annual report that describes them. Filter the glossary by City officials or Police.",
          "areas": [
            "people",
            "police"
          ],
          "links": [
            "/people?category=police",
            "/people?category=city-official"
          ]
        },
        {
          "id": "2026-09-26-people-records-on-file-and-police-tiers",
          "date": "2026-09-26",
          "type": "feature",
          "title": "People cards list their records; police grouped by rank and unit",
          "summary": "Each card on the People page has a Records on file list that counts and links every stored record naming that person: vote positions (with how often they moved or seconded), roll calls, meetings presided, City Officials Present listings, remarks in the minutes, replies during public comment, news coverage, and cited sources. The police roster follows the department's 2025 annual-report pyramid: command first, then lieutenants and administration, sergeants, investigations, K9, school resource officers, patrol, and reserves in collapsed sections. The All view shows police command with a link to the full roster. Every People view now lists people by rank within their group: the mayor and Council, then City officials led by the City Administrator, then police by rank, current before former.",
          "areas": [
            "people"
          ],
          "links": [
            "/people",
            "/people?category=police"
          ]
        },
        {
          "id": "2026-09-26-police-roster-2025",
          "date": "2026-09-26",
          "type": "data-update",
          "title": "Police roster and K9 Unit as of the 2025 annual report",
          "summary": "The Police page lists the department roster and all seven K9 teams as printed in the 2025 annual report, each linked to a profile. The K9 list is corrected: K9 Luna (retired) and Crisis K9 Nala are added, and K9 Clay is listed with Officer Tony Ong. The roster is current as of that report, not necessarily today.",
          "areas": [
            "police"
          ],
          "links": [
            "/police#roster"
          ]
        }
      ]
    },
    {
      "id": "2026-09-26-roundup-charts-open-their-records",
      "date": "2026-09-26",
      "type": "roundup",
      "title": "Charts that drill down, open their records, and mark incomplete years",
      "summary": "Votes and Council charts drill from years to months to meetings, and clicking a point opens the records behind it; years with incomplete minutes are drawn with hollow points and dashed lines. Line charts label their latest and high values and show every figure on hover. New charts: the share of known Council meetings whose agenda and minutes the City posts each year, FBI clearances beside offenses, Census trends across the 2021 to 2024 five-year estimates, Flock's reported camera count by data date, and Census incomes beside the published police and fire contract pay ranges.",
      "areas": [
        "alpr",
        "charts",
        "council",
        "data",
        "local",
        "pay",
        "research",
        "transparency",
        "votes"
      ],
      "links": [
        "/votes#vote-cumulative",
        "/council#meeting-time",
        "/transparency",
        "/local#by-the-numbers",
        "/alpr/tracker#camera-history"
      ],
      "changes": [
        {
          "id": "2026-09-26-chart-drilldown-and-officials",
          "date": "2026-09-26",
          "type": "feature",
          "title": "Charts drill down by year, month, and meeting; city officials alongside council",
          "summary": "The Votes page chart follows the filters: several years plot by year, one year by month, and one month by meeting, and clicking a point opens the next level. Each meeting's line lists the city officials the minutes record as present, and the Council page adds a City officials table with the meetings each is listed at, linked to those meetings. City officials are not on the roll call, so no expected attendance is implied.",
          "areas": [
            "votes",
            "council"
          ],
          "links": [
            "/votes#vote-cumulative",
            "/council#meeting-time"
          ]
        },
        {
          "id": "2026-09-26-chart-points-open-records",
          "date": "2026-09-26",
          "type": "feature",
          "title": "Chart points open their records; incomplete years are marked",
          "summary": "Clicking a point on the Votes and Council line charts opens the records behind it. Years whose minutes are incomplete (image-only scans or minutes the City has not posted) are drawn with hollow points and dashed lines, and the hover readout gives the coverage, such as 19 of 25 meetings in 2022.",
          "areas": [
            "votes",
            "council"
          ],
          "links": [
            "/council#meeting-time",
            "/votes#vote-cumulative"
          ]
        },
        {
          "id": "2026-09-26-line-chart-labels-and-readouts",
          "date": "2026-09-26",
          "type": "feature",
          "title": "Charts label their key values and show a readout on hover",
          "summary": "Line charts now label the latest value and the high point directly, and hovering or tabbing to a chart shows every figure for that year. The Council page adds a chart of average meeting length by year.",
          "areas": [
            "votes",
            "council"
          ],
          "links": [
            "/council#meeting-time",
            "/votes#vote-cumulative"
          ]
        },
        {
          "id": "2026-09-26-meeting-records-clearances-and-census-trends",
          "date": "2026-09-26",
          "type": "feature",
          "title": "Charts: Council records the City posts each year, FBI clearances, and Census trends for every measure",
          "summary": "A new chart on the Transparency page and in the Votes coverage panel shows, for each year since 2020, the share of known Council meetings whose agenda and minutes appear in the City's online archive (the Votes page also shows the share with reviewed roll calls), with a table of the counts. Altoona by the numbers now charts the clearances the Altoona Police Department reported to the FBI each year beside its offense counts, with a note that a clearance can close an offense from an earlier year and is not a conviction. Median earnings, the poverty rate, and the three labor-force rates now show 2021-2024 Census five-year trends with margins of error, like the other Census figures.",
          "areas": [
            "transparency",
            "votes",
            "local",
            "data"
          ],
          "links": [
            "/transparency",
            "/votes#meeting-coverage",
            "/local#by-the-numbers"
          ]
        },
        {
          "id": "2026-09-26-vendor-camera-history-and-local-charts",
          "date": "2026-09-26",
          "type": "feature",
          "title": "Charts: vendor camera count over time, Altoona by the numbers, and incomes beside pay rates",
          "summary": "The ALPR tracker now charts the camera count Flock's own portal reports for Altoona PD, by the portal's data date, from the start of collection on September 22, 2026; days with no new vendor data are left blank, and Axon's portal publishes no camera count. Altoona by the numbers now charts Census estimates across the 2021-2024 five-year vintages with their margins of error, and FBI rates for Altoona, Iowa, and the U.S. with yearly offense counts (2026 is marked as eight months and not rate-compared). A new Incomes and City pay rates section shows Census median earnings and household income beside the published police and fire contract pay ranges, with the years and limits labeled. The Research notebook header now shows its update date.",
          "areas": [
            "alpr",
            "local",
            "research",
            "pay",
            "data"
          ],
          "links": [
            "/alpr/tracker#camera-history",
            "/local#by-the-numbers",
            "/local#pay-context",
            "/research",
            "/pay"
          ]
        }
      ]
    },
    {
      "id": "2026-09-26-roundup-attendance-and-meeting-time",
      "date": "2026-09-26",
      "type": "roundup",
      "title": "Meeting attendance, times, and who presided, 2020 to date",
      "summary": "Each meeting now shows its roll-call and adjournment times, the opening roll call including the mayor, late or remote arrivals, and who presided when the mayor was absent, and attendance separates members who arrived late from members absent for the whole meeting. The Council page adds meeting time and attendance by year and by person, a presence grid of every known meeting since 2020, and each year's longest and shortest meeting, with every count linking to the meetings it counts. Presence charts measure each member against their own tenure and show each role a person held. The 27 virtual meetings of 2020 and 2021 are marked, and profile cards show term dates, including for former members.",
      "areas": [
        "council",
        "people",
        "site",
        "votes"
      ],
      "links": [
        "/council#meeting-time",
        "/votes#council-presence",
        "/people"
      ],
      "changes": [
        {
          "id": "2026-09-26-absent-vs-late-and-selection-controls",
          "date": "2026-09-26",
          "type": "feature",
          "title": "Absent versus arrived late, and editable meeting selections",
          "summary": "Attendance now separates members who arrived after the roll call from members absent for the whole meeting; Present, Arrived late, and Absent add up to the roll calls. On each vote, a member marked absent is shown as absent from the meeting, arriving later, or at the meeting but not voting on that item. When a link opens a set of meetings on the Votes page, the selection can be edited: remove dates or years, add a meeting, or clear it, and the other filters still apply.",
          "areas": [
            "votes",
            "council",
            "people"
          ],
          "links": [
            "/council#meeting-time",
            "/votes"
          ]
        },
        {
          "id": "2026-09-26-attendance-proof-links-and-coverage",
          "date": "2026-09-26",
          "type": "feature",
          "title": "Attendance counts link to their meetings and show coverage",
          "summary": "On the Council page every attendance and meeting count links to the meetings it counts, names link to profiles, and each year's meeting count is shown against the meetings known to have been held (for example 19 of 25 in 2022), with the reason each missing meeting is not counted. The People page tags members who presided at a meeting and adds a Presided filter.",
          "areas": [
            "council",
            "votes",
            "people"
          ],
          "links": [
            "/council#meeting-time",
            "/people?category=council&status=presided"
          ]
        },
        {
          "id": "2026-09-26-council-meeting-time-and-attendance",
          "date": "2026-09-26",
          "type": "feature",
          "title": "Meeting times, mayor attendance, and who presided",
          "summary": "Each meeting on the Votes page now shows its roll-call and adjournment times, the opening roll call including the mayor, late or remote arrivals, and who presided when the mayor was absent. The Council page adds meeting time and attendance by year and by person for 2020 to date. Each council member's and the mayor's profile shows their roll-call attendance.",
          "areas": [
            "votes"
          ],
          "links": [
            "/council#meeting-time",
            "/votes",
            "/transparency"
          ]
        },
        {
          "id": "2026-09-26-former-member-term-dates",
          "date": "2026-09-26",
          "type": "feature",
          "title": "Council profiles show term dates, including for former members",
          "summary": "Council and mayor profile cards now show term dates. Current members' cards show the months their current term runs. Former members' cards show their last documented term with 0 days remaining (for example, 0 of 1,461 days, Jan 2022 to Dec 2025). Former members' People profiles list each term with its source: archived City roster pages for published expirations, and Council minutes for appointments. Kyle Mertz's temporary appointment during Josh Dunwoody's military service ends at his last roll call, because the minutes record no formal end date.",
          "areas": [
            "council",
            "people",
            "votes"
          ],
          "links": [
            "/votes",
            "/council",
            "/people"
          ]
        },
        {
          "id": "2026-09-26-presence-over-time-grid",
          "date": "2026-09-26",
          "type": "feature",
          "title": "Presence over time on the Council page",
          "summary": "A grid on the Council page shows every known meeting since 2020 for the mayor, each Council member, and the city officials listed at 20 or more meetings: present, arrived late, or absent at roll call, or listed under City Officials Present. Meetings without readable minutes are shaded, as are meetings where the officials list was not captured. Hover or tab to a cell for details; click to open that meeting.",
          "areas": [
            "council"
          ],
          "links": [
            "/council#meeting-time"
          ]
        },
        {
          "id": "2026-09-26-presence-tenure-line",
          "date": "2026-09-26",
          "type": "feature",
          "title": "Presence charts show each member's tenure",
          "summary": "Council-presence charts for Council members and the mayor add a third line: the meetings during their tenure (every readable roll call that lists them). Their documented meetings are now measured against that tenure instead of every meeting held, for example 59 of 71 for Kyle Mertz. The charts now have year and count axes, shade meetings with no readable minutes, and show each meeting's counts on hover or keyboard focus; clicking a meeting opens its record.",
          "areas": [
            "votes"
          ],
          "links": [
            "/votes#council-presence"
          ]
        },
        {
          "id": "2026-09-26-proof-links-set-filters",
          "date": "2026-09-26",
          "type": "data-fix",
          "title": "Links to meetings set the Votes page filters",
          "summary": "Links from Council-page counts, People-page tags, and chart points now open the Votes page with all years shown, and with the member selected when the count is about one person. Before, a year filter saved from an earlier visit could hide the linked meetings.",
          "areas": [
            "votes",
            "council",
            "people"
          ],
          "links": [
            "/council#meeting-time"
          ]
        },
        {
          "id": "2026-09-26-roles-on-presence-charts",
          "date": "2026-09-26",
          "type": "feature",
          "title": "Presence charts show each role a person held",
          "summary": "When the minutes print more than one title for a person, their presence chart draws the documented line in a different line style for each role, with a legend of the roles and years (for example City Clerk / Finance Officer, Interim City Administrator, then City Administrator). Meetings chaired in a role other than mayor, such as Mayor Pro Tem, are marked with open dots. Roles come from the titles the minutes print beside the name, with spelling variants merged.",
          "areas": [
            "votes",
            "people"
          ],
          "links": [
            "/votes#council-presence"
          ]
        },
        {
          "id": "2026-09-26-shortest-meeting-column",
          "date": "2026-09-26",
          "type": "feature",
          "title": "Shortest meeting per year, linked",
          "summary": "The Council page's meeting-time table adds each year's shortest meeting, and the longest and shortest durations now link to the meetings they come from.",
          "areas": [
            "council"
          ],
          "links": [
            "/council#meeting-time"
          ]
        },
        {
          "id": "2026-09-26-virtual-meetings-and-phone-vote",
          "date": "2026-09-26",
          "type": "data-update",
          "title": "Virtual meetings from 2020-2021 are marked",
          "summary": "27 Council meetings from April 2020 to May 2021 were held via GoToMeeting or Zoom, or at City Hall and online, during the COVID-19 epidemic. Each now shows its format as printed in the minutes, and the Council page counts them by year. The February 15, 2021 minutes record that Vern Willey was contacted by phone for item 11; that vote's note now says so.",
          "areas": [
            "votes",
            "council"
          ],
          "links": [
            "/council#meeting-time"
          ]
        },
        {
          "id": "2026-09-26-votes-records-footnote-presence-dots",
          "date": "2026-09-26",
          "type": "feature",
          "title": "Vote-count footnote, presence chart dots, and consistent member labels",
          "summary": "The Total vote records figure on the Votes page now carries a footnote: the records come from automated parsing of the City's posted minutes, and the count is best-effort with known limitations. Council presence charts join documented meetings only when they are back-to-back meetings held; a meeting with no documented neighbor is drawn as its own dot. Member names on the Votes, Council, and People pages now always show their status labels and context asterisk, and links to a single Council presence card open that card.",
          "areas": [
            "votes",
            "people",
            "site"
          ],
          "links": [
            "/votes",
            "/votes#council-presence",
            "/transparency#known-limits"
          ]
        }
      ]
    },
    {
      "id": "2026-09-26-roundup-altoona-by-the-numbers-and-district-lookup",
      "date": "2026-09-26",
      "type": "roundup",
      "title": "Altoona by the numbers, and a district lookup",
      "summary": "The Local corner adds Altoona by the numbers: the Census Bureau's 2024 five-year estimates for the whole city, each with its margin of error and a link to the Census table, plus the offenses Altoona police reported to the FBI each year since 2020 with Altoona, Iowa, and U.S. rates. A lookup at /local/civic shows the council ward, precinct, and polling place for a typed address or a clicked point on the map; the address stays in the browser.",
      "areas": [
        "data",
        "local",
        "research"
      ],
      "links": [
        "/local#by-the-numbers",
        "/local/civic"
      ],
      "changes": [
        {
          "id": "2026-09-26-altoona-by-the-numbers",
          "date": "2026-09-26",
          "type": "feature",
          "title": "Altoona by the numbers",
          "summary": "The Local corner now has an Altoona by the numbers section: the Census Bureau's 2024 five-year estimates for the whole city, each with its margin of error, who it counts, and a link to the Census table, plus earlier five-year estimates and the offenses the Altoona Police Department reported to the FBI each year since 2020, with FBI rates for Altoona, Iowa, and the U.S. The Research notebook's citywide figures now come from the same data file.",
          "areas": [
            "local",
            "research",
            "data"
          ],
          "links": [
            "/local#by-the-numbers",
            "/research",
            "/transparency"
          ]
        },
        {
          "id": "2026-09-26-district-lookup",
          "date": "2026-09-26",
          "type": "feature",
          "title": "District lookup",
          "summary": "Added a lookup at /local/civic that shows the council ward, precinct, and polling place for a typed address or a clicked point on the map. The address stays in the browser.",
          "areas": [
            "local"
          ],
          "links": [
            "/local/civic"
          ]
        }
      ]
    },
    {
      "id": "2026-09-26-roundup-alpr-tracker-flock-portal",
      "date": "2026-09-26",
      "type": "roundup",
      "title": "ALPR tracker: Flock's own portal reading, a daily archive, and the City's approval timeline",
      "summary": "The tracker now reads Flock's own Altoona transparency portal (51 cameras, 572,639 vehicles detected, 244 searches, and 8,674 hotlist hits over the last 30 days), archives each day's vendor reading so the figures can be compared over time, and always shows the reading with the newest vendor data date. The City's four-stage ALPR approval timeline is quoted in the City's own words, with the one stage that matches a Council record linked to the July 21, 2025 consent-agenda vote and the other three recorded as having no matching record in posted minutes.",
      "areas": [
        "alpr",
        "police",
        "research",
        "votes"
      ],
      "links": [
        "/alpr/tracker",
        "/votes?meetings=2025-07-21"
      ],
      "changes": [
        {
          "id": "2026-09-26-alpr-approval-timeline-cross-reference",
          "date": "2026-09-26",
          "type": "feature",
          "title": "Link the City's own ALPR approval timeline to our vote record",
          "summary": "The City of Altoona's ALPR page answers \"When did City Council approve Altoona's ALPR cameras?\" with four stages: a 2022 pilot, ongoing annual budget funding, a 2024 Flock expansion, and a July 21, 2025 vote approving the Axon Master Services and Purchasing Agreement (Consent Agenda Item 12(c), which included the Outpost ALPR units). Only the last stage matches a record in our vote data. The ALPR tracker, Research Notebook, and Police page now quote the City's own words for all four stages and link the matched stage to /votes?meetings=2025-07-21 (Council minutes, page 3, item 12(c)) with the caveat that this was one roll-call vote covering that meeting's full 15-item consent agenda, not an ALPR-specific vote. The other three stages are recorded honestly as having no matching council record in posted minutes. A new reviewed cross-reference file (newsroom/alpr-vote-cross-references.json, published to src/alpr/) backs every citation.",
          "areas": [
            "alpr",
            "votes",
            "research",
            "police"
          ],
          "links": [
            "/alpr/tracker",
            "/research",
            "/police",
            "/votes?meetings=2025-07-21"
          ]
        },
        {
          "id": "2026-09-26-alpr-daily-archive",
          "date": "2026-09-26",
          "type": "feature",
          "title": "ALPR tracker keeps a daily record of vendor readings",
          "summary": "The tracker now archives each day's vendor reading, so its figures can be compared over time instead of only as a rolling 30-day view.",
          "areas": [
            "alpr"
          ],
          "links": [
            "/alpr/tracker"
          ]
        },
        {
          "id": "2026-09-26-flock-portal-reading",
          "date": "2026-09-26",
          "type": "data-update",
          "title": "Flock portal reading added to the ALPR tracker",
          "summary": "New figures read from Flock's own Altoona transparency portal: 51 cameras, 572,639 vehicles detected, 244 searches, and 8,674 hotlist hits over the last 30 days, with 30-day retention. The portal's last-updated time was not captured, so the reading is dated the day it was observed.",
          "areas": [
            "alpr"
          ],
          "links": [
            "/alpr/tracker"
          ]
        },
        {
          "id": "2026-09-26-tracker-newest-vendor-data",
          "date": "2026-09-26",
          "type": "data-fix",
          "title": "ALPR tracker shows the newest vendor data",
          "summary": "The tracker had shown whichever reading we collected last, so an older Eyes On Flock copy could replace a newer reading taken from Flock's own portal. It now shows the reading with the newest vendor data date and says what date that is.",
          "areas": [
            "alpr"
          ],
          "links": [
            "/alpr/tracker"
          ]
        }
      ]
    },
    {
      "id": "2026-09-26-lead-oconnor-lpr",
      "date": "2026-09-26",
      "type": "data-update",
      "title": "Lead story: Mayor O'Connor on LPRs",
      "summary": "New fact-checked lead story from the Sept. 8, 2026 minutes: after two residents raised camera concerns, Mayor O'Connor stated he is a big supporter of the LPRs. Stories can now link to the People profiles they concern.",
      "areas": [
        "news",
        "people"
      ],
      "links": [
        "/",
        "/people?person=dean-oconnor"
      ]
    },
    {
      "id": "2026-09-26-kyle-mertz-name-correction",
      "date": "2026-09-26",
      "type": "correction",
      "title": "Corrected council member name: Kyle Mertz",
      "summary": "Vote records and the council directory listed a former council member as David Mertz. The City's minutes name him Kyle Mertz. All 942 affected vote records and his profile now use the correct name. His profile cites the minutes for his 2020-2021 service and his temporary appointment from July 2025 to June 2026, when Josh Dunwoody was on military leave.",
      "areas": [
        "votes",
        "people",
        "council"
      ],
      "links": [
        "/votes",
        "/people?person=kyle-mertz"
      ]
    },
    {
      "id": "2026-09-26-grouped-site-menus",
      "date": "2026-09-26",
      "type": "feature",
      "title": "Grouped menus in the header and a site map in the footer",
      "summary": "The header's More box is replaced by four menus (Council, Police & ALPR, Local, and News & research) that open on hover, click, or keyboard, with a one-line description of each page. On phones, a single Menu button lists every section. Every page's footer now carries the same site map above the About, contact, and community links.",
      "areas": [
        "site"
      ],
      "links": [
        "/"
      ]
    },
    {
      "id": "2026-09-26-council-presence-dunwoody-check",
      "date": "2026-09-26",
      "type": "review",
      "title": "Verified the Council-presence tracker for every current member",
      "summary": "A reported issue said Josh Dunwoody's /votes#council-presence tenure and meetings-held lines stop around mid-2025. Re-checked against live data: his card correctly shows a most-recent appearance of September 8, 2026, documented meetings through the current year, and a chart that (accurately, not by omission) breaks into two segments around a real, sourced gap: Kyle Mertz was appointed to fill his seat for military service from July 2025 through June 2026, per Council minutes. Every other current member's card was checked the same way; none showed stale data. No code change was needed; this entry records the check.",
      "areas": [
        "votes"
      ],
      "links": [
        "/votes#council-presence"
      ]
    },
    {
      "id": "2026-09-25-research-notebook",
      "date": "2026-09-25",
      "type": "feature",
      "title": "Research Notebook",
      "summary": "Added a notebook of reviewed citywide aggregates with their sources and methodology limits.",
      "areas": [
        "research"
      ],
      "links": [
        "/research"
      ]
    },
    {
      "id": "2026-09-24-votes-2023-backfill",
      "date": "2026-09-24",
      "type": "data-update",
      "title": "2023 Council votes added",
      "summary": "Roll calls from the 2023 minutes were added, bringing the tracker to 1,882 records across 152 meetings.",
      "areas": [
        "votes"
      ],
      "links": [
        "/votes"
      ]
    },
    {
      "id": "2026-09-24-people-directory",
      "date": "2026-09-24",
      "type": "feature",
      "title": "People directory",
      "summary": "Added source-bound profiles for the mayor, Council members, and City officials, including dated historical biographies from official sources.",
      "areas": [
        "people"
      ],
      "links": [
        "/people"
      ]
    },
    {
      "id": "2026-09-24-flock-sharing-headline-corrected",
      "date": "2026-09-24",
      "type": "correction",
      "title": "Flock sharing headline corrected",
      "summary": "The headline of the Flock sharing analysis was corrected from \"ranks 46-48 of 1,000\" to \"ties 46-48 of 1,528 portals\" to match the snapshot it cites.",
      "areas": [
        "news",
        "alpr"
      ],
      "links": [
        "/news"
      ]
    },
    {
      "id": "2026-09-24-flock-daily-collection",
      "date": "2026-09-24",
      "type": "feature",
      "title": "Daily Flock readings",
      "summary": "The tracker began collecting Flock's Altoona figures daily through Eyes On Flock, which republishes Flock's transparency portals.",
      "areas": [
        "alpr"
      ],
      "links": [
        "/alpr/tracker"
      ]
    },
    {
      "id": "2026-09-24-council-presence",
      "date": "2026-09-24",
      "type": "feature",
      "title": "Council presence records",
      "summary": "The Votes page added a count of meetings where each City official is listed under \"City Officials Present\" in the minutes.",
      "areas": [
        "votes",
        "people"
      ],
      "links": [
        "/votes#council-presence"
      ]
    },
    {
      "id": "2026-09-23-council-section",
      "date": "2026-09-23",
      "type": "feature",
      "title": "City Council section",
      "summary": "City Council became its own section, with each member's share of recorded votes.",
      "areas": [
        "council"
      ],
      "links": [
        "/council"
      ]
    },
    {
      "id": "2026-09-23-axon-hotlist-named-categories",
      "date": "2026-09-23",
      "type": "data-fix",
      "title": "Axon hotlist figures use named categories only",
      "summary": "Axon hotlist-hit calculations now count only the portal's named categories.",
      "areas": [
        "alpr"
      ],
      "links": [
        "/alpr/tracker"
      ]
    },
    {
      "id": "2026-09-22-vote-property-business-directory",
      "date": "2026-09-22",
      "type": "feature",
      "title": "Property and business directory for Council votes",
      "summary": "Votes whose agenda item names a street address or a business are grouped in a directory, so every vote on one site or applicant is in one place.",
      "areas": [
        "votes"
      ],
      "links": [
        "/votes"
      ]
    },
    {
      "id": "2026-09-22-alpr-tracker-launch",
      "date": "2026-09-22",
      "type": "feature",
      "title": "ALPR transparency tracker",
      "summary": "Launched the ALPR tracker, which shows Axon's public portal figures, read automatically, and Flock's portal figures, recorded from the portal outside the daily collection, with combined 30-day plate-read totals.",
      "areas": [
        "alpr"
      ],
      "links": [
        "/alpr/tracker"
      ]
    },
    {
      "id": "2026-09-21-votes-back-to-2020",
      "date": "2026-09-21",
      "type": "data-update",
      "title": "Council votes back to 2020",
      "summary": "Roll calls from official minutes for 2020 through 2025 were added, bringing the tracker to 1,676 records across 137 meetings. Former members appear as archived profiles.",
      "areas": [
        "votes",
        "council"
      ],
      "links": [
        "/votes"
      ]
    },
    {
      "id": "2026-09-21-recorded-nay-votes-preserved",
      "date": "2026-09-21",
      "type": "data-fix",
      "title": "Recorded nay votes kept in the vote tracker",
      "summary": "The vote feed was corrected to keep votes recorded as nay, such as Jayme McFadden's nay on the January 19, 2026 consent agenda. The 2026 feed grew from 146 to 164 records.",
      "areas": [
        "votes"
      ],
      "links": [
        "/votes"
      ]
    },
    {
      "id": "2026-09-21-local-corner-and-guides",
      "date": "2026-09-21",
      "type": "feature",
      "title": "Local Corner, records guide, meeting guide, and police page",
      "summary": "Added the Local Corner with upcoming meetings and local records, an Iowa Chapter 22 public-records guide, a guide to attending Council meetings, and a police accountability page.",
      "areas": [
        "local",
        "site"
      ],
      "links": [
        "/local",
        "/local/records-guide",
        "/activist",
        "/police"
      ]
    },
    {
      "id": "2026-09-21-council-vote-tracker",
      "date": "2026-09-21",
      "type": "feature",
      "title": "Council vote tracker and member profiles",
      "summary": "Launched the Council vote tracker with 146 roll calls from 17 meetings (January 5 to September 8, 2026), each linked to the official minutes, plus profiles of current Council members with their term dates.",
      "areas": [
        "votes",
        "council"
      ],
      "links": [
        "/votes",
        "/council"
      ]
    },
    {
      "id": "2026-09-14-newsroom-launch",
      "date": "2026-09-14",
      "type": "feature",
      "title": "Newsroom, news archive, sourcebook, and contact form",
      "summary": "The site became a public-records newsroom for Altoona, Iowa: a news archive fed from reviewed stories, a sourcebook of official record sources, and a contact form for corrections and tips.",
      "areas": [
        "news",
        "sources",
        "site"
      ],
      "links": [
        "/news",
        "/sources",
        "/contact"
      ]
    },
    {
      "id": "2026-04-12-site-launch",
      "date": "2026-04-12",
      "type": "feature",
      "title": "Deflock Altoona launches",
      "summary": "The first version of deflockaltoona.com went online.",
      "areas": [
        "site"
      ],
      "links": [
        "/"
      ]
    }
  ]
}
