study-server

Install the studyserver / studyctl binaries — no Docker required.

One command pulls the prebuilt binaries straight out of a public container image and drops them on the machine. This one URL detects how it was fetched: curl → install.sh PowerShell → install.ps1 browser → this page

Install

Linuxcurl -fsSL https://study.bat.nz | sh
Windows (PowerShell)irm https://study.bat.nz | iex

Both install studyctl and studyserver by default.

Where it installs

OSLocationNotes
Linux /usr/local/bin System-wide and already on PATH. Needs root — the script uses sudo if you aren't root.
Windows %LOCALAPPDATA%\Microsoft\WindowsApps Per-user, no admin. This folder is already on PATH, so studyctl runs by name in any shell.
= C:\Users\<you>\AppData\Local\Microsoft\WindowsApps

Options

Set these as environment variables before running the one-liner.

VariableDefaultMeaning
STUDYSERVER_VERSIONlatestimage tag to pull, e.g. v0.0.5
STUDYSERVER_BINDIRsee Where it installsinstall directory
STUDYSERVER_WHAT Windowsboth studyctl, studyserver, or both. On Linux, pass it as an argument instead: … | sh -s -- studyctl

Examples

Linux# just the client curl -fsSL https://study.bat.nz | sh -s -- studyctl # pin a version curl -fsSL https://study.bat.nz | STUDYSERVER_VERSION=v0.0.5 sh # install elsewhere curl -fsSL https://study.bat.nz | STUDYSERVER_BINDIR=$HOME/.local/bin sh
Windows (PowerShell)# just the client $env:STUDYSERVER_WHAT='studyctl'; irm https://study.bat.nz | iex # pin a version $env:STUDYSERVER_VERSION='v0.0.5'; irm https://study.bat.nz | iex # install elsewhere $env:STUDYSERVER_BINDIR='C:\tools'; irm https://study.bat.nz | iex

Force a specific script

Append the filename to skip detection: study.bat.nz/install.sh · study.bat.nz/install.ps1

Behind the scenes

Cut a new release maintainer

study-server repogit tag v0.0.6 && git push --tags

CI builds the binaries and pushes both GHCR images. A brand-new package is created private — make study-server-dist (and study-server) public once in GitHub → your profile → Packages → settings, or anonymous pulls return 401 UNAUTHORIZED.