What we've shipped.
Last updated · 2026-09-01 · Newest first
Fault Line is built in the open by one person. This is the running log of what's shipped, versioned honestly. If something isn't listed here, it hasn't happened yet — a running theme in civic tech is to promise more than gets shipped, and this page is our defense against that pattern.
2026-09-01
Service status page + copyright range fix
- New public /status page. Point-in-time probe of 11 critical service dependencies (marketing site, web app, Supabase REST + Auth, Kokoro TTS Modal, Resend, Anthropic, OpenStreetMap, SeeClickFix, plus DOJ & MA statute source pages that outbound letter links depend on). Summary badge auto-derives severity (operational / degraded / partial-outage / major-outage). Script at
scripts/status/check-services.mjs writes JSON + HTML on each run; drop-in GitHub Actions workflow documented in the script README for hourly automation.
- Discovered live outage during first run: Supabase project
dzewklljiksyivsfpunt.supabase.co returns NXDOMAIN from both Cloudflare and Google DNS. Status page correctly shows major-outage. Root cause requires a check in the Supabase dashboard (project may be paused, deleted, or renamed).
- Copyright range fixed. All 50 marketing HTML files + status-page generator template + Next.js webapp footer updated from © 2026 to © 2025–2026. Reflects that the Fault Line name has been in use since 2025. Webapp uses dynamic
2025–{new Date().getFullYear()} so the range auto-extends each year.
- DEFERRED #35 added: external uptime monitoring (Better Stack / UptimeRobot) as the true-independence complement to the self-hosted status page. Free tier sufficient for beta; paid tier ($18–$29/mo) becomes worth it once a pilot city depends on 24/7 uptime.
2026-08-31
Engineering delivery, day 2: pipelines, migrations, UI sections — everything shippable without a pilot is now shipped
- Right-of-reply pipeline at
src/services/right-of-reply/ — shared infrastructure used by both #27 briefing packets (24-hour window) and #31 commercial aggregations (14-day window). createEntry, markNotificationSent, appendResponse, markRemediated, markPublished, effectiveStatus, isReadyToPublish, describeStatus. Pure functions; persistence is the caller’s job.
- Packet generator at
src/services/packet-generator/ — generatePacket() returns markdown + JSON for both council-district briefings and press-ready cluster summaries. Format matches the /briefing-packets commitment exactly.
- Assessor property-ownership lookup at
src/services/commercial/assessor.ts — adapter interface + registry + ownerDisclaimer(). Per-jurisdiction adapters plug in as pilot cities onboard.
- Open311 verification script at
scripts/open311/verify-integration.mjs + docs/integration-status.md. Read-only GET probes against 10 pilot-target authorities (Boston Open311, 7 SeeClickFix cities, Providence proprietary, Concord email). Writes JSON + markdown status report. Closes DEFERRED #23.
- Modal + Playwright snapshot worker scaffold at
modal/digital-snapshot/main.py + full README. Deployable via modal deploy. Captures HTML + full-page screenshot + metadata to a private Supabase bucket. Auth via WORKER_SECRET header. One CLI command from live.
- Three Supabase migrations —
018_resolution_events.sql (departments + resolution_events tables for Rapid Response Roll data model), 019_corridor_area_geometry.sql (PostGIS linestring + polygon on reports, corridor_suggestions table), 020_commercial_property_reports.sql (report_subject enum + commercial columns + commercial_chains + commercial_properties + right_of_reply with RLS). All additive + backwards-compatible.
- Four report-flow UI sections at
src/components/report-flow/ — DigitalReportSection (URL + assistive tech + WCAG criterion inputs), InsiderReportSection (insider category + observed duration + prior report ref + documentary ref, with in-UI notice reminding of out-of-scope categories), CommercialPropertySection (business name + address + chain + two required attestations enforced in UI), CorridorReportSection (street + cross streets + start/end map-pin cells). README documents the composition pattern for ReportScreen.tsx.
- DEFERRED cleanup: all per-item entries now carry honest SHIPPED / SHIPPED-partial markers with BUILDABLE-TODAY vs. BLOCKED-EXTERNAL vs. BLOCKED-DATA gating. New items #32 (wire report-flow sections into ReportScreen), #33 (deploy Modal worker + wire endpoint), and #34 (apply migrations 018-020) capture the residual buildable work as first-class items.
tsc --noEmit --skipLibCheck clean across all new modules + UI components.
2026-08-30
Engineering delivery: routing wire-in, framing templates, URL-first, corridor, insider, commercial scaffolds
- Routing wired into letter generator.
src/services/legalGenerator.ts now consumes getRouting() alongside the statute record. Letters use routing’s primaryAuthority.name as recipient; unreviewed-content banner fires on either statute or routing being unverified; routing footer appended alongside the statute disclaimer. The HIGH PRIORITY item flagged yesterday is done.
- Legal-framing templates module. New
src/services/legal-templates/ module with 5 framings: defective-highway, ada-title-ii, fair-housing-504, title-vi-language, transit-ada. Every A&E category maps to a framing via getFraming(); letter generator dispatches on framing to produce framing-specific headline, citation, notice period, demand verbs, and federal-fallback complaint pathway.
- Digital-report context + snapshot service scaffold.
DigitalReportContext on Report. src/services/digitalSnapshot.ts exports the captureSnapshot() interface + placeholder (Modal + Playwright worker deployment remains in DEFERRED #26), URL_FIRST_CATEGORIES, and digitalContextForLetter() which appends an EVIDENCE-section block to letters when the report has digital.
- Corridor + area geometry.
ReportGeometryType + CorridorGeometry + AreaGeometry types on Report. src/services/corridorAggregation.ts exports suggestCorridors(), suggestAreas(), and shameIndexWeight() (returns 3× for corridors, 3.5× for areas per the methodology). Letter body renders corridor/area geometry in NATURE OF THE CONDITION when present.
- Insider-report support.
InsiderReportContext + InsiderCategory types. src/services/insiderReports.ts exports buildInsiderContext(), shouldStripMetadata(), insiderVerificationDeadline() (180-day window), and a full referral table for 6 out-of-scope categories (personnel grievance / criminal / classified / retaliation / policy dispute / confidential materials). Tor formal verification stays deferred.
- Commercial-property module. New
src/services/commercial/ directory: thresholds.ts (5/3/90 for property; 15/5/10/180 for chain, matching the /business-property page verbatim), aggregation.ts (aggregateByProperty + aggregateByChain), chains.ts (40 US chains seeded, all pending-review, including MA/RI/NH-relevant Market Basket / Stop & Shop / Shaw’s), ada-title-iii.ts (5 2010 ADA Standards for Accessible Design entries, all pending-review). ReportSubject + CommercialPropertyContext types added.
- DEFERRED honestly retagged. Every partial-ship marked SHIPPED (partial) with the specific residual work called out as BUILDABLE-TODAY, BLOCKED-EXTERNAL, or BLOCKED-DATA rather than the previous catch-all “gated on pilot city.”
tsc --noEmit --skipLibCheck clean across all new modules. No new errors introduced anywhere.
2026-08-30
Access & Equity categories wired into the app + Commercial Property Reporting design
- 39 Access & Equity categories added to
src/constants/categories.ts (and the ReportCategory type in src/types/index.ts). Covers Groups A–F from the taxonomy page: physical mobility / ADA, sensory & cognitive access, age & vulnerability, housing equity, transit equity, and digital public infrastructure. Four of the 39 are enabled in the quick-report grid: missing curb cut, ADA-blocked path, broken elevator in public housing, missing crossing guard. Everything else lives in the full-form category picker.
- Type union expands from 24 to 63 categories.
tsc --noEmit clean on the module.
- New /business-property page committing the design for commercial-property reporting. This is the biggest scope-adjacent expansion in the roadmap and the one that would most easily corrupt the platform’s evidence discipline if built wrong. Design constraints are the whole feature: physical / infrastructural conditions only (never subjective), photo required (no text-only submissions), aggregate-only publication (individual reports never publish; property named after 5+ reports from 3+ reporters over 90 days; chain named after 15+ reports across 5+ locations over 180 days), 14-day right-of-reply with append-response, delisting on remediation, reporter attestation with anti-SLAPP-adjacent liability language, reporter-reputation tracking (internal only), competitive-reporter enhanced-review flag, ADA Title III legal anchor.
- DEFERRED #30 (HIGH PRIORITY) added at the top of the file: wire the routing dataset into
legalGenerator.ts. ~15-line change, half-afternoon effort, ready before a pilot city commits so the plumbing is tested end-to-end from day one.
- DEFERRED #31 scopes the commercial-property engineering deliverables: report subtype in schema, property-ownership lookup service, aggregation + right-of-reply pipeline, chain-identifier database, reporter-reputation tracking, ADA Title III standards dataset (versioned like the statute dataset), attestation legal review.
2026-08-30
Public-Employee Reporting — honest scope, honest legal-protection landscape, honest technical claims
- New /whistleblower page. Public employees frequently know infrastructure failures residents cannot see. This page is Fault Line’s design commitment for how they can report safely — and the equally important commitment about what Fault Line can not deliver (not a specialized whistleblower channel, no classified information, no personnel grievances, no legal protection beyond what state statutes already provide).
- Scope explicitly bounded. In-scope: physical / digital / access / environmental infrastructure conditions the employee observed in the course of work. Out-of-scope: personnel grievances, criminal misconduct allegations, classified info, retaliation claims — each with a referral to the appropriate channel (state EEOC, IG, AG, whistleblower attorney).
- Legal-protection landscape summarized with primary-source links to MA c. 149 § 185, RI whistleblower statute, NH RSA 275-E, plus federal Whistleblower Protection Act and the Garcetti v. Ceballos caveat on official-duties speech. Consult-an-attorney callouts throughout.
- Technical honesty: what we can do (no IP logging, Tor-compatible, EXIF stripping option, no marker distinguishing insider vs. resident reports publicly), what we cannot do (guarantee legal protection, guarantee absolute anonymity against a determined adversary). Anyone who needs absolute technical anonymity is directed to SecureDrop / GlobaLeaks instead.
- Verification model: insider reports that align with existing resident clusters strengthen verification. Insider-only reports without any resident confirmation get a 180-day verification window and expire without escalation if no resident confirms — insider observations alone are not sufficient for a demand letter.
- Engineering scope in DEFERRED #29 — legal review of whistleblower-protection landscape, insider-context fields in report schema, EXIF-stripping upload option, Tor-compatibility formal verification, referral copy for out-of-scope categories.
2026-08-30
Corridor & Area Reports — systemic patterns, not just points
- New /corridor-reports page. A single pothole is a point. A quarter-mile of Beacon Street with nine reports across three months is what actually needs a paving contract. Fault Line has been treating every hazard as a point — corridor and area reports close that gap.
- Three report types specified: point (existing behavior), corridor (linear geometry, street segment), area (polygon geometry, census tract or user-drawn boundary). Point-first workflow does not change — corridor and area are separate flows in the longer-form UI.
- Two paths to creation: (a) auto-suggested when point reports concentrate along a linear/polygonal feature (community accepts the aggregation, algorithm does not auto-promote), (b) resident-initiated with map-drawing for residents who see the systemic problem from the start.
- Higher verification thresholds calibrated to the higher factual claim: corridor needs 5+ reporters at 3+ distinct points; area needs 8+ reporters at 5+ distinct points; geographic-distinctness minimums prevent one reporter from verifying a corridor by submitting at one intersection five times.
- Integrations documented: Shame Index weights corridors ~3x point reports (prevents accountability-arbitrage where 10 point-closures paper over an ongoing corridor failure); Rapid Response Roll credits corridor-level resolutions; Access & Equity Group G aggregation extends to area reports; council briefings get a dedicated corridor section.
- Guardrails: boundaries must be verifiable (real streets, real polygons), aggregation is community-approved (algorithm suggests, humans accept), corridors shrink/grow with data, cross-jurisdiction corridors are auto-split so one municipality is never blamed for another’s failure.
- Grant relevance called out — federal infrastructure funding (SS4A, BRIC, Reconnecting Communities) is awarded to segments and networks, not points. Cities using Fault Line corridor data in applications are more competitive than cities applying with bags of GPS pins.
- Engineering scope in DEFERRED #28 — PostGIS linestring + polygon columns, auto-suggestion nightly job, map-drawing UI, corridor-scale letter templates.
2026-08-30
Briefing Packets — automated council briefings + press-ready cluster summaries
- New /briefing-packets page. Two output types the underlying report data doesn’t currently reach: monthly council-member district briefings (delivered to every council member of record, non-partisan by design) and press-ready cluster summaries (event-driven when a cluster crosses a threshold, delivered to subscribed local journalists).
- Both formats specified with sample packet content. Council briefing shows district-level metrics, top items likely to reach constituent services, fastest resolutions (Rapid Response Roll integration), access & equity flags, and talking-point suggestions. Press summary shows suggested headline, draft lede, key numbers, GPS-tagged evidence, right-of-reply record, methodology footer.
- Guardrails documented up front: no editorial embellishment, not partisan (every council member of record receives the briefing regardless of party), 24-hour right-of-reply to responsible authority before press distribution, no cherry-picking (methodology defines inclusion; staffers cannot omit unflattering items), no paid placements, council members can add annotations but cannot alter Fault Line’s methodology-cited numbers.
- Distribution model: all briefings that are distributed are also public at fault-line.dev/briefings/<jurisdiction>/<date>. No gated access, no preferential information.
- Engineering scope in DEFERRED #27 — council-district boundary ingestion per pilot city, verified official-address list, packet generator service, right-of-reply infrastructure, journalist verification workflow.
2026-08-30
Digital Public Infrastructure — deep-dive on Access & Equity Group F, DOJ 2024 rule framing
- New /digital-infrastructure page. Broken city website forms, screen-reader-inaccessible PDFs, missing translations, and other digital-infrastructure failures that lock residents out of services they’re legally entitled to. Almost no civic-tech tool systematically tracks these — owning this category is a moat.
- DOJ 2024 rule stakes documented. The April 2024 rule under Title II of the ADA made WCAG 2.1 AA the required conformance standard for state and local government web content and mobile apps. April 24, 2026 deadline for 50,000+ resident entities has already passed; April 26, 2027 deadline for smaller entities is running. Cities need to know this before DOJ or a plaintiff’s attorney tells them.
- 12 categories extending the initial 5 from Access & Equity Group F: broken city form, screen-reader-inaccessible PDF, missing translation, ADA website violation, missing plain-language version, missing captions, broken mobile app accessibility, missing digital equivalent of in-person service, broken government email delivery, broken phone accessibility, missing responsive design, missing subscription mechanism.
- URL-first reporting flow specified (photo optional, automated snapshot on submission, assistive-tech context capture) — different from physical-infrastructure reporting because these failures don’t photograph well.
- Guardrails: no offensive auditing (resident-initiated reports only, not automated scans), no zero-day disclosure (statutory response window before public), verification standard (2 independent reproductions required before escalation).
- Engineering scope in DEFERRED #26 — URL-first reporting flow, automated page-snapshot service, ADA Title II demand-letter template with WCAG citation.
2026-08-30
Access & Equity taxonomy — 32 categories, published routing, ADA / Fair Housing / Title VI framing
- New /access-equity page. Fault Line was focused on physical infrastructure defects (potholes, streetlights, sidewalks). The Access & Equity taxonomy extends the same evidence discipline to accessibility, sensory, age-vulnerability, housing, transit, and digital-public-infrastructure failures — the categories where existing 311 fails hardest because routing is fragmented across ADA coordinators, transit authorities, PHAs, and school districts.
- 32 categories across 6 groups + 1 computed pattern. Each category has: named responsible authority, escalation path, cited legal framework (ADA Title II / Fair Housing Act / Section 504 / Title VI / EO 13166 / MUTCD / WCAG). Every citation links to primary regulatory source.
- Environmental-justice aggregation (Group G). Not a filed report type — a computed pattern on top of the underlying reports. Aggregation at census-tract level using public census attributes; individual reporter attributes are never inputs. Positioned as a direct application-support artifact for EPA EJ Small Grants and Justice40-flagged programs.
- Guardrails documented up front: not a substitute for formal ADA/Fair Housing complaints (those go through DOJ/HUD/state civil-rights offices); not a name-and-shame-residents tool; not a demographic surveillance mechanism.
- Engineering scope in DEFERRED #25 — category constants extension, routing dataset by state/jurisdiction, letter templates for ADA / Fair Housing / Section 504 / Title VI, photo-optional reporting UI for categories that don’t photograph well.
- Nav link added across all 15 public pages.
2026-08-30
Rapid Response Roll — positive-feedback layer, design committed in public
- New /rapid-response page. Fault Line was leaning too adversarial. Every civic-tech tool that loses the internal champions inside city government eventually flatlines. The Roll is a public, measured record of the departments and crews that resolve reported hazards fastest — same evidence discipline as the Shame Index, opposite polarity.
- Methodology committed before the data exists. Same pattern as the Shame Index: eligibility criteria (community-verified reports, independently confirmed fix, peer-normalized speed, non-trivial severity), minimum-data threshold (10+ resolutions in 90 days across 3+ categories from 15+ reporters), ranking weights (50% median resolution + 25% peer delta + 15% severity-weighted rate + 10% follow-up durability), and five explicit non-gaming guardrails.
- Sample display labeled SAMPLE. No department currently carries a live listing; the sample table illustrates the format.
- Underlying data model scoped in DEFERRED #24 — three engineering prereqs before live listings can appear: escalation-log resolution schema, community re-photo verification feature, one pilot city’s department/crew jurisdictional mapping.
- Nav link added across all public pages so residents and pilot cities can find it.
2026-08-29
Launch-readiness pass: honesty layer, city page, statute-review architecture
- Testimonials relabeled as illustrative. The "Real People" section on the home and landing pages is now clearly marked as illustrative scenarios — not fabricated user stories. Real stories will replace them with documented consent.
- Shame Index now labeled SAMPLE until cities clear the minimum-data threshold. See the new grading methodology for the criteria, weights, and thresholds.
- Demand letter model shifted to user-sends. The app generates letters for the resident to review, sign, and send — Fault Line does not transmit letters on residents' behalf. This is the cleaner legal posture and matches how the letter feature actually behaves in code.
- Versioned statute dataset shipped. The letter engine now consumes a versioned, chain-of-custody dataset at
src/services/statutes/. When a state entry is not yet legally reviewed, every generated letter is prepended with a prominent unreviewed-content banner. MA / RI / NH are all currently at pending-review pending an attorney sign-off — visible in the letter footer.
- New /cities page for public works departments, with pilot pricing structure and demo request form.
- New /faq page with FAQPage schema, covering the 12 most common questions from residents and prospective municipal partners.
- Ko-fi framing updated to a concrete goal ($20/mo covers the escalation email pipeline for New England).
- Home page CTAs now point at the working web app instead of dead download buttons. Store-claim copy stripped from meta and JSON-LD.
2026-05-06
Domain live · PostGIS security posture hardened
- Custom domain live at fault-line.dev. Marketing site served via GitHub Pages; webapp served via Vercel at app.fault-line.dev.
- PostGIS relocated to
extensions schema (Migration 017). Removes spatial_ref_sys from the public schema entirely so it's no longer exposed via PostgREST — a structural fix rather than a policy fix. Cleared two Supabase advisor lints in one step.
- PostGIS-using RPC functions had their
search_path pinned to public, extensions (Migration 016) so nothing broke during the relocation.
2026-04-21
Authority coverage push · escalation pipeline verified end-to-end
- 795 US authorities seeded across ME / VT / CT / MA / RI / NH / NM / OR / CO after Migration 014's gap-fill pass. Coverage includes Open311, SeeClickFix, Commonwealth Connect, and direct-email routes.
- Census TIGER boundary coverage reached 584 of 784 authorities via the
enrich-authority-boundaries cron. The remaining unmatched rows — mostly SeeClickFix watch-areas and unincorporated CDPs — were deactivated (not deleted) to keep routing clean; recoverable via a future fuzzy-match pass.
- Escalation pipeline verified end-to-end via a live E2E test. Cron fires, dispatcher picks the correct method, Supabase writes the escalation log, Resend API is called with correct payload. Discovered Resend sandbox mode blocks external recipients — a hard blocker awaiting domain verification, tracked as DEFERRED #9b.
- Open311 city expansion research complete: Boston confirmed as the sole standalone Open311 endpoint in the target list; majority of "has_open311" cities actually route through SeeClickFix's aggregate endpoint.
2026-04-20
Cron scheduling live · edge function secrets set
- Daily escalation cron scheduled via
pg_cron (Migration 009). Runs at 14:00 UTC (10:00 AM Eastern). Job name: escalate-clusters-daily.
- All Supabase Edge Function secrets set:
ANTHROPIC_API_KEY, RESEND_API_KEY, CRON_SECRET, FROM_EMAIL, REPLY_TO.
- Edge functions updated with
reply_to header so authority replies route to the maintainer inbox.
2026-04-03
About page + attribution
- New /about page with Moonlit Social Labs attribution, three-state coverage note, and honest solo-maintainer posture.
2026-03-29
Blog and feedback pages
- Three long-form blog essays published: the $3B pothole economic autopsy, statutory liability walkthrough, and why 311 fails.
- New feedback route wired up so residents and municipal staff can contact the maintainer directly.
2026-03-26
Initial marketing site · privacy + terms
- Marketing site published with feature-tour, ad-supported model, and legal pages.
- Privacy policy and terms of service written and published.
- OG image + Twitter card metadata configured for share preview.
Up next
Aspirational — not commitments. Items ship when they ship; no dates promised.
- First
verified statute record. A qualified attorney reviews MA v0.1.0 against primary sources and flips its status. Cost estimated at $400–$800 per state; this is the highest-leverage single dollar in the project right now.
- Resend domain verification. Unblocks escalation email delivery to authorities outside the maintainer's own inbox (the current sandbox limit).
- First pilot city. One MA or NH municipality piloting the city-side dashboard end-to-end. See /cities if you're a public works director.
- State expansion beyond MA / RI / NH. ME, VT, and CT are the next tier — already seeded in the authority database, statute datasets not yet drafted.
- Migrate site from
website/ mirror to docs/. Eliminates the dual-write tax on marketing edits (DEFERRED #12).
- Grant applications. Standing skeleton is ready internally; watch for Knight, Democracy Fund, Rita Allen, and Draper Richards Kaplan calls.