Repository navigation
Releases
v0.7.0: Set it up with your AI agent
You can now give this repo's link to an AI agent and it sets everything up. You only log in, click Allow, and paste three values from Meta into a private page on your own computer.
Warning
Upgrading from 0.6.0
Nothing to do for a running copy. npm run update brings in the new setup tooling. Your secrets and data don't change.
Added
SETUP-WITH-AI.md, a playbook any agent (Claude Code, Codex, Cursor, Gemini CLI) follows, from the repo link to a first DM. It explains each step to a non-technical person and says exactly where to stop for them.npm run setup:agent, the agent-run version of setup:- It runs
wrangler loginitself if needed. - It never prints a secret, and never reads one from the terminal.
- It prints
ACTION REQUIRED,WAITINGand a finalSETUP_RESULTJSON line for the agent, listing what's left to do.
- It runs
- A private setup page, served on
127.0.0.1at a random path and opened in your browser.- You paste your Meta values there, and they go straight to
wrangler secret put. - It shows progress, then your dashboard link with Copy and Open buttons.
- You paste your Meta values there, and they go straight to
- Setup now subscribes a Unified login app to Instagram comment webhooks through Meta's API, so there's no webhook screen to fill in and no verify token to paste. It also fills in the app's privacy policy and terms URLs where Meta allows it.
Full notes: https://hemang-doshi.github.io/ig-comment-dm/docs/changelog/#v0-7-0
v0.6.0: Unified login and the dashboard
Meta apps created since late October 2026 can only use Unified login, and this release supports it. It also adds a dashboard app that says exactly why any comment didn't get its DM, and a queue that keeps working through Meta's hourly app limit instead of giving up.
Warning
Upgrading from 0.5.0
- Run
npm run update, ornpm run deployafter pulling. Migration 012 adds the comment text and post to each send, so Activity can show what people wrote. - Deploys now build the dashboard first (
npm run build:web), becausewrangler.tomlserves it fromweb/dist. A plainnpx wrangler deployon a fresh clone fails until you've built it once. - Logging in now lands on the dashboard. Set
DASHBOARDto anything butoninwrangler.tomlto keep the classic pages. - Copies on Instagram Login need nothing else. To move a new Meta app to Unified login, see Unified login.
Added
- Unified login: Facebook Login for Business with a configuration id, switched on by the
META_LOGIN_CONFIG_IDsecret. It gives system-user tokens that don't expire, usesgraph.facebook.com, and finds the connected account from/me/assigned_instagram_accounts.npm run setupasks which login your app uses. - The dashboard at
/a/<secret>/app: Overview, Activity, Automations and Settings. It has a live phone preview in the editor, a ⌘K palette, keyboard shortcuts, light and dark themes, and a phone layout. Its JSON API at/a/<secret>/apineeds a session and a CSRF token for every change. - Exact reasons for every DM that didn't go, taken from Meta's real answer: already answered by another tool, user can't be found, comment deleted, rate-limited and more. Each comes with what to do and the error code.
- Automatic re-checks for unconfirmed DMs, up to 3, ten minutes apart. A re-check can't double-send, because Instagram refuses a second private reply, so a refusal of that kind confirms the first one arrived.
- Meta's
X-App-UsageandX-Business-Use-Case-Usageheaders are logged on every Graph call.
Changed
- Meta's app-wide rate limit (error code 4) no longer uses up a comment's tries. The comment waits for the 15-minute pause, then goes out. Before, a busy hour could make the bot give up on a commenter for good.
- The queue sends the newest comments first, so someone who just commented doesn't wait behind a backlog. Comments within a day of Instagram's 7-day limit still go first of all.
- "Already has a reply" refusals are shown as Answered earlier, not as failures, and are left out of problem counts.
Full notes: https://hemang-doshi.github.io/ig-comment-dm/docs/changelog/#v0-6-0