Documentation planning and implementation
How to Plan and Build a Documentation Website for Any Software Project
Good documentation is not a collection of pages written after development. It is a working path from a user's question to a verified result. This guide provides a project-independent plan for creating that path, whether you are documenting a command-line utility, a storage platform, an internal API, a library, or a commercial service.
Use the entire workflow for a new site, or take only the inventory, template, migration, and review sections when improving an existing one. The OpenSAN pages appear as a worked example; the method itself does not depend on OpenSAN or on a particular publishing tool.
What this plan produces
- For users
- A site where they can understand the product, complete a task, confirm the result, and recover from common errors.
- For maintainers
- A page map, content inventory, reusable templates, redirect map, publication checklist, and named review owners.
- For each page
- One clear purpose, one preferred URL, an identifiable audience, tested instructions, and a defined update trigger.
- What you need
- Product knowledge, access to existing content and URLs, a publishing method, and someone who can verify technical claims.
Start with five deliverables
A documentation project becomes manageable when every phase ends with something concrete. Before writing new pages, create these five small artifacts. They can live in a spreadsheet, repository, or issue tracker; the format matters less than keeping them together and current.
| Deliverable | What it answers | Minimum contents |
|---|---|---|
| Audience and task list | Who uses the product, and why? | Audience, goal, prerequisite knowledge, critical task, owner. |
| Content inventory | What already exists? | URL, title, status, traffic or inbound-link note, accuracy, action. |
| Page map | Where will each question be answered? | Page purpose, preferred URL, parent section, page type, owner. |
| Redirect map | What happens to old addresses? | Old URL, destination URL, reason, redirect status, verification result. |
| Definition of done | How do we know a page is ready? | Technical review, link check, mobile check, metadata, owner, review date. |
For a small project, one person may produce all five. For a larger product, assign a documentation editor to structure and wording, engineering owners to technical accuracy, and a release owner to versioned material. Do not make the editor guess whether a command is safe or still supported.
Define users, outcomes, and owners
Deliverable: a short audience-and-task list.
Begin with tasks, not with a navigation menu. “Developer” and “administrator” are useful labels, but they do not tell you what the documentation must help them do. Write one sentence for each real outcome: evaluate the product, install a supported version, connect an application, upgrade without losing data, diagnose a failure, or remove the product cleanly.
For each outcome, record:
- who is doing the work and what they already know;
- the environment, platform, or product version involved;
- what must be true when the task is complete;
- what can go wrong or cause irreversible damage;
- who can verify the instructions and approve future changes.
Reusable task statement
[Audience] needs to [complete an action] on [supported environment] so that [observable result], without [important risk].
Example: A first-time operator needs to install the current stable release on a clean Linux host so that the service answers a health check, without overwriting an existing data directory.
Prioritize tasks by consequence and frequency. Installation, security, upgrades, backups, data migration, and recovery normally deserve verified pages before background material or minor customization. A rarely used recovery guide may still be critical because the cost of getting it wrong is high.
Inventory existing content and URLs
Deliverable: one row for every public page, file, and known legacy URL.
If a site already exists, do not begin by replacing its template. First collect what users and external sites can reach: HTML pages, PDFs, release notes, package files, API references, old wiki paths, translated pages, and URLs found in analytics, server logs, sitemaps, repositories, issue discussions, or backlink reports.
A practical inventory uses these columns:
url,title,type,status,owner,last_verified,inbound_links,action,destination
/setup/,Install the server,task,200,platform,2026-07-01,yes,keep,
/old-install.html,Legacy install,task,200,platform,unknown,yes,redirect,/setup/
/v1.pdf,Version 1 manual,archive,200,release,2024-03-10,yes,archive,
Give every item one action:
| Action | Use it when |
|---|---|
| Keep | The page is accurate, useful, and already has the right purpose. |
| Improve | The purpose is valid but the page is incomplete, unclear, or outdated. |
| Merge | Several pages answer the same task and split the useful information. |
| Archive | The material is valid only for an older version that people still use. |
| Redirect | A current page fully replaces the old page. |
| Remove | The content is wrong or unsafe and there is no honest replacement. |
Do not confuse “old” with “useless”
Old release notes, compatibility tables, and verification instructions may still support installations in the field. Label their version and support status clearly. Remove them only when keeping them would mislead or endanger users.
Design a task-based page map
Deliverable: one page purpose and one preferred URL for every documented task.
Organize the site around the questions users bring to it. Product teams often mirror their own departments or code modules in the menu, but those boundaries may be invisible to a new user. A useful top level usually combines a small number of durable groups:
- Overview: what the product does, where it fits, and its limits;
- Get started: prerequisites, installation, first successful result;
- Guides: complete tasks and operational workflows;
- Reference: commands, configuration, API fields, and exact values;
- Operations: upgrades, backup, monitoring, security, and recovery;
- Releases: changes, compatibility, downloads, and verification;
- Support: troubleshooting, known issues, and contact routes.
This is a starting point, not a required menu. A library may need API reference and examples but no operations section. A hosted service may need account administration and billing. Remove a section when it has no real content; empty categories make a site feel unfinished.
A worked OpenSAN page map
OpenSAN is an infrastructure project, so its compact map emphasizes capabilities, architecture, releases, and usage. The same columns can be reused for another project while the rows change.
| User task | OpenSAN page | Page purpose |
|---|---|---|
| Understand the project | Home | Explain the use case, project scope, and next useful actions. |
| Evaluate capabilities | Features | State supported storage, network, management, and monitoring functions. |
| Review the architecture | Technical overview | Explain components, dependencies, interfaces, and project-specific code. |
| See what changed | Releases | Provide versioned notes and compatibility warnings in date order. |
| Download or build | Downloads and usage | Provide files, requirements, checksums, signatures, and tested commands. |
| Ask for help | Contacts | Name the available support route and set expectations. |
Before accepting the map, walk through three complete journeys: a first evaluation, a first successful setup, and a failed setup. If a user must search the web or guess the next page, the path is incomplete.
Choose a publishing method
Deliverable: a short decision record naming the platform and why it fits.
Choose the simplest method that supports the real editing workflow. The page map and content model should survive a future platform change; do not let a theme or plugin decide the structure of the documentation.
| Method | A good fit when | Main trade-off |
|---|---|---|
| Static HTML | The site is small, changes infrequently, and must run almost anywhere. | Shared navigation and repeated metadata require careful manual updates or a small build script. |
| Static-site generator | Documentation is versioned with code and contributors are comfortable with repository reviews. | Non-technical editors may need a preview workflow and authoring help. |
| CMS | Several editors publish frequently and need drafts, permissions, media management, or approvals. | Updates, extensions, access control, and generated markup require ongoing maintenance. |
| Application framework | The documentation needs authenticated, personalized, or genuinely interactive behavior. | It adds build and runtime complexity that ordinary documentation pages do not need. |
Also decide how previews are created, who can publish, where source files live, how changes are reviewed, and how a previous release is restored. A platform is not complete until an editor can see a draft and a maintainer can roll back a bad publication.
Build reusable page templates
Deliverable: templates for tasks, concepts, reference, troubleshooting, and releases.
Do not force every kind of information into one article layout. A task guide tells a reader what to do in order. A reference page helps them look up an exact value. A concept page explains why the system behaves as it does. A troubleshooting page starts with a symptom. Templates make these differences visible and reduce omissions during writing.
| Page type | Required parts |
|---|---|
| Task guide | Outcome, prerequisites, compatibility, ordered steps, expected result, rollback, next step. |
| Concept | Plain-language summary, context, components, relationships, limits, related tasks. |
| Reference | Scope, exact syntax or fields, defaults, allowed values, examples, version notes. |
| Troubleshooting | Symptom, affected versions, likely causes, diagnosis, fix, verification, escalation. |
| Release | Version, date, support status, changes, breaking changes, upgrade path, files, checksums. |
Copyable task-page outline
# [Action and object]
Use this guide to [observable outcome].
## Before you begin
- Supported versions:
- Required access:
- Required tools or files:
- Backup or safety warning:
## Steps
1. [Action]
Expected result: [what the user should see]
2. [Action]
Expected result: [what the user should see]
## Verify the result
[Command, request, screen, or behavior that proves success]
## Undo or recover
[How to return to a safe state]
## Troubleshooting
[Symptom] - [diagnostic action] - [fix]
## Next steps
[One or two relevant links]
Keep shared elements shared: site navigation, breadcrumbs, product and version labels, page owner, last verified date, feedback route, and footer. A template should remove repetitive decisions, not fill pages with boilerplate that says nothing about the task.
Write instructions that can be followed
Deliverable: a tested draft for each priority task.
Write while performing the task in a clean or representative environment. Record commands and results as they occur. Memory tends to omit prerequisites, inherited configuration, permissions, and decisions that experienced maintainers make automatically.
Each instruction should answer four questions:
- What should I do? Begin with a concrete verb and name the object.
- Where should I do it? Name the host, directory, interface, account, or configuration file.
- What should happen? Show a meaningful success signal, not only “the command completes.”
- What if it does not? Link the likely symptom to a diagnosis or safe recovery action.
Separate commands from output, and never put placeholders into a command without marking them.
Explain whether a value must be replaced and give it a recognizable form such as
<server-address>. State whether an action requires elevated privileges, restarts a
service, changes data, or causes downtime.
Prefer evidence to reassurance
“The installation is now complete” is weak on its own. “A request to /health
returns 200 OK and reports the expected version” gives the reader a way to know.
Every critical procedure should end with an observable verification.
Ask a person who did not write the page to follow it. Note every pause, assumption, wrong turn, and unexplained term. That short observation is usually more valuable than another round of stylistic editing.
Connect pages with useful navigation
Deliverable: every important page is reachable through a meaningful user path.
Global navigation should expose the durable sections of the site. Contextual links should carry the reader through the current task: from prerequisites to installation, from a release note to upgrade instructions, or from an error to a diagnostic page.
Use ordinary HTML links with destination names that make sense on their own:
<a href="/guides/verify-download/">Verify the downloaded release</a>
Avoid generic labels such as “click here” and links that exist only in a JavaScript event handler. Add a section index when a group becomes too large for the main menu. Add breadcrumbs when users often enter on deep pages. At the end of a task, offer the next likely action rather than a long automatically generated list.
A sitemap is useful for discovery and diagnostics, but it is not a substitute for navigation. If an important page can be found only in the sitemap, the user journey and the internal link structure are both incomplete.
Migrate URLs without losing useful paths
Deliverable: a one-to-one redirect map and a post-launch status report.
Keep an established URL when the page still serves the same purpose. When content moves, map the old address to the closest current replacement. Use a permanent server-side redirect for a permanent move. Do not send every retired page to the home page; that hides whether a real replacement exists and gives the visitor no answer to the original question.
| Old URL | New URL | Decision |
|---|---|---|
/install.html | /get-started/install/ | 301: the new guide fully replaces the old one. |
/v1/install/ | Same URL | Keep: version 1 remains in use and the page is accurate. |
/unsafe-workaround/ | No replacement | Return 410 or a clear 404; explain the removal on a relevant support page. |
Update internal links to point directly to the new URL. Include only preferred, indexable URLs in the sitemap. Keep protocol, hostname, trailing-slash, and letter-case rules consistent so one page does not appear under several addresses.
After launch, check both the first and final response:
curl -I http://example.org/install.html
curl -IL http://example.org/install.html
The first command should show the intended redirect. The second should end at the correct HTTPS page without a loop or a chain of avoidable intermediate redirects.
Add technical publishing details
Deliverable: a complete page head, valid response, accessible layout, and current sitemap.
Technical details support the content; they cannot replace it. Finish the visible page first, then describe that exact page in metadata and structured data.
Use a complete, accurate page head
<title>Install Example Server on Linux | Example Project</title>
<meta name="description"
content="Install Example Server, start the service, and verify
the health endpoint on a supported Linux host.">
<link rel="canonical" href="https://docs.example.org/get-started/install/">
<meta name="robots" content="index,follow">
- Use a unique title and description that match the visible task.
- Set one self-referencing canonical URL on the preferred page.
- Use accurate publication and modification dates; do not change them automatically without a content change.
- Set the document language and use one clear main heading with logical subheadings.
- Keep essential text and links in the HTML response.
Use structured data only when it matches
An article can be described with TechArticle or Article. A visible,
ordered procedure can also be described with HowTo. Use the same title, author,
dates, step names, and order that appear on the page. Do not invent ratings, images, tools, or
steps for the markup.
Schema.org still defines HowTo, but Google does not currently provide a dedicated
How-to rich result. Treat structured data as a clear machine-readable description, not as a
guarantee of a special search display.
Make the page robust
- Use semantic HTML for headings, navigation, main content, lists, tables, and code.
- Make keyboard focus visible and ensure links can be understood without color alone.
- Allow tables and code blocks to scroll on narrow screens instead of breaking the layout.
- Set image dimensions and write useful alternative text for informative images.
- Compress text assets, cache versioned files, and remove scripts the page does not use.
- Generate the sitemap from canonical public URLs when the site changes frequently.
Test, publish, and maintain
Deliverable: a signed-off release and an update routine tied to product changes.
Test the production URL, not only a local preview. The server can introduce redirects, caching, authentication, content types, or indexing rules that do not appear in the source files.
Definition of done for a documentation page
- The page answers one named user task and states its supported versions or scope.
- A technical owner has performed or verified the instructions.
- Prerequisites, risks, expected results, and recovery steps are present where needed.
- The final preferred URL returns
200 OKover HTTPS. - Old addresses reach the correct replacement through an intentional permanent redirect.
- Navigation and contextual links use descriptive labels and reach valid destinations.
- The title, description, canonical URL, headings, and structured data agree.
- The page works on a narrow screen and can be navigated with a keyboard.
- Essential content remains available without optional client-side scripts.
- An owner and a review trigger are recorded.
Use change triggers, not arbitrary dates alone
A quarterly review can catch neglect, but documentation should change when the product changes. Add a documentation check to release work, configuration changes, API changes, security fixes, deprecations, support-policy changes, and domain or hosting migrations.
| Product event | Documentation action |
|---|---|
| New release | Update release notes, compatibility, downloads, upgrade guide, and version labels. |
| Configuration change | Update reference defaults, examples, migration notes, and troubleshooting. |
| Feature removal | Mark deprecation, explain alternatives, preserve relevant old-version pages. |
| Support incident | Turn the confirmed diagnosis and recovery path into a troubleshooting entry. |
| URL or platform migration | Run the URL inventory, redirect checks, canonical checks, and sitemap comparison. |
Measure whether users complete tasks, not only whether pages receive visits. Useful signals include failed internal searches, repeated support questions, exits during a procedure, broken-link reports, copied commands that fail, and pages that have not been verified for the current release.
A reusable project starter kit
Keep the planning files beside the documentation source. This small structure works with plain HTML, a static-site generator, or a CMS export process:
documentation/
README.md # audience, scope, publishing process
content-inventory.csv # every current and legacy URL
redirects.csv # old URL to new URL mapping
owners.csv # technical area and approver
templates/
task.md
concept.md
reference.md
troubleshooting.md
release.md
checks/
pre-publication.md
release-review.md
In README.md, record how to preview the site, how to publish it, how to roll back, and
where to report a documentation problem. A new contributor should not need private knowledge to
make a small, safe correction.
Signs that the site needs another pass
- The navigation describes the organization chart or repository instead of user tasks.
- Several pages explain the same action but disagree about versions or commands.
- A procedure ends without a way to verify success.
- Search results lead to an old page that has no version label or replacement link.
- Every removed URL redirects to the home page.
- Release files are separated from their checksums, signatures, or compatibility notes.
- The page has polished metadata but thin, generic, or untested visible content.
- No person knows who must update the page after a product change.
Fix the earliest broken part of the workflow. More metadata will not repair an unclear page map, and a visual redesign will not repair instructions that no one has tested.
Official references
These references cover the technical standards used in this plan. They are useful during implementation, but the project's own tested behavior remains the source of truth for commands, compatibility, and operational warnings.
The useful result
A useful documentation site does not need to be large. It needs to connect a real audience to a verified result, preserve the addresses people already rely on, and make future changes routine. Start with users and tasks, turn them into a page map, write with reusable templates, and test the production path from beginning to end.
The five planning artifacts at the beginning of this guide can be reused for the next project. Replace the audiences, tasks, page rows, and technical owners; keep the workflow. That is what turns a one-off documentation site into a repeatable practice.