slipway docs style guide
Every page indocs/ is written to this guide. npm run lint enforces the mechanical
half; the rest is on the writer.
The target is Render’s operational documentation: flat, declarative, boring in the way
good reference is boring. If a sentence sounds like it was written to be admired, cut it.
Page anatomy
Every page has the same skeleton.Frontmatter
title is a noun phrase, sentence case. description is a one-line imperative
subtitle that says what the reader can do. Both are required on every page.
The description is not decoration. It is the sidebar tooltip, the search result snippet,
and the line that represents this page in llms.txt.
Write descriptions like these:
Preserve a service's filesystem across deploys and restarts.Run multiple copies of a service to handle more load.Give every pull request a running copy of your project.Deploy a repo with no Dockerfile by picking a language runtime.
An overview of disks.(says nothing)Disks are persistent storage for your services.(restates the title)Everything you need to know about scaling.(scaffolding)
Opening
Two or three declarative sentences. State the fact, then the constraint. Never restate the title. Never announce what the page will cover. Never open with a problem statement the reader is assumed to have.Headings
Task-shaped, not topic-shaped. The reader is scanning for a verb.
A field-reference section is the exception: there, the heading is the field name, exactly
as written in YAML (
## dockerfilePath).
Closing
The page ends when the last fact is stated. No summary, no “and that’s it”, no closing paragraph explaining why the design is good.Banned constructions
These are the patterns that make the current docs read as machine-written. Each one is drawn from a real line in this repo.1. The closing justification aphorism
A rule is stated, then a sentence explaining that the rule is correct. This is the single most frequent tell in the current docs, and the same aphorism often recurs across pages.2. “X is a Y, not a Z”
The antithesis construction. Nine instances in the current docs, three of them as section-closing flourishes.<Note>
or an FAQ entry, not a rhetorical inversion in body prose.
3. Announced-list scaffolding
Eight instances ofTwo things to know: / Two caveats: / Two limits worth knowing:
in the current docs.
4. Mic-drop section closers
5. Section intros that restate the heading
6. Rule-of-three padding
7. Reusing a phrase across pages
The current docs repeat “the first visitor is as fast as the thousandth” verbatim on three pages, and “the verification loop agents otherwise lack” on three more. A phrase that appears on more than one page reads as templated. Say it once, on the page that owns the topic, and link.Mechanics
Em-dashes
None. Use a period, a comma, a colon, or parentheses.Bold
Bold carries a load-bearing prefix or a table row label. Nothing else. Permitted:**Required.**/**Optional.**/**Required unless…**at the head of a field definition**No.**/**Yes.**at the head of an FAQ answer- The first cell of a table row, when the table has no header column
Brand name
Always lowercaseslipway, including at the start of a sentence. If that reads badly,
rewrite the sentence so the name is not sentence-initial.
slipway.yaml, slipway and any other identifier keep their literal casing in code spans.
Defaults
State a default as a conditional sentence, not as a bare table cell.Default column as a scannable index, but the prose beneath
the table is where the default is actually stated.
Required-ness
In reference pages, mark it as a bold prefix on the field’s own paragraph:Numbers
Prices, plan ceilings, retention windows and engine versions live insnippets/ and are
transcluded. Never hardcode them in a page.
snippets/.
Source of truth for every number:
Callouts
<Note> and <Warning> are for sharp edges only: a thing that will bite a reader who
does not know it. Phrase as a bare imperative or a bare fact.
Tabs
Anything configurable in both places gets both, side by side:Second person, present tense
“You can attach a disk.” “slipway rebuilds the service.” Not “users may attach” and not “a disk will be attached”.Hedging
Do not hedge. If there is an exception, name it.Images
A screenshot exists to locate a control. A diagram exists to show a sequence or a decision. Nothing else gets a picture.A screenshot is justified when the reader has to find something on screen and the prose cannot say where it is more cheaply than the picture can. “Click Add registry in the top right” needs no screenshot. A node editor, a gallery, a chart, or a panel with six controls does. A screenshot is not justified when it shows a filled-in form the prose already describes, a list of rows, a terminal prompt, or the page the reader is already looking at. Reference pages, concept pages, FAQ pages and plan/limits pages carry zero images. Use a mermaid diagram, not a screenshot, when the subject is a flow or a decision: deploy phases, probe outcomes, choosing a service type, how a preview resolves a sibling.
Diagram standard
Diagrams are animated and use the brand palette. Render does the same, and it is what makes a flow read as a flow rather than a static box chart. Name each edge, then animate it. This is Mermaid 11.3+ syntax:animation: slow for steady-state flows (a probe loop, a request path) and
animation: fast only where the point is that something is quick. Do not animate a
decision tree’s every branch if the diagram is large enough that it becomes noise.
Colour comes from two classDef rules, reused on every diagram. Both use an alpha-blended
fill so they read correctly in light and dark mode, with text colour left to inherit:
#fff fill turns into black-on-black in dark mode.
Use {{"..."}} for a question or decision node and ["..."] for a concrete thing.
Every image is a <Frame> with a caption that adds information rather than repeating the
alt text. Images are ≤1440px wide and WebP. An image used on more than one page is a sign
that at least one of those pages did not need it.
Page types
Conceptual page
Opening, task-shaped sections, and an## Appendix: glossary at the foot defining the
nouns the page used. Link the glossary entries to /reference/glossary.
Reference page
Grouped by applicability. Each group opens with aField | Description table linking down
to per-field anchors. Each field then gets its own heading and a paragraph beginning with
its bold required-ness marker. Long examples go in a collapsible <Expandable>.
Procedural page
Numbered steps. One action per step. A screenshot only on steps where the control is hard to find. End at the last step, not with a summary.Quickstart
600 to 900 words. What you will deploy, prerequisites, the completeslipway.yaml,
deploy, what you got, next-steps cards. At most one image.
Troubleshooting entry
Keyed by the symptom or the literal error text the reader sees, because that is what they will search for. Cause, then fix.FAQ sections
Add one where the same misconception keeps arriving. Answers may be one line. Lead with**Yes.** or **No.** when the question is a yes/no.
Checklist before committing a page
descriptionis a one-line imperative subtitle.- Opening is two or three declarative sentences and does not restate the title.
- Every H2 is task-shaped.
- No closing aphorism, no
X is a Y, not a Z, noTwo things:, no mic-drop closer. - No em-dashes.
slipwaylowercase everywhere. - Bold only on required-ness prefixes and row labels.
- Every number comes from a snippet.
- Every fact re-verified against the source file in the table above.
- Every image locates a control; every flow is a mermaid diagram.
npm run lintandnpm run broken-linksare clean.