Thanks for considering a contribution. This toolkit gets better when practitioners share what breaks for them and what they had to fix.
- Report a bug - open an Issue with reproduction steps, OpenCTI version, Ubuntu version, and the script output
- Add a new connector template - the highest-impact contribution; see Adding a Connector Template below
- Fix documentation - typos, broken links, outdated commands, missing context
- Improve script logic - edge cases, better error handling, broader OS support
- Share a Lessons-Learned entry - if you hit a deployment issue not in LESSONS-LEARNED.md, a PR adding it helps the next person
- Run your changed scripts on a fresh Ubuntu 22.04 or 24.04 VM end-to-end
- Run
shellcheckon any modified shell scripts and fix all warnings - Update README.md and LESSONS-LEARNED.md if behaviour changed
- Keep commits focused. One logical change per PR. Easier to review, easier to revert if needed
set -euo pipefailat the top of every script (orset -uo pipefailif you need to allow non-zero exits with explicit handling)- Functions named in
snake_case - Variables in
UPPER_CASEfor globals,lower_casefor locals - Use
localfor all function-scope variables - Quote all variable expansions:
"$var"not$var - Prefer
[[ ... ]]over[ ... ]for tests - Use
printfoverecho -efor portability
- Block comments at the top of every function explain what it does and why
- Inline comments only when the code itself doesn't make intent obvious
- No commented-out code in committed files
- Use the existing
log,warn,err,infohelpers - don't invent new ones - One log line per logical event
- No emoji in script output (some terminals mangle them)
The most useful PRs add new connector templates to add-connector.sh.
To add a template:
- Find the connector's official Docker image and required env vars in Filigran's connector list
- Open
add-connector.shand find theget_template()function - Add a new
caseblock following the existing pattern. Use__OPENCTI_TOKEN__,__UUID__, and__API_KEY__as placeholders - the script substitutes them automatically - Add the template name to the
--listoutput earlier in the script - Test it end-to-end:
sudo ./add-connector.sh --template your_new_one --api-key TEST_KEY - Confirm the connector appears in OpenCTI UI under Data → Ingestion → Connectors and produces a Work entry
- Document any quirks in LESSONS-LEARNED.md under "Connector issues" - especially things like TLP value formats, mandatory auth, rate limits
- Fork the repo
- Create a branch from
mainwith a descriptive name:add-recordedfuture-connector,fix-rabbitmq-healthcheck-race, etc. - Make your changes
- Push to your fork and open a PR against
main - Fill out the PR description: what changed, why, how it was tested
- Be ready to iterate on review feedback
When opening an issue:
- Bug reports: include the script you ran, the exact command, the full output, and the OpenCTI/Ubuntu/Docker versions
- Feature requests: describe the problem you're trying to solve, not just the feature you want
- Questions: check LESSONS-LEARNED.md first; it covers most common stumbles
Avoid:
- Vague reports ("doesn't work")
- Pasting raw API keys, tokens, or credentials into issue threads (redact first)
- Using issues for general OpenCTI questions - those belong on OpenCTI's own issue tracker or community channels
Be civil. Disagree about technical things, not people. Assume good faith from the other side. If you see harassment, report it via the email in SECURITY.md.
By submitting a PR, you agree your contribution is licensed under the same MIT license as the rest of the repository.