尚未收集儲存庫資訊。
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗Bay County, Florida public records in plain view: maps, money, and the documents behind them. Powered by Flux Labs.
Live at https://baycounty.me (Vercel project baycounty-me, team Flux Labs Projects). Every push to main deploys.
site/
build_site.py static site generator: layout, menu, footer, pages
tokens.css color and type tokens (Flux palette, Poppins)
site.css header, menu, footer, home, prose and glossary styles
glossary.py plain-English terms: one-line simple version, detail, example
tax_page.py Tax Dollars page: builds its dataset from data/tax/ and writes assets/tax.js
tax.js, tax.css calculator, charts and government explorer for the Tax Dollars page
public/ built output; this is what Vercel serves
assets/
template.html CRA Spending page (markup, styles, map/ledger script)
logo_small.webp Flux Labs logo for the "Powered by" footer
data/
panama_city.json, lynn_haven.json, pcb.json, others.json research files, one per CRA group
verify_results.json independent source check of the 30 largest records
tax/ millage.json (DOR rates and levies 2020-2025), budgets.json (FY2026 budgets),
finances.json (EDR audited actuals FY2021-FY2024), scripts/ used to extract them
build.py merges research files; sets status, counted-in-totals and overlap notes
prep_dash.py turns merged data + map geometry into the dashboard dataset
geo/
basemap.py simplifies coastline, county, city and CRA district shapes
cra_gis.json official CRA district boundaries (Bay County GIS, Admin_A12/MapServer/27)
*.json city limits (U.S. Census TIGER) and Bay County outline
ios/ holds the native iPhone app. It reads the same /downloads/*.json files and /api/v1/search, so new data shows up in the app without an app update. Setup and layout: ios/README.md. When a dataset is added, give it an entry in ios/BayCountyKit/Sources/BayCountyKit/DatasetSpec.swift so it gets a proper title and filters (it shows under "More data" until then). The iOS data layer tests workflow checks the app's data layer against every published dataset.
data/agendas/watch_agendas.py reads the agenda inbox ([email protected] in Resend, triggered instantly by api/agenda-inbound.js) and every agenda system, stores each agenda, packet and minutes file with its versions, and reports on /admin → Agendas. Setup and secrets: data/agendas/README_agendas.md.
cd data && python3 build.py && python3 prep_dash.py
cd ../site && python3 build_site.py
git add -A && git commit -m "Update" && git push
geo/basemap.py also needs geo/land.json (Natural Earth 10m land, not committed because it is 10 MB):
curl -o geo/land.json https://raw.githubusercontent.com/nvkelso/natural-earth-vector/master/geojson/ne_10m_land.geojson
MENU in site/build_site.py (a top-level link, or a child under a drop-down such as Public Money).(path, title, description, render_function) entry to PAGES.Every term on the site lives in site/glossary.py. Wrap a word with term('id', 'text') in build_site.py (or <span class="term" data-term="id">text</span> in page JS) and it gets a dotted underline; hover, tap or Tab to it for the simple explanation, with a link to /glossary#id. Write the simple line so a fifth-grader can follow it.
site/tables.js loads on every page. Any <table> gets sortable headings, a filter box (plus drop-downs for columns
with a handful of values) and a "Download CSV" of the rows on screen in the order shown. Default order: newest first by
the table's date column, then A to Z by its first text column. Group rows (tr.grp) keep their rows; totals rows stay
at the bottom; rows a page hides itself (hidden) are left out. It re-applies after a page script re-renders a table.
data-tt="off" opts a table out, data-tt="own" is for paginated ledgers that sort their own data with TT.attach()
and TT.sortBy(), data-tt-search="off" drops the filter box when the page has its own, data-cols="A|B" names
columns of a table with no <thead>. Card lists use TT.sortBy() and TT.csv() directly, or <ol data-tt-list>
with data-d (date) and data-n (name) on each item.
Every data change gets an entry at the top of CHANGES in site/updates.py. That drives the "Page updated" line in each page's footer, the /updates page and the /updates.xml RSS feed.
site/search_page.py builds data/search.json after the pages are written: page text and headings, glossary terms, and dataset records. Add a dataset by appending a function to INDEXERS. The API reads search.json; the search page reads the same index split into data/search/ (core.json with pages, sections and glossary first, then text.json and one file per dataset in the background). Each record links to its own view (for example ?id= on CRA Spending, ?p= on Sales Tax Projects).
count: false with an overlap reason)./about#contact posts to api/contact.js (a Vercel function), which emails the message through Resend.
Env vars: RESEND_FULL_KEY (or RESEND_API_KEY), a Resend key that can send from baycounty.me, set in Vercel; optional CONTACT_TO
(default [email protected]) and CONTACT_FROM (default BayCounty.me <[email protected]>). Alerts send from ALERTS_FROM (default the same address).
Spam guards: hidden honeypot field, 3-second minimum fill time, origin check, 5 messages/hour per IP.
Link to it with /about?page=/some/path#contact to prefill the page.
site/seo.py handles what search engines read on every page: the <title> (site name dropped when it would pass 60 characters),
a meta description kept under 160, robots meta, en/es/x-default hreflang, and one JSON-LD graph (WebPage with breadcrumbs everywhere;
GovernmentOrganization on government profiles, Organization on vendor pages, a DataCatalog of every download on /open-data,
a DefinedTermSet on the glossary). The build also writes robots.txt and sitemap.xml (with lastmod and language alternates).
Run python3 site/seo_audit.py after a build: it checks every page for missing or duplicate titles and descriptions, canonicals,
lang, one <h1>, heading order, image alt text, valid JSON-LD and broken internal links, and exits non-zero on errors.
The daily and weekly workflows run it after each rebuild and post a warning if it fails.
site/og.py renders a 1200x630 Open Graph image for every page, profiles included, with Playwright: navy card,
page title, and one big figure from the page's own data (topic pages: home.topics(); governments: adopted budget;
officials: recorded votes, else campaign money or pay; vendors: contracts awarded, else payments). Cards are cut to a
128-color palette with Pillow when it is installed. Output goes to site/og-cache/, copied to public/og/ on build. Images re-render only
when their content changes; the ?v= hash on og:image busts link-preview caches. Pages also carry Twitter
card tags, an apple-touch-icon, and WebSite/Organization JSON-LD on the home page.