Thank you for your interest in contributing! 🙏
- Fork & clone:
git clone https://github.com/SebastienGosa/librarfree.git - Create branch:
git checkout -b feature/my-feature - Make changes, test locally
- Submit PR with clear description
- TypeScript (frontend), Python (workers)
- ESLint + Prettier formatting
- 2 spaces indent, semicolons required
- Snake_case for database columns
Format: type(scope): description
Examples:
feat(import): add Gutenberg German mirrorfix(affiliate): correct Amazon FR URL templatedocs: update IMPORTS_PLAN with Gallica info
Types: feat, fix, docs, style, refactor, test, chore, import, translation, affiliate
See docs/IMPORTS_PLAN.md for source list. To add a new source:
- Create worker in
workers/importers/ - Inherit from
BaseImporter - Implement
fetch_metadata()anddownload_content() - Test with
pnpm --filter workers run import-test --source=yoursource --limit=10
CRITICAL RULE: Only use AI translation (NLLB) as FALLBACK when NO public domain human translation exists.
Priority order:
- Standard Ebooks (if available in target language)
- Wikisource translations
- National library editions (Gallica, etc.)
- ONLY THEN → NLLB automatic translation (mark as "machine_translated")
To add a new retailer:
- Register for their affiliate program (Amazon Associates, Fnac, etc.)
- Add to
database/affiliate_retailers_seed.sql - Update
AFFILIATE_RETAILERS_CONFIG.mdwith details - Test URL generation
- Submit PR
- Discord: [link to come]
- Issues: https://github.com/SebastienGosa/librarfree/issues
- Email: hello@librarfree.com
Thank you for helping build a free library for everyone! 📚