Inspiration:
Client-facing teams make promises everywhere: on calls, in email threads, in Slack, in a statement of work. Those promises scatter. A rep walking into a renewal call often can't answer the simplest question: what did we promise this client?
The hackathon theme was the Enchanted Grove, and it fit. A promise is something you plant. It grows if you tend it and wilts if you forget it. We wanted every client conversation to become something you can see, track and ask about, with proof of where it came from.
What it does:
Grovekeeper turns client conversations into a living grove, one per client account. Every commitment, decision, risk and customer need becomes a seed. A seed grows while work is in progress, blooms when it's done, and wilts when it's overdue or when it's an open risk.
Online meetings, live. Share a Zoom, Google Meet or Teams browser tab. Grovekeeper transcribes the other participants with speaker labels and your own microphone under your name, and extracts commitments with owners and deadlines about every 30 seconds. Speakers can be renamed (Guest-1 → Sam).
Every other source. Paste an email thread or chat, or upload a document (.txt, .md, text-based PDF). Slack is connected live: link a channel to an account and press Sync.
A grove per client. Each account has one page: a forest where every seed is a plant in its current state, a plain list of the same seeds, filters by kind and owner, and a timeline of every source, newest first, with one icon per source type.
Trace anything. Select a seed to see its owner, deadline, and the exact words it came from. Open any source to read the email, the Slack thread, or the meeting transcript, alongside the seeds extracted from it.
Self-updating commitments. When someone says or writes that something is done, Grovekeeper finds the matching open commitment and asks "Mark it as done?" with the quote. Nothing closes without a human Yes, and the seed then shows where it was completed.
Ask the Grove. Ask in plain language: "What are the open commitments for Fabrikam?" or "Show me all customers interested in payroll integration." Answers come with citations that open the exact source. If the answer isn't in the data, it says so.
Live in-meeting assistant. During a call, ask by voice or by typing about this meeting and past ones. Saying a client's name brings up a card with their open commitments and risks.
Next best action. A one-click follow-up email draft built from real commitments. It is never sent automatically.
How we built it:
Frontend: React, Vite and TypeScript. Tab audio through getDisplayMedia, the user's mic through getUserMedia, and Web Audio with an AudioWorklet to produce 16 kHz audio for each channel. The forest: plants are positioned with D3 scales and rendered as real, keyboard-accessible buttons, with botanical illustrations for each growth state. The misty forest backdrop, drifting fireflies and wand cursor are drawn in CSS and inline SVG, with no image files. Content settles into view as you scroll, and all motion is switched off for people who ask for reduced motion. Backend: Azure Functions in Python, with Pydantic contracts mirrored in TypeScript so both sides agree on every shape.
Azure AI Speech: real-time transcription with speaker labels for the meeting tab, and plain recognition for the user's mic. The browser only ever receives short-lived tokens; keys stay on the server.
Azure OpenAI (gpt-5-mini): structured extraction, completion detection, question planning, grounded answers and follow-up drafts, through one shared helper.
Azure Cosmos DB: seeds, roots, utterances, sources and accounts, on shared throughput so everything fits a 1,000 RU/s account.
Slack Web API: a read-only bot with manual sync and checkpoints, so re-syncing never duplicates messages.
How we use AI responsibly:
Provenance first. Every seed cites the exact source words it came from. A quote that doesn't appear in the source means the item is dropped.
No invented facts. An owner is kept only if they are a speaker or named in the cited text; a deadline only if its wording appears in the source. Otherwise the field stays empty.
Grounded answers. Ask the Grove answers only from retrieved evidence, and citations are built from stored records, never from model-written text.
Humans decide. Completions are suggestions until confirmed, and drafts are never sent. Honest states. The app says when something is loading, empty or failed. A change appears as saved only after it is saved, and sample data is always labelled as sample data.
Accounts stay separate. One client's seeds never appear on another client's page.
Challenges we ran into:
Capturing a call from the browser. The meeting tab and the user's mic arrive as separate streams, and naming the user reliably meant transcribing them separately.
Duplicate seeds. Overlapping 30-second extraction windows kept finding the same commitment twice.
Fitting Cosmos. Five containers had to fit under a 1,000 RU/s limit, which meant shared throughput.
A reasoning model with strict schemas. gpt-5-mini has no sampling knobs, so reliability had to come from structure and validation.
Four people, one codebase. Shared types, one typed API client and an agreed merge order let us build against mocks first and swap in real services as they landed.
A grove that doesn't crowd. Fifteen seeds from one real meeting overlapped badly in the first forest layout. Rows now get a fixed height so the garden grows with the grove.
Accomplishments that we're proud of
The full flow works end to end on Azure: a live call becomes named transcript lines, cited seeds on the right client account, and answers you can trace back to the moment something was said.
More than 350 automated tests across the backend and frontend.
Every seed and every answer can be traced to a stored source. Nothing in the product asks you to take the AI's word for it.
It looks like an enchanted grove and still reads like an enterprise tool: state is always written in words, not only shown as a plant, and everything works by mouse and keyboard.
What we learned
Trust is the product. A summary nobody can verify is noise; a commitment with an owner, a date and a quote is something a team can act on.
We also learned to agree on contracts before writing features. The hours spent on shared types and a merge order were what made the pivot survivable.
What's next for Grovekeeper:
Sign-in with work accounts, and per-account access control.
More connectors (Gmail, Outlook, Teams chat) through the same ingestion pipeline.
Self-updating commitments from email and Slack, not only meetings.
Real-time Slack events instead of manual sync.
Vector search for fuzzier questions across long account histories.
Built with
Azure AI Speech · Azure OpenAI · Azure Cosmos DB · Azure Functions · Python · React · TypeScript · Slack API
Log in or sign up for Devpost to join the conversation.