Accessibility, records & trust

Built for the rules a city actually answers to.

Training in a city isn't just delivered — it's regulated, disclosed, and audited. Civis is built around three of those obligations from the start: accessibility under the ADA, public records under Florida's Sunshine Law, and keeping each city's data its own. Not features bolted on for a security questionnaire — how the system is put together.

The two obligations that drive the build

Two rules a municipal LMS can't treat as optional.

Most learning platforms treat accessibility and records as add-ons. For a city, they're the reason the system exists — and the two places a vendor most often falls short.

Accessibility · ADA Title II · WCAG 2.1 AA

Accessible content, and an accessible app.

Deadline: April 26, 2027

Under the 2024 U.S. DOJ ADA Title II rule, public entities with 50,000+ residents must meet WCAG 2.1 AA — and the obligation reaches content the city provides through third parties, too. So accessibility can't be frontend polish; it's a gate on publishing and a requirement of the app itself.

Content can't be published until it passes an accessibility check — captions and transcripts on every video
The app is AA too: keyboard-operable navigation, managed modal focus, status shown by color and icon and text
AA color contrast — including each city's white-label brand colors
Public records · Florida Sunshine Law

Every record ready to disclose.

Export on demand

Training records a city holds are public records — discoverable, and often requested on a deadline. Civis writes every completion and every change to one append-only, timestamped store, so answering a request is a query, not an archaeology project.

One append-only audit trail is both the compliance record and the records-request surface
Every record is pinned to the exact content version the employee took
Export the training records and the audit trail on demand, per person, team, or the whole city
Data isolation

Each city is a closed world.

Cities share the platform, never the data. Isolation is enforced twice — once by the database, once in every query — so one city can never see another's rows.

Row-level security

Every table is keyed to a tenant, and PostgreSQL row-level security is the backstop that catches any query that forgets the filter. It's the database, not the app, enforcing the boundary.

Defense in depth

The tenant is resolved from the auth token on every request, then applied a second time inside every stored function. Two independent filters have to agree before a row is returned.

No enumerable IDs

Records are addressed by opaque GUIDs on the wire; the internal integer IDs never leave the backend, so there's nothing to guess or increment from a URL or an API response.

The record model

Records are added, never quietly rewritten.

The things a city has to stand behind — who completed what, the attestation they signed, the quiz they passed, and every state change along the way — are written to append-only ledgers. A correction is a new entry, not a silent overwrite, so the history always holds.

Completion ledger — version-pinned, with a timestamp you can stand behind
Quiz attempts stored as a snapshot — the questions and answers as they were that day
Attestations — an explicit "I have read and understood," captured as evidence
An audit event on every state change — the trail behind the record
Training record

Bloodborne Pathogens · Module 2

Record IDREC-7F3A2C
Completed2026-06-12 14:32Z
Content versionv3 · pinned
Assigned becauseRole · Firefighter
EvidenceQuiz 96% · attested
Append-only · public record · exportable
Hosting & scope

US-hosted, and honest about what it's for.

Civis runs on US infrastructure with TLS on every connection. It's built for training and compliance records — and we'd rather tell you where the line is than let a questionnaire assume it.

Scope, stated plainly. Civis holds training and compliance records — completions, attestations, competencies, and the audit trail. It is not a system of record for CJIS-regulated criminal-justice data, which is out of scope. Hosting is self-managed today, with a path to a city's preferred cloud if procurement requires it.

What your reviewer will ask

The questions Risk, IT, and Procurement bring — answered.

Where is our data hosted?
On US infrastructure, with TLS on every connection. For v1 it's self-managed; if your procurement requires a specific cloud or region, that's a supported path — tell us the requirement.
Can another city see our data?
No. Every record is keyed to your city and the boundary is enforced twice — by PostgreSQL row-level security at the database, and again by a tenant filter inside every stored function. Two independent checks have to agree before any row is returned, and internal IDs never appear on the wire.
Can we answer a public-records request quickly?
Yes. Completions, attestations, and every state change are written to one append-only, timestamped store. You export the training records and the audit trail on demand — for a person, a team, or the whole city — without reassembling anything from spreadsheets and email.
Is the platform itself accessible?
Yes — WCAG 2.1 AA is a build requirement, not a retrofit: keyboard-operable navigation, managed modal focus, status shown by color and icon and text, and AA contrast that holds even with a city's own brand colors. Separately, course content can't be published until it passes an accessibility check.
Do you ever edit or delete a record?
No. Completion records, quiz attempts, attestations, and audit events are append-only. A correction is a new entry that references the old one — never a silent overwrite — so the history a city relies on always holds.
What about CJIS or other regulated data?
Out of scope for v1. Civis is a system of record for training and compliance, not for CJIS-regulated criminal-justice data. We'd rather draw that line clearly than have it assumed.

Bring your security questionnaire.

We'd rather answer the hard questions early. Send your accessibility, records, and data-handling requirements, and we'll walk your team through exactly how Civis meets them.