What you need
Getting started — part 1 of 10
From zero to a deployed site. The main README is the quick tour; this is the complete path, including the server side. Day-to-day usage lives in Writing.
In a hurry? The Quick start below is a complete copy-paste path to a site running locally on your machine -- one block per platform. The numbered sections after it are the full reference, including picking a deploy target to put the site on the internet.
- Ruby 2.7+ (3.x is what the real deployments run) -- standard library only, no gems, no Bundler. Check with
ruby -v;blog.shchecks too and says exactly this if the interpreter is too old. - bash -- for the thin
blog.sh/deploy-web.sh/refresh-sidebar.shwrappers. (On Windows that means WSL2 -- see the quick start; there is no native cmd/PowerShell path.) - A place to serve static files -- any of the six deploy targets below, from a Cloudron Surfer app to a plain directory behind your own nginx/Caddy.
- Optional: a Mastodon or Bluesky account (comments, auto-announce, sidebar widgets) and cron (widget refresh, scheduled publishing).
- Optional, only with
media.convert_heic: true(converting iPhone HEIC photos to JPEG on save): an image tool the machine typically already has --sipsis part of macOS; on Linux any ofheif-convert(libheif-examples), ImageMagick with the HEIF delegate, or vips. Without one, the engine refuses the file with instructions instead of breaking; off by default. - Optional, only with
media.remux_video: true(moving a video's index to the front of the file, and out of the QuickTime container, on save): ffmpeg. Without it the post is still saved and the engine names the command instead; off by default.
All of that as one table
The same thing in a form you can scan before installing anything. The right-hand column is what happens if it is missing, because that is the question worth answering: almost nothing here stops the engine, it just switches something off and says so.
| What | Version | Needed for | Without it |
|---|---|---|---|
| Ruby | 2.7+, 3.x on the real deployments | everything | blog.sh refuses to start and says the version it found |
| bash | any | the blog.sh, deploy-web.sh and refresh-sidebar.sh wrappers | no CLI; on Windows this is what WSL2 is for |
| macOS | any current release | — | — |
| Linux | any distro | — | — |
| Windows | via WSL2 | — | there is no native cmd/PowerShell path |
| cron | any | scheduled publishing, sidebar refresh, comment moderation | those three; everything else is unaffected |
| ffmpeg | any | media.remux_video: true | the post is saved anyway and the engine prints the command to run by hand |
sips, heif-convert, ImageMagick with HEIF, or vips | any | media.convert_heic: true | the HEIC is refused with instructions rather than half-converted |
| rsync | any | the rsync deploy backend | that backend only |
| ssh + sftp | any | the sftp backend | that backend only |
| git | any | the git backend (Pages) | that backend only |
| rclone | any | the rclone backend (S3, R2, B2, WebDAV, FTP) | that backend only |
| nothing extra | — | the surfer and local backends | — |
No gems, no Bundler, no lockfile: the engine is the standard library and these binaries, which is why an upgrade is a git pull and nothing else.
