{"slug": "this-post-was-published-by-nevo-david-s-postiz", "title": "This Post Was Published by Nevo David's Postiz", "summary": "A developer named Maneshwar built git-lrc, a Micro AI code reviewer that runs on every commit, and shared their experience self-hosting Postiz, an open-source alternative to Buffer. They deployed Postiz using Docker, which required pulling multiple containers including Elasticsearch, Temporal, and Postgres, and noted the complexity of setting up API credentials for each social media platform.", "body_md": "*Hello, I'm Maneshwar. I'm building git-lrc, a Micro AI code reviewer that runs on every commit. It is free and source-available on Github. Star git-lrc to help devs discover the project. Do give it a try and share your feedback.*\n\nRemember when posting to social media meant actually going to the website and clicking \"post\"? Wild concept.\n\nI don't do that anymore, because that's clearly a lifestyle for people with free time.\n\nHere's my week, most weeks. I write something. I paste it into X. I reformat it and paste it into LinkedIn. I reformat it again and paste it into dev.to.\n\nI forget to post one of them for three days and pretend that was intentional.\n\nBuffer exists to fix exactly this problem, and Buffer also exists to charge you a subscription for the privilege of not context-switching.\n\nSo I went looking for the self-hosted version, and found [@nevodavid](https://dev.to/nevodavid)'s [Postiz](https://github.com/gitroomhq/postiz-app).\n\nThis is the story of standing it up with Docker, getting mildly betrayed by Postgres, wiring up three platforms, and accidentally learning more about durable workflow engines than I signed up for.\n\nThere's some actual depth here, so get comfortable.\n\nPostiz is an open source, AGPL-3.0 licensed alternative to Buffer, Hypefury, and Twitter Hunter.\n\nYou connect your accounts, and it becomes one calendar for scheduling posts across lot of platforms: X, LinkedIn, dev.to, YouTube, TikTok, Instagram, Facebook, Threads, Bluesky, Mastodon, Discord, Slack, Reddit, Pinterest, and Dribbble and more\n\nA few things stood out while reading the [docs](https://docs.postiz.com/introduction):\n\n`docker-compose.yaml`\n\n, and the plan is simple in theory: clone it, run `docker compose up`\n\n, done.\nIn practice, here is a lightly condensed transcript of my evening:\n\n``` bash\n$ docker compose up\n✔ Image postgres:16 Pulled 573.9s\n✔ Image redis:7.2 Pulled 353.7s\n✔ Image temporalio/ui:2.34.0 Pulled 329.3s\n✔ Image temporalio/admin-tools:1.28.1-tctl-1.18.4-cli-1.4.1 Pulled 792.1s\n✔ Image temporalio/auto-setup:1.28.1 Pulled 894.6s\n✔ Image elasticsearch:7.17.27 Pulled 875.1s\n✔ Image ghcr.io/gitroomhq/postiz-app:latest Pulled 1206.3s\n✔ Network temporal-network Created 1.3s\n✔ Network postiz-docker-compose_postiz-network Created 0.1s\n✔ Volume postiz-docker-compose_temporal-postgres-data Created 0.1s\n✔ Volume postiz-docker-compose_postiz-config Created 0.0s\n✔ Volume postiz-docker-compose_postiz-uploads Created 0.0s\n✔ Volume postiz-docker-compose_postiz-redis-data Created 0.1s\n✔ Volume postiz-docker-compose_temporal-elasticsearch-data Created 0.0s\n✔ Container temporal-elasticsearch Created 25.7s\n✔ Container postiz-redis Created 25.7s\n✔ Container temporal-postgresql Created 25.7s\n✔ Container temporal Created 0.8s\n✔ Container temporal-ui Created 0.7s\n✔ Container postiz Created 0.7s\n✔ Container temporal-admin-tools Created\n```\n\nYes, that's Elasticsearch and Temporal and Postgres and the whole app image, all pulling at once, over 10 minutes. Nobody tell me this is a well documented Docker pattern. I know. I did it anyway.\n\nOnce it's up, it's worth knowing what you actually deployed, because it's more than \"one container that posts tweets.\"\n\nPostiz leans on [Temporal](https://temporal.io/) for durable workflow orchestration, which is a genuinely interesting choice for a scheduler (more on why in a second).\n\nNotice there are two separate Postgres databases in play: one that Temporal owns for itself, and one that Postiz uses for your actual data (users, posts, integrations).\n\nThey don't share a database, which is a small detail that saved me some confusion later when I went looking for my own tables in the wrong instance.\n\nTo actually post anywhere, Postiz needs API credentials per platform.\n\nGetting these ranges from \"mildly annoying\" to \"a small quest.\"\n\nFor X, you go to the developer console, create a project and an app, accept the terms, then dig through the app's Keys and Tokens tab to generate an API Key and Secret (sometimes labeled Consumer Keys, because naming things is hard).\n\nFor LinkedIn, you create an app at their developer portal, go to the Products tab and request \"Share on LinkedIn,\" then flip to the Auth tab to grab your Client ID and Secret.\n\nThe gotcha: you also have to manually add an authorized redirect URL, matching your Postiz install, like `http://localhost:5000/integrations/social/linkedin`\n\n. Miss that step and the OAuth flow just quietly fails on you.\n\nBoth sets of credentials go into the `postiz`\n\nservice's environment block in `docker-compose.yaml`\n\n, right alongside placeholders for Reddit, GitHub, TikTok, Pinterest, Discord, Slack, Mastodon, and a dozen others. Fun detail while I was in there: the compose file already has `FEE_AMOUNT`\n\nand `STRIPE_*`\n\nvariables sitting in it, unused until you touch them.\n\nThe default compose file ships its own Postgres container for Postiz, which is fine, except I already run Postgres on the host for other projects and did not want a second copy quietly eating disk and RAM for no reason.\n\nSo I pointed Postiz at my existing instance instead:\n\n```\nCREATE USER \"postiz-user\" WITH PASSWORD 'postiz-password';\nCREATE DATABASE \"postiz-db-local\" OWNER \"postiz-user\";\nGRANT ALL PRIVILEGES ON DATABASE \"postiz-db-local\" TO \"postiz-user\";\n```\n\nThen a few host-level changes: set `listen_addresses = '*'`\n\nin `postgresql.conf`\n\n(it defaults to `localhost`\n\nonly, which a container can't reach), add a rule to `pg_hba.conf`\n\nso Docker's network range is allowed in:\n\n```\nhost postiz-db-local postiz-user 172.16.0.0/12 scram-sha-256\n```\n\nrestart Postgres, then update the compose file: drop the bundled `postiz-postgres`\n\nservice and its volume entirely, remove it from `depends_on`\n\n, and point `DATABASE_URL`\n\nat `postgresql://postiz-user:postiz-password@host.docker.internal:5432/postiz-db-local`\n\n.\n\nOn Linux, `host.docker.internal`\n\ndoesn't resolve by default the way it does on Docker Desktop, so you also need `extra_hosts: [\"host.docker.internal:host-gateway\"]`\n\non the `postiz`\n\nservice, or the container just can't find your host at all.\n\nMore work than clicking \"use the default,\" sure.\n\nBut now backups, extensions, and monitoring are all in one place instead of scattered across five Postgres containers I'll forget about in a month.\n\nThis is the part I found genuinely cool enough to diagram twice.\n\nScheduling a post sounds like it should be a cron job checking \"is it time yet?\" every minute.\n\nTemporal does it differently: it starts a durable workflow that just sleeps until the exact moment, survives restarts of the app itself, and wakes up precisely on time instead of polling.\n\nYou can actually watch this happen instead of trusting it blindly.\n\nThe compose file exposes a Temporal UI on port 8080, where every scheduled post shows up as a workflow you can inspect, complete with its history and current state.\n\nIt is oddly satisfying to watch a \"post to dev.to\" workflow just sit there patiently for two days before firing exactly on schedule.\n\nThis part is refreshingly simple. Head to [dev.to's extensions settings](https://dev.to/settings/extensions) and generate a DEV Community API Key, then paste it into Postiz when adding a new provider.\n\nFrom there, creating a post is what you'd expect from any scheduler: click the time slot you want on the calendar, pick dev.to from the side panel, expand the settings accordion to fill in the title and cover image, and hit add to calendar.\n\nThat's it. No copy-pasting into four tabs. No forgetting the one platform I always forget.\n\nIf you're setting this up yourself, save some time with what I tripped over:\n\n`host.docker.internal`\n\nneeds `extra_hosts`\n\non Linux, it is not automatic like on Docker Desktop.`depends_on: condition: service_healthy`\n\nactually matter, Temporal and Redis need to report healthy before Postiz starts, or you'll chase phantom connection errors.`JWT_SECRET`\n\ninvites you to \"just type random characters here,\" please actually do that with something long and random, not literally the word \"secret.\"AI agents write code fast. They also silently remove logic, change behavior, and introduce bugs — without telling you. You often find out in production.\n\ngit-lrc fixes this. It hooks into git commit and reviews every diff before it lands. 60-second setup. Completely free.\n\nAny feedback or contributors are welcome! It's online, source-available, and ready for anyone to use.\n\n⭐ Star it on GitHub:\n\n| [🇩🇰 Dansk](https://github.com/HexmosTech/git-lrc/readme/README.da.md) | [🇪🇸 Español](https://github.com/HexmosTech/git-lrc/readme/README.es.md) | [🇮🇷 Farsi](https://github.com/HexmosTech/git-lrc/readme/README.fa.md) | [🇫🇮 Suomi](https://github.com/HexmosTech/git-lrc/readme/README.fi.md) | [🇯🇵 日本語](https://github.com/HexmosTech/git-lrc/readme/README.ja.md) | [🇳🇴 Norsk](https://github.com/HexmosTech/git-lrc/readme/README.nn.md) | [🇵🇹 Português](https://github.com/HexmosTech/git-lrc/readme/README.pt.md) | [🇷🇺 Русский](https://github.com/HexmosTech/git-lrc/readme/README.ru.md) | [🇦🇱 Shqip](https://github.com/HexmosTech/git-lrc/readme/README.sq.md) | [🇨🇳 中文](https://github.com/HexmosTech/git-lrc/readme/README.zh.md) | [🇮🇳 हिन्दी](https://github.com/HexmosTech/git-lrc/readme/README.hi.md) |\n\nGenAI today is a **race car without brakes**. It accelerates fast -- you describe something, and large blocks of code appear instantly. But AI agents *silently break things*: they remove logic, relax constraints, introduce expensive cloud calls, leak credentials, and change behavior -- without telling you. You often find out in production.\n\n** git-lrc is your braking system.** It hooks into\n\n`git commit`\n\nand runs an AI review on every diff In short, git-lrc helps **Prevent Outages, Breaches, and Technical Debt Before They Happen**\n\n**At a glance:** [10 risk categories](https://github.com/HexmosTech/git-lrc#what-git-lrc-checks-for) · [100+ failure patterns tracked](https://github.com/HexmosTech/git-lrc#what-git-lrc-checks-for) · every commit…", "url": "https://wpnews.pro/news/this-post-was-published-by-nevo-david-s-postiz", "canonical_source": "https://dev.to/lovestaco/this-post-was-published-by-nevo-davids-postiz-1c20", "published_at": "2026-07-07 17:25:57+00:00", "updated_at": "2026-07-07 17:28:21.215023+00:00", "lang": "en", "topics": ["developer-tools", "ai-tools"], "entities": ["Maneshwar", "git-lrc", "Postiz", "Buffer", "Docker", "Temporal", "Elasticsearch", "Postgres"], "alternates": {"html": "https://wpnews.pro/news/this-post-was-published-by-nevo-david-s-postiz", "markdown": "https://wpnews.pro/news/this-post-was-published-by-nevo-david-s-postiz.md", "text": "https://wpnews.pro/news/this-post-was-published-by-nevo-david-s-postiz.txt", "jsonld": "https://wpnews.pro/news/this-post-was-published-by-nevo-david-s-postiz.jsonld"}}