Operational record for the FCAIC social scheduling tool. Installed 11 Aug 2026 by Esra. Status: running locally, account created, no channels linked yet. Parked 11 Aug 2026, resumes 12 Aug 17:00 CEST.

What this is and where it came from

Postiz (gitroomhq/postiz-app, docs) is an open-source social media scheduler covering 30+ platforms. It was already referenced in the AI Circle Planning Hub spreadsheet on the Social Media Schedule tab, as two links with no setup behind them. This page records the actual install.

The motivation: FCAIC promo currently means Stef manually posting the same content to Flutter Community X, Bluesky, Mastodon, LinkedIn, plus Flutteristas Discord/Slack/Email, then reposting from a personal account. The spreadsheet already models one column per network with per-network character budgets, which maps cleanly onto what Postiz does.

Current state

Item State
Hosting Self-hosted, Docker Compose, on Esra's Mac at ~/postiz
Stack 8 containers, running and healthy. DISABLE_REGISTRATION=true since 11 Aug
UI http://localhost:4007
Postiz account Created 11 Aug 2026. Org esratech, login [email protected]. Verified in Postgres: 1 user, 0 integrations
Bluesky @esratech.bsky.social Not linked
Mastodon @[email protected] Not linked (MASTODON_URL configured, client id/secret blank)
X @esratech Not linked
LinkedIn Not linked
Flutter Community / FCAIC shared accounts Blocked, see Open questions

Install layout

Path Purpose
~/postiz/docker-compose.yaml Upstream, git-tracked, deliberately untouched so git pull keeps working
~/postiz/docker-compose.override.yaml Local config, reads from .env by variable substitution
~/postiz/.env Secrets, gitignored, chmod 600
~/postiz/SETUP.md First-time setup and per-platform linking steps
~/postiz/README-esra.md Day-to-day operation and troubleshooting

The override-file approach is deliberate: the Postiz docs warn against snapshotting their compose file because services and env vars change between versions. Config lives in the override, upstream stays pullable.

Three gotchas worth preserving

1. OAuth callbacks are on port 4007

Every Postiz provider doc gives the callback as localhost:4200 (dev) or localhost:5000 (docker). Both are wrong for this install. Compose maps host 4007 to container 5000, and MAIN_URL is http://localhost:4007, so all callbacks must be:

<http://localhost:4007/integrations/social/><provider>

Providers: x, mastodon, linkedin, linkedin-page. Bluesky needs no callback.

2. docker compose up -d after editing .env, never restart

restart reuses the existing container with its old environment, so a newly added API key silently does not exist inside the container. Verify with docker exec postiz sh -c 'echo $VARNAME'.

3. error from registry: denied means a stale credential, not a missing image

The Postiz image pull failed this way during setup. Cause was a stale ghcr.io entry in the Docker Desktop keychain: Docker kept presenting it rather than falling back to anonymous, even though the image is public (manifest confirmed returning HTTP 200 anonymously). Resolved with docker logout ghcr.io. If private GHCR images are ever needed, re-login with a fresh PAT.

Separately: host port 5000 is held by macOS Control Center (AirPlay Receiver). Harmless, since 5000 is only used inside the container. Do not "fix" the port mapping.

Per-platform linking effort