{"id":50765532,"url":"https://github.com/moayaan1911/pdftools","last_synced_at":"2026-06-11T13:30:49.202Z","repository":{"id":361870748,"uuid":"1256185264","full_name":"moayaan1911/pdftools","owner":"moayaan1911","description":"18 free PDF tools that run entirely in your browser. Zero server, zero signup, 100% private.","archived":false,"fork":false,"pushed_at":"2026-06-01T15:13:06.000Z","size":14268,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-01T17:05:16.966Z","etag":null,"topics":["client-side","nextjs","pdf","pdf-converter","pdf-parser","pdfjs"],"latest_commit_sha":null,"homepage":"https://18pdf.vercel.app","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/moayaan1911.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-06-01T14:39:48.000Z","updated_at":"2026-06-01T15:14:47.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/moayaan1911/pdftools","commit_stats":null,"previous_names":["moayaan1911/pdftools"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/moayaan1911/pdftools","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/moayaan1911%2Fpdftools","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/moayaan1911%2Fpdftools/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/moayaan1911%2Fpdftools/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/moayaan1911%2Fpdftools/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/moayaan1911","download_url":"https://codeload.github.com/moayaan1911/pdftools/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/moayaan1911%2Fpdftools/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34201839,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-11T02:00:06.485Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["client-side","nextjs","pdf","pdf-converter","pdf-parser","pdfjs"],"created_at":"2026-06-11T13:30:48.329Z","updated_at":"2026-06-11T13:30:49.196Z","avatar_url":"https://github.com/moayaan1911.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 👨‍💻 About the Developer\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://emerald-dizzy-stoat-639.mypinata.cloud/ipfs/bafkreiblp6uoh274nzffbcos6d4cxql3zj7lu7z6xvkdhytbd3aqotjsh4?pinataGatewayToken=DFsUmTMRXBF_0KmYgSHbz1ipOKWFjv_rjyvxjq_vHNcdnP0KeJ64G8QQlgmhZyo8\" alt=\"Mohammad Ayaan Siddiqui\" width=\"200\" /\u003e\n\u003c/p\u003e\n\nAssalamualaikum guys! 🙌 This is Mohammad Ayaan Siddiqui (♦moayaan.eth♦). I’m a **Full Stack Blockchain Developer** , **Crypto Investor** and **MBA in Blockchain Management** with **2 years of experience** rocking the Web3 world! 🚀 I’ve worn many hats:\n\n- Research Intern at a Hong Kong-based firm 🇭🇰\n- Founding Engineer at a Netherlands-based firm 🇳🇱\n- Full Stack Intern at a Singapore-based crypto hardware wallet firm 🇸🇬\n- Blockchain Developer at a US-based Bitcoin DeFi project 🇺🇸\n- PG Diploma in Blockchain Management from Cambridge International Qualifications (CIQ) 🇬🇧\n- MBA in Blockchain Management from University of Studies Guglielmo Marconi, Italy 🇮🇹\n\nLet’s connect and build something epic! Find me at [moayaan.com](https://moayaan.com) 🌐 or on [X @moayaan1911](https://x.com/moayaan1911)\n\n---\n\n\u003cdiv align=\"center\"\u003e\n\n# 18PDF\n\n**18 free PDF tools that run entirely in your browser. Zero server, zero signup, 100% private.**\n\n\u003cp\u003e\n  \u003ca href=\"https://18pdf.vercel.app\"\u003e\u003cimg alt=\"Live\" src=\"https://img.shields.io/badge/Live-18pdf.vercel.app-6366f1?style=for-the-badge\"/\u003e\u003c/a\u003e\n  \u003ca href=\"LICENSE\"\u003e\u003cimg alt=\"License\" src=\"https://img.shields.io/github/license/moayaan1911/18pdf?style=for-the-badge\"/\u003e\u003c/a\u003e\n  \u003ca href=\"https://nextjs.org\"\u003e\u003cimg alt=\"Next.js 16\" src=\"https://img.shields.io/badge/Next.js-16-000?style=for-the-badge\u0026logo=next.js\u0026logoColor=white\"/\u003e\u003c/a\u003e\n  \u003ca href=\"https://www.typescriptlang.org\"\u003e\u003cimg alt=\"TypeScript\" src=\"https://img.shields.io/badge/TypeScript-5-3178c6?style=for-the-badge\u0026logo=typescript\u0026logoColor=white\"/\u003e\u003c/a\u003e\n  \u003ca href=\"https://react.dev\"\u003e\u003cimg alt=\"React 19\" src=\"https://img.shields.io/badge/React-19-61dafb?style=for-the-badge\u0026logo=react\u0026logoColor=black\"/\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp\u003e\n  \u003cimg alt=\"No upload\" src=\"https://img.shields.io/badge/Privacy-100%25_local-success?style=flat-square\"/\u003e\n  \u003cimg alt=\"No signup\" src=\"https://img.shields.io/badge/Signup-none-success?style=flat-square\"/\u003e\n  \u003cimg alt=\"File size limit\" src=\"https://img.shields.io/badge/Limits-none-success?style=flat-square\"/\u003e\n  \u003cimg alt=\"PWA\" src=\"https://img.shields.io/badge/PWA-installable-6366f1?style=flat-square\"/\u003e\n  \u003cimg alt=\"SEO\" src=\"https://img.shields.io/badge/SEO-AI--optimized-6366f1?style=flat-square\"/\u003e\n  \u003cimg alt=\"AI bots\" src=\"https://img.shields.io/badge/AI_bots-welcome-6366f1?style=flat-square\"/\u003e\n\u003c/p\u003e\n\n\u003cbr/\u003e\n\n\u003cimg src=\"screenshots/desktop-01-home.png\" alt=\"18PDF home page\" width=\"900\"/\u003e\n\n\u003cbr/\u003e\n\u003cbr/\u003e\n\n[**Try it now**](https://18pdf.vercel.app) · [**Report bug**](../../issues) · [**Request feature**](../../issues)\n\n\u003c/div\u003e\n\n---\n\n## Why 18PDF\n\nMost \"free\" online PDF editors have a hidden cost: your files. They get uploaded to a server, scanned, sometimes sold, and almost always limited to a few operations or a small file size.\n\n**18PDF is different.** Every tool runs locally in your browser using WebAssembly. Your files never leave your device. There is no signup, no telemetry, no limit, and no premium tier.\n\n| | |\n| --- | --- |\n| **Files uploaded?** | No. Everything runs in your browser. |\n| **Signup required?** | No. Open the tool and start. |\n| **File size limit?** | No. Limited only by your device memory. |\n| **Watermarks on output?** | Never. |\n| **Pricing?** | Free. Forever. |\n| **Works offline?** | After first load, most tools keep working without a network. |\n| **Open source?** | Yes. See `LICENSE`. |\n\nBuilt with [pdf-lib](https://github.com/Hopding/pdf-lib), [PDF.js](https://mozilla.github.io/pdf.js/), [jsPDF](https://github.com/parallax/jsPDF), and [Tesseract.js](https://tesseract.projectnaptha.com/).\n\n---\n\n## Screenshots\n\n### Desktop\n\n\u003cp\u003e\n  \u003cimg src=\"screenshots/desktop-01-home.png\" alt=\"Home - light mode\" width=\"49%\"/\u003e\n  \u0026nbsp;\n  \u003cimg src=\"screenshots/desktop-05-home-dark.png\" alt=\"Home - dark mode\" width=\"49%\"/\u003e\n\u003c/p\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eMore desktop screenshots\u003c/b\u003e\u003c/summary\u003e\n\u003cbr/\u003e\n\n| Tool | Screenshot |\n| --- | --- |\n| Merge PDFs | \u003cimg src=\"screenshots/desktop-02-tool-merge.png\" alt=\"Merge tool\" width=\"700\"/\u003e |\n| HTML to PDF | \u003cimg src=\"screenshots/desktop-03-tool-html-to-pdf.png\" alt=\"HTML to PDF\" width=\"700\"/\u003e |\n| OCR Text | \u003cimg src=\"screenshots/desktop-04-tool-ocr.png\" alt=\"OCR\" width=\"700\"/\u003e |\n| Tool grid | \u003cimg src=\"screenshots/desktop-06-tool-grid.png\" alt=\"Tool grid\" width=\"700\"/\u003e |\n| FAQ section | \u003cimg src=\"screenshots/desktop-07-faq.png\" alt=\"FAQ\" width=\"700\"/\u003e |\n\n\u003c/details\u003e\n\n### Mobile\n\n\u003cp\u003e\n  \u003cimg src=\"screenshots/mobile-01-home.png\" alt=\"Mobile home\" height=\"500\"/\u003e\n  \u0026nbsp;\n  \u003cimg src=\"screenshots/mobile-02-tool-merge.png\" alt=\"Mobile merge tool\" height=\"500\"/\u003e\n  \u0026nbsp;\n  \u003cimg src=\"screenshots/mobile-03-tool-forms.png\" alt=\"Mobile forms tool\" height=\"500\"/\u003e\n\u003c/p\u003e\n\nEvery layout is designed mobile-first and verified with automated screenshot tests on iPhone 15 viewport.\n\n---\n\n## The 18 tools\n\nOrganized into four categories. Click any name to try it.\n\n### Organize\n\n| Tool | What it does |\n| --- | --- |\n| [Merge PDFs](https://18pdf.vercel.app/tool/merge) | Combine multiple PDFs into one document, in any order. |\n| [Split PDF](https://18pdf.vercel.app/tool/split) | Extract page ranges or every page into a ZIP of separate PDFs. |\n| [Rotate Pages](https://18pdf.vercel.app/tool/rotate) | Rotate one, many, or all pages in 90 degree increments. |\n| [Reorder Pages](https://18pdf.vercel.app/tool/reorder) | Drag and drop to rearrange page order. Remove pages with one click. |\n| [Extract Pages](https://18pdf.vercel.app/tool/extract-pages) | Save selected pages as a new PDF in the original order. |\n| [Batch Process](https://18pdf.vercel.app/tool/batch) | Apply one operation to many files at once. Bundles results into a ZIP. |\n\n### Convert\n\n| Tool | What it does |\n| --- | --- |\n| [PDF to Images](https://18pdf.vercel.app/tool/pdf-to-images) | Export every page as PNG or JPEG, bundled into a ZIP. |\n| [Images to PDF](https://18pdf.vercel.app/tool/images-to-pdf) | Bundle images into a single PDF. |\n| [Extract Text](https://18pdf.vercel.app/tool/extract-text) | Extract the text layer of a PDF. Copy or download as .txt. |\n| [HTML to PDF](https://18pdf.vercel.app/tool/html-to-pdf) | Convert HTML markup into a PDF. Templates included. |\n| [OCR Text](https://18pdf.vercel.app/tool/ocr) | Recognize text from scanned or image-based PDFs. |\n\n### Edit\n\n| Tool | What it does |\n| --- | --- |\n| [Page Numbers](https://18pdf.vercel.app/tool/page-numbers) | Stamp page numbers in any corner. Formats: `1`, `Page 1`, `1 of N`, `-1-`. |\n| [Watermark](https://18pdf.vercel.app/tool/watermark) | Add text or image watermarks. Apply to all, odd, or even pages. |\n| [Edit Metadata](https://18pdf.vercel.app/tool/metadata) | Change title, author, subject, keywords, and creator. |\n| [Fill Forms](https://18pdf.vercel.app/tool/forms) | Open an AcroForm PDF, fill text fields, checkboxes, and dropdowns, then download. |\n| [Crop Pages](https://18pdf.vercel.app/tool/crop) | Trim margins or apply a preset aspect ratio. |\n\n### View\n\n| Tool | What it does |\n| --- | --- |\n| [PDF Viewer](https://18pdf.vercel.app/tool/viewer) | Read any PDF in a clean, in-browser reader with zoom. |\n| [Compare PDFs](https://18pdf.vercel.app/tool/compare) | Open two PDFs side by side and navigate them in sync. |\n\n---\n\n## How it works\n\nThe architecture is simple: a static site that loads the right library for the job, on demand.\n\n```\n┌─────────────────────────────────────────────────────────┐\n│                      Next.js 16                         │\n│   App Router  ·  React 19  ·  Tailwind  ·  Framer       │\n├─────────────────────────────────────────────────────────┤\n│                                                         │\n│   ┌────────────┐  ┌────────────┐  ┌────────────┐        │\n│   │   pdf-lib  │  │  PDF.js    │  │   jsPDF    │  ...  │\n│   │  merge     │  │  render    │  │  HTML out  │       │\n│   │  split     │  │  extract   │  │            │       │\n│   │  rotate    │  │  OCR src   │  │            │       │\n│   └────────────┘  └────────────┘  └────────────┘        │\n│                                                         │\n│   ┌────────────┐                                        │\n│   │ Tesseract  │  ←─ runs in Web Worker                 │\n│   │   .js      │                                        │\n│   └────────────┘                                        │\n│                                                         │\n└─────────────────────────────────────────────────────────┘\n                         │\n                         ▼\n              ┌─────────────────────┐\n              │  Your browser only  │\n              │  No server contact  │\n              └─────────────────────┘\n```\n\n**Key choices:**\n\n- **No backend.** The app is a static export. There is no API route that touches a file.\n- **Dynamic OG images.** Each tool page has its own gradient, generated at request time from the tool's accent hue.\n- **No CDN auth.** No Cloudflare, no Cloudfront workers, no serverless functions. Just static files.\n- **No analytics.** No Google Analytics, no Plausible, no PostHog. Zero tracking.\n\n---\n\n## SEO and AI search\n\n18PDF is built to be findable both by humans and by AI assistants. Every page has rich structured data, every tool is described in a way that an LLM can cite, and the entire app is indexable.\n\n### Per-page metadata\n\nEvery tool page includes:\n\n- Unique title, description, and 5 search keywords\n- Canonical URL\n- OpenGraph + Twitter Card with a unique gradient image\n- 7 JSON-LD blocks: Organization, WebSite, WebApplication, global FAQ, HowTo, per-tool FAQ, BreadcrumbList\n- Last-modified timestamps on the sitemap\n\n### Files for AI agents\n\n- `/llms.txt` - natural-language description of every tool, formatted for LLM ingestion\n- `/sitemap.xml` - generated for all 22 routes (home, 18 tool pages, FAQ, privacy, OG gallery)\n- `/robots.txt` - allows all major AI crawlers (GPTBot, ClaudeBot, PerplexityBot, Google-Extended, CCBot, Applebot-Extended, Amazonbot, Bytespider, cohere-ai, DuckAssistBot, Meta-ExternalAgent, and others)\n\n### OpenGraph previews\n\nEach tool has a unique gradient OG image, generated server-side:\n\n| | |\n| --- | --- |\n| \u003cimg src=\"screenshots/og-merge.png\" alt=\"Merge OG\" width=\"400\"/\u003e | \u003cimg src=\"screenshots/og-ocr.png\" alt=\"OCR OG\" width=\"400\"/\u003e |\n| \u003cimg src=\"screenshots/og-html-to-pdf.png\" alt=\"HTML to PDF OG\" width=\"400\"/\u003e | |\n\n---\n\n## Getting started\n\n### Run locally\n\n```bash\ngit clone https://github.com/USER/pdf-toolkit.git\ncd pdf-toolkit\nnpm install\nnpm run dev\n```\n\nOpen `http://localhost:3000`.\n\n### Build for production\n\n```bash\nnpm run build\nnpm start\n```\n\nThe app builds to a fully static export. Deploy `out/` (or `.next/`) to any static host: Vercel, Netlify, Cloudflare Pages, GitHub Pages, S3, or your own nginx.\n\n### Tech stack\n\n- **Framework:** Next.js 16 (App Router, Turbopack)\n- **UI:** React 19, Tailwind CSS 4, Framer Motion, Lucide icons\n- **PDF engines:** pdf-lib, PDF.js, jsPDF\n- **OCR:** Tesseract.js\n- **Fonts:** Geist, Geist Mono\n- **Testing:** Playwright (Chromium, 18 tool flows × 2 viewports)\n\n---\n\n## Project structure\n\n```\npdf-toolkit/\n├── app/\n│   ├── layout.tsx          # Root metadata, JSON-LD, fonts\n│   ├── page.tsx            # Home: hero, value props, FAQ, tool grid\n│   ├── icon.tsx            # Favicon\n│   ├── apple-icon.tsx      # iOS home screen icon\n│   ├── opengraph-image.tsx # Static OG image\n│   ├── manifest.ts         # PWA manifest\n│   ├── robots.ts           # robots.txt with AI bot allowlist\n│   ├── sitemap.ts          # sitemap.xml\n│   └── tool/\n│       └── [id]/\n│           ├── page.tsx              # Per-tool page + generateMetadata\n│           ├── ToolClient.tsx        # Client wrapper\n│           └── opengraph-image.tsx   # Dynamic per-tool OG\n├── components/\n│   ├── Header.tsx\n│   ├── ToolGrid.tsx\n│   ├── ThemeProvider.tsx\n│   ├── ActionButton.tsx\n│   ├── Toaster.tsx\n│   └── tools/             # 18 tool implementations\n│       ├── MergeTool.tsx\n│       ├── SplitTool.tsx\n│       └── ... (18 files)\n├── lib/\n│   ├── tools.ts           # Tool registry, keywords, FAQs\n│   ├── pdfjs-client.ts    # PDF.js loader + thumbnail render\n│   └── utils.ts\n├── public/\n│   ├── llms.txt\n│   ├── humans.txt\n│   └── .well-known/\n│       └── security.txt\n├── tests/\n│   ├── scripts/           # 18 e2e tests + helpers\n│   └── README.md\n├── screenshots/           # Used in this README\n├── next.config.ts\n├── package.json\n└── README.md\n```\n\n---\n\n## Adding a new tool\n\n1. **Register the tool** in `lib/tools.ts`:\n\n   ```ts\n   {\n     id: \"my-tool\",\n     name: \"My Tool\",\n     desc: \"Short tagline\",\n     longDesc: \"Full description for SEO and AI citation.\",\n     keywords: [\"keyword 1\", \"keyword 2\"],\n     howItWorks: [\"Step 1\", \"Step 2\"],\n     useCases: [\"Use case 1\", \"Use case 2\"],\n     faq: [{ q: \"Question?\", a: \"Answer.\" }],\n     icon: MyIcon,           // from lucide-react\n     category: \"organize\",   // organize | convert | edit | view\n     color: \"220\",           // HSL hue for the OG image gradient\n   }\n   ```\n\n2. **Create the component** in `components/tools/MyTool.tsx`.\n\n3. **Done.** Sitemap, OG image, JSON-LD, and SEO metadata are all generated automatically from the registry.\n\n---\n\n## License\n\nMIT. See `LICENSE`.\n\n## Acknowledgments\n\n- [pdf-lib](https://github.com/Hopding/pdf-lib) by Andrew Dillon\n- [PDF.js](https://mozilla.github.io/pdf.js/) by Mozilla\n- [Tesseract.js](https://github.com/naptha/tesseract.js) by Naptha\n- [Lucide](https://lucide.dev/) icons\n- The open-source community\n\n\u003cbr/\u003e\n\n\u003cdiv align=\"center\"\u003e\n\nMade with care. Your files never leave your browser.\n\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmoayaan1911%2Fpdftools","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmoayaan1911%2Fpdftools","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmoayaan1911%2Fpdftools/lists"}