Skip to main content

fm-saxml-converter

PyPI version Python versions License: MIT CI Release

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 XML export
  • Python 3.11+ (not needed if you use the standalone executable)

Quick start

  1. In FileMaker Pro: Tools → Save a Copy as XML…

  2. Run the converter on that file:

    fm-saxml MySolution.xml
    

    (On Windows you can also drag the XML file onto fm-saxml.exe.)

  3. Open the new MySolution_docs folder 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

MIT

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)

Source distribution for fm-saxml-converter 0.6.3
File Size Uploaded Provenance
fm_saxml_converter-0.6.3.tar.gz 2.1 MB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for fm-saxml-converter 0.6.3
File Interpreter ABI Platform
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 log

Release 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 log

Security 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.

Select from 2 files

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 log

A 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.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page