A lightweight AI-powered summarization tool that transforms long-form content into concise, digestible recaps. Perfect for students, researchers, and professionals who need quick insights from documents, articles, or text.
🔗 Live Demo: tldrify.dvy9.dev
- Text: Paste any free-form text directly
- URLs: Summarize web content with intelligent link ingestion
- Documents: Support for PDF, Office docs, CSV, PPT, EPUB, images, and more
- Writing Style: Choose from concise, formal, technical, creative, or scientific tones
- Length Control: Adjust summary length from 100-500 words
- AI Models: Select between Gemini 2.5 Flash, Gemini 2.0 Flash, or GPT-5 Nano
- Offline Access: Client-side storage via IndexedDB for previous summaries
- Security: Cloudflare Turnstile protection against abuse
- Reliable Processing: Jina Reader integration for robust URL content extraction
- File Handling: 5 MiB upload limit with server-side validation
graph LR
A[Frontend] --> B[Backend API]
B --> C[Cloudflare Turnstile]
B --> D[Jina Reader]
B --> E[Gemini AI]
A --> F[IndexedDB]
Technical Stack:
- Frontend: Vite + React (TypeScript), Tailwind v4 via Origin UI
- Backend: FastAPI with Python 3.12+
- Storage: IndexedDB for client-side data persistence
- Processing: markitdown for document conversion, Gemini API for summarization
- Node.js 20+ &
pnpm(corepack enable) - Python 3.12+
uv- API keys for Gemini, Jina, and Cloudflare Turnstile
-
Clone and setup frontend:
cd frontend cp .env.example .env # Add your VITE_TURNSTILE_SITE_KEY pnpm install pnpm dev
-
Setup backend:
cd backend cp .env.example .env # Add GEMINI_API_KEY, JINA_API_KEY, TURNSTILE_SECRET_KEY uv sync uv run --env-file=.env uvicorn main:app --reload
-
Access applications:
- Frontend: http://localhost:5173
- Backend API: http://localhost:8000
- API Documentation: http://localhost:8000/docs
Frontend (.env):
VITE_TURNSTILE_SITE_KEY=your_public_site_keyBackend (.env):
GEMINI_API_KEY=your_gemini_key
JINA_API_KEY=your_jina_reader_key
TURNSTILE_SECRET_KEY=your_turnstile_secretSummarizes content from text, URLs, or uploaded files.
Form Data:
| Field | Type | Required | Description |
|---|---|---|---|
message |
string | Conditional | Text content or URL to summarize |
settings |
JSON | Yes | {"model": "gemini-2.5-flash", "writingStyle": "concise", "maxWords": 200} |
turnstileToken |
string | Yes | Cloudflare Turnstile verification token |
file |
file | Optional | Document file (≤ 5 MiB) |
Example Request:
curl -X POST http://localhost:8000/api/summarize \
-F "message=https://example.com/article" \
-F 'settings={"model":"gemini-2.5-flash","writingStyle":"concise","maxWords":200}' \
-F "turnstileToken=your_verification_token"Success Response:
{
"title": "Summary Title",
"answer": "Concise summary content..."
}Error Responses:
400- Validation error403- Turnstile verification failed413- File too large422- Processing error
pnpm dev # Development server
pnpm build # Production build
pnpm preview # Preview production build
pnpm lint # Run lintinguv run --env-file=.env uvicorn main:app --reload # Development serverfrontend/
dist/ # Build artifacts (safe to delete)
src/ # React application source
backend/
main.py # FastAPI application and route handlersProprietary - contact the author for reuse permissions.
- Missing environment variables will cause
500errors - ensure all keys are set - Large files (>5 MiB) will be rejected with
413status - Invalid Turnstile tokens return
403errors - Build issues - delete
frontend/dist/and rebuild
For additional support, check the API documentation at /docs when running locally.