{"id":49253096,"url":"https://github.com/packetthrower/baudrun","last_synced_at":"2026-05-16T18:11:43.824Z","repository":{"id":352970294,"uuid":"1217236328","full_name":"packetThrower/Baudrun","owner":"packetThrower","description":"Serial terminal app for connecting to serial devices.","archived":false,"fork":false,"pushed_at":"2026-04-25T01:23:09.000Z","size":8417,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-25T01:35:23.706Z","etag":null,"topics":["baud-rate","serial-communication","serial-terminal","serialport"],"latest_commit_sha":null,"homepage":"https://packetthrower.github.io/Baudrun/","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/packetThrower.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","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},"funding":{"github":["packetThrower"],"patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"lfx_crowdfunding":null,"polar":null,"buy_me_a_coffee":null,"thanks_dev":null,"custom":null}},"created_at":"2026-04-21T17:23:05.000Z","updated_at":"2026-04-25T01:23:13.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/packetThrower/Baudrun","commit_stats":null,"previous_names":["packetthrower/baudrun"],"tags_count":11,"template":false,"template_full_name":null,"purl":"pkg:github/packetThrower/Baudrun","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/packetThrower%2FBaudrun","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/packetThrower%2FBaudrun/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/packetThrower%2FBaudrun/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/packetThrower%2FBaudrun/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/packetThrower","download_url":"https://codeload.github.com/packetThrower/Baudrun/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/packetThrower%2FBaudrun/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32517232,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-30T13:12:12.517Z","status":"online","status_checked_at":"2026-05-01T02:00:05.856Z","response_time":64,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["baud-rate","serial-communication","serial-terminal","serialport"],"created_at":"2026-04-25T01:10:54.456Z","updated_at":"2026-05-06T01:03:12.658Z","avatar_url":"https://github.com/packetThrower.png","language":"Rust","funding_links":["https://github.com/sponsors/packetThrower"],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"build/appicon.png\" alt=\"Baudrun\" width=\"128\"\u003e\n\u003c/p\u003e\n\n# Baudrun\n\n[![CI](https://img.shields.io/github/actions/workflow/status/packetThrower/Baudrun/ci.yml?branch=main\u0026style=flat-square\u0026logo=github\u0026label=CI)](https://github.com/packetThrower/Baudrun/actions/workflows/ci.yml)\n[![Release](https://img.shields.io/github/v/release/packetThrower/Baudrun?style=flat-square\u0026logo=github\u0026label=release\u0026include_prereleases)](https://github.com/packetThrower/Baudrun/releases/latest)\n[![Downloads](https://img.shields.io/github/downloads/packetThrower/Baudrun/total?style=flat-square\u0026logo=github\u0026label=downloads)](https://github.com/packetThrower/Baudrun/releases)\n[![Rust](https://img.shields.io/badge/Rust-stable-CE422B?style=flat-square\u0026logo=rust\u0026logoColor=white)](src-tauri/Cargo.toml)\n[![Tauri](https://img.shields.io/badge/Tauri-v2-FFC131?style=flat-square\u0026logo=tauri\u0026logoColor=black)](https://tauri.app)\n[![Svelte](https://img.shields.io/github/package-json/dependency-version/packetThrower/Baudrun/dev/svelte?style=flat-square\u0026logo=svelte\u0026logoColor=white\u0026label=Svelte\u0026color=FF3E00)](https://svelte.dev)\n\n## Minimum OS Versions\n\n**macOS** (Apple Silicon and Intel)  \n[![macOS 11+](https://img.shields.io/badge/macOS-11%2B-333?style=flat-square\u0026logo=apple\u0026logoColor=white)](docs/REQUIREMENTS.md#macos)\n[![Apple Silicon](https://img.shields.io/badge/Apple%20Silicon-arm64-333?style=flat-square\u0026logo=apple\u0026logoColor=white)](docs/REQUIREMENTS.md#macos)\n[![Intel](https://img.shields.io/badge/Intel-x86__64-333?style=flat-square\u0026logo=apple\u0026logoColor=white)](docs/REQUIREMENTS.md#macos)\n\n**Windows** (x64 and ARM64)  \n[![Windows 10 21H2+ x64](https://img.shields.io/badge/Windows%2010%2021H2%2B-x64-0078D4?style=flat-square\u0026logo=windows\u0026logoColor=white)](docs/REQUIREMENTS.md#windows)\n[![Windows 11 x64](https://img.shields.io/badge/Windows%2011-x64-0078D4?style=flat-square\u0026logo=windows11\u0026logoColor=white)](docs/REQUIREMENTS.md#windows)\n[![Windows 11 ARM64](https://img.shields.io/badge/Windows%2011-ARM64-0078D4?style=flat-square\u0026logo=windows11\u0026logoColor=white)](docs/REQUIREMENTS.md#windows)\n\n**Linux** (amd64 and arm64)  \n[![Ubuntu 24.04+](https://img.shields.io/badge/Ubuntu-24.04%2B-E95420?style=flat-square\u0026logo=ubuntu\u0026logoColor=white)](docs/REQUIREMENTS.md#linux)\n[![Debian 13+](https://img.shields.io/badge/Debian-13%2B-A81D33?style=flat-square\u0026logo=debian\u0026logoColor=white)](docs/REQUIREMENTS.md#linux)\n[![Fedora 40+](https://img.shields.io/badge/Fedora-40%2B-294172?style=flat-square\u0026logo=fedora\u0026logoColor=white)](docs/REQUIREMENTS.md#linux)\n[![Arch](https://img.shields.io/badge/Arch-1793D1?style=flat-square\u0026logo=archlinux\u0026logoColor=white)](docs/REQUIREMENTS.md#linux)\n[![openSUSE Tumbleweed](https://img.shields.io/badge/openSUSE-Tumbleweed-73BA25?style=flat-square\u0026logo=opensuse\u0026logoColor=white)](docs/REQUIREMENTS.md#linux)\n[![AppImage: libwebkit2gtk-4.1 + FUSE](https://img.shields.io/badge/AppImage-libwebkit2gtk--4.1%20%2B%20FUSE-2166B7?style=flat-square\u0026logo=appimage\u0026logoColor=white)](docs/REQUIREMENTS.md#linux)\n\nA cross-platform (macOS + Windows + Linux) serial terminal for network devices.\n\nIt's built for switch consoles, router CLIs, and other serial-attached network\ngear. Baudrun is profile-based: each device gets a named profile storing port,\nbaud rate, framing, flow control, line ending, and optional send-on-connect\nsequences. You connect with one click instead of retyping `screen /dev/cu.usbserial-...`\nfrom memory, hunting for the baud rate a specific switch expects, or opening a\ndifferent terminal app for each kind of adapter.\n\nDeveloped in close collaboration with Claude (Anthropic). See\n[AI-USAGE.md](AI-USAGE.md) for how that split works.\n\n\u003cp align=\"center\"\u003e\n  \u003cpicture\u003e\n    \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"docs/assets/screenshots/macos-dark-baudrun.png\"\u003e\n    \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"docs/assets/screenshots/macos-light-baudrun.png\"\u003e\n    \u003cimg src=\"docs/assets/screenshots/macos-dark-baudrun.png\" alt=\"Baudrun in its default skin\" width=\"720\"\u003e\n  \u003c/picture\u003e\n\u003c/p\u003e\n\n## Features\n\n- **Profile-based connections** — named settings per device (port, baud,\n  framing, flow control, line ending, and more), stored as plain JSON.\n  See [docs/PROFILES.md](docs/PROFILES.md) for the full schema and\n  bulk-provisioning recipes.\n- **Auto-detecting ports + chipset identification** — USB VID/PID lookup\n  surfaces the chipset family (CP210x, FTDI, PL2303, CH340, MCP2221,\n  and a dozen more) and links to the vendor driver when one's missing.\n  Works out of the box with CDC-ACM USB-C consoles (HPE/Aruba, newer\n  Cisco, RuggedCom RST2228).\n- **Rich terminal** — xterm.js backend with 10k-line scrollback, line-\n  ending translation, local echo, hex view / send, line timestamps,\n  session logging to file, copy-on-select, custom baud rates, and\n  Backspace/Delete mapping.\n- **Auto-reconnect** — on by default; USB adapter drops recover\n  transparently with the xterm buffer preserved across the gap.\n  Keeps working while the session is suspended. Disable per profile\n  if you'd rather see drops surface immediately.\n- **Send Break** — 300 ms TX-low pulse for Cisco ROMMON, Juniper\n  diagnostic mode, and boot-loader interrupts.\n- **Paste safety** — multi-line confirmation prompt + configurable slow\n  paste so UARTs with small buffers don't drop bytes.\n- **File transfer** — XMODEM / XMODEM-CRC / XMODEM-1K / YMODEM for\n  firmware uploads to embedded bootloaders.\n- **Suspend / Resume** — step away from a connected session without\n  tearing down the serial port; xterm stays mounted so the full\n  backlog is preserved on return.\n- **Multi-window** — right-click any profile or drag it out of the\n  sidebar to spawn a new window with that profile selected. If the\n  profile is the active connection in the source window, the live\n  session and visible scrollback follow the tear-off — same port,\n  same DTR/RTS state, no mid-session bytes lost. Each window keeps\n  its own connection so you can hold parallel sessions to different\n  devices side by side.\n- **Syntax highlighting for network gear** — bundled rule packs for\n  vendor-neutral output plus device-specific sets for Cisco IOS,\n  Juniper Junos, Aruba AOS-CX, Arista EOS, and MikroTik RouterOS.\n  Toggle packs in Settings, override per profile, edit the user\n  pack on disk, or import shared packs as JSON. A\n  [browser-based playground](https://packetthrower.github.io/Baudrun/playground.html)\n  lets you test regex against your own captures. Device-supplied\n  ANSI colors pass through unchanged. Available colors: red, green,\n  yellow, blue, magenta, cyan, dim.\n- **Signed auto-update** — built-in update check on launch (toggle\n  off in Settings). When a new release is out a footer toast points\n  at the GitHub release notes; clicking Install on a stable update\n  downloads the platform bundle, verifies its minisign signature\n  against the embedded public key, and relaunches into the new\n  version. Pre-releases stay manual (ship signed updater bundles\n  but don't update the auto-update endpoint, so existing stable\n  installs aren't auto-jumped onto an alpha).\n\n- **13 built-in terminal themes + `.itermcolors` import** — including\n  **Colorblind Safe** (Bang Wong's palette from Nature Methods, 2011 —\n  perpendicular to the protan/deutan confusion axis so up/down stays\n  legible for the ~6% of men with red-green colorblindness), **CRT\n  Phosphor**, **Synthwave**, **Brogrammer**, and all the usual\n  Dracula/Solarized/Nord/Gruvbox suspects. [docs/THEMES.md](docs/THEMES.md).\n- **14 built-in app skins** with light/dark appearance support:\n\n  | Category | Skins |\n  |---|---|\n  | Default | **Baudrun** |\n  | Modern OS | **macOS 26 (Liquid Glass)**, **Windows 11 (Fluent)**, **GNOME (Adwaita)**, **KDE (Breeze)**, **elementary (Pantheon)**, **Xfce (Greybird)** |\n  | Retro OS | **macOS Classic**, **Windows XP (Luna)** |\n  | Aesthetic | **CRT (Green Phosphor)**, **Cyberpunk (Synthwave)**, **Blueprint**, **E-Ink (Paper)** |\n  | Accessibility | **High Contrast** |\n\n  Skins and themes are independent, so you can mix them freely\n  (Liquid Glass skin + Solarized Dark theme, CRT skin + CRT Phosphor\n  theme, etc.). Author your own via [docs/SKINS.md](docs/SKINS.md).\n- **Accessibility** — xterm screen-reader mode, `prefers-reduced-motion`\n  respected, Cmd/Ctrl +/- terminal zoom, ARIA labels on every icon-only\n  control. Details in [docs/ACCESSIBILITY.md](docs/ACCESSIBILITY.md).\n- **Relocatable config directory** — keep profiles, themes, skins, and\n  settings alongside your dotfiles; Settings → Advanced picks the\n  target.\n\nEverything above is documented in depth under [docs/](docs/). See\n[docs/ADVANCED.md](docs/ADVANCED.md) for the feature reference covering\nSend Break, hex send/view, file transfer, auto-reconnect, control-line\npolicies, session logging, driver detection, and config-directory\nrelocation.\n\n### Documentation\nFull reference docs under [docs/](docs/):\n\n| File | Covers |\n|---|---|\n| [ADVANCED.md](docs/ADVANCED.md) | Every advanced feature: Send Break, hex send/view, file transfer, auto-reconnect, control-line policies, session logging, driver detection, config-directory relocation, and more. It's a reference, not a how-to. |\n| [ACCESSIBILITY.md](docs/ACCESSIBILITY.md) | Screen-reader mode, reduced-motion, terminal zoom shortcuts, ARIA-label coverage, and known caveats. |\n| [PROFILES.md](docs/PROFILES.md) | Profile JSON schema + bulk provisioning from CSV inventory via jq/Python. |\n| [THEMES.md](docs/THEMES.md) | Theme JSON schema, ANSI-slot reference, `.itermcolors` import ecosystem. |\n| [SKINS.md](docs/SKINS.md) | Skin CSS-variable reference, light/dark handling, layout tradeoffs. |\n| [examples/](docs/examples/) | Annotated `.jsonc` + importable `.json` reference files for authoring your own skin or theme. |\n\n## Requirements\n\nReleased builds target recent mainstream OS releases:\n\n- **macOS 11 Big Sur or later** — separate arm64 (Apple Silicon)\n  and amd64 (Intel) builds. Pick the one matching your CPU.\n- **Windows 10 21H2+ or 11** — needs the [Microsoft Edge WebView2\n  Runtime](https://developer.microsoft.com/en-us/microsoft-edge/webview2/),\n  preinstalled on Windows 11 and recent 10 builds. amd64 and arm64\n  artifacts shipped.\n- **Linux with GTK3 + WebKit2GTK 4.1** — Ubuntu 24.04+, Fedora 40+,\n  Debian 13+, or current Arch. amd64 and arm64 artifacts shipped in\n  `.deb`, `.rpm`, `.pkg.tar.zst`, and `.AppImage` formats.\n\nSee [docs/REQUIREMENTS.md](docs/REQUIREMENTS.md) for the detailed\nbreakdown, including everything you need to build from source.\n\n### USB-to-serial adapter drivers\n\nRequired when using an adapter rather than a device's built-in USB console:\n\n| Chipset | Driver |\n|---|---|\n| **SiLabs CP210x** (Cisco console cables, many industrial adapters) | [silabs.com VCP](https://www.silabs.com/developers/usb-to-uart-bridge-vcp-drivers) |\n| **FTDI** (higher-quality adapters) | Built in on macOS 11+ and Windows 10+ |\n| **Prolific PL2303** | [prolific.com.tw](https://www.prolific.com.tw); watch for counterfeit / deprecated-chip caveats |\n| **WCH CH340/CH341** (cheap clones, Arduino knockoffs) | [wch-ic.com](https://www.wch-ic.com) |\n| **USB-C consoles** (HPE/Aruba, newer Cisco, RuggedCom RST2228) | None — CDC-ACM is built into macOS and Windows |\n\nBaudrun will detect known chipsets and point you at the right download when\na driver is missing.\n\n## Install\n\nThe easiest path on macOS and Windows is the package manager — auto-update\non `brew upgrade` / `scoop update`, no Gatekeeper / SmartScreen friction\non first launch, and pre-release channels are available alongside stable.\nLinux users grab the right `.deb` / `.rpm` / `.AppImage` / `.pkg.tar.zst`\ndirectly from the [Releases](#releases) section.\n\n### macOS — Homebrew\n\n```sh\nbrew tap packetThrower/tap\nbrew install --cask baudrun\n# or pre-release channel:\nbrew install --cask baudrun@alpha\n```\n\nThe `baudrun` cask installs `/Applications/Baudrun.app` and tracks the\nlatest stable tag. The `baudrun@alpha` cask installs `/Applications/Baudrun\nAlpha.app` side-by-side and tracks the latest pre-release tag (`-alpha.N`,\n`-beta.N`, `-rc.N`). Both casks strip the macOS quarantine xattr on\ninstall so the app launches without a right-click → Open dance, since\nBaudrun ships ad-hoc signed but not notarized.\n\nThe tap also holds [PortFinder](https://github.com/packetThrower/PortFinder).\nRepo: [packetThrower/homebrew-tap](https://github.com/packetThrower/homebrew-tap).\n\n### Windows — Scoop\n\n```powershell\n# Scoop requires git to add buckets — install it first if you don't\n# already have it. Skip this if `git --version` already prints\n# something.\nscoop install git\n\nscoop bucket add packetThrower https://github.com/packetThrower/scoop-bucket\nscoop install baudrun\n# or pre-release channel:\nscoop install baudrun-prerelease\n```\n\n`scoop install baudrun` adds a `Baudrun` Start menu shortcut and a\n`Baudrun` shim on `PATH`. The pre-release manifest installs side-by-side\nwith shim `baudrun-alpha` and Start menu entry `Baudrun Alpha`. Both use\nthe per-arch NSIS installer so x64 and arm64 hosts get the matching\nbuild automatically.\n\nRepo: [packetThrower/scoop-bucket](https://github.com/packetThrower/scoop-bucket).\n\n### Both channels at once\n\nStable and pre-release coexist on either platform. Useful when you want\nto keep stable as your daily driver and run alpha on the side to verify\nupcoming changes against your gear.\n\n## Releases\n\nTagged pushes with a SemVer tag like `v0.4.0` or `v1.0.0` produce a\nGitHub Release with artifacts for five targets. The leading `v` only\nlives on the git tag; package filenames and `--version` strings drop\nit so dpkg, rpm, and pacman read the version natively.\n\n| Platform | Artifact | Notes |\n|---|---|---|\n| **macOS** | `Baudrun-macOS-\u003carch\u003e-\u003cversion\u003e.zip` (contains `.app`), `Baudrun_\u003cversion\u003e_\u003carch\u003e.dmg` | Per-arch builds: `arm64` for Apple Silicon (M1/M2/M3+), `amd64` for Intel Macs. Pick the one matching your CPU. Each bundle is a self-contained `.app` with `libusb-1.0.0.dylib` bundled under `Contents/Frameworks` so there's no Homebrew dependency. The .zip is produced via `ditto -c -k --keepParent` to preserve code-signing xattrs. |\n| **Windows amd64** | `Baudrun_\u003cversion\u003e_x64-setup.exe` (NSIS), `Baudrun_\u003cversion\u003e_x64_en-US.msi` (stable releases only), `Baudrun-Windows-amd64-\u003cversion\u003e.zip` (portable) | Standard 64-bit x86 Windows 10/11. NSIS is the modern Tauri default; MSI requires WiX with numeric-only pre-release identifiers, so pre-release tags ship NSIS only. |\n| **Windows arm64** | `Baudrun_\u003cversion\u003e_arm64-setup.exe` (NSIS), `Baudrun_\u003cversion\u003e_arm64_en-US.msi` (stable releases only), `Baudrun-Windows-arm64-\u003cversion\u003e.zip` (portable) | Native Windows on ARM (Surface Pro X, Copilot+ PCs on Snapdragon X). No Prism emulation; runs at native speed. |\n| **Linux amd64** | `Baudrun_\u003cversion\u003e_amd64.deb`, `Baudrun-\u003cversion\u003e-1.x86_64.rpm`, `baudrun-\u003cversion\u003e-1-x86_64.pkg.tar.zst`, `Baudrun_\u003cversion\u003e_amd64.AppImage` | Standard 64-bit x86 desktop Linux. Pick the format your distro uses; AppImage works anywhere with FUSE. .deb / .rpm / .AppImage are produced by Tauri's bundler; .pkg.tar.zst is built via fpm since Tauri's bundler doesn't target pacman. |\n| **Linux arm64** | `Baudrun_\u003cversion\u003e_arm64.deb`, `Baudrun-\u003cversion\u003e-1.aarch64.rpm`, `baudrun-\u003cversion\u003e-1-aarch64.pkg.tar.zst`, `Baudrun_\u003cversion\u003e_aarch64.AppImage` | Raspberry Pi 4 / 5, ARM workstations, Apple Silicon Linux VMs. |\n\nArch users can install the `.pkg.tar.zst` directly with\n`pacman -U`. The [packaging/arch/](packaging/arch/) directory holds\na PKGBUILD for AUR submission as `baudrun-bin`, not yet published.\n\nDownload, unpack, and run. On macOS, drag `Baudrun.app` into `/Applications`\nor open the `.dmg` and use the standard installer view.\n\nThe app is ad-hoc signed on macOS but not notarized, and unsigned on\nWindows. First-launch friction:\n- **macOS**: right-click → Open to bypass Gatekeeper. If macOS still\n  refuses with \"damaged\" or \"unidentified developer,\" strip the\n  quarantine flag: `xattr -cr Baudrun.app`. The .dmg installer\n  handles signatures correctly out of the box; the .zip works once\n  unpacked with Finder or `ditto -x -k`.\n- **Windows**: SmartScreen will warn; click \"More info\" → \"Run anyway\".\n- **Linux**: `.deb` / `.rpm` / `.pkg.tar.zst` install via the package\n  manager and ship a udev rule that grants the console user ACL\n  access to `/dev/ttyUSB*` without the dialout-group dance. AppImage\n  needs FUSE; `chmod +x Baudrun.AppImage \u0026\u0026 ./Baudrun.AppImage`.\n\nApple Developer signing + notarization (and Windows code signing)\nare planned; see `TODO.md`.\n\n## Building from source\n\nPrerequisites:\n\n- Rust stable (1.77+) — install via [rustup](https://rustup.rs/)\n- Node 20+\n- The [Tauri prerequisites](https://tauri.app/start/prerequisites/) for\n  your platform (system libraries below). The Tauri CLI itself ships\n  via `@tauri-apps/cli` as an npm dev-dependency; no separate install\n  needed.\n\nSystem libraries (linked at compile time):\n\n- **macOS**: `brew install libusb pkg-config`\n- **Debian / Ubuntu**: `sudo apt install libgtk-3-dev libwebkit2gtk-4.1-dev libsoup-3.0-dev libayatana-appindicator3-dev librsvg2-dev libusb-1.0-0-dev libudev-dev pkg-config`\n- **Fedora**: `sudo dnf install gtk3-devel webkit2gtk4.1-devel libsoup3-devel libayatana-appindicator-gtk3-devel librsvg2-devel libusb1-devel systemd-devel pkgconf-pkg-config`\n- **Arch**: `sudo pacman -S gtk3 webkit2gtk-4.1 libsoup3 libayatana-appindicator librsvg libusb pkgconf`\n- **Windows**: nothing extra — WebView2 runtime ships with Windows 10 21H2+ and 11.\n\n```bash\ngit clone git@github.com:packetThrower/Baudrun.git\ncd Baudrun\nnpm install                              # pulls Tauri CLI + frontend deps\nnpm run tauri dev                        # hot-reload dev (Rust + Vite)\nnpm run tauri build                      # production bundle for host arch\nnpm run tauri build -- --bundles deb     # only the .deb (Linux)\n```\n\n`tauri build` cross-compiles within the same OS family but not across\ndesktop OSes — Linux artifacts have to be built on Linux, Windows on\nWindows, macOS on macOS. The release matrix in CI runs native builds\non each platform's runner; locally a Linux VM (or CI) is the cleanest\nway to produce Linux artifacts from a macOS / Windows host.\n\nCI (`.github/workflows/ci.yml`) runs `cargo check` + `cargo clippy\n-- -D warnings` + `cargo test --lib` on `macos-26`, `macos-15-intel`,\n`windows-latest`, `windows-11-arm`, `ubuntu-latest`, and\n`ubuntu-24.04-arm` on each push to `main`, plus a frontend job\n(`npm ci`, `svelte-check`, `npm run build`). Tagged pushes matching\nSemVer `v[0-9]+.[0-9]+.[0-9]+` (or `v[0-9]+.[0-9]+.[0-9]+-*` for\npre-releases) trigger `.github/workflows/release.yml`, which uses\n[`tauri-action`](https://github.com/tauri-apps/tauri-action) to\nproduce a GitHub Release with all six platform artifacts attached\n(macOS arm64/amd64, Windows x64/arm64, Linux amd64/arm64).\n\n## Architecture\n\n```\nBaudrun/\n├── src-tauri/                     # Rust backend (Tauri v2)\n│   ├── Cargo.toml                 # crate manifest, deps (tauri, serialport,\n│   │                              # rusb, plist, chrono, uuid, ...)\n│   ├── tauri.conf.json            # window config, bundle metadata, Linux\n│   │                              # deb/rpm/appimage settings\n│   ├── build.rs                   # tauri-build entrypoint\n│   ├── capabilities/default.json  # IPC permission grants (dialog, opener,\n│   │                              # log, core:window:allow-start-dragging)\n│   ├── icons/                     # generated by `cargo tauri icon` from\n│   │                              # build/appicon.png\n│   ├── resources/\n│   │   ├── builtin_themes.json    # 13 built-in terminal themes (data only)\n│   │   └── builtin_skins.json     # 14 built-in app skins (data only)\n│   └── src/\n│       ├── main.rs                # binary entry; calls baudrun_lib::run()\n│       ├── lib.rs                 # tauri::Builder setup, plugin registration,\n│       │                          # state init, invoke_handler list\n│       ├── state.rs               # AppState (stores + active session handle)\n│       ├── events.rs              # event-name constants + payload types\n│       ├── appdata.rs             # OS config-directory resolution + override\n│       ├── profiles.rs            # JSON-backed profile store + validation\n│       ├── settings.rs            # global settings store\n│       ├── themes/{mod,parse}.rs  # theme store + .itermcolors plist parser\n│       ├── skins.rs               # skin store + CSS-var validation\n│       ├── serial/\n│       │   ├── session.rs         # Session struct, read pump (own thread),\n│       │   │                      # DTR/RTS/break, log writer, transfer redirect\n│       │   ├── chipsets.rs        # VID/PID + manufacturer chipset table\n│       │   ├── ports.rs           # ListPorts + PortInfo\n│       │   ├── direct.rs          # libusb-direct port-name codec\n│       │   ├── detect.rs          # suspect-port detection (counterfeit Prolific)\n│       │   ├── usb_darwin.rs      # ioreg-based missing-driver detection\n│       │   ├── usb_windows.rs     # Get-PnpDevice missing-driver detection\n│       │   └── usb_other.rs       # Linux/BSD stub\n│       ├── usbserial/             # vendored from packetThrower/usbserial-go\n│       │   ├── mod.rs             # Port trait, Driver registry, list()\n│       │   └── cp210x.rs          # SiLabs CP210x driver via rusb\n│       ├── transfer.rs            # XMODEM / XMODEM-CRC / XMODEM-1K / YMODEM\n│       │                          # state machines + ChannelReader helper\n│       ├── sanitize.rs            # session-log sanitizer (strips ANSI,\n│       │                          # collapses CR-heavy line endings)\n│       └── commands/              # #[tauri::command] handlers grouped by domain\n│           ├── profiles.rs        # CRUD on the profile store\n│           ├── themes.rs          # list/import/delete + dialog file picker\n│           ├── skins.rs           # list/import/delete + dialog file picker\n│           ├── settings.rs        # get/update + log-dir + config-dir + open_path\n│           ├── serial.rs          # connect/disconnect/send + DTR/RTS/break +\n│           │                      # auto-reconnect loop\n│           ├── transfer.rs        # send_file (XMODEM/YMODEM) + cancel_transfer\n│           └── window.rs          # set_traffic_lights_inset (decorum)\n├── src/                           # Svelte 5 frontend (was frontend/src/)\n│   ├── App.svelte                 # sidebar + main layout, session lifecycle\n│   ├── style.css                  # CSS custom-property surface (skin root)\n│   ├── lib/\n│   │   ├── Sidebar.svelte         # profile list + settings button\n│   │   ├── ProfileForm.svelte     # profile editor + connect/suspend flow\n│   │   ├── Terminal.svelte        # xterm.js wrapper, stays mounted per-session\n│   │   ├── PreviewTerminal.svelte # read-only xterm for theme previews\n│   │   ├── Settings.svelte        # skin picker, appearance, default theme,\n│   │   │                          # theme preview modal, log dir, toggles\n│   │   ├── highlight.ts           # line-buffered ANSI-aware colorizer\n│   │   ├── hexdump.ts             # 16-byte-per-line hex+ASCII formatter\n│   │   └── api.ts                 # thin @tauri-apps/api invoke + listen wrapper\n│   └── stores/                    # Svelte stores (profiles, themes, skins,\n│                                  # settings, session, appearance, dismissed-drivers)\n├── build/                         # icon source + per-OS metadata\n│   ├── appicon.svg                # source of truth — run make-icon.sh after edits\n│   ├── appicon.png                # rasterized; fed to `cargo tauri icon` to\n│   │                              # regenerate src-tauri/icons/\n│   ├── make-icon.sh               # regenerates appicon.png from the SVG\n│   │                              # (needs rsvg-convert + ImageMagick 7)\n│   ├── darwin/Info.plist          # macOS bundle metadata\n│   └── windows/                   # Windows .ico + manifest\n├── packaging/                     # downstream packaging metadata\n│   ├── linux/baudrun.desktop      # freedesktop entry shipped in .deb/.rpm/AppImage\n│   ├── linux/60-baudrun-serial.rules  # udev rule (uaccess for /dev/ttyUSB*)\n│   ├── linux/baudrun-postinstall.sh   # reload udev on install/upgrade\n│   └── arch/                      # AUR PKGBUILD for baudrun-bin\n└── .github/workflows/\n    ├── ci.yml                     # cargo check/clippy/test on\n    │                              # macOS, Windows (amd64/arm64), Linux (amd64/arm64)\n    │                              # + frontend (svelte-check + vite build)\n    ├── release.yml                # tag-triggered build via tauri-action;\n    │                              # emits .app/.dmg per macOS arch,\n    │                              # .msi/.exe (NSIS)/.zip per Windows arch,\n    │                              # and .deb/.rpm/.AppImage/.pkg.tar.zst\n    │                              # per Linux arch\n    └── docs.yml                   # mkdocs build + GitHub Pages deploy\n```\n\n**Data flow.** Bytes from the serial port flow as base64-encoded Tauri\nevents (`serial:data`) to preserve binary fidelity, are decoded in\n`api.onData`, fed through either the highlighter (with optional per-line\ntimestamp prefixing) or the hex-dump formatter depending on per-profile\nsettings, and written to the xterm instance. If session logging is\nenabled, a separate log-file sink (a `SanitizingLogWriter` that strips\nANSI escapes and collapses CR-heavy line endings) receives a copy of\nevery byte. Keystrokes go the other way via `api.sendBytes`\n(`invoke(\"send\", {...})`) with line-ending translation applied on the\nfrontend.\n\n**Serial lifecycle.** Opening a port spawns a dedicated read-pump thread\nwith a 100ms read timeout. On the native backend, `serialport::SerialPort::try_clone`\nsplits the underlying file descriptor so command invocations\n(`send`, `set_dtr`, `send_break`, …) don't contend with the blocking\nread. On the libusb-direct backend (CP210x), an `Arc\u003cdyn Port\u003e` is shared\nbetween the read thread and command handlers — `rusb` allows concurrent\nbulk read + bulk write on the same handle. `Session::close` is idempotent:\nit sets a closed flag, applies on-disconnect DTR/RTS policies, and joins\nthe pump thread before releasing the handle.\n\n**Terminal persistence.** The `\u003cTerminal\u003e` component stays mounted as long\nas there's an active session, even when the UI is showing the profile form\nor settings. CSS toggles visibility; xterm keeps buffering incoming bytes\ninto its scrollback. A `refit()` call on resume re-syncs the viewport\ndimensions.\n\n**Skin application.** On app mount, the skin applier sets every variable\nfrom the active skin's JSON onto `document.documentElement`, tracking which\nproperties it has written. Switching skins first unsets all tracked\nproperties (so sparser skins don't inherit stale values from richer ones)\nthen applies the new set. Live-swap, no reload. macOS traffic-light\nposition re-applies via `tauri-plugin-decorum` to land inside the\nfloating-bubble layout for skins like Liquid Glass.\n\n## License\n\n[GNU General Public License v3.0 or later](LICENSE). Forks are\nwelcome; derivative works must stay open under the same license.\nCommercial use is permitted but can't close the source.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpacketthrower%2Fbaudrun","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpacketthrower%2Fbaudrun","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpacketthrower%2Fbaudrun/lists"}