fm-saxml-converter
Generate structured, navigable documentation from FileMaker Pro Save a Copy as XML exports.
fm-saxml-converter turns a FileMaker SaveAsXML file into a folder of cross-linked Markdown pages — one file per table, field, layout, layout object, script, relationship, custom function, and value list — backed by a normalized JSON model of the solution. Optionally it adds a browser viewer, and tools that let AI agents query the solution.
The CLI is exposed as fm-saxml.
Why this exists
A FileMaker SaveAsXML export contains everything about a solution, but the raw XML is not readable, not navigable, and not stable across FileMaker versions. This project produces a documentation layer that is:
- Human-readable — Markdown pages with consistent headings, summary tables, and per-entity backlinks.
- AI-readable — predictable structure, machine-parseable front matter, and JSON sidecars for indexing.
- Linkable — every reference between entities (script step → field, layout → table occurrence, calculation → custom function) becomes a link, with "Used By" lists on the other end.
- Safe to share — credentials and other secrets are replaced with placeholders before anything is written.
Requirements
- A FileMaker Pro
Save a Copy as XMLexport - Python 3.11+ (not needed if you use the standalone executable)
Quick start
-
In FileMaker Pro: Tools → Save a Copy as XML…
-
Run the converter on that file:
fm-saxml MySolution.xml(On Windows you can also drag the XML file onto
fm-saxml.exe.) -
Open the new
MySolution_docsfolder that appears next to your XML file.
Add --open to have the folder opened for you. Run fm-saxml doctor if something doesn't work and include its output in any bug report.
Installation
Easiest — no Python needed: download the fm-saxml executable for Windows, macOS or Linux from the project's Releases page.
macOS and Linux: making the download runnable
A file downloaded through a browser isn't marked as executable, and on macOS Gatekeeper blocks it because the build isn't signed by an Apple developer ID. In Terminal, in the folder you downloaded it to:
chmod +x fm-saxml-macos # make it executable (Linux: fm-saxml-linux)
xattr -d com.apple.quarantine fm-saxml-macos # macOS only: clear the download quarantine flag
./fm-saxml-macos --version
Or download it with curl, which skips the quarantine flag:
curl -L -o fm-saxml https://github.com/Blue-Kachina/fm-doc-saxml/releases/latest/download/fm-saxml-macos
chmod +x fm-saxml
The macOS executable is for Apple Silicon Macs. On an Intel Mac, install with Python instead (below).
With Python 3.11+:
pipx install fm-saxml-converter # or run without installing: uvx --from fm-saxml-converter fm-saxml MySolution.xml
To install from source, see the technical README.
Updating
Check your version with fm-saxml --version, then upgrade the same way you installed:
| Installed with | Update command |
|---|---|
pipx |
pipx upgrade fm-saxml-converter |
uv tool install |
uv tool upgrade fm-saxml-converter |
pip |
pip install -U fm-saxml-converter |
uvx |
uvx --from fm-saxml-converter@latest fm-saxml ... |
| Executable | Download the new file from the Releases page |
When a newer version exists, fm-saxml prints a one-line notice after a run (checked at most once a day, never blocks, silent in CI and when output is piped). Disable it with FM_SAXML_NO_UPDATE_CHECK=1.
Usage
Most of the time, this is all you need:
fm-saxml <export file or folder>
The docs are written to <input name>_docs next to the input. Use --out <folder> (or -o) to put them somewhere else. If the output folder already has files in it, you'll be asked before they're overwritten; --force (or -f) skips the question.
Converted docs are local output: build them from your own export and don't commit them. To keep every solution in one place, set FM_SAXML_DOCS_ROOT (or pass --docs-root): each build then goes to <docs root>/<solution>, where tools find it with fm_saxml.find_docs("<solution>"). A rebuild swaps the new docs in only once they're complete.
Reading the docs from Python
import fm_saxml
docs = fm_saxml.load("Invoices_docs")
docs.find("script", "post invoice")
docs.refs_to("field:Invoices::Total")
See JSON contract for the rest.
Multi-file solutions
FileMaker Pro 26 can Save a Copy as XML for several files at once. Point fm-saxml at the folder it wrote:
fm-saxml ./SaXML_PROD_2026-10-14
Each file gets its own subfolder, and references from one file into another become links between them. See Multi-file solutions for the details.
Commands
fm-saxml <file> is shorthand for fm-saxml build <file>.
| Command | What it does |
|---|---|
build <file or folder> |
Parse the export and write the documentation (the default) |
parse <file> |
Parse the export into the normalized model.json only |
render markdown --model <model.json> |
Write documentation from a model.json made earlier |
inspect <file or folder> |
Print entity counts and warnings without writing anything |
validate <file or folder> |
Exit non-zero if the model has critical issues |
diff <old> <new> |
Compare two exports and report what changed — see Comparing exports |
rename-check <file or docs folder> <name>... |
What would break if you renamed a field, script, layout, object ...: every place that names it in text — see Names written in text |
scrub <file> |
Write a copy of the XML with secrets redacted — see Scrubbing |
serve <docs folder> |
Serve a --webmcp build at http://127.0.0.1:8765 so browser agents get its tools |
doctor |
Print environment details for bug reports |
Common options
| Option | What it does |
|---|---|
--out <path> / -o |
Write the output somewhere other than <input name>_docs |
--docs-root <folder> |
Write to <folder>/<solution> instead (also FM_SAXML_DOCS_ROOT); --solution sets the name |
--force / -f (or --yes / -y) |
Overwrite an existing output folder without asking |
--open |
Open the output folder when finished |
--html |
Also write an index.html for browsing the docs in a web browser — see HTML viewer |
--webmcp |
Make the HTML viewer agent-ready, with tools that query the solution — see HTML viewer |
--coverage |
Check that everything in the export reached the docs and write Reports/coverage.md |
--scrub-level secrets|standard|strict |
How much to redact (default secrets) — see Scrubbing |
--disable-scrubbing |
Turn secret scrubbing off |
--strict |
Exit non-zero if any reference is left unresolved |
Run fm-saxml <command> --help for every option. The technical README covers the rest, including CI flags, the output layout, and known limitations.
Documentation
| Document | Covers |
|---|---|
| HTML viewer and WebMCP | --html, --webmcp, serve, and the agent tools |
| Secret and personal-data scrubbing | What is redacted, scrub levels, and the scrub command |
| Multi-file solutions | Building a folder of exports from FileMaker 26 |
| Comparing exports | The diff command |
| JSON contract | entities.json, references.json, backlinks.json, external-references.json: shapes, docIds, versions and JSON Schemas, for tools that read the docs |
| Names written in text | GetField, Set Field By Name, Perform Script by name, ExecuteSQL ...: what breaks on rename, Reports/indirection.md and rename-check |
| Technical README | Pipeline, output layout, coverage report, development, FileMaker XML notes, known limitations |
License
The secret-detection rules in src/fm_saxml/scrub/ are adapted from the FileMaker XML Scrubber by Andrew Kear, Clockwork Creative Technology, used under CC BY 4.0.
Metadata
Release files for fm-saxml-converter 0.6.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| fm_saxml_converter-0.6.3.tar.gz | 2.1 MB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| fm_saxml_converter-0.6.3-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 2.4 MB
Release files / fm_saxml_converter-0.6.3.tar.gz
| Download URL | fm_saxml_converter-0.6.3.tar.gz |
|---|---|
| Size | 2.1 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
b5c839da74622732eb144343832ef90448de4b8e8cf3bef370a530c967bf6dbe
|
|
BLAKE2b-256 checksum How to use checksums |
b2428cd3571453e1044c78fc2811ddcbf6eeecbd1e1d64afa1a468d3d3b4b691
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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 Oct 23, 2026.
Transparency logRelease files / fm_saxml_converter-0.6.3-py3-none-any.whl
| Download URL | fm_saxml_converter-0.6.3-py3-none-any.whl |
|---|---|
| Size | 341.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
2fa7f0aa7f2eb45db0592d5e988396f678630c71c5cc5cf3c432715502b7afe7
|
|
BLAKE2b-256 checksum How to use checksums |
de4d4ece533c5db38d9c798045eff1300b5b896d00590a2798203b34e02ef737
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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 Oct 23, 2026.
Transparency logSecurity for fm-saxml-converter 0.6.3
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.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for fm_saxml_converter-0.6.3.tar.gz
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 Oct 23, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.