Opprio is our own product. It watches public contract and grant postings and emails small businesses and solo consultants the ones that fit their work. This post covers how we built it, the tools we picked, and the checks that caught problems before any user saw them.
Why we built Opprio
The big bid-tracking tools are priced for agencies and mid-size contractors. We wanted a tool sized for individuals and small firms.
Opprio started on September 11, 2026, under the working name GovCon Radar. We picked it from a short list of five product ideas. It had the clearest budget fit, the clearest way to make money, and the lowest build complexity. On October 14, 2026, we renamed it Opprio and gave it the domain opprio.com.
How the build went
- September 11–12: the first version. We set up the project, pulled data from USASpending.gov and SAM.gov, and added accounts, sign-in, alert rules and Stripe billing.
- October 13–16: most of the product. Daily alert emails, hosting, the rename, more data sources, tests and automated checks, and state and local bids.
By October 16 the project had 63 commits. A commit is one saved, labeled change to the code.
The tools we chose
We built the whole app with Next.js and TypeScript. Next.js is a framework for building websites and web apps. TypeScript adds type checking to JavaScript, which catches many mistakes before the code runs.
The pages, the behind-the-scenes parts and the scheduled jobs all live in one codebase. We chose that setup to keep development fast.
The rest of the stack:
- PostgreSQL for the database, with Prisma to work with it from code
- Better Auth for accounts and sign-in
- Stripe for billing
- Resend for email
- Railway for hosting
- GitHub Actions to run type checks, linting (automated checks for errors and style), tests and a build on every push
We tried Cloudflare for hosting first. The daily job worked on our own machine, but on Cloudflare it needed a second database client. So we moved to Railway.
Getting the data right
An alert app is only as useful as its data, so we put a lot of care here.
SAM.gov's public API allows about 10 requests a day, so Opprio syncs SAM.gov once a day. At first we fetched notices for a few starter industry codes. Later we switched to syncing every notice. That came to 1,220 notices in one two-day window, and it means every user gets results.
Then we added more sources:
- Grants.gov grants
- SBIR/STTR topics. Their API was down, so we read them from the public list pages instead.
- DHS and GSA procurement forecasts, which list purchases agencies expect to make. We found the GSA feed in the browser's network log.
- Federal award history from USASpending.gov
We also added state and local bids from 1,500+ city, county and district websites. Each state's time zone is handled, and a guard keeps stale postings out. If a site's robots.txt rules don't allow automated visits, Opprio skips that site.
Tip
Small data details shape whether results feel right. On USASpending.gov, the "Start Date" is often in the future for multi-year contracts, so Opprio sorts by "Last Modified Date" instead.
A second look at every change
Every change got a separate code review. That habit caught problems no user ever saw:
- Missing results. The data fetching read only the first page of results and silently dropped most of the rest.
- A dangerous database change. One migration (a planned change to how the database is laid out) would have deleted the user table.
- Two race conditions in billing. A race condition happens when two actions run at nearly the same moment and step on each other.
Note
A second review adds a little time to each change. In return, problems like that migration get caught before any user sees them.
Alert emails people can trust
Email is the product, so we put real work into it.
- One digest per person per run. Each person gets a single email with their matches.
- No double sends. Each email is "claimed" before it goes out, so two runs can't send the same one twice.
- No expired notices. Notices past their deadline are left out.
- One-click unsubscribe. Readers can unsubscribe straight from the inbox without logging in. The link is signed, so it can be checked as coming from Opprio.
- Email verification and password reset.
- A separate sending address. Mail goes out from its own subdomain, with a DMARC record, a setting that helps inbox providers spot mail pretending to be from us.
- Safe testing. Test emails never go to reserved test domains.
Keeping it quick and steady
A few more choices keep Opprio running day to day:
- Daily matching re-checks only the notices that changed. It skips rescanning everything.
- Database migrations run before each deploy, so the code and the database stay in step.
- A health check confirms the database is reachable.
What this means for contractors
Opprio is our own product, and it shows how we work. We also offer contractor websites with bid alerts for trade contractors: a website plus a dashboard of public bids in their area. It uses the same kind of public-bid monitoring that powers Opprio. You can read more about contractor websites with bid alerts.
If you'd like to see the finished product, visit Opprio's website.
Have a project in mind?
Maybe you want a web app of your own, or you're a contractor who wants public bids alongside your website. Tell us what you need in a few lines, and we'll send you a written quote by email: a plain-English scope and an exact price. Send us a message.