Chapter 19Operate
Day-to-day operation
Deliver a site, train the client, update ten sites at once, publish the packages, and know how to answer the requests that will come anyway.
Delivering a site
-
Generate production credentials
bash bash npm run create:site -- --nom "Martin Bakery" --depot agency/martin-bakeryThe command prints two blocks that do not travel together: what goes to the client (a key, an address) and what goes to the host (the hash, the secrets, the token). Plus the pre-delivery checklist.
The key is written nowhere. What is not copied at that moment is lost — deliberately.
-
Verify before announcing
The four commands from Deployment, plus the five-wrong-keys trial. A delivery announced and then patched costs more than an hour of checking.
-
Hand over
- the address
thesite.com/admin; - the key, through a separate channel — not in the same message as the address, ideally not by email;
- the link to
/aide; - the training video.
- the address
The training video
Six minutes, recorded as a screen share on the client's own site. The client watches it when they need it — that is, three weeks after delivery, the day they want to change a photo. A live session is forgotten before it is useful.
| Sequence | Length | What is shown |
|---|---|---|
| 1. Getting in | 30 s | /admin, entering the key, landing on the site, the bar at the bottom. |
| 2. Changing a text | 60 s | The click, the typing, the variants bar. |
| 3. Replacing an image | 90 s | A real, unresized iPhone photo, and the “description” field. |
| 4. Adding a video | 30 s | Pasting a YouTube link. |
| 5. A list | 60 s | Duplicate, edit, move up, and delete with the confirmation. |
| 6. Publishing, and what can go wrong | 90 s | Close the tab, reopen it, publish, show a real conflict message. |
| 7. Where to find help | 30 s | The “Help” link and the contact address. |
- Zero technical words. If “JSON”, “commit”, “deployment” or “repo” slips out, reshoot.
- Never show the key on screen. Paste it from the clipboard, masked field, then check the final video frame by frame on that sequence.
- Show the errors. Sequence 6 is the most useful in the whole video: a client who has seen the conflict message once does not panic when it happens.
- Slow pace. A pause after every click: the client is following on their own screen.
And one sentence, exactly one, about what they cannot break: “You cannot break the layout, and nothing is ever permanently lost: every publication is kept. When in doubt, write to us.”
What not to include: multilingual features if the site is monolingual, how the rebuild works, the name of the host or the repository, and a list of forbidden things — the client cannot do them, and listing them only suggests the tool is fragile.
Updating a site
npm update inline-core
npm test && npm run checkThe changelog says what changes. Semantic versioning here carries one rule of its own:
| Version | What it means | To do on the site |
|---|---|---|
| major | The contract changes: configuration signature, schema shape, data-cms attributes. | One intervention, described in the changelog. |
| minor | New field, new editing gesture. | Nothing. |
| patch | Fix with no contract change. | Nothing. |
A schema change that would invalidate already published content is always a major version, even if the code compiles: it is the client's content that breaks, not ours.
Publishing the packages
-
Test the archives
bash bash npm run test:packThe only mode that catches a file forgotten in
filesor a path missing fromexports. Those errors are invisible while installing from a folder, and they break the first third-party site. -
Update the changelog
What changed, and above all what a site must do to follow.
-
Publish
bash bash npm run release:core # inline-core npm run release:cli # create-inline
Trying an archive by hand
# 1. build the archives
npm pack ./packages/inline-core --pack-destination /tmp/inline
npm pack ./packages/create-inline --pack-destination /tmp/inline
# 2. create a site from the creation archive
cd /tmp/inline && mkdir workshop && cd workshop
npm exec --yes -- "file:/tmp/inline/create-inline-1.0.0.tgz" my-site --nom "Trial"
# 3. install the core from its archive, then build
cd my-site
npm install "file:/tmp/inline/inline-core-2.0.0.tgz"
npm run build && npm run serve:functionsnpx <archive>resolves the relative path from an unexpected folder: usenpm exec --yes -- "file:<absolute path>".- Installing
inline-coreby its folder requires the trial project to be on the same drive as the repository: npm then creates a symlink, and Astro computes the path of an injected route withpath.relative, which does not exist across drives. Installing the archive copies the package and lifts the constraint.
Running several sites
Beyond three clients, the question is no longer “does it work” but “which version runs where”. Keep a table, somewhere, with one row per site:
| Site | Repository | inline-core | Token expires | Key handed over |
|---|---|---|---|---|
| martin-bakery.com | agency/martin-bakery | 2.0.0 | 2027-03-01 | 2026-08-12 |
| durand-practice.com | agency/durand-practice | 2.0.0 | 2027-01-15 | 2026-06-30 |
That table is what makes a security fix applicable: ten npm update inline-core,
ten npm test, ten pushes. Not ten edits to find again across ten different
codebases.
The deadline everyone forgets
Git token expiry. It does not break the site: it breaks publishing, and the client finds out while trying to change a page — often on a Friday. A reminder a week ahead, per site, takes thirty seconds to set.
Backup and restore
Backup
There is none to do
Content is in the repository, already replicated. There is no database, so nothing to export overnight.
Restore
A git revert
Going back to the state before a publish is a standard gesture. The site rebuilds within the minute.
The requests that will come
| Client request | Answer |
|---|---|
| “I'd like to add a page” | Developer: a content file, a template, a navigation link. One hour. |
| “I'd like to move this block” | Developer. That is the boundary announced at delivery. |
| “I'd like another colour for this heading” | Within their theme: yes, right away, themselves. Outside it: developer. |
| “My colleague would like to edit too” | Technically: give them the same key — history will not tell them apart. Properly: move to delegated authentication. To be decided, not improvised. |
| “I lost my key” | Rotation. It is not recovered, it is regenerated. |
| “I'd like a contact form with stored submissions” | Out of scope. A third-party service, or another tool. |
| “I'd like a blog with categories and search” | Out of scope — and that is the signal that an off-the-shelf CMS would fit better. |
Handing over
What a developer taking over the project must receive:
- Access to the repositories and the machine account.
- Access to the host, and the list of projects.
- The site table: version, deadlines, dates.
- The first three chapters of this documentation, in order.
- The repository's instruction file — the eleven absolute rules.
- And above all: why the scope is frozen. That is what gets lost first.