FLiberator
FLiberator is a small open-source software package that does exactly one thing: it liberates the downloadable Florida statutes from a weird proprietary format.
Florida publishes its statutes in bulk only as a Windows application built on Rocket® NXT, a proprietary "Infobase" container. FLiberator turns that into ordinary HTML — one file per section — plus a JSON sidecar with the ordering and hierarchy the HTML can't carry.
License: MIT
Quick start
Requires uv and Python 3.12+. Two commands, from a fresh clone:
uv sync # create .venv and install the package
uv run fliberate --download # fetch Florida's bulk data, then decode it
That's the whole pipeline. It takes about two minutes, nearly all of it the download:
downloading https://www.leg.state.fl.us/Statutes/FLLawDL2025.zip
248,586,704 bytes / 248,586,704 (100%)
extracted 13 .nxt files (371,822,592 bytes)
edition: 2025
statutes: 24,866 documents <- fs2025.nxt
constitution: 213 documents <- flcnst2025.nxt
laws: 255 documents <- lf2025.nxt
total: 25,334 documents written to output/
You need roughly 820 MB of free disk: 249 MB for the zip, 372 MB unpacked, 201 MB of output. Decoding by itself, once the data is on disk, takes about 18 seconds.
Already have the data? Drop --download and it decodes what's in download/ — the download and unzip steps are both skipped automatically if their results are already there, so re-running --download is safe and cheap.
What you get
Output lands in the git-ignored output/ folder:
output/
metadata.json ordering, hierarchy, provenance
statutes/0001/1.01.html 24,866 sections
constitution/article-01/section-03.html 213 sections
laws/2025-1.html 255 session laws
What's covered: the three files holding Florida primary law — the statutes, the Florida Constitution, and the Laws of Florida. The bulk distribution's eight finding-aid files (subject and definition indexes, cross-reference and tracing tables), the bundled US Constitution, and the help PDF are deliberately out of scope.
Footnotes are rewritten as semantic HTML5: each reference becomes a <sup><a role="doc-noteref">, and the note bodies are collected into a <section role="doc-endnotes"> at the end of the section, with one backlink per referrer.
metadata.json carries what the HTML can't — canonical ordering (documents are stored in build order, which has nothing to do with statutory order), the full Title → Chapter → Part hierarchy, per-document footnote counts, and the edition year plus the SHA-256 of each source file so two years' output can be told apart.
The edition year is discovered from the filenames (fs2025.nxt, flcnst2025.nxt, lf2025.nxt), never hardcoded, so next year's data needs no code change.
Commands
uv run fliberate --download # fetch + unzip into download/, then decode
uv run fliberate # decode the newest edition already in download/
uv run fliberate --library DIR # decode a specific Library/ directory
uv run fliberate --output DIR # write somewhere other than output/
uv run fliberate --version
The package is also importable, if you'd rather drive it yourself:
from fliberator import decode, depage
records = depage.load_records("download/FLLawDL2025/Library/fs2025.nxt")
html = decode.decode(records[0], 0, len(records[0]))[0]
How it works
- Download. FLiberator fetches the "Advanced Legislative Search & Browse" application zip from its download page into the git-ignored
download/folder. It scrapes the page for the current year's link (currentlyFLLawDL2025.zip) rather than hardcoding a year. - Unzip, also into
download/— extracting only the 13.nxtdata files, not the 1,369 other entries of the Windows viewer application Florida wraps them in. - Decode the Rocket NXT files directly into HTML plus the JSON sidecar. This is two layers: a paged storage layer (the file is a store of 4 KB pages, and a document is a chain of fragments scattered across non-adjacent ones, which must be reassembled before any byte is read as content) and a content layer (a thin opcode wrapper around otherwise-literal HTML). See
docs/nxt-format.mdfor how the format was reverse-engineered.
Development
uv run pytest # the test suite
uv run ruff check . # lint
uv run ruff format . # format
uv run python scripts/release_check.py # build and validate release artifacts
scripts/ holds the analysis and validation code the reverse-engineering was done with — not part of the package, but still useful as regression checks against the live leg.state.fl.us pages. See plans/re-plan.md for phase-by-phase status.
Background
- Florida provides a downloadable Windows desktop application called "Advanced Legislative Search & Browse", which contains a bulk dataset of the Florida statutes: https://www.leg.state.fl.us/Statutes/index.cfm?Mode=Statutes%20Download&Submenu=7&Tab=statutes.
- After extracting the zip file for the application, there are several
.nxtfiles. This is a proprietary "Infobase" container format produced by Rocket® NXT / Folio NXT software (the Folio Views product line). - The Florida statutes file is
Library/fs2025.nxt. .nxtfiles turn out to contain tokenized-but-mostly-literal HTML: a thin, partially-reverse-engineered opcode layer wraps ordinary markup and text rather than replacing it. That made it possible to decode.nxtstraight to HTML, without ever producing an intermediate Folio Flat File (.fff) or depending on thefolioxmlconverter — an earlier plan for this project, abandoned once the NXT content layer itself turned out to be understandable and sufficient on its own. Seedocs/nxt-format.mdfor the full technical writeup.
Release files for fliberator 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| fliberator-0.1.0.tar.gz | 63.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| fliberator-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 93.4 kB
Release files / fliberator-0.1.0.tar.gz
| Download URL | fliberator-0.1.0.tar.gz |
|---|---|
| Size | 63.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d342110e998afecbcecd9f3f9a97ec666a6265ac64ce9f3389951ae68814a2f0
|
|
BLAKE2b-256 checksum How to use checksums |
055ab7b6e04418ccace75008538e00edd28f13936d7e3ca240471eaffa029d6a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 8, 2026.
Transparency logRelease files / fliberator-0.1.0-py3-none-any.whl
| Download URL | fliberator-0.1.0-py3-none-any.whl |
|---|---|
| Size | 29.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
8fdc61c9a411e21db3cb264a3d2b2f4f1d1ddd451a90c11dff48958870e0bdbb
|
|
BLAKE2b-256 checksum How to use checksums |
b2a6a8764c426975bae426d238273dfdf6c7839b5333a6fae151fe3af5ec9844
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 8, 2026.
Transparency log