Releases and stability
The current release is v0.2.8. This page covers what a release contains, what stays stable, how versions are chosen and how to install, upgrade and cut a release.
The dev documentation describes the latest code on main, which may include
unreleased changes. Versioned documentation matches each release exactly.
#Is Cicadel ready to use?
Yes, for building applications. v0.2.8 contains the core of a web framework. Each part below is documented and tested against real PostgreSQL in freshly generated projects:
- projects, apps, typed settings, management commands, system checks and a rebuilding development server;
- routing with named URLs and reversal, request/response helpers and middleware;
- HTML error pages and panic recovery, per-route request body limits and login redirects that return users to the page they asked for;
- GORM models with recorded, reviewable PostgreSQL migrations and typed queries;
- typed
.templcomponents, Tailwind CSS and htmx, with inline SVG, icons, typed styles, external scripts, data islands, allow-listed embeds and URL reversal inside components; - forms, model forms, formsets and bounded file uploads;
- accounts: login, logout, password change and reset, groups and permissions, sessions and CSRF protection;
- pagination and flash messages;
- security headers, HSTS, HTTPS redirect and trusted-proxy handling;
- signed, expiring tokens with secret-key rotation;
- transactions with post-commit hooks;
- static files with hashed URLs, email, logging and application test helpers;
- installable packages for your own and third-party apps, with typed per-package settings and typed events.
Every item in the readiness checklist is released as of v0.2.4. Next is the v0.3 milestone: package-system completion, module extraction and a wider PostgreSQL migration subset.
Not in the core, and not needed to build an application: an administration interface, cache and task backends beyond the included ones, sitemaps and managed redirects. They are planned as packages after the core.
Good to know
Cicadel has not had an outside security audit. The owners decided not to make one a release requirement. Automated tests cover the security features. If you deploy publicly, review your own application’s threat model.
#Stability guarantee
From v0.1.0, releases follow semantic versioning.
The root module and the four core modules release together with the same version:
contrib/accounts, contrib/formsets, contrib/migrations and contrib/querygen.
Use the same version for all of them.
| Release | What it may contain |
|---|---|
Patch (v0.2.1, v0.2.2 …) | Fixes and backward-compatible additions. Never breaks the stable surface. Upgrade with go get github.com/fauzaanu/cicadel@v0.2.x and the matching core module versions. |
Minor (v0.3.0 …) | A completed milestone (see the versioning standard). Before v1.0, it may also change the stable surface when necessary. |
| v1.0 and later | No breaking changes within a major version. |
When a minor release changes the stable surface:
- the changelog lists the change under Breaking changes, with exact upgrade steps;
- where practical, the old API keeps working for one more minor release, marked
// Deprecated:with its replacement.
#The stable surface
- exported Go APIs of the packages listed in the API index;
- the layout generated by
startproject,startappandstartpackage; manage.goandcicadelcommand names, flags and exit codes;settings.Settingsfields andCICADEL_*/DATABASE_URLenvironment variables;- the installable-app contract (
cicadel.App,Manifest,AppAPIVersion).
#Your data is always protected
- Recorded migrations and migration history written by any release keep working with every later release.
- Cicadel never requires you to edit an applied migration.
- Framework-owned tables (accounts and sessions) change only through new recorded migrations. Never through automatic or destructive schema changes.
#Not covered
- anything under
internal/; - unexported behavior;
- the exact HTML and CSS of starter and account pages;
- error message wording;
- performance characteristics.
Security fixes may change behavior that was itself insecure. The changelog calls out such changes.
#Versioning standard
Version numbers track milestones, not individual features. v1.0 arrives only when Cicadel is a complete framework.
#Choosing the next version
| Change | Release |
|---|---|
| Bug or security fix | next patch |
| New package, API, setting or command that existing code does not notice | next patch |
| New secure default that existing projects must opt into (generated projects get it) | next patch |
| Changed default behavior, removed or changed API, changed generated layout | waits for the next minor |
| Last item of the current milestone | next minor |
Rules:
- Bump the minor version only when the current milestone is complete. Never bump it for a single feature. Never release more than one minor per milestone.
- Work that would break existing applications waits for the milestone’s minor release. Until then, ship it behind a setting or as a new API, and deprecate the old one.
- Release patches as often as finished work allows. Documentation-only or test-only changes do not need a patch.
#Milestones
| Version | Milestone | Scope |
|---|---|---|
| v0.1 | Core framework | Released. |
| v0.2 | Core completeness | Released (v0.2.0–v0.2.4): pagination and flash messages, security headers and HTTPS policy, signed tokens, post-commit hooks and per-package settings. |
| v0.3 | Packages and migrations | Package-system completion, module extraction and the wider migration operation subset. In progress as v0.2.x patches: typed events (v0.2.5) and accounts events (v0.2.6). v0.2.7 adds browser request handling: error pages, login redirects, per-route body limits and htmx response helpers. v0.2.8 adds component escape hatches (inline SVG, icons, typed styles, scripts, data islands, embeds) and URL reversal in components. |
| v0.4 … v0.x | Django-parity batteries | One milestone each, in order: administration; cache and task backends; internationalization and time zones; sitemaps, syndication and managed redirects; anything else needed to match Django’s included batteries. |
| v1.0 | Complete and stable | See the criteria below. |
#v1.0 criteria
All of these must hold:
- Every milestone above is released, giving Cicadel the capabilities of Django’s included batteries for PostgreSQL applications, or more.
- Every exported API in the API index is documented and tested, and every capability has a tutorial or guide.
- The owners have built and run real applications on the framework.
- One full minor release cycle has passed with no breaking changes.
#Install a release
go run github.com/fauzaanu/cicadel/cmd/cicadel@v0.2.8 startproject myapp example.com/myappGood to know
The repository is private. Set GOPRIVATE=github.com/fauzaanu/cicadel and
configure Git credentials with access first.
The generated go.mod pins the framework and core modules at the CLI’s release.
#Upgrade an application
Move all five modules to the new version together:
v=v0.2.8
go get github.com/fauzaanu/cicadel@$v \
github.com/fauzaanu/cicadel/contrib/accounts@$v \
github.com/fauzaanu/cicadel/contrib/formsets@$v \
github.com/fauzaanu/cicadel/contrib/migrations@$v \
github.com/fauzaanu/cicadel/contrib/querygen@$v
go mod tidy
go run manage.go migrate plan- Read the changelog entry first.
- Apply any listed upgrade steps.
- Run
go run manage.go migrateand your tests.
#Release procedure
Maintainers and agents release completed work this way:
- Pick the version with the versioning standard.
Move the changelog’s Unreleased entries under
## vX.Y.Z — YYYY-MM-DD, with a Breaking changes list when the stable surface changed. - Set
defaultModuleVersionininternal/scaffold/scaffold.gotovX.Y.Z, and update the current release named on this page. - Run every local CI check, push, and wait for the GitHub workflows to pass.
- Tag the pushed commit for every module and push the tags:
vX.Y.Z,contrib/accounts/vX.Y.Z,contrib/formsets/vX.Y.Z,contrib/migrations/vX.Y.Zandcontrib/querygen/vX.Y.Z. - Run the Draft release workflow with the tag. It re-runs every verification
workflow, builds CLI archives with checksums and creates a draft. Publish it with
gh release edit vX.Y.Z --draft=false. - Verify a fresh project from the tag with
GOWORK=offand noreplacedirectives:startproject,go mod tidy,go test ./...andgo run manage.go check. - Freeze the documentation for the release with
python3 website/scripts/add-version.py vX.Y.Z. In the same commit, move the core modules’ requirements on each other tovX.Y.Z(GOWORK=off go getin each module, thengo mod tidy), so every module builds on its own withGOWORK=off. Commit and push.
Warning
If step 6 fails, fix it and release the next patch version. Never move a published tag.
#Core and contrib release order
A contrib module can only import core APIs that exist in the core version its
go.mod requires. The accounts and formsets checks type-check against that pin.
When a module needs a new core package or API:
- Release the core change first.
- Adopt it in the module after the freeze commit has moved the pin.
- Release that as the next patch.
For example, v0.2.5 added events and v0.2.6 made accounts emit them.
#Requirements
- Go 1.26.11 or later in the 1.26 series.
- PostgreSQL 18.
- The CLI and application on the same framework revision. Commit
go.modandgo.sum.
Check the framework version your application uses:
go list -m github.com/fauzaanu/cicadelStart with the application tutorial. Then use the topic guides for the current model, component, form and account workflows.
#Core module composition
The root Go workspace includes the first-party modules for checkout development.
- The distributable framework pins the migration and query-generation module versions. New projects pin accounts and formsets as well.
- Before updating those pins, run integration checks in every module. Then verify
a generated project with
GOWORK=offand no local replacements. - The repository is currently private. Authorized consumers need Git credentials
and
GOPRIVATE=github.com/fauzaanu/cicadel. CI uses its repository-scoped token through the Git credential helper.
#Release workflow details
The Draft release workflow runs only when invoked manually.
- Before it builds CLI archives, these suites must pass: root CI, accounts, formsets, migration/query-generation installables and documentation verification. A failure in any suite prevents artifact creation.
- Documentation verification in this workflow does not publish the website.
- Select the workflow revision that matches the existing semantic-version tag. The build job checks that the tag resolves to the same commit the reusable workflows checked. Only then does it compile Linux/macOS amd64/arm64 binaries and checksums.
- A tag pointing elsewhere fails closed. Rerun against the correct revision.
- A draft is not a publication. Publish the draft as described in the release procedure.