Thank you for your interest in improving FlowBoard! This document provides guidelines for contributing.
git clone https://github.com/POLPROG-TECH/FlowBoard.git
cd FlowBoard
python3 -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"- Python 3.12+ with full type hints on all public APIs
- Ruff for linting and formatting:
ruff check src/ tests/ - mypy for type checking:
mypy src/flowboard/ - pytest for testing:
pytest
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 (927 keys)
├── 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/
- Create a feature branch from
main - Write or update tests for your changes
- Ensure all tests pass:
pytest - Ensure linting passes:
ruff check src/ tests/ - Submit a pull request with a clear description
- Use GIVEN / WHEN / THEN style for behavior tests
- Mock Jira API calls — never hit real Jira in tests
- Focus on analytics correctness and edge cases
- Keep tests fast and isolated
Use clear, descriptive commit messages:
feat: add burndown chart to sprint health view
fix: correct story point aggregation for sub-tasks
docs: update configuration guide for custom fields
FlowBoard supports multiple languages. Currently supported locales: English (en) and Polish (pl).
Set the locale in your config file:
{ "locale": "pl" }Or via CLI flag:
flowboard generate --config config.json --locale plOr via environment variable:
export FLOWBOARD_LOCALE=plPrecedence: CLI flag > environment variable > config file > default (en).
Translation files are JSON files in src/flowboard/i18n/:
en.json— English (reference/source)pl.json— Polish
- Add the new key to both
en.jsonandpl.json. - Use flat dot-notation keys (e.g.
"section.overview": "Overview"). - For interpolation, use
{variable}placeholders:"error.auth_failed": "Auth failed ({code})". - 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.
from flowboard.i18n.translator import Translator
t = Translator("pl")
t("tab.overview") # "📋 Przegląd"
t("cli.error", error="x") # "Błąd: x"
t.plural(3, "plural.day.one", "plural.day.few", "plural.day.many") # "3 dni"
t.format_date_short(date) # "18 mar"
t.format_number(1234.5) # "1 234,5"- Copy
en.jsonto<code>.json(e.g.de.json). - 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.
Open an issue or reach out to the FlowBoard team internally.