Human-Curated Release Notes Manager & Multi-Format Publisher
- The Problem
- The Solution
- Quick Start
- Commands Reference
- Entry Categories
- Export Formats
- Multi-Project Support
- Python API
- Real-World Examples
- Integration with Team Brain
- How It Works
- Troubleshooting
- Contributing
- License
- Credits
Shipping software is exciting. Writing release notes is... not.
Every release you face the same pain:
- Inconsistency: Every version looks different — different tone, different structure
- Multi-platform torture: Discord wants emoji-heavy markdown, your blog wants HTML, customers want email — same content, 3 manual rewrites
- Git history != User news: Auto-generated changelogs from commits are for developers, not users
- Version amnesia: "What did we change in v1.3.2?" requires digging through git logs
- Blank page paralysis: Starting release notes from scratch every time wastes 20-30 minutes
Result: Release communication is neglected, inconsistent, or skipped entirely.
PatchNotes gives you a simple, structured system:
- Create a draft for your next version
- Add entries as you build (never forget a feature again)
- Publish when ready
- Export to any format with one command
# 30-second complete release notes workflow
patchnotes new v1.5.0 "Spring Update"
patchnotes add new "Added dark mode"
patchnotes add fixed "Fixed crash on Windows 11"
patchnotes add performance "Startup is 40% faster"
patchnotes publish
patchnotes export v1.5.0 --format discordThat's it. One place, all formats, consistent forever.
Both are Team Brain tools. They solve different problems:
| Feature | PatchNotes | ChangeLog |
|---|---|---|
| Source | Human-written | Auto-generated from git |
| Audience | End users | Developers |
| Tone | Friendly, narrative | Technical |
| Format output | 6 formats (Discord, HTML, email...) | Markdown changelog |
| Git required? | No | Yes |
| Best for | Product releases | Developer changelog |
Use both — they complement each other perfectly.
# Option 1: Clone and use directly
git clone https://github.com/DonkRonk17/PatchNotes.git
cd PatchNotes
python patchnotes.py --help
# Option 2: Add to PATH (Windows)
# Add PatchNotes directory to your PATH environment variable
# Then run: patchnotes --help
# Option 3: pip install (local)
pip install -e .
patchnotes --helpRequirements: Python 3.7+ | Zero external dependencies
# Step 1: Create a draft for your next version
patchnotes new v1.0.0 "First Public Release"
# [OK] Draft created: v1.0.0 - First Public Release
# Step 2: Add entries as you build
patchnotes add new "Complete project scaffolding system"
patchnotes add new "Supports Python, Node.js, and Rust templates"
patchnotes add new "Zero external dependencies"
# Step 3: Check your draft
patchnotes list
# Draft: v1.0.0 - First Public Release
# [NEW] New
# - Complete project scaffolding system
# - Supports Python, Node.js, and Rust templates
# - Zero external dependencies
# Step 4: Publish when ready
patchnotes publish
# [OK] Published: v1.0.0 - First Public Release (3 entries)
# Step 5: Export for your announcement
patchnotes export v1.0.0 --format discordThat's it! Your release notes are now managed, structured, and ready for any platform.
patchnotes new <version> [title]
patchnotes new v2.0.0
patchnotes new v2.0.0 "Major Overhaul"
patchnotes new v2.0.0-beta "Beta Preview"
patchnotes new v2.0.0 --project myappCreates a new draft release. Only one draft per project at a time.
Supported version formats:
v1.2.3— standard semantic version1.2.3— without v prefix (normalized to v1.2.3)v2.0.0-beta— pre-release identifiersv1.0.0-alpha.1— dotted pre-releasev1.2— major.minor only
patchnotes add <category> <text>
patchnotes add new "Added user authentication"
patchnotes add fixed "Fixed database timeout on large queries"
patchnotes add changed "Login flow now uses email instead of username"
patchnotes add security "Patched SQL injection vulnerability"
patchnotes add performance "Dashboard loads 60% faster"
patchnotes add coming "Mobile app coming in v2.0"Category accepts aliases (new/add/added, fix/fixed/bug, change/changed, etc.)
patchnotes list # Show current draft
patchnotes list v1.5.0 # Show specific published version
patchnotes list --project myappDisplays entries grouped by category with entry IDs.
patchnotes delete abc123 # Delete by entry ID (6 chars shown in list)
patchnotes delete abc1 # Prefix match also worksIDs are shown when you run patchnotes list.
patchnotes publish
patchnotes publish --project myappFinalizes the draft as a published release. The draft is cleared. Once published, a release is immutable.
patchnotes discard --yes
patchnotes discard --project myapp --yesPermanently deletes the current draft. Requires --yes to prevent accidents.
patchnotes export # Export current draft (markdown)
patchnotes export v1.5.0 # Export published version
patchnotes export v1.5.0 --format discord # Discord format
patchnotes export v1.5.0 --format html # HTML format
patchnotes export v1.5.0 --format email # Email format
patchnotes export v1.5.0 --format text # Plain text
patchnotes export v1.5.0 --format json # Raw JSON
patchnotes export v1.5.0 -f discord -o discord_post.txt # Save to fileAvailable formats: markdown (default), html, discord, email, text, json
patchnotes history
patchnotes history --limit 5 # Show last 5 releases
patchnotes history -n 3 --project myappLists published releases, newest first.
patchnotes status
patchnotes status --project myappShows draft state, published count, and latest version.
patchnotes projectsLists all projects with release notes.
patchnotes categoriesShows all valid entry categories and their accepted aliases.
patchnotes formatsShows all valid export formats and their descriptions.
PatchNotes uses 8 categories that cover any type of release change:
| Category | Icon | Aliases | Use for |
|---|---|---|---|
New |
[NEW] |
new, add, added | New features, additions |
Fixed |
[FIX] |
fix, fixed, bug, bugfix | Bug fixes, crash fixes |
Changed |
[CHG] |
change, changed, update | Behavior changes, updates |
Removed |
[REM] |
remove, removed, delete | Removed features |
Security |
[SEC] |
security, sec | Security patches, CVEs |
Performance |
[PRF] |
perf, performance, speed | Speed, memory improvements |
Known Issues |
[KNW] |
known, issues, issue | Documented problems not yet fixed |
Coming Soon |
[COM] |
coming, next, planned | Sneak peeks at next version |
Category order is preserved in all exports. New features always appear before fixes, fixes before changes, etc.
Standard GitHub-flavored markdown. Perfect for GitHub Releases, pull requests, documentation.
## v1.5.0 - Spring Update
*March 12, 2026*
### New
- Added dark mode
### Fixed
- Fixed crash on Windows 11Self-contained HTML article element. Drop into any webpage, email HTML template, or documentation system.
<article class="patch-notes">
<h2>v1.5.0 - Spring Update</h2>
<p class="date">March 12, 2026</p>
<section class="category">
<h3>New</h3>
<ul>
<li>Added dark mode</li>
</ul>
</section>
</article>Note: All user content is HTML-escaped for XSS safety.
Discord-formatted with emoji category headers. Copy-paste directly into your announcements channel.
**v1.5.0 - Spring Update**
March 12, 2026
:sparkles: **New**
- Added dark mode
:wrench: **Fixed**
- Fixed crash on Windows 11
Discord emoji per category:
- New:
:sparkles:| Fixed::wrench:| Changed::arrows_counterclockwise: - Removed:
:wastebasket:| Security::shield:| Performance::zap: - Known Issues:
:warning:| Coming Soon::crystal_ball:
Plain-text email body with Subject line. Copy into any email client.
Subject: Release Notes: v1.5.0 - Spring Update
What's new in v1.5.0 (March 12, 2026):
NEW:
* Added dark mode
FIXED:
* Fixed crash on Windows 11
ASCII-art formatted plain text. Works in any terminal, notepad, or cat output.
v1.5.0 - Spring Update
Released: March 12, 2026
=============================
[NEW] New
- Added dark mode
[FIX] Fixed
- Fixed crash on Windows 11
Raw JSON of the release record. Use for custom integrations, APIs, or further processing.
{
"version": "v1.5.0",
"title": "Spring Update",
"status": "published",
"entries": [...]
}Manage release notes for multiple projects on the same machine:
# Project: beacon-hq
patchnotes new v3.0.0 "BCH Update" --project beacon-hq
patchnotes add new "Real-time sync improvements" --project beacon-hq
# Project: atlas-tools
patchnotes new v1.0.0 "Initial Release" --project atlas-tools
patchnotes add new "Zero dependencies" --project atlas-tools
# View all projects
patchnotes projects
# Projects (2):
# - atlas-tools
# - beacon-hq
# Each project is fully isolated
patchnotes status --project beacon-hq
patchnotes history --project atlas-toolsStorage: Each project gets its own ~/.patchnotes/<project>.json file.
Use PatchNotes directly in Python scripts:
from patchnotes import PatchNotes
pn = PatchNotes(project="myapp")
# Create a release
pn.new_release("v2.0.0", "Major Update")
# Add entries
pn.add_entry("new", "Complete redesign of the dashboard")
pn.add_entry("fixed", "Fixed memory leak in data pipeline")
pn.add_entry("security", "Patched authentication bypass")
# Check status
s = pn.status()
print(f"Draft: {s['draft']['version']} with {s['draft']['entries']} entries")
# Publish
released = pn.publish()
print(f"Published: {released['version']}")
# Export all formats
for fmt in ["markdown", "html", "discord", "email", "text", "json"]:
output = pn.export("v2.0.0", fmt=fmt)
with open(f"release-{fmt}.txt", "w") as f:
f.write(output)
# View history
for r in pn.history(limit=5):
print(f" {r['version']} - {r.get('title', '')} ({len(r['entries'])} entries)")class PatchNotes:
def __init__(self, project: str = "default", data_dir: Path = None)
# Release management
def new_release(self, version: str, title: str = "") -> dict
def add_entry(self, category: str, text: str) -> dict
def delete_entry(self, entry_id: str) -> bool
def publish(self) -> dict
def discard_draft(self) -> bool
# Queries
def get_draft(self) -> dict | None
def get_release(self, version: str) -> dict | None
def list_entries(self, version: str = None) -> list
def history(self, limit: int = 10) -> list
def status(self) -> dict
def export(self, version: str = None, fmt: str = "markdown") -> str
def list_projects(self) -> list
# Utility functions
def validate_version(version: str) -> bool
def validate_category(category: str) -> boolpatchnotes new v0.8.3 "Patch 8.3 - Balance Update" --project mygame
patchnotes add fixed "Fixed soft-lock in dungeon boss fight"
patchnotes add fixed "Corrected damage calculation for fire spells"
patchnotes add changed "Reduced mana cost for healing spells by 15%"
patchnotes add performance "Improved loading times in city area"
patchnotes add coming "New dungeon biome coming in v0.9"
patchnotes publish
patchnotes export v0.8.3 --format discordpatchnotes new v3.1.0 "March Release" --project saas-platform
patchnotes add new "Multi-tenant SSO support"
patchnotes add new "Bulk CSV export for reports"
patchnotes add fixed "Fixed timezone bug in scheduler"
patchnotes add security "Updated OAuth library to patch CVE-2026-1234"
patchnotes add performance "API response time reduced by 40%"
patchnotes publish
patchnotes export v3.1.0 --format markdown -o RELEASE_NOTES.mdpatchnotes new v2.0.0 "2.0 - Breaking Changes" --project mylib
patchnotes add changed "Renamed MyClass to BetterClass (breaking)"
patchnotes add removed "Removed deprecated process_old() method"
patchnotes add new "Added async support"
patchnotes add new "Python 3.12 compatibility"
patchnotes add security "Removed eval() usage from config parser"
patchnotes publish
patchnotes export v2.0.0patchnotes add new "Completed user profile page" --project sprint-42
patchnotes add fixed "Fixed the weird pagination bug"
patchnotes add changed "Moved deploy to Friday EOD"
patchnotes export --format text # Quick text summary for standup# ATLAS logs tool builds as patch notes
patchnotes new v1.0.0 "PatchNotes - Initial Build" --project atlas-session
patchnotes add new "Core release management (new/add/publish/export)"
patchnotes add new "6 export formats: markdown/html/discord/email/text/json"
patchnotes add new "8 entry categories with alias support"
patchnotes add new "Multi-project support"
patchnotes add new "45 tests at 100% pass rate"
patchnotes publish --project atlas-session
patchnotes export v1.0.0 --format text --project atlas-sessionimport subprocess
from patchnotes import PatchNotes
# Get release notes after build
pn = PatchNotes(project="beacon-hq")
notes = pn.export("v3.0.0", fmt="text")
# Post to Synapse
subprocess.run([
"python", "D:/BEACON_HQ/PROJECTS/AutoProjects/SynapseLink/synapselink.py",
"--to", "FORGE,CLIO", "--subject", "BCH v3.0.0 Released",
"--body", notes
])After a successful build, BCH can auto-export Discord release notes:
from patchnotes import PatchNotes
pn = PatchNotes(project="bch")
discord_notes = pn.export(fmt="discord")
# Post to Discord webhook
# (integrate with BCH's existing webhook system)from configmanager import ConfigManager
from patchnotes import PatchNotes
config = ConfigManager()
default_project = config.get("patchnotes.default_project", "default")
default_format = config.get("patchnotes.default_format", "markdown")
pn = PatchNotes(project=default_project)
output = pn.export(fmt=default_format)from memorybridge import MemoryBridge
from patchnotes import PatchNotes
pn = PatchNotes(project="myapp")
history = pn.history(limit=20)
bridge = MemoryBridge()
bridge.set("myapp_release_history", history)
bridge.sync()User Input (CLI)
|
v
Argument Parser (argparse)
|
v
Command Function (cmd_new, cmd_add, etc.)
|
v
PatchNotes Core Class
|
+-> StorageManager (load/save ~/../patchnotes/project.json)
|
+-> ExportEngine (markdown/html/discord/email/text/json)
|
v
Output (stdout or file)
All data is stored in ~/.patchnotes/ as JSON files:
default.json— default projectmyapp.json— "myapp" projectmyapp.backup.json— last-known-good backup
The atomic write pattern prevents corruption:
- Write to
project.tmp - Copy current
project.jsontoproject.backup.json - Replace
project.jsonwithproject.tmp
All versions are normalized to v-prefix form:
1.2.3→v1.2.3v1.2.3→v1.2.32.0.0-beta→v2.0.0-beta
Categories are processed in canonical order (New → Fixed → Changed → Removed → Security → Performance → Known Issues → Coming Soon) in all export formats. This ensures consistent presentation regardless of entry order.
You can only have one draft at a time. Options:
patchnotes status # Check what version is in draft
patchnotes publish # If it's ready, publish it
patchnotes discard --yes # If you want to abandon itpatchnotes history # Check if it was accidentally published
# If you need to fix it, manually edit ~/.patchnotes/project.json
# (Version is immutable once published by design)PatchNotes uses semantic versioning:
# Valid
patchnotes new v1.2.3
patchnotes new 2.0.0
patchnotes new v1.0.0-beta
# Invalid
patchnotes new "version 1"
patchnotes new v1
patchnotes new "1.2.3.4.5"Check that you added entries before publishing:
patchnotes list # Should show entries
patchnotes add new "At least one entry is good practice"
patchnotes publishAll data is stored in ~/.patchnotes/:
- Windows:
C:\Users\<username>\.patchnotes\ - Linux/macOS:
/home/<username>/.patchnotes/or~/.patchnotes/
To use a custom directory, use the Python API:
from patchnotes import PatchNotes
from pathlib import Path
pn = PatchNotes(project="myapp", data_dir=Path("/custom/path"))PatchNotes handles Windows encoding automatically. If you see encoding errors, ensure you're using Python 3.7+.
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-format) - Write tests for new functionality
- Ensure all tests pass:
python test_patchnotes.py - Submit a pull request
Code standards:
- Zero external dependencies (stdlib only)
- Type hints for all public functions
- Docstrings for all public functions/classes
- No Unicode emojis in Python code (ASCII only:
[OK],[X],[!]) - 100% test pass rate required
MIT License — see LICENSE for details.
Built by: ATLAS (Team Brain) For: Logan Smith / Metaphy LLC Tool #: 101 in the AutoProjects collection Why Built: Every project needs release notes. Every release needs multiple formats. One tool to rule them all. Part of: Beacon HQ / Team Brain Ecosystem Date: March 12, 2026
Team Brain Ecosystem:
- FORGE - Orchestrator / Reviewer
- ATLAS - Implementation Lead (this tool)
- CLIO - CLI Agent, Trophy Keeper
- NEXUS - VS Code Architect
- BOLT - Free Executor
Philosophy: "Build something extremely useful, that is easy to use, solves a common problem, and has clear instructions on how to implement, install and use."
One World. One Family. One Love.
PatchNotes v1.0.0 — Quality Score: 100/100 — 45 tests passing