Drop your chaos. Download your structure.
A zero-upload, privacy-first file organizer that runs entirely in your browser. Drop any number of files, get a perfectly structured ZIP. No server. No sign-up. No data ever leaves your device.
Zipper uses a 3-layer hybrid classification engine to intelligently organize your files — all based on filenames only (file content is never read):
| Layer | Method | Speed | When Used |
|---|---|---|---|
| Layer 1 | Pattern matching — hand-crafted rules for 18+ file categories (media, code, documents, etc.) | ⚡ Instant | Always runs first |
| Layer 2 | TF-IDF vectorization + k-means clustering — groups files by filename similarity | 🔄 Fast | Files not caught by Layer 1 |
| Layer 3 | Local AI embeddings via all-MiniLM-L6-v2 (WebAssembly) — semantic understanding of filenames | 🧠 ~23MB model | Opt-in only, for remaining uncategorized files |
After classification, you can edit the folder tree (rename folders, drag files between folders), then download the organized result as a single ZIP.
| Technology | Purpose |
|---|---|
| Next.js 14 (App Router) | Framework |
| TypeScript (strict mode) | Type safety |
| Tailwind CSS v3 | Styling |
| Zustand | Client-side state management |
| ml-kmeans | K-means clustering (Layer 2) |
| @xenova/transformers | In-browser AI embeddings (Layer 3, opt-in) |
| JSZip | ZIP file generation |
| react-dropzone | File/folder drag-and-drop |
| framer-motion | Animations |
| Radix UI | Accessible primitives (Tooltip, Switch) |
| lucide-react | Icons |
# 1. Clone the repo git clone <your-repo-url> cd zipper # 2. Install dependencies npm install # 3. Start dev server npm run dev # 4. Open in browser open http://localhost:3000
# Run Layer 1 and Layer 2 classifier unit tests npm test
🔒 Zero-knowledge processing:
- No file content is ever read — classification uses only filenames and extensions
- No network requests after initial page load (Layer 3 downloads a model once, cached in browser)
- No backend, API routes, or server actions — everything runs in the browser
- No cookies, analytics, or tracking — zero data collection
- No sign-up required — just drop files and go
Your files never leave your device. Period.
zipper/
├── app/
│ ├── layout.tsx # Root layout, fonts, SEO metadata
│ ├── page.tsx # Main page — phase-based UI
│ └── globals.css # Global styles, dark theme
├── components/
│ ├── DropZone.tsx # File/folder drop with hero layout
│ ├── FileTree.tsx # Interactive folder tree with drag-drop
│ ├── StatusBar.tsx # Classification progress indicator
│ ├── SchemaSelector.tsx # Organization schema picker
│ ├── SettingsPanel.tsx # Settings slide-out panel
│ ├── DuplicateAlert.tsx # Duplicate file warning banner
│ ├── StatsPanel.tsx # Classification stats + download
│ └── ui/ # Radix-based UI primitives
├── lib/
│ ├── classifier/
│ │ ├── index.ts # Orchestrator + tokenizer
│ │ ├── layer1.ts # Pattern matching (18+ rules)
│ │ ├── layer2.ts # TF-IDF + k-means clustering
│ │ ├── layer3.ts # Local AI embeddings (opt-in)
│ │ ├── duplicates.ts # Near-duplicate detection
│ │ ├── namer.ts # Smart folder naming
│ │ └── schemas.ts # Preset org schemas
│ ├── zipper.ts # ZIP generation + download
│ ├── store.ts # Zustand state management
│ └── utils.ts # Utility functions
├── types/
│ └── index.ts # TypeScript type definitions
└── __tests__/
├── layer1.test.ts # Layer 1 unit tests
└── layer2.test.ts # Layer 2 unit tests
MIT