Skip to main content

slipway docs style guide

Every page in docs/ 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.
Not like these:
  • 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.
If the reasoning is genuinely load-bearing, state it once as a plain clause, not as an epigram: “A disk is a single block device, so only one service can mount it.”

2. “X is a Y, not a Z”

The antithesis construction. Nine instances in the current docs, three of them as section-closing flourishes.
Say what the thing is. If a misconception genuinely needs correcting, use a <Note> or an FAQ entry, not a rhetorical inversion in body prose.

3. Announced-list scaffolding

Eight instances of Two things to know: / Two caveats: / Two limits worth knowing: in the current docs.
The list is visible. Do not narrate its arrival or its length.

4. Mic-drop section closers

Cut the sentence. If it carries a fact, restate it flatly earlier in the section.

5. Section intros that restate the heading

6. Rule-of-three padding

Two examples is usually enough. Six is never necessary.

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
Not permitted: bolding a phrase mid-paragraph for emphasis, or a standalone bolded sentence as its own paragraph. Target at most one bold span per ten lines. Two current pages run at five times that.

Brand name

Always lowercase slipway, 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.
A table may still carry a 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 in snippets/ and are transcluded. Never hardcode them in a page.
The lint script fails on a hardcoded rate or plan ceiling outside 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.
Three or more callouts on one page means the page is badly organised, not that the feature is dangerous.

Tabs

Anything configurable in both places gets both, side by side:
This is not optional. A reader arrives with one of the two mental models and should never have to translate.

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:
Use 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:
Add a third only where a diagram genuinely encodes success versus failure:
Never hardcode a text colour or an opaque light fill. Mintlify renders diagrams in both themes and an opaque #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 a Field | 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 complete slipway.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

  1. description is a one-line imperative subtitle.
  2. Opening is two or three declarative sentences and does not restate the title.
  3. Every H2 is task-shaped.
  4. No closing aphorism, no X is a Y, not a Z, no Two things:, no mic-drop closer.
  5. No em-dashes. slipway lowercase everywhere.
  6. Bold only on required-ness prefixes and row labels.
  7. Every number comes from a snippet.
  8. Every fact re-verified against the source file in the table above.
  9. Every image locates a control; every flow is a mermaid diagram.
  10. npm run lint and npm run broken-links are clean.