# 1. Clone & install
git clone https://github.com/SebastienGosa/librarfree.git
cd librarfree
./scripts/setup_dev.sh
# 2. Start Docker services
docker-compose up -d
# 3. Run database migrations
psql $DATABASE_URL -f database/schema.sql
# 4. Install dependencies
pnpm install
# 5. Start dev servers
pnpm --filter web dev # http://localhost:3000
pnpm --filter api dev # http://localhost:3333librarfree/
├── apps/
│ ├── web/ # Next.js frontend
│ └── api/ # tRPC backend
├── packages/
│ ├── db/ # Database client + schema
│ ├── ui/ # Shared components (shadcn)
│ └── utils/ # Shared utilities
├── workers/
│ ├── importers/ # Book import scripts (PG, IA, etc.)
│ ├── translators/ # NLLB translation service
│ ├── embedders/ # Ollama embedding generation
│ └── isbn-lookup/ # ISBN enrichment
├── database/
│ └── schema.sql # Full PostgreSQL schema
├── scripts/ # Helper scripts
├── docs/ # Documentation
└── docker-compose.yml # Local dev environment
# Import Project Gutenberg (1000 books)
pnpm --filter workers run import-gutenberg --limit 1000
# Generate embeddings (requires Ollama)
docker run -d -p 11434:11434 ollama/ollama
ollama pull nomic-embed-text:v1.5
pnpm --filter workers run generate-embeddings --batch-size 100
# Search Meilisearch
curl 'http://localhost:7700/indexes/books/search' \
-H 'Content-Type: application/json' \
-d '{"q":"war and peace","limit":5}'
# Database queries
psql $DATABASE_URL -c "SELECT COUNT(*) FROM books;"
psql $DATABASE_URL -c "SELECT * FROM v_translation_quality_dashboard;"
# View logs
docker-compose logs -f postgres
docker-compose logs -f meilisearchCopy .env.example to .env.local and fill in:
DATABASE_URL– PostgreSQL connectionMEILISEARCH_HOST– http://localhost:7700OLLAMA_BASE_URL– http://localhost:11434AMAZON_PAAPI_ACCESS_KEY– (optional) for affiliate linksAMAZON_ASSOCIATE_TAG_*– your affiliate tags by region
- Create
workers/importers/your_source.py - Inherit from
BaseImporter - Implement
fetch_metadata()anddownload_content() - Test:
pnpm --filter workers run import-test --source=your_source --limit=10 - Submit PR with sample output
Changes to schema go in database/schema.sql. To apply:
# Apply full schema
psql $DATABASE_URL -f database/schema.sql
# Or just migrations (future)
pnpm db:migrate# All tests
pnpm test
# Specific package
pnpm --filter api test
pnpm --filter web test
pnpm --filter workers test
# With coverage
pnpm test -- --coverage.vscode/launch.json is configured for:
- Next.js frontend attach
- tRPC backend attach
- Worker debug
docker-compose logs -f [service]
docker-compose ps # status
docker-compose down # stop all# Connect
docker-compose exec postgres psql -U postgres -d librarfree
# View size
SELECT pg_size_pretty(pg_database_size('librarfree'));
# List tables
\dt- Meilisearch: index rebuild for 100K books ~30s
- Embeddings: GPU recommended (NLLB ~2s/book on CPU)
- Import speed: Parallelize with
--workers=10 - Storage: Plain text ~1KB/book → 1M books = ~1GB
docker-compose up -d postgres
# Wait 10s, then retrydocker-compose restart meilisearch
curl http://localhost:7700/healthImporting 500K books needs ~50-100GB. Use external storage:
ls -lh /data/gutenberg/ # your mirror location
docker volume ls # check docker volumes
docker volume prune # cleanup unused
- Check rate limits (don't overwhelm source servers)
- Use throttling:
--rate-limit 1(1 req/sec per source) - Run overnight – imports can take hours
See docs/DEPLOYMENT.md for production deployment:
- Vercel (frontend) + Railway (backend)
- Hetzner VPS (all-in-one)
- Kubernetes (enterprise)
- Discord: [to come]
- GitHub Issues: https://github.com/SebastienGosa/librarfree/issues
- Email: hello@librarfree.com
Happy coding! 📚✨