Proposal · April 2026

Take StreamFlow from prototype to native app — beta in anglers' hands by summer.

A React Native iOS & Android beta built on the data pipeline you and your brother already started, with the three-tier subscription system wired up so paid users can convert as soon as you're ready.

Prepared For
Mike Canarelli — StreamFlow
Prepared By
Mike Kerr — ReactionGears
Engagement
Build, Beta & Handoff
Validity
30 days from April 28, 2026
Executive Summary

You've already built the hard parts. V1 is finishing the loop and putting it on a phone.

The prototype, the schema, the USGS + NOAA ingestions, the auth scaffold, and the scoring logic in Apps Script all already exist. V1 ports the scoring to TypeScript with seasonal threshold profiles and SNOTEL snowpack data, wraps the screens in a real native app, ships the full Pro+ surface — AI chat agent backed by a pgvector knowledge base, AI condition-insights layer, full trips planner, Stripe billing, threshold push alerts — and lands the app in the public App Store and Play Store well ahead of the January 2027 trade-show circuit.

1

A native iOS + Android app built in React Native & Expo from a single codebase — every screen in your prototype, hooked to live data.

2

The scoring engine ported from Apps Script to TypeScript, with seasonal threshold profiles (4 ranges per gauge — spring/summer/fall/winter) so a stream 30% above median in March (snowmelt) doesn't read the same as 30% above median in August (storm runoff). Validation layer protects user trust.

3

USGS + NOAA pipeline carried forward, plus NRCS SNOTEL snowpack data integrated for the Mountain West — Colorado, Montana, Wyoming users see real freshet-aware scoring at launch. Historic gauge + weather retention powers the day-log snapshot feature.

4

A three-tier Stripe subscription system (Free / Premium / Pro+) wired end-to-end with feature-gated overlays, so the app is monetization-ready on day one of public launch.

5

A full Pro+ AI surface: knowledge-base-backed trip-planner chat (pgvector + hybrid retrieval over your river writeups), an AI condition-insights layer that synthesizes across signals on top of the rule-based IQ panes, and an AI auto-onboard agent for new streams. Per-user spend caps and graceful fallback to rules if AI fails.

By Public Launch

One codebase. Two app stores. Ten weeks to the full Pro+ surface — seasonal-aware, SNOTEL-aware, AI-augmented.

The complete product — Pro+ AI chat agent backed by a real knowledge base, AI condition-insights layer over the rule-based IQ panes, seasonal threshold profiles, SNOTEL snowpack-aware scoring for the Mountain West, full trips planner, Stripe billing, and public App Store + Play Store release — well before your trade-show circuit kicks off in January 2027.

10
Weeks from kickoff to public launch
$10.5K
Total fixed-price investment
What V1 Ships

Every prototype screen, on a real phone, on live data.

A purposefully scoped V1: the screens an angler needs to use the app every day, the billing rails to monetize them, and the smallest AI surface that actually moves the needle. AI chat, the full trips planner, and public-store release are deferred to follow-on phases — quoted separately so you only commit to what you actually want next.

High-Level Architecture

Tier 1 · Mobile App

React Native + Expo (iOS + Android, single codebase)

  • Stream list + IQ scoring
  • Stream detail (CFS, height, IQ, 10-day forecast)
  • Map (USGS gauges + user pins)
  • Add stream / request stream
  • Thresholds + threshold editor
  • Log a day + logbook
  • Profile, settings, notifications, help
  • Native GPS, camera, push
Tier 2 · API & Scoring Engine

Node.js + TypeScript (ported from Apps Script · seasonal-aware)

  • Stream IQ (CFS / height by stream type)
  • Weather IQ (clouds, pressure, rain, wind)
  • Fish IQ composite (~85 / 15 + trend)
  • Seasonal threshold profiles (4× per gauge)
  • SNOTEL snowpack-aware adjustments
  • Trend detection (rising / falling / steady)
  • AI condition-insights layer (Gemini Flash)
  • Validation layer + sanity bounds + fallback
Tier 3 · Data · AI · Subscriptions

USGS + NOAA + SNOTEL · pgvector RAG · Stripe · Push

  • Existing USGS gauge ingestion (kept)
  • Existing NOAA weather ingestion (kept)
  • NRCS SNOTEL snowpack ingestion (new)
  • Historic gauge + weather + SWE retention
  • pgvector knowledge base (river writeups)
  • Hybrid retrieval (semantic + keyword + rerank)
  • Pro+ trip-planner chat (Sonnet for synthesis)
  • AI auto-onboard agent for new streams
  • Per-user AI spend caps + low-confidence fallback
  • Stripe subscriptions (Free / Premium / Pro+)
  • Apple + Google push notification fan-out
Tier 4 · Infrastructure & Observability

DigitalOcean · PostgreSQL + pgvector · GitHub Actions · Sentry · TestFlight + Play

  • Single-bill DO droplet for API + DB + vector store
  • Neon → DO Postgres migration (W1 decision)
  • Merge-to-main → automated build
  • TestFlight + Play internal beta delivery
  • Sentry error logging (mobile + backend)
  • Source-maps uploaded for human-readable stack traces
  • Release tagging tied to GitHub Actions builds

Component Breakdown

Six tightly-scoped components, each independently deliverable.

Native Mobile App (RN + Expo)

  • Every screen from your prototype, rebuilt as native components
  • One codebase compiles to iOS (.ipa) and Android (.apk)
  • Native GPS, camera, push, and speech-to-text capabilities available
  • Auth carried forward from your brother's existing scaffold

Scoring Engine + Seasonal Profiles

  • Stream / Weather / Fish IQ ported to typed, ordered TypeScript
  • Stream-type-aware weighting (freestone / tailwater / spring creek)
  • Seasonal threshold profiles — 4 ranges per gauge (spring/summer/fall/winter), date-aware switching, region-configurable season boundaries
  • Snowpack-aware adjustments: SWE ≥140% of median + warming temps → freshet flag downgrades fishability automatically
  • Trend detection — "low but rising" reads as improving
  • Validation layer with sanity bounds + low-confidence fallbacks instead of silent bad numbers

Data Pipeline + SNOTEL + Historic Retention

  • Existing USGS + NOAA cron ingestions carried forward, verified end-to-end
  • NRCS SNOTEL ingestion via the public Awdb REST endpoint — daily SWE + snow depth pulled and mapped to gauges by HUC-8 / proximity-to-headwaters
  • Historic gauge + weather + SWE snapshots retained at ingestion cadence
  • Powers the day-log "snap conditions to the time I was at the stream" feature
  • Postgres on DigitalOcean (with pgvector extension) — one DB, one bill, one backup

Stripe Subscriptions (Free / Premium / Pro+)

  • Stripe products + monthly + annual prices configured
  • In-app subscribe / upgrade / cancel flow (RevenueCat or Checkout — confirmed Week 1)
  • Three tiers gated on the same screens via blur-plus-padlock overlays
  • Webhook lifecycle handling: active → past_due → canceled, with clean tier downgrades
  • Beta defaults to Pro+ free; one config flag flips users to paid tiers when you're ready

AI Auto-Onboard for New Streams

  • User requests a stream → agent looks up the gauge automatically
  • Infers stream type (freestone / tailwater / spring creek)
  • Sets safe default seasonal fishable / ideal thresholds based on historic data
  • Notifies the user when their stream is live — replaces the manual admin step
  • Cheap-model routing (Gemini Flash) keeps API costs at single-digit dollars/month at beta scale

Pro+ AI Chat + Knowledge Base (pgvector)

  • "How should I fish Penns the third week of May?" inside the trip-planner screen
  • pgvector on the same Postgres instance — one DB, no separate vector store, no extra service to operate
  • Hybrid retrieval: tsvector keyword match + cosine-similarity embeddings + reciprocal rank fusion, routed by query intent
  • Markdown-with-frontmatter content schema (river / region / type / season / hatches / flies / gear / regs / access)
  • Ingestion pipeline with admin upload UI + CLI, re-indexes on every content change
  • Chat UI shipped in V1 so you can grow the corpus during beta — Sonnet 4.6 for synthesis quality
  • Hard per-Pro+-user monthly token budget (configurable per Stripe tier)
  • Low-confidence retrieval fallback: "I don't have specific information about [river] [season] yet — here's what live conditions look like" rather than confidently making things up

AI Condition-Insights Layer

  • Renders under the existing rule-based Stream/Weather/Fish IQ panes — rules stay the trustworthy floor, AI is the synthesis on top
  • Forward-looking, multi-signal: "Pressure has been dropping all afternoon, water temps climbing into the early-hatch zone — expect bug activity to peak around dusk"
  • Pre-computed server-side on the ingestion cron, cached by `(stream_id, scoring_window)` — 200 users opening Penn's = 1 LLM call, not 200
  • Hard per-stream daily generation cap (default 6/day, config-tunable)
  • Graceful fallback: if the AI call fails, times out, or hits the cap, the rule-based IQs still render and the insights pane shows "AI insights paused — try again at next data refresh"
  • Gemini 2.5 Flash for cost-efficiency on short structured outputs

Push Notifications + Native Capabilities

  • Threshold alerts: "Penn's is in your ideal range"
  • Native iOS APNs + Android FCM fan-out
  • GPS for "streams near me" / drop-pin on map
  • Camera + photo upload for the day-log
  • Optional speech-to-text for log entry (gloves-on use case)
Looking Ahead — V2

One thing intentionally held back for V2.

V1 ships the full Pro+ surface — AI chat, full trips planner, Stripe billing, public App Store + Play Store release. The only thing intentionally deferred is the social layer, which is its own design problem and deserves a dedicated engagement once V1 has real users.

Phase V2 · Social

Friends · Feed · Leaderboards · Year-in-Review

Strava-style friend feed, public / private profiles, year-in-review montage video, leaderboards (longest fish, most days, etc.), and AI catch-image verification for honor-system-resistant PRs.

Why V2: Out of V1 scope per our call. The user model in V1 is architected so this can be a clean addition later rather than a rewrite. Best built once V1 has real anglers using it and we can see what social features they actually want.

Implementation Phases

Ten weeks. Five milestones. Full Pro+ surface in users' hands.

Sequenced so the app runs on your phone by end of Week 3, the engagement layer (logbook, push, AI auto-onboard, full trips planner, knowledge-base infrastructure) lands by Week 6, and the Pro+ AI chat, condition-insights layer, billing, and public store release wrap by Week 10. I work full-time on one project at a time. There won't be a week where I'm "getting back to it."

Delivery Timeline · 10-Week Engagement
Foundation Scoring + Seasonal + SNOTEL Core App Engagement + Trips + KB Infra AI Chat · Insights · Billing · Stores Milestone
Workstream
Wk1
Wk2
Wk3
Wk4
Wk5
Wk6
Wk7
Wk8
Wk9
Wk10
FoundationInfra · RN · CI/CD
DO · RN · CI/CD
Scoring + PipelineApps Script → TS · seasonal · SNOTEL
TS port · seasonal · SNOTEL
Core Mobile AppList · Detail · Map · Thresholds
Live data · TestFlight
Engagement + KBDay-log · push · trips · pgvector pipeline
Logbook · AI onboard · push · trips · KB schema + ingestion + pgvector
AI Chat · Insights · Billing · StoresPro+ chat · insights layer · Stripe · public
Pro+ AI chat · condition insights · Stripe 3-tier · App Store + Play public
Kickoff
Week 1
Foundation begins
App on Your Phone
End of Week 3
Live data, TestFlight
Engagement + KB Live
End of Week 6
Logbook · trips · KB ingestion ready
Public Launch
End of Week 10
AI chat · insights · billing · stores
Wk
1
Week 1·Foundation & Infrastructure

Stand up the rails everything else runs on.

Get the DigitalOcean droplet provisioned, the React Native repo scaffolded from your prototype, auth carried forward from your brother's work, CI/CD wired up so every merge to main builds to TestFlight and Play internal, and Sentry error logging instrumented across mobile and backend so you see real-world crashes the moment they happen.

  • DigitalOcean droplet provisioned, API + DB stack chosen
  • RN + Expo project scaffolded, prototype screens stubbed in
  • Auth carried forward from existing repo
  • GitHub Actions: merge to main → build → TestFlight + Play internal
  • Sentry error logging wired across mobile (RN SDK) + backend (Node SDK), source-maps uploaded, releases tagged from CI
  • Neon → DO Postgres migration decision locked in
Deliverable: Project setup complete · DO infra provisioned · RN repo scaffolded · CI/CD wired · Sentry monitoring live.
Wk
2
Week 2·Scoring Engine + Seasonal Profiles + SNOTEL

Get the brain right — and Mountain-West-ready — before the body wraps around it.

Port the existing Apps Script scoring pipeline to typed, ordered TypeScript. Add seasonal threshold profiles (4 ranges per gauge) so March snowmelt and August storm runoff don't read the same. Stand up NRCS SNOTEL ingestion and wire snowpack-aware adjustments into the scorer. Verify USGS + NOAA ingestions are running clean and turn on historic retention.

  • Stream IQ, Weather IQ, Fish IQ all ported to TypeScript
  • Stream-type-aware weighting (freestone / tailwater / spring creek)
  • Seasonal threshold profiles — 4 fishable/ideal ranges per gauge (spring/summer/fall/winter), region-configurable boundaries
  • NRCS SNOTEL ingestion — daily SWE + snow depth, mapped to gauges by HUC-8 / proximity-to-headwaters
  • Snowpack-aware scoring: SWE ≥140% of median + warming temps → freshet flag downgrades fishability
  • Trend detection — "low but rising" reads as improving
  • Validation layer: sanity bounds + low-confidence fallback paths
  • USGS + NOAA + SNOTEL ingestions verified end-to-end, historic retention live
Milestone 1: Scoring engine ported · seasonal profiles live · SNOTEL ingesting · validation layer · all three pipelines verified.
Wk
3
Week 3·Core Mobile App

The screens you use every day, on a real phone, on live data.

List, detail, map, thresholds, weather, favorites — all hooked to the live scoring engine and ingestion pipeline. By end of Week 3, you'll be using a TestFlight build of the app on your phone for real conditions checks.

  • Stream list with IQ scoring + "X streams in ideal condition" banner
  • Stream detail: CFS + height, fishable / ideal ranges, 10-day forecast
  • Map with USGS gauges + user pins, search, zoom-to-add
  • Per-stream threshold customization + editor
  • Profile, settings, notification prefs, help, weather screens
Milestone 2: Core app live on live data, running on TestFlight on your phone.
Wks
4–6
Weeks 4 – 6·Engagement Layer + Trips + Knowledge-Base Infrastructure

Alerts, history, trip planning — and the rails the Pro+ chat will run on.

Day-log, logbook, AI auto-onboard, push notifications, and the full trips planner. Plus the knowledge-base infrastructure stood up on pgvector — schema, ingestion pipeline, hybrid retrieval, and chat UI shell — so you can start writing river content during this phase and have a substantial corpus by public launch.

  • Log a day: location, time, conditions snapshot, photo upload
  • Logbook history view with filters and counters
  • AI auto-onboard agent for new stream requests (seasonal-aware)
  • Threshold-based push alerts via APNs + FCM, prefs screen wired
  • Full trips planner: countdown, contacts, packing checklist, AI "what to pack" assistant
  • Knowledge-base schema — markdown w/ structured frontmatter (river / region / type / season / hatches / flies / gear / regs / access)
  • Ingestion pipeline — drop a `.md` or use admin upload UI, pgvector index rebuilds automatically, CLI + admin button
  • Hybrid retrieval — tsvector keyword + cosine-similarity embeddings + reciprocal rank fusion, intent-routed
  • Trip-planner chat UI shell wired to the retrieval layer (real responses for any seeded river)
  • "Preview-how-this-content-will-retrieve" tool so your river writeups can be sanity-checked before going live
Milestone 3: Engagement layer live · full trips planner · KB infrastructure live and ready to ingest river writeups during beta.
Wks
7–10
Weeks 7 – 10·Pro+ AI Chat · Insights Layer · Stripe · Public Launch

The full Pro+ surface, monetization rails, and a public launch.

Pro+ trip-planner chat agent reading from the pgvector knowledge base you've been seeding since Week 4, the AI condition-insights layer rendered under the rule-based IQ panes, Stripe subscriptions wired across three tiers with feature-gated overlays, App Store + Play Store listings prepared and submitted for public review, and a polish pass against the field-testing fixes from Weeks 4–6.

  • Pro+ AI chat agent — Sonnet 4.6 for synthesis quality, reads pgvector KB, low-confidence fallback when retrieval is weak
  • Hard per-Pro+-user monthly token budget cap, configurable per Stripe tier (Free: 0 · Premium: small · Pro+: full)
  • AI condition-insights layer rendered under the rule-based IQ panes — pre-computed server-side, cached by `(stream_id, scoring_window)`, daily generation cap, graceful fallback
  • Gemini 2.5 Flash for short-form insights, Sonnet 4.6 for trip-chat synthesis — model choice per workload
  • Stripe products + monthly + annual prices configured for all three tiers
  • In-app subscribe / upgrade / cancel flow (Apple + Google compliant)
  • Three-tier feature gating with blur-plus-padlock overlays
  • Webhook lifecycle handling (active / past_due / canceled)
  • App Store + Play Store listings, screenshots, copy, review submission
  • Field-test fixes against real-stream data quirks · handoff docs
Final delivery: Pro+ AI chat live · condition-insights rendered · Stripe wired · App Store + Play Store public submission complete · handoff docs delivered.
Investment

One fixed-price engagement. Five milestones. Zero surprises.

Below is the total V1 investment, broken down by milestone and tied to deliverables. Infrastructure, store fees, and AI API costs are paid by you directly — nothing flows through me.

Total V1 Investment

Build, ship, and hand off the full Pro+ surface.

Includes foundation, scoring engine port with seasonal profiles + SNOTEL, core mobile app, full engagement layer + trips planner, knowledge-base infrastructure on pgvector, Pro+ AI chat, AI condition-insights layer, Stripe subscriptions, and public App Store + Play Store release. Ten-week engagement, fixed price, no hourly clock-watching.

$10,500
Fixed price · USD · 10 weeks · 5 milestones
Deposit

Foundation & Kickoff

$2,100
Week 1 · DO + RN + CI/CD wired
M1

Scoring + Seasonal + SNOTEL

$2,100
Week 2 · Engine ported · SNOTEL ingesting
M2

Core Mobile App

$2,100
Week 3 · App on TestFlight
M3

Engagement + Trips + KB Infra

$2,100
Wks 4–6 · Trips · pgvector pipeline live
Final

AI Chat · Insights · Billing · Stores

$2,100
Wks 7–10 · Pro+ chat · insights · public launch

Payment Schedule

Total · $10,500
1
Deposit · Project Kickoff
Triggered by signed agreement · DO infra provisioned · RN repo scaffolded · CI/CD wired · Sentry error logging live across mobile + backend
20%
$2,100
2
M1 · Scoring Engine + Seasonal + SNOTEL (Wk 2)
Apps Script ported to TS · 4-season threshold profiles per gauge · NRCS SNOTEL ingestion + snowpack-aware scoring · validation layer · USGS + NOAA + SNOTEL all verified · historic retention live
20%
$2,100
3
M2 · Core Mobile App
List, detail, map, thresholds, weather, favorites — all on live data, running on TestFlight
20%
$2,100
4
M3 · Engagement + Trips + KB Infrastructure (Wks 4–6)
Day-log · logbook · AI auto-onboard agent · push alerts · full trips planner with AI pack assistant · knowledge-base schema, ingestion pipeline, hybrid retrieval on pgvector, chat-UI shell ready for content seeding
20%
$2,100
5
Final · AI Chat · Insights · Billing · Public Launch (Wks 7–10)
Pro+ trip-planner AI chat (Sonnet over pgvector KB) · AI condition-insights layer rendered under rule-based IQs (Gemini Flash, cached, capped) · per-user spend caps · low-confidence retrieval fallbacks · Stripe 3-tier subscriptions + feature gating · App Store + Play Store public submission · handoff docs
20%
$2,100

What's Included Beyond the Build

  • Apple Developer + Google Play account setup walk-through
  • Stripe configuration, products + prices setup, first-run debugging
  • Sentry account setup, mobile + backend SDK instrumentation, source-map upload pipeline, release tagging from CI
  • Two rounds of revisions per milestone
  • Slack / email throughout — same-day responses on weekdays
  • Handoff docs: deployment runbook, common-issue playbook, architecture diagram

What You Pay Directly (Not Through Me)

  • Apple Developer ($99/yr) + Google Play ($25 one-time) account fees
  • DigitalOcean + domain costs — expect ~$10–20/mo for V1 beta scale
  • Sentry — free Developer plan covers V1 beta scale; Team plan ($26/mo) only if event volume warrants it
  • AI API costs — Gemini Flash for auto-onboard + condition-insights, Sonnet for trip-planner chat. Per-stream and per-Pro+-user caps in code; expect single-digit dollars/month at beta scale, scaling with paid Pro+ users
  • Stripe transaction fees (standard 2.9% + 30¢ when you start charging)
  • The deferred follow-on phases — quoted separately when you're ready
Why This Approach

The shape of this proposal isn't accidental.

A few things worth calling out about the choices made here — and the choices deliberately not made.

You already have the hard parts started.

Schema, ingestions, auth scaffold, scoring logic — they're already done or in flight. V1 is finishing what's there and putting a real app on top, not starting over from zero.

Full Pro+ surface in V1.

Anglers walking up to your trade-show booth see the complete product — Pro+ AI chat, full trips planner, Stripe billing, public App Store release — not a stripped-down preview. The version anglers download is the version that converts to paid, not a teaser of one.

One codebase, two stores.

React Native means we don't build twice and we don't maintain two languages. One merge to main ships to TestFlight and Play internal, automatically. iOS and Android stay in lock-step from day one.

Trade-show timing has slack.

Ten weeks of build + months of public-soft-launch tuning before January means we're not shipping a rushed product to your booth. By the time the trade-show circuit kicks off, the app has been through real anglers' hands, the Mountain West users have validated the seasonal/SNOTEL story, and your river writeups have seeded a substantial AI knowledge base.

V2 social has a defined home.

When you're ready for Strava-style friend feeds, leaderboards, and year-in-review montages, V2 has a defined scope and gets a separate engagement — not scope creep mid-build. The V1 user model is architected so V2 layers on cleanly.

Consolidated infrastructure.

DigitalOcean keeps your monthly bill predictable instead of nickel-and-diming across Vercel + Supabase + Pinecone. One droplet, one bill — and when you scale beyond V1, the same droplet handles it well past your first thousand users.

How We Work

No two-week black boxes.

The operating rhythm for the engagement, in five lines.

What I Need from You to Start

Five light-lift items.

Most are administrative. The longest one is probably setting up the Apple Developer team — Apple's onboarding can take a few days, so we kick that off in Week 1 in parallel with infrastructure.

1

DigitalOcean account

Either yours or one I create on your behalf and transfer over. ~$10–20/mo for V1 beta scale.

2

GitHub access

Invite to your existing monorepo plus a new repo for the React Native mobile codebase.

3

Apple Developer enrollment

$99/yr Apple Developer Program enrollment for TestFlight distribution. Started Week 1.

4

Google Play Console

$25 one-time Google Play Console account for Play internal-track distribution.

5

Stripe account

For the subscription gateway — set up by Week 6 ahead of the Wks 7–10 billing milestone.

6

Sentry account

Free Developer plan is fine for V1. I wire it up in Week 1.

7

30-min kickoff call

Once we sign — to walk through accounts, GitHub access, and lock in the Week 1 plan.

Let's get the app on real anglers' phones before summer.

This proposal is valid for 30 days. Reply on Upwork with any feedback, then accept the milestone offer and we'll have a kickoff call inside 24 hours — Week 1 starts the same week.

01

You Review

Read this through, flag anything off-base, push back where it matters.

02

Accept on Upwork

Milestone-based contract matching the schedule in this proposal.

03

Kickoff Call

30 minutes via Upwork's call feature — DO account, GitHub access, Apple Developer enrollment kicked off.

04

Week 1 Begins

Foundation laid down inside seven days. App on your phone by end of Week 3.