Block a user
Add loading/error states (skeleton loaders and error messages) to Batch and Analytics pages
Fix Patent.patent_id type annotation from int to str in types.py
Fix analyze_single_patent to download PDF before reading from disk
Document patent PDF storage volume mount and evaluate object storage options
Expose SERP cache TTL as SERP_CACHE_TTL_HOURS environment variable
Make LLM model configurable via MODEL environment variable
Replace print() calls with structured logging in analyzer.py, serp_api.py, and llm.py
Add JWT auth flow tests: registration, login, protected routes, token refresh, admin endpoints
Add rate limiting to /auth/login and /auth/register endpoints
Persist async job state to PostgreSQL so batch results survive API restarts
Fix get_db_client() to use a shared pooled DatabaseClient instead of per-call instantiation
Remove hardcoded database credentials from docker-compose.yml
Make CORS allowed origins configurable via environment variable
Add startup check to refuse default JWT secret in non-dev environments
Document patent PDF volume mount requirement and consider object storage path
Document patent PDF volume mount requirement and consider object storage path
Triage assessment: mostly implemented, closing with notes.
Verified in the current codebase:
- docker-compose.yml mounts patents/ volume -- Done. Bind mount
./patents:/app/patentsis…
Multi-model support: let users choose LLM provider per analysis and compare outputs
Closing as already implemented. Multi-model support exists: Analysis.tsx and Batch.tsx have model selection. The API accepts a model parameter per request. config.py has MODEL env var.
Multi-model support: let users choose LLM provider per analysis and compare outputs
Add dark mode support using Tailwind dark variant
Add dark mode support using Tailwind dark variant
Closing as already implemented. Dark mode is implemented: ThemeContext.tsx exists, dark: Tailwind classes are used across Layout.tsx, Login.tsx, Register.tsx, index.css, and ProtectedRoute.tsx.