{"id":50034159,"url":"https://github.com/joeblew999/utm-dev","last_synced_at":"2026-05-20T23:40:54.656Z","repository":{"id":303930321,"uuid":"1008191588","full_name":"joeblew999/utm-dev","owner":"joeblew999","description":"Build Gio + Tauri apps for macOS, iOS, Android \u0026 Windows — UTM VM automation for Apple Silicon","archived":false,"fork":false,"pushed_at":"2026-03-19T06:12:41.000Z","size":14411,"stargazers_count":7,"open_issues_count":7,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-19T22:40:02.128Z","etag":null,"topics":["gio"],"latest_commit_sha":null,"homepage":"https://joeblew999.github.io/goup-util/","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/joeblew999.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-06-25T07:03:57.000Z","updated_at":"2026-03-19T06:12:45.000Z","dependencies_parsed_at":"2025-07-10T15:34:02.463Z","dependency_job_id":"cb3d0886-c509-4ef9-a41a-5736fbfc331c","html_url":"https://github.com/joeblew999/utm-dev","commit_stats":null,"previous_names":["joeblew999/goup-util","joeblew999/utm-dev"],"tags_count":11,"template":false,"template_full_name":null,"purl":"pkg:github/joeblew999/utm-dev","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joeblew999%2Futm-dev","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joeblew999%2Futm-dev/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joeblew999%2Futm-dev/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joeblew999%2Futm-dev/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/joeblew999","download_url":"https://codeload.github.com/joeblew999/utm-dev/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joeblew999%2Futm-dev/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33280306,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-20T15:12:43.734Z","status":"ssl_error","status_checked_at":"2026-05-20T15:12:42.300Z","response_time":356,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["gio"],"created_at":"2026-05-20T23:40:53.931Z","updated_at":"2026-05-20T23:40:54.649Z","avatar_url":"https://github.com/joeblew999.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# [utm-dev](https://github.com/joeblew999/utm-dev)\n\nHelp devs not go crazy.\n\nBuild [Tauri](https://tauri.app/) apps for **all 5 platforms** — macOS, iOS, Android, Windows, Linux — without thinking about where code runs.\n\n**You just say what you want. utm-dev figures out the rest.**\n\n```bash\nmise run mac:dev          # runs natively on your Mac\nmise run ios:sim          # runs natively on your Mac\nmise run android:sim      # runs natively on your Mac\nmise run windows:build    # runs in a Windows VM (auto-created)\nmise run linux:build      # runs in a Linux VM (auto-created)\nmise run linux:dev        # opens a Linux desktop VM for dev/testing\n```\n\nYou never manage VMs, install cross-compilers, or SSH into anything. If the target platform needs a VM, it starts one. If it doesn't, it runs locally. Same commands whether you're on macOS or inside the Linux VM.\n\n## Quick start\n\n```bash\n# 1. Install mise (if you don't have it)\ncurl https://mise.run | sh\nmise activate zsh \u003e\u003e ~/.zshrc   # restart terminal after\n\n# 2. Add utm-dev to your Tauri project\n# Add to your mise.toml:\n#   [task_config]\n#   includes = [\"git::https://github.com/joeblew999/utm-dev.git//.mise/tasks?ref=main\"]\n\n# 3. Set up everything\nmise run init      # add tools + env to your mise.toml\nmise install       # install tools (Rust, Bun, cargo-tauri, etc.)\nmise run setup     # install platform deps (macOS: Xcode/Android, Linux: system libs)\nmise run doctor    # check what's installed\n```\n\nThat's it. You're ready to build.\n\n## Build for every platform\n\n```bash\n# macOS (runs natively)\nmise run mac:dev              # desktop dev mode (hot reload)\nmise run mac:build            # .app + .dmg\n\n# iOS (runs natively)\nmise run ios:sim              # simulator (no signing required)\nmise run ios:xcode            # open in Xcode\nmise run ios:build            # release IPA (requires signing)\n\n# Android (runs natively)\nmise run android:sim          # emulator\nmise run android:studio       # open in Android Studio\nmise run android:build        # .apk + .aab\n\n# Windows (auto-starts VM on first run)\nmise run windows:build        # .msi + .exe\n\n# Linux (auto-starts VM on first run)\nmise run linux:dev            # open Linux desktop VM (Debian 12 + GNOME)\nmise run linux:build          # .deb + .AppImage\n\n# Everything at once\nmise run all:build\n```\n\nBuild artifacts land in `.build/windows/` and `.build/linux/`.\n\n\u003e **Works from Linux too.** Inside the Linux VM (or on any native Linux box), `mise run setup` installs system deps, and `cargo tauri dev` / `cargo tauri build` just work. Same `mise.toml`, same tasks.\n\n## Utilities\n\n```bash\nmise run icon                     # generate all platform icons from app-icon.png\nmise run screenshot               # take screenshots via WebDriver\nmise run doctor                   # check what's installed/missing\nmise run clean:project            # wipe this project's build artifacts\nmise run clean:disk               # free system-wide disk space\nmise run clean:disk -- --dry-run  # preview what would be cleaned\nmise run clean:disk -- --deep     # also: Homebrew, Xcode archives, Docker\nmise run mcp                      # set up MCP servers for AI-assisted dev\n```\n\n## Prerequisites\n\n**macOS (full platform support):**\n- Apple Silicon Mac\n- [mise](https://mise.jdx.dev) — `curl https://mise.run | sh`\n- [Homebrew](https://brew.sh), Xcode (from App Store)\n- **8 GB+ RAM** recommended (VMs need headroom)\n- **~6 GB disk** for the box cache (`~/.cache/utm-dev/`)\n\n**Linux (native desktop/server builds):**\n- [mise](https://mise.jdx.dev) — `curl https://mise.run | sh`\n- `mise run setup` installs everything else (apt system libs)\n\nAdd these to your `.gitignore`:\n\n```\n.build/\n.mise/state/\n.mise/logs/\n.mcp.json\n```\n\n\u003e **Everything is idempotent.** Safe to re-run any command after errors, interruptions, or just to make sure things are current.\n\n## Example\n\nSee [`examples/tauri-basic/`](examples/tauri-basic/) for a working Tauri app with all platform tasks configured. Copy it as a starting point.\n\n---\n\n## How it works\n\n### Stack\n\n- **[mise](https://mise.jdx.dev)** — task runner, tool management, orchestration\n- **[Bun](https://bun.sh)** — all task scripts are TypeScript\n- **[Tauri](https://tauri.app/)** — the apps you're building\n\n### What installs what\n\n**mise handles everything it can** — Rust, Bun, cargo-tauri, Java, xcodegen, ruby. `mise run setup` only installs what mise _can't_: OS-level packages and SDKs.\n\n| Tool | Installed by | macOS | Linux |\n|---|---|---|---|\n| Bun, cargo-tauri, xcodegen, ruby, Java | **mise** `[tools]` | yes | yes (skips macOS-only) |\n| Rust | **mise** or **rustup** | yes | yes |\n| WebKitGTK, GTK, system libs | **apt** | — | `mise run setup` |\n| Android SDK, NDK, emulator | **sdkmanager** | `mise run setup` | — |\n| CocoaPods | **gem** | `mise run setup` | — |\n| Xcode | **App Store** | manual | — |\n| UTM | **Homebrew cask** | auto on first VM | — |\n\n### Five VMs\n\n| VM | Box | Purpose | Ports |\n|---|---|---|---|\n| **windows-build** | windows-11 | VS Build Tools, Rust, mise — compiling | SSH:2222 RDP:3389 WinRM:5985 |\n| **windows-test** | windows-11 | Clean Windows + SSH — testing installers | SSH:2322 RDP:3489 WinRM:6985 |\n| **linux-dev** | debian-12 (GNOME) | Full desktop — dev experience validation | SSH:2622 |\n| **linux-build** | ubuntu-24.04 | Headless — compiling | SSH:2422 |\n| **linux-test** | ubuntu-24.04 | Clean Ubuntu + SSH — testing packages | SSH:2522 |\n\nVMs are created on-demand — `windows:build`, `linux:build`, and `linux:dev` handle everything automatically.\n\n**Credentials:** `vagrant` / `vagrant` for all VMs.\n\n**RDP into Windows:** Connect to `127.0.0.1:3389` (windows-build) or `127.0.0.1:3489` (windows-test).\n\n### VM commands (hidden)\n\nMost devs never need these — the `platform:target` tasks call them automatically. Use `mise tasks --hidden` to see them.\n\n| Command | What it does |\n|---|---|\n| `mise run vm:up [profile]` | Start a VM (imports + bootstraps on first run) |\n| `mise run vm:down [profile]` | Stop a VM |\n| `mise run vm:build [profile]` | Sync + build in VM, pull artifacts back |\n| `mise run vm:exec [profile] '\u003ccmd\u003e'` | Run a command inside a VM |\n| `mise run vm:package [profile]` | Export a VM as a Vagrant box |\n| `mise run vm:delete \u003cprofile\u003e` | Delete a VM, `utm` (all + app), or `all` |\n\nProfiles: `windows-build`, `windows-test`, `linux-dev`, `linux-build`, `linux-test`\n\n### Deleting VMs\n\n```bash\nmise run vm:delete windows-build  # removes VM + state, keeps box cache\nmise run vm:delete utm            # all 5 VMs + uninstall UTM\nmise run vm:delete all            # everything (box cache always preserved)\n```\n\n### MCP (AI-assisted development)\n\n```bash\nmise run mcp   # writes .mcp.json + auto-allows permissions\n```\n\nConfigures two MCP servers:\n\n| Server | What it does |\n|---|---|\n| **[context7](https://github.com/upstash/context7)** | Up-to-date docs and code examples for any library |\n| **[mise](https://mise.jdx.dev)** | Query tools, tasks, env vars, config — and run tasks directly |\n\n### Troubleshooting\n\n| Problem | Fix |\n|---|---|\n| Something missing | `mise run doctor` — shows exactly what's installed and what's not |\n| VM state corrupted | Delete `.mise/state/vm-{name}.env` and re-run `mise run vm:up` |\n| Bootstrap is slow | Normal — Windows VS Build Tools takes 5-10 min on first run |\n| Need detailed logs | Check `.mise/logs/` |\n\n**Manual SSH:**\n\n```bash\nsshpass -p vagrant ssh -p 2222 vagrant@127.0.0.1   # windows-build\nsshpass -p vagrant ssh -p 2322 vagrant@127.0.0.1   # windows-test\nsshpass -p vagrant ssh -p 2622 vagrant@127.0.0.1   # linux-dev\nsshpass -p vagrant ssh -p 2422 vagrant@127.0.0.1   # linux-build\nsshpass -p vagrant ssh -p 2522 vagrant@127.0.0.1   # linux-test\n```\n\n## CI\n\nUse [`jdx/mise-action@v2`](https://github.com/jdx/mise-action) in GitHub Actions.\n\n## License\n\n[MIT](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjoeblew999%2Futm-dev","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjoeblew999%2Futm-dev","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjoeblew999%2Futm-dev/lists"}