Inspiration
We spend hours every day in conversations where important things get said and immediately forgotten. You mention a dinner plan, a name, a task you need to follow up on. Then it's gone.
We wanted to build something that just listens and sits silently in the background, catching what matters, and never interrupting you. No pop-ups. No friction. You live your life, Hark takes notes on it.
The core insight: the bottleneck isn't capture, it's review. So everything Hark catches lands in a Pending queue. Nothing fires automatically. You review on your own time, and one tap dispatches it straight to your native macOS apps.
What It Does
Hark runs as a macOS menu bar app. When listening is on, it continuously monitors your microphone using voice activity detection, only buffering real speech and ignoring silence and background noise.
Every chunk of speech gets transcribed via Groq Whisper, then fed into Llama 3.3 70B which pulls out structured items: events, tasks, notes, and messages. Each one lands in a Pending queue inside the dashboard.
From there you confirm or dismiss. Depending on the type, confirmed items dispatch directly to the right native app:
- Notes get appended to a daily note titled
Hark_Notes_<Month>_<Day>_<Year>in Apple Notes - Events get created in Apple Calendar with the parsed date and time
- Tasks get added to Apple Reminders, with a due date if one was mentioned
- Messages open Apple Messages with the body pre-filled so you just pick the contact
Everything also writes permanently to Snowflake, giving you a searchable history across sessions.
How We Built It
Audio pipeline: The browser's Web Audio API captures mic input inside Tauri's WebKit webview. A MediaRecorder buffers speech chunks and posts them to a local Express sidecar server running on port 3847.
Transcription: The sidecar sends audio to Groq's Whisper large-v3-turbo, which returns a transcript in under a second for typical clips.
Extraction: The transcript goes into Llama 3.3 70B via Groq with a structured prompt that extracts type, title, verbatim quote, context, people, and topics as a JSON array.
{
"items": [
{
"type": "task",
"title": "Call Sarah about the marketing deck by Friday",
"quote": "remind me to call Sarah about the marketing deck by Friday",
"people": ["Sarah"],
"topics": ["marketing deck", "friday deadline"]
}
]
}
Storage: Every transcript and extracted item writes to Snowflake. People and topics are denormalized into a separate entity table so the People and Topics views can aggregate across sessions efficiently.
Native integrations: All four dispatch targets are implemented via AppleScript, invoked from Rust inside Tauri. Running osascript from the Rust layer means the macOS Automation permission attaches to Hark.app correctly for packaged builds. Messages uses the sms: URL scheme via open, so no Accessibility permissions are needed there.
Frontend: React + Vite + Tailwind, rendered inside Tauri. Warm off-white, clean typography, no gradients, no "AI" branding anywhere.
Challenges
Voice activity detection. Separating real speech from background noise with amplitude thresholding is harder than it sounds. We tuned the threshold and minimum chunk duration to avoid flooding Whisper with garbage audio.
Optimistic UI with deferred persistence. Items appear in the Pending queue the moment they're extracted, before the Snowflake save returns. We built a clientKey reconciliation system so confirm and dismiss actions on local items get deferred and applied once the real Snowflake IDs come back.
macOS permission attribution. macOS grants Automation permission to the parent process of osascript. Spawning it from the Node sidecar would tie the grant to "node", breaking in packaged builds. Moving it into Rust fixes the permission model entirely.
Groq rate limits. At peak, Whisper gets called every 5 to 10 seconds of speech. We added a circuit breaker with exponential backoff so a rate limit never crashes the pipeline mid-session.
What's Next
- Voice training so that the web app knows whose voice to pick up and transcribe
- A Snowflake-powered weekly digest showing everything you said you'd do
- Smart date extraction so events and reminders auto-populate the correct time without the user needing to say it explicitly
Built With
- express.js
- groq
- llama
- node.js
- react
- rust
- snowflake
- tailwind
- tauri
- vite
Log in or sign up for Devpost to join the conversation.