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.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file fliberator-0.1.0.tar.gz.
File metadata
- Download URL: fliberator-0.1.0.tar.gz
- Upload date:
- Size: 63.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d342110e998afecbcecd9f3f9a97ec666a6265ac64ce9f3389951ae68814a2f0
|
|
| MD5 |
61a8bb77b7aaf6f3bb392d7f61244877
|
|
| BLAKE2b-256 |
055ab7b6e04418ccace75008538e00edd28f13936d7e3ca240471eaffa029d6a
|
Provenance
The following attestation bundles were made for fliberator-0.1.0.tar.gz:
Publisher:
publish.yml on anseljh/FLiberator
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
fliberator-0.1.0.tar.gz -
Subject digest:
d342110e998afecbcecd9f3f9a97ec666a6265ac64ce9f3389951ae68814a2f0 - Sigstore transparency entry: 2386920841
- Sigstore integration time:
-
Permalink:
anseljh/FLiberator@91ed9e4e34fbe71d56b62d3d3bc8d1de76e435b5 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/anseljh
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@91ed9e4e34fbe71d56b62d3d3bc8d1de76e435b5 -
Trigger Event:
push
-
Statement type:
File details
Details for the file fliberator-0.1.0-py3-none-any.whl.
File metadata
- Download URL: fliberator-0.1.0-py3-none-any.whl
- Upload date:
- Size: 29.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8fdc61c9a411e21db3cb264a3d2b2f4f1d1ddd451a90c11dff48958870e0bdbb
|
|
| MD5 |
64e1cff056581c11022b10153adcdf65
|
|
| BLAKE2b-256 |
b2a6a8764c426975bae426d238273dfdf6c7839b5333a6fae151fe3af5ec9844
|
Provenance
The following attestation bundles were made for fliberator-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on anseljh/FLiberator
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
fliberator-0.1.0-py3-none-any.whl -
Subject digest:
8fdc61c9a411e21db3cb264a3d2b2f4f1d1ddd451a90c11dff48958870e0bdbb - Sigstore transparency entry: 2386920847
- Sigstore integration time:
-
Permalink:
anseljh/FLiberator@91ed9e4e34fbe71d56b62d3d3bc8d1de76e435b5 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/anseljh
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@91ed9e4e34fbe71d56b62d3d3bc8d1de76e435b5 -
Trigger Event:
push
-
Statement type: