Skip to content

Contributing ​

  1. Fork + clone the repo

  2. Create a branch from dev:

    bash
    git checkout -b feat/my-feature
  3. Implement with strict TypeScript typing

  4. Pass the quality gates:

    bash
    pnpm typecheck
    pnpm lint
    pnpm build
    pnpm test:ws-smoke
  5. Commit using Conventional Commits

  6. Open a PR to dev with context and manual verification

Technical Rules ​

  • Renderer ↔ Main: only via preload (window.streamoos) - never direct ipcRenderer
  • IPC types: centralized in app/src/shared/ipc.ts
  • Handlers: implement FeatureHandler from app/src/main/handlers/types.ts
  • Logs: use app/src/main/observability/logger.ts in main - never console.log
  • Tokens: safeStorage only - never plaintext in SQLite or localStorage
  • Migrations: SQLite schema changes step-by-step, no unnecessary coupling

PR Checklist ​

  • [ ] Functional impact described in the PR description
  • [ ] Important logs are visible and understandable
  • [ ] No log spam on frequent interactions (volume, progress)
  • [ ] WS smoke test passing (pnpm test:ws-smoke)
  • [ ] No TypeScript strict regression (pnpm typecheck)

CI / Workflows ​

GitHub Actions workflows are in .github/workflows/:

WorkflowTriggerActions
ci.ymlPush / PRtypecheck, lint, build, tests
release.ymlTag v*Build dist Windows + Linux, create GitHub release

Code Areas by Feature ​

FeatureMainRendererShared
KHInsiderapp/src/main/handlers/khinsider/app/src/renderer/components/khinsider/app/src/shared/ipc.ts
Timerapp/src/main/handlers/timer/app/src/renderer/components/timer/-
Twitchapp/src/main/handlers/twitch/app/src/renderer/components/twitch/app/src/shared/planning.ts
Discordapp/src/main/handlers/discord/app/src/renderer/components/discord/-
SMTCapp/src/main/handlers/smtc/app/src/renderer/components/smtc/-
Remoteapp/src/main/remote/app/src/renderer/remote/ (PWA)-
Overlaysapp/overlays/-app/overlays/shared/

Architecture Quick Reference ​

app/src/
├── main/              # Electron main process (Node.js)
│   ├── handlers/      # Feature handlers (one per feature)
│   ├── ws/            # WebSocket server + router + broadcaster
│   ├── remote/        # Fastify HTTPS server for mobile PWA
│   ├── storage/       # better-sqlite3 preferences store
│   ├── windows/       # BrowserWindow management
│   └── observability/ # pino logger (logger.ts)
├── preload/           # contextBridge (window.streamoos)
├── renderer/          # React 19 + Vite 6 dashboard
└── shared/            # Types only (no runtime deps)
    ├── ipc.ts         # IPC channels, feature types, state contracts
    └── planning.ts    # Twitch planning types

i18n ​

All user-visible strings must be localized. Languages: fr (default), en, de.

  • Translation files: locales/<lang>/translation.json
  • Never hardcode UI text in JSX -- use t("key") from the i18n system
  • Detection order: querystring > localStorage

Released under the MIT License.