This is a submission for the Hacktoberfest Weekend Challenge: Build for a Friend
What I Built
CircleUp answers one question my friends and I keep getting wrong: when can we actually hang out this week?
The honest answer isn't "when am I free" — it's "when am I free and not about to miss something." Our timetables are PDFs. Our deadlines live in Moodle. Nobody cross-references the two, so we either skip hanging out entirely during a heavy week, or we go out on a Thursday and regret it on Friday morning.
So I built CircleUp. Give your timetable and it pulls your Moodle deadlines. It finds your free windows, labels each one good / risky / avoid against what's due next, and for the usable ones suggests somewhere nearby to go.
Demo
Demo video drive link: https://drive.google.com/drive/folders/1ForC4309PeUt41V1Ur_KCAQY2WygBu49
Code
Check the repo here: https://github.com/hatheem-r/project_CIRCLEUP
front link: https://project-circleup.onrender.com/
How I Built It
Gemma 3 via Ollama, running locally. Reads the timetable image and returns structured JSON.
Moodle iCal export. Deadlines come from Moodle's own calendar export URL — no scraping, no stored credentials.
Python for everything that has one right answer. Gap finding is interval arithmetic. The good/risky/avoid verdict is a threshold on hours-until-nearest-deadline.
Gemma for everything where language is the output. Writing the one-line reason. Picking which nearby places fit a Saturday afternoon.
SerpApi behind a Render proxy for nearby places. Next.js frontend.
Simple as that.
Why Does Open Innovation Matter?
My timetable and my submission deadlines are a complete map of where I am and what I'm behind on. Multiply that by a group of friends and it's a fairly invasive dataset. Running Gemma locally means it never goes anywhere — not as a design promise, but because there is no network call to make.
That's the privacy argument, and it's the obvious one. The more useful one is:
When Gemma couldn't handle any kind of Timetable images, I could restructure the pipeline, swap to 12B, try Qwen2.5-VL, and move the arithmetic out of the model entirely — in an afternoon, at no cost per attempt. Every one of those experiments was a config change. Against a closed API I'd have been retrying a black box and paying per attempt to learn nothing.
I also ended up with a smaller, cheaper model than I'd have reached for, because I kept narrowing its job until a 4B model could do it reliably. That's only a decision you get to make when you can see and swap the model.
Prize Categories
- Best Use of Gemma — Gemma 3 via Ollama, local inference, doing the parsing and all natural-language output
- Best Use of Render — frontend plus the SerpApi proxy, keeping the API key server-side
- Best Use of SerpApi — nearby place search for usable free windows
Top comments (0)