Install
works
curl -fsSL https://hobby.sh/install | bashPiping a script into a shell asks you to trust a URL. If you would rather not,
read it first or
do it by hand. Every path runs the identical installer, which is
deliberate and is stated at the top of the script itself. The same bytes are
also mirrored at https://hobbyist.sh/install.
Requirements
Section titled “Requirements”| Operating system | Linux or macOS. Ubuntu and Debian are the tested Linux targets. There is no Windows path |
| Docker | Required, not optional. Every resource is a container |
| Bun 1.1+ | Installed for you under ~/.bun if missing. Needs no root |
| git | Needed to fetch the checkout |
| Filesystem | Anything works. XFS with reflinks, ZFS or APFS additionally get cheap copies. Details |
On a fresh Debian or Ubuntu box, Docker first:
curl -fsSL https://get.docker.com | shsudo usermod -aG docker "$USER" # then log out and back inOn macOS, OrbStack is what the measurements were taken on. Docker Desktop is expected to work for everything except Caddy, whose host networking requirement is unmeasured there.
What the installer does
Section titled “What the installer does”In order, and each step either replaces what it made last time or is a no-op, so re-running is how you upgrade:
- Checks the box. Refuses anything that is not Linux or macOS. Requires
git. Requires Docker to be installed and reachable, because an install that succeeds without it produces a daemon that cannot do the one thing it exists for. - Installs Bun under
~/.bunif it is missing, using Bun’s own installer. No root. A too-old Bun is rejected outright, because it gets further and then breaks somewhere less obvious. - Builds the workspace and the Studio bundle.
- Installs a launcher at
/usr/local/bin/hobbyif that is writable, and~/.local/bin/hobbyotherwise. It is a generated shim, not a symlink, sohobbyalways means this build regardless of what lands onPATHlater. If the directory it chose is not on yourPATH, it says so. - Runs
hobby init, which prepares~/.hobbyand checks the filesystem.
It does not install a service unit, open a firewall port, write to any system directory other than the launcher, or start a daemon. Starting the daemon is yours.
By hand
Section titled “By hand”git clone https://github.com/uziiuzair/hobbyistcd hobbyist./install.shThis is the same install. The one-liner’s only job is to put this checkout on disk and run this file.
Options
Section titled “Options”The bootstrap script reads three environment variables:
| Variable | Default | What |
|---|---|---|
HOBBY_SRC_DIR |
~/.hobby/src |
Where the checkout lives |
HOBBY_REPO_REF |
main |
The branch or tag to install |
HOBBY_REPO_URL |
the canonical repository | Where to clone from |
HOBBY_SRC_DIR=~/code/hobbyist bash <(curl -fsSL https://hobby.sh/install)The installer itself reads HOBBY_BIN_DIR if you want the launcher somewhere
specific.
Upgrading
Section titled “Upgrading”Run the same one-liner again. An existing checkout is fetched and reset to the
latest commit rather than re-cloned, which is why nothing you edit by hand
under ~/.hobby/src survives an upgrade. It refuses outright if the directory
is a checkout of something other than this project.
Uninstalling
Section titled “Uninstalling”There is no uninstall command, on purpose: everything it made is in two places you can see.
hobby eject <project> --release # for each project you want to keeprm -rf ~/.hobby # state, config, and every data directorysudo rm /usr/local/bin/hobby # or ~/.local/bin/hobbyEject first. ~/.hobby/projects/ holds the data directories, and removing it
removes your databases.
Start the daemon and make something:
hobby daemon &hobby new blogYour first project walks through what that prints.