Thanks for helping. All BLT work happens on our own forge, git.owaspblt.org/BLT: issues, pull requests, discussions and reviews. github.com/OWASP/BLT is a read-only mirror and the old gitlab.com/owasp-blt projects are retired; don't open issues or pull requests there.
Before you start, read the AI Policy and the Code of Conduct. Security problems go through SECURITY.md, never a public issue.
BLT is one monorepo. Each project is a top-level folder with its own README, tests, licence and deploy config:
| Path | What it is |
|---|---|
blt-*/ |
One folder per project (blt-api, blt-next, blt-leaf, ...), mostly Cloudflare Workers |
scripts/ |
Shared tooling: ci/test.sh (tests), deploy.sh (deploys), readme/ (README generator), routing/projects.tsv |
.forkmesh/ |
Forge workflows (CI, deploys, scheduled jobs), the issue ledger and repository settings |
docs/ |
Repository-wide docs, for example workflows.md |
- The Projects table in the README lists every project with a one-line description and its live site.
scripts/routing/projects.tsvmaps each folder to its display name and old repository names. For example,blt-api/is BLT-API, and https://git.owaspblt.org/BLT/BLT-API opens that folder.- Issues carry a project label named after the folder, for example
blt-leaf.
- Good first issues: small, well-scoped tasks for newcomers.
- One project's issues:
https://git.owaspblt.org/BLT/issues?label=<folder>, for example?label=blt-leaf. The issue list filters on one label at a time.
To claim an issue, comment /assign on it (you need to be signed in). You can hold one open assignment at a time;
open a pull request within 24 hours or comment /unassign to release it. The issue shows a small bar with the time
left; after 18 quiet hours you get a reminder, and at 24 hours the issue is released for someone else. Every issue also has a copy AI prompt
you can paste into a coding agent to start.
-
Sign in to git.owaspblt.org and fork the BLT repository.
-
Clone your fork (copy the clone URL from your fork's page) and create a branch:
git clone <your-fork-clone-url> BLT cd BLT git switch -c blt-leaf/fix-login-redirect
-
Make your change inside the project folder. Keep it to one issue and one concern; don't touch unrelated projects.
-
Run that project's tests (see below).
-
Push to your fork and choose Contribute: Open pull request on the forge to open a pull request into
BLTmain. -
Fill in the pull request form, including the required AI model field, and link the issue it addresses (for example
#123).
Maintainers review on the forge. On your first pull requests a maintainer approves the CI run before it starts
(regular contributors are trusted and run straight away). CI runs the tests of every folder your push touches, and a merge to main deploys
the changed projects automatically.
scripts/ci/test.sh blt-leaf # one project
scripts/ci/test.sh blt-leaf blt-api # several
scripts/ci/test.sh --changed main # the folders your branch changedThe commands per project live in scripts/ci/tests.tsv.
Python projects get a fresh virtualenv; Node, Rust and Flutter projects need those toolchains installed. Behaviour
changes need a test. Each project's README has its own setup and local-run instructions.
-
Commit subject: start with the project folder, then a short summary in the imperative or as a plain statement:
blt-next: save bug reports through blt-api. For changes to several projects, list them (blt-flutter, blt-extension: ...); for repository-wide changes use the area (README: ...,docs: ...). -
Body: say why, not only what. Wrap at about 72 characters.
-
AI disclosure (required): every pull request fills in the AI model field with the model(s) and tool you used, for example
Claude Opus 5.5 via Claude Code, orNone. The forge enforces this (.forkmesh/pulls.jsonsetsrequireAiDisclosure). Commits written or substantially edited by an agent end with a trailer naming the model:Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> -
Pull request description: what changed, why, and how you tested it. Small, focused pull requests get reviewed faster.
-
Never commit secrets, tokens or
.envfiles. -
Don't edit the generated README sections (between
<!-- ...-START -->and<!-- ...-END -->); they are rebuilt byscripts/readme/update_readme.py.
Each project has its own LICENSE file; most are AGPL-3.0. Your contribution is licensed under the licence of the
folder you change. See LICENSE.
See SUPPORT.md: ask on the issue, in a forge discussion, or in
#project-blt on the OWASP Slack.