Edgible cards

Cards / miniflux

miniflux

Miniflux, the minimalist feed reader, behind your org login

App cardpassed 2026-10-12, Edgible 1.4.6Source on GitHub

The apps, ports, auth modes, and places in the miniflux card

Apps

AppWhatWho can reach itPlace
minifluxMiniflux feed readerorg loginminiflux

Machine

A place is one serving device. Minimum recommended for each:

PlaceMemoryDiskArchitectureGPU
miniflux384 MB1.5 GBamd64, arm64none

Needs it answers

Why

Following sites and blogs usually means a hosted reader that tracks what you read, or an inbox full of newsletters. Miniflux is a minimalist feed reader that fetches RSS, Atom and JSON feeds itself and keeps your subscriptions and read state in a database on a machine you own.

What

One app, miniflux, on port 8080 in the place miniflux, behind org, so only members of your Edgible organization reach it, and Miniflux's own login is behind that. Postgres runs beside it as miniflux-db.

org suits a browser. Miniflux's API, and the Fever and Google Reader APIs that mobile and desktop reader apps use, cannot get past an Edgible sign-in. To use such an app, publish the hostname with none instead, and Miniflux's own login is then the only protection.

To use it in a card, copy the miniflux and miniflux-db services, the volume, and the MINIFLUX_ lines and ORG_LABEL in card.env.

Feeds, entries, read state and accounts live in the volume miniflux-db-data. Minimum recommended for the place miniflux: 384 MB of memory and 1.5 GB of disk, on an arm64 or amd64 machine, with no GPU.

The Compose file is docker-compose.yml, the settings card.env, the card card.yml, and the last test test.yml.

How

Five steps. Edit card.env before you start.

1. Fetch

mkdir -p miniflux
curl -fsSL https://github.com/Edgible/cards/archive/refs/heads/main.tar.gz \
  | tar -xz --strip-components=2 -C miniflux cards-main/miniflux

2. Edit card.env

Set DEVICE to a name edgible device list prints, and ORG_LABEL to the part after the app name in a hostname edgible app list prints, so Miniflux builds its links for the hostname Publish makes. Set MINIFLUX_URL only for your own domain. The two passwords are generated in the next step.

nano miniflux/card.env

3. Check

curl -fsSLo check-env.py https://raw.githubusercontent.com/Edgible/card-kit/main/check-env.py
python3 check-env.py miniflux

It fills each empty secret and moves a taken port, as lines to paste. Run it again until it says no conflicts.

4. Start

docker compose --env-file miniflux/card.env -f miniflux/docker-compose.yml up -d --wait
docker compose --env-file miniflux/card.env -f miniflux/docker-compose.yml ps

--wait returns when each service is running, and healthy when it has a healthcheck. Miniflux runs its database migrations and makes the admin admin with MINIFLUX_ADMIN_PASSWORD on its first start, so there is no setup page to publish.

5. Publish

set -euo pipefail
set -a
. miniflux/card.env
set +a
device_id=$(edgible device list --json | jq -er --arg name "$DEVICE" '
  map(select(.name == $name))
  | if length == 1 then .[0].id
    else error("need exactly one device named " + $name + " (" + (map(.status + " " + .id) | join(", ")) + ")")
    end
')
edgible app create existing \
  --non-interactive \
  --name miniflux \
  --port "$MINIFLUX_PORT" \
  --protocol https \
  --auth-modes org \
  --device-id "$device_id"
edgible app list

Verify

miniflux uses org.

curl -sS -o /dev/null -w '%{http_code} %{redirect_url}\n' "https://<miniflux hostname>"

That prints 302 and an edgible.com/application-access/ address, so the org sign-in is in front. That prints 302 and an edgible.com/application-access/ address, so the org sign-in is in front. Open the hostname in a browser, sign in, then sign in to Miniflux as admin with MINIFLUX_ADMIN_PASSWORD from card.env.

The rest of the setup is in the Miniflux docs.

Tear down

Four steps, in this order. Step 1 runs wherever edgible is logged in. Steps 2 to 4 run on the machine that runs the containers. Steps 2 and 3 read card.env, so keep it until step 4.

1. Unpublish

edgible app delete miniflux --yes

2. Stop

docker compose --env-file miniflux/card.env -f miniflux/docker-compose.yml down

3. Delete the data

Skip this step to keep the data. The loop copies each volume to a .tgz file in this directory first.

for volume in $(docker volume ls -q --filter label=com.docker.compose.project=miniflux); do
  docker run --rm -v "$volume:/data:ro" -v "$PWD:/backup" alpine tar -czf "/backup/$volume.tgz" -C /data .
done
docker compose --env-file miniflux/card.env -f miniflux/docker-compose.yml down --volumes

4. Remove the card

rm -rf miniflux