Project Info
This project did not submit a demo video on Devpost.
Inspiration
All of us have had some microbiological research experience, and all of us have had to deal with experiments involving bacteria, fume hoods, and biosafety cabinets where, to prevent contamination, we have been limited in our ability to take notes and reference protocols.
What it does
We made a webapp that serves as an AI based research journal and protocol tool specializing in voice command based utility, allowing the user to take notes, set timers, and navigate protocols without the need to touch their device.
How we built it
We used a combination of Google Stitch and Claude Code to design much of the UI, while using Devin and Claude Code to create the backend. The frontend and backend were stitched together, again with a combination of Devin and Claude Code, with Codex as a reviewer for Claude's plans.
Challenges we ran into
The main challenges we ran into were in adding functionality to Google Stitch, it produced a static page with non-interactable elements. As such many elements that were meant to be interactable ended up as placeholders that would complicate the process of merging the frontend and backend. We also struggled with parsing intent from the (sometimes unclear) Deepgram output, so we had to include bias for keywords, router guards, and step-aware answers to the LLM call.
Accomplishments we're proud of
This was the first hackathon any of us had participated, and we are quite proud of what was produced within the 24 hours. It has more functionality than any of us expected it to have, and in addition, we felt the user interface turned out quite well.
What we learned
We learned how to prompt and integrate LLMs into various applications. We further learned how API keys functioned, and how to separate them from the git repo to keep them private.
What's next
Additional functionality needs to be added. Method exportation, reagent QR code scanning and logging, improve accuracy of time estimates, and improved PDF reading.
Lab - Voice-Driven Electronic Lab Notebook
Lab is a hands-free electronic lab notebook for running protocols in the lab: start a voice session, load a protocol, follow the active step, log observations, manage timers, check inventory, scale reagent prep, and keep notebook records in sync across the UI.
What works now
- Live app: FastAPI serves the current UI from
FrontendTest/athttp://127.0.0.1:8000. - Voice control: browser mic audio streams to
/ws/audio, the backend proxies it to Deepgram nova-3, and final transcripts run through the same command spine. The Deepgram key stays server-side in.env. - Always-listening mute: after a voice session starts, the mic stays connected.
mutestops transcript updates and command routing;unmuteresumes. The mute state is sticky across reconnects. - Protocol library: four protocols ship in
backend/data/protocols/. The UI can load, import from pasted text, import from PDF, edit, and delete protocols. - Guided run: the Guide page shows the active step, previous/current/next context, skipped/completed status, active timers, and a reagent-prep table.
- Notebooks: logs are SQLite-backed, scoped to the active notebook, searchable, editable, sortable, and exportable as Markdown, CSV, or print-to-PDF.
- Inventory: inventory is CSV-backed and can be searched, added, edited, and deleted from the UI. Voice can find items and add simple inventory entries.
- Factory reset: Reset Demo restores the shipped protocol and inventory seed data, clears run state, wipes notes/notebooks, clears timers, and unmutes voice.
The spine
The central contract is still intentionally small:
spoken transcript
-> route(transcript) one validated Command
-> handle_command(Command) deterministic state mutation
-> emit UI events over /ws/events
The frontend dispatches on four outer event types:
transcript_update, command_result, timer_update, and error. New behavior
adds command_result.kind values instead of adding new outer event types.
Visible UI controls usually use structured REST endpoints directly. Spoken
commands enter through /ws/audio and then the same ingest() spine used by the
backend tests and command-driven buttons.
Run
PowerShell:
py -3.12 -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r requirements.txt
Copy-Item .env.example .env
.\.venv\Scripts\python.exe -m uvicorn backend.main:app --reload
Open http://127.0.0.1:8000.
Voice requires DEEPGRAM_API_KEY in .env. ANTHROPIC_API_KEY is optional:
with no Anthropic key, the router uses deterministic fallback paths for the demo
commands. The current FrontendTest/ UI does not expose a free-form typed command
box, so the demo is voice plus visible page controls.
Updated demo
- Click Reset Demo to start from the factory seed state.
- Click Start voice session in the lower-right dock and allow microphone access.
- Say
Load DNA extraction protocol, or open Protocols and click the DNA Extraction load button. The app lands on the Guide with step 1 active. - In the reagent-prep modal, set the sample count to
12and click Compute. The table shows scaled reagent totals and inventory status. - On the Guide, say
Next stepor click Confirm Action. The current step is marked complete and an automatic notebook entry is written. - Try step controls: say
Go back,Repeat that, orSkip this step, or use the matching Guide buttons. Skipped steps stay visible in the tracker. - When a timed protocol step appears, the timer card starts paused. Say
Start timerto begin it, then sayStop timeror delete the timer card to clear it. - Say
Log added 200 uL lysis buffer to sample A. Open Notebook to see the entry, provenance badge, timestamp, and any reproducibility warning. - Say
Scratch that, or sayCorrect that to added 300 uL lysis buffer. You can also add and edit entries with the Notebook page controls. - On Notebook, create a second notebook, switch it active, and confirm another protocol step. New step notes land in the selected notebook.
- Say
Where's the proteinase K?, or search from Inventory. Add a new inventory item from the page, then edit or delete it. - On Protocols, click Import Protocol. Paste numbered steps or drop a text-readable PDF; imported protocols are registered immediately and can be loaded like shipped protocols.
- Edit a protocol from its card, then click Reset Demo. The reset restores the shipped protocol/inventory seed data and removes the demo edits, imports, notes, notebooks, timers, and active run.
Clarification behavior is deliberate: if you say Load a protocol without naming
one, the UI asks which protocol instead of guessing.
Voice examples
Load DNA extraction protocol
Next step
Skip this step
Go back
Repeat that
Start timer
Stop timer
Clear done timers
Log sample A looks clear
Scratch that
Correct that to sample A looks cloudy
Where is the EDTA?
Add 5 g of EDTA on shelf 4 to inventory
How much lysis buffer in step 1?
Open notebook
Show inventory
Jump to guide
Mute
Unmute
The Commands page lists the supported voice phrases and what each one does.
Data and reset model
- Protocols live in
backend/data/protocols/*.yaml. - Inventory lives in
backend/data/inventory.csv. - Seed copies live under
backend/seed/and are used by Reset Demo. - Notes and notebooks persist in SQLite at
backend/data/lab.dbby default. - Override data with
LAB_DATA_DIR; override notes withLAB_DB_PATH, or setLAB_DB_PATH=:memory:for non-persistent notes.
Reset Demo is now a full factory reset. It restores seed protocols and inventory,
clears all notes/notebooks, clears the active protocol and timers, clears recent
protocol state, and unmutes voice. It does not depend on LAB_DEMO_MODE.
API surface
POST /api/ingest- command spine entrypoint for tests and command-like UI actions.GET /api/state- hydrate active protocol, log, and timer state.GET /api/protocolsandGET /api/protocols/recent- protocol catalog and dashboard recents.POST /api/protocols/{id}/load- deterministic protocol load.GET/PATCH/DELETE /api/protocols/{id}- full protocol detail, edit, and delete.POST /api/protocols/import- pasted prose to protocol YAML.POST /api/protocols/import/file- text-readable PDF to protocol YAML.POST /api/protocols- direct YAML upload.POST /api/step/next- button-driven confirm or skip.GET/POST /api/notebooksandPOST /api/notebooks/{id}/select- notebook list, create, and switch active notebook.GET/POST /api/logandPATCH /api/log/{id}- active-notebook log feed and entry edits.GET/POST /api/inventoryandPUT/DELETE /api/inventory/{id}- inventory read and item CRUD.POST /api/scale- deterministic reagent prep scaling for the active or selected protocol.POST /api/demo/reset- factory reset.GET /api/health- basic backend health and loaded data counts.WS /ws/events- UI event stream.WS /ws/audio- browser mic audio and voice mute controls.
Layout
backend/
main.py FastAPI app, REST endpoints, WS events/audio, static UI
deepgram_stt.py server-side Deepgram live STT proxy
voice_control.py always-listening mute/unmute gate
schema.py Command model and locked event-envelope builders
router.py transcript -> Command, LLM optional with deterministic paths
handlers.py deterministic command handlers
state.py protocols, inventory, timers, notebooks, reset model
db.py SQLite NoteStore for notes and notebooks
protocol_import.py pasted/PDF protocol import helpers
pdf_extract.py PDF text extraction and reflow
scaling.py reagent prep scaling and inventory verdicts
reproducibility.py deterministic volume checks for notebook flags
data/ live protocol, inventory, and runtime DB files
seed/ factory-reset baseline files
FrontendTest/
dashboard.html dashboard, recent protocols, recent notebooks, live status
protocols.html protocol library, import, edit, delete
guide.html active run, step tracker, timers, reagent prep
notebook.html notebooks, log feed, edit, search, sort, export
inventory.html inventory search/add/edit/delete
commands.html voice command reference
app.js REST hydrate, WS dispatch, render logic
voice.js browser mic session and voice-state UI
frontend/
sw.js legacy self-unregistering service worker stub
tests/ API, router, handlers, voice, protocol import/edit,
notebooks, reset, scaling, persistence, and UI static checks
Test
Use the repo virtual environment on Windows:
.\.venv\Scripts\python.exe -m pytest -q --basetemp .pytest-tmp\codex-run -p no:cacheprovider
For README-only edits, git diff --check -- README.md is a lightweight formatting
guard.
Not yet
Deferred pieces include TTS, VAD-gated streaming/cost optimization, production auth, hosted multi-user deployment, and real LIMS integration.
Analysis
View
Metric
- 83
- 54
- 47
- 46
- 33
- 6
Figures cover GitHub contributors during the hackathon window. A co-authored commit counts in full for each author, so per-member totals add up to more than the whole-team figures.
Technology
- AnthropicIn code
- CSSIn code
- FastAPIIn code
- HTMLIn code
- JavaScriptIn code
- PythonIn code
6 of 6 appear in the indexed code.
AI coding agents
- Claude CodeConfig · Commits
Detected from committed agent config files and commit authorship. Absence of a signal is not proof an agent was unused.
Codebase size
Source size
776 KB
Source files
83
Counts recognized source files only; vendored directories, binaries and lockfiles are excluded, so this is smaller than the repository on disk.
Repository
bradycwong/Cal-2026-AI-Hackathon
108 files · 1.4 MB · @ eb39cc1
Structure
Interface
15 files · 14%Screens, components and styles rendered to the user.
Application logic
31 files · 29%Domain rules, services and shared utilities.
+3 more
Supporting
Layers are inferred from where files sit in the tree, not from reading the code. A project that names its directories unconventionally will read oddly here — open the file browser to check anything the diagram implies.
Languages
- Python54%
- JavaScript20%
- HTML14%
- Markdown7%
- CSS3%
- YAML2%
- Other (1)0%
Share of indexed source by file size. Binary and vendored files are excluded.
Dependencies
requirements.txt
pypi · 12- anthropic
- arize-otel
- fastapi
- httpx
- pydantic
- pypdf
- pytest
- python-dotenv
- python-multipart
- pyyaml
- uvicorn[standard]
- websockets
Declared in the repository’s manifests at the indexed commit. A declared package is not proof it is used, and runtime dependencies are listed first.
This project’s features have not been analysed yet.
Export this project's context (description, README, evidence, key source files) to chat with an AI agent elsewhere.