Skip to content

Contributing to Nibble

Releases

Cutting a Nibble release, writing the changelog a site reads, and the versions code checks.

A release is an annotated tag on main and an archive published beside it on GitHub. There is no stable branch, no backports and no release candidates: the install and upgrade test is the gate, and bin/rails nibble:upgrade finds the newest release itself.

After reading this guide, you will know:

  • How to cut a release, and what the script refuses.
  • How the changelog becomes the notes every control panel shows.
  • Which version numbers code checks, and which are for people.

1. Cutting one

bin/nibble-release 0.15.0

It refuses a malformed or backwards version, a dirty tree, and an empty Unreleased section. Then it bumps Nibble::VERSION, dates the changelog section, runs bin/ci, and only then commits and tags. If bin/ci fails, nothing is committed or tagged.

It then offers to push main and the tag. --push pushes without asking; answering no prints the command to push later:

git push https://github.com/mah3uz/nibble.git main --follow-tags

Once the tag is pushed it packs the release — vendor/nibble as a site receives it, with its VERSION, MANIFEST and lock files — and publishes the archive and its SHA256SUMS as a GitHub release, using gh. If that step fails, pack and publish the tagged release again on its own:

bin/nibble-release 0.15.0 --pack

1.1 The feed

Last, it writes the release feed into nibble.ink’s site/content/changelogs/, runs bin/release-pages to write a page per release, and offers to commit them in site/. A checkout without nibble.ink’s site/ skips this step. Control panels see the release once nibble.ink is deployed.

2. The changelog is the release

CHANGELOG.md records what changed for a site running Nibble, under What's new, Changed, What's fixed and Security. Anything that needs action carries an Upgrade note, and a release whose migrations cannot be undone says so, because the snapshot is then the only way back.

Important

Write entries for someone running a site, not for someone reading the diff: what they will see, and what, if anything, they must do. The same text appears on every control panel’s Updates screen.

2.1 A headline

A release that is a milestone opens with a quote: its headline in bold, then a sentence saying what it means for a site.

## 0.16.0 — 2026-09-24 04:39 +0600

> **Installed and upgraded as one folder.** Nibble lives in `vendor/nibble` and loads as a Rails engine; an upgrade
> replaces that folder and leaves the rest to the site.

### What's new

The feed carries them as headline and summary. The release’s page takes the summary as its description, and nibble.ink’s roadmap puts every release with a headline on the road behind “You are here”. A stop planned for a version moves behind the pin by itself once that version is released. Most releases need no headline.

2.2 The feed

The feed is site/content/changelogs/releases.json in nibble.ink’s site/, generated from the whole changelog, every release included. It is rebuilt each time, so the changelog is the only record — editing an entry after its release still reaches every site. It is served at /api/v1/changelogs, which Nibble::CHANGELOGS_FEED names.

3. Versions

Nibble::VERSION orders releases for people. The contracts — SCHEMA_FORMAT, THEME_API_VERSION and CONTENT_FORMAT_VERSION — are what code checks. Release::MINIMUM_UPGRADE_FROM says how far back an upgrade can start, and the Ruby and Node floors come from .ruby-version and package.json, checked before an upgrade changes anything.

Nibble is 0.x until someone outside installs it; while it is, anything can change between releases.