Inspiration
Every sustainability tool I looked at answers the same question: how much carbon does this emit? You get a number.
But nobody making a real packaging decision needs a measurement. They need to know which option to choose — and, more importantly, how fragile that answer is. Real supply chains move. Routes get longer when a supplier changes. Recycled content varies between production runs. Product weights shift. Disposal routes differ by region.
A comparison that was correct when it was made can quietly become wrong six months later, and nothing in a conventional carbon calculator will tell you that. The decision looks just as confident after it stops being true.
That gap — between measuring impact and making a decision that survives contact with reality — is what FlipPoint was built to close.
What it does
Compares 2–4 packaging options across production, transport, and disposal, showing where the impact actually sits instead of collapsing it into a single eco-score.
Ranks what matters. Sensitivity analysis orders every assumption by how much it could move the outcome — so you know whether to argue about disposal routes or stop arguing about transport.
Finds the break-even point. The exact value at which two options become equivalent. Below it, choose A. Above it, choose B. One sentence a procurement team can actually apply.
Simulates live what-if scenarios. Drag a slider — mass, distance, recycled content — and the full comparison recalculates in real time.
Detects the Decision Flip. When a changing assumption crosses its modeled threshold and the recommendation reverses, FlipPoint flags the moment explicitly instead of quietly swapping the answer. A "Why did it flip?" panel shows the previous winner, the new winner, what changed, and which threshold was crossed.
Explains the result in plain English — using AI strictly as a narrator over numbers the engine already computed.
Exports and shares. Download the whole decision — recommendation, every break-even, every source — as one file. Or share the exact scenario as a link, with no account needed.
How I built it
Stack: Next.js 16 · TypeScript · Tailwind · Zustand · Zod · Vitest · deployed on Vercel
User inputs (material, mass, recycled content, transport, disposal)
↓
Deterministic calculation engine ← 16 emission factors, each cited
↓
Impact comparison → Sensitivity analysis → Break-even solving
↓
What-if recalculation → Decision Flip detection
↓
AI explanation layer (read-only, over already-computed results)
The design constraint: AI never calculates
This is enforced structurally, not by prompt instruction.
The language model receives results the engine has already computed and produces prose describing them. Every response is checked against the exact figures it was given, and anything containing a number it wasn't handed is discarded in favour of a deterministic template.
The explanation layer degrades in three stages: primary provider, then a fallback provider, then a deterministic template that needs no API key at all. Every stage passes through the same guardrail. Disable AI entirely and every figure in the application is identical.
The reasoning: an environmental tool that hallucinates an emission factor is worse than no tool at all, because it produces confident wrong decisions that feel trustworthy.
Real emission factors, fully traced
Sixteen factors across four materials (PET, HDPE, PP, and paperboard), each carrying its source name, direct URL, publication year, access date, the specific table the value came from, GWP time horizon, region, and an explicit assumption list.
Sources: Franklin Associates LCI, US EPA WARM v13, US EPA eGRID 2023, UK DEFRA/DESNZ 2024, ENERGY STAR.
Unit conversions are documented in the data itself rather than buried in code — WARM publishes in MTCO₂E per short ton, and the conversion to kg CO₂e/kg ships alongside each value.
Paper and plastic factors use different carbon-accounting conventions (WARM treats paper combustion CO₂ as biogenic and credits recycled paper with forest carbon sequestration), so that difference is disclosed in both the README and the in-app methodology rather than hidden.
Verification
224 tests cover the engine, sensitivity analysis, break-even solving, Decision Flip detection, the AI guardrail, share-link encoding, and the export format.
The landing page's flip example is computed at build time from the real engine. If the seeded scenario ever stops producing a genuine flip, the build fails rather than displaying a fabricated one.
Challenges I ran into
The hardest problem was a number I decided not to use.
PLA is the obvious "sustainable plastic" to include, and leaving it out makes the tool look less complete. But published cradle-to-gate figures for PLA disagree by roughly 5×. The industry's own reported value is the lowest, and it depends on renewable-electricity-mix and biogenic-carbon assumptions that aren't disclosed consistently across studies.
Picking either number would have misrepresented the uncertainty. So I didn't pick one. PLA is documented as a verified gap, with both candidate sources and the reason recorded, surfaced directly in the material dropdown — and the engine rejects any calculation requiring an unverified factor.
That was uncomfortable, because a missing material reads as an unfinished feature. But a tool whose entire premise is "AI never invents a number" has no business inventing one itself the moment it becomes inconvenient.
The same rule applied elsewhere: recycled PP is excluded because EPA WARM v13 states its recycling pathway is only modeled for HDPE and PET due to LCI data limitations. Where a source names its own limits, the tool respects them.
Designing a flip that's honest rather than dramatic. It's easy to build a slider that makes bars move impressively. It's much harder to detect a genuine threshold crossing in a deterministic model and explain it without overstating the confidence of the underlying data. The break-even logic went through several rewrites before I trusted it.
Keeping the AI layer honest under failure. When the primary provider returned an error mid-development, the system fell straight to the deterministic template — technically correct, but it meant a configured fallback never ran. Fixing that properly meant distinguishing "provider not configured" from "provider failed at runtime", and making sure the fabrication guardrail applied identically on every path.
Accomplishments that I'm proud of
The documented-gap system. It would have been faster and more impressive-looking to fill every material with a plausible number. Building the discipline into the engine instead — so an unverified factor stops the calculation rather than silently producing an answer — is the part of this project I'd defend hardest.
Also the scope honesty. FlipPoint states upfront that it produces modeled decision-support estimates, not a certified Life Cycle Assessment. Under-claiming was deliberate.
What I learned
The build was AI-assisted throughout, and the part that wasn't was the part that mattered. Claude Code wrote the components; it could not tell me whether Franklin Associates' 2010 resin figures were defensible, whether WARM's own stated LCI limitations meant I should stop rather than substitute, or whether a 5× disagreement across PLA studies was noise or a real methodological split. That evaluation — reading sources, checking GWP bases, deciding which numbers I was allowed to use — was the actual work.
Most of my previous work has been AI-agent projects, where the model sits in the critical path and the interesting engineering is in prompting and orchestration. This was the reverse: the hard requirement was keeping the model out of the critical path entirely, and making correctness come from tested deterministic math instead of model output. That inverted almost every instinct I'd built up. Instead of asking what else the AI could do, the question every time was what it must never be allowed to touch.
I also learned how much of environmental modeling is source evaluation rather than computation. The arithmetic is not difficult. Deciding whether a published figure is defensible — checking its GWP basis, its data vintage, what it excludes, whether an industry-reported number has been independently cross-checked — is where the real work is, and it determines whether the output means anything at all.
Earth Forward impact
The largest environmental wins don't happen at measurement time. They happen at decision time — when someone picks a material, a route, or a disposal pathway, usually with no visibility into how fragile that choice is.
Measuring a footprint after the fact changes nothing. Changing which option gets chosen changes everything downstream of it.
The demo scenario makes this concrete: the same recycled cup is 37.4 g CO₂e in landfill, 58.5 g burned for energy, and 16.7 g recycled. Less than half the impact — determined entirely by a decision made after the cup is thrown away. That's the kind of leverage a single carbon number never surfaces.
And by refusing to fabricate factors it can't verify, FlipPoint avoids the failure mode that does real damage in this space: confident sustainability claims built on numbers nobody checked.
What's next for FlipPoint
- Expand the verified factor set, resolving documented gaps like PLA through full-text review of the meta-analyses already recorded as candidate sources
- Add regional grid-mix variation so results reflect where production actually happens
- Support user-supplied emission factors with mandatory source attribution, so teams can add their own supplier data under the same traceability rules
- Migrate GWP basis from IPCC SAR to AR6 where source data permits
- Accounts and saved decision history, so a team can revisit a choice months later and check whether the assumptions still hold
Hackathon disclosure
Built entirely during the NextStep Hacks 2026 window (21 August – 20 September 2026). No pre-existing code was carried into this project. Developed solo, with Claude Code as an AI pair-programmer throughout.
Built With
- gemini
- google-ai
- nextjs
- react
- tailwindcss
- typescript
- vercel
- vitest
- zod
- zustand

Log in or sign up for Devpost to join the conversation.