openreply README

The project's README from github.com/diwenne/openreply. As one markdown file: README.md.

OpenReply

Open-sourced ManyChat for Instagram comment-to-DM automation.

License: MIT Stars Built with Next.js

Someone comments LINK on your reel, and OpenReply queues a DM with your link. That is the whole idea. OpenReply watches the comments on your Instagram posts, and when a comment matches a keyword you set, it sends that person a private reply through the official Meta API. You can also post a public reply under the comment at the same time.

OpenReply is free, MIT-licensed software running on your own infrastructure, with no software seat limits or plan caps. Hosting and optional provider costs are separate.

Supported by Zernio. An optional paid Instagram connection provider that lets you avoid creating and reviewing your own Meta app. OpenReply still runs your campaigns, queues, logs, and inbox on your infrastructure. Connect with Zernio, or keep using your own Meta app.

OpenReply is self-hosted. You have to deploy your own copy.

openreply.diwen.dev is a demo of the dashboard, not a service you can sign up for. Creating an account there will never send a DM for you, and there is no hosted plan to upgrade to.

A working instance needs your deployed fork, a public HTTPS URL, PostgreSQL, Redis, a running worker, and an Instagram connection. Choose optional paid Zernio or your own Meta app. docs/setup.md walks through all of it.

If this saves you a subscription or a weekend of building, a star on the repo genuinely helps other people find it.

Why this exists

Comment-to-DM is one feature, but every tool that offers it wants a recurring subscription for it. OpenReply makes that workflow available as software you can inspect, modify, and host yourself.

OpenReply is built around Meta's official Instagram private replies. It does not scrape, it does not automate a browser, and it never asks for an Instagram password. Instagram’s policies, permissions, messaging windows, and rate limits still apply.

Features

How it works

  1. Someone comments on your Instagram post or reel, or DMs you, or replies to your Story.
  2. Your connection provider (direct Meta or Zernio) delivers the event to your OpenReply instance.
  3. OpenReply checks the text against your active campaigns.
  4. On a keyword match, it queues a job.
  5. A background worker sends the private reply, and the public reply if you enabled one.

The web app receives the webhook and serves the dashboard. A separate worker process does the sending, because the send has to survive rate limits and retries. Both talk to the same Postgres and Redis.

Quick start

  1. Choose your Instagram connection. Zernio is recommended if you want to avoid setting up your own Meta app. It is a paid service and sponsor, not a hosted OpenReply plan. Or follow the existing direct Meta setup.
  2. Deploy the app and worker. Both paths need PostgreSQL, Redis, a public HTTPS URL, and email delivery for magic-link sign-in.
  3. Connect an Instagram Business or Creator account in Settings, create a campaign, and test a keyword comment from another account.

Read docs/setup.md for the complete walkthrough, including a provider-aware AI assistant prompt. Existing accounts are never automatically migrated. Check Zernio’s feature limits before choosing.

Moving from ManyChat or another DM tool? Disconnect it from the Instagram account and give OpenReply control of conversations in Meta Business Suite, or button taps in DMs will fail with "not the thread owner". See Migrating from ManyChat.

Deploy the web app

The button creates your web deployment. You still need to configure the database, Redis, email delivery, and a separate always-on worker.

Deploy with Vercel

Run it locally

git clone https://github.com/diwenne/openreply.git
cd openreply
npm install
cp .env.example .env      # then fill in the values, see docs/setup.md
docker-compose up -d      # starts Postgres and Redis
npm run db:generate
npm run db:migrate
npm run dev               # web app on http://localhost:3000
npm run worker            # in a second terminal, this sends the DMs

Two processes, always. npm run dev serves the app and receives webhooks. npm run worker is what actually sends the messages. If comments come in and no DM ever arrives, the worker is the first thing to check.

Full environment variables and the production layout are in docs/setup.md.

Set it up with your AI assistant

If you use Claude Code, Cursor, or a similar tool, an assistant can walk you through either connection path. There is a ready-made prompt in the Set it up with an AI assistant section of the setup guide. Paste it into your assistant inside a clone of this repo, choose your provider before configuring any Meta secrets, and it will walk you through connecting Instagram and going live.

Tech stack

For the complete stack — application libraries, the two runtime processes, and the free services this runs on (Vercel, Neon, Redis Cloud, an Oracle Cloud always-free VM for the worker, Resend, Meta) — see docs/stack.md.

Contributing

Issues and pull requests are welcome. If you hit a Meta quirk that is not in the setup guide, a PR that documents it is worth as much as a code fix, because that is where everyone loses time.

See CONTRIBUTING.md to get started.

Credits

Built and maintained by Diwen Huang.

OpenReply was initially forked from instagram-comment-to-dm by Anish Raj, also MIT licensed, and has been substantially built upon since.

Star History

Star History Chart

Star the repo

If OpenReply is useful to you, star it. It is the simplest way to help the project reach the next person looking for a free way to do this.

License

MIT. See LICENSE.

openreply (diwenne/openreply)

Searching Database…

Someone comments LINK on your reel, and OpenReply queues a DM with your link. That is the whole idea. OpenReply watches the comments on your Instagram posts, and when a comment matches a keyword you set, it sends that person a private reply through the official Meta API.

Creator
diwenne
Size
1 MB
Stars
3K
Updated
CommitOct 29
Age
3mo
Commits · 90 Days