{"id":50292289,"url":"https://github.com/oratis/influencex","last_synced_at":"2026-05-28T06:16:06.151Z","repository":{"id":351830256,"uuid":"1212017049","full_name":"oratis/influencex","owner":"oratis","description":"Open-source KOL marketing automation platform. Multi-platform creator discovery, outreach pipelines, ROI tracking. Self-hostable, MIT licensed.","archived":false,"fork":false,"pushed_at":"2026-05-12T06:39:17.000Z","size":3206,"stargazers_count":1,"open_issues_count":0,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-12T08:32:41.913Z","etag":null,"topics":["creator-economy","crm","docker","email-outreach","express","influencer-marketing","instagram","kol","marketing-automation","nodejs","postgresql","react","self-hosted","tiktok","youtube"],"latest_commit_sha":null,"homepage":"https://github.com/oratis/influencex","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/oratis.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":"docs/ROADMAP.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-16T01:31:12.000Z","updated_at":"2026-05-12T06:39:21.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/oratis/influencex","commit_stats":null,"previous_names":["oratis/influencex"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/oratis/influencex","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oratis%2Finfluencex","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oratis%2Finfluencex/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oratis%2Finfluencex/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oratis%2Finfluencex/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/oratis","download_url":"https://codeload.github.com/oratis/influencex/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oratis%2Finfluencex/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33596538,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-28T02:00:06.440Z","response_time":99,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["creator-economy","crm","docker","email-outreach","express","influencer-marketing","instagram","kol","marketing-automation","nodejs","postgresql","react","self-hosted","tiktok","youtube"],"created_at":"2026-05-28T06:16:04.244Z","updated_at":"2026-05-28T06:16:06.144Z","avatar_url":"https://github.com/oratis.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# InfluenceX\n\n[![CI](https://github.com/oratis/influencex/actions/workflows/ci.yml/badge.svg)](https://github.com/oratis/influencex/actions/workflows/ci.yml)\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](./LICENSE)\n[![Node ≥20](https://img.shields.io/badge/node-%E2%89%A520-brightgreen)](https://nodejs.org)\n[![Tests: 65](https://img.shields.io/badge/tests-65%20passing-brightgreen)](./server/__tests__)\n[![OpenAPI 3.1](https://img.shields.io/badge/OpenAPI-3.1-blue)](./server/openapi.js)\n\nAn open-source KOL (Key Opinion Leader) marketing automation platform. Discover creators on YouTube, TikTok, and Instagram; run outreach pipelines; track campaign ROI — all in one self-hostable app.\n\n\u003e **One command to try it:** `docker compose up -d` → `npm run seed` → open `http://localhost:8080/InfluenceX` → log in as `demo@influencex.dev` / `demo1234`\n\n## Features\n\n- **Multi-platform KOL discovery** — YouTube Data API, TikTok, Instagram (via Apify), Twitch\n- **Smart email discovery** — Regex → bio-link services (Linktree, Beacons) → personal website scrape → Hunter.io domain search\n- **Outreach pipeline** — Draft → review → approve → send via Resend, with inbound webhook to capture replies\n- **ROI dashboard** — Conversion funnel, reply/contract/completion rates, effective CPM, cost-per-outcome\n- **Campaign management** — Organize KOLs into campaigns, track contract → content → payment workflow\n- **Analytics** — Feishu sheet sync, GA4 website metrics, daily content stats trending\n- **Background automation** — Scheduled email sends, auto follow-ups, batch KOL discovery, quota-aware YouTube calls\n- **Multi-user** — Admin / Editor / Viewer RBAC, invite flow, i18n (en/zh)\n- **Production-grade** — Rate limiting, CORS whitelist, login lockout, health checks, ETag caching, gzip, CSV export, webhook notifications (Slack / Feishu / Discord)\n\n## Architecture\n\n```\n                    ┌──────────────────────────────────┐\n                    │         React SPA (Vite)         │\n                    │  Pipeline / Campaigns / ROI /    │\n                    │  KOL DB / Contacts / Data / ...  │\n                    └─────────────┬────────────────────┘\n                                  │ /InfluenceX/api/*\n                                  ▼\n    ┌─────────────────────────────────────────────────────────────┐\n    │                  Express app (server/index.js)              │\n    │  ┌───────────┐  ┌───────────┐  ┌───────────┐  ┌───────────┐ │\n    │  │   auth    │  │  rbac     │  │rate-limit │  │  health   │ │\n    │  └───────────┘  └───────────┘  └───────────┘  └───────────┘ │\n    │  ┌───────────┐  ┌───────────┐  ┌───────────┐  ┌───────────┐ │\n    │  │  scraper  │  │ discovery │  │mail-agent │  │ scheduler │ │\n    │  │ (YT/TT/IG)│  │  (YouTube)│  │  (Resend) │  │(follow-up)│ │\n    │  └───────────┘  └───────────┘  └───────────┘  └───────────┘ │\n    │  ┌───────────┐  ┌───────────┐  ┌───────────┐  ┌───────────┐ │\n    │  │job-queue  │  │  cache    │  │   roi     │  │notifications│\n    │  │ (retry/   │  │ (TTL/LRU) │  │dashboard  │  │(Slack/Fei/ │ │\n    │  │  backoff) │  │           │  │           │  │  Discord)  │ │\n    │  └───────────┘  └───────────┘  └───────────┘  └───────────┘ │\n    │  ┌───────────┐  ┌───────────┐  ┌───────────┐  ┌───────────┐ │\n    │  │  openapi  │  │migrations │  │email-tpl  │  │ yt-quota  │ │\n    │  └───────────┘  └───────────┘  └───────────┘  └───────────┘ │\n    └─────────────────────────┬───────────────────────────────────┘\n                              │\n      ┌───────────────────────┼───────────────────────────────┐\n      ▼                       ▼                               ▼\n ┌──────────┐        ┌──────────────────┐            ┌──────────────┐\n │PostgreSQL│        │ External APIs    │            │  Webhooks    │\n │ or       │        │ • YouTube        │            │ • Resend     │\n │ SQLite   │        │ • Hunter.io      │            │   inbound    │\n │          │        │ • Resend/SMTP    │            │              │\n │          │        │ • GA4 / Feishu   │            │              │\n │          │        │ • Apify (IG/TT)  │            │              │\n └──────────┘        └──────────────────┘            └──────────────┘\n```\n\n## Quick start\n\n### Docker Compose (fastest)\n\n```bash\ngit clone https://github.com/oratis/influencex.git\ncd influencex\ncp .env.example .env          # optional: fill in API keys\ndocker compose up -d\ndocker compose exec app npm run seed    # sample data\n```\n\nOpen **http://localhost:8080/InfluenceX** and log in as `demo@influencex.dev` / `demo1234`.\n\n### Manual (local Node)\n\n```bash\ngit clone https://github.com/oratis/influencex.git\ncd influencex\nnpm install\ncd client \u0026\u0026 npm install \u0026\u0026 cd ..\nnpm run build\nnpm run seed       # optional sample data\nnpm start\n```\n\nUses SQLite by default — no external DB required.\n\n## Configuration\n\nSet environment variables (or copy `.env.example` to `.env`):\n\n| Variable | Purpose |\n|---|---|\n| `DATABASE_URL` | PostgreSQL connection string (omit to use SQLite) |\n| `ADMIN_EMAIL` / `ADMIN_PASSWORD` | Auto-create admin on first boot |\n| `YOUTUBE_API_KEY` | YouTube Data API v3 |\n| `RESEND_API_KEY` | Email sending |\n| `RESEND_FROM_EMAIL` / `RESEND_REPLY_TO` | Sender/reply-to addresses |\n| `RESEND_WEBHOOK_SECRET` | Svix signing secret for inbound webhook |\n| `HUNTER_API_KEY` | Hunter.io domain search |\n| `APIFY_TOKEN` | Instagram/TikTok scraping via Apify |\n| `GA4_PROPERTY_ID` / `GOOGLE_APPLICATION_CREDENTIALS` | Website analytics |\n| `FEISHU_APP_ID` / `FEISHU_APP_SECRET` | Feishu sheet sync |\n| `NOTIFY_SLACK_WEBHOOK_URL` | Slack notifications |\n| `NOTIFY_FEISHU_WEBHOOK_URL` | Feishu bot notifications |\n| `NOTIFY_DISCORD_WEBHOOK_URL` | Discord notifications |\n| `CORS_ORIGINS` | Comma-separated list, production only |\n| `SCHEDULER_ENABLED` | Set `false` to disable background email scheduler |\n\nSee [.env.example](./.env.example) for the full list.\n\n## API documentation\n\nLive Swagger UI at **http://localhost:8080/InfluenceX/api/docs** after starting the server.\nRaw OpenAPI 3.1 spec at `/api/openapi.json`.\n\n## Deployment\n\n### Google Cloud Run\n\n```bash\n./setup-secrets.sh   # one-time / when rotating: push .env values to GCP Secret Manager + grant IAM\n./deploy.sh          # builds, pushes, deploys (mounts secrets via --update-secrets)\n```\n\nUses Cloud SQL via `--add-cloudsql-instances` — the app connects over Unix socket when `K_SERVICE` is set.\n\nSensitive values (`MAILBOX_ENCRYPTION_KEY`, `RESEND_API_KEY`, OAuth client secrets, DB URL, etc) live in [GCP Secret Manager](https://console.cloud.google.com/security/secret-manager) and are mounted into the container as env vars at runtime — they never appear in `gcloud run services describe` output or the service YAML. The full list of what's a secret vs plain config is in [setup-secrets.sh](./setup-secrets.sh) (`SECRET_NAMES`) and [deploy.sh](./deploy.sh) (`SECRETS_CSV`); keep them in sync when adding new secrets.\n\nTo rotate a single secret:\n\n```bash\nprintf 'new-value' | gcloud secrets versions add SECRET_NAME --data-file=-\n./deploy.sh   # or: gcloud run services update influencex --region us-central1\n```\n\n### Any Docker host\n\n```bash\ndocker build -t influencex .\ndocker run -p 8080:8080 --env-file .env influencex\n```\n\n## Tech stack\n\n- **Backend:** Node.js 20+, Express 5, PostgreSQL 15 or SQLite\n- **Frontend:** React 18, Vite, Recharts (lazy-loaded)\n- **Email:** Resend (with SMTP fallback via nodemailer)\n- **External:** YouTube Data API, Hunter.io, Apify, GA4, Feishu Open Platform\n- **Tests:** Node built-in test runner, GitHub Actions CI\n\n## Project status\n\nSeven phases delivered (see [CHANGELOG](./CHANGELOG.md) for details):\n\n1. **Security** — hardcoded-secret removal, CORS whitelist, login lockout, rate limiting\n2. **UI polish** — Toast/ConfirmDialog, 404 page, error-state normalization\n3. **Core** — real email sending, real KOL collection, YouTube quota tracking, DB migrations, email templates\n4. **Advanced** — CSV export, RBAC, webhook notifications, email scheduler\n5. **Production** — 65 unit tests, CI pipeline, rate limiting, health endpoints, ROI backend, code splitting\n6. **Frontend** — ROI dashboard, i18n (en/zh), user management, OpenAPI docs\n7. **Scale** — job queue, TTL cache, Apify integration, Docker Compose, community docs\n\n## Contributing\n\nSee [CONTRIBUTING.md](./CONTRIBUTING.md). Bug reports and PRs are welcome.\n\n## License\n\n[MIT](./LICENSE) © 2026 InfluenceX Contributors\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foratis%2Finfluencex","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Foratis%2Finfluencex","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foratis%2Finfluencex/lists"}