docker-compose.yml pulls both, so self-hosting needs no clone, no Node, and no build.
Both are public, so
docker pull needs no login. Both run as the unprivileged user node, not as root, so a file or folder you mount into a container has to be readable by that user.
Tags
latest is the newest release, which is not what floe.one runs: floe.one serves the web app from
the newest code on main, and the web-app pages of these docs describe that. An instance on
latest can therefore word some things differently until the next release, as
What an older web app shows lists.
Update the web image to 1.12.0 before Floe Desktop 1.1 reaches your users. Every request link Floe
Desktop 1.1 and later makes holds a link key, and an older image reads that as
an incomplete link. The Microsoft Store updates Floe Desktop on its own, and a web image moves only
when you pull it, and never while FLOE_IMAGE_TAG names an older version. See
Keep the client and server on one version.
The web image also decides how far a link key can be trusted, because whoever serves the page’s
JavaScript holds every link key its pages open. See
What the link key cannot see.
main only advances by merged pull request, and every image is smoke-tested on real hardware
before the tag moves. It moves only when a merge touches client/, server/, or the image
pipeline itself, so a docs-only merge starts no build and leaves it where it is. For the same
reason a sha- tag exists only for a commit that was built: the commit of each release, and each
merge to main that touched those folders. A commit that was never built has no image.
Pin a tag with FLOE_IMAGE_TAG:
.env
FLOE_IMAGE_TAG, not FLOE_VERSION. FLOE_VERSION belongs to the CLI’s install script (see Install the CLI) and is written with a leading v, as in v1.12.0. Image tags carry no v, so reusing that name would resolve to a tag that does not exist.
Pinning a digest
A tag can be repointed. A digest cannot, so it is the strongest pin. Read the digests of one tag for both images:Terminal
docker-compose.yml
Architectures
Both images are published forlinux/amd64 and linux/arm64. Docker picks the right one automatically, so Raspberry Pi, Oracle Ampere, AWS Graviton, and Apple silicon all work with the same commands as anywhere else.
Terminal
Floe: the image warm-up did not finish; pictures are resized on first request instead. The
instance works either way.
32-bit ARM (linux/arm/v7, older Raspberry Pi models) is not published. Node dropped support for it and no prebuilt image-processing binaries exist.
Building from source
Contributors, and anyone who wants their own domain in share previews, add the build overlay:Terminal
./client and ./server. The compose file alone is not enough.
The overlay tags its output floe-server:dev and floe-client:dev, so a local build never replaces a pulled image under the same name.
Share previews and canonical links
These have to be written into the HTML when the app is built, so a shared image cannot know which domain it will be served from. Claiming one would mean every self-hosted instance advertising somebody else’s site to crawlers, so the published image emits only what is true without knowing its own origin:
To put your own domain in them, build the client yourself:
Terminal
Updating
Terminal