foamwiki
A Rust-backed, notebook-first Python library and thin CLI for Foam-style
Markdown wikis (folders of notes connected by [[wikilinks]]).
The native core reads and parses notes in parallel, maintains the identity and resolution indexes, and stores the link graph. The Python layer preserves the convenient data-oriented API, PyYAML frontmatter values, templates, and filesystem mutation receipts.
Installation
The distribution is named foam-wiki; the Python package and command are both
named foamwiki.
Install the stable release:
uv add foam-wiki
# or: python -m pip install foam-wiki
Until the first stable release, opt into the published prerelease:
uv add --prerelease allow foam-wiki
# or: python -m pip install --pre foam-wiki
Run the CLI without adding a project dependency:
uvx --from foam-wiki foamwiki --help
To install the current branch directly from Git:
foam-wiki @ git+https://github.com/nimashoghi/foampy.git
Git installations build the extension from source and require Rust 1.88 or newer. CI produces CPython stable-ABI wheels for manylinux2014 x86_64 and AArch64 (glibc-based Linux), macOS x86_64 and Apple silicon, and Windows x86_64. Each wheel supports Python 3.10 and newer.
Core API
import foamwiki
ws = foamwiki.load() # walk up to .foam/ ; parse + index once
note = ws["mean-flow"] # lookup by shortest id or path
note.title, note.tags, note.outline
note.backlinks() # who links here
ws.resolve("flow-matching") # -> the target Note (falsy Unresolved if broken)
hits = ws.search("TM-align") # compact immutable Sequence[Hit]
hits[:20] # materialize only the rows being inspected
hits.materialize() # explicit eager Rows[Hit], when required
foamwiki.orphans(ws) # whole-graph census (free functions)
foamwiki.check(ws) # strict link diagnostics
foamwiki.rename(ws, note, "papers/meanflow.md") # dry-run preview; pass dry_run=False to apply
Resolution validates #heading and #^block fragments. Ambiguous attachment
suffixes return a falsy Unresolved(reason="ambiguous") rather than silently
choosing one file. Percent-encode reserved characters in attachment paths, for
example ![[fig%23draft%5D.png]] for fig#draft].png; diagnostic suggestions
do this automatically.
Workspace-wide operations verify that the effective configuration, indexed file census, and every indexed note still match the loaded snapshot. Applied mutations also reject symlink-backed write sources, stage all output before changing the workspace, and roll back on write or reload failure. A dry run therefore remains safe to review even while another editor is active: replanning or applying it fails loudly instead of overwriting newer content.
Selective indexing below an excluded directory
Exclusions use ordered Gitignore syntax. A rooted negation can re-include a narrow subtree without disabling pruning for unrelated excluded directories:
{
"foam.files.exclude": ["!.agents/skills/**/*.md"]
}
foamwiki descends only through .agents/skills for this pattern; excluded
siblings such as .agents/sessions remain pruned. Negations without a safe
rooted prefix, such as !**/skills/**/*.md, retain conservative full-tree
traversal so their matching behavior remains correct.
Compact notebook output
Public records use compact, payload-free representations while keeping
identifiers and paths intact. Potentially large text fields are bounded. Search
hits center an 88-character excerpt on the match instead of dumping the complete
source line and nested Note/Pos records:
<Hit alphafold-2/paper L272:550 '...colaboratory). TM-align v. 20190822 (https://zhanglab.dcmb.med.umich.edu/...'>
Rows, SearchResults, tag indexes, document outlines, and node child menus
display at most 20 entries and report how many remain. Slice them to continue.
Literal SearchResults also materialize public hit records only on access;
call .materialize() for an eager Rows[Hit]. Automatic mutation diff
previews are bounded; call ChangeSet.diff() for the complete diff. These
limits affect display only: Hit.text and Match.line retain the exact source
line (including indentation), while record fields, iteration, and .to_df()
retain complete data. Passage remains intentionally unbounded because
evaluating .body or .read() is an explicit request for content.
Template authoring
Markdown templates can declare foam_template.filepath and use Foam variables
in both their content and destination. Preview first, then repeat the reviewed
call with dry_run=False:
draft = foamwiki.create(
ws,
template="meeting-scratchpad",
when="2026-07-15T14:30:00+01:00",
dry_run=True,
)
draft.path, draft.frontmatter, draft.text
note = foamwiki.create(
ws,
template="meeting-scratchpad",
when="2026-07-15T14:30:00+01:00",
dry_run=False,
)
foamwiki.daily(ws, "2026-07-15", dry_run=True) uses daily-note.md and prefers
its template filepath. Explicit destinations always override template metadata.
Structure-aware reading (for notebook agents)
Read a large markdown file without dumping it into context. foamwiki.read
returns a priced, navigable map of the file's sections — orient cheaply, drill
by stable numeric path, search to a section, then read only what you choose:
doc = foamwiki.read("design.md") # (or note.doc for a vault note — no reparse)
doc # repr = a priced table-of-contents (~150 tok for a 40k-tok file)
doc["3.2"] # drill by numeric path (or doc["Method"] / doc[3]); prints a menu, never dumps
doc.search("KL") # term -> the sections that contain it (Rows[Match])
doc["3.2"].body # read just this section's prose (a priced Passage); .read() for the whole subtree
doc["3.2"].children # tree nav as properties: .parent .children .siblings .next .prev
Every view quotes exact line counts + ~token estimates, so you budget before
you spend. Works standalone on any .md file (no workspace needed).
See AGENTS.md for the design philosophy and the placement rule.
pandas and networkx are optional extras used lazily by .to_df() and
to_networkx(); request the all extra in the Git dependency when needed:
foam-wiki[all] @ git+https://github.com/nimashoghi/foampy.git.
Development
uv sync
uv run pytest -q
uv run ruff check .
uv run basedpyright src scripts
cargo fmt --check
cargo clippy --all-targets --all-features -- -D warnings
cargo test --all-targets --all-features
See PERFORMANCE.md for the real-workspace baseline and
reproducible benchmark command. MIGRATION.md lists the
intentional behavior and naming changes. RELEASING.md
documents local and CI release validation.
MIT licensed.
Metadata
Release files for foam-wiki 0.4.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 | |
|---|---|---|---|
| foam_wiki-0.4.3.tar.gz | 192.9 kB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| foam_wiki-0.4.3-cp310-abi3-win_amd64.whl | CPython 3.10 | abi3 | Windows x86-64 | Details |
| foam_wiki-0.4.3-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl | CPython 3.10 | abi3 | Linux glibc 2.17+ x86-64 | Details |
| foam_wiki-0.4.3-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl | CPython 3.10 | abi3 | Linux glibc 2.17+ ARM64 | Details |
| foam_wiki-0.4.3-cp310-abi3-macosx_11_0_arm64.whl | CPython 3.10 | abi3 | macOS 11.0+ ARM64 | Details |
| foam_wiki-0.4.3-cp310-abi3-macosx_10_12_x86_64.whl | CPython 3.10 | abi3 | macOS 10.12+ x86-64 | Details |
Total release size: 5.7 MB
Release files / foam_wiki-0.4.3.tar.gz
| Download URL | foam_wiki-0.4.3.tar.gz |
|---|---|
| Size | 192.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
3c9bdb1ad331996c0b075a17c194c7f77bbcbc4ee4c082b15386f7ace9eb92a6
|
|
BLAKE2b-256 checksum How to use checksums |
c6cd35fc5ed4e77fd6b271dcf7995561f43acfc2922f28534a85f02de065d7ba
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.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 26, 2026.
Transparency logRelease files / foam_wiki-0.4.3-cp310-abi3-win_amd64.whl
| Download URL | foam_wiki-0.4.3-cp310-abi3-win_amd64.whl |
|---|---|
| Size | 1.1 MB |
| Tags | CPython 3.10 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
21d9a2ebcf5232624345be83bfab2b580190cdf49b974200afab77e4bdad57d6
|
|
BLAKE2b-256 checksum How to use checksums |
3aa22a5c9f6abb43e8ec4c01a209c6a404b66a0d23011a67bc946362537b47eb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.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 26, 2026.
Transparency logRelease files / foam_wiki-0.4.3-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | foam_wiki-0.4.3-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 1.2 MB |
| Tags | CPython 3.10 Linux glibc 2.17+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
4c1b91e9a62b8c6024c3e912fe67a34c8177edeeba8c7754386aa4e0abd37b8f
|
|
BLAKE2b-256 checksum How to use checksums |
673eed03f4f0ce8ce868d070d970ee61a67ee82f5ea30ad3352854d6ffac9bb5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.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 26, 2026.
Transparency logRelease files / foam_wiki-0.4.3-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | foam_wiki-0.4.3-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 1.1 MB |
| Tags | CPython 3.10 Linux glibc 2.17+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
65d819626cd70db3a9fed284c1154f3abb53e6b2a3fa0f428396db20f5e9441c
|
|
BLAKE2b-256 checksum How to use checksums |
b3945d92d060adcffe4f5606f0c82d49817cf99f32cdf617f3bca881185dc731
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.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 26, 2026.
Transparency logRelease files / foam_wiki-0.4.3-cp310-abi3-macosx_11_0_arm64.whl
| Download URL | foam_wiki-0.4.3-cp310-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 1.0 MB |
| Tags | CPython 3.10 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
fcf1150981d006edeb980b748353d6eba62770e0f0ea395f93710de9fdec7bbf
|
|
BLAKE2b-256 checksum How to use checksums |
368c05657469947c3580e08b14c46070a3676588dbb5e10fe56efa6c8dccc9b3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.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 26, 2026.
Transparency logRelease files / foam_wiki-0.4.3-cp310-abi3-macosx_10_12_x86_64.whl
| Download URL | foam_wiki-0.4.3-cp310-abi3-macosx_10_12_x86_64.whl |
|---|---|
| Size | 1.1 MB |
| Tags | CPython 3.10 abi3 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
9fb39fe8137d8751e1ce4f03778b6e4b8c7ad153d915b44b825920c121c3b462
|
|
BLAKE2b-256 checksum How to use checksums |
8d157f10affb5f720928c2a93e65b498193ad1d6ab8d9de05a1f914de73fd196
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.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 26, 2026.
Transparency log