Stratos Contributor Guide
Welcome to Stratos. This guide walks you through setting up a development environment and making your first contribution.
Quick Start
Prerequisites
Node.js, Bun, Go, Git, and Make — see
Required Runtimes for exact
versions (kept in sync with .tool-versions, so this guide doesn't repeat
numbers that would drift out of date).
Recommended: Install mise to manage runtime versions
automatically. The repo includes a .tool-versions file that specifies exact
versions. After installing mise:
mise install # installs Node, Bun, and Go at the right versions
First-Time Setup
# 1. Fork and clone
git clone https://github.com/YOUR_USERNAME/stratos.git
cd stratos
# 2. Install dependencies
make install
# 3. Generate dev SSL certificates
mkdir -p dev-ssl
openssl req -x509 -newkey rsa:4096 -keyout dev-ssl/server.key \
-out dev-ssl/server.crt -days 365 -nodes \
-subj '/CN=localhost'
# 4. Create backend configuration
cp src/jetstream/config.example src/jetstream/config.properties
# 5. Set the encryption key (required for backend to start)
# Generate a key and add it to config.properties:
echo "ENCRYPTION_KEY=$(openssl rand -hex 32)" >> src/jetstream/config.properties
# 6. For local development without a UAA server, enable local auth:
# Add these lines to config.properties:
# AUTH_ENDPOINT_TYPE=local
# LOCAL_USER=admin
# LOCAL_USER_PASSWORD=admin
# LOCAL_USER_SCOPE=stratos.admin
# 7. Start development (two terminals)
make dev backend # Terminal 1: backend on port 5443 (builds the host binary first time)
make dev frontend # Terminal 2: frontend on port 5440
No separate build step — make dev backend builds a host-platform binary
itself the first time it's run. Running make build first would cross-compile
for every platform, which is unnecessary for local dev (see
Development).
Open https://127.0.0.1:5440 (accept the self-signed certificate warning).
Common Commands
make help # show all available commands
make dev frontend # start frontend dev server (hot reload)
make dev backend # start backend API server
make test # run all tests
make test frontend # frontend tests only (Vitest)
make test backend # backend tests only (Go)
make lint # check code style
make audit # security scan (default scanner set — see build-and-packaging.md)
make audit summary # high/moderate/low totals only
make outdated # list outdated direct deps
make deps dependabot # show open dependency PRs (gh)
make dump version # show current version info
Development Workflow
1. Choose an Issue
Browse open issues:
- Look for
good-first-issuelabels for beginner-friendly tasks - Comment on the issue to let others know you're working on it
- Ask questions if anything is unclear
2. Create a Feature Branch
All changes go to feature branches off develop. Never push directly to
develop or main.
git checkout develop
git pull origin develop
git checkout -b feature/my-feature
Branch naming:
feature/— new featuresfix/— bug fixesdocs/— documentationrefactor/— code restructuringtest/— test improvements
3. Make Your Changes
Two terminals — see Development in
the Build and Packaging guide for the full workflow, including why
frontend and backend behave differently here (frontend hot-reloads on
save; backend needs a stop + make dev backend again to pick up Go
changes — there's no separate rebuild command).
4. Write Tests
# Frontend (Vitest)
make test frontend # all frontend tests
bun run test:core # specific package
bun run test:watch # watch mode for TDD
bun run test:coverage # with coverage report
# Backend (Go)
make test backend
# E2E (Playwright)
bun run e2e # headless
bun run e2e:headed # visible browser
bun run e2e:ui # interactive UI
Guidelines:
- Add tests for new features
- Update tests for bug fixes
- Frontend: Vitest with Angular TestBed
- Backend: Go
testingpackage with GoConvey
5. Commit Your Changes
git add src/frontend/packages/core/src/features/my-feature/
git commit
Commit message style:
- Subject line: max 48 characters, imperative mood
- Body: max 72 characters wide, explain why not what
- One atomic concept per commit
- Keep style changes separate from functional changes
Add user profile export to about page
Profile export allows admins to download user data as CSV
for audit compliance. Requested in issue #123.
Do not use the <type>: <subject> format (e.g., feat: add export).
6. Push and Create Pull Request
git push -u origin feature/my-feature
Create a PR against the develop branch:
gh pr create --base develop --title "Add user profile export" --body "
## Summary
- Added export button to about page
- CSV format for admin audit use
## Test plan
- [ ] Manual test on dev server
- [ ] Unit tests pass
- [ ] E2E test for export flow
"
Guidelines:
- Clear, descriptive title (under 70 characters)
- Link related issues
- Include testing notes
- Add screenshots for UI changes
7. Address Review Feedback
# Make requested changes, then commit as a new commit
git add .
git commit -m "Address review feedback on export format"
git push
Project Structure
Frontend (src/frontend/packages/)
packages/
├── core/ App shell, shared components, about/diagnostics pages
├── store/ NgRx state management, entity types, auth types
├── shared/ Cross-cutting utilities and services
├── cloud-foundry/ CF-specific pages (orgs, spaces, apps, services)
├── kubernetes/ K8s integration pages
├── cf-autoscaler/ CF autoscaler plugin UI
├── git/ Git integration UI
├── extension/ Extension system for custom modules
├── theme/ Theming (custom builder)
└── devkit/ Build tooling (prebuild scripts, extension generator)
Key technologies:
- Angular with standalone components (see
package.jsonfor the exact version) - NgRx for state management
- RxJS for reactive programming
- Tailwind CSS for styling (preferred for new code)
- SCSS for pseudo-elements and complex selectors only
- Vitest for unit tests, Playwright for E2E
Backend (src/jetstream/)
jetstream/
├── api/ Core API definitions and config structs
├── plugins/ Feature plugins
│ ├── cfapppush/ CF app deployment
│ ├── kubernetes/ K8s dashboard, terminal
│ ├── monocular/ Helm chart browser
│ ├── analysis/ Container analysis
│ └── userinvite/ Email-based invitations
├── repository/ Database layer (per-domain packages)
├── datastore/ Migrations (Goose, dialect-aware)
└── main.go Entry point, config loading
Key technologies:
- Go (see Required Runtimes for the exact version)
- Echo v4 HTTP framework
- PostgreSQL, MySQL/MariaDB, or SQLite (developer's choice)
- Goose for database migrations
- Plugin-based architecture
Build System
The Makefile uses a verb + target pattern:
make build frontend # build frontend only
make build backend # build backend only
make build # build both
make release cf # package for Cloud Foundry
See docs/build-and-packaging.md for full details.
Documentation
docs/ pages also render as an HTML site and as offline epub/PDF booklets
— see Documentation
in the Build and Packaging guide. Docs pages must pass the docs lint
(node scripts/lint-docs.mjs), which CI enforces.
Styling
Prefer Tailwind CSS utility classes for new code:
<div class="flex flex-col gap-4 p-4">
<h1 class="text-2xl font-bold">Title</h1>
<button class="btn btn-primary">Action</button>
</div>
Use SCSS only when Tailwind can't express what you need (pseudo-elements, complex selectors, animations).
Database
Stratos supports PostgreSQL, MySQL/MariaDB, and SQLite. For local development, SQLite is the default (zero setup).
For MySQL/MariaDB (closer to production) using the repo's docker-compose.yml:
# Start MySQL via Docker, Podman, OrbStack, or Colima
docker compose up -d
# Update config.properties:
# DATABASE_PROVIDER=mysql
# DB_HOST=localhost
# DB_PORT=3306
# DB_USER=stratos
# DB_PASSWORD=strat0s
# DB_DATABASE_NAME=stratosdb
For PostgreSQL, there's no bundled docker-compose.yml service — point
DATABASE_PROVIDER=pgsql (see src/jetstream/config.example for the full
variable set) at a Postgres instance of your own.
Migrations run automatically on startup.
AI Tool Usage
Cloud Foundry RFC-0047 (Accepted) requires disclosure of AI tooling used in contributions. This applies to all CFF Technical Community projects including Stratos.
Required: Disclose AI tool usage in your PR description, commit messages, or by including the AI tool as a co-author on commits.
Examples of acceptable disclosure:
# In PR description
AI tools used: GitHub Copilot (code completion), Claude (architecture review)
# As commit co-author
Co-authored-by: Claude <claude@anthropic.com>
Additional guidelines:
- Review all AI-generated code before submitting — you are responsible for what you contribute
- AI-generated code must meet the same quality bar as hand-written code
- Approvers and Reviewers are exempt from disclosure requirements per RFC-0047
Reference: RFC-0047 Require AI Tooling Disclosures
Contribution Checklist
Before submitting a PR:
- Code follows existing patterns in the codebase
- Tests added for new features, updated for bug fixes
- All tests pass locally (
make test) - Linting passes (
make lint) - Commit messages use imperative mood, 48-char subjects
- PR targets the
developbranch - PR description is clear with testing notes
- No sensitive data in commits (.env, credentials, keys)
- AI usage acknowledged if applicable
Reporting Issues
If you find a problem with Stratos, report it using GitHub issues.
Before reporting a new issue, check whether it has already been reported. If it has:
- Read the comments to confirm it's the same issue you're having.
- Subscribe to the issue rather than adding "+1" comments.
- Comment only if you can add information not already in the discussion.
When creating a new issue, include:
- As much detail as possible about your setup/environment
- Steps to reproduce the issue
- What you expected to happen
- What happened instead
If an issue already has an assignee, contact them before starting work on it; for unassigned issues, add a comment so work isn't duplicated.
Getting Help
- GitHub Issues: Report bugs, request features
- GitHub Discussions: Ask questions, share ideas
- Pull Requests: Code reviews and feedback
- Documentation:
docs/directory,make help
Further Reading
- Build and Packaging — build system details
- Developer Environment — full toolchain reference
- Pagination Architecture — list/table patterns
- Plugin Architecture — backend plugin system
- Secrets Management — encryption key handling