fw.pyAll docs
fw.py reference
Every fw.py command and option, including the info and search cards.
fw.py is the day-one downloader and verifier. It uses only the Python standard library. The only outside program is minisign, for signatures.
Install#
Copy the one file, scripts/fw.py, from the repository. Install minisign: brew install minisign (macOS) or your package manager.
The model cards on the site write the commands as fw get and fw verify. To type them that way, add an alias:
alias fw='python3 /path/to/fw.py'fw.py get#
fw.py get <model-id | manifest-url-or-path> [--dir D] [--pubkey FILE] [--no-verify-sig]| Part | Meaning |
|---|---|
manifest | A model id such as Qwen/Qwen3.6-27B, a manifest URL or a local path. For an id, fw.py uses the copy in manifests/ when it runs from the repository, otherwise the manifest on freeweights.allternit.com. For a URL, it also fetches the .minisig next to it. |
--dir D | Where to put the files. Default: the model id with / replaced by __. |
--pubkey FILE | The minisign public key. Default: spec/keys/freeweights-v0.pub in the repository. |
--no-verify-sig | Skip the signature check. fw.py prints a warning that the manifest is not authenticated. |
fw.py verify#
fw.py verify <dir> <model-id | manifest> [--pubkey FILE] [--no-verify-sig]Checks the manifest, then every file in <dir> for presence, size and sha256. Use it after any download method.
fw.py info#
fw.py info <model-id | name | manifest-path> [--remote] [--width N]Prints the model's card in the terminal, the same card the site shows. The header has the family monogram in dot lettering and the newsgroup lines: From, Newsgroups, Subject, Date, Commit, and Signed when the manifest has a signature. Then come a one-line summary, the key facts (parameters, size, formats, task, license) and the commands: fw get, the manifest sha256 prefix and fw verify. A link-only model (non-commercial or gated) prints link only — read the license: and the license link instead. It never prints download commands for one.
| Part | Meaning |
|---|---|
model | A model id, a repo name that matches one model, or a local manifest path. |
--remote | Read the catalog from https://freeweights.allternit.com/api/catalog (and the manifest from the site) instead of this checkout. |
--width N | Card width in columns. At least 60. Default: the terminal width, up to 100. |
Color is used only when the output is a terminal and NO_COLOR is not set. Piped output is plain text.
fw.py search#
fw.py search <words...> [--remote] [--width N] [--limit N] [--cards N]Finds models whose id, name, section, task, format or license contains every word. With three matches or fewer (change it with --cards) it prints a full card for each. With more, it prints three lines per model: the name with size and license class, the From and group line, and the fw get command (or the license link for a link-only model). --limit caps the list (default 20). Exit code 1 means nothing matched.
How it behaves#
- Reads the manifest. If its bytes are not canonical JSON, it stops with REJECT.
- Checks the signature, unless told not to. A missing
.minisigor a bad signature stops it. - For each file, it skips a file that is already complete and correct.
- Otherwise it tries sources in priority order. It resumes a partial download with a Range request, and starts over if the server ignores Range.
- It checks size and sha256. On a mismatch it discards the file and tries the next source.
- At the end it checks all files and prints the verdict.
Exit codes and messages#
| Result | Meaning |
|---|---|
Exit 0, VERDICT: PASS | All files verified. |
Exit 1, VERDICT: FAIL | At least one file is missing, the wrong size or the wrong hash. Each is listed. |
REJECT: manifest bytes are not canonical JSON | The manifest was changed or re-serialized. |
REJECT: no .minisig next to the manifest | There is no signature file. |
REJECT: manifest signature failed | The signature does not match. Do not use the files. |
minisign not found | Install minisign, or pass --no-verify-sig. |
Updated 2026-11-14.