← All case studies
2026Own product

Opportunity OS — public funding you don't have to search for

FlutterPythonFirebase FunctionsClaude APIPlaywright

Context

Korean public funding notices are scattered across dozens of sites, and most founders simply don't know which ones they qualify for. Recommendation, not search, seemed like the right primitive.

Problem

Side projects like this usually end up feature-complete and unused. Preventing that turned out to be harder than any of the engineering.

Decisions

Kept the API key out of the app

AI business-plan drafting runs through a Firebase Cloud Function that calls the Claude API server-side. The key exists only as a server secret and never enters the app bundle; the client authenticates anonymously to reach the function.

Cut the backend behind an interface so it can be replaced

The app depends only on an `AiBackend` interface. Migrating from Firebase Functions to a proper NestJS server means swapping one implementation — no screen code changes.

Wrote the promotion criteria before writing the features

Each roadmap stage carries an explicit condition for earning the next one. v1→v2 requires that I personally use it for two weeks and actually apply to at least one posting. v2→v3 requires three founders saying they would pay. Fail the condition and the next stage does not get built.

Cached detail extraction so re-runs cost nothing

Eligibility, scope and selection criteria are extracted from each notice's detail page and fed into the fit score, with results cached in `detail_cache.json` for reuse on subsequent runs.

What I owned

  • Product definition
  • Crawler engineering
  • App development
  • Serverless backend
  • Roadmap design

Actual deliverables

  • Flutter app (single codebase for web, Android, iOS)
  • watcher.py collector — scrapes and scores public funding notices
  • SPEC.md — staged roadmap with written promotion criteria

Honestly — what I didn't get done

This is still at v0. There are no paying users yet, and by its own promotion criteria the commercial v3 does not get built until that changes. That restraint is the most important decision I made on this project.

If you need this kind of work

Describe the thing you're currently stuck on. I'll reply by first separating what I can take on from what I can't.

Other case studies