{
  "schema": "tesign-radar/item/1",
  "generated_at": "2026-09-17T01:56:13.055Z",
  "lang": "en",
  "slug": "openreply",
  "url": "https://tesign.com/en/item/openreply/",
  "alternates": {
    "ko": {
      "html": "https://tesign.com/item/openreply/",
      "json": "https://tesign.com/item/openreply/index.json",
      "markdown": "https://tesign.com/item/openreply/index.md"
    },
    "en": {
      "html": "https://tesign.com/en/item/openreply/",
      "json": "https://tesign.com/en/item/openreply/index.json",
      "markdown": "https://tesign.com/en/item/openreply/index.md"
    }
  },
  "name": "OpenReply",
  "use_label": "Instagram comment-to-DM automation",
  "one_liner": "Self-hosted ManyChat alternative: Instagram comment keyword → DM via Meta's official API.",
  "text": {
    "why": "Comment 'LINK' on a reel and get the link by DM: every tool offering this one feature wants a recurring subscription. OpenReply provides the workflow as MIT software that uses only the official Instagram API with Instagram Login — no scraping, no browser automation, no password. It rate-limits per account under Meta's documented cap of 750 private replies per hour and queues the overflow instead of dropping it, and adds tracked links, a follow gate, Story-reply triggers and a dashboard inbox.",
    "take": "It replaces one subscription, but you take on the server, the database and the Meta app review yourself.",
    "build": [
      "Run comment-to-DM for several client accounts under one workspace with roles, or feed the tracked-link click and CTR data into your own store's campaign analytics."
    ],
    "who": [
      {
        "role": "Small businesses selling on Instagram",
        "situation": "send the link by DM when a comment matches a keyword"
      },
      {
        "role": "Creators",
        "situation": "deliver links from Story replies, gate them behind a follow"
      },
      {
        "role": "Small agencies",
        "situation": "run client accounts in separate workspaces with send logs"
      }
    ],
    "start": [
      {
        "command": false,
        "text": "git clone https://github.com/diwenne/openreply.git"
      },
      {
        "command": false,
        "text": "cd openreply && npm install && cp .env.example .env   # then fill in the values, see docs/setup.md"
      },
      {
        "command": false,
        "text": "docker-compose up -d      # starts Postgres and Redis"
      },
      {
        "command": false,
        "text": "npm run db:generate && npm run db:migrate"
      },
      {
        "command": false,
        "text": "npm run dev   # web app on http://localhost:3000 · in a second terminal: npm run worker (this sends the DMs)"
      }
    ],
    "caveat": [
      "MIT licence. Only Instagram Business or Creator accounts can be connected; personal accounts are not supported. Self-hosted only: needs PostgreSQL, Redis, a public HTTPS URL, email delivery for magic-link sign-in (Resend) and an always-on worker process. openreply.diwen.dev is a dashboard demo; signing up there never sends a DM. Instagram connection is either your own Meta app (with review) or the paid sponsor Zernio; hosting costs are separate. Meta's policies, 24-hour messaging window and rate limits still apply."
    ]
  },
  "cta": {
    "type": "self_host",
    "label": "SELF-HOST",
    "url": "https://openreply.diwen.dev/"
  },
  "ready": "self-host",
  "categories": [
    "commerce",
    "social"
  ],
  "categories_confirmed": true,
  "tags": [
    "instagram",
    "comment-to-dm",
    "marketing-automation",
    "self-hosted",
    "nextjs",
    "meta-api"
  ],
  "platform": [
    "web"
  ],
  "license": {
    "spdx": "MIT",
    "scope": "permissive",
    "scope_text": "Use, change and redistribute, commercially too. Keep the notice.",
    "url": "https://spdx.org/licenses/MIT.html",
    "note": null,
    "open_source": true
  },
  "language": "TypeScript",
  "source_urls": {
    "canonical": "https://openreply.diwen.dev/",
    "github": "https://github.com/diwenne/openreply",
    "huggingface": null,
    "app_store": null,
    "sightings": [
      {
        "source": "github",
        "url": "https://github.com/diwenne/openreply",
        "posted_at": "2026-09-05T08:00:00.000Z",
        "hn_url": null
      }
    ]
  },
  "numbers": {
    "as_of": "2026-09-16T21:00:00.000Z",
    "stars": 2292,
    "stars_unit": "GitHub stars",
    "stars_checked_at": "2026-09-15T19:35:16.762Z",
    "stars_observed_since_check": 0,
    "star_delta_24h": null,
    "star_delta_7d": 4,
    "star_delta_30d": 16,
    "star_delta_unit": "GitHub stars gained in the window, GH Archive events summed to as_of",
    "spark_14d": [
      null,
      2,
      8,
      2,
      null,
      null,
      null,
      null,
      2,
      2,
      null,
      null,
      null,
      null
    ],
    "hf_likes": null,
    "hf_likes_observed_at": null,
    "hn_points": null,
    "hn_points_observed_at": null,
    "store": null,
    "method": "Star total = the value last checked on GitHub (stars_checked_at) + increases observed via GH Archive since. The 24h · 7d · 30d gains are GH Archive hourly events summed to the reference time (as_of). No score of ours."
  },
  "ranks": {
    "as_of": "2026-09-16T21:00:00.000Z",
    "all_time": null,
    "rising": {
      "24h": null,
      "7d": null,
      "30d": null
    },
    "categories": [
      {
        "category": "commerce",
        "label": "COMMERCE",
        "rank": 6
      },
      {
        "category": "social",
        "label": "SOCIAL",
        "rank": 19
      }
    ]
  },
  "activity": {
    "pushed_at": "2026-09-14T19:42:33.000Z",
    "owner_type": "User",
    "open_issues": 6,
    "contributors": 22,
    "releases_count": 0,
    "latest_release": null,
    "checked_at": "2026-09-15T19:35:16.762Z",
    "core_checked_at": "2026-09-15T19:35:16.762Z"
  },
  "signals": [
    {
      "kind": "back",
      "label": "BACK CATALOG",
      "value": null
    }
  ],
  "images": {
    "og": "https://tesign.com/img/openreply-fe6ded9980.png",
    "cover": "https://tesign.com/img/openreply-fe6ded9980.png",
    "cover_width": 2400,
    "cover_height": 1260,
    "gallery": [
      "https://tesign.com/img/openreply-fe6ded9980.png"
    ],
    "alt": "The OpenReply dashboard showing campaigns and send status [layout to be confirmed]",
    "tier": 1
  },
  "dates": {
    "first_seen_at": "2026-09-13T09:42:43.668Z",
    "source_created_at": "2026-07-17T02:01:45.000Z",
    "discovery_hours": 1399.6829633333334,
    "launch_signal_at": "2026-09-05T08:00:00.000Z",
    "kept_at": "2026-09-14T19:27:43.576Z",
    "first_published_at": "2026-09-14T19:27:43.743Z",
    "updated_at": "2026-09-15T04:36:56.944Z",
    "ingestion_mode": "backfill"
  },
  "notes": [
    "This file was produced by the same build, from the same data, as the tesign.com item page. The text is editorial; the numbers are stored observations.",
    "null in the JSON means not observed — never zero. The Markdown writes [unconfirmed] for it.",
    "Star total = the value last checked on GitHub (stars_checked_at) + increases observed via GH Archive since. The 24h · 7d · 30d gains are GH Archive hourly events summed to the reference time (as_of). No score of ours.",
    "Reconstructed from archive data, not a live discovery.",
    "A summary, not legal advice."
  ]
}
