Finventory
Inspiration
Seafood has a 30–40% waste problem — but it's not a storage issue. Fishermen overfish because they operate blind: they don't know what buyers actually need until they're already at sea. They catch everything they can legally take, then hope someone buys it. When demand doesn't match the catch, perfectly good fish gets dumped. We built Finventory to close that information gap — so fishermen only catch what already has a buyer.
What It Does
Finventory is a pre-landing demand marketplace. Instead of fishing first and selling later, buyers post what they need before the boats go out. Fishermen see confirmed demand (species, quantity, grade, price, delivery window) and fish to order — not to hope.
Key mechanics:
- Standing orders — buyers set recurring needs (e.g., "500 lbs Grade A salmon, weekly, $4/lb, within 50 miles")
- Demand aggregation — fishermen see total market demand before departing, adjusting catch plans to match real orders
- Catch-to-order matching — list what you will catch against confirmed demand, not speculative inventory
- Freshness guarantee with auto-downgrades — sushi-grade auto-downgrades after 48 hours to prevent fraud
- QR pickup confirmation — scan-to-transfer releases payment only when buyer takes possession
How We Built It
Stack: React + TypeScript, Firebase (Firestore, Functions, Auth), Node.js
- Standing order matching engine — Cloud Function triggers on new listings, matching against buyer criteria (species, grade, radius, price)
- Demand dashboard — real-time view of unfulfilled standing orders by species/region to guide fishing decisions
- Geohash spatial queries — filter by distance without heavy PostGIS overhead
- Grade expiration logic — background job downgrades sushi→A at 48 hours to maintain safety standards
ML Pipeline
Our ML pipeline is built around Marimo for interactive, reproducible notebooks and Sphinx for auto-generated API documentation that keeps model documentation in sync with code.
- Marimo replaces static Jupyter notebooks for model development. Its reactive execution model means that when upstream data or feature logic changes, all dependent cells automatically re-run — critical for freshness scoring models where
landing_date,storage_temp_celsius, andstorage_methodinputs are interdependent. Marimo notebooks are also plain Python files, making them trivially diffable and version-controllable in our existing Git workflow. - Sphinx auto-generates documentation for our feature engineering modules and model interfaces directly from docstrings. This keeps our matching engine and freshness scoring logic documented without a separate manual process — important when the model schema evolves alongside the marketplace data model.
- Impulse AI accelerates our model iteration loop. We use Impulse to manage experiment tracking, hyperparameter sweeps, and model versioning for the demand forecasting and catch-to-order matching models. Its integration with our Firebase data pipeline means we can trigger retraining runs directly from new standing order data, and the built-in A/B testing framework lets us safely roll out updated matching weights to a subset of fishermen before full deployment.
Challenges We Ran Into
The "chicken and egg" problem: Buyers won't post demand without fishermen; fishermen won't join without demand. We solved this by letting buyers create non-binding standing orders — expressions of interest that convert to firm orders only when matched.
Time-to-landing uncertainty: Fishermen don't know exactly when they'll return. We built delivery windows (e.g., "Tuesday AM") instead of exact timestamps, with freshness scoring that adjusts based on actual landing time.
Trust without escrow: B2B seafood deals are high-value ($10K+). Buyers need to inspect before accepting. We designed QR-code pickup confirmation — both parties scan to transfer ownership and trigger payment, but inspection happens at pickup, not pre-payment.
Accomplishments We're Proud Of
- Demand-before-supply model — flipped the traditional seafood marketplace from "catch then sell" to "demand guides catch"
- Waste prevention metric — system tracks "diverted from waste" by matching previously unmatched standing orders
- Sushi-grade certification tracking — explicit fields for
certification_typeandcertifying_bodyto prevent raw-consumption liability - Real-time freshness scoring — computed from
landing_date,storage_temp_celsius, andstorage_method(ice vs. refrigerated vs. live tank)
What We Learned
- Fishermen care about price floors, not just buyers. Standing orders with committed prices reduce the "race to the bottom" when boats return simultaneously.
- Catch date ≠ freshness. Buyers care more about
landing_date+storage_methodthan when the fish was caught. A 3-day-old fish on ice can be fresher than "today's catch" left on deck. - Overfishing is an information problem. When fishermen see unfulfilled demand for underutilized species, they shift effort away from overfished stocks.
What's Next for Finventory
- Logistics marketplace — integrate refrigerated trucking bids so fishermen see door-to-door economics before leaving port
- Seasonal forecasting — suggest catch plans based on historical demand patterns + migration data
- Regulatory integration — quota tracking so fishermen know remaining catch allowance in real-time
- Processing layer — let buyers request custom processing (filleting, H&G) at landing, reducing their labor costs
Built With
- css3
- fastapi
- firebase
- firestore
- gcp
- gemma
- google-research
- impulse-labs
- marino
- pgvector
- pytorch
- react
- sphinx
- typescript
- vega-altair
- vite
Log in or sign up for Devpost to join the conversation.