Commit Graph
115 Commits
Author SHA1 Message Date
nobswebdev 9696c85a8e Cache zeroperl.wasm in the ExifTool worker after first fetch.
Avoid repeat multi-megabyte downloads when Tor/Firefox do not HTTP-cache worker WASM responses.
2026-10-31 00:17:12 +01:00
nobswebdev c95af9576f Improve upload metadata status copy and stack status lines on all widths. 2026-10-31 00:10:18 +01:00
nobswebdev 5562ad95cc Merge pull request 'Precompress ExifTool WASM with Brotli and serve via nginx brotli_static.' (#14) from slave/wasm-load-optimization into master
Reviewed-on: #14
2026-10-30 22:33:33 +00:00
nobswebdev 32cd1bdb9e Precompress ExifTool WASM with Brotli and serve via nginx brotli_static.
Tor first loads drop from ~25 MB raw to ~5 MB on the wire; prod build writes .wasm.br sidecars and Alpine nginx serves them under /assets with long-lived cache.
2026-10-30 23:32:16 +01:00
nobswebdev a5f6afdc22 Merge pull request 'Slave/ui polishing' (#13) from slave/ui-polishing into master
Reviewed-on: #13
2026-10-30 19:49:54 +00:00
nobswebdev 26899fdf66 add full-page drag hint overlay for file drop on upload. 2026-10-30 20:43:18 +01:00
nobswebdev 88bc0111de reorder about page sections with host comparison first.
Move comparison table after the intro and put Compare hosts first in section nav.
2026-10-30 19:07:45 +01:00
nobswebdev 946cf21110 add preview thumbnail to metadata inspector and share links.
Reuse queue object URLs in UploadPanelHeader for the selected row.
2026-10-30 18:54:56 +01:00
nobswebdev 1298e05010 show metadata inspector tabs when strip fails.
Use MetadataTabBody to drive Original and Stripped tab content when strip fails after a successful read.
2026-10-30 18:37:02 +01:00
nobswebdev 19a8feff19 add not-found handling to ZK and hotlink viewer pages.
Rename ViewerView and view store to ZkViewerView and useZkViewStore; unify hotlink load and ZK unlock error copy.
2026-10-30 17:43:29 +01:00
nobswebdev bb08bb389f make upload and metadata UI responsive on mobile.
Improve narrow-viewport layout for upload, About, and shell overflow; keep modal scroll without extra dismiss or a11y markup changes.
2026-10-30 16:23:09 +01:00
nobswebdev 938229eeea add thumbnail preview for each queued image.
Create and revoke blob URLs on pick and session reset; reset upload session on view unmount.
2026-10-29 22:31:04 +01:00
nobswebdev 9cc73e0dc5 replace upload dropzone with global intake controls.
Window drag-drop and paste share the same pick path as the file chooser; configure modal lives in the intake component.
2026-10-29 21:40:07 +01:00
nobswebdev ebe8b9aa2f fix app shell layout so footer stays visible on short pages.
Replace min-h-screen on viewer and delete mains with flex-1 inside a growing router outlet.
2026-10-29 19:52:47 +01:00
nobswebdev ec072f7dda simplify configure upload modal share mode copy.
Short hints per mode with Learn more links to About anchors in a new tab.
2026-10-29 19:52:47 +01:00
nobswebdev e07049dda9 update about flow diagrams and align prose width with comparison table.
Refreshed stripped JPEGs and removed max-w-3xl so sections use the full max-w-5xl main column.
2026-10-29 18:58:37 +01:00
nobswebdev 1df2e6a4f7 add site footer with source links and author credit.
Hardcoded clearnet and onion repository URLs; instance links omitted for Onion-Location.
2026-10-29 18:58:37 +01:00
nobswebdev fa1c2abb51 add about page with features and competitor comparison.
Includes section nav, flow diagrams with lightbox, comparison table, brand theme tokens, and router hash scroll.
2026-10-29 18:14:18 +01:00
nobswebdev eed17c9aab add top navigation with logo upload and about links.
Shared app header in the layout shell and upload main area flex fix for the new chrome.
2026-10-29 18:14:15 +01:00
nobswebdev 80497177f8 Merge pull request 'Slave/prod deploy' (#12) from slave/prod-deploy into master
Reviewed-on: #12
2026-10-28 23:22:14 +00:00
nobswebdev adb1d7bca9 Fix Onion-Location on SPA responses behind nginx add_header.
Render the header inside location / so it is not dropped by other location headers; remove the ineffective server-level directive.
2026-10-28 23:12:08 +01:00
nobswebdev b97fcc2b20 Add CSP sandbox on nginx hotlink image responses.
Block script in user content when /i/ is opened as a document, e.g. SVG opened in a tab.
2026-10-28 22:38:28 +01:00
nobswebdev 4a534a8007 Add production deployment guide and restrict CORS to development.
Document clearnet, TLS, and Tor setup; enable Nest CORS only in development and skip CORS_ORIGINS validation in production.
2026-10-28 22:07:32 +01:00
nobswebdev 915d62f09a Trust nginx proxy and drop hotlink response headers from Nest.
Rate limits use X-Forwarded-For behind prod nginx; hotlink security headers are set on /i/ in nginx only.
2026-10-28 20:56:21 +01:00
nobswebdev cb37a1e23c Add prod nginx image with clearnet, onion, and SPA build.
Multi-stage frontend embed, envsubst entrypoint for TLS vhosts and upload body limits, shared locations with minimal response headers and zero access logs.
2026-10-28 20:56:21 +01:00
nobswebdev 4385a024a8 Add prod compose and backend production image.
Wire postgres, pgadmin, backend, nginx, and tor with nullcart-style layout; document clearnet and onion hostname env vars for deploy.
2026-10-28 20:56:05 +01:00
nobswebdev f5024b84d8 Merge pull request 'Slave/lifecycle' (#11) from slave/lifecycle into master
Reviewed-on: #11
2026-10-27 21:12:03 +00:00
nobswebdev 214fa0f875 Enforce maxViews atomically when reserving a view slot.
Use a conditional UPDATE with parenthesized OR so increment only applies to the target row and fails when the view cap is reached.
2026-10-27 22:09:48 +01:00
nobswebdev 3cf1d5e8aa Fix drop lastViewedAt migration order for fresh databases.
Run the column drop after AddUploadTable so TypeORM does not execute ALTER before uploads exists.
2026-10-27 22:09:45 +01:00
nobswebdev 29407814cc Add UploadCleanupService for cron purge and delete uploads.
Move token delete and storage purge off UploadService; enforce expiry and max views on GET without purging until the scheduled cleanup job runs.
2026-10-27 21:07:01 +01:00
nobswebdev 00ef845277 Add DeleteView one-click delete page at /d/:id?token=... 2026-10-27 19:13:40 +01:00
nobswebdev c147a010b5 Enforce max views on access and purge after the last allowed view. 2026-10-27 18:30:35 +01:00
nobswebdev 9a2bc67b1d Reject expired uploads on ZK and hotlink GET with 404.
Use dayjs to compare expiresAt before reading storage or incrementing view_count.
2026-10-27 15:30:03 +01:00
nobswebdev 481eb0bcd6 Add DELETE /api/uploads/:id with delete_token and unlink ciphertext.
Return 204 when the token hash matches; ignore missing files on unlink so the row is still removed.
2026-10-27 15:19:25 +01:00
nobswebdev 073e6ac1f2 Increment view_count after successful ZK and hotlink GETs.
Bump count only when ciphertext or decrypted image is ready; 404 paths do not increment. Cover both flows in UploadService tests.
2026-10-27 15:06:26 +01:00
nobswebdev cb8a6a800d Drop lastViewedAt from uploads because inactivity cleanup is out of scope.
Add a migration and remove the column from the Upload entity.
2026-10-27 14:55:27 +01:00
nobswebdev eda4b8af6e Merge pull request 'Slave/hotlink serve' (#10) from slave/hotlink-serve into master
Reviewed-on: #10
2026-10-27 13:25:53 +00:00
nobswebdev 6407b64f26 Derive API origin from VITE_API_BASE_URL for hotlink image src.
Nest api config (baseUrl + baseUrlRoot) so dev cross-origin /i requests work without a separate app-env flag.
2026-10-27 14:03:30 +01:00
nobswebdev dfc52749b2 Add hotlink viewer page at /h/:id/:secret. 2026-10-26 23:06:28 +01:00
nobswebdev bf36b1d2aa Restrict hotlink mimeType to image/* and harden image responses. 2026-10-26 23:06:23 +01:00
nobswebdev 5db90f02c5 Add GET /i/:id/:secret hotlink image decrypt stream. 2026-10-26 21:47:30 +01:00
nobswebdev 4517fe906a Merge pull request 'Slave/zk viewer' (#9) from slave/zk-viewer into master
Reviewed-on: #9
2026-10-26 19:24:05 +00:00
nobswebdev 82cdb6ffa3 Clear ZK viewer secrets and image blob when leaving the page. 2026-10-26 20:22:47 +01:00
nobswebdev dc8e576679 add password prompt to ZK viewer for wrapped uploads 2026-10-26 20:06:54 +01:00
nobswebdev 112aa99f1e add ViewerView decrypt from URL fragment via view store 2026-10-26 19:13:15 +01:00
nobswebdev 65bbc4537b add GET /api/uploads/:id for zk ciphertext JSON
Expose ZK ciphertext and wrap fields for the viewer; return 404 for
missing, non-zk, or absent storage. Use injected upload repository and
shared isErrorEnoent for missing files.
2026-10-26 02:11:57 +01:00
nobswebdev 6aa9c7cd61 Merge pull request 'Slave/upload ui' (#8) from slave/upload-ui into master
Reviewed-on: #8
2026-10-25 22:43:56 +00:00
nobswebdev 7b70788dcf Point hotlink viewer links at the viewer page path.
Hotlink share links were using the zero-knowledge viewer URL. The direct image URL stays separate for embeds.
2026-10-25 23:39:33 +01:00
nobswebdev ee9f80da5f Remove unused resolveAxiosErrorMessage helper.
Upload UI uses predefined queue messages only; surfacing API response text is out of scope for this PR.
2026-10-25 22:23:01 +01:00
nobswebdev 42fe209164 Simplify upload modal, dropzone, and settings markup.
Remove redundant dialog ARIA wiring, hide the file input with hidden instead of sr-only, and trim footnote accessibility attributes that duplicated visible text.
2026-10-25 22:00:16 +01:00