Skip to main content

notefeed

Post and read markdown notes on a notefeed server from Python or the command line. Python 3.11 or newer.

pip install notefeed
export NOTEFEED_URL=https://notes.example.com NOTEFEED_FEED=homelab-7f3k2q9x4m8wz
notefeed post "# Backup finished"
backup.sh 2>&1 | notefeed post -
notefeed notes --limit 5
notefeed edit 20260929T140512Z-backup-finished "# Backup finished, verified"
notefeed delete 20260929T140512Z-backup-finished
from notefeed import Client

client = Client("https://notes.example.com", feed="homelab-7f3k2q9x4m8wz")  # password="..." if the instance has one
created = client.post("# Deploy done\nversion 1.4.2")
print(created.url, created.read_url)
for note in client.notes():  # newest first, page by page
    print(note.created_at, note.title)

read_url is None for a feed without a read link (rare; see the operations docs).

Client.from_env() reads NOTEFEED_URL / NOTEFEED_FEED / NOTEFEED_PASSWORD; so does the notefeed command, unless given --url / --feed / --password.

A feed can have its own password, which gates reading, listing and posting to it. Pass feed_password="..." to Client(...) (or per call, e.g. client.post(text, feed_password=...)), or set NOTEFEED_FEED_PASSWORD, which from_env() and the notefeed command both read (there is deliberately no flag, so it stays out of shell history). It is sent as X-Feed-Password; Authorization stays the instance password. A feed password is 1 to 256 printable ASCII characters with no space at the start or end; an empty one is the same as none.

A posted note can be changed or removed: client.edit(id, content) replaces its content and returns the note (its id and URLs stay), and client.delete(id) removes it. Both take the same feed and feed_password arguments as post, and a missing note is a NotFoundError. notefeed edit <id> <text | - | --file PATH> prints the note URL; notefeed delete <id> prints nothing. Anyone who can post to a feed can edit and delete its notes, and deleting is permanent.

A feed can have a title and a description, and can be deleted: client.feed_info() returns the feed (name, title, description, protected, read_url), client.update_feed(title, description) replaces both (an empty string clears one) and returns the feed, and client.delete_feed() removes the feed with all its notes for good. All three take the same feed and feed_password arguments as post, and a feed that doesn't exist is a NotFoundError. Anyone who can post to a feed can do this, and deleting is permanent; there are no notefeed commands for it.

A picture is a note of its own: client.post(data, type="image/png", alt="…") takes bytes (PNG, JPEG, GIF or WebP) and returns what a markdown post returns, with the picture's file and file_url added. Write ![](file) in a markdown note to show it; the feed is created by its first note, a picture that is too large is a NoteTooLargeError, and an instance that takes no pictures (NOTEFEED_IMAGE_UPLOADS=0) answers every picture with an ImagesOffError. The server checks the bytes against the declared type. client.update(id, title=..., alt=...) changes a note's title or a picture's alt text, and client.edit(id, content) replaces its content. client.update_feed(title, description, image=file) makes a picture the feed's title image (image="" removes it; leaving image out keeps it). notefeed post --file photo.png posts a file (the type comes from the extension, or --type). To post a note with its pictures in one call, client.post(text, attachments=[Attachment("chart.png", data, "image/png")]) posts them with the text in one request, and the server swaps ![](chart.png) for each file name (None content posts only the pictures) (notefeed post "…" --attach chart.png does the same); nothing is posted when one is refused. Pictures are public to anyone with the feed's read link, and metadata such as EXIF is not removed.

Full documentation: https://docs.notefeed.me/integrations/clients/

Metadata

Release files for notefeed 0.10.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 notefeed 0.10.0
File Size Uploaded
notefeed-0.10.0.tar.gz 45.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for notefeed 0.10.0
File Interpreter ABI Platform
notefeed-0.10.0-py3-none-any.whl Python 3 none any Details

Total release size: 103.9 kB

Release files / notefeed-0.10.0.tar.gz

Download URL notefeed-0.10.0.tar.gz
Size 45.5 kB
Tags Source
SHA-256 checksum
How to use checksums
22b832d9ace47d544f9b6da49517dbb339569f75a205fa138fe4bc0ee2d621e8
BLAKE2b-256 checksum
How to use checksums
035a336d36196a52a55f5073e864f1a91d8950491fcc165b32e82571659543d8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.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 Oct 10, 2026.

Transparency log

Release files / notefeed-0.10.0-py3-none-any.whl

Download URL notefeed-0.10.0-py3-none-any.whl
Size 58.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
69a89adf7707c78d8052d2e8d68b4c67b5da2473dbeed9e5e3e75f25d38b2123
BLAKE2b-256 checksum
How to use checksums
b0809cdca0ee641a1a560202312602ec1a479fd5cebad3777250c36329235d42
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.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 Oct 10, 2026.

Transparency log

Release history Release notifications | RSS feed

0.17.0

2 release files

0.16.0

2 release files

0.15.0

2 release files

0.14.0

2 release files

0.13.0

2 release files

0.12.1

2 release files

0.12.0

2 release files

0.11.0

2 release files

0.10.3

2 release files

0.10.1

2 release files

This release

0.10.0 This release

2 release files

0.9.3

2 release files

0.9.2

2 release files

0.9.1

2 release files

0.9.0

2 release files

0.8.0

2 release files

0.7.0

2 release files

0.6.0

2 release files

0.5.0

2 release files

0.3.0

2 release files

0.2.0

2 release files

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