-
v0.0.9
Stablereleased this
2026-05-31 20:09:10 +02:00 | 1 commits to main since this releasev0.0.9
Features
- Clickable upload URL: the success URL is now a direct link that opens in a new tab, replacing the separate Copy button
- Filename and upload date in admin: the admin table now shows the original filename and upload timestamp; the
index page history list also displays the date. Existing rows show for both fields
Fixes
- Upload size enforcement:
Content-Lengthis now checked early and chunked reads are capped at
max_upload_size, preventing oversized uploads from slipping through - Content subdomain middleware: static assets and reserved subdomains (
www, etc.) are now passed through
correctly; previously, CSS failed to load on error pages andwww.dropit.patilla.esreturned a404 - Admin
authhardening: token comparison now uses constant-time comparison; adminauthlogic consolidated
Chores
- Updated
READMElink to point to the new tutorial/portfolio
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
v0.0.8
Stablereleased this
2026-05-28 19:07:57 +02:00 | 11 commits to main since this releasev0.0.8
⚠️ Breaking Change: existing shared links will stop working
Pages are now served from per-page subdomains (
{page_id}.{CONTENT_DOMAIN}) instead of the old/p/{page_id}path. That route is gone and there's no redirect, so any links shared before this release will 404. You'll need to re-upload and re-share them.Why the change: serving user-supplied HTML on the same origin as the app lets a malicious page steal
localStoragetokens. Putting each page on its own subdomain cuts that off entirely.
What's New
Per-page subdomain serving (origin isolation)
Each uploaded page now lives at
{page_id}.{CONTENT_DOMAIN}. Security headers are applied to app routes (CSP, X-Frame-Options, etc.) and content pages getnoindexandno-storetoo. Uvicorn now runs with--proxy-headersso the host resolves correctly behind a reverse proxy.Auto-upload drop zone
The upload UI was fully rebuilt. Drop a file or pick one from the browser and it uploads straight away, no separate button needed. The zone moves through a few states:
- idle: waiting for a file
- uploading: shows a progress indicator
- success: shows the URL with click-to-copy and an "Upload another" button to reset
- error: shows an inline message with a click-to-retry hint
The old result and error panels below the zone are gone.
Cleanup scheduler card in admin UI
The admin panel now has a cleanup scheduler section. It shows the last run time, how many pages were deleted, what triggered it (scheduled or manual), when the next run is, and a collapsible history table. There's also a "Run now" button if you want to trigger it manually.
Custom 404 page
Unknown routes now return a proper styled HTML 404 page instead of a raw JSON error.
Bug Fixes
Mixed-case page IDs now resolve correctly
Older page IDs were generated with
token_urlsafe, which can include uppercase letters (likesRysndGq). Browsers lowercase hostnames before sending them, so the subdomain would arrive assrysndgqand the case-sensitive DB lookup would miss it. The lookup now lowercases both sides and resolves the file path from the stored ID, so old pages with uppercase IDs still work fine.
Refactoring
Inline
<style>and<script>blocks inindex.html,admin.html, anderror.htmlwere moved out into separate files underapp/static/css/andapp/static/js/.Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
v0.0.7
Stablereleased this
2026-05-23 15:55:28 +02:00 | 35 commits to main since this releasev0.0.7
Bug fix: expired pages were still being served
Pages with a
TTLwere remaining accessible past their expiry time.- Root cause:
SQLAlchemyconverts timezone aware datetimes to the container's local time (TZ=Europe/Madrid=UTC+2) before writing to SQLite - The expiry check then treated the stored value as UTC, effectively granting every page an invisible 2-hour extension.
- This affected any deployment with a non
UTC TZsetting.
Fix: datetimes are now stored as naive UTC (timezone stripped before write) so the system clock offset is irrelevant.
New: admin cleanup visibility
Three new endpoints under /admin/cleanup/:
- GET
/admin/cleanup/status: last run timestamp, pages deleted, next scheduled run - GET
/admin/cleanup/history: last 50 cleanup runs with trigger source - POST
/admin/cleanup/trigger: run cleanup immediately from the admin panel
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- Root cause:
-
v0.0.6
Stablereleased this
2026-05-23 15:01:31 +02:00 | 38 commits to main since this releasev0.0.6
Custom 404 pages
- Expired and missing page links now show a branded error page instead of a raw JSON response.
- Expired links display "This page has expired", unknown links display "This page doesn't exist".
- API routes are unaffected and continue returning JSON.
- The
dropitaesthetic is preserved.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
v0.0.5
Stablereleased this
2026-05-23 14:14:07 +02:00 | 43 commits to main since this releasev0.0.5
Features
- GHCR publishing: Docker images are now also pushed to GitHub Container Registry on every release,
in addition to the Forgejo registry. Both tagged versions and latest are published. - GitHub link in footer: The "Open source" text in the footer now links to the GitHub repository.
Documentation
- Added Claude Code integration section: documents the
/dropitskill for uploading HTML files directly from Claude Code sessions.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- GHCR publishing: Docker images are now also pushed to GitHub Container Registry on every release,
-
v0.0.4
Stablereleased this
2026-05-22 16:43:35 +02:00 | 46 commits to main since this releasev0.0.4
- Fix port confusion: all references to port
52031replaced with8000acrossDockerfile,compose.yml,.env.example, settings defaults, and docs.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- Fix port confusion: all references to port
-
v0.0.3
Stablereleased this
2026-05-22 16:29:55 +02:00 | 47 commits to main since this releaseInitial release of drop•it: a self-hosted HTML file sharing with short-lived public URLs.
What's included
Core
- Upload an HTML file, get a shareable URL with a configurable TTL (1h, 6h, 24h, 48h, 7d)
- Automatic cleanup of expired pages on a configurable schedule
- Bearer token auth with named upload tokens
Admin
- Admin token with access to the
/adminpanel (list and delete all uploads) - forever TTL option: admin-only permanent uploads
- Per-user TTL cap: non-admin tokens can be restricted to a maximum expiry
UI
- Drag-and-drop landing page — enter token once, upload, copy link
- Recent uploads history (last 5, persisted in localStorage)
- Admin panel at /admin — full upload table with delete controls
API
- POST
/uploadwith optional?ttl=parameter - GET
/p/{id}serving raw HTML - GET
/mefor token verification - GET
/configreturning available TTLs for the current token - GET
/health
Deployment
- Docker image for amd64 and arm64 (Raspberry Pi 4/5)
- Single
compose.ymldeployment, data persisted in a mounted volume
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads