Let That Sink In — About the project

Stuff for the hackathon submission form.


Inspiration

(If the form asks for “inspiration,” this is really our motivation.)

We wanted to ship something concrete in a day, not get stuck defining the problem forever. This track was motivating because it was already scoped and there was an API to hook into—so we could focus on building instead of spiraling on “what are we even making.”


What it does

Cula already models the chain (events, masses, proof files linked in). They don’t check that those proofs actually say what the data claims, or that what someone enters in the UI matches reality.

We add validation on top of that: we pull the same proofs, extract numbers from PDFs/images (Textract + template matching on images; Claude on Bedrock for PDFs and when the cheap path fails), and compare to what’s stored in Cula—flagging when things drift past a tolerance (~5%).

We also validate user-side input against the files: date/location we can infer from images (and EXIF where it exists) vs what the frontend says was submitted—e.g. location within ~1km, dates that aren’t nonsense vs the claim. So it’s not only “does the doc parse” but “does it match what the user told us.”


How we built it

FastAPI backend, React frontend, Docker for running it. Backend parses the sink JSON into transport vs step nodes and exposes that to the app. Evidence goes through download → extract → compare; OpenCV crops before Textract, Bedrock when we need it. Nothing fancy on purpose—just enough glue to demo.


Challenges we ran into

  • Wanted clean structure early (tests, PR discipline) but a hackathon is short—we had to ship a thin vertical slice first and only then tighten things.
  • Real scans are ugly; that’s why we didn’t bet everything on one OCR pass.
  • The event graph mass numbers are easy to misread if you compare the wrong steps (e.g. biomass vs char)—took a bit to agree what we’re actually checking.
  • AWS setup (Bedrock, Textract, keys, regions) + not hammering APIs on every refresh.

Accomplishments that we're proud of

  • Graph parsing stayed modular—same shapes for transport vs machine nodes, easy to extend.
  • Image pipeline uses template matching + Textract before falling back to an LLM—not “paste PDF into ChatGPT” as the whole product.
  • Actually connected API → graph → checks in one flow.

What we learned

You can get a lot done in a day if the scope is tight. Team energy helps more than perfect architecture. And it’s ok to skip some best practices for 24h as long as the demo path works.


What's next for Let That Sink In

import time

time.sleep(86400)  # sleep one day

Built With

Share this project:

Updates

Submission history