2026-09-23: CodeFloe Pages now runs on our own infrastructure

CodeFloe Pages has moved off statichost.eu.
It now runs on three servers we operate, in the same cluster as the rest of CodeFloe.

Where Pages came from

CodeFloe Pages existed at all because statichost.eu hosted it.
It carried every site from the day the feature launched, at a point when we had nothing of our own to put them on, and we are grateful for the years it ran.

What it could not give us though was control.
Changes arrived on their side without notice, and when sites broke we had no transparent (and quick) way to fix them and no answer to pass on to the owners affected, sometimes for days.
Being unable to tell what was wrong with the affected sites was the part we did not want to continue with forever.

So Pages now sits in the same cluster as the rest of CodeFloe, on hardware we operate. Issues are ours to find and explain.

What changes for you

Pages runs in HA
Your site is stored in full on three separate nodes, and every one of them can serve it on its own.
The public address resolves to three cluster hosts, each terminating TLS independently, so a host going down costs a retry rather than an outage.

It is closer to you and closer to us.
The edge speaks HTTP/2 and HTTP/3, and reaches storage over a private 10 Gb/s network that never touches the public internet.
Serving a file takes one hop inside our own cluster instead of a round trip to a third party, so the slowest part of loading your site is now your visitor’s own connection.

You can see why a deployment went wrong and do the building on CodeFloe.
Builds now run in Forgejo Actions (or Crow CI), in your own repository, with logs you can read.

Why the address changed shape

The old address folded your username and repository into a single name.
The new one keeps them in separate positions, which is also how GitHub Pages does it.

foo-bar/baz and foo/bar-baz both flatten to foo-bar-baz, so the address stops saying which repository it belongs to, and no amount of suffixing brings that back.
We changed it because it is the kind of problem you cannot fix later, once the addresses are in use and linked to.

Two things depend on the address naming exactly one repository.

Publishing is authorised by it.
A workflow may publish to <username>.codefloe.page/<repository>/ when it runs in <username>/<repository>, and that is the whole check.
It is why the token in the documented workflow is the job’s own automatic one, with nothing for you to create, store or rotate.

Custom domains need one hostname per owner.
A CNAME record points at a name and has nowhere to put a path, so every site you own has to resolve through a single hostname, <username>.codefloe.page, with the edge choosing the right site from the domain the visitor asked for.
An address that carried the repository in the hostname could not offer that.

One certificate covers everything.
*.codefloe.page is a single certificate that matches every site, however many there are.
A wildcard matches exactly one label, so this works precisely because your site sits at <username>.codefloe.page with the repository in the path.

Because the wildcard already covers it, a new site needs no certificate issued at all.
It is reachable over HTTPS the moment it is published, with nothing to wait for.
Domains you bring yourself still get their own certificate, issued and renewed automatically, and those count against your domain rather than ours.

Addresses

Sites are served at:

<username>.codefloe.page/<repository>/

A repository named pages is served at the root of your subdomain instead.
If your site existed before the move, its old <username>-<repository>.codefloe.page address still works and keeps working.
It is served rather than redirected, so absolute links inside your site behave exactly as they did before and nothing needs changing.

Your own domain

Custom domains work, and are set up in the repository’s Pages settings.
Point a CNAME record at <username>.codefloe.page, or ALIAS/A/AAAA records for an apex domain, then add the domain in the settings so CodeFloe knows which repository it belongs to.

Certificates are issued and renewed for you once the record resolves.
There is nothing to upload and nothing to remember to renew.

A custom domain serves your site at the root, not under /<repository>/.

Building

There is no build step on the hosting side: we serve the files we are given.

Plain HTML goes on a branch, and you pick that branch in the repository’s Pages settings.
A site that needs generating gets built in Forgejo Actions and pushed to a branch of its own; the documentation carries a workflow you can copy, and there is a working example at codefloe/pages-example.

Actions is switched off by default, so enable it in your repository settings before adding a workflow.

statichost.yml is mostly retired.
The one key still read is public:, which picks a subdirectory to publish instead of the whole branch.

The size limit per site is 512 MB.