The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Nowline listing page.
Roadmaps as code. For everyone.
Human readable roadmaps, built for AI.
Plain .nowline text files. Version-controlled. Render to SVG, PNG, PDF, HTML, Mermaid, XLSX, and MS Project XML.
Nowline is a text-first DSL for describing product and engineering roadmaps — human readable and machine readable. You write plain .nowline text files — indented, keyword-driven, diff-friendly — and tooling renders them as timelines, validates them, and composes them.
Renders to:
include other files with explicit merge / ignore / isolate semantics.Install the CLI from your package manager:
Debian/Ubuntu and Windows users can grab the latest .deb or .exe from GitHub Releases. See packages/cli/README.md for the full install matrix (including man nowline setup).
Two-tier Node policy: Node ≥ 22 to consume @nowline/* packages (engines.node on every published package), Node 26 (.nvmrc) to develop. CI tests both versions on every PR. See Toolchain & Supported Versions for the full policy and bump procedure.
Render your first roadmap:
Or scaffold a brand-new file from a template:
For the VS Code / Cursor / VSCodium extension, search Nowline on the VS Code Marketplace or Open VSX.
0.xversioning.nowlineis on0.x.ywhile we settle the embed surface and IDE expansion. Public APIs may change between minor versions; full SemVer guarantees apply once we ship1.0. Seespecs/releasing.mdfor the version contract.
To run from a checkout for local development (pnpm install && pnpm build), see CONTRIBUTING.md.
nowline is verbless: rendering is the default. Other operations are flags on the same command.
The render pipeline is @nowline/core parse → @nowline/layout layout → @nowline/renderer SVG → format-specific exporter. Output is byte-for-byte deterministic for the same input, theme, and --now. A single nowline binary ships every format — see packages/cli/README.md for install details.
--dry-run)Run the full pipeline (parse + validate + layout + format) without writing. Exits 0 on success, 1 if any errors are emitted.
Convert is just -f json (or -f nowline to go the other way). Input format is inferred from the extension; --input-format overrides for unusual filenames.
The emitted JSON carries a top-level "$nowlineSchema": "1" so downstream tools can detect schema changes. Comments are not preserved across round-trips — see packages/cli/README.md for the canonical printer rules.
--serve)Run a live-reload preview in the browser. Great while authoring.
The server re-parses, re-validates, re-lays-out, and re-renders on every file change; connected clients refresh automatically via Server-Sent Events. Validation errors are displayed as an overlay on top of the most recent successful render.
--init)Scaffold a new .nowline file in cwd. The positional argument is the project name, not a file path. .nowline is auto-appended.
minimal, teams, and product correspond to the files under examples/. Existing files are silently overwritten.
| Code | Meaning |
|---|---|
| 0 | Success |
| 1 | Validation error (parse failure, invalid reference) |
| 2 | Usage error (missing input, bad flags, unsupported format, file not found, binary→TTY refusal) |
| 3 | Output error (cannot write to destination) |
After any package-manager install (brew install lolay/tap/nowline, npm install -g @nowline/cli, or the .deb from GitHub Releases), man nowline shows the CLI manual and man 5 nowline shows the full DSL reference. Both man pages also ship as standalone assets on every GitHub Release — see packages/cli/man/ for the mdoc sources.
| Keyword | Purpose |
|---|---|
roadmap | The top-level roadmap declaration. At most one per file. |
swimlane | A horizontal lane of work. |
item | A unit of work inside a swimlane. |
parallel | A block whose children run concurrently. |
group | A logical grouping of items, rendered together. |
anchor | A named date on the timeline. |
milestone | A point-in-time marker that depends on work. |
footnote | A callout anchored to one or more entities. |
person, team | Ownership references. |
style, label, status, duration, scale, calendar, default | Config and declaration entries. |
A roadmap may carry an optional start:YYYY-MM-DD that anchors the timeline baseline:
anchor, or any milestone with a date: property, start: is required.start:.duration: and after: only) does not need start:.includes that don't use roadmap:ignore, the parent and any included roadmap must agree on start: — both absent, or both present with the same value. Mismatches are errors, not silent overrides.merge — default: child content is merged; parent definitions win on collision.ignore — child content of that kind is discarded.isolate — child roadmap is preserved as a self-contained region (requires a roadmap in the child).For the full grammar reference, see specs/dsl.md.
Progressively-richer examples are included:
examples/minimal.nowline — smallest complete file.examples/capacity.nowline — lane and item capacity: with on-call support taking a quarter of team bandwidth; lane utilization underline.examples/sizing.nowline — T-shirt size: entries plus shortening calendar span with capacity: (parallel work).examples/teams.nowline — persons, teams, anchors, milestones, footnotes.examples/product.nowline — full config, styles, labels, parallels, groups, descriptions.examples/long.nowline — stress test: eight swimlanes, ~160 items, parallels, groups, anchors, milestones, footnotes, cross-cutting labels. Used for layout/render perf.examples/nested.nowline + examples/nested/ — parent Security swimlane plus five isolated per-team roadmap includes (iOS, Android, Web, Platform, Data). Demonstrates roadmap:isolate.A TextMate grammar lives at grammars/nowline.tmLanguage.json. It works in any editor that supports TextMate grammars (VS Code, Sublime Text, Zed, IntelliJ via third-party plugins, etc.). A first-class LSP server and VS Code extension are tracked in packages/lsp/ and packages/vscode-extension/.
@nowline/core is a pure-TypeScript parser, typed AST, and validator built on Langium. Everything the CLI does on top of parsing is itself built against this library. See packages/core/README.md for the API and a usage example.
Nowline is on v0.x — published to Homebrew, npm, the VS Code Marketplace, Open VSX, and GitHub Releases. The parser, validator, layout, renderer, every export format (SVG, PNG, PDF, HTML, Markdown+Mermaid, XLSX, MS Project XML), and the verbless CLI (--dry-run, --init, --serve) are usable today. Breaking changes may land between 0.x minor versions while the embed surface and IDE expansion settle; full SemVer guarantees kick in at 1.0. The release-by-release roadmap lives in specs/milestones.md.
Bug reports, feature requests, and pull requests are welcome. Start with CONTRIBUTING.md for setup, build/test commands, and the expected workflow. Before opening an issue, please check the templates under .github/ISSUE_TEMPLATE/. Security issues should follow SECURITY.md. All participation is governed by our CODE_OF_CONDUCT.md.
Design specs for the DSL, renderer, CLI, IDE integrations, and OSS milestones live under specs/ — start there to understand how Nowline is shaped before touching code.
Apache 2.0 — see LICENSE.