Greetings! We are grateful for your interest in joining the Rossoctl community and making a positive impact. Whether you're raising issues, enhancing documentation, fixing bugs, or developing new features, your contributions are essential to our success.
To get started, kindly read through this document and familiarize yourself with our code of conduct.
We can't wait to collaborate with you!
Please follow the Contribution guide as found in the Rossoctl Repository for instructions on how to contribute to our repositories.
Comment /claim on an issue to have it automatically assigned to you. Issues labeled blocked or in-progress cannot be claimed this way. If you need to release an issue, comment /unassign or ask a maintainer.
- Go 1.24+ (for authbridge and authlib)
- Python 3.12+ (for client-registration and Keycloak sync)
- Docker (for building container images)
- pre-commit (for local hooks)
# Clone the repository
git clone https://github.com/rossoctl/cortex.git
cd cortex
# Install pre-commit hooks
pre-commit install
# Build the proxy-init image (one-target Makefile in proxy-init/).
# For the four combined-sidecar images plus this one, use the
# repo-root local-build-and-test.sh.
cd authbridge/proxy-init && make docker-build-initA fix merged to main is installable immediately, without waiting for a release:
curl -fsSL https://raw.githubusercontent.com/rossoctl/cortex/main/authbridge/install.sh \
| sh -s -- --claude-code --ref=main--ref=X means "install X" — both the installer script and the binaries — for any X
that has published binaries: main and any vX.Y.Z release. Every push to main
rebuilds a rolling pre-release, so --ref=main tracks the tip.
--ref= also accepts a branch or a commit, but no binaries are published for those, so
you get that ref's script with the newest release's binaries. The installer warns
when that happens rather than leaving you to infer it.
You should not need --ref to get a release. The plain one-liner resolves the newest
release itself, from the releases API and — when that is unavailable — from
releases.atom, which is not bound by the API's 60-requests-per-hour-per-IP limit.
Each binary reports its own build: abctl --version → main-a1b2c3d. Quote that,
not "main", in a bug report — the channel moves under you.
Three things to know:
- Every
--ref=mainrun replaces and restarts the service. The installed build never matches the requestedmain, so the installer always re-downloads andservice installalways reinstalls. That cuts any running Claude Code session, becauseHTTPS_PROXYis fixed in each session's environment at startup. checksums.txtrolls with the assets. The installer fetches assets and checksums in the same run, so verification is sound. Downloading them hours apart will mismatch.- The plain one-liner takes you back. Running it without
--refreinstalls the newest release and reinstalls the service, so there is no stuck state to clean up.
The rolling release is tagged main-latest, not main. A GitHub release needs a git
tag, and a tag named main would collide with the branch — git rev-parse main would
then resolve to the tag rather than the branch, and every git command in the repo would
warn that the name is ambiguous. --ref=main is the spelling to use, but --ref=main-latest
does the same thing, since that is the title the Releases page shows. CI moves the tag to
the published commit on every merge, so the release's "Source code" archives match the
binaries beside them.
If you have AUTHBRIDGE_VERSION, AUTHBRIDGE_REF, or AUTHBRIDGE_INSTALL_ONLY exported
in a shell profile, unset them. They are no longer read, and the installer now refuses to
run rather than quietly ignoring them — so a stale export fails the default one-liner
even though you passed no flags. The error names the flag that replaced it and echoes your
value back, so the fix is copy-pasteable.
Merge, cut a release, then set the repo variable MAIN_CHANNEL_ENABLED=true
(Settings → Secrets and variables → Actions → Variables). The next push to main
publishes the rolling release.
Two things to check deliberately before flipping it, because both become live at that moment and are inert until then:
release-binaries.yamlholdscontents: writeon everymainpush, not just on tag pushes. It builds only first-party code with SHA-pinned actions, but that is a wider blast radius than before. If you want it narrower, split build (contents: read) from publish (contents: write) and passdist/between them as an artifact.- The job moves the
main-latesttag on each publish. That is the one destructive operation in the workflow. It is guarded to the rolling tag, andinstall_test.shasserts no${TAG}comparison in the workflow names anything other thanCHANNEL_TAG, so av*release cannot become movable by a rename going unnoticed.
The middle step is load-bearing, though not for the reason it first appears. The default
one-liner is safe as soon as main carries the newest_release() v-tag filter: it
resolves a v tag, re-execs that released copy, and the copy then matches
case "${SCRIPT_REF}" in v*) and never calls newest_release at all. What needs a
filtered release is anyone running a released copy as the parent — including the
pinned one-liner this installer prints in its own "abctl is too old" message. An
unfiltered parent resolves the rolling release as its version and installs unreleased
binaries. Cutting a release first stops that window growing; it cannot fix copies already
published.
Prioritization for pull requests is given to those that address and resolve existing GitHub issues. Utilize the available issue labels to identify meaningful and relevant issues to work on.
If you believe that there is a need for a fix and no existing issue covers it, feel free to create a new one.
As a new contributor, we encourage you to start with issues labeled as good first issues.
All commits must be signed off (git commit -s) per the Developer Certificate of Origin.
PRs must follow conventional commits format:
<type>: <Subject starting with uppercase>
Types: feat, fix, docs, style, refactor, perf, test, build, ci, chore, revert
When submitting a pull request, clear communication is appreciated:
- Detailed description of the problem you are trying to solve, along with links to related GitHub issues
- Explanation of your solution, including links to any design documentation and discussions
- Information on how you tested and validated your solution
- Updates to relevant documentation and examples, if applicable
Smaller pull requests are typically easier to review and merge. If your pull request is big, collaborate with the maintainers to find the best way to divide it.
- Use
go fmt(enforced by pre-commit and CI) - Use
go vet(enforced by pre-commit and CI) - Apache 2.0 license header in all Go files
- Python 3.12+ syntax (type hints with
str | None) - Dependencies version-pinned in
requirements.txt
Rossoctl Extensions is Apache 2.0 licensed and we accept contributions via GitHub pull requests.
By contributing to this project you agree to the Developer Certificate of Origin (DCO). This document was created by the Linux Kernel community and is a simple statement that you, as a contributor, have the legal right to make the contribution. See the DCO for details.