Case Study

Native iOS · designed + built solo · live on the App Store

Job alerts before the job boards.

Praeo watches any company's careers page and pushes you the moment a role goes live, before it hits the job boards. I designed it, built it in SwiftUI with a real backend, and shipped it to the App Store. End to end, alone.

SwiftUI · Railway · Supabase · OneSignal · Brandfetch

6ATS platforms supported
45 minPoll interval per company
App StoreShipped solo, design through launch
RoleDesign and engineering, end to end
TimelineNights & Weekends, about 6 weeks
Year2026
StatusLive · App Store · praeo.app

Built with

SwiftUIiOS 26 Liquid GlassRailway worker · NodeSupabaseOneSignal pushBrandfetchClaude Code and Cursor

Six ATS fetchers: Greenhouse, Ashby, Lever, Workday, SmartRecruiters, iCIMS.

I built Praeo because I kept watching roles I wanted go to whoever saw the posting first. Even with LinkedIn or Indeed job alerts, the notification came as a bulk send: everything posted in the last 24 hours, batched together. By the time I opened the app, the job already had a few hundred applicants. Recruiters told me as much. They start at the top of the pile, and if you're late, there's no shot. That's the gap Praeo closes.

The best roles get filled fast. By the time a job hits LinkedIn or Indeed, it has often been live on the company's own careers page for hours or days, and the people who applied first are already in the pipeline. There was no simple way to watch the companies you actually care about and get told the instant something opens. So I built it. Pick your companies, and Praeo checks their careers pages every 45 minutes, then pushes you the role before the boards even have it.

I didn't mock this up and hand it off. I designed and shipped the whole thing.

The product: a native SwiftUI app, dark-mode first, with the real iOS 26 Liquid Glass navigation. Not a recreation. The actual current Apple material with the morphing tab bar.

The backend: a Railway-hosted worker running six ATS fetchers (Greenhouse, Ashby, Lever, Workday, SmartRecruiters, iCIMS), Supabase for data, OneSignal for push, and Brandfetch for company logos and search. The worker polls every monitored company on a 45-minute cycle and fires a push the moment a new posting appears.

AI as a capability: built with Claude Code and Cursor. The architecture, the scope calls, and the design decisions were mine. The tooling made a solo, full-stack native build possible.

Killed a dependency before it killed launch. Company search and logos originally ran on Clearbit. When I caught that it was being shut down after the HubSpot acquisition, I migrated to Brandfetch before launch rather than ship on a dying API.

Chose a mental model, not an inbox. I rejected a read/unread system in favor of Alerts, Saved, Applied. A model that matches what people actually do with a job, not how email works. It meant cutting a feature to keep the model clean.

Shipped tight, sequenced the rest. Dark mode only for v1. iPad optimization deferred to v1.1. Deliberate scope calls to get a polished thing into review, not a broad, half-finished one.

Some caching bugs made the app show scans from "XXXX minutes ago" when the whole point was a fresh check every 45 minutes. I dug in and fixed the cache.

Then some sites came back with zero jobs while I could see new postings elsewhere. It turned out that heavily custom-coded careers pages block automated scans. Rather than fight every custom-built page, I added a notice in the app: when a scan comes back blocked, Praeo tells you it's on that company's end, not Praeo's, and gives you a direct link to their careers page.

Next up: smarter de-duping so reposted roles don't flood your alerts, and a cleaner alerts tab with better filter options — applied, saved, in progress — so you can actually manage what you're tracking instead of scrolling through noise.