Skip to main content

passageway-connector-markdown

A passageway connector that turns a folder of markdown files into searchable items: a docs folder, an Obsidian vault, a Jekyll or Hugo site, or the articles of the frozen Wikipedia corpus.

What it does

  • Each markdown file is one item. Its id is the path relative to the folder (or an id in its front matter) and its version is a hash of the file, so an edit re-indexes just that note.
  • Front matter gives the metadata: title, address, date, tags, id and weight (see the table below).
  • Headings become sections. Every heading level starts a section whose heading is the trail of its parents, such as Setup › Linux, so a hit says where in the note it is.
  • Folders become the breadcrumb, and links between notes become related items: [text](other.md) and [[Other]].
  • Files that cannot be indexed are skipped, not fatal. A file that is not UTF-8 text, holds binary data or is too big is skipped with a warning on stderr, and the rest of the folder is indexed.

Install

Add the connector to the environment that runs passageway (see Install):

uv tool install --python 3.14 "passageway[markdown]"

An example

A note ops/rotating-certificates.md:

---
title: Rotating certificates
tags: [ops, security]
url: https://wiki.example.org/ops/certs
---
# Rotating certificates

Rotate the signing certificate every year.

## Steps

1. Create the new certificate.
2. Follow [the deploy guide](deploy.md).

becomes this item (shortened):

{
  "id": "ops/rotating-certificates.md",
  "title": "Rotating certificates",
  "url": "https://wiki.example.org/ops/certs",
  "path": ["ops"],
  "labels": ["ops", "security"],
  "links": ["ops/deploy.md"],
  "sections": [
    {
      "heading": null,
      "text": "Rotate the signing certificate every year."
    },
    {
      "heading": "Steps",
      "text": "1. Create the new certificate.\n2. Follow [the deploy guide](deploy.md)."
    }
  ]
}

Configure

In passageway.toml (use the interpreter that has passageway installed, see Install):

[[connector]]
name = "notes"
command = ["/path/to/python", "-m", "passageway_connector_markdown"]
env = { FOLDER = "/Users/you/notes", EXCLUDE = "drafts/**|*.draft.md" }
Setting Default Meaning
FOLDER required The folder to index, including its subfolders
INCLUDE *.md|*.markdown Glob patterns for the files to index, separated by |. * stays within a folder, ** crosses folders, and a pattern without / matches the file name at any depth. Replaces the default
EXCLUDE Glob patterns for files to leave out, the same syntax
MAX_FILE_BYTES 1048576 Files larger than this are skipped with a warning. The core accepts at most 4 MiB per item line and the output escapes non-ASCII text, which can triple its size, so keep this at or below 1 MiB unless your notes are plain ASCII

Always skipped: hidden files and folders (names starting with ., such as .git and .obsidian) and node_modules. Symlinked folders are not followed, and a symlinked file counts only if it points inside FOLDER.

Front matter

A file may start with a YAML block between --- lines. These keys are read; everything else is ignored.

Key Used for
title The title. Without it: the first # heading, then the file name
url The address shown with a hit. Without it: the file:// address of the file
updated The date shown with a hit. Without it: the file's modification time
tags Labels. A list, or a comma-separated string
id A stable id that survives renames and moves. Without it: the relative path. Two files with the same id fail the call and the message names both
weight A multiplier for ranking, from 0 to 2 (default 1)

All values are read as text, so no stays no and 2026-10-28 stays a date string. Front matter that is not valid YAML is reported on stderr and the file is indexed without it.

Behavior

  • Sections: every heading level (# to ######) starts a section whose heading is the trail of its parents. Text before the first heading is its own section. The first # heading is the title (when the front matter has no title, or the same one) and is not repeated; a different # heading stays a section heading. A # inside a fenced code block is not a heading.
  • Links: [text](other.md#part) and [[Other]] or [[Other|text]] become related items when they point at a note in the folder. Wiki links match the file name without case; a name shared by two files links to neither. Links in code are ignored, and the text itself is not changed.
  • Version: a hash of the whole file and of the notes it links to, so any change to the file, front matter included, and a link that starts to resolve (its target was created) re-indexes the note.
  • Bad files: a file that is not UTF-8 text (a BOM is removed), contains binary data or is over MAX_FILE_BYTES is skipped with a warning on stderr, not an error.
  • changed: notes modified or moved in since the given time, from the later of each file's modification and change time, so edits appear within a minute, also for files copied in with their old dates.
  • Cost: every call reads the whole folder, because ids and links need all the notes. A skipped file is reported on every call.

Not supported

  • Headings underlined with === or --- (setext); only # headings split. A # line inside an HTML comment still counts as a heading.
  • Glob character classes ([ab]) and braces ({a,b}); *.md is case sensitive, so NOTE.MD is not found without INCLUDE=*.MD. A pattern with a / is anchored at FOLDER, so drafts/** matches only the top-level drafts; use **/drafts/** for any depth.
  • Reference-style links ([text][ref]) and brackets inside link text.
  • File names in a different Unicode form than the link (Café typed with a combining accent).

Test

uv sync                                  # installs this connector too
uv run pytest connectors/markdown        # offline, on temporary folders

Metadata

Release files for passageway-connector-markdown 0.5.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for passageway-connector-markdown 0.5.0
File Size Uploaded Provenance Actions
passageway_connector_markdown-0.5.0.tar.gz 12.5 kB Without provenance Details for passageway_connector_markdown-0.5.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for passageway-connector-markdown 0.5.0
File Interpreter ABI Platform Actions
passageway_connector_markdown-0.5.0-py3-none-any.whl Python 3 none any Details for passageway_connector_markdown-0.5.0-py3-none-any.whl

Total release size: 20.6 kB

Release files / passageway_connector_markdown-0.5.0.tar.gz

Download URL passageway_connector_markdown-0.5.0.tar.gz
Size 12.5 kB
Tags Source
SHA-256 checksum
How to use checksums
e89af953e5cfd3610477917b1c992b31364a05185a3981de817121268e2b3a68
BLAKE2b-256 checksum
How to use checksums
35b79c7e96544956a619c378ebabe6a123a0ac552b4c8004e04de4b3c7871da9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.13.7 {"installer":{"name":"uv","version":"0.13.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / passageway_connector_markdown-0.5.0-py3-none-any.whl

Download URL passageway_connector_markdown-0.5.0-py3-none-any.whl
Size 8.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
5db79bf6c0340913a004a8ec0b31d401c4bf6845cbba4913fdc9bd9e885856e5
BLAKE2b-256 checksum
How to use checksums
b298274e2378fc9a6daf09b433dd61a8851f0eb2a46d319f881b77238a681285
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.13.7 {"installer":{"name":"uv","version":"0.13.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Security for passageway-connector-markdown 0.5.0

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.

No provenance found

None of the files in this release were uploaded with provenance metadata.

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