Contributing
How to contribute to toolup-forge — DCO sign-off, maintenance tiers, where to ask, style and conventions.
toolup-forge welcomes contributions — bug reports, fixes, features, documentation, new companion packages, and new modules. This page orients you to the process; the canonical reference is CONTRIBUTING.md in the repo.
Where to start
| You want to… | Go to |
|---|---|
| Report a bug | Issues on the forge repo |
| Ask a question | Discussions on the forge repo |
| Propose a new feature | Discussions → Ideas before opening a PR |
| Fix something small | Open a PR — see Quick start below |
| Author a new companion | Read companion-authoring guidance + open a discussion first |
| Report a security issue | Don't open a public issue. See SECURITY.md for the private disclosure channel |
Quick start
- Fork the repository at
github.com/ToolUp-Forge/toolup-forge. - Clone your fork, create a branch off
main. - Make your change. Follow the style + conventions below.
- Sign each commit with
Signed-off-by:—git commit -sis the easiest way. See DCO. - Build locally:
dotnet build ToolUp.Forge.sln dotnet fantomas --check . # Run each Expecto suite via `dotnet run --project ...` — they ship as # console runners, not test packs (so `dotnet test` silently no-ops). dotnet run --project src/ToolUp.Platform.Tests/ToolUp.Platform.Tests.fsproj - Open a PR against
mainwith a description and rationale. Reference related issues. - A maintainer reviews per the contribution-flow timelines.
Developer Certificate of Origin (DCO)
toolup-forge uses DCO — not a contributor licence agreement. DCO sign-off is the same mechanism the Linux kernel and Docker use. By signing your commit, you certify you wrote the patch (or otherwise have the right to submit it).
Add a Signed-off-by: trailer to every commit:
git commit -s -m "Your change description"
Name + email must match your git config user.name / user.email. Pseudonymous sign-offs aren't accepted. The full DCO terms are at developercertificate.org.
To avoid forgetting -s, set sign-off globally:
git config --global format.signoff true
Three-tier maintenance model
The forge repo distinguishes first-party (maintained by the core team, ship with the SDK release), community (accepted PR, listed in the catalogue, maintained by the contributor), and third-party (lives outside the forge org, no relationship beyond being mentioned).
When you propose a new companion or module, the Promotion from community to first-party section describes the bar. Briefly:
- The companion satisfies the six portability rules where applicable.
- A README + tests ship alongside.
- The contributor commits to a year-1 maintenance window (security + critical bug fixes; major-version refactors can be re-negotiated).
This is to keep the published surface durable. A companion package that lands as first-party becomes part of the SDK's compatibility promise.
Style and conventions
Briefly — the canonical reference is CLAUDE.md in the forge repo:
- F# 10 on .NET 10. SDK pin is
10.0.203(rollForward: latestFeature). - Fantomas is the formatter. Run
dotnet fantomas <file>BEFOREdotnet build. PRs failing the format check are rejected — fix locally, push the format-only commit, re-request review. - Immutable by default. Records, no mutable fields without justification. The Guiding Principles — referenced as
(GP NN)in source comments — are the canon. - Elmish MVU discipline.
updatefunctions are pure. All side effects flow throughCmd. No mutable global state in client code. - Modules don't reference each other. Shared types live in shared-types files. Inter-module communication uses persisted data or events, never imports.
- Six portability rules for distributed-implementation interfaces. See Portability rules.
- The two type-erasure boundaries (
ClientModule.register+DataTypeDisplay.RenderSummary) are sanctioned; otherbox/unboxusage isn't.
Documentation contributions
This site is a separate repo at github.com/toolup-forge/toolup-forge-io. It synchronises toolup-forge/docs/ on every deploy — so:
- Fixing a typo or broken example in
/docs/*→ land it intoolup-forgeunderdocs/. The next deploy of this site picks it up. - Fixing a marketing-page typo, a layout bug, or a missing internal link → land it in
toolup-forge-io. Same DCO / Apache-2.0 posture.
When in doubt, open the issue on toolup-forge — a maintainer will route it.
Code of Conduct
The project follows the Contributor Covenant v2.1. Be respectful and constructive. Reports go to the contact in CODE_OF_CONDUCT.md.
Where to ask
| Question shape | Place |
|---|---|
| "How do I…?" | Discussions → Q&A |
| "Should the SDK do…?" | Discussions → Ideas |
| "I think this is broken" | Issues |
| "I want to author a companion / module" | Discussions → Show and tell for ideas, then a PR |
| Security vulnerability | SECURITY.md — private channel only |
Thank you
OSS sustainability is a problem the F# ecosystem has not entirely solved. Every issue triaged, every doc improved, every companion authored makes the SDK more useful for the next person. The acknowledgements file is the modest version of "thank you" — your name lands there when your first PR merges.