notefeed

Oct 6

  1. notefeed 0.9.0

    Released 2026-10-06 · on GitHub

    v0.9.0: a note and its pictures in one request, storage in a database, images in an object store

    A note with its pictures is one request

    • Multipart posts: POST /api/v1/feeds/{feed}/notes (and POST /{feed}) and PUT on a note also accept multipart/form-data: an optional text part, up to 10 file parts and alt.<filename> fields. The server checks everything before the first write and removes what it stored if a later write fails. A raw single-file request is unchanged.
    • Every caller uses it: MCP post_note, both clients (attachments), both CLIs (--attach) and the web compose box and editor.
    • Stricter text rules: names, titles, alt texts, tags and feed settings are one line with no control or text-direction override characters. A text sent with pictures is read in a worker with a time limit (NOTEFEED_PARSE_TIMEOUT_MS).
    • Changed answers: a malformed multipart body is 400; a title or alt text with a forbidden character is 400; the MCP request body limit is 16 MiB.

    Storage backends (new)

    • NOTEFEED_STORAGE chooses where feeds and notes are kept: fs (default, unchanged), sqlite or postgres. The database backends need NOTEFEED_SECRET; with PostgreSQL several containers can share the data. A new instance on a database starts empty: moving between backends is not built.
    • NOTEFEED_IMAGES chooses where a database backend keeps image bytes: db (default), fs (a folder) or s3 (any S3-compatible object store; there is no default endpoint). Going from db to fs or s3 needs no move.
    • Cleaning up the image store: with NOTEFEED_OPERATOR_TOKEN set, GET /api/operator/images/unreferenced reports the image files or objects that no note refers to, and DELETE removes them.
    • Reading costs less on the file backend: a feed's folder is listed once per request, and a stray folder or link in it no longer breaks the listing.

    Operations

    • Metrics: GET /metrics in the Prometheus format, off unless NOTEFEED_METRICS=1, with an optional NOTEFEED_METRICS_TOKEN. The docs include a Prometheus and Grafana setup.
    • Docs are restructured into sections with short pages.
    • Web UI fix: adding an image no longer takes the focus back from the title or tags field.

    Client packages 0.9.0 (PyPI and npm notefeed)

    • post() sends the text and its attachments in one request; content may be empty for pictures only. The clients no longer check file names themselves: the server decides.
    • Upgrade: a 0.9.0 client needs a 0.9.0 server (an older server answers 415 to multipart). post() with alt or name together with attachments is a ConfigError.

    The container image is moving. This is the last release published as ghcr.io/marceltov/notefeed. Later releases are published as ghcr.io/notefeed/notefeed; change the image line in your compose file when you next upgrade.