Ephemeral file sharing. One download. Twenty minutes. Then gone.
AETHER.SHARE is a self-destructing file sharing platform where files live only in RAM, can be downloaded exactly once, and automatically expire after 20 minutes. No data persists to disk.
- Single-download limit: Files are deleted immediately after first download
- 20-minute expiry: Automatic cleanup of un-downloaded files
- Persistent storage: Files survive server restarts (saved to
filestore.json) - 50MB max upload: Support for images, documents, audio, video, archives
- Two-state UI: Active Streams vs Consumed Streams (separate sections)
- Drag & drop: Click or drag files to upload
- Local caching: Instant UI via localStorage with 5s sync
- Backend: Node.js, Express, Multer
- Storage: In-memory Map + JSON file persistence
- Frontend: Vanilla HTML/CSS/JS (no build step)
- Deployment: Vercel (serverless)
git clone <repo>
cd AETHER.SHARE
npm install
npm startVisit http://localhost:3000
- Push to GitHub
- Import project in Vercel
- Vercel auto-detects Node.js, uses
vercel.jsonconfig - Deploy — gets a
*.vercel.appURL
Important: Vercel's filesystem is ephemeral. For production persistence, use a database or external storage. This project is designed for small-scale ephemeral sharing.
| Setting | Value | Description |
|---|---|---|
| Port | 3000 (or $PORT) |
Server port |
| Max file size | 50MB |
Upload limit |
| Max concurrent files | 100 |
Server memory limit |
| Download limit | 1 |
One-time download |
| Expiry time | 20 minutes |
Auto-deletion TTL |
| Auto-refresh | 5s |
UI sync interval |
| Storage file | filestore.json |
Persistence location |
| Method | Endpoint | Description |
|---|---|---|
GET |
/ |
HTML UI |
POST |
/upload |
Upload file (multipart: file) |
GET |
/files |
List all files (JSON) |
GET |
/download/:id |
Download once (decrements counter) |
DELETE |
/file/:id |
Delete file immediately |
- STABLE (cyan):
downloadsRemaining > 0, can be downloaded - CONSUMED (red):
downloadsRemaining ≤ 0, already downloaded, read-only - Expired: Auto-deleted after 20 minutes from upload
AETHER.SHARE/
├── server.js # Express server + persistence + expiry
├── package.json # Dependencies: express, multer, uuid
├── vercel.json # Vercel deployment config
├── filestore.json # Auto-generated: persisted files (base64)
└── public/
└── index.html # Single-page UI
- User uploads → Multer buffers to memory → stored in
filesStoreMap - Metadata (id, name, size, mime, downloadsRemaining, createdAt, expiresAt) saved
- File buffer base64-encoded → written to
filestore.json(debounced 500ms) - UI polls
/filesevery 5s → updates Active/Consumed sections - On download →
downloadsRemaining--, file moves to Consumed - On every request →
cleanupExpired()removes files pastexpiresAt
Images (jpeg, png, gif, webp, svg), Documents (pdf, txt, html, css, json, xml), Code (js, ts, py, java, c, cpp, php, sh), Archives (zip, rar, 7z, gz, tar), Audio (mp3, wav, ogg, flac, aac), Video (mp4, avi, mkv, mov, webm), Office (doc, docx, xls, xlsx, ppt, pptx), Others (rtf, md, octet-stream)
- Files are never written to server disk (Multer memory storage)
- Buffers cleared from memory on download/expiry/delete
- 100-file limit prevents memory exhaustion
- No authentication — links are secret by UUID (128-bit)
- For production use, add rate-limiting, auth, and external blob storage
MIT
Built by HIMANSHU — Transient Protocol v2.0
