Thanks for helping! Bug reports, station suggestions, translations of ideas, design feedback and code are all welcome.
corepack enable
pnpm install
pnpm dev # Chrome with hot reload (pnpm dev:firefox / pnpm dev:web)
pnpm check # what CI checks first: lint, formatting, types, unit testsMore detail is in docs/development.md and docs/architecture.md.
main is the only working branch; develop is an automatic mirror of it, so never branch from it
or target it.
- Branch from
main:git switch -c feature/<short-name> main(orfix/<short-name>). - Commit with Conventional Commits. A commit hook checks
this:
feat(popup): add sleep timerfix(core): skip stations without a stream URLfeat(stations): add Dengê Welatdocs: explain language groups- Others:
refactor,perf,test,chore,ci,build. Add!or aBREAKING CHANGE:footer for breaking changes.
- Open a pull request into
main. CI must pass. Maintainers runpnpm pr, which pushes the branch, opens the PR and turns on auto-merge: GitHub merges it when CI is green and deletes the branch. - Releases are cut from
mainwithpnpm release:start/pnpm release:finish(see docs/releasing.md).
- People are the contributors. Don't let AI coding tools add themselves to commits through
Co-authored-by:orMade-with:lines. The commit hook strips these lines and CI rejects commits that still have them (scripts/attribution.mjs). - Privacy first. No analytics, tracking, remote code or new third-party services without discussion. Any new network destination must go in the privacy policy.
- Minimal permissions. Adding a browser permission needs a strong reason, explained in the PR.
- Validate at the edges. Anything from storage, imports or APIs goes through a Zod schema.
Only
http(s)URLs are accepted. - Shared code stays shared. Logic goes in
packages/core(no React, nochrome.*) and UI inpackages/ui; browser specifics go inapps/extension/src/lib. - Use the design system. Use shadcn/ui components and semantic tokens (
bg-primary,text-muted-foreground,text-brand,text-live), not raw colours. Usegap-*instead ofspace-*. Every icon button needs anaria-label. - Accessible by default. Everything must work by keyboard, respect reduced motion, and use
dir="auto"on station names. - Tests. Fixes in
packages/corecome with a unit test. Runpnpm screenshotsfor UI changes you can't unit-test. - Data compatibility. Changing stored data or the backup format needs a migration and a test
(see
storage/legacy.tsandbackup/backup.ts).
Use the bug report form. Include your browser and version, Tajdîn's version (shown in the footer) and the station if relevant. Security issues: see SECURITY.md; please don't open public issues for them.