after #3 i thought i was mostly done. then reality showed up with a checklist: put it on a real domain, try to make money somehow without blowing up KYC 😅, stop looking sketchy to Google, and clean the security alerts GitHub kept waving at me =_+
so this update is less “new shiny feature” and more “make it feel like an actual product.”
OutreachOS now lives at https://outreachos.techxtreme.me (not just the random vercel.app link). feels way better saying that out loud.
I wanted paid plans but razorpay needs PAN/KYC and i wasn’t doing that yet. so /pricing is live (₹1499 / $15) and “buy” just opens an email request with your username filled in. i grant Premium from an admin dashboard after payment. not fancy but works i hope so.
Built a small Google-only admin console for managing users / Premium. submitted the sitemap in Search Console. added an accessibility notice in the footer because i had heard that not inlcuding one can get you sued 😭 😭
Dependabot was yelling about Next.js (and some other packages). upgraded properly and fixed it :)
also tightened a few CodeQL things (sanitization, api key hashing, logging). npm audit is clean on my end now.
the old Custom GPT → API intake isn’t a product feature anymore. excel import is the real path. i left the agent code in the repo as scaffolding if i bring GPT intake back in v2.
the sketchbook UI idea didn’t come from a template. i found my 10th-grade japanese paper notebook portfolio while cleaning my laptop files, and it finally clicked — paper notes for contacts just fits outreach :D
live: https://outreachos.techxtreme.me
if something’s weird, tell me. i’m still polishing the edges, but the core is solid.
yeah. for real this time ig.
the app is on a proper domain, signup/demo/login work, excel import + vault features are live, Premium has a path that doesn’t depend on unfinished KYC, admin can actually manage accounts, SEO/accessibility aren’t invisible, and the scary dependency alerts got patched instead of shrugged off.
not claiming it’s perfect forever — just that OutreachOS is in a state where i’m comfortable saying: ship it. poke holes if you find them.
ok so after #2 i actually shipped OutreachOS and got changes requested pretty fast. shipwrights said:
➤ the css looked like every other ai-made site
➤ add a couple features i came up with to make it more fun
➤ stop making people use demo creds
that stung a little but they were right. this whole stretch was just me answering those instead of pretending it was finished :-D
the biggest thing was the ui. before it was this dark teal ops console look. clean but soulless, like a saas template trying too hard.
I tried to think of a idea, then I remembered my high school portfolio, I based in on a notebook pages style ppt theme.
i ripped that dead ui out and went sketchbook / doodle for basically the whole app.
Now its paper backgrounds, doodle borders, sticky note energy, little hand-drawn characters hanging around. landing is brand first with the constellation field and doodles floating so it feels like mine instead of a product pitch. login and signup match that vibe now too, same paper/doodle language instead of looking bolted on.
dashboard feels like a notebook you actually use on call days instead of glass cards stacked forever. lead table is still built for real work but the chrome around it looks hand drawn. vector view (the niche/country constellation graph) is still there, it just fits better now. settings and account got the same treatment so flipping between pages doesnt feel like you teleported into a different app.
Basically whole point was stop looking generated.
then the fun features. sticky call scripts were the one i wanted most. you get a general sticky plus niche ones, with placeholders like business, niche, location, phone that you speak through live. edit, save, reset. no ai writing your pitch. just a note that stays while you dial, which sounds small until youre mid call and dont want to lose your place.
call statuses got real too: New, Called, No Answer, Callback, Replied, Converted, Archived, and theyre one click chips so youre not hunting a dropdown mid call.
also built a quest board (To gamify cold-calling). optional on purpose. opt in when you set a username or later in account, get 3 random quests a week, progress when you move lead statuses. kinda dumb, kinda motivating, weirdly keeps me dialing cuz its easy to get discouraged while cold-calling T_T
import path got better too. any niche/country still works, clearer row errors when excel is messy, filters refresh after import, PLUS an import guide page and an excel template so people stop guessing columns.
for the demo creds complaint i added a Try Demo button that just signs you in. shipwrights and anyone bored can open the site and click once. no more copying email/password out of a post.
you can also signup normally or continue with google if you want your own vault.
also pushed google oauth out of testing only so random google accounts actually work now, which took longer than it should have because google cloud is annoying.
tiny invisible stuff nobody screenshots: passwords still go through supabase auth hashed, secrets stay in env, mfa secrets encrypted at rest.
boring but i slept better after doing it ^_^
site is https://outreachos-online.vercel.app
if you try it: open it, hit Try Demo or signup, pick a lead, flip a status chip, open the sticky script, peek at quests. tell me if anything feels weird or still looks template-y. im trying to catch that before i reship.
im hyped to ship again. still got a few final polish bits (maybe a student .me domain, google brand verification for the logo, tiny ui cleanup) then im hitting request re-certification. if youre free break it before then. i actually want the feedback this time tbh.
continuing from #1,
Because apparently the pipeline had more ways to die than i budgeted my mental piece for 😭 =_= 😭
a non-exhaustive list of things that broke autonomy (these are the majot ones, many more small things too):
failure_code made healthy queued jobs invisible to claim_next_job. queue looked alive. nothing claimed. i checked daily upload limits, n8n, worker health… everything green. the bug was one boolean expression treating SQL NULL like false.login_required, instagram already uploaded, admin hit retry, worker said “no platforms need upload” because login_required wasn’t in the retryable set. i fixed the session, clicked retry, watched nothing happen, questioned my life choices.uploading. claim blocked. daily limit logic counted the zombie as an inflight upload. cascade of sadness overflowed.each time the dashboard looked calm and the logs were quiet for 30+ minutes, that was the tell. silence usually meant a stuck lock, not “everything is fine.”
i stopped trying to be clever and started treating the worker like a hostile roommate.
uploading after the lock expires / goes stale, auto-recover it on the next claim instead of waiting for me to noticealso: verify delay went from 30 minutes to 5 for local testing because waiting half an hour to learn the upload silently failed was making me insane.
it kinda works. not “enterprise reliable.” more like “if my pc is awake and chrome profiles are healthy, videos move.” submit is public. admin dashboard shows queue / failed review / accounts. demo user can look, can’t smash retry/delete. real uploads still need my laptop + n8n and docker which runs on it.
frustrations that still remain (T_T) :
local dependency, playwright flakiness, platforms changing UI for sport, and the eternal fear that tomorrow’s youtube banner invents a new sentence that trips the detector again.
but i went from “i will paste this reel into six tabs” to “drop the link and let the queue cook.” for a broke-student compromise architecture, that’s the win i care about.
This devlog shows only 1hr, cuz actually 60-70% of work was done in previous timed devlog, but I hit the character limit.
if you want to click around without breaking anything:
ProjectAPIDemo
ProjectAPI@13
submit page is public. dashboard demo login is read-only (you can browse, you cannot smash retry/delete/account buttons).
thanks for reading these long-ass devlogs. seriously fr !!
if you made it through both, you now know more about my chrome profiles than my friends do :)
ok so i will be honest about how this project actually felt to build, because if i write the clean “i learned so much” version nobody will believe it, so anyways lets move on ;)
Basciallyy, i started Project AP-I because managing short form content for three niches (memes, anime, sports) was eating my brain at very very fast rate.
Every day was the same monotonous loop: find an approved clip, download it, slap a watermark, write a caption, open youtube studio, open instagram, upload twice, pray nothing asks for 2fa. doing that by hand for multiple accounts is how you lose a whole evening and still miss one niche. i wanted a queue. drop the link once, pick the niche, walk away.
sounds simple, but fr it was nott 😭 +_=
my first instinct was “just rent a VPS, put chrome + playwright there, done.” then i looked at prices for a box that can actually run headed chrome without dying, plus storage for temp video, plus sitting there 24/7. for a student project that was a hard no. so i compromised.
So the architecture became weird on purpose:
so the so called “cloud” part is mostly the website in my project sadly =_=. the actual factory is under my desk. if my pc sleeps, the queue sleeps. that sucks. but it meant i could ship real uploads without burning money i don’t have. i’d rather have an ugly local stack that works than a pretty architecture diagram and empty wallet :)
ngl browser automation for youtube studio + instagram is genuinely mean. docs make it look like page.click('#upload') and you’re done.
lemme give u a look at reality:-
-youtube throws a red banner that says turn on 2-step verification while you’re fully logged in, and my detector treated that like a login wall. i watched chrome sitting there logged in, create button visible, video already published… and the job still flipped to login_required. i wanted to throw the laptop.
youtu.be link from the share dialog. so the video is live on the channel and the database says failed. truly was a nightmare for me.uploading forever. claim logic sees “someone is uploading” and refuses to take the next job. whole pipeline frozen for like an hour while five videos sit in queued doing nothing. i stared at the dashboard thinking n8n died. n8n was fine. one ghost job was holding the me at the edge of Cyberpsychosis (anime reference :D)every “one more small fix” turned into another edge case. captcha? stop and mark login_required. real verify-it’s-you interstitial? same. security upsell notification? ignore it or you false-positive yourself into a corner =_=
i had to rewrite the challenge detector like three times until it stopped panicking at youtube’s “your account is at greater risk” banner.
and that was just the browser drama.
Since I have reached the charcter limit I will continue in next devpost.
DEVLOG #2 — Almost done + please break it for me
Ok so OutreachOS is basically complete. like the main stuff actually works now and im not waking up scared that login or imports are gonna explode.
this session was mostly cleanup + making it safe enough to show people:
➤ fixed the admin side so the dashboard shows my username instead of dumping my email on screen (that was lowkey embarrassing)
➤ admin can import excel sheets kinda aggressively (up to 200/min) which is what i needed for bulk lead dumps
➤ added a public demo account so yall can poke around without me handing out admin access
➤ demo is locked down on purpose: 1 upload per hour, and you only see 100 contacts (mixed niches + countries so it still feels real)
➤ also shipped a cleaner url finally
site: https://outreachos-online.vercel.app
Demo login (pls use this one):–>
• email✉️: [email protected]
• password: OutreachOS@13
if you try it, tell me what feels weird. broken filters, confusing UI, import failing, whatever. i want people to actually click around and roast it a bit before i call this fully finished.
anyway yeah. core app is mostly done. next stuff is just polish from real feedback. go test it if you’re bored.
What is OutreachOS?
OutreachOS is a B2B lead management platform for cold outreach. ChatGPT agents collect business data from Google Maps and submit it through a secure API. The system deduplicates leads, stores them in Supabase, and provides a real-time dashboard for filtering, searching, and CSV export.
Stack: Next.js 16 · React 19 · Supabase PostgreSQL · Tailwind CSS · shadcn/ui · Vercel
Development Timeline
Phase 0 — Foundation ✅
Bootstrapped the Next.js project, testing toolchain (Jest + Playwright), Cursor rules, and phase-based workflow.
Phase 1 — Database & Agent API ✅
Built the leads schema with maps_url deduplication, pg_trgm fuzzy search, and the first /api/agent/leads endpoint with X-Agent-Secret auth.
Phase 2 — Dashboard UI ✅
Shipped the dashboard: filter toolbar, prospect matrix table, metrics panel, pagination, and Stitch-aligned design components.
Phase 3 — Data Management✅
Connected the UI to live data — debounced search, multi-filter state, CSV export, URL-synced filters. Hit 85%+ test coverage.
Phase 4 — API Integration & ChatGPT Setup ✅
Multi-strategy auth (agent secret + Bearer API keys)
Tiered rate limiting, structured logging, Prometheus metrics
/api/health and /api/metrics endpoints
OpenAPI spec + ChatGPT Custom GPT documentation
190 tests passing · repo published publicly on GitHub
Links:-
Repo: https://github.com/its-techxtreme/OutreachOS
README: https://github.com/its-techxtreme/OutreachOS/blob/develop/README.md
Devlog file: https://github.com/its-techxtreme/OutreachOS/blob/develop/docs/DEVLOG.md