UGC Reactions from Real Creators
真实创作者视频库,视频仅需 11 美元,图片仅需 8 美元。定制化制作起价 25 美元/视频,最低消费 250 美元。包含商业授权。
AI 翻译
尚未检测到更新。GitHub 发布版本后会显示在这里。
制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗After a trade show you come home with a stack of business cards and a vague memory of who wanted what. The follow-ups either go out a week late as one generic blast, or they don't go out at all.
I built FirstHey for a team that sells virtual plant visits to factory owners at exhibitions. The goal was simple: the person at the booth should be able to capture a lead in under a minute, and the follow-up should reach that lead the same day, written like a human wrote it, mentioning the exhibition and what was actually discussed.
Everything is scoped to an organization, so each company only sees its own leads, and each one sends from its own mailbox.
| Area | What's used |
|---|---|
| App | Next.js 16 (App Router, route handlers), React 19, TypeScript |
| UI | Tailwind CSS 4, Framer Motion, Recharts, Lucide icons |
| Database and auth | Supabase: Postgres with row level security, email/password auth, storage for card images and audio |
| AI | Google Gemini (gemini-3.6-flash) through @google/generative-ai for card reading, transcription, notes and drafting. LangChain and LangGraph for the lead scoring pipeline |
| Nodemailer over Gmail or Workspace SMTP (App Password). Resend is supported too | |
| Reports | ExcelJS |
| Scheduling | A GitHub Actions cron that calls a protected API route (see below) |
| Hosting | Vercel |
It is also an installable PWA with a small offline queue, because exhibition Wi-Fi is not something to rely on.
You need Node 20+, a Supabase project, and a Gemini API key.
git clone https://github.com/Avrsxvr/FIrstHey.git
cd FIrstHey
npm install
cp .env.example .env.local # then fill it in
npm run dev
Open http://localhost:3000. Next.js here is a recent major version, so if something behaves differently from what you remember, check node_modules/next/dist/docs/.
The variables that matter:
| Variable | What it is for |
|---|---|
NEXT_PUBLIC_SUPABASE_URL, NEXT_PUBLIC_SUPABASE_ANON_KEY | Browser access to Supabase |
SUPABASE_SERVICE_ROLE_KEY | Server-side access. Never expose this one |
GEMINI_API_KEY | Fallback key when an organization hasn't saved its own in Settings |
NEXT_PUBLIC_APP_URL | Your live address. Used for tracking links and the unsubscribe link, and emails refuse to send without it |
CRON_SECRET | Shared secret for the scheduled sender. Must be identical in Vercel and GitHub |
INBOUND_EMAIL_WEBHOOK_SECRET | Protects the reply webhook. If unset, the webhook stays off |
SEQUENCE_DAILY_LIMIT, SEQUENCE_PAUSED | Optional. Per-organization daily cap and a global kill switch |
Email credentials are not environment variables. Each organization enters its own in Settings.
The schema lives in supabase/migrations. That folder grew while the data model was still changing and some early files conflict with later ones, so please don't run the whole folder blindly (one of them drops tables). If you already have a project, supabase/fix_missing_tables.sql adds whatever is missing and is safe to run more than once. Cleaning the migrations into a single starting file is on the to-do list.
Vercel's free plan only allows one cron run a day, which is far too coarse for a sequence that sends in small batches. So .github/workflows/send-followups.yml calls /api/cron/send-followups every 10 minutes during business hours, using CRON_SECRET as a bearer token. Add two repository secrets, APP_URL and CRON_SECRET, and the workflow does the rest. If a run fails, the log says why (wrong secret, wrong URL, protected deployment and so on).
The sender is deliberately conservative, because a mailbox that gets flagged is hard to un-flag:
List-Unsubscribe headers, plus the company name and postal address.The Queue page shows what is waiting to go out and has a pause-everything button.
src/
app/ pages and API route handlers
capture/ the capture flow (card, voice, notes, preview, send)
(dashboard)/ analytics, queue, settings, profile
api/ leads, sequence, analytics, cron, webhooks, tracking
components/ UI pieces (lead panel, scanners, pipeline view)
lib/
agents/ Gemini calls: card OCR, notes, context merge, drafting, scoring
prompts/ the prompts those agents use
services/ sequence engine, email sending, engagement and reports
sendPolicy.ts when sending is allowed
sequenceConfig.ts gaps, caps, warm-up
supabase/ SQL
.github/workflows/ the scheduled sender
tests/manual, but nothing automated.