Inspiration
My Downloads folder had 847 files in it. Every time I opened it to clean up, I'd get overwhelmed, close it, and promise myself I'd deal with it later. The problem isn't laziness — it's that traditional file management gives you too many decisions at once. A grid of 847 files is cognitively paralysing. One file card at a time is not. That insight became SwipeClean.
What It Does
SwipeClean is a high-performance Electron + React desktop application that transforms mundane file management into an addictive Tinder-style swipe experience:
- Swipe Interface — Review one file card at a time. Swipe right to keep, left to delete, up to skip. The binary decision model eliminates decision fatigue entirely.
- Smart Media Previews — Instantly generates high-performance previews for images, PDFs, and syntax-highlighted code files via Sharp caching. You see what you're deciding on, not just a filename.
- Full Keyboard Speedrun Mode — A/D to keep/delete, W to skip, Ctrl+Z to undo. Flow-state optimized — clean 200 files without touching the mouse.
- Live Stack HUD — Real-time storage impact counter shows exactly how much space you're reclaiming as you swipe, making the cleanup feel satisfying and measurable.
- System-Native Safety — Every delete routes to the OS native trash bin first. Ctrl+Z undoes your last action. Nothing is ever permanently lost by accident.
- Session Persistence — Better-SQLite3 stores your session state so you can close and resume a cleanup session exactly where you left off.
How I Built It
Built on Electron for the desktop shell, React 19 for the component layer, TypeScript for type safety, and Vite for fast builds. Sharp handles image preview generation and caching at native speeds. Better-SQLite3 manages session state synchronously to avoid async complexity in the main process. The swipe animation system uses CSS transforms + JS event handlers (not a framework) for maximum performance and 60fps smoothness. All file system operations are routed through Electron's IPC channel to the main process, which handles actual trash bin routing via the OS-native APIs.
Challenges I Ran Into
- Getting smooth 60fps swipe animations while simultaneously generating file previews required careful async sequencing — preview generation needed to run ahead of the current card without blocking the animation thread.
- Electron's main/renderer process split meant every file operation (read metadata, generate preview, move to trash) had to be designed as an IPC message — which added complexity but made the architecture clean and testable.
- The undo system required maintaining a circular buffer of the last N actions that could be replayed in reverse, including restoring files from the trash bin via the OS API.
What I Learned
That good UX design can make genuinely tedious tasks feel enjoyable. The swipe mechanic isn't just aesthetic — forcing one binary decision at a time is cognitively much easier than open-ended sorting. Sometimes the most impactful productivity tool is the one that removes friction so completely you don't notice you're being productive.
What's Next
- Smart suggestions (auto-flag files older than 1 year that have never been opened)
- Cloud sync for session history across devices
- Mobile companion app for photo library cleanup (iOS + Android)
- Duplicate file detection mode
- Folder health score and cleanup history timeline
Built With
- better-sqlite3
- css
- electron
- html
- javascript
- node.js
- react-19
- sharp
- typescript
- vite
Log in or sign up for Devpost to join the conversation.