Hollahoop

HollaHoop

Markdown editor with image paste → S3 storage

In progress· by someone· 16 days ago

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 uploads bucket), written server-side with the service role through the authenticated /api/uploads route.
    • 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 region stub (base compose REGION=stub), but Garage requires region garage, and the Garage compose overlay never overrode it. storage.objects had 0 rows across all buckets - even older brand-logo uploads had been failing since at least June 1. Fixed on the Supabase host by setting REGION=garage and 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. New upload_links table (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.

HollahoopGet yours