-
The volunteer scans in and sees a running timer. They never type an hour number.
-
Verify in two minutes: hours pre-filled from the scans, roles and standouts set, and any change needs a reason.
-
Event day: a full-screen QR code and a live roster. People without phones are added by name, and a paper sheet can be imported.
-
An hour letter that replaces hand-signed ones, listing each event, role, hours and how they were recorded.
-
The shared record anyone can open: who is making the claim, the hours, and who to call.
Inspiration
In February and March 2026 our college chapter ran four tree-planting events with Our City Forest in San José: 203 sign-ins and 609 service hours, all on paper sheets. Students needed those hours for graduation rules and scholarships, and the only person who actually saw the work was the coordinator holding the clipboard, who then spent hours typing up sheets and signing letters.
Some of us are building SycaMore, a student startup for organization-attested volunteer records. This weekend we started from scratch on the event-day piece of that problem: a coordinator should be able to run an event, confirm who served, and hand every volunteer proof that a school can check, without changing how they work.
What it does
For the coordinator (the organization side):
- Create an event in under a minute. On the day, a full-screen QR code and a live roster that updates every few seconds; walk-ins sign up at the door with their own QR, and people without phones are added by name.
- Import paper sheet (Claude): photograph the sign-in sheet; Claude reads the handwriting and drafts each row with a confidence score. Unsure rows are highlighted, and nothing is saved until the coordinator confirms each row.
- Verify in two minutes: hours are pre-filled from the scans, the coordinator sets roles, fills in anyone who forgot to scan out (with a printed reason), and confirms. Any changed hour needs a reason, and confirmed records can't be edited afterwards.
- Hour letters that replace hand-signed ones, and a funder report with verified hours, unique volunteers and the value of volunteer time.
For the volunteer:
- Join with name, email and birth date (under 13 is refused), check in and out by scanning the QR, and see "My hours". Nothing counts until the organization confirms it, and the volunteer never types an hour number.
- Share a record as a public link anyone can open without an account: who is making the claim, hours captured by check-in versus adjusted (with the reason), and who to call. Volunteers under 18 can't share without a guardian's OK.
- "Use this record": an AI-worded resume line whose numbers code checks against the record.
- Discover: upcoming public events from every organization, ranked by a rule-based matching engine.
For the school or scholarship committee (the receiver):
- The shared record opens as a one-page certificate: a "Verified" banner naming the issuing organization, the organization's own statement of who served, in what role, for how many hours, and who to call. Revoked records stay online with a red banner, so a link never silently breaks.
A complete public site: a landing page plus How it works, For organizations, For volunteers, Trust (the record explained line by line, and what the AI does and doesn't do), Pricing, About and FAQ, with real screenshots of the app.
How we built it
- Stack: Next.js 16 (App Router, TypeScript), PostgreSQL with hand-written SQL and a database trigger that makes confirmed rows read-only, deployed on Vercel with Neon Postgres. Live demo: https://sycamore-live.vercel.app (demo organization PIN 246810; all names are made up).
- Claude (
claude-opus-5-5): reads photos of handwritten sign-in sheets with structured outputs (name, time in, time out, confidence, notes). The prompt treats sheet text as data, never instructions, and forbids guessing a check-out time. The server, not the model, turns clock times into dates in the event's time zone and computes hours. Claude also drafts post-event campaign text from the coordinator's voice debrief, with the server rejecting any number that isn't in the verified record. - Volunteer AI wording: OpenAI when configured, otherwise Claude;
blurb.tsrejects any number, in digits or words, that isn't the record's hours or date. - Split: Bryant built the organization side with Claude Code; Khanh built the volunteer side as a prototype with OpenAI's tools, which we ported into the same app against a shared API contract written Friday night.
- Design and motion: a "botanical field journal" look where colour only ever signals state (verified, pending, needs attention). Motion is split by surface: the public pages and the shared record get scroll stories, a stamped verification seal and counting numbers, built with Motion and CSS. The coordinator's and volunteer's working screens only get quick feedback, so nothing slows a check-in or a verify. Everything respects reduced-motion settings and stays readable without JavaScript.
- Images: the photos and botanical drawings are AI-generated illustrations (ElevenLabs,
gpt-image-2.5-sunburst), labeled as such on the site. They show no faces and aren't presented as real events. Product screenshots are the real app running on made-up demo data. The demo video's narration is an AI voice (ElevenLabs). - Building with agents: we used Claude Code subagents in parallel for the redesign (assets, marketing site, app screens) and for read-only audits (UI collisions, feature-by-feature QA, product review), with a single agent applying fixes so no two edited the same files.
- All code was written at Cal Hacks 13.0, starting Friday evening; repo: https://github.com/Slifronic/sycamore-live
Challenges we ran into
- Keeping the model from guessing. Handwritten times like "7:3O" and ink blots invite a confident wrong answer. We made the model return null with a note instead, kept its confidence visible, and required a human tap on every row.
- Prompt injection on paper. One test sheet has "IGNORE PREVIOUS INSTRUCTIONS" written as a row; the import skips it and mentions it in the notes.
- Time zones. Our first version hard-coded Pacific daylight time, which would have shifted every imported time by an hour after Nov 1. We now convert with the event date's real offset.
- Merging two halves built with different AI tools into one app over one API contract.
- Bugs that only show up under pressure. A QA pass found that verify accepted non-numeric hours and locked them in, that two coordinators clicking Verify at once crashed it, and that an edited campaign could carry invented numbers after publishing. Each is now refused by the server, not just the UI.
- Making it feel finished without slowing anyone down. A coordinator uses this standing at a creek with one bar of signal, so we kept rich motion to the public pages and gave the working screens only fast feedback.
Accomplishments that we're proud of
- On three synthetic test sheets (computer-generated handwriting with a smudged time, a crossed-out row and an injection line), Claude got 19 of 19 rows exactly right before review. We treat that as a synthetic result, not a field accuracy figure.
- The whole loop works end to end on the deployed site: QR check-in on a phone, walk-in sign-up, paper import, verify, hour letter, and a public record a stranger can check.
- Before submitting we crawled every route as a visitor, coordinator and volunteer, on phone and desktop, with and without reduced motion (588 page loads). We also checked all 318 internal links: no broken links, no console errors, no sideways scrolling on phones. The production build has 0 warnings.
What we learned
- The coordinator is the only person with first-hand knowledge of who served, so the product's job is to make their confirmation fast, not to replace it.
- AI is most useful here as a drafter whose every output a person checks, with code, not the model, enforcing the numbers.
What's next for SycaMore Live
- Pilot it with a Bay Area service nonprofit at its next event.
- Guardian consent so volunteers under 18 can share records.
- Ask three high schools' service-hour coordinators one question: "Would you accept this record?"
Prize tracks
Anthropic: Claude for Public Benefit (main track). Our community is volunteer coordinators at Bay Area service nonprofits and the high-school and college volunteers who need proof of service hours. We lived the problem: our chapter's four tree-planting events with Our City Forest produced 203 sign-ins and 609 hours on paper. Paper is where the record breaks, so Claude reads photographed sign-in sheets. We know where that can go wrong: a confident misread, an invented row, a guessed check-out time, instructions written on the sheet, or time-zone mistakes. Low-confidence rows are highlighted, every row needs the coordinator's tap, the model must return null instead of guessing a check-out, sheet text is treated as data, and the server does the date math. It works today at sycamore-live.vercel.app.
Microsoft: Built for the Real World. Customer understanding: 20+ nonprofit owners and coordinators interviewed, plus a four-event pilot. Measurable usefulness: 19 of 19 rows exactly right on synthetic test sheets before review, and a 58-person event verified on one screen. Path to production: deployed on Vercel with Neon Postgres, every rule enforced on the server rather than only in the UI, verified rows locked by a database trigger, and every adjustment carries a reason that prints on the record. Responsible design: no accounts under 13, no sharing for volunteers under 18, and the AI drafts while a person decides.
Cal Hacks: Best People-First Social Impact. Students get proof of service that a school can check, and small-nonprofit coordinators get back the hours they spend on clipboards and hand-signed hour letters.
Cal Hacks: Best Planet-First Social Impact. Our first users are environmental nonprofits: the pilot was tree planting and creek restoration. Every hour of habitat work their volunteers do becomes a verified record and a funder-ready report, which helps these groups keep the volunteers and grants that keep the work going.
Meta: Bringing People Closer Together with AI. Walk-ins join at the door from a QR code, coordinators message and thank their volunteers, and Discover matches volunteers to nearby events. Claude turns a coordinator's voice debrief into a thank-you and an event story built only from verified facts, giving volunteers a reason to come back.
Cal Hacks: Most Technically Complex. Every query is scoped to the coordinator's organization and a database trigger locks verified records. Claude runs with structured outputs while the server checks every number. Check-out tolerates going offline, and an opt-in leave-the-area check stores no coordinates. Two halves built with different AI tools were merged onto one API contract.
Cal Hacks: Most Creative. Instead of asking students to prove their hours, we made the organization's own confirmation the product, and taught an AI to read the paper sign-in sheets that events still run on, without letting it decide anything.
MLH Commit Fellowship. SycaMore is a student startup we are taking past the weekend: next we run it at a real coordinator's event and ask three high schools whether they will accept the record.
Built With
- anthropic
- claude
- claude-code
- elevenlabs
- motion
- neon
- next.js
- postgresql
- react
- typescript
- vercel


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