AI Decision System
Replayable, offline-verifiable records for AI-assisted go/no-go decisions: experiment promotions, typed model answers and human-approved actions.
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗A native macOS app for creating and running Lima virtual machines entirely from a GUI: pick CPUs, memory, disk and network interfaces, then start, stop and use your VMs, and build virtual NAT, host-only and bridged networks without root.
Website: izawa.github.io/HanaLima · 日本語版 README
Hana lima is Hawaiian for "handmade" — hana, to make; lima, hand (and five). The icon is a plumeria, Hawaii's five-petaled flower, whose petals are VMs you build by hand around one network.
[!IMPORTANT] HanaLima is an unofficial, independent project. It is not affiliated with, endorsed by, or supported by the Lima project or the Cloud Native Computing Foundation (CNCF). "Lima" is used only to describe what this app works with. Please report HanaLima problems here, not to the Lima project.
[!WARNING] HanaLima is in early development. There are no signed or notarized releases yet; build it from source.
limactl watch and image download progress (percent, speed and time left).limactl shell) inside the app that waits until the VM is actually ready.lima.yaml with Lima's validation. Only the fields you change are written back. While a VM runs, its settings stay viewable (read-only), provisioning scripts included. Ready-made provisioning examples can be added in one click: basic tools, your dotfiles and public key, Docker Engine, an XDP development toolchain, Japanese locale and time zone, no automatic updates, a swap file, development languages (Go, Node.js, uv, rustup) and a one-shot full upgrade (tested on Ubuntu, Fedora and, where it applies, Alpine; the first four on Debian too).~/.ssh. When creating a VM you can turn that off (--mount-none) — useful when the VM runs something you don't fully trust, such as an AI coding agent — and share just one work folder instead, writable or read-only, at the same path inside the VM. This hides files, not the network: through Lima's built-in user-mode network the VM can still reach the internet, your LAN and services listening on the Mac's 127.0.0.1 (docs/06, in Japanese).limactl disk).limactl prune), each VM's snapshots, and the snapshots and moved disks left behind by VMs deleted with limactl directly, ready to delete.en0), served by a small helper (hanalima-netd) on macOS 26 vmnet. No sudo and no socket_vmnet needed. After you change or delete a network, VMs using it are told what to do: a running VM shows a Restart button, and a NIC left pointing at a deleted network is offered for removal before the next start.lima:shared, lima:host or lima:bridged (socket_vmnet, installed by following Lima's instructions) keep working and can be edited as usual. HanaLima itself doesn't install socket_vmnet; its own networks need no root.limactl autostart.limactl clone, APFS clones). The copy gets a new name, host name, MAC addresses and SSH keys; a disk on an external drive is cloned on that drive. Each VM shows where it came from, its copies and a note.ssh.config (group [hanalima], host lima-<name>) and runs your ansible-playbook (brew install ansible or pip install ansible) in the playbook's folder, so roles and ansible.cfg next to it apply. become works without setup (Lima gives you passwordless sudo). The same inventory works from the terminal: ansible-playbook -i ~/Library/Application\ Support/HanaLima/ansible/inventory.ini ….Install Lima and the additional guest agents:
brew install lima lima-additional-guestagents
Install the Metal Toolchain for Xcode, if you haven't already:
xcodebuild -downloadComponent MetalToolchain
Clone and build. The script builds build/HanaLima.app and signs it ad hoc for your Mac:
git clone https://github.com/izawa/HanaLima.git
cd HanaLima
scripts/build-app.sh release
Launch it:
open build/HanaLima.app
Or install it into /Applications (quits a running HanaLima first) and launch it from there:
scripts/make-app.sh --install --open
Click + New VM at the bottom of the sidebar, pick a template (for example default or alpine), and create it. The first start downloads the OS image.
To use a fixed IP or a bridged network, open Networks in the sidebar, create a network with +, then choose Add NIC in the Network section of the VM's Settings tab.
HanaLima shows its UI in Japanese when Japanese is your preferred language, and in English otherwise. To use a different language for HanaLima only, choose it under System Settings → General → Language & Region → Applications, or launch it once with:
open build/HanaLima.app --args -AppleLanguages '(en)'
HanaLima does not link Lima's Go code. It drives the limactl CLI, Lima's public interface, and reads its JSON output (limactl list --format json, limactl watch --json). Changes to lima.yaml go through limactl edit, so Lima validates them.
Virtual networks are provided by hanalima-netd, a helper bundled in the app. Each network is registered as a per-user LaunchAgent with socket activation. A VM attaches with Lima's networks: - socket: <path> (the socket_vmnet protocol), and the helper relays its frames to a vmnet network (NAT/host-only) or a bridged vmnet interface. The helper needs no root, only the com.apple.security.virtualization entitlement, which scripts/build-app.sh applies. Networks keep working when the app is not running, including for VMs started with plain limactl start.
| Path | Purpose |
|---|---|
Sources/LimaKit | limactl wrapper (no UI dependencies) |
Sources/NetworkKit | Virtual network definitions, LaunchAgent management, DHCP helpers |
Sources/hanalima-netd | Network helper (Lima socket ⇄ vmnet relay) |
Sources/HanaLima | SwiftUI app |
Prototypes/ | Experiments from the networking investigation, including a reproduction of a macOS vmnet bug |
docs/ | Design notes and investigation logs (in Japanese) |
Files HanaLima creates:
~/Library/Application Support/HanaLima/ — networks.json, the installed helper, network sockets~/Library/LaunchAgents/org.izawa.HanaLima.net.<name>.plist — one per virtual network~/Library/Logs/HanaLima/ — helper logsLima's own files (~/.lima, the image cache in ~/Library/Caches/lima, and ~/Library/LaunchAgents/io.lima-vm.autostart.<name>.plist for start at login) are managed by limactl. Storage → Usage in the sidebar shows them.
bridge100 and remove the Mac's own IPv4 address (reported to Apple as FB25122122). HanaLima never reuses networks, but other virtualization tools running at the same time might. If your Mac loses its IPv4 address, renew DHCP in System Settings (or run sudo ipconfig set en0 DHCP) or restart. Details: docs/02-networking-investigation.md.en1), but some access points refuse frames from more than one MAC address per client; if a VM on a Wi-Fi bridge gets no address, try a wired interface.Delete the HanaLima networks in the app first (this unregisters their LaunchAgents), then remove the app and its data:
rm -rf ~/Library/Application\ Support/HanaLima ~/Library/Logs/HanaLima
If a network's LaunchAgent is still registered, unload it with launchctl bootout gui/$(id -u)/org.izawa.HanaLima.net.<name> and delete its plist from ~/Library/LaunchAgents. Your Lima VMs in ~/.lima are not touched.
scripts/build-app.sh # debug build of build/HanaLima.app
swift test --skip EndToEnd --skip DaemonTermination # unit tests (no VMs, a few seconds)
HANALIMA_E2E=1 swift test --filter <Suite> # end-to-end tests with real VMs
End-to-end tests create VMs named hanalima-e2e-* and temporary networks, and remove them afterwards. Run scripts/build-app.sh first for the network tests (they need the entitlement-signed helper). BridgeEndToEndTests puts a host interface into a bridge, so it only runs when you name the interface: HANALIMA_E2E_BRIDGE=en0.
If the build fails because metal cannot be found after a restart, run swift package clean and build again.
The UI is available in English and Japanese. Source strings are Japanese; the English translations live in the String Catalog Resources/Localizable.xcstrings (Xcode can open it). Since the app is built with SwiftPM, strings are extracted by the Swift compiler through a script:
scripts/update-strings.sh # extract strings from Sources/ and merge them into the catalog
scripts/check-strings.py # list Japanese literals that won't be translated
Text passed to SwiftUI as a literal (Text("…"), Button("…")) is localized automatically. Strings built in code need String(localized: "…"). LabeledContent(_:value:) takes a plain String; use LabeledContent("…") { Text("…") } instead.
Design decisions and their reasons are in docs/04-design.md.
Issues and pull requests are welcome, in English or Japanese. For larger changes, please open an issue first to discuss the approach.
HanaLima is released under the MIT License.
It uses SwiftTerm (MIT) and Yams (MIT). Lima (Apache License 2.0) is not included; HanaLima runs the limactl installed on your Mac.
Yukimitsu IZAWA — [email protected]