Back to Work
Pizote: Automated Public Tender Scanning
Public Sector Procurement
Live

Pizote: Automated Public Tender Scanning

A live SaaS that scans Costa Rica's SICOP marketplace on a schedule, matches tenders to each client's search profile, and tells the operator which ones are worth bidding before the deadline.

FastAPINext.jsPostgreSQLRedisDockerTelegramSignal
1,086
Automated tests
51
Migrations
3
Notification channels
195
Commits
~2.5 months
Build time
Live
Status

Pizote started from a cost that is easy to underestimate: the tender a company never sees. Costa Rica's public procurement runs through SICOP, where notices, specifications, and deadlines are published across many screens and documents. A company that bids regularly has to watch all of it, every day, and still cannot prove it missed nothing.

Pizote turns that watch into a system. Each tenant defines search profiles. The platform scans SICOP on the operator's schedule, matches notices against those profiles, extracts the detail behind each tender, and pushes the best findings to the operator, who marks them viable or discards them. The live product runs at pizote.bid.

The Problem

Manual monitoring does not scale past a handful of profiles. A wrong search string hides a tender silently. Deadlines move. The documents behind a notice live on separate pages, so reviewing a shortlist means opening each one by hand. And the notification ends up in one person's inbox, where it is easy to lose.

The business requirement was not more tenders. It was confidence that a relevant tender would reach the operator in time, with the evidence needed to decide.

The Approach

FastAPI and PostgreSQL on the backend, Next.js on the front end, Redis for queues and cache, one Docker Compose stack per environment. Tenants are isolated at the data layer, and each search profile is evaluated against freshly retrieved notices.

The retrieval pipeline fetches SICOP results on a schedule, normalizes the fields, and deduplicates across runs. Tender detail is extracted on demand, so the operator can read the specification without leaving the app. Change detection uses a Redis diff as an accelerator and a durable registry as the source of truth, so an expired cache cannot make a changed document look unchanged.

Notifications are per tenant: in-app, Telegram, and Signal, each verified by the operator during setup. The schema ships as idempotent numbered migrations, and production runs the same images as development.

The Outcome

Pizote is live at pizote.bid for client companies. The suite holds 1,086 backend tests plus 109 frontend tests, across 51 migrations. The build ran from the first commit on 2026-08-09 to production in about two and a half months, 195 commits.

The operator now reviews a shortlist instead of a marketplace, and every discard is a recorded decision rather than a missed tab.

Open Pizote

Live product. The landing page is public; each client workspace is provisioned separately and requires an account.

Key Takeaway

Tender discovery is a correctness problem, not a scraping problem. The value is in proving that nothing relevant was missed.

Ready to Build Your Platform?

One 30-minute call to see if I'm the right fit. No pitch. No pressure. In English or Spanish, just a conversation about what you need to build.

Every engagement is scoped and quoted individually. There is no rate card, and no price before I understand the system. The first step is a 30-minute call, in English or Spanish; you leave it with a clear read on scope, sequence, and what the work would take.

Pizote: Automated Public Tender Scanning | LogicBison