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.sh checks too and says exactly this if the interpreter is too old.
  • bash -- for the thin blog.sh / deploy-web.sh / refresh-sidebar.sh wrappers. (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 -- sips is part of macOS; on Linux any of heif-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.

WhatVersionNeeded forWithout it
Ruby2.7+, 3.x on the real deploymentseverythingblog.sh refuses to start and says the version it found
bashanythe blog.sh, deploy-web.sh and refresh-sidebar.sh wrappersno CLI; on Windows this is what WSL2 is for
macOSany current release——
Linuxany distro——
Windowsvia WSL2—there is no native cmd/PowerShell path
cronanyscheduled publishing, sidebar refresh, comment moderationthose three; everything else is unaffected
ffmpeganymedia.remux_video: truethe post is saved anyway and the engine prints the command to run by hand
sips, heif-convert, ImageMagick with HEIF, or vipsanymedia.convert_heic: truethe HEIC is refused with instructions rather than half-converted
rsyncanythe rsync deploy backendthat backend only
ssh + sftpanythe sftp backendthat backend only
gitanythe git backend (Pages)that backend only
rcloneanythe 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.