Thanks for your interest in contributing! This guide will help you get set up and understand the project conventions.
- Fork the repo and clone your fork
- Install dependencies:
npm install - Copy the env file:
cp .env.example .env - Add your
DEEPSEEK_API_KEYto.env(required for AI features; UI-only work doesn't need it) - Start the dev server:
npm run dev
# Create a feature branch
git checkout -b feat/your-feature
# Run the dev server
npm run dev
# Run tests
npm test
# Type-check and lint before committing
npm run build
npm run lintAll colors use CSS custom property tokens (--t-*) mapped through Tailwind as th-* utilities. Never use raw Tailwind colors like text-white or bg-blue-500 — they will break on 5 of 6 themes.
// Good
<div className="bg-th-surface text-th-primary border-th-border" />
// Bad — breaks non-modern themes
<div className="bg-gray-900 text-white border-gray-700" />Border radii also use tokens: rounded-[var(--t-r-card)], rounded-[var(--t-r-btn)], etc.
All user-visible strings must use t('key') from react-i18next. When adding new strings:
- Add the key to all three locale files:
src/i18n/locales/en.json,pl.json,es.json - Use nested keys matching the existing structure (e.g.,
nav.home,settings.fontSize) - Polish and Spanish translations can be approximate — native speakers will review them
- Small settings (language, theme, preferences): Zustand store with
persistmiddleware (localStorage) - Large data (texts, words, activity): IndexedDB via the
idblibrary throughsrc/services/storage.ts - Each store lives in
src/stores/asuse<Name>Store.ts
- Functional components with default exports
- Use
memo()for components that render in lists or receive stable props - Icons are inline SVGs in
src/components/Icons.tsx— no external icon library - Lazy-load route components in
src/main.tsx
- Strict mode is enabled — no
anytypes in new code - Use
import typefor type-only imports - Types live in
src/types/index.ts
Check the Issues tab for tasks labeled good first issue or help wanted. Some areas that always welcome contributions:
- New UI language — add a locale file in
src/i18n/locales/and register it - Accessibility — ARIA labels, keyboard navigation, screen reader support
- Tests — expand coverage of utility functions and stores
- Themes — create new visual themes following the existing CSS custom property pattern
- Make sure
npm run buildandnpm testpass - Keep PRs focused — one feature or fix per PR
- Write a clear description of what changed and why
- If adding UI, test across at least 2 themes (one dark, one light)
- Update locale files if you added user-visible strings
This project follows the Contributor Covenant. Be kind and constructive.