diff --git a/.github/banner.html b/.github/banner.html
new file mode 100644
index 0000000..15231e0
--- /dev/null
+++ b/.github/banner.html
@@ -0,0 +1,309 @@
+
+
+
+
-Nudgra Cloud is an open alternative to ManyChat for the basic Instagram automations most users actually need: keyword DMs, comment replies, story replies, simple follow-ups, contacts, conversations, and logs.
+

-This version uses Next.js for the dashboard and Convex Cloud for backend state, auth, scheduling, and Meta webhooks.
+
+
-If you want to run the database and backend yourself, use Nudgra OSS instead: `TODO: add Nudgra OSS repo URL`.
+[](./LICENSE)
+[](https://www.typescriptlang.org/)
+[](https://nextjs.org/)
+[](https://react.dev/)
+[](https://www.convex.dev/)
+[](./CONTRIBUTING.md)
-If you run into setup issues, send a DM to [@Maikoke5](https://x.com/Maikoke5).
+**The open-source alternative to ManyChat for Instagram — on a hosted Next.js + Convex stack.**
-You can also give this README to a coding agent such as Codex, Claude Code, Cursor, or another assistant and ask it to walk you through the setup step by step. That works especially well for Convex environment variables, Google OAuth, Meta dashboard setup, and deployment logs.
+Automate comment replies, story-reply funnels, and keyword DMs from a dashboard you own. Deploy your own in minutes, no SaaS fees.
-## Stack
+
-- Next.js 16
-- React 19
-- Convex
-- Convex Auth
-- Tailwind CSS 4
-- `shadcn` UI components
+[](https://pub-7d8033dde9294375a68da6fd9ac0be32.r2.dev/nudgra/nudgra-demo.mp4)
+
+[](https://docs.nudgra.com/)
+
+[](https://github.com/MaikoCode/nudgra-oss)
-## What You Need
+
+
+---
+
+## What is Nudgra Cloud?
+
+Nudgra is an open alternative to ManyChat for Instagram. It focuses on the automations most operators actually use: connect Instagram accounts, receive messages and comments through Meta webhooks, send replies and follow-up sequences, and manage everything from a clean dashboard.
+
+This repository is the **Cloud** build — it runs on [Next.js](https://nextjs.org/) for the dashboard and [Convex Cloud](https://www.convex.dev/) for backend state, auth, scheduling, and Meta webhooks. You deploy it to your own Vercel + Convex project, so there's no Postgres, no webhook server, and no background-job runner to operate yourself.
+
+> **Want to run the database and backend yourself?** Use **[Nudgra OSS](https://github.com/MaikoCode/nudgra-oss)** instead — a separate fully self-hosted TanStack Start + Postgres build of the same product.
+
+📖 Prefer a friendlier, step-by-step walkthrough? The hosted docs at **[docs.nudgra.com](https://docs.nudgra.com/)** mirror this guide in a more readable format.
+
+> 💡 You can also hand this README to a coding agent — Claude Code, Codex, Cursor, or similar — and ask it to walk you through setup. That works especially well for Convex environment variables, Google OAuth, Meta dashboard setup, and reading deployment logs.
+
+Questions or stuck? DM [@Maikoke5](https://x.com/Maikoke5).
+
+## ✨ Features
+
+| | |
+| --- | --- |
+| 💬 **Comment automations** | Auto-reply to comments on any post, specific posts/reels, or your next post when a comment matches your keywords — then send a DM with tracked link buttons. |
+| 📖 **Story-reply funnels** | Turn replies (or reactions) to any story, or one specific story, into the entry point of a follow-up sequence. |
+| ⚡ **Keyword DM rules** | Respond automatically when someone DMs a keyword. Set the rule once and Nudgra handles the rest. |
+| 🔁 **Follow-up sequences** | Multi-step, delayed DM sequences delivered reliably on Convex scheduled functions. |
+| 📥 **Unified inbox** | Read and reply to Instagram conversations from one dashboard. |
+| 👥 **Contacts & tags** | A lightweight contact record per person who engages, with automation-applied tags. |
+| 🔗 **Tracked links & CTR** | Per-button click tracking so you can see which automations convert. |
+| 🪪 **Multi-account** | Connect and switch between multiple Instagram professional accounts. |
+| 📊 **Logs & analytics** | Run counts, CTR, and delivery logs for every automation. |
+| 🛡️ **Safety guardrails** | Automations respect messaging-window and per-conversation limits, so you stay within Meta's rules. |
+
+## ⚙️ How it works
+
+1. **Connect** an Instagram professional account through Meta's Instagram Business Login — Nudgra runs the OAuth flow and stores account tokens in Convex itself.
+2. **Build** comment, story-reply, or keyword-DM automations in the dashboard.
+3. **React** — Meta webhooks hit your Convex HTTP endpoint, Nudgra matches triggers, and sends replies, DMs, and link buttons.
+4. **Follow up** — delayed sequences, token refreshes, and retries run on the Convex scheduler.
+5. **Measure** — watch runs, CTR, conversations, and logs from your dashboard.
+
+## 📌 Good to know
+
+- Nudgra automates **Instagram professional accounts** (business or creator) only.
+- **New-follower welcome automations are not possible.** Instagram exposes no public new-follower webhook trigger, so welcome-DM-on-follow cannot be set live. Use a comment, story-reply, or keyword-DM automation instead.
+- Your Meta app must be **published** for webhooks to work, and each Instagram account must accept its tester invite (see [Meta / Instagram setup](#-meta--instagram-setup)).
+- Meta webhooks point to the **Convex site URL**, not the Next.js app URL. In this repo the webhook route is defined in `convex/http.ts` at `/meta/webhooks`.
+
+## 🧱 Tech stack
+
+| Layer | Choice |
+| --- | --- |
+| Framework | Next.js 16 (React 19) |
+| Backend & data | Convex |
+| Auth | Convex Auth (Google sign-in) |
+| Scheduling & jobs | Convex scheduled functions |
+| Webhooks | Convex HTTP Actions |
+| Styling | Tailwind CSS v4 + shadcn/ui |
+
+---
+
+## Table of contents
+
+- [What you need](#what-you-need)
+- [Important URLs](#important-urls)
+- [Environment variables](#environment-variables)
+- [💻 Local development](#-local-development)
+- [🚀 Production deployment (Vercel + Convex)](#-production-deployment-vercel--convex)
+- [Google OAuth setup](#google-oauth-setup)
+- [📷 Meta / Instagram setup](#-meta--instagram-setup)
+- [Updating a deployment](#updating-a-deployment)
+- [Backup & data](#backup--data)
+- [Troubleshooting](#troubleshooting)
+- [Useful commands](#useful-commands)
+- [Project docs](#-project-docs)
+- [Contributing, security & license](#contributing-security--license)
+
+The setup has a few moving parts because Google OAuth, Instagram OAuth, Meta webhooks, and Convex all need to agree with each other. Expect about **15 minutes** if you already have a Convex project and an app domain ready.
+
+## What you need
- A Google account for dashboard sign-in.
- A Convex account for the backend deployment.
- A Meta Developer account.
-- An Instagram professional account, business or creator, that you want to automate.
-- For production: Vercel and a public domain or subdomain for the Next.js app.
-- For local development: Node.js 24 or newer, Git, and optionally a public tunnel URL for Meta callback testing.
+- An Instagram professional account (business or creator) that you want to automate.
+- **For production:** Vercel and a public domain or subdomain for the Next.js app.
+- **For local development:** Node.js 24 or newer, Git, and optionally a public tunnel URL for Meta callback testing.
## Important URLs
@@ -42,9 +126,9 @@ Replace `https://your-convex-site.convex.site` with the Convex HTTP Actions URL
| Meta webhook callback URL | `https://your-convex-site.convex.site/meta/webhooks` |
| Convex dashboard | `npx convex dashboard` |
-Meta webhooks must point to the Convex site URL, not the Next.js app URL. In this repo, the webhook route is defined in `convex/http.ts` at `/meta/webhooks`.
+> ⚠️ Two URLs commonly trip people up: the **Google OAuth redirect** and the **Meta webhook callback** must both point to the **Convex site URL** (`.convex.site`), not the Next.js app URL. The Meta OAuth redirect is the one exception — it points to the app domain.
-## Environment Variables
+## Environment variables
Copy `.env.example` to `.env.local` for local work:
@@ -76,9 +160,9 @@ META_APP_SECRET=
META_VERIFY_TOKEN=
```
-Production values should be split between your Next.js host and Convex.
+Production values are **split** between your Next.js host (Vercel) and Convex.
-Set these on Vercel:
+Set these on **Vercel**:
| Variable | Purpose |
| --- | --- |
@@ -88,7 +172,7 @@ Set these on Vercel:
| `META_APP_SECRET` | Meta app secret used by the Next.js Meta routes |
| `META_VERIFY_TOKEN` | Verify-token presence check for the Meta connect flow |
-Set these on the Convex production deployment:
+Set these on the **Convex production deployment**:
| Variable | Purpose |
| --- | --- |
@@ -102,13 +186,6 @@ Set these on the Convex production deployment:
| `JWT_PRIVATE_KEY` | Convex Auth signing key |
| `JWKS` | Convex Auth JWKS document |
-Important:
-
-- `JWT_PRIVATE_KEY` and `JWKS` are required by Convex Auth. Generate them with `npx @convex-dev/auth --prod`; do not handcraft them unless you are following the Convex Auth manual setup docs.
-- `NEXT_PUBLIC_CONVEX_URL` and `NEXT_PUBLIC_CONVEX_SITE_URL` are written by `npx convex dev` locally and injected by `npx convex deploy --cmd "npm run build"` during production builds.
-- `NUDGRA_ALLOWED_EMAILS` is required. If your Google email is not in the allowlist, sign-in will be rejected.
-- Keep `SITE_URL` exact. If your app is deployed at `https://cloud.example.com`, do not use a different Vercel preview URL or localhost value in production.
-
Generate random tokens with OpenSSL:
```bash
@@ -123,11 +200,17 @@ node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
Use a generated value for `META_VERIFY_TOKEN`.
-## Local Development
+> **Important**
+> - `JWT_PRIVATE_KEY` and `JWKS` are required by Convex Auth. Generate them with `npx @convex-dev/auth --prod` — do not handcraft them unless you are following the [Convex Auth manual setup docs](https://labs.convex.dev/auth/setup/manual).
+> - `NEXT_PUBLIC_CONVEX_URL` and `NEXT_PUBLIC_CONVEX_SITE_URL` are written by `npx convex dev` locally and injected by `npx convex deploy --cmd "npm run build"` during production builds.
+> - `NUDGRA_ALLOWED_EMAILS` is required. If your Google email is not in the allowlist, sign-in is rejected.
+> - Keep `SITE_URL` exact. If your app is deployed at `https://cloud.example.com`, do not use a different Vercel preview URL or localhost value in production.
+
+## 💻 Local development
-This path is best for dashboard development and UI testing. For a complete Instagram webhook flow, use a deployed Convex site URL and a public app domain or tunnel because Meta cannot call `localhost`.
+This path is best for dashboard development and UI testing. For a complete Instagram webhook flow, use a deployed Convex site URL and a public app domain or tunnel, because Meta cannot call `localhost`.
-### 1. Install Dependencies
+### 1. Install dependencies
Install:
@@ -135,10 +218,10 @@ Install:
- Node.js 24 or newer
- A Convex account
-Clone the repo and install packages:
+In a Unix shell (macOS, Linux, or Git Bash):
```bash
-git clone YOUR_REPO_URL nudgra-cloud
+git clone https://github.com/MaikoCode/nudgra-cloud.git nudgra-cloud
cd nudgra-cloud
npm install
cp .env.example .env.local
@@ -147,13 +230,13 @@ cp .env.example .env.local
In Windows PowerShell:
```powershell
-git clone YOUR_REPO_URL nudgra-cloud
+git clone https://github.com/MaikoCode/nudgra-cloud.git nudgra-cloud
cd nudgra-cloud
npm install
Copy-Item .env.example .env.local
```
-### 2. Configure Local `.env.local`
+### 2. Configure local `.env.local`
At minimum, set:
@@ -162,14 +245,14 @@ SITE_URL=http://localhost:3000
NUDGRA_ALLOWED_EMAILS=your-google-email@gmail.com
```
-Google OAuth is required for normal sign-in. Create Google OAuth credentials using the Google section below, then set:
+Google OAuth is required for normal sign-in. Create Google OAuth credentials using the [Google section below](#google-oauth-setup), then set:
```env
AUTH_GOOGLE_ID=your-google-client-id
AUTH_GOOGLE_SECRET=your-google-client-secret
```
-For local Google OAuth, use your local Convex site URL as the redirect URI, not the Next.js app URL. `npx convex dev` will print or write the Convex values:
+For local Google OAuth, use your **local Convex site URL** as the redirect URI, not the Next.js app URL. `npx convex dev` will print or write the Convex values:
```env
NEXT_PUBLIC_CONVEX_URL=https://your-dev-deployment.convex.cloud
@@ -192,17 +275,13 @@ For local Meta OAuth or tracked links, set `SITE_URL` to a public tunnel URL ins
SITE_URL=https://your-tunnel.example.com
```
-### 3. Run The App
+### 3. Run the app
```bash
npm run dev
```
-Open:
-
-```text
-http://localhost:3000
-```
+Open