Welcome! This guide will walk you through installing AdrPlus and creating your first Architecture Decision Record (ADR).
- Prerequisites
- Installation
- Initial Configuration
- Initialize Your Repository
- Create Your First ADR
- Approve Your ADR
- Explore Additional Commands
- Troubleshooting
Before you begin, ensure you have:
-
.NET 8 Runtime or later installed on your system
- Download from: https://dotnet.microsoft.com/download/dotnet
- Verify installation:
dotnet --version
-
Git repository initialized in your project folder (optional, but recommended)
- If not yet initialized:
git init
- If not yet initialized:
-
A terminal/command prompt ready to use (PowerShell, Command Prompt, Bash, etc.)
This is the easiest way to get started:
dotnet tool install -g adrplusIf you prefer to build from the repository:
# Clone the repository
git clone https://github.com/FRACerqueira/AdrPlus.git
cd AdrPlus
# Build and package
dotnet restore
dotnet build -c Release
dotnet pack -c Release -o ./nupkg
# Install from local package
dotnet tool install -g adrplus --add-source ./nupkgConfirm the installation was successful:
adrplus helpYou should see the help menu with available commands.
AdrPlus automates the initial setup on first run!
When you execute any AdrPlus command for the first time (except help), an interactive wizard will automatically guide you through the setup process. This ensures your application and repository are configured correctly before you start using the tool.
The first time you run an AdrPlus command, the setup wizard will automatically:
- Select your preferred language (
en-US,pt-BR, or other) - Configure your editor (VS Code, Visual Studio, Rider, or custom command)
- Set your ADR repository folder (default:
doc/adr) - Configure ADR naming conventions (prefix, numbering, versioning, case style)
- Configure migration pattern
- Create the configuration files:
adrplus.json(application settings)adr-config.adrplus(repository settings)
Example - Just run any command:
# Just run without command and the first-time setup will run
adrplus
# Or any other command - the first-time wizard will run before it executes
adrplus init --wizardAfter the initial setup completes:
- Your configuration files are created
- You're ready to create, manage, and approve ADRs
- You can use the wizard (
--wizard) with commands for guided operations, or run commands directly with arguments
If you need to adjust your settings after the initial setup, you can reconfigure at any time:
# Edit application settings (language, editor preferences)
adrplus config --application
# Edit repository settings (ADR naming, structure, status labels)
adrplus config --repository
# Edit migration patterns (for migrating existing ADRs)
adrplus config --migrate
# Edit the default ADR template
adrplus config --templateIf you prefer to configure manually instead of using the automatic wizard:
adrplus config --applicationThis creates/edits adrplus.json with:
- language: UI language for prompts and messages (
en-US,pt-BR, etc.) - comandopenadr: Command to open files after creation (e.g.,
code {0}for VS Code) - withoutargs: Behavior when no arguments are provided (
Help,Wizard, orNone)
Example adrplus.json:
{
"language": "en-US",
"comandopenadr": "code {0}",
"withoutargs": "Help"
}adrplus config --repositoryThis creates/edits adr-config.adrplus with ADR naming conventions.
For a simple repository (recommended for beginners):
{
"folderadr": "doc/adr",
"migrationpattern": "...",
"template": "...",
"prefix": "ADR",
"lenseq": 4,
"lenversion": 2,
"lenrevision": 0,
"lenscope": 0,
"separator": "-",
"casetransform": "PascalCase",
"statusnew": "Proposed",
"statusacc": "Accepted",
"statusrej": "Rejected",
"statussup": "Superseded",
"scopes": "",
"folderbyscope": false,
"skipdomain": "",
"headerdisclaimer": "Do not remove this comment, lines and table",
"headertitlefile": "ADR",
"headerversion": "Version",
"headerrevision": "Revision",
"headerscope": "Scope",
"headerdomain": "Domain",
"headertitlestatuscreated": "Created",
"headertitlestatuschanged": "Changed",
"headertitlestatussuperseded": "Superseded",
"headertablefields": "Fields",
"headertablevalues": "Values",
"headermigrated": "Migrated"
}Configuration keys (relevant) explained:
| Key | Meaning | Example |
|---|---|---|
folderadr |
Folder where ADR files are stored. | doc/adr |
migrationpattern |
Pattern used for migrating ADR files (generated by the tool). | N/A (auto-generated) |
template |
Base Markdown template used when creating new ADR files (generated by the tool). | N/A (auto-generated) |
prefix |
Prefix for ADR identifiers | ADR → ADR0001 |
lenseq |
Digits for sequential number | 4 → 0001, 0002, etc. |
lenversion |
Digits for major version (0 disables) | 2 → V01, V02, etc. |
lenrevision |
Digits for revision (0 = disabled) | 0 (disabled) or 2 → R01, R02 |
lenscope |
Number of characters for scope abbreviation (0 disables) | 1 → B, F, etc. |
separator |
Character between name parts | -, _, or . |
casetransform |
Case style for names | PascalCase, CamelCase, SnakeCase, KebabCase |
scopes |
Semicolon-separated list of allowed scopes | Backend;Frontend;Data |
folderbyscope |
Create separate folders per scope | true or false |
skipdomain |
Scopes that skip domain in filenames | data;platform |
statusnew |
Label for new ADRs | Proposed |
statusacc |
Label for approved ADRs | Accepted |
statusrej |
Label for rejected ADRs | Rejected |
statussup |
Label for superseded ADRs | Superseded |
headerdisclaimer |
Disclaimer text in ADR header | N/A (template metadata) |
headertitlefile |
Header label for ADR file name | ADR |
headerscope |
Header label for scope field | Scope |
headerdomain |
Header label for domain field | Domain |
headertitlestatuscreated |
Header label for "Created" status | Created |
headertitlestatuschanged |
Header label for "Changed" status | Changed |
headertitlestatussuperseded |
Header label for "Superseded" status | Superseded |
headertablefields |
Table header for field names | Field |
headertablevalues |
Table header for field values | Value |
headermigrated |
Header label for "Migrated" indicator | Migrated |
Before initializing your repository, let's understand some important concepts:
-
Scopes: Define organizational boundaries for your ADRs (e.g., "backend", "frontend", "data"). When enabled (
lenscope > 0), scopes help organize decisions by domain or team responsibility. -
Folder by Scope: When
folderbyscopeistrue, ADRs are organized into separate folders for each scope. Whenfalse, all ADRs stay in a flat structure under thefolderadrfolder. -
Skip Domain: Some scopes may not need a domain segment in the filename. For example, a "data" scope might skip the domain to keep filenames shorter. List multiple scopes separated by semicolons.
-
Case Transform: The style applied to the title portion of generated filenames:
PascalCase:UsePostgreSQLAsDatabaseCamelCase:usePostgreSQLAsDatabaseSnakeCase:use_postgresql_as_databaseKebabCase:use-postgresql-as-database
-
Separator: The character separating different parts of the filename:
-(hyphen): Recommended, most readable_(underscore): Alternative style.(period): Alternative style
-
Version vs. Revision:
- Version: A major change to an ADR (e.g.,
V01,V02) that represents a significant decision update. - Revision: A minor change to an ADR (e.g.,
R01,R02) that represents clarifications or documentation improvements.
- Version: A major change to an ADR (e.g.,
If your repository already contains ADR files in a different format than the one you just configured, you MUST execute the migration process before creating your first ADR with AdrPlus.
Why?
- Migration transforms existing ADRs into the AdrPlus format
- This must be done before creating any new ADRs with the tool
- Mixing manually-created ADRs in different formats with tool-created ADRs will cause inconsistencies
To migrate existing ADRs:
-
Run the migration configuration:
adrplus config --migrate
-
Execute the init or update process using one of these methods:
-
Interactive wizard (recommended):
adrplus init --wizard
-
Direct path:
adrplus init --path "./path/to/existing/adrs" --file "./path/to/config"
-
This process:
- Creates the folder specified in
folderadr(e.g.,doc/adr) - Creates the
adr-config.adrplusconfiguration file in the repository root - Prepares your repository for ADR management
- Creates the folder specified in
-
What gets created:
your-project/ ├── doc/ │ └── adr/ # ADR storage folder └── adr-config.adrplus # Repository configuration
-
Execute the migration process using one of these methods:
- Interactive wizard (recommended):
adrplus migrate --wizard
- Direct path:
adrplus migrate --path "./path/to/existing/adrs"
- Interactive wizard (recommended):
-
For detailed migration instructions, see: Migration Guide
After migration is complete, proceed with the repository initialization below.
Now you're ready to create your first ADR!
adrplus new --wizardThe wizard will prompt you for:
- Title: A clear, concise decision title
- Example: "Use PostgreSQL as primary database"
- Domain/Scope: Category or module (if enabled)
- Example: "backend", "data", etc.
The tool will then:
- Generate a unique number (e.g.,
0001) - Create the file:
doc/adr/ADR0001V01-UsePostgresqlAsPrimaryDatabase.md - Open the file in your configured editor (if set)
If you prefer to skip prompts:
adrplus new --title "Use PostgreSQL as primary database"AdrPlus automatically creates a Markdown file with a template:
<!-- Do not remove this comment, lines and table (1-12) -->
|Adr-Plus Fields|Values|
|--|--|
|File title|Use PostgreSQL as Primary Database|
|Version|01|
|Revision||
|Scope||
|Domain||
|Created|Proposed (2026-05-06)|
|Changed||
|Superseded||
<!-- Do not remove this comment, lines and table (1-12) -->
---
# [Brief title of the decision]
## Deciders
* Deciders: [list everyone involved in the decision] <!-- optional -->
Technical Story: [description | ticket/issue URL] <!-- optional -->
## Context and Problem Statement
[Describe the context and problem statement, e.g., in free form using two to three sentences. You may want to articulate the problem in form of a question.]
## Decision Drivers <!-- optional -->
* [driver 1, e.g., a force, facing concern, …]
* [driver 2, e.g., a force, facing concern, …]
* … <!-- numbers of drivers can vary -->
## Considered Options
* [option 1]
* [option 2]
* [option 3]
* … <!-- numbers of options can vary -->
## Decision Outcome
Chosen option: "[option 1]", because [justification. e.g., only option, which meets k.o. criterion decision driver | which resolves force force | … | comes out best (see below)].
### Positive Consequences <!-- optional -->
* [e.g., improvement of quality attribute satisfaction, follow-up decisions required, …]
* …
### Negative Consequences <!-- optional -->
* [e.g., compromising quality attribute, follow-up decisions required, …]
* …
## Pros and Cons of the Options <!-- optional -->
### [option 1]
[example | description | pointer to more information | …] <!-- optional -->
* Good, because [argument a]
* Good, because [argument b]
* Bad, because [argument c]
* … <!-- numbers of pros and cons can vary -->
### [option 2]
[example | description | pointer to more information | …] <!-- optional -->
* Good, because [argument a]
* Good, because [argument b]
* Bad, because [argument c]
* … <!-- numbers of pros and cons can vary -->
### [option 3]
[example | description | pointer to more information | …] <!-- optional -->
* Good, because [argument a]
* Good, because [argument b]
* Bad, because [argument c]
* … <!-- numbers of pros and cons can vary -->
## Links <!-- optional -->
* [Link type] [Link to ADR] <!-- example: Refined by [ADR-0005](0005-example.md) -->
* … <!-- numbers of links can vary -->Open the created ADR file and fill in the sections:
- Context: Why was this decision needed? What problem are you solving?
- Decision: What exactly did you decide to do?
- Consequences: What are the impacts, benefits, and risks?
- Alternatives Considered: What other options did you evaluate?
Example completed ADR:
<!-- Do not remove this comment, lines and table (1-12) -->
|Adr-Plus Fields|Values|
|--|--|
|File title|Use PostgreSQL as Primary Database|
|Version|01|
|Revision||
|Scope||
|Domain||
|Created|Proposed (2026-05-06)|
|Changed||
|Superseded||
<!-- Do not remove this comment, lines and table (1-12) -->
---
# Use PostgreSQL as Primary Database
## Context
Our application needs a reliable, scalable relational database. We're evaluating options between PostgreSQL, MySQL, and AWS RDS Aurora.
## Decision
We have decided to use PostgreSQL as our primary database because:
- Excellent stability and performance
- Rich feature set (JSONB, full-text search, extensions)
- Strong community support
- Cost-effective
## Consequences
**Benefits:**
- Robust SQL compliance
- Advanced features for complex queries
- Good scaling options
**Risks:**
- Team needs to acquire PostgreSQL expertise
- Migration from existing database may take time
## Alternatives Considered
- **MySQL**: Simpler, but fewer advanced features
- **AWS RDS Aurora**: Fully managed but higher costOnce you've finished writing your ADR, approve it:
adrplus approve --wizardThe wizard will:
- Show a list of pending ADRs
- Ask you to select which ADR to approve
- Update the status from
ProposedtoAccepted
The approved ADR file will now show:
<!-- Do not remove this comment, lines and table (1-12) -->
|Adr-Plus Fields|Values|
|--|--|
|File title|Use PostgreSQL as Primary Database|
|Version|01|
|Revision||
|Scope||
|Domain||
|Created|Proposed (2026-05-06)|
|Changed|Accepted (2026-05-07)|
|Superseded||
<!-- Do not remove this comment, lines and table (1-12) -->If you know the file path:
adrplus approve --file "./doc/adr/ADR0001V01-UsePostgresqlAsPrimaryDatabase.md"Now that you've created your first ADR, you can explore other features:
Browse and explore all ADR files in your repository with an interactive file viewer:
adrplus explorer --wizardThe Explorer command provides:
- File Browsing: Navigate through all ADR files in your repository with an intuitive interface
- ADR Overview: View key information about each ADR
- Choose which fields to include in your report such as status, version, revision, created date, changed date, and more
- Search and Filter: Easily find and filter ADRs ([F4 key]) by name, status, or other criteria to locate specific decisions
- View Details: Open and inspect ADR content directly from the explorer without switching applications
- Generate Reports: Create customizable reports with selected fields from your ADRs
- Choose which fields to include in your report such as status, version, revision, created date, changed date, and more
- Export reports in Markdown formats for analysis, stakeholder communication, and documentation
- Analyze trends and patterns in your architectural decisions
If you decide an ADR is not suitable:
adrplus reject --wizard
adrplus reject --file "./doc/adr/ADR0002V01-SomeDecision.md"Revert the last status change:
adrplus undo --wizard
adrplus undo --file "./doc/adr/ADR0001V01-UsePostgresqlAsPrimaryDatabase.md"Create a new version when making significant updates:
adrplus version --wizard
adrplus version --file "./doc/adr/ADR0001V01-UsePostgresqlAsPrimaryDatabase.md"Creates: ADR0001V02-UsePostgresqlAsPrimaryDatabase.md
Create a revision for minor updates:
adrplus review --wizard
adrplus review --file "./doc/adr/ADR0001V01-UsePostgresqlAsPrimaryDatabase.md"Creates: ADR0001V01R01-UsePostgresqlAsPrimaryDatabase.md
When a decision is replaced by a new one, supersede it:
adrplus supersede --wizard
adrplus supersede --file "./doc/adr/ADR0001V01-UsePostgresqlAsPrimaryDatabase.md"This creates a new ADR (e.g., ADR0002) and marks the old one as Superseded.
./doc/adr/ADR0002V01-UsePostgresqlAsPrimaryDatabase--0001.md"For detailed help on any command:
adrplus help <command>Examples:
adrplus help new
adrplus help approve
adrplus help supersedeProblem: You're trying to enable revisions when they're already enabled.
Solution:
- This is a protection mechanism. If you need to change revision format, you must manually edit
adr-config.adrplus - Or start fresh with a new repository
Problem: You're trying to add scopes when they're already configured.
Solution:
- Scopes can only be set once. To change scopes, manually edit
adr-config.adrplus - Or initialize a new ADR repository with the desired scopes
Problem: You specified a version digit count that's not greater than the current setting.
Solution:
- Example: If current is
2, you can only upgrade to2or3 - To downgrade, manually edit
adr-config.adrplus
After upgrading, always commit your updated configuration:
git add adr-config.adrplus
git commit -m "chore: upgrade ADR repository settings - add scope support"Solution:
- Ensure .NET 8+ is installed:
dotnet --version - Verify installation:
dotnet tool list -g - Reinstall if needed:
dotnet tool uninstall -g adrplus && dotnet tool install -g adrplus
Solution:
- Make sure you've run
adrplus init - Check that
folderrepopath in configuration is correct - Verify folder permissions
Solution:
- Run
adrplus config --repositoryto create the configuration - Ensure you're in the correct repository directory
- Check that
adr-config.adrplusexists in the project root
Solution:
- AdrPlus uses
PascalCaseby default for file naming - Simplify your title to use only letters and numbers
- Example: Instead of "Use PostgreSQL + Redis", use "Use PostgreSQL and Redis"
Solution:
- Check if an ADR with the same number already exists
- Use a different title or let AdrPlus auto-increment the number
- Run
adrplus newwithout--titleto use the wizard
Congratulations! You've successfully:
- ✅ Installed AdrPlus
- ✅ Configured your repository
- ✅ Created your first ADR
- ✅ Approved your ADR
- ✅ Learned how to upgrade your repository settings
- Create more ADRs for other important architectural decisions
- Commit to version control:
git add doc/adr && git commit -m "docs: Add initial ADRs" - Plan for growth: Review the Upgrade Settings section to see if scopes would help organize your ADRs
- Share with your team: Make ADRs part of your project documentation
- Review regularly: Keep ADRs updated as your architecture evolves
- Check the FAQ: See FAQ.md for common questions
- AdrPlus Repository: https://github.com/FRACerqueira/AdrPlus
- ADR Concept: https://adr.github.io/
- NuGet Package: https://www.nuget.org/packages/AdrPlus
- Open an issue on GitHub: https://github.com/FRACerqueira/AdrPlus/issues
- Check existing documentation in the README
- Review the FAQ for quick answers
Happy documenting! 🚀