Thanks for considering a contribution to the XRP Ledger Dev Blog!
This page includes high-level instructions to create a new blog post. Detailed instructions and guidelines to contribute to the XRPL Developer Portal are available in Contribute Documentation.
The source files are located in the blog directory of the public xrpl-dev-portal repository.
The image files used in blog posts are located in the blog/img directory.
The blog posts are grouped by year, so all blog posts published in year 2025 are located in the blog/2025 directory.
To create a new post, follow these steps:
Before you begin, ensure that you pull the most recent updates from the upstream
masterbranch of thexrpl-dev-portalrepository.Create a new branch for the blog post using the format
blog-{short-desc-of-update}.Create a new markdown file in the
blog/{YEAR}folder, for example https://github.com/XRPLF/xrpl-dev-portal/tree/master/blog/2025Refer to the template file
_blog_template.mdto compose your draft blog.Update the
blog/sidebars.yamlfile to include the newly created file.When the draft is ready for review, save and commit your updates.
Create a new PR to merge your changes to master.
We have streamlined the release notes process with the assistance of Claude skills. To create new release notes, follow these steps:
Load the
generate-release-notesskill. Claude should auto-load it when you set the working directory to thexrpl-dev-portalrepository. If not, you can explicitly point to the skill located at.claude/skills/generate-release-notes/SKILL.md.NoteAlthough the skill is optimized for Claude, you can give thisSKILL.mdfile to any coding agent.Run the
generate-release-notesskill./generate-release-notes --from <branch-or-tag> --to <branch-or-tag>The skill accepts these arguments:
Arguments Description --from(required) Base ref. Must match the exact tag or branch the current version of rippledis building from.--to(required) Target ref. Must match the exact tag or branch the upcoming version of rippledwill be built from.--date(optional) Release date in YYYY-MM-DDformat. Defaults to current date.--output(optional) Output file path. Defaults to blog/<year>/rippled-<version>.md.The AI executes these steps:
- Runs a Python script that fetches all commits and PR details between the two refs and outputs a draft blog post.
- Processes all amendment-related changes, keeping, removing, or merging entries based on which amendments are part of the release.
- Sorts remaining entries into subsections (Features, Breaking Changes, Bug Fixes, etc.) based on files touched, PR labels, and descriptions.
- Reformats each entry to match the release notes style and writes a summary of the release.
- Cleans up empty sections and adds the post to the sidebar.
NoteDepending on the size of the release, this process can take upwards of ten minutes.Review the final output.
- Check the descriptions of any entries in Amendments, Features, or Breaking Changes.
- Verify the integrity of the package links and add in the SHA-256 hashes.
- Verify the commit linked in the Install / Upgrade section points to the version bump commit.
- If you didn't pass in the correct release date using the
--dateargument, update thedatefield in the frontmatter.
Create a new PR to merge the release notes to
master.