Thanks for your interest in MSK Forms! This document explains how to contribute to the project.
License note: MSK Forms is proprietary (LICENSE). Contributions are assigned to the author (MSK Scripts) under the license terms. Please discuss larger contributions up front via an issue or email.
- Node.js ≥ 22 and pnpm ≥ 11 (
corepack enable) - Docker (for local infrastructure: Postgres, Redis, MinIO)
pnpm install
cp .env.example .env # fill in values
docker compose up -d # Postgres, Redis, MinIO
pnpm prisma migrate dev # or prisma db push in early phases
pnpm dev # web + bot + realtimemain→ production (protected, merge via PR only)develop→ integration- Feature/fix branches:
feat/…,fix/…,chore/…,docs/…→ PR againstdevelopormain
We use Conventional Commits:
<type>(<scope>): <short description>
Common types: feat, fix, chore, docs, refactor, test, ci, perf.
Before opening a PR, make sure everything passes locally:
pnpm lint
pnpm typecheck
pnpm test
pnpm buildSee the pull request template for the full checklist. Every PR runs CI (lint, typecheck, build, test, Prisma validate) and CodeQL.
The app ships in 7 languages: EN, DE, HU, FR, ES, PT, PL.
- Web UI strings live in
apps/web/src/i18n/dictionaries.ts. The typeDictionary = typeof enmakes TypeScript enforce completeness — when you add or change a key, update all language objects or the build fails. - Bot DM strings (applicant status notifications) live in
apps/bot/src/i18n.ts. Built-in status labels mirror the web'sstatusLabels. - Add a new language by extending the
Localeunion +localesarray inapps/web/src/i18n/index.tsand theLanguageSwitcher. Use double-quoted strings with typographic inner quotes (“ ”,« »,„ ”) — straight"inside a value breaks the TypeScript parse.
Do not report security vulnerabilities as public issues — see SECURITY.md.
By participating you agree to our Code of Conduct.