new-term-radar
Daily radar for new AI terms: names of new models, products and repos, caught on X, Hugging Face, GitHub and sitemaps before keyword tools list them.
MagnetEngine finds your ideal Instagram leads, writes personalized DMs with AI, and sends them automatically — so your calendar fills itself.
MarketingTypeScript · JavaScriptGitHub @AminsfxOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
MagnetEngine finds Instagram leads with Apify, writes personalized DMs with AI, queues them for approval, and auto-sends approved messages through a Chrome extension.
React 19 + TypeScript + Vite 6 + Tailwind CSS 3 (build-time) + Supabase (auth & data) + Recharts.Read the full README ↗MagnetEngine finds Instagram leads (via HikerAPI), writes personalized DMs with AI, queues them for approval, and auto-sends approved messages through a Chrome extension.
React 19 + TypeScript + Vite 6 + Tailwind CSS 3 (build-time) + Supabase (auth & data) + Recharts.
npm install
cp .env.example .env # fill in the PUBLIC (VITE_) values only — see below
npm run dev # http://localhost:3000
npm run dev runs the Vite frontend only. AI DM generation and Instagram
scraping call Supabase Edge Functions (which hold the secret keys), so for
those features to work locally you must have the functions deployed and their
secrets set (see "Backend (Edge Functions)" below) — the app calls the deployed
functions from both dev and production. Without Supabase env vars the app falls
back to localStorage (dev mode: no real auth, subscription treated as active;
AI/scraping unavailable).
npm run build # production build → dist/
npm run preview # serve the production build
npx tsc --noEmit # type-check
.env.https://YOUR_DOMAIN/login (email confirmation)https://YOUR_DOMAIN/reset-password (password recovery)http://localhost:3000 for dev-- Leads
create table if not exists leads (
id text primary key,
user_id uuid not null references auth.users(id) on delete cascade,
data jsonb not null,
created_at timestamptz default now()
);
alter table leads enable row level security;
create policy "Users see own leads" on leads for all using (auth.uid() = user_id);
-- Config
create table if not exists configs (
user_id uuid primary key references auth.users(id) on delete cascade,
data jsonb not null,
updated_at timestamptz default now()
);
alter table configs enable row level security;
create policy "Users see own config" on configs for all using (auth.uid() = user_id);
-- Follow-up sequences
create table if not exists follow_up_sequences (
id uuid primary key default gen_random_uuid(),
user_id uuid not null references auth.users(id) on delete cascade,
campaign_id text,
steps jsonb not null default '[]',
active boolean not null default true,
created_at timestamptz default now()
);
alter table follow_up_sequences enable row level security;
create policy "Users see own sequences" on follow_up_sequences for all using (auth.uid() = user_id);
-- Subscriptions (payment gating — see below)
create table if not exists subscriptions (
user_id uuid primary key references auth.users(id) on delete cascade,
plan text not null default 'starter' check (plan in ('starter','pro','agency')),
status text not null default 'pending' check (status in ('pending','active','cancelled')),
updated_at timestamptz default now()
);
alter table subscriptions enable row level security;
create policy "Users read own subscription" on subscriptions
for select using (auth.uid() = user_id);
-- Deliberately NO insert/update policy: only you (via the dashboard or
-- service role) can activate accounts.
subscriptions = pending).VITE_WHOP_PLAN_ID_MONTHLY|ANNUAL plan IDs from .env; falls back to your contact email until you add them). Their signup email is prefilled and locked, so the payment always matches their account.whop-webhook Edge Function verifies the signature, matches the email, and flips their subscription to active within seconds. The page detects it and drops them into the dashboard.membership.deactivated).VITE_ADMIN_EMAILS + the ADMIN_EMAILS function secret) shows every member and can activate/revoke any email in one click — no SQL needed.Full setup click-path: docs/WHOP_SETUP.md.
extension/ is loaded unpacked via chrome://extensions → Developer mode → Load unpacked.
window.postMessage; the content script relays them to the background worker, which opens Instagram profiles on a randomized drip (test mode: ~20 s; production mode: 15–45 min, 25 DMs/day cap).content_scripts.matches in extension/manifest.json (it currently matches localhost and instagram.com only) — otherwise "Send to Extension" only works from localhost.No secret key ever reaches the browser. All external API calls (Claude/OpenAI/ Gemini, HikerAPI) go through Supabase Edge Functions that hold the keys server-side.
Frontend (VITE_* in .env / Vercel — PUBLIC, shipped in the JS bundle):
| Variable | Purpose |
|---|---|
VITE_SUPABASE_URL | Supabase project URL |
VITE_SUPABASE_ANON_KEY | anon/publishable key — designed to be public (RLS protects data) |
VITE_WHOP_PLAN_ID_MONTHLY / _ANNUAL | public Whop plan IDs for the checkout embed |
VITE_ADMIN_EMAILS | owner emails — cosmetic /admin UI gate only |
Only put non-secret values here. Never add an API key as a VITE_ var.
Backend (Supabase Edge Function secrets — SECRET, never sent to the browser):
| Secret | Used by |
|---|---|
CLAUDE_API_KEY (and/or OPENAI_API_KEY, GEMINI_API_KEY) | generate-dm |
HIKERAPI_KEY (opt. MONTHLY_SCRAPE_LIMIT, default 5000 lookups/user/month) | scrape |
WHOP_WEBHOOK_SECRET (opt. WHOP_PLAN_ID_MONTHLY/_ANNUAL) | whop-webhook |
ADMIN_EMAILS | admin-api |
SUPABASE_URL and SUPABASE_SERVICE_ROLE_KEY are auto-injected into functions.
The supabase/functions/ directory holds the Deno Edge Functions:
generate-dm, generate-reply, scrape (secret-holding proxies for the app),
plus whop-webhook, admin-api and auth-email-hook. Deploy and configure once:
# 1. Set the server-side secrets (never committed, never VITE_-prefixed):
supabase secrets set \
CLAUDE_API_KEY=sk-ant-... \
HIKERAPI_KEY=...
# optional: OPENAI_API_KEY, GEMINI_API_KEY, MONTHLY_SCRAPE_LIMIT
# 2. Deploy the app proxies (gateway JWT check ON — only signed-in users can call):
supabase functions deploy generate-dm
supabase functions deploy scrape
# webhook is public (verifies its own signature); admin-api keeps JWT check on:
supabase functions deploy whop-webhook --no-verify-jwt
supabase functions deploy admin-api
The browser calls the app proxies via supabase.functions.invoke, which attaches
the signed-in user's JWT automatically — so anonymous callers can't spend your
AI/HikerAPI credits. Scrape lookups are also metered per user per month in
scrape_usage — run supabase/migrations/0002_scrape_usage.sql once.
VITE_* vars above in Project → Settings →
Environment Variables. Remove any old VITE_APIFY_API_KEY / VITE_*_API_KEY
from Vercel — they're no longer used and must not be shipped.npm run build, output dist/. vercel.json already adds the
SPA rewrite (all routes → /index.html).