new-term-radar
신규 AI 용어를 매일 추적, X·Hugging Face·GitHub 등에서 모델·제품·레포 이름을 빠르게 수집
MagnetEngine가 이상적인 Instagram 잠재고객을 찾아 AI로 맞춤 DM을 작성·자동 전송해 일정이 자동으로 채워집니다
MagnetEngine finds your ideal Instagram leads, writes personalized DMs with AI, and sends them automatically — so your calendar fills itself.
마케팅TypeScript · JavaScriptGitHub @Aminsfx온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
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.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).