Omnigraph
Graph engine for context assembly. Object-storage native. Agents work with graph data the way engineers work with code: branched, typed, reviewed, merged, audited, and governed.
Look up your address, see where your property taxes go, and check spending, contracts, votes and debt for Bay County and every city. Sources on every figure.
DataGitHub @flux-labs-netOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Repository information has not been collected yet.
No updates detected yet. GitHub releases will appear here.
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full 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.