Palimpsest is a modern, client-side web application for quick, secure, and intuitive PDF manipulation.
Features:
- Edit PDFs: Reorder, rotate, delete pages, and extract specific pages as images.
- Visual Splitting: Use interactive Bauhaus-style markers to define split points between pages and download chunks instantly.
- Merge PDFs: Combine multiple files seamlessly with a high-contrast sorting interface.
- Images to PDF: Batch convert PNG and JPG files into a single, cohesive PDF document with automatic aspect-ratio preservation.
- Privacy First: 100% browser-based. No PDF files ever leave your device or are uploaded to any server.
- Framework: Vite with Vanilla Javascript.
- Aesthetic: Custom Bauhaus-inspired design system (high-contrast, geometric, zero-radius borders).
- Core Engine:
pdf-libfor binary PDF mutations. - Rendering:
pdfjs-distrunning in a Web Worker for high-fidelity page thumbnails. - UX:
SortableJSfor drag-and-drop reordering,fflatefor ultra-fast client-side ZIP generation for image/split exports.
Ensure you have Node.js installed.
-
Install dependencies:
npm install
-
Run the development server:
npm run dev
-
Build for production:
npm run build
The optimized static assets will be generated in the
/distdirectory.
Palimpsest compiles to a static website and can be hosted on any standard web server (Apache, Nginx, Vercel, Netlify).
- Base Path: The current build is configured with a base path of
/palimpsest/(seevite.config.js). If you are deploying to the root of your domain, change this to/. - Static Assets: After running
npm run build, upload the contents of thedist/directory to your server (e.g., viascporrsync). - MIME Types: Ensure your production server serves
.mjsfiles with thetext/javascriptMIME type. Apublic/.htaccessfile is included for Apache environments.
- Encryption:
pdf-libcannot natively rewrite streams of encrypted PDFs. Palimpsest includes logic to detect encrypted/password-protected PDFs and will gracefully instruct the user to unlock them first (e.g., via "Save as PDF" in Chrome).