A friendly USB creator for FyshOS. Ferry downloads the latest FyshOS image and writes it to a USB stick, verifying the result and confirming output.
- Fetches the latest release directly from the FyshOS GitHub releases, matched to your architecture (amd64, arm64 or i386).
- Reuses what you already downloaded — images are cached, so a second stick costs no bandwidth.
- Writes any ISO, not just FyshOS, if you already have one on disk.
- Verifies after writing. Ferry reads the device back and compares its SHA-256 against the source image, so a bad stick is reported rather than discovered at boot.
Ferry is a Go application built with Fyne.
go install fyne.io/tools/cmd/fyne@latest
fyne install github.com/fyshos/ferry@latest
Or build from a checkout:
git clone https://github.com/fyshos/ferry.git
cd ferry
fyne install
Writing to USB media is supported on Linux and macOS. Ferry builds on other platforms but will report that device writing is unsupported.
Ferry shells out to a few standard utilities, all present on a typical desktop install:
| Linux | macOS | |
|---|---|---|
| listing removable devices | lsblk |
diskutil, mount |
| requesting administrator rights | pkexec |
authopen |
| writing and flushing | dd, sync, blockdev |
done in-process |
| verifying | sha256sum |
done in-process |
| finishing up | eject or udisksctl |
diskutil eject |
On Linux, pkexec needs a polkit authentication agent running in your desktop session.
Most desktops start one automatically; if the authorisation prompt never appears, that
agent is the thing to check.
On macOS Ferry works from an ordinary non-administrator account. The privileged step is
only the open: /usr/libexec/authopen presents the system authorization dialog for writing.
Ferry is a four step wizard:
- Architecture — pick the CPU the target machine uses. Defaults to your own.
- Image — download the latest FyshOS, pick one you already have, or open any
.iso. - Device — choose from the removable drives Ferry found.
- Confirm & write — a last look before anything is overwritten, then write and verify.
Downloads land in the application cache directory and are written to a .part file that
is only renamed into place on success, so an interrupted download never masquerades as a
complete image.
On Linux the write runs as a single privileged shell script under pkexec: it unmounts
any mounted partitions, dds the image across, flushes the device's buffer cache, reads
back exactly as many bytes as the image is long, and compares checksums, streaming
progress back to the UI as it goes.
On macOS the same sequence happens in-process. diskutil unmounts the disk (no privileges
needed for external media), authopen returns the raw device descriptor, and Ferry copies
the image through it in block-aligned chunks — hashing as it streams, so verification
costs no second read of the source — then reads the media back and compares. Progress
comes straight from the byte counter.
Writing an image erases the entire target device. Ferry only lists removable, hotpluggable or USB-attached drives — your system disk will not appear — and the confirmation step shows the device's model, path and size. It still cannot know which stick matters to you, so check those details before you continue.
Once writing starts it cannot be cancelled: there is no safe midpoint to stop a half-written device at. Leave the stick plugged in until Ferry says it is done.
