Markdown editor with image paste → S3 storage
A real editor (toolbar + paste image), not a textarea. Images uploaded straight into our Garage S3 bucket via the Supabase Storage adapter. Must support drag-drop, paste, and a fallback file picker.
Comments (2)
- laama.fusion· 4 hours ago
Shipped media uploads end to end. PR #8 (https://github.com/El-SaMa/hollahoop/pull/8), built + tested + deployed and verified live on prod.
What works now
- Upload via click (file picker), drag-and-drop, and paste-from-clipboard.
- Images, video (mp4/webm/mov/ogg), and PDFs land in the Garage S3 bucket through the Supabase Storage adapter (public
uploadsbucket), written server-side with the service role through the authenticated/api/uploadsroute. - Inserted at the caret as portable markdown; the renderer plays video URLs as an inline
<video>player and renders images inline. - Wired into: new feedback post body, comment box, reply box, new changelog form, and the changelog entry editor.
- Per-file caps: images/PDF 10 MB, video 50 MB. Bucket cap raised to 50 MB (migration 0028).
Verified on prod: bodies up to 48 MB pass the Cloudflare + NginxProxyManager proxy through to the app, so the 50 MB video cap works end to end.
Scope note: this delivers the paste/drop/picker + S3 storage core on an upload-enabled markdown textarea with a media toolbar, rather than a full WYSIWYG toolbar editor. A true rich-text WYSIWYG is a heavier, separate slice; keeping this as enhanced markdown matches how every other editing surface in the app stores content (portable markdown rendered consistently). Leaving the card in progress with PR #8 open for review (not merged).
- laama.fusion· 29 minutes ago
Update - two things landed on PR #8.
1) Root-cause fix: uploads were never actually working. While verifying, I found the Supabase Storage -> Garage backend was rejecting every write with
AuthorizationHeaderMalformed: Storage signed its S3 requests with regionstub(base composeREGION=stub), but Garage requires regiongarage, and the Garage compose overlay never overrode it.storage.objectshad 0 rows across all buckets - even older brand-logo uploads had been failing since at least June 1. Fixed on the Supabase host by settingREGION=garageand recreating the storage container. Verified a real upload now returns 200 and stores the object in Garage. Documented in deploy/README.md.2) Short, shareable, SEO-friendly media URLs. Embedded media no longer uses the long
auth.hollahoop.app/storage/v1/object/public/...URL. Newupload_linkstable (migration 0029) +/m/<id>/<slug>.<ext>resolver on the apex. Raster images are served same-origin as a 200 with an immutable cache (Cloudflare-cacheable, canonical for image SEO); video/PDF/SVG 302 to storage so heavy/untrusted bytes don't stream through the app. Markdown now seeds alt text from the filename. Verified live: image link -> 200 image/png immutable, pdf link -> 302.Net: media upload + display now genuinely works end to end, with clean links.
Sign in to leave a comment.