This guide is for developers joining ZenPDF with zero prior context.
- Node.js 20+
- Python 3.11+
- Docker Desktop (optional, for compose-based local stack)
- Convex account/project
- Clerk application (Google sign-in)
- Copy env templates:
apps/web/.env.example->apps/web/.env.localapps/worker/.env.example->apps/worker/.env
- Set the same
ZENPDF_WORKER_TOKENin both files. - Start services:
- Convex:
cd apps/web && npx convex dev - Web:
cd apps/web && npm install && npm run dev - Worker:
cd apps/worker && python -m pip install -r requirements.txt && python main.py
- Convex:
Run before opening a PR.
- Web lint:
cd apps/web && npm run lint - Web tests:
cd apps/web && npm test - Worker tests:
cd apps/worker && pytest
- Keep the 27-tool scope intact unless intentionally changing product scope.
- Enforce limits server-side (web/Convex/worker paths), not only in UI.
- Do not commit secrets or personal payment identifiers.
- Keep error messages user-friendly and non-technical.
Update all of the following in the same PR:
- Worker dispatch and implementation:
apps/worker/zenpdf_worker/worker.pyapps/worker/zenpdf_worker/tools.py
- Tools UI config:
apps/web/src/app/tools/page.tsx
- Worker tests:
apps/worker/tests/test_tools.py
- Feature docs:
docs/FEATURE_LOGIC.md
- Scope is small and reviewable.
- Tests pass locally.
- Backward compatibility and user-facing errors are considered.
- Docs are updated when behavior changes.