Thank you for your interest in contributing to Wallow! This guide will help you get started.
- .NET 10 SDK
- Docker and Docker Compose
- Node 24 (see
.nvmrc) and pnpm 11.24.0 (seepackageManagerinpackage.json) - A code editor (Visual Studio, Rider, or VS Code)
- Fork and clone the repository
- Install workspace dependencies:
pnpm install
- Start infrastructure services:
pnpm backend:infra
- Run the backend (the Aspire AppHost orchestrates the API, both React apps, migrations, and the seeder):
pnpm backend
- Run the quality gates to verify your setup:
./scripts/run-tests.sh # backend pnpm check # frontend
See the Developer Guide for detailed setup instructions and service URLs.
Working rules that apply to every change live in CLAUDE.md and .claude/rules/
(testing, E2E, coding conventions, and team-agent lifecycle). Issue tracking uses
GitHub Issues via the gh CLI — gh issue list --state open lists available
work, and docs/agents/issue-tracker.md documents the conventions.
- Search existing issues to avoid duplicates
- Open a new issue using the Bug Report template
- Include steps to reproduce, expected vs actual behavior, and your environment details
- Open a new issue using the Feature Request template
- Describe the problem you're solving and your proposed approach
- Be open to discussion about alternative solutions
- Fork the repository and create a branch from
main - Write tests for any new functionality or bug fixes
- Follow the architecture - see Architecture below
- Use Conventional Commits for your commit messages (see Commit Messages)
- Open a Pull Request using the PR template
Wallow is a modular monolith following Clean Architecture and DDD principles. Before contributing, understand these rules:
- Modules: Identity, Storage, Notifications, Announcements, Inquiries, ApiKeys, Branding
- Layer order: Domain → Application → Infrastructure → Api
- Domain has no external dependencies; Application depends only on Domain
- Modules communicate via Wolverine in-memory events, never direct project references
- Cross-module contracts go in
Shared.Contractsonly - Each module owns its own database schema
- EF Core is the only data-access technology: writes through the module's
TenantAwareDbContext, readsNoTrackingthroughIReadDbContext<T>
The frontend half is a pnpm workspace: apps/wallow-web, apps/wallow-auth, and apps/minimal-app
(the external relying-party example, built on the published SDK alone), built on the packages/* libraries. See
apps/CLAUDE.md and Frontend Setup.
For adding new modules, see docs/architecture/module-creation.md.
All commits must follow Conventional Commits:
<type>[optional scope][!]: <description>
feat is a minor bump, fix a patch, and !/BREAKING CHANGE: a major; every other type is
non-releasing. The complete type table lives in
Versioning — it is the only copy, so read it there.
Examples:
feat(inquiries): add form validation
fix(identity): resolve null reference in tenant resolver
test(storage): add upload service unit tests
docs: update contributing guide
Add ! after the type for breaking changes: feat!: redesign authentication API
- C#: use explicit types instead of
var(this rule is C#-only; TypeScript uses inference normally). Full C# conventions are inapi/CLAUDE.md. - TypeScript: the toolchain is oxc (
oxfmt+oxlint), not prettier/eslint —pnpm formatandpnpm lintare the entry points. - Follow existing patterns within each module
- Keep domain logic free of infrastructure concerns
- Write unit tests for domain and application layers
- Ensure both quality gates pass:
./scripts/run-tests.sh all(backend —all, not a bare run, because a bare run filters out everyCategory=Integrationtest) andpnpm check(frontend) - Update documentation if you changed public APIs or behavior
- Fill out the PR template completely
- Request review from a maintainer
- Address any feedback promptly
If you have questions about contributing, open a Discussion or reach out at BC@bcordes.dev.
By contributing to Wallow, you agree that your contributions will be licensed under the Apache License 2.0.