
Current C
veraldar/bifrost
Talk to your coding agent from your phone — voice + text, self-hosted, private. One link, your agent installs it. A Veraldar product.

Talk to your coding agent from your phone — voice + text, self-hosted, private. One link, your agent installs it. A Veraldar product.
Airnode B is an open-source printed circuit board by veraldar, from the veraldar/bifrost repository on GitHub, published under the AGPL-3.0 licence. It is a 2-layer board of 80 × 60 mm with 36 parts on 31 nets, routed with 318 tracks and 44 vias.
It is built around the ESP32-C3-WROOM-02-N4, ME6211C33M5G-N and ADXL343BCC, with the TP4056 among its other parts. Its parts include 12 resistors, 7 ICs, 7 connectors, 6 capacitors and 3 diodes. It belongs with the ESP32 and RISC-V boards of this library.
A voice-controlled opencode: speak or type on your phone (PWA), a LiveKit voice agent bridges your words to a local opencode server, and you get the answer back as text and speech — with markdown, attachments, multi-session support, and frontend diagnostics.
Open your coding agent (opencode, Claude Code, Codex, …) in an empty folder and give it this one line:
https://raw.githubusercontent.com/veraldar/bifrost/v0.6.0/skills/install/SKILL.md set it upThat's the whole instruction. The agent fetches the skill, clones this repo,
checks prerequisites (Node ≥ 22, docker for voice), mints every secret,
starts LiveKit + opencode + the voice agent + the PWA, verifies each layer,
and prints a verdict + the URL to open. Already cloned? Say instead:
"follow skills/install/SKILL.md and set it up". One manual step remains
afterwards: opencode auth login (your LLM provider key — nothing may mint
that for you). Prefer manual setup? Keep reading.
One-click Vercel deploy of the PWA: after cloning, set the env vars
LIVEKIT_URL,LIVEKIT_API_KEY,LIVEKIT_API_SECRET(seepwa/.env.example). Text-mode needsOPENCODE_URLreachable from the deployment — keep opencode private (Tailscale), it has shell access!
bifrost drives opencode natively — sessions, voice, queue, transcript. Other AI CLIs are one sentence away, not one integration: from any session, just ask — "ask claude to review this diff" or "have codex write tests for X" — and the delegate skill runs them as sub-tools, relays their output into your transcript, and works by voice too. No config, no second login flow beyond the CLI's own auth.
Bifrost is built to run speech on your own hardware — your voice never has to leave your machines. That's the setup we push. But you choose: local models (CPU or MLX), or any cloud API for LLM and voice — American, Chinese, European, open weights. The AI is yours to pick; the identity stays yours.
Hardware — 3 nodes, one Tailscale tailnet (no public exposure):
| Node | Role |
|---|---|
| Phone | PWA client (mic + UI), joins the tailnet |
| omarchy (Linux desktop) | all server layers: PWA, LiveKit, voice agent, opencode |
| Mac Studio (M3 Ultra) | local speech models via MLX/GPU on the LAN |
Software layers (top = user, bottom = model):
Phone (PWA: Next.js) Omarchy desktop
┌──────────────────────────┐ ┌──────────────────────────────────┐
│ sessions UI / transcript │ REST │ opencode serve :4096 │
│ text + attachments ─────┼───────────────►│ (sessions, prompts, streaming) │
│ │ │ ▲ │
│ WebRTC media (mic/speech)│ │ │ llm.LLM adapter │
│ ▼ │ │ Python voice agent (livekit- │
│ LiveKit server :7880 ◄───┼───WebRTC───────┤ agents) │
│ (docker, host net) │ │ STT ⇄ opencode ⇄ TTS │
└──────────────────────────┘ └───────┬─────────────┬───────────┘
▲ │ LAN │ fallback
tailscale serve Mac Studio :8001 speaches :8000
(tailnet-only TLS) (MLX, GPU) (docker, CPU)Local models (no cloud speech APIs):
| Layer | Primary | Fallback |
|---|---|---|
| STT | Qwen3-ASR (MLX, Mac :8001) | speaches faster-whisper (CPU, :8000) |
| TTS | Qwen3-TTS (MLX, Mac :8001) | speaches Kokoro (CPU, :8000) |
| LLM | opencode's configured model (VOICE_MODEL) | — |
Everything is systemd-managed on omarchy (lk-pwa, lk-agent,
opencode-serve) + docker compose — reboots self-heal.
pwa/) — Next.js 15 + Tailwind 4. Sessions list, transcript with
markdown (Streamdown), image/file attachments, sandboxed HTML preview,
pixel-art UI (pixelarticons), push-to-talk & hands-free voice modes.pwa/app/api/*) — the phone never talks to opencode directly;
the Next server proxies sessions/messages/tokens and stays the single
auth/seam point. Also receives frontend diagnostics (/api/diag), log-only.agent/) — Python livekit-agents worker. Custom llm.LLM
adapter maps LiveKit room → opencode session (room name = session slug),
so voice turns land in the same transcript as text.deploy/) — docker compose: LiveKit (host network, ICE pinned
to tailnet + LAN IPs so phone media flows over Tailscale) + speaches STT/TTS.journalctl + pwa/.diag/*.log). Log-only by design: no automatic fix
sessions (a past auto-autofix experiment was removed as a bad idea).Minimum hardware: ONE Linux box (any machine that runs Docker + Node) + your phone. No Mac needed — the CPU speech fallback (speaches, in the compose) works out of the box; a Mac Studio running MLX speech models is an optional quality upgrade (see
agent/.env.example→SPEACHES_URL). Everything below runs on that one box; nothing needs to be public — Tailscale is the only network requirement (install it on box + phone).
git clone https://github.com/veraldar/bifrost.git && cd bifrost
scripts/selfhost-check.sh # one-command check: can this box run the PWA? (clone→build→boot→probe)
# 0. opencode itself (the coding agent this whole thing drives)
# install: curl -fsSL https://opencode.ai/install | bash (or your package manager)
opencode auth login # configure your LLM provider key
opencode serve --port 4096 & # REST server on 127.0.0.1:4096
# 1. LiveKit + speech stack (cp example → real; edit .env LIVEKIT_KEYS and
# livekit.yaml ICE IPs for your network — see deploy/livekit.yaml.example;
# `tailscale ip` on the box gives the tailnet IP to pin)
cd deploy && cp livekit.yaml.example livekit.yaml && docker compose up -d && cd ..
# 2. Voice agent
cd agent && uv sync && cp .env.example .env # edit values (SPEACHES_URL empty = CPU fallback)
uv run agent.py dev # or a systemd unit
# 3. PWA
cd ../pwa && npm install && cp .env.example .env.local # edit values
npx web-push generate-vapid-keys --json # paste into .env.local for push notifications
npm run build && npm start # :8080
tailscale serve --bg 8080 # tailnet-only HTTPSOr deploy just the PWA to Vercel with the button above and point it at your LiveKit (and a network-reachable opencode).
| Var | Where | Purpose |
|---|---|---|
LIVEKIT_URL | pwa / agent | signal URL (wss://… for web, ws://127.0.0.1:7880 local) |
LIVEKIT_API_KEY/SECRET | pwa / agent | token minting / worker auth |
OPENCODE_URL | pwa / agent | opencode REST (http://127.0.0.1:4096) |
VOICE_MODEL | agent | opencode model for spoken replies |
SPEACHES_URL, STT_MODEL, TTS_MODEL, TTS_VOICE | agent | speech stack fallbacks |
One structural change per version; each is gated (scripts/gate.py) and lives on
daily use before the next. Every version is a frozen release you can switch back to
in about a minute (scripts/promote.sh --list / --switch / --rollback). Full contract:
docs/STABLE.md.
| version | the one change |
|---|---|
| v0.6.1 | releases carry their own env; switch/rollback between any built version |
| v0.6.2 | speech-to-text in-process in the voice agent (no STT service) |
| v0.7 | yggdrasil becomes the brain (opencode-compatible, light prompt) |
| v0.8 | bifrost-net bridge as a second transport + an Android app as its first client |
| v0.9 | bridge-first: no tailnet needed |
docs/plan.md keeps the working board; docs/environments.md records installs and test runs.
Want to be part of the journey? Veraldar is free and stays free — but it isn't free to build.
github.com/sponsors/veraldar (pending activation)opencode Collective pending — transparent public ledgerEvery franc goes to hardware, hosting, and keeping the voice local.
Bifrost is AGPL-3.0 — copyleft including network use: modified versions offered as a service must make their source available. Talking to bifrost over its API does not make your app a derivative; interop stays free.
Attributions: PWA derives from livekit-examples/agent-starter-react (Apache-2.0). Icons: pixelarticons (MIT).
| Qty | Value | Footprint | References |
|---|---|---|---|
| 7 | 10k | R_0603_1608Metric | R2, R3, R4, R8, R10, R11, R12 |
| 4 | 1k | R_0603_1608Metric | R1, R6, R7, R9 |
| 3 | 100nF | R_0603_1608Metric | C3, C5, C6 |
| 3 | 10uF | C_0805_2012Metric | C1, C2, C4 |
| 2 | ESP32-C3-WROOM-02-N4 | ESP32-C3-WROOM-02 | U1, U5 |
| 2 | ME6211C33M5 | SOT-23-5 | U3, U8 |
| 2 | PROG | PinHeader_1x05_P2.54mm_Vertical | J1, J4 |
| 2 | PWR | LED_0603_1608Metric | D1, D3 |
| 1 | 1.2k | R_0603_1608Metric | R5 |
| 1 | 5V_IN | PinHeader_1x02_P2.54mm_Vertical | J7 |
| 1 | ADXL343 | LGA-14_3x5mm_P0.8mm_LayoutBorder1x6y | U2 |
| 1 | BAT_18650 | JST_PH_B2B-PH-K_1x02_P2.00mm_Vertical | J2 |
| 1 | CHRG | LED_0603_1608Metric | D2 |
| 1 | FAN_RELAY | PinHeader_1x02_P2.54mm_Vertical | J6 |
| 1 | NTC_10K_B3950 | PinHeader_1x02_P2.54mm_Vertical | TH1 |
| 1 | PIR | PinHeader_1x02_P2.54mm_Vertical | J5 |
| 1 | RELAY | PinHeader_1x02_P2.54mm_Vertical | J3 |
| 1 | SCD41 | Sensirion_DFN-4-1EP_2x2mm_P1mm_EP0.7x1.6mm | U6 |
| 1 | TP4056 | SOIC-8_3.9x4.9mm_P1.27mm | U4 |
It measures 80 × 60 mm and has 2 copper layers, 1.6 mm thick.
36 parts, built around the ESP32-C3-WROOM-02-N4, ME6211C33M5G-N, ADXL343BCC and TP4056. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.
From the veraldar/bifrost repository on GitHub, at the commit this page was made from: the board is hardware/build/airnode-B.kicad_pcb and its schematic hardware/airnode-B/airnode-B.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Its repository publishes it under the AGPL-3.0 licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).

veraldar/bifrost
Talk to your coding agent from your phone — voice + text, self-hosted, private. One link, your agent installs it. A Veraldar product.
veraldar/bifrost
Talk to your coding agent from your phone — voice + text, self-hosted, private. One link, your agent installs it. A Veraldar product.

twisted-builds-llc/sloppy_holley_flex-over-can
CAN bus input/output module for Holley Terminator X (also HP/Dominator class ECUs).

Miroeilola/vallox-rs485-controller
Replacement control panel for legacy Vallox SE ventilation units. Vallox DIGIT RS-485 protocol, bus-powered, ESP32, Home Assistant.

RSXLX/sunny-the-growing-sunflower-lamp
SUNNY — The Growing Sunflower Lamp | A personal lamp with customizable exteriors, traceable fabrication, and a local creative workspace.




GuzziFlipFlops/ESP32-Walkie-Talkie
An open source ESPNOW based walkie talkie with a 600 meter tested distance, with an OLED and multiple buttons to interact with
