Skip to the content
PCBKitNew board
2 layers80 × 60 mmCurrent C, the printed circuit board in 3D

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

Size
80 × 60 mm
Copper layers
2
Thickness
1.6 mm
Parts
52
Nets
46
Pads
270
Tracks, vias
215, 26
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
24 Sep 2026
Updated
6 Nov 2026

Overview

Current C 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 52 parts on 46 nets, routed with 215 tracks and 26 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 17 resistors, 11 connectors, 10 ICs, 9 capacitors and 4 diodes. It belongs with the ESP32 and RISC-V boards of this library.

Main components

4

README

README.md

Bifrost — talk to your coding agent from your phone

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.

Easiest install: let an agent do it (Omarchy, Arch, Debian, any Linux box)

Open your coding agent (opencode, Claude Code, Codex, …) in an empty folder and give it this one line:

text
https://raw.githubusercontent.com/veraldar/bifrost/v0.6.0/skills/install/SKILL.md set it up

That'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.

Deploy with Vercel

One-click Vercel deploy of the PWA: after cloning, set the env vars LIVEKIT_URL, LIVEKIT_API_KEY, LIVEKIT_API_SECRET (see pwa/.env.example). Text-mode needs OPENCODE_URL reachable from the deployment — keep opencode private (Tailscale), it has shell access!

Using other AIs (Claude Code, Codex, …)

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.

Your voice, your identity

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.

Architecture

Hardware — 3 nodes, one Tailscale tailnet (no public exposure):

NodeRole
PhonePWA 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):

text
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):

LayerPrimaryFallback
STTQwen3-ASR (MLX, Mac :8001)speaches faster-whisper (CPU, :8000)
TTSQwen3-TTS (MLX, Mac :8001)speaches Kokoro (CPU, :8000)
LLMopencode's configured model (VOICE_MODEL)—

Everything is systemd-managed on omarchy (lk-pwa, lk-agent, opencode-serve) + docker compose — reboots self-heal.

  • PWA (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.
  • Proxy (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 (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 (deploy/) — docker compose: LiveKit (host network, ICE pinned to tailnet + LAN IPs so phone media flows over Tailscale) + speaches STT/TTS.
  • Diagnostics — the PWA records console errors, crashes, network timings, and taps, uploads them in batches, and they are logged server-side (journalctl + pwa/.diag/*.log). Log-only by design: no automatic fix sessions (a past auto-autofix experiment was removed as a bad idea).

One-click install (self-host)

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).

bash
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 HTTPS

Or deploy just the PWA to Vercel with the button above and point it at your LiveKit (and a network-reachable opencode).

Env vars

VarWherePurpose
LIVEKIT_URLpwa / agentsignal URL (wss://… for web, ws://127.0.0.1:7880 local)
LIVEKIT_API_KEY/SECRETpwa / agenttoken minting / worker auth
OPENCODE_URLpwa / agentopencode REST (http://127.0.0.1:4096)
VOICE_MODELagentopencode model for spoken replies
SPEACHES_URL, STT_MODEL, TTS_MODEL, TTS_VOICEagentspeech stack fallbacks

Roadmap

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.

versionthe one change
v0.6.1releases carry their own env; switch/rollback between any built version
v0.6.2speech-to-text in-process in the voice agent (no STT service)
v0.7yggdrasil becomes the brain (opencode-compatible, light prompt)
v0.8bifrost-net bridge as a second transport + an Android app as its first client
v0.9bridge-first: no tailnet needed

docs/plan.md keeps the working board; docs/environments.md records installs and test runs.

Support

Want to be part of the journey? Veraldar is free and stays free — but it isn't free to build.

  • GitHub Sponsors: github.com/sponsors/veraldar (pending activation)
  • OpenCollective: opencode Collective pending — transparent public ledger

Every franc goes to hardware, hosting, and keeping the voice local.

License

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).

Parts

52
QtyValueFootprintReferences
1010kR_0603_1608MetricR2, R3, R4, R8, R10, R11, R12, R14, R15, R16
5100nFR_0603_1608MetricC3, C5, C6, C8, C9
51kR_0603_1608MetricR1, R6, R7, R9, R13
410uFC_0805_2012MetricC1, C2, C4, C7
3ESP32-C3-WROOM-02-N4ESP32-C3-WROOM-02U1, U5, U9
3ME6211C33M5SOT-23-5U3, U8, U11
3PROGPinHeader_1x05_P2.54mm_VerticalJ1, J4, J8
3PWRLED_0603_1608MetricD1, D3, D4
25V_INPinHeader_1x02_P2.54mm_VerticalJ7, J11
10.1RR_1206_3216MetricR17
11.2kR_0603_1608MetricR5
1ADXL343LGA-14_3x5mm_P0.8mm_LayoutBorder1x6yU2
1BAT_18650JST_PH_B2B-PH-K_1x02_P2.00mm_VerticalJ2
1CHRGLED_0603_1608MetricD2
1CUTOFF_RELAYPinHeader_1x02_P2.54mm_VerticalJ10
1FAN_RELAYPinHeader_1x02_P2.54mm_VerticalJ6
1INA226MSOP-10_3x3mm_P0.5mmU10
1LOAD_SHUNTPinHeader_1x02_P2.54mm_VerticalJ9
1NTC_10K_B3950PinHeader_1x02_P2.54mm_VerticalTH1
1PIRPinHeader_1x02_P2.54mm_VerticalJ5
1RELAYPinHeader_1x02_P2.54mm_VerticalJ3
1SCD41Sensirion_DFN-4-1EP_2x2mm_P1mm_EP0.7x1.6mmU6
1TP4056SOIC-8_3.9x4.9mm_P1.27mmU4

Questions

How big is the Current C PCB?

It measures 80 × 60 mm and has 2 copper layers, 1.6 mm thick.

What parts does the Current C use?

52 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.

Where can I download the Current C KiCad files?

From the veraldar/bifrost repository on GitHub, at the commit this page was made from: the board is hardware/build/current-C.kicad_pcb and its schematic hardware/airnode-B/airnode-B.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Current C design in my own project?

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).

More from veraldar/bifrost

2
  • 2 layers80 × 60 mmAirnode B, the printed circuit board in 3D

    Airnode B

    veraldar/bifrost

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

    36 partsAGPL-3.0
  • 2 layers80 × 60 mmBeacon A, the printed circuit board in 3D

    Beacon A

    veraldar/bifrost

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

    21 partsAGPL-3.0

Similar boards

  • 2 layers98 × 79.5 mmFlex over can, the printed circuit board in 3D

    Flex over can

    twisted-builds-llc/sloppy_holley_flex-over-can

    CAN bus input/output module for Holley Terminator X (also HP/Dominator class ECUs).

    86 parts1
  • 2 layers104 × 66 mmVallox rs485-controller, the printed circuit board in 3D

    Vallox rs485-controller

    Miroeilola/vallox-rs485-controller

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

    65 parts
  • 4 layers60 × 32 mmSUNNY C1-MAIN, the printed circuit board in 3D

    SUNNY C1-MAIN

    RSXLX/sunny-the-growing-sunflower-lamp

    SUNNY — The Growing Sunflower Lamp | A personal lamp with customizable exteriors, traceable fabrication, and a local creative workspace.

    33 parts
  • 2 layers35 × 39 mmNex, the printed circuit board in 3D

    Nex

    dialgorithm/nex

    esp32 swarm bots

    60 parts1
  • 2 layers46 × 90.7 mmAuraClicker, the printed circuit board in 3D

    AuraClicker

    AayushmanDas/AuraClicker

    Presentation device

    29 partsMIT
  • 2 layers35.4 × 27 mmWifiaudio, the printed circuit board in 3D

    Wifiaudio

    BearLaboratory/wifiaudio-tx-hardware

    WiFi无线麦克风硬件pcb设计

    29 parts110GPL-3.0
  • 2 layers35 × 100 mmWalkieTalkie, the printed circuit board in 3D

    WalkieTalkie

    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

    66 parts7MIT
  • 2 layers93.2 × 93.2 mmSmartcoaster routed, the printed circuit board in 3D

    Smartcoaster routed

    bdus/SmartCoaster

    AI native Industrial and Embedded Design

    70 parts