Posting is currently by invitation. If you'd like the ability to publish your own projects to fortiers.com, email rick@fortiers.com and ask to be added as a user.
fortiers.com is a project ledger — a running, dated index of projects built and shipped. Each entry has a title, a short description, a date, and a link. The homepage lists them newest-first.
It's also a host: a project can be more than a link — its actual files (a static site, game, tool, or demo) can live here, served from fortiers.com/projects/<name>/.
There are two ways to post: by hand through the admin page, or programmatically through a REST API — so an AI agent (Hermes, Claude Code, or any script) can be told "post this site to fortiers.com" and do it in one HTTP call.
| Field | Required | Notes |
|---|---|---|
| Title | yes | Shown big in the ledger. |
| Description | no | One or two sentences under the title. |
| Where it lives | yes | Hosted here (files served from /projects/<slug>/) or External site (the entry links to a URL you provide). |
| Slug name | no | Hosted only — the folder name under /projects/. A random UUID is used if blank. |
| Page file | no | Hosted only — a single .html file that becomes the project's index.html (max 5 MB), or a .zip of the whole site with index.html at its root (max 50 MB; replaces any previous files for that slug). |
| Date | no | Defaults to today; controls ordering (newest first). |
| Screenshot | no | JPG/PNG/GIF/WebP, max 5 MB. Shown as a thumbnail. |
This is the here.now-style flow, meant for agents and scripts.
Log in to /admin.php → API Key tab → Generate API key. Give the key to your agent (e.g. as an environment variable). Every API request must send it as an X-API-Key header.
Zip your site so index.html is at the zip root (a single wrapping folder is also fine — it gets flattened), then:
curl -X POST https://fortiers.com/api.php \
-H "X-API-Key: ftr_..." \
-F "title=My Cool Project" \
-F "description=What it does, in a sentence." \
-F "site=@site.zip"
The response tells you where it lives:
{
"ok": true,
"url": "https://fortiers.com/projects/my-cool-project/",
"project": { "id": "53bb89cac954", "title": "My Cool Project", ... }
}
The site is now served at that URL and a ledger entry pointing to it appears on the homepage.
Skip the site file and pass a link to wherever the project already lives:
curl -X POST https://fortiers.com/api.php \
-H "X-API-Key: ftr_..." \
-F "title=My Repo" \
-F "link=https://github.com/me/my-repo"
url from the JSON response./projects/<slug>/. The slug is derived from the title (My Cool Project → my-cool-project) or set explicitly with a slug field.index.html at its root and be under 50 MB.slug replaces the previous deploy — old files are removed first, so deploys are clean.The Entries list on /admin.php has Edit and Delete next to every project. Edit pre-fills the form; uploading a new screenshot replaces the old one, leaving it empty keeps it.
# find the id
curl https://fortiers.com/api.php
# delete the ledger entry
curl -X DELETE "https://fortiers.com/api.php?id=53bb89cac954" \
-H "X-API-Key: ftr_..."
/projects/<slug>/ stay until overwritten by a new deploy or removed from the admin side — so a deleted entry's demo link keeps working if anyone still has it.data/config.json on the server via your hosting file manager — the next visit to admin.php runs first-time setup again. (This also clears the API key.)| Method | Endpoint | Auth | Does |
|---|---|---|---|
GET | /api.php | none | List all projects as JSON. |
POST | /api.php | key | Publish: fields title (required), description, date (YYYY-MM-DD), link, slug, site (zip file). A zip overrides link. |
DELETE | /api.php?id=… | key | Remove a ledger entry by id. |
Auth header: X-API-Key: <your key>. Errors come back as JSON with ok: false and an error message; success is HTTP 200/201 with ok: true.