QuickDrop is a lightweight, single-page web app for temporary personal file transfers. It uses Supabase Storage for file blobs and a Supabase table to index metadata, then lets you search, filter, download, view, or delete uploads from a clean UI.
- Drag-and-drop or click-to-upload
- Upload progress feedback (overall progress across multiple files)
- Search by file name
- Filter by date (today, week, month)
- Download, view, rename, and delete actions
- Soft-delete + restore workflow (restore page)
- Multi-select bulk actions (Select Multiple → Confirm → bulk actions)
- HTML, CSS, JavaScript
- Supabase (Storage + Postgres)
- index.html: Main page (upload + uploaded files list)
- restore.html: Restore page (deleted files list)
- styles.css: App styling
- app.js: Main page logic (upload/list/actions)
- restore.js: Restore page logic (restore/permanent delete/retention cleanup)
- Create a Supabase project.
- Create a public storage bucket named
files. - Create a table named
fileswith the following columns:- id (uuid, primary key, default: gen_random_uuid())
- name (text, not null)
- url (text, not null)
- created_at (timestamptz, default: now())
- deleted_at (timestamptz, nullable)
- Allow public reads from the bucket if you want view/download without auth.
- Add Row Level Security (RLS) policies based on your needs.
Update the Supabase config in:
Values to update:
SUPABASE_URLSUPABASE_ANON_KEY
Because this is a static app, you can run it with any static server.
Example using PowerShell:
python -m http.server 5173Then open http://localhost:5173 in your browser.
Restore page:
This repo is a static website. To host your signed Android APK here:
- Put the file at
downloads/QuickDrop.apk. - The main page top-right download button links to
downloads/QuickDrop.apk.
If you deploy via Netlify (linked to this Git repo), commit the APK to the repo so Netlify can publish it.
This repo includes a Netlify headers file (_headers) to serve APKs with the correct content-type and as an attachment.
If you want a different filename/path, update the link in index.html.
This is not enabled by default. The website works without it.
QuickDrop can optionally trigger a server-side rename job after an upload completes. This keeps uploads fast (no OCR in the browser) and can also be used to backfill existing files.
How it works:
- The web app uploads the file and inserts a row in the
filestable. - Supabase triggers a rename service (Render) via a Database Webhook whenever a new row is inserted.
- The rename service downloads the file, extracts text (OCR/PDF/DOCX), and updates
files.nameonly if the current name still matches the original filename in the URL (so it won’t overwrite user edits).
Rename service code location:
Rename service (local):
- Copy future-ideas/rename-service/.env.example to
future-ideas/rename-service/.envand fill:SUPABASE_URLSUPABASE_SERVICE_ROLE_KEY
- Start the service:
cd future-ideas/rename-servicenpm installnpm start
Production (Render) + Supabase webhook:
- Deploy the service in
future-ideas/rename-service/to Render as a Web Service. - Set Render environment variables:
SUPABASE_URLSUPABASE_SERVICE_ROLE_KEY- (optional)
RENAME_WEBHOOK_SECRET(recommended)
- In Supabase Dashboard → Database → Webhooks:
- Create a new webhook for table:
public.files - Events:
INSERT - URL:
https://<your-render-app>.onrender.com/rename-file - If using
RENAME_WEBHOOK_SECRET, add header:x-rename-secret: <same value>
- Create a new webhook for table:
This setup means the browser never calls the rename service, and Render sleeping/cold-starts won’t cause lost rename requests.
Backfill existing files:
POST http://localhost:8787/rename-existingwith JSON body like{ "limit": 25 }.
On Supabase Free, the maximum upload size is enforced by your Storage bucket configuration (often set to 50 MB). If uploads fail around that size, check your bucket's max file size in the Supabase dashboard.
Delete actions are protected by a simple prompt. The current key is:
delme
Change the key in:
- Deleting a file on the main page sets
deleted_at(soft delete). - Restore clears
deleted_at. - Deleted items are retained for
RETENTION_DAYS(currently 30 days) and then permanently removed.
- Filenames are stored as-is. Avoid uploading sensitive data in a public bucket.
- If you enable RLS, update policies so the app can read/write.