This guide covers the release workflow for the AllSource monorepo.
make release # Full interactive release workflow
make release-quick # Quick patch release (skip quality gates)
make release-preflight # Run pre-flight checks only
make version # Show current version and recent tags
make images-check # Check Docker image versions in GHCRBefore creating a release, ensure you have:
- Clean working tree: No uncommitted changes
- GitHub CLI authenticated: Run
gh auth loginif needed - On main branch: Releases should be created from main
- Remote accessible: Can push to origin
The make release-preflight command checks all of these.
make releaseThe workflow automatically verifies:
- No uncommitted changes
- On main branch (or prompts for confirmation)
- Git remote is accessible
- GitHub CLI is authenticated
You'll be prompted to select a version:
Current version: v0.8.1
Version suggestions:
1) v0.8.2 (patch - bug fixes)
2) v0.9.0 (minor - new features)
3) v1.0.0 (major - breaking changes)
4) Custom version
Select version type (1-4) [1]:
Version Guidelines:
- Patch (x.y.Z): Bug fixes, security patches, documentation updates
- Minor (x.Y.0): New features, non-breaking changes
- Major (X.0.0): Breaking changes, major rewrites
Enter a descriptive title for the release:
Release title (e.g., 'Quality & Stability Release'):
You'll be asked whether to run quality gates:
Run quality gates before release? (Y/n):
This runs make ci which includes:
- Rust: formatting, Clippy, tests, docs
- Go: formatting, linting, tests
- Elixir: formatting, Credo, Dialyzer, tests
Recommendation: Always run quality gates for minor/major releases.
The workflow automatically updates:
README.md: Version badges for Docker imagesRELEASE.md: Version number and release date
An annotated tag is created with:
- Version number
- Release title
- Recent commit history
The workflow pushes:
- Updated documentation to main branch
- New version tag (triggers docker-publish workflow)
A GitHub release is created with:
- Release title
- Changelog (recent commits)
- Docker pull commands
The tag push triggers the docker-publish workflow which:
- Builds multi-arch images (amd64 + arm64)
- Pushes to GitHub Container Registry (ghcr.io)
- Tags images with version (e.g.,
v0.8.2,0.8,latest)
You can optionally wait for the workflow to complete.
For simple bug fixes, use the quick release:
make release-quickThis skips quality gates and uses defaults:
- Automatically increments patch version
- Uses "Patch Release" as default title
- Auto-generates release notes
After a release:
-
Verify Docker Images
make images-check
Or visit: https://github.com/all-source-os/allsource-monorepo/pkgs
-
Verify GitHub Release Visit: https://github.com/all-source-os/allsource-monorepo/releases
-
Update Release Branch (optional)
git checkout release/0.8 git merge main git push origin release/0.8 git checkout main
-
Announce the Release
- Update project documentation
- Notify stakeholders
- Update changelog in external docs
Uncommitted changes:
git status
git stash # or commit changes
make releaseNot on main branch:
git checkout main
git pull origin main
make releaseGitHub CLI not authenticated:
gh auth loginIf images aren't being tagged correctly:
-
Check workflow status:
gh run list --workflow=docker-publish.yml --limit 5
-
View workflow logs:
gh run view <run-id> --log
-
Manually trigger with force build:
gh workflow run docker-publish.yml -f force_build=true
If you need to recreate a tag:
# Delete local tag
git tag -d v0.8.2
# Delete remote tag
git push origin :refs/tags/v0.8.2
# Recreate
make releaseWarning: Only do this if the release hasn't been announced/used.
All files that contain version numbers and must be updated for each release:
| File | Field | Description |
|---|---|---|
apps/core/Cargo.toml |
version = "X.Y.Z" |
Rust Core crate version |
apps/control-plane/main.go |
Version = "X.Y.Z" |
Go control plane constant |
apps/control-plane/tracing.go |
serviceVersion = "X.Y.Z" |
OpenTelemetry service version |
apps/query-service/mix.exs |
version: "X.Y.Z" |
Query Service Elixir version |
apps/mcp-server-elixir/mix.exs |
version: "X.Y.Z" |
MCP Server Elixir version |
deploy/k8s/core.yaml |
image: allsource/core:X.Y.Z |
K8s Core image tag |
deploy/k8s/query-service.yaml |
image: allsource/query-service:X.Y.Z |
K8s Query Service image tag |
| File | Field | Description |
|---|---|---|
README.md |
Frontmatter version, badges, docker pull commands, version table, roadmap |
Main repository README |
apps/mcp-server-elixir/README.md |
Frontmatter version |
MCP Server README |
apps/web/src/components/sections/hero.tsx |
Version badge text | Web dashboard hero section |
docs/launch/MARKETING_MATERIALS.md |
**Version:** header |
Marketing docs |
docs/launch/LAUNCH_READINESS_ASSESSMENT.md |
**Version:** header |
Launch readiness |
docs/sales/evaluation/SAAS_EVALUATION.md |
**Version**: header |
Sales evaluation |
docs/sales/SUMMARY.md |
**Version**: header |
Sales summary |
# Verify current state
./scripts/check-versions.sh
# Search for remaining old version references
grep -rn "0\.9\.0\|0\.9\.1" --include="*.md" --include="*.tsx" --include="*.go" --include="*.toml" --include="*.exs" --include="*.yaml" --exclude-dir=node_modules --exclude-dir=target --exclude-dir=_build --exclude-dir=deps --exclude-dir=.git| Version | Date | Highlights |
|---|---|---|
| v0.10.3 | 2026-02-16 | Critical QS proxy fix, domain migration chronos→allsource |
| v0.10.0 | 2026-02-13 | Leader-follower replication, event-sourced metadata, control plane v2 |
| v0.9.1 | 2026-02-12 | Stream & event type discovery APIs |
| v0.9.0 | 2026-02-10 | Dashboard, auth & logger fixes |
| v0.8.1 | 2026-02-08 | SIMD filter refactoring, Elixir test fixes |
| v0.8.0 | 2026-02-03 | Clean Architecture release |
| v0.7.3 | 2026-02-02 | Quality improvements |
Fixed: All tenant-scoped Query Service routes now work. They were returning 500 in v0.10.1 due to a string-vs-atom key mismatch in the tenant context.
Verified working endpoints:
| Endpoint | Use Case |
|---|---|
GET /api/events/entity/:entity_id |
Load entity stream (index, trade, balance) |
GET /api/events?stream_id=... |
Filtered event listing |
POST /api/query (simple format) |
Cross-entity queries by type |
GET /api/streams |
List all streams (for user indices) |
GET /api/event-types |
List event types |
GET /api/events/type/:type |
Events by type |
Key discovery: entity_id IS the stream ID — there is no separate stream_id field in the event schema. Code using stream_id when writing to Core should use entity_id instead. The Query Service accepts both as query params.
Fixed: DSL where clause ("from"/"where" format in POST /api/query) previously returned 500. Root cause: compile_query only extracted entity_id/event_type from simple predicates and silently dropped compound predicates (and/or). Now properly flattens all predicate trees into Core query params.
Also in this release: Domain migration from chronos→allsource across all docs, configs, and source files.
Full API reference: docs/allsource-qs-api-reference.md
- QS API Reference - Verified endpoint reference for v0.10.3
- Docker Images - Container deployment guide
- Quality Gates - CI/CD quality checks
- RELEASE.md - Current release notes