Personal lead vault for cold outreach.
Dump contacts in from Excel, filter by niche / country / status, keep call scripts next to the list, and stop losing track of who you already rang. Each account gets its own vault.
| Live | https://outreachos.techxtreme.me |
| Portfolio | techxtreme.me/work/outreachos |
| Repo | github.com/its-techxtreme/OutreachOS |
| Studio | techxtreme.me |
| Stardance | project page |
- Open outreachos.techxtreme.me
- Hit Peek the demo / Sign in as Demo — one click, no password typing
Demo is a shared sample vault (about 100 leads). Imports are capped so people don’t trash it. For your own empty vault, use Start free or Google sign-in.
The first UI was… fine. Also painfully generic. A Shipwright review basically told me to stop shipping another lookalike dashboard, so I started hunting for something that could feel creative and still work for different ages without looking gimmicky.
I brainstormed for a while and got nowhere useful. Then, while sorting files on my laptop, I dug up my 10th-grade (high school) portfolio. It used this Japanese paper-notebook theme, lined pages, that whole handmade feel. That clicked. A sketchbook wasn’t just “pretty” — paper is how people kept contact notes long before CRMs existed, which fits OutreachOS almost too well: you manage people, numbers, and follow-ups.
So the app leans into paper texture, doodle borders, and sticky notes on purpose. It’s meant to feel like a working notebook, not a stock SaaS template.
First time you open the demo, Rio walks you through the vault (filters, metrics, scripts, and so on). Skip whenever you want.
A few demo quirks:
- Shared sample data (not your private vault)
- Import / write limits so the sample stays usable
- Tutorial usually shows once unless you clear it locally
Metrics up top, weekly quest board if you opt in, filters, then the lead list.
Niche / country graph when you want the big picture instead of scrolling rows forever.
Call pitch pad that stays open while you dial. Placeholders like {business} / {niche} / {location} / {phone} — you say them live. Drag it, edit it, save your own (general + niche scripts).
| Method | Notes |
|---|---|
| Email + password | Signup → verify email → claim a username |
| Sign-in; Automatic Linking keeps Google + password as one user when emails match | |
| Demo | Shared sample vault, one-click, no password typing |
| MFA | Optional TOTP under settings (secrets encrypted at rest with ENCRYPTION_KEY) |
| Admin | Google + server allowlist → ops dashboard |
Password reset, username claim, and account delete live under /auth/* and settings. Passwords go through Supabase Auth — we don’t keep plaintext passwords around.
- Excel import + format guide (
/import-guide) + template underpublic/templates/ - Filters, search, CSV export
- Call statuses: New, Called, No Answer, Callback, Replied, Converted, Archived
- Sticky scripts (general + niche), draggable
- Optional Quest Board (3 random weekly quests)
- Vector vault graph
- Email / password signup, Google sign-in, one-click demo
- Per-user lead pools (your stuff stays yours)
- Free vs Premium (
/pricing) — ₹1499 or $15 / month; request via email totechxtremebuisness@gmail.com(username included automatically); I grant access from the admin dashboard after payment - Public SEO:
/sitemap.xml,/robots.txt,/llms.txt - Accessibility notice:
/accessibility
There’s also a parked agent route (POST /api/agent/leads + X-Agent-Secret) from an early ChatGPT experiment. Not a v1 product feature — left in as scaffolding if GPT agent intake comes back in v2. Excel import is what you should use today.
Next.js · Supabase (Auth + Postgres) · Tailwind · Vercel
Excel import → Next.js API → Supabase
↓
Dashboard (filter / dial / export)
Need Node 18+, a Supabase project, and a bit of patience with env vars.
git clone https://github.com/its-techxtreme/OutreachOS.git
cd OutreachOS
npm install
cp .env.example .env.localFill .env.local from .env.example. The important ones:
NEXT_PUBLIC_SUPABASE_URL/NEXT_PUBLIC_SUPABASE_ANON_KEYSUPABASE_SERVICE_ROLE_KEY(server only)AGENT_SECRET(legacy agent route only; optional for normal local use)ENCRYPTION_KEY(64 hex chars — MFA secrets at rest)ADMIN_*/ADMIN_GOOGLE_EMAILand optionalDEMO_USER_*NEXT_PUBLIC_APP_URL/NEXT_PUBLIC_SITE_URL(canonical:https://outreachos.techxtreme.me)
Run migrations in supabase/migrations/ in order (include 009_subscriptions.sql), then:
npm run ensure:accounts
npm run seed:demo
npm run devOpen http://localhost:3000.
- Redirect URLs:
/auth/callback,/auth/login,/auth/reset-password,/auth/username - Enable Automatic Linking (verified emails) so Google + email/password stay one user
- If you already duplicated an admin as Google-only:
node --env-file=.env.local scripts/merge-auth-identities.mjs --dry-run
node --env-file=.env.local scripts/merge-auth-identities.mjs --email=you@example.comAdmin management (Google + server-side allowlist only): ops console path in private deploy notes.
npm run dev
npm run build
npm run test
npm run test:e2e
npm run lint
npm run ensure:accounts
npm run seed:demo
npm run audit:secretsNo giant spec dump in the repo. Accessibility note is at /accessibility if you need it. Screenshots above are from the live site.
Don’t commit .env.local or real keys. Service role stays server-side. Passwords go through Supabase Auth. MFA secrets are encrypted with ENCRYPTION_KEY. Demo is intentionally limited.
Built by Athan (Techxtreme).
I use Cursor for a some amount of the coding help — scaffolding, tests, and the boring glue. Product calls, design, and final review are still mine in those cases too.







