Thank you for your interest in contributing to FlowBoard! This guide covers everything you need to get started.
git clone https://github.com/polprog-tech/FlowBoard.git
cd FlowBoard
python3 -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"Verify the installation:
flowboard versioncp scripts/pre-commit .git/hooks/pre-commit && chmod +x .git/hooks/pre-commitpytest # all tests
pytest -v # verbose
pytest tests/test_security.py # specific file
pytest tests/test_security.py::TestCSP # specific classTests follow the GIVEN/WHEN/THEN docstring pattern (see existing tests for examples).
ruff check src/ tests/
ruff format --check src/ tests/
mypy src/flowboard/FlowBoard follows a clean layered architecture. See docs/architecture.md for details.
src/flowboard/
├── cli/ # Typer CLI (generate, validate, verify, demo, version)
├── application/ # Orchestration pipeline, services
├── domain/ # Models, analytics, risk, workload, overlap, dependencies,
│ # timeline, scrum, simulation, pi
├── infrastructure/ # Jira client/connector/normalizer, config loader/validator
├── i18n/ # Translator engine, en.json, pl.json
├── presentation/ # HTML renderer, Jinja2 templates, components, charts, export
└── shared/ # Types, enums, utilities
Key rules:
- Domain layer has zero infrastructure imports
- Presentation layer depends on domain, never on Jira client directly
- Config is loaded once and passed down - no global singletons
- All Jira API access goes through
infrastructure/jira/
Include: expected vs actual behavior, config.json / flowboard.yaml (redacted), Python/OS version, steps to reproduce.
- Branch from
main - Make changes + add tests
- Run
pytestandruff check src/ tests/ - Open PR with clear description
Conventional Commits: feat:, fix:, docs:, test:, refactor:, chore:
FlowBoard supports multiple languages. Currently supported locales: English (en) and Polish (pl).
Translation files live in src/flowboard/i18n/:
en.json- English (reference/source)pl.json- Polish
When adding or updating translations:
- Add the new key to both
en.jsonandpl.json. - Use flat dot-notation keys (e.g.
"section.overview": "Overview"). - For interpolation, use
{variable}placeholders. - For plurals, provide separate keys:
plural.day.one,plural.day.few,plural.day.many,plural.day.other. - Run
pytest tests/test_i18n.pyto verify key parity and placeholder consistency.
To add a new language:
- Copy
en.jsonto<code>.json(e.g.de.json) and translate all values. - Update
_meta.localeto the new code. - Add the locale code to the
"locale"enum inconfig.schema.json. - Add the locale code to the Pydantic config model's locale field.
- Add plural rules in
translator.pyif the language has complex pluralization. - Run
pytest tests/test_i18n.pyto verify.
See LICENSE.