# From Software Agents to Physical Devices: Inside the Agentic Hardware Stack

Michael Yuan · Second State · WeAreDevelopers World Congress NA 2026

> Vì sao attention là nút cổ chai khi chạy nhiều agent, và cách VibeKeys dùng Wi-Fi, MQTT, vibetty để báo trạng thái agent chạy trong Docker Sandbox.

Topics: Hardware, Agents, Sandboxes

Canonical: https://homus.dev/talks/from-software-agents-to-physical-devices-inside-the-agentic-hardware-stack

## 1. Mở đầu: câu hỏi "sao phải có thiết bị riêng?"

Speaker là Michael Yuan, Docker Captain (chương trình của Docker dành cho những người đóng góp nổi bật trong cộng đồng) và Founder của Second State. Chủ đề "rất khác so với phần lớn các talk khác": không phải một agent framework hay một kỹ thuật prompt, mà là phần cứng, những thiết bị vật lý dùng để làm việc với AI agent.

![Michael Yuan đứng ở bục Stage 4, màn hình chiếu tiêu đề talk](https://homus.dev/photos/IMG_3849.JPG)

Slide mở màn của ban tổ chức: tên talk "From Software Agents to Physical Devices: Inside the Agentic Hardware Stack", hai speaker trên agenda là Michael Yuan (Founder of Second State) và Vivian Hu (Product Manager at Second State), presenting partner là Docker. Thực tế chỉ có Michael trình bày.

Co-speaker mang thiết bị demo bị delay chuyến bay, nên trong suốt talk anh không có thiết bị thật trong tay để demo.

![Slide giới thiệu Michael Yuan và raffle Manning liveProject](https://homus.dev/photos/IMG_3851.JPG)

Slide giới thiệu: "Michael Yuan, PhD. Docker Captain. Maker of VibeKeys", kèm QR code và GitHub [github.com/juntao](https://github.com/juntao). Bên phải là khung raffle: "Win a free Manning liveProject series. Run open-source AI on your own computer. Enter now, while the talk runs", đăng ký tại [vibekeys.dev/manning.html](https://vibekeys.dev/manning.html).

![Slide tiêu đề của Michael: From Software Agents to Physical Devices](https://homus.dev/photos/IMG_3850.JPG)

Slide tiêu đề trong deck riêng của Michael: "From Software Agents to Physical Devices. Inside the agentic hardware stack: an open source voice-first controller, and the Docker Sandboxes runtime behind it". Dòng dưới cùng: Michael Yuan, PhD · Docker Captain · github.com/juntao · San Jose, Sept 24 2026. Năm chấm màu ở góc trái chính là bảng năm màu trạng thái agent sẽ xuất hiện ở phần 6.

Rồi anh đặt câu hỏi mà ai cũng sẽ hỏi khi nghe tới "physical device cho AI agent": tại sao lại cần một thiết bị vật lý? Bạn đã có điện thoại rồi. Bạn có thể remote vào máy chạy agent và nói chuyện với nó, bạn có thể dùng bàn phím trên điện thoại, đủ thứ cách khác. Vậy tại sao cần thêm một thiết bị nữa chỉ để tương tác với AI agent? Anh nói sẽ dành vài phút đi một đường vòng ngắn (a very short detour) để trả lời câu hỏi đó trước.

## 2. Supervision problem: mấy chục agent, một đôi mắt

Câu trả lời bắt đầu từ một vấn đề mà theo anh đã được nhắc tới rất nhiều lần trong ngày hôm đó: **supervision problem**, bài toán giám sát agent.

Anh kể mới thấy một tweet hôm qua, không biết mọi người đã thấy chưa. Trong ảnh là một người mở hơn 30 phiên AI coding agent trên mấy cái màn hình, và anh ta khoe rằng "software factory" của mình đốt khoảng 5 tới 10 tỷ token mỗi ngày. Rồi một blogger nổi tiếng hơn trả lời lại: anh ta thường xuyên có hơn 40 agent chạy cùng lúc, nhưng chỉ có sự chú ý để nhìn vào một cái. Theo Michael, đó là một trong những vấn đề chung nhất nếu bạn làm agentic development nhiều.

![Slide Developers run dozens of agents. Nobody can watch them all](https://homus.dev/photos/IMG_3852.JPG)

Slide "Many agents, one pair of eyes: Developers run dozens of agents. Nobody can watch them all." Bên phải là tweet của Theo (t3.gg, [@theo](https://x.com/theo)): "Having more than one thread open at the same time is the ultimate LARP. I regularly have 40+ threads running concurrently. I've never had a reason to look at more than one at a time." Tweet được trích bên dưới của @hraness: "my software factory uses 5-10B tokens a day", kèm danh sách 24x Devin SWE-2 Max, 6x Codex Astra Ultra, 2x Claude Code Fable Max và ảnh ba màn hình dày đặc terminal.

Hiện nay người ta tranh luận xem có cần nhìn code hay không, con người có nên ở trong vòng lặp (human in the loop) hay không, có nên review code hay không. Anh nhắc DHH vừa nói hôm qua một câu rất gây tranh cãi: DHH nói giờ anh ấy yêu Rust. Trước đây anh ấy ghét Rust, nhưng giờ thì yêu, vì bạn không cần nhìn code nữa: AI sinh ra toàn bộ code. Giống như bạn đâu cần nhìn machine code hay binary code vậy.

Dù mình thích hay không, Michael nói, tất cả chúng ta đều đang dùng rất nhiều AI agent, và thường chạy song song để làm những việc khác nhau. Có lúc mình nhìn code, có lúc không. Việc có nhìn hay không phần lớn bị giới hạn bởi một thứ: mình có bao nhiêu attention.

Và con người qua các năm không hề tăng khả năng tập trung; ngược lại, nó còn giảm, vì short video. Phần lớn mọi người giờ chỉ giữ được sự chú ý trong khoảng một hai phút. Điều đó lộ rõ khi bạn làm agentic coding: bạn có Codex hay Claude Code đang chạy. Theo trải nghiệm của anh, phần lớn agent task của anh không chạy qua đêm, chúng chạy khoảng 10 phút tới nửa tiếng. Và tới cuối nửa tiếng đó thì anh đã quên mất session này đang làm gì, vì trong lúc chờ anh đã mở thêm ba session khác. Anh liên tục mất dấu chuyện gì đang diễn ra trong từng cửa sổ, với từng agent.

## 3. Nút cổ chai là human attention budget, không phải model

Từ đó Michael rút ra luận điểm trung tâm của cả talk: nút cổ chai của agentic development không thật sự nằm ở chỗ model giỏi tới đâu, chạy nhanh tới đâu. Nút cổ chai là **human attention budget**, ngân sách chú ý của con người.

Anh so sánh với việc quản lý người. Nếu anh quản lý 20 nhân viên cùng lúc, anh sẽ không lượn quanh bàn từng người suốt ngày để xem chi tiết mọi output của họ. Nhưng với AI agent thì đôi khi mình lại phải làm vậy, vì agent cần hỏi mình phải làm gì tiếp: nó dừng lại chờ quyết định, chờ cho phép, chờ input. Nên nút cổ chai thật sự là attention budget của người đứng sau.

Luận điểm của Michael vẽ lại: số agent tăng, nhưng kênh chú ý của một người thì không tăng (thậm chí giảm vì short video). Việc cần giải là đưa đúng tín hiệu "agent nào cần bạn" tới người một cách rẻ nhất về attention.

Chính điều này dẫn tới câu trả lời: bạn cần một thiết bị. Và phần còn lại của talk, anh nói, là về cách thiết bị đó được dựng lên: technology stack nào được dùng để xây một **open source companion device cho AI coding**.

## 4. Năm mà agent có peripheral riêng: Codex Micro và Claude Desktop Buddy

Trước khi vào thiết bị của mình, Michael điểm qua vài thiết bị đã có trên thị trường, và nhấn mạnh rằng tất cả chúng tồn tại vì cùng một lý do: giải quyết attention deficit problem.

![Slide The year the agent got its own peripheral, so sánh ba thiết bị](https://homus.dev/photos/IMG_3853.JPG)

Slide "The year the agent got its own peripheral. Three teams, one shape, inside twelve months." Ba cột: **Codex Micro** (maker: OpenAI with Work Louder; price $230; input: 6 agent keys, 6 command keys, joystick, dial; link: USB). **Claude Desktop Buddy** (maker: Anthropic reference project; price khoảng $20, chạy trên M5StickC Plus; input: two buttons; link: BLE). **VibeKeys Max** (maker: open source, Second State; price $99; input: mechanical keys, knob, microphone; link: BLE 5, Wi-Fi, USB-C). Dòng cuối slide tóm lại "hình dạng chung": một bộ từ vựng trạng thái khoảng năm state, một cử chỉ vật lý cho quyết định đang chặn agent, một mức giá đủ thấp để thử, và một protocol được công bố.

### Codex Micro của OpenAI

Thiết bị đầu tiên là Codex Micro, ra mắt đầu năm nay, là thiết bị phần cứng của OpenAI (làm cùng [Work Louder](https://worklouder.cc/)). Michael tin chắc OpenAI sẽ có rất nhiều thiết bị phần cứng trong tương lai gần, và đây là một trong những cái đầu tiên. Nó là một bàn phím rất nhỏ. Giá bán $230, và bán hết ngay lập tức; trên thị trường thứ cấp như eBay có lúc nó lên hơn $1.000, vì người ta coi nó như một biểu tượng địa vị (status symbol).

Nó làm gì? Nó chỉ là một bàn phím không dây, thậm chí không phải bàn phím đầy đủ: chỉ có vài phím, không có màn hình. Vậy nó giải bài toán attention thế nào? Các phím sẽ sáng lên với màu khác nhau tuỳ theo trạng thái của coding agent. Coding agent đưa phản hồi cho bạn một cách rất nhẹ và tinh tế, qua màu của các phím trên bàn phím.

### Claude Desktop Buddy của Anthropic

Đi xa hơn một chút, phía Claude Code cũng có một thiết bị tên Claude Desktop Buddy. Họ không bán nó, mà tặng cho một số YouTuber và influencer. Michael có một cái, vì anh quen nhà sản xuất: thiết bị được sản xuất ở Thâm Quyến, chạy trên phần cứng M5StickC Plus của [M5Stack](https://www.m5stack.com/). Anthropic công bố nó như một reference project cho Bluetooth API dành cho maker: [github.com/anthropics/claude-desktop-buddy](https://github.com/anthropics/claude-desktop-buddy).

Cái này không phải bàn phím mà là một màn hình rất nhỏ. Màn hình hiển thị trạng thái hiện tại của session Claude Code, và bật alert khi có việc cần bạn chú ý: kiểu "session này cần bạn", rồi bạn quay sang chú ý tới session đó.

## 5. Vì sao không dùng điện thoại, và VibeKeys: open source từ PCB tới firmware

Tới đây Michael quay lại trả lời câu hỏi đầu talk: sao không dùng điện thoại? Vì trên điện thoại đã có đủ thứ gây xao nhãng. Nếu bạn mở một remote coding session trên điện thoại, anh "gần như đảm bảo" bạn sẽ không ngồi nhìn nó: bạn sẽ đi xem short video, làm việc khác trên điện thoại, và điện thoại chỉ trở thành thêm một nguồn xao nhãng nữa. Còn những thiết bị như trên thì nằm đó, chỉ làm đúng một việc (dedicated). Nó không bao giờ bỏ lỡ alert hay notification. Giá trị của nó nằm ở đó.

Lý do Michael đưa ra: giá trị của thiết bị không nằm ở bàn phím hay phần mềm, mà ở chỗ nó là một kênh notification dành riêng, không đụng tới điện thoại. Việc nó "không làm được gì khác" lại chính là tính năng.

### VibeKeys: có cả bàn phím lẫn màn hình

Ở phía bên kia của slide là thiết bị open source mà team anh tạo ra, tên là [VibeKeys](https://vibekeys.dev). Nó có cả bàn phím lẫn màn hình. Bạn có thể dùng bàn phím để nhập, dùng bàn phím để nhập bằng giọng nói (voice input), có thể chạm vào nó. Trong ảnh khó thấy vì màn hình không sáng, nhưng có một màn hình LCD nhỏ trên đó, hiển thị trạng thái của agent.

Đây là trọng tâm talk của anh. Toàn bộ thứ này là open source: toàn bộ phần cứng, PCB board, vỏ in 3D (3D printed case), cách map bàn phím, và toàn bộ phần mềm đi kèm. Anh hy vọng tới cuối talk, không chỉ là bạn có thể mua một cái nếu muốn, mà quan trọng hơn là bạn có thể tự làm một cái. Mua một con chip ESP32, trên Amazon bán khoảng $1 một con, rồi tự nối bàn phím, màn hình, microphone và các thứ khác. Bạn hoàn toàn tự làm được.

Anh nhắc lại: với mọi thiết bị kể trên, giá trị cốt lõi không phải vì chúng là bàn phím hay vì phần mềm nào đó, mà vì chúng là một thiết bị notification dedicated, không chen vào điện thoại của bạn. Thậm chí, cái hay của nó là bạn không xem video được trên đó, không có thứ gì khác để xao nhãng.

## 6. Five-color vocabulary: đọc trạng thái agent trong một cái liếc

Những thiết bị này thường dùng một bảng màu nào đó. Michael chiếu bảng màu phổ biến mà người ta hay dùng trên các thiết bị phần cứng cho agent.

![Slide The five-color vocabulary: idle, thinking, complete, input needed, error](https://homus.dev/photos/IMG_3854.JPG)

Slide "The five-color vocabulary": năm ô với năm chấm màu, đen = **idle**, xanh dương = **thinking**, xanh lá = **complete**, cam nâu = **input needed**, đỏ = **error**. Dòng chú thích: "Color, motion and position register in under 250 ms, before you look. Text has to be read." Tức là màu, chuyển động và vị trí được não ghi nhận trong dưới 250 ms, trước cả khi bạn chủ động nhìn; còn chữ thì phải đọc mới hiểu.

Anh giải thích: sẽ có một màu cho trạng thái thinking, để bạn thấy agent đang suy nghĩ. Rồi có xanh lá, vàng, đỏ, giống đèn giao thông: cho bạn biết agent đã dừng và làm xong việc, hay nó cần input của bạn, cần bạn chú ý, hay đang có lỗi. Đó là một color scheme rất đơn giản, nhìn một cái là biết agent đang làm gì, trạng thái hiện tại của agent là gì, qua phần cứng đó.

Sau đó là "một mẩu quảng cáo nhỏ": với VibeKeys thì có một điều rất thú vị. Mọi thứ đều open source, bạn tự build được, nhưng vẫn có rất nhiều người mua. Chỉ trong vài tháng, team đã bán được nhiều hơn hẳn dự tính (anh nói "well oversold").

## 7. Version 1: một Bluetooth keyboard biết "nghe ngược lại"

Michael bắt đầu kể về thiết kế version 1 của phần cứng. Version 1 rất đơn giản, vì lúc đầu team nghĩ có lẽ tất cả những gì cần chỉ là một Bluetooth keyboard. AI agent chạy trên máy tính của bạn, hay trên một máy remote, và ở đâu thì nó cũng cần bàn phím. Nếu có một bàn phím Bluetooth kết nối với máy đó, mình sẽ điều khiển được agent.

Đó thật ra là ý tưởng gốc của VibeKeys: nó chỉ có kiểu một phím tên là YOLO. Bạn có YOLO và Accept. Anh đùa: có vẻ đó đúng là điều người ngoài nghĩ về vibe coder, rằng họ chỉ bấm đúng hai phím đó cả ngày.

Nên team có thể làm một Bluetooth keyboard như vậy. Nhưng nó không giải được vấn đề anh vừa nói, attention deficit problem. Vì team không chỉ muốn thiết bị là input device, mà quan trọng nhất là muốn nó cũng là **output device**: độc lập với điện thoại và các thiết bị điện tử khác, để mình nhìn rất nhanh là biết agent đang làm gì, có cần mình chú ý không.

May là Bluetooth có sẵn cách làm việc đó. Bluetooth có nhiều profile khác nhau: có voice, có audio, có keyboard, và có data. Trong một thiết kế rất đơn giản, hay nói thẳng là thiết kế ngây thơ (naive design), bạn có một kết nối Bluetooth hai chiều. Bàn phím kết nối với máy đang chạy agent, giả sử là desktop hay laptop của bạn.

![Slide First iteration: A Bluetooth keyboard that listens back](https://homus.dev/photos/IMG_3855.JPG)

Slide "First iteration: A Bluetooth keyboard that listens back". Bên trái là VibeKeys Max với năm chấm màu và dòng "LCD shows agent status". Chiều đi: **BLE HID** mang keystrokes và voice transcript sang laptop. Chiều về: **BLE data** mang agent status về thiết bị. Trên laptop có ba lớp: terminal chạy claude, vibekeys plugin nhận từ Claude Code hooks, và host Bluetooth stack. Hai dòng chú thích: "Keystrokes go out as a standard Bluetooth keyboard. No driver, and they land in any terminal." và "A Claude Code plugin turns hook events into status messages and sends them to the device over Bluetooth data."

Rồi team tạo ra một plugin cho Claude Code hoặc Codex. Mỗi khi agent sinh ra output, output đó đi qua plugin trước. Việc của plugin là tìm kênh Bluetooth đang nối với thiết bị này và gửi data ngược về, để hiện lên màn hình nhỏ trên bàn phím. (Với Claude Code, cơ chế nằm dưới là [hooks](https://code.claude.com/docs/en/hooks): mỗi hook event được plugin biến thành một status message.)

Phần kết nối Bluetooth thì không cần phần mềm gì đặc biệt, vì phần cứng nào tương thích Bluetooth cũng kết nối được với máy tính. Nhưng để gửi trạng thái, gửi data ngược về thiết bị, bạn cần một plugin cho coding agent. Vì là dự án open source nên đã có sẵn plugin open source cho các agent đó, dùng được với những bàn phím này: [second-state/vibekeys_app](https://github.com/second-state/vibekeys_app) (host CLI cùng plugin cho Claude Code và Codex). Đó là thiết kế đầu tiên.

## 8. Giới hạn của version 1: agent phải chạy trần trên máy host

Nhưng trong kịch bản vừa mô tả có một vấn đề. Để Bluetooth hoạt động, agent phải chạy trên chính cái máy cung cấp Bluetooth đó. Nghĩa là không dùng được máy remote: agent phải chạy ở máy nằm trong tầm Bluetooth, trừ khi bạn mở một SSH terminal tới một cloud machine nào đó. Nói chung, bạn cần một cái máy đủ gần để bắt Bluetooth.

Thêm nữa, để truy cập Bluetooth stack, agent phải chạy trên hệ điều hành gần như không bị ngăn cản gì. Phản hồi đầu tiên team nhận được từ early user là: thiết kế này đòi agent chạy **không được bảo vệ (unprotected) trên host**. Điều đó gây khó. Chạy trên một cái Mac mini riêng thì còn được, nhưng trên chính laptop của mình thì nguy hiểm hơn nhiều, vì mình thật sự không muốn agent chạy không có bảo vệ trên laptop của mình.

Vấn đề của version 1 vẽ lại: đường Bluetooth buộc agent chạy ngay trên host, trong tầm sóng, và không có lớp cách ly. Early user chấp nhận điều đó trên một Mac mini riêng, nhưng không muốn trên laptop cá nhân.

Từ đây anh rẽ thêm một đường vòng nữa: nếu bạn không muốn agent chạy không có bảo vệ trên máy, bạn cần software stack nào?

## 9. Đường vòng qua Docker Sandboxes: sandbox cũng là một lời giải cho cognitive overload

Câu trả lời đưa tới [Docker Sandboxes](https://www.docker.com/products/docker-sandboxes/). Docker đã giới thiệu nó trong keynote của hội nghị. Nghe thì Docker Sandbox có vẻ như thêm một lớp phức tạp phủ lên agent. Nhưng thật ra, nhìn từ góc độ nhận thức, góc độ quá tải thông tin (information overload), nó dễ xử lý hơn nhiều so với một agent chạy trần (raw agent), vì bạn không còn lo agent sẽ làm một thay đổi thảm hoạ trên máy và xoá sạch home directory của bạn.

Về mặt tinh thần thì nhẹ hơn hẳn. Anh nói điều này đáng nhắc lại: Docker Sandbox không thật sự là một container, mà là một virtual machine chạy trong môi trường Docker, trong Docker Desktop. Nó là một VM cách ly hoàn toàn. Và vì cách ly hoàn toàn nên bạn có thể yên tâm chạy YOLO mode trong đó: bảo agent "làm phiền tôi càng ít càng tốt, cứ làm theo lời tôi trong một vòng lặp cho tới khi ra kết quả". Điều đó giảm cognitive load cho người dùng rất nhiều. Anh coi đó là một trong những điểm hay nhất của nó, và cũng là thứ biến nó thành một **lời giải** thay vì chỉ là thêm một lớp phức tạp nữa phải xử lý.

Theo quan điểm của Michael, Docker Sandbox cũng giống agentic hardware ở một điểm: nó là một lời giải khác cho cùng bài toán cognitive overload. Bạn có thể khởi động một Docker Sandbox rất dễ. Anh không biết trước là hôm nay Docker sẽ công bố một cloud-based Docker Sandbox, nhưng như đã nói, bàn phím agent chạy được với sandbox local nếu bạn chỉ có Bluetooth.

Vì sao sandbox giảm tải nhận thức: agent chạy trong một VM cách ly nên người dùng dám để nó tự chạy vòng lặp, không phải canh từng thao tác. Mặt trái, sẽ quay lại ở phần 10: chính sự cách ly đó chặn luôn đường Bluetooth.

Nhưng nếu bạn có một cloud machine chạy thứ gì đó như sandbox thì sao? Giờ có rất nhiều nhà cung cấp "máy tính cho agent": Vercel có một, Fly.io có một, Daytona có một, rất nhiều công ty có những VPS kiểu cloud-based như vậy, và giờ Docker cũng có cloud-based sandbox của họ. Làm sao dùng agentic hardware, dùng agent keyboard của mình để điều khiển những máy đó? Những máy đó không có kết nối Bluetooth nào mà bàn phím có thể tận dụng.

Slide lúc đó chỉ cách khởi động một Docker Sandbox cho agent. Ai quan tâm có thể ghé booth của Docker, họ có cả một setup để thử. Lệnh cài runtime được ghi ở slide cuối talk:

```
brew install docker/tap/sbx
```

## 10. Sandbox chặn Bluetooth, nên version 2 chuyển sang Wi-Fi với vibetty

Đây là vấn đề: để chạy sandbox, trên máy local hay trên cloud, thì phần keyboard input bạn còn xoay xở được. Dù sao bạn vẫn cần nhìn một cái màn hình. Nếu bạn nhìn được màn hình thì bạn nối bàn phím Bluetooth vào thiết bị mà bạn đang dùng để nhìn màn hình đó.

Nhưng như anh đã nói, phần bàn phím không phải phần quan trọng nhất, vì bàn phím chỉ giải bài toán gõ phím. Bài toán quan trọng nhất là notification, vì notification giải bài toán cognitive overload. Và các sandbox thường không cho phép bạn truy cập Bluetooth stack của localhost, vì lý do chính đáng: chúng cần cách ly. Toàn bộ ý nghĩa của sandbox là cung cấp bảo mật và ngăn bạn phá phần mềm, phá máy của chính mình. Nên nó thường không cho truy cập những tính năng phần cứng kiểu đó.

Nghĩa là thiết kế ngây thơ của version 1 không chạy được trong kịch bản này. Nếu bạn dùng YOLO mode, dùng container, dùng sandbox, hoặc (tốt hơn hay tệ hơn tuỳ bạn nhìn) một cloud-based sandbox, thì bạn không thể có Bluetooth gửi data ngược về, vì sandbox cách ly agent khỏi Bluetooth stack.

Điều đó dẫn tới version 2 của thiết kế: nếu không làm Bluetooth mà làm Wi-Fi thì sao? Một bàn phím Wi-Fi, và màn hình LCD trạng thái cũng qua Wi-Fi. Phức tạp hơn nhiều, nhưng cũng hữu dụng hơn nhiều. Theo Michael, đây là thứ thật sự khác biệt giữa thiết kế phần cứng của team anh so với những cái khác.

Team có một dự án open source tên là [vibetty](https://github.com/second-state/vibetty), và anh bảo cứ đoán từ cái tên: nó là một PTY wrapper, được vibe code bằng Rust, bọc quanh agent. Về cơ bản, đó là một lớp shell khác, bắt input và output của AI agent, và phần mềm đó trở thành điểm giao tiếp với phần cứng.

![Slide Second iteration: vibetty wraps the agent](https://homus.dev/photos/IMG_3856.JPG)

Slide "Second iteration: vibetty wraps the agent". Mô tả: vibetty chạy agent trong một PTY bên trong sandbox và kết nối tới MQTT server của nó; keystrokes đi vào qua Wi-Fi, trạng thái chi tiết (rich status) đi ra. Khung "In, from the device": keystrokes, voice transcripts. Khung "Out, to the device": working / waiting state, live terminal frames, và một retained announce message cho mỗi session. Lệnh mẫu trên slide ở ngay dưới.

```
$ vibetty -- claude --dangerously-skip-permissions
```

Lệnh này ghép đúng hai nửa của câu chuyện: `--dangerously-skip-permissions` là YOLO mode của Claude Code, chỉ nên bật khi agent đã nằm trong sandbox cách ly; còn `vibetty --` đứng trước để mọi thứ agent in ra và mọi phím đi vào đều đi qua wrapper, từ đó tới thiết bị.

## 11. Kiến trúc version 2: MQTT, tunnel, và chạy bộ vẫn điều khiển được agent

vibetty bắt keystrokes và bắt cả giọng nói. Điều thú vị là bạn có thể có một voice recognition engine riêng, ví dụ ElevenLabs, chứ không phải phần mềm nhận giọng như Typeless hay Whisper cài trên máy tính. Bạn có một voice input engine hoàn toàn tách biệt; bạn nói vào nó, nó biến lời nói thành keystroke, gửi tới vibetty server đang chạy (tất cả chạy trong sandbox), và vibetty biến thành keystroke gõ vào AI agent.

Chiều ngược lại cũng vậy. Khi AI agent có output, output đi qua vibetty, và vibetty có kết nối tới thiết bị phần cứng của anh, cho phép gửi notification và hiện alert.

Stack giờ phức tạp hơn, nhưng anh nghĩ nó cũng hữu dụng hơn hẳn. Vì với Wi-Fi, cộng thêm những thứ như [Tailscale](https://tailscale.com/) hay [Cloudflare Tunnel](https://www.cloudflare.com/products/tunnel/), anh có thể ra khỏi nhà. Anh có thể đi chạy bộ mà vẫn mang VibeKeys theo, miễn là còn kết nối Internet. Đang chạy bộ thì kết nối Internet bằng cách nào? Dùng điện thoại làm hotspot. Thế là anh làm được vô số thứ, vì với bàn phím, máy chạy agent giờ nằm "trên cloud": nó truy cập được qua Internet chứ không còn qua Bluetooth nữa.

vibetty chạy [MQTT](https://mqtt.org/) server riêng của nó, một protocol open source khác, về cơ bản là một IoT server dựa trên event. Server nhận mọi event từ thiết bị, dùng giao thức TTY để giả lập keystroke và gửi vào agent. Còn bất cứ thứ gì agent trả về, nó cũng đi ra theo từng ký tự hay từng token; đó là những event có thể gửi ngược về bàn phím, và bàn phím hiển thị chúng. Nói cách khác, bàn phím trở thành một chiếc máy tính mini chứ không chỉ là bàn phím.

Version 2 vẽ lại từ lời Michael và slide vibetty: thiết bị nói chuyện qua Wi-Fi và Internet, đi qua tunnel vào MQTT server trong sandbox; vibetty đứng giữa MQTT và agent, biến event thành keystroke và biến output của agent thành event gửi ngược về. Không còn dòng nào cần Bluetooth của host.

Trong bối cảnh Docker Sandbox, vì nó thật sự là một virtual machine, bạn có thể đặt policy kiểu: tôi cho phép kết nối tới MQTT server này, hay tunnel server tôi đã dựng như Tailscale. Điều đó cho phép Docker Sandbox (trên cloud hay trên máy của bạn) tunnel ra Internet chung, rồi qua Wi-Fi kết nối tới bàn phím của bạn.

## 12. Voice first: nói với bàn phím thay vì nói với máy tính

Tiếp theo anh muốn nói về tính năng mà người dùng muốn nhất ở những bàn phím này: voice. Người ta hay bảo "bàn phím của anh chỉ có năm phím, vậy nếu tôi muốn làm gì phức tạp hơn thì sao?" Anh luôn trả lời: dùng giọng nói.

Trong setup Bluetooth, bạn có thể dùng phím voice làm hotkey để bật phần mềm đọc chính tả (dictation) trên thiết bị của bạn, laptop hay máy tính. Như đã nói ở trên, thường đó là Typeless hay Whisper, kiểu vậy. Với Wi-Fi, bạn vẫn làm thế được, nhưng lúc đó bạn không ngồi gần máy tính, nên bạn sẽ không nói với máy tính. Thay vào đó bạn nói với bàn phím.

Bàn phím có microphone, và microphone có thể gửi gói âm thanh (voice packet) tới phần mềm nhận giọng nói trên cloud: như anh đã nói, ElevenLabs, OpenAI, hay bất kỳ nhà cung cấp nào. Khi bạn bấm phím microphone trên bàn phím, qua Wi-Fi nó kết nối tới một trong các dịch vụ voice recognition.

![Slide Voice first: pipeline từ phím mic tới keystrokes](https://homus.dev/photos/IMG_3858.JPG)

Slide "Voice first": năm bước Press mic key → On-device noise suppression → WAV over HTTP to Whisper → Transcript returns → Sent to the agent as keystrokes. Ba chú thích bên dưới. **Push to talk**: một lần bấm phím bắt đầu và kết thúc việc thu; thiết bị không có wake word, không nghe liên tục. **Transcript is keystrokes**: chữ hiện ra trong terminal, nơi bạn đọc và sửa được trước khi bấm Enter. **Your endpoint**: Whisper URL là một setting, có thể là OpenAI, Groq, hoặc một server bạn tự chạy.

Anh nói các dịch vụ đó bây giờ rất đáng kinh ngạc. Ở thế hệ cũ, nếu anh nói kiểu vừa nói, lòng vòng, ngắc ngứ, thì bản chép sẽ đầy những chỗ ngắt quãng. Bây giờ anh nói y như vậy, nó sinh ra một bản chép được viết rất đẹp về điều anh **muốn nói**, chứ không phải điều anh **đã nói**. Nên anh thấy voice là một phần thiết yếu của vibe coding: cứ nói với máy tính và máy tính làm gì đó. Giờ thì bạn nói với bàn phím, và bàn phím làm gì đó.

Đó là một phần nữa của stack: đi tới một AI service riêng, lấy bản chữ (text) từ giọng nói, rồi gửi đoạn text đó dưới dạng keystroke vào AI agent.

Tóm lại tới đây, Michael đã nói cách phần cứng đi vòng qua sandbox: sandbox thường chặn Bluetooth, nhưng không chặn Wi-Fi hay Internet nói chung. Và anh đoán mọi người sẽ hỏi tiếp: nhưng như vậy vẫn chưa giải được vấn đề nói ở đầu. Nếu tôi có kiểu 40 coding thread hay 40 terminal khác nhau, làm sao một bàn phím điều khiển được tất cả?

## 13. Một bàn phím cho 40 agent: làm việc với agent orchestrator

Anh nói phần này thật ra rất thú vị. Vì phần lớn mọi người ngày nay dùng một loại agent orchestrator nào đó, và anh chắc khán giả cũng vậy: [herdr](https://herdr.dev), hay [Omarchy](https://omarchy.org) Linux. Chúng đều có kiểu các panel con trên màn hình, và bạn thấy một đám agent đang sinh output trong đó.

![Slide Works with agent orchestrators: herdr và Omarchy](https://homus.dev/photos/IMG_3859.JPG)

Slide "Works with agent orchestrators": vibetty chỉ là một lệnh đặt trước agent, nên nó chạy được ở bất kỳ đâu một orchestrator khởi động một terminal agent. Khung **herdr**: một terminal multiplexer cho coding agent, theo dõi trạng thái idle, working, blocked và done cho từng pane ([herdr.dev](https://herdr.dev)). Khung **Omarchy**: một setup Arch Linux và Hyprland có sẵn agent launcher và layout tmux; Omarchy 4 dùng herdr làm mặc định ([omarchy.org](https://omarchy.org)). Thanh dưới: "Plugin per orchestrator", một chiều đưa agent status tới VibeKeys, chiều kia nhận yêu cầu switch-agent từ bàn phím.

Hai lệnh trên slide, một cho herdr và một cho Omarchy (dựng một "swarm" bốn pane, mỗi pane là một session của thiết bị):

```
# in any herdr pane
$ vibetty -- claude

# a four-pane swarm, each pane a device session
$ tsl 4 "vibetty -- claude"
```

Cách xử lý là một skill cài vào orchestrator, ví dụ herdr. Skill đó cho phép bàn phím tự chuyển giữa các agent. Bàn phím có một cái núm xoay (knob); anh lại xin lỗi vì lẽ ra phải có thiết bị trong tay mà không có. Khi bạn xoay núm, nó gửi một tín hiệu đặc biệt tới herdr. Và herdr hiểu tín hiệu đó, vì nó có skill: nó hiểu là bạn muốn chuyển terminal. Nó sẽ chuyển sang terminal khác, hoặc liệt kê các terminal lên màn hình để bạn chọn một cái, rồi sang code ở đó, sang terminal khác.

Cơ chế Michael mô tả: núm xoay trên VibeKeys gửi một tín hiệu đặc biệt; skill cài trong orchestrator dịch tín hiệu đó thành lệnh chuyển pane (hoặc hiện danh sách để chọn). Chiều ngược lại, plugin gửi trạng thái từng pane về màn hình nhỏ trên bàn phím.

Tóm lại: nhờ có bàn phím Wi-Fi, có sandbox, và có những skill cài được vào agent orchestrator, bạn có thể có nhiều agent session cùng lúc, trên máy tính hay trên cloud, và dùng một bàn phím với một màn hình nhỏ để điều khiển tất cả.

## 14. Đồng hồ, màn hình nhỏ, và lời mời tự build một cái

Vì những thứ này thú vị như vậy nên người ta gợi ý cho team đủ loại ý tưởng: "làm được cái này không, làm được cái kia không?". Team có thêm hai thứ nữa, cả hai cũng là open source hardware.

Cái thứ nhất là một chiếc đồng hồ (watch). Như anh đã nói, bài toán input thì đã giải bằng voice. Còn bài toán output là thứ anh thật sự muốn giải, cho cognitive overload. Đồng hồ là một form factor khá tốt: anh có thể chạy bộ, và miễn là đồng hồ có Internet (kết nối với điện thoại hay mạng di động), nó có thể gửi notification cho anh; nếu muốn xử lý notification đó, anh chỉ cần nói vào đồng hồ. (Repo vibetty ghi rõ nó chia sẻ terminal của agent tới "vibekeys, vibewatch, etc.".)

Cái thứ hai rất nhỏ, cỡ chừng chiếc điện thoại của anh. Nó cũng không có bàn phím, nhưng có một màn hình rất nhỏ hiển thị được nhiều agent. Nó có một nút nhỏ để chọn: tôi muốn chuyển từ agent này sang agent kia. Và quan trọng nhất, nó cho bạn đèn đỏ, đèn xanh, đèn vàng: agent nào đang cần bạn chú ý ngay. Để bạn đi xử lý, kể cả khi đang xem TikTok: thấy alert, "ok, đi xử lý cái đó".

Ba form factor Michael kể: bàn phím, đồng hồ, và thiết bị màn hình nhỏ cỡ điện thoại. Input giải bằng voice, output giải bằng tín hiệu màu; phần dưới là cùng một stack đã mô tả ở phần 11.

Điều anh muốn nói là: tất cả đều open source, và bạn có thể làm vô số thứ của riêng mình. Anh kể hôm qua vừa thấy Meta giới thiệu một thiết bị cho AI agent Muse của họ, cỡ một chiếc đồng hồ, bạn nói chuyện được với nó, nó có nhân vật hoạt hình, đủ thứ. Có rất nhiều thứ làm được, một khi bạn hiểu cách nối thiết bị với AI agent. Và chỉ có vài protocol bạn cần hiểu.

Tới đây thì hết giờ, và đó là phần kết của talk. Toàn bộ phần mềm như vibetty, kể cả firmware nạp vào chip ESP32 (ESP32-S3), đều là open source. Phần lớn viết bằng Rust, một số bằng C. Nhưng điểm chính, anh nói, là bạn chỉ cần trỏ Claude Code vào đó và bảo "sửa nó theo cách tôi muốn". Cùng với vỏ in 3D và các thứ khác, bạn tìm được hết trong GitHub repository của team, đủ để tự làm một cái hoàn toàn theo ý mình. "All right, that's it. Thank you."

![Slide Build your own với danh sách repo và QR code](https://homus.dev/photos/IMG_3860.JPG)

Slide cuối "Build your own": [docker.com/products/docker-sandboxes](https://www.docker.com/products/docker-sandboxes/) (agent runtime, cài bằng `brew install docker/tap/sbx`); [github.com/second-state/vibekeys_firmware](https://github.com/second-state/vibekeys_firmware) (Rust firmware cho [ESP32-S3](https://www.espressif.com/en/products/socs/esp32-s3)); [github.com/second-state/vibekeys_app](https://github.com/second-state/vibekeys_app) (host CLI và plugin cho Claude Code / Codex); [github.com/second-state/vibetty](https://github.com/second-state/vibetty) (terminal mirroring qua MQTT và WebSocket); [vibekeys.dev](https://vibekeys.dev) (board, vỏ, và bản lắp sẵn $99). Hai QR code: Manning raffle và VibeKeys Max. Chân slide: "Questions", Michael Yuan, PhD · github.com/juntao · vibekeys.dev.

## Nguồn và link

- Trang session chính thức: [From Software Agents to Physical Devices: Inside the Agentic Hardware Stack](https://www.wearedevelopers.com/world-congress-north-america/agenda/sessions/from-software-agents-to-physical-devices-inside-the-agentic-hardware-stack-1221499)

- Speaker: Michael Yuan, [github.com/juntao](https://github.com/juntao); công ty [Second State](https://www.secondstate.io/)

- VibeKeys: [vibekeys.dev](https://vibekeys.dev) · raffle [vibekeys.dev/manning.html](https://vibekeys.dev/manning.html)

- Repo open source: [second-state/vibetty](https://github.com/second-state/vibetty) · [second-state/vibekeys_app](https://github.com/second-state/vibekeys_app) · [second-state/vibekeys_firmware](https://github.com/second-state/vibekeys_firmware)

- Runtime: [Docker Sandboxes](https://www.docker.com/products/docker-sandboxes/)

- Thiết bị khác trên slide: [anthropics/claude-desktop-buddy](https://github.com/anthropics/claude-desktop-buddy) (reference cho Bluetooth API, chạy trên [M5Stack](https://www.m5stack.com/) M5StickC Plus) · Codex Micro làm cùng [Work Louder](https://worklouder.cc/)

- Agent orchestrator: [herdr.dev](https://herdr.dev) · [omarchy.org](https://omarchy.org)

- Protocol và hạ tầng: [MQTT](https://mqtt.org/) · [Tailscale](https://tailscale.com/) · [Cloudflare Tunnel](https://www.cloudflare.com/products/tunnel/) · [Whisper](https://github.com/openai/whisper) · [ESP32-S3](https://www.espressif.com/en/products/socs/esp32-s3) · [Claude Code hooks](https://code.claude.com/docs/en/hooks)

- Tweet trên slide: Theo, [@theo](https://x.com/theo). Trang sản phẩm chính thức Codex Micro: [worklouder.cc/codex-micro](https://worklouder.cc/codex-micro).

- Câu của DHH về Rust mà Michael nhắc: phát biểu tại keynote [Rails World 2026](https://rubyonrails.org/world/2026/) (23/09/2026, Austin, một ngày trước talk này), tường thuật tại [rustify.rs](https://rustify.rs/articles/rails-world-2026-keynote-dhh-hey-rust-ai-agents).

- Thiết bị của Meta nhắc ở phần 14: Muse Charm, công bố tại Meta Connect 23/09/2026, xem [TechCrunch](https://techcrunch.com/2026/09/23/meta-made-a-tamagotchi-like-wearable-for-its-muse-ai-agent/).
