A documentation template can manufacture the appearance of order in seconds: a getting-started page, a reference section, a neat little slot for troubleshooting. Fill those headings before choosing a real product task and you have built an empty house faster.
I think a template earns its keep only when it forces the writer to expose product behavior. The downloads below pair a blank starter with a filled example for a hypothetical export service that stores request records in memory without generating files.
The quickstart proves a first result, reference nails down the contract, and troubleshooting tells the reader what to do when the response disappears.
Copy the blank starter or inspect the filled template
- Download the blank technical documentation template.
- Download the filled writing lab and runnable fixture.
- Read the filled documentation index.
The blank starter contains a MkDocs site and its validator. The writing lab is a separate Markdown example with a local service; it does not replace the starter's publishing setup.
| Page job | Filled example | Evidence the page must supply |
|---|---|---|
| Choose where to begin | docs/index.md |
Links from the reader's task to the owning page |
| Reach first success | docs/getting-started.md |
Startup commands and an observable response |
| Perform a bounded task | docs/send-a-request.md |
A complete request with its recovery branch |
| Look up a contract | docs/reference.md |
Input rules and response meanings |
| Recover from a symptom | docs/troubleshooting.md |
A diagnostic check and a justified next action |
If a page has no distinct reader job, kill the placeholder until a task requires it. An empty "Concepts" section is a promise nobody has done the work to keep.
The documentation types guide helps place explanation or tutorial material when it grows beyond this initial route.
Fill the starting path with a real command
The filled quickstart tells the reader to extract the archive and run these commands from writing-lab. The recorded test runtime is Node.js 24.18.0; the fixture has no npm dependencies.
node --version
node check.mjs
node service.mjs
The check ends with PASS. The server then prints its loopback URL and remains running.
Set LAB_URL to the printed value in another terminal:
export LAB_URL=http://127.0.0.1:49152
curl --fail-with-body "$LAB_URL/health"
curl -i "$LAB_URL/exports" \
-H 'Content-Type: application/json' \
-H 'Idempotency-Key: report-a' \
--data '{"format":"csv"}'
On a fresh server, the request returns HTTP 202 with {"id":"exp_1","format":"csv","status":"accepted"}. The page must define what "accepted" means: a record exists in this server's memory.
If the health request fails, compare the URL with the server terminal before continuing; use the recovery page for an export error. Keep this server running for the recovery experiment below.
Put exact rules in reference
A quickstart can choose csv for its first request. Reference must also say whether json is allowed and what happens to an unsupported value.
That distinction keeps setup prose short without hiding the contract.
| Reference field | Filled value | Check |
|---|---|---|
| Format | csv or json, required |
xml returns HTTP 400 |
| Request key | Required; 1 to 64 ASCII letters, digits, or hyphens | Missing key returns HTTP 400 |
| Body size | Limit: 4096 bytes | A valid padded 4096-byte request is accepted; 4097 bytes return HTTP 413 |
| Retention | The lifetime of this server instance | A new instance starts with no stored records |
| Output | An accepted record identifier | The fixture contains no file-generation worker |
Run node check.mjs to verify the tested cases. An assertion failure means the corresponding contract statement needs investigation.
For a CLI or internal tool, fill the option's allowed values and state the observed failure before recommending the page layout. Limit the claim to the tested cases, then name the behavior change that should trigger page review.
Give recovery its own decision table
The blank starter already includes a troubleshooting page. The missing work is product-specific: supply enough information for the reader to act after an ambiguous outcome.
The filled guide deliberately stores a request, then closes its connection without a response.
curl -i "$LAB_URL/exports" \
-H 'Content-Type: application/json' \
-H 'Idempotency-Key: report-loss' \
-H 'X-Fixture-Drop-Response: yes' \
--data '{"format":"csv"}'
Use a previously unused key. Expect curl's Empty reply from server and exit code 52.
The controlled connection loss is not a timed network outage. If you receive HTTP 200, that key was already retained; use another unused key to reproduce the failure.
| Observed state | Next action | Reason |
|---|---|---|
| Response lost; same instance still running | Repeat with the saved key and format, omitting the fixture failure header | The retained record can be returned with HTTP 200 |
| HTTP 409 | Compare the new format with the original request | The key identifies a different retained payload |
| Process restarted after response loss | Stop the recovery experiment | The fixture cannot recover the previous record |
"Retry failed requests" is the kind of instruction that looks tidy in a review and ruins someone's afternoon in production. The filled request guide contains the retry command and the troubleshooting page owns the stop condition.
The recorded fixture checks ran on Node.js 24.18.0 on 10 September 2026. No human reader trial has been completed.
Reader check: select an action for each row using only the filled pages, then identify the supporting sentence. If a choice needs outside information, record that gap before claiming the template supports the task.
After the recovery experiment, press Ctrl-C in the server terminal. Stopping this fixture erases its stored records.
Check structure and behavior separately
The blank starter's validator checks navigation and local Markdown links. Its strict build checks the documentation site.
Run its commands from the extracted starter, after installing its requirements in a fresh Python environment:
python -m venv .venv
. .venv/bin/activate
python -m pip install -r requirements.txt
python scripts/validate_docs.py
mkdocs build --strict
If installation or validation fails, stop before publishing generated output. These checks do not send a request to your product.
The filled fixture's node check.mjs covers behavior and closes its temporary servers, but does not test the blank starter's publishing workflow.
| Change | Page to review | Evidence to repeat |
|---|---|---|
| Startup command changes | Getting started | Clean-directory startup and health request |
| Input limit changes | Reference | Accepted boundary and rejected adjacent value |
| Storage lifetime changes | Reference and troubleshooting | Recovery before and after restart |
| A link target moves | Index and referring pages | Link validation and rendered navigation |
The documentation review checklist adds the reader-facing checks.
Assign an owner to each filled page and keep its triggering behavior beside the review check.