Project Info
Inspiration
We wanted to build upon the tried and true rubber ducky method of debugging, where a developer explains their thought process to a "rubber ducky", forcing themselves to walk through their system, start to finish. We wanted to create a tool that can be used for this as well as some flair!
What it does
We provide a cute screen, ideally held up by our mascot, that shows developers their coding stats such as GitHub Pull Requests, GitHub Actions, commits or more specific to vibe coding like Claude token usage etc.
How we built it
We connected an ESP32 board to an E-Ink display, and used Rust to program the TUI widgets. A Go server then complements the embedded device, which polls for live updates and stats. The device runs standalone due to using the Wi-Fi/BLE stack of the esp32.
Challenges we ran into
Since some of the teammates were new to Rust, some time was spent on learning before building. It was also our first time trying to understand the Wi-Fi and Bluetooth protocols at a deeper level, and then trying to find examples which we could build on for those technologies was very difficult. There was a lot of trail and error.
Accomplishments we're proud of
We are extremely proud of the fact that we built a standalone embedded device that functions on ubiquitous protocols. Just seeing it contact our backend while only connected to power, and then pull that data down and then displaying it; it was incredibly rewarding.
What we learned
We learned so much about interfacing with networking protocols as well as more experience with embedded software development!
What's next
We would love to spend more time on the project and add more features, and even design a nice case so it could be a practical desk-gadget!
CappyCoding
A Tauri-based desktop application with voice-enabled AI assistant powered by LiveKit and Claude.
Features
- ποΈ Voice AI Assistant: Talk to Claude using natural speech
- π LiveKit Integration: Professional-grade WebRTC for real-time communication
- π€ Claude Sonnet 4.5: Advanced AI responses via Anthropic
- π Usage Metrics: Track Claude API usage and costs
- π¨ Modern UI: Built with Svelte 5 and Tauri 2.0
- π§ Easy Configuration: UI-based setup for API keys and agent management
Architecture
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Tauri Desktop App β
β (Svelte 5 Frontend) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β π€ Voice Input β LiveKit β Python Agent β π Voice β
β β β
β LiveKit Inference β
β (Deepgram STT + Cartesia TTS) β
β β β
β Claude AI (Anthropic) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Quick Start
Prerequisites
- Node.js 18+ and bun (for frontend)
- Rust (for Tauri)
- Python 3.13+ (for voice agent)
1. Get API Keys
You'll need:
- LiveKit Cloud account: https://cloud.livekit.io/ (free tier available)
- Anthropic API key: https://console.anthropic.com/
2. Launch the App
cd capycoding-app
bun install
bun run tauri dev
3. Configure Voice Agent (in the app)
- Find the "π€ Voice Agent Configuration" panel
- Enter your LiveKit credentials (URL, API Key, API Secret)
- Enter your Anthropic API key
- Click "πΎ Save Configuration"
- Click "βΆοΈ Start Agent"
4. Start Talking!
- Go to "ποΈ Connect to Voice Session"
- Enter a participant identity and room name
- Click "Connect to Voice Session"
- Start speaking naturally!
Project Structure
CappyCoding/
βββ agent.py # Python voice agent (LiveKit + Claude)
βββ env/ # Python virtual environment
βββ capycoding-app/ # Tauri desktop application
β βββ src/ # Svelte frontend
β βββ src-tauri/ # Rust backend
βββ capycoding-esp/ # ESP32 firmware (optional)
βββ ble-types/ # Bluetooth type definitions
βββ server/ # Go metrics server
βββ docs/
βββ FRONTEND-CONFIG.md # UI configuration guide
βββ README-AGENT.md # Agent technical details
βββ QUICKSTART.md # Quick start guide
Components
Voice Agent (agent.py)
Python agent using LiveKit's agent framework:
- STT: Deepgram (via LiveKit Inference)
- LLM: Claude Sonnet 4.5 (via Anthropic plugin)
- TTS: Cartesia (via LiveKit Inference)
- VAD: Silero voice activity detection
Configuration stored in:
~/.config/capycoding/agent_config.json(UI-saved).envfile (manual configuration)- Environment variables (highest priority)
Tauri App (capycoding-app/)
Desktop application featuring:
- Voice agent configuration and management
- LiveKit voice session connection
- Claude usage metrics tracking
- Real-time audio streaming
Built with:
- Frontend: Svelte 5, Vite, LiveKit Client SDK
- Backend: Rust, Tauri 2.0, taurpc for IPC
Documentation
- QUICKSTART.md - Get started in 1 minute
- FRONTEND-CONFIG.md - UI configuration guide
- README-AGENT.md - Agent technical details
Costs
Using LiveKit Inference simplifies billing to just 2 providers:
LiveKit Cloud (includes STT + TTS):
- Deepgram STT: $0.0043/minute
- Cartesia TTS: $0.045/minute
- LiveKit transfer: Free tier includes 50 GB/month
Anthropic:
- Claude Sonnet 4.5: ~$3/$15 per million tokens
Typical usage: ~$0.26/hour of conversation
Development
Running the Agent Manually
cd /path/to/CappyCoding
source env/bin/activate
python agent.py dev
Building the Tauri App
cd capycoding-app
bun run tauri build
Installing Agent Dependencies
Already installed in /env, but to reinstall:
cd /path/to/CappyCoding
python -m venv env
source env/bin/activate
pip install livekit "livekit-agents[anthropic,silero,deepgram,cartesia]"
Environment Variables
The agent loads configuration in this priority:
- Environment variables (highest)
- UI-saved config (
~/.config/capycoding/agent_config.json) - .env file (lowest)
Required variables:
LIVEKIT_URL=wss://your-project.livekit.cloud
LIVEKIT_API_KEY=APIxxxxxxxxxx
LIVEKIT_API_SECRET=xxxxxxxxxxxxxxxx
ANTHROPIC_API_KEY=sk-ant-xxxxxxxxxx
Troubleshooting
Agent won't start
- Verify API keys are correct (no extra spaces)
- Check that
/envvirtual environment exists - Try running manually to see error messages
Can't connect to voice session
- Ensure agent is running (check status in UI)
- Verify LiveKit credentials in agent configuration
- Check that participant identity and room name are filled in
No audio response
- Check LiveKit Inference is enabled (default on new projects)
- Verify microphone permissions in your OS
- Check browser/Tauri audio settings
See QUICKSTART.md for more troubleshooting tips.
License
[Your License Here]
Contributing
[Your Contributing Guidelines Here]
Analysis
View
Metric
- 32
- 23
- 10
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
- CSSIn code
- GoIn code
- HTMLIn code
- JavaScriptIn code
- PythonIn code
- RustIn code
- SvelteIn code
- Tailwind CSSIn code
- TypeScriptIn code
9 of 9 appear in the indexed code.
AI coding agents
No AI coding agent signals were found in this repository.
Detected from committed agent config files and commit authorship. Absence of a signal is not proof an agent was unused.
Codebase size
Source size
584 KB
Source files
412
Counts recognized source files only; vendored directories, binaries and lockfiles are excluded, so this is smaller than the repository on disk.
Repository
Sluggish-Solutions/CappyCoding
464 files Β· 1.4 MB Β· @ b8aa5e8
Structure
Interface
360 files Β· 78%Screens, components and styles rendered to the user.
API & routing
16 files Β· 3%Request entry points: routes, handlers and controllers.
Application logic
37 files Β· 8%Domain rules, services and shared utilities.
+1 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
- Svelte60%
- Rust10%
- Markdown8%
- Go8%
- TypeScript8%
- Python3%
- Other (5)3%
Share of indexed source by file size. Binary and vendored files are excluded.
Dependencies
capycoding-app/package.json
npm Β· 41- @livekit/components-core
- @livekit/components-styles
- @lucide/svelte
- @tauri-apps/api
- @tauri-apps/plugin-opener
- @thisux/sveltednd
- @xenova/transformers
- clsx
- livekit-client
- neverthrow
- runed
- tailwind-merge
- tailwind-variants
- taurpc
- tw-animate-css
- +26 more
capycoding-esp/Cargo.toml
cargo Β· 34- ble-types
- bt-hci
- critical-section
- display-interface-spi
- embassy-executor
- embassy-futures
- embassy-net
- embassy-sync
- embassy-time
- embedded-graphics
- embedded-hal-bus
- embedded-io
- embedded-io-async
- embedded-storage
- esp-alloc
- esp-backtrace
- esp-bootloader-esp-idf
- esp-hal
- +16 more
server/go.mod
go Β· 20- github.com/google/go-github/v55
- github.com/labstack/echo/v4
- golang.org/x/oauth2
- +17 more
capycoding-app/src-tauri/Cargo.toml
cargo Β· 16- anyhow
- ble-types
- btleplug
- chrono
- dirs
- jsonwebtoken
- log
- reqwest
- serde
- serde_json
- specta
- tauri
- tauri-plugin-opener
- taurpc
- tokio
- +1 more
ble-types/Cargo.toml
cargo Β· 4- heapless
- postcard
- serde
- uuid
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.