HoopStar HubContent

Review inbox Live

Everything that landed and hasn't been decided yet. The badge says where it came from: Parent Β· direct is a family uploading from their own phone through the challenge link, Parent Β· via sales is the same customer content forwarded by a rep, We made it is ours. The AI reviewer watches every upload and posts its findings as timestamped comments in the same thread you use β€” a human still makes the call.

Approved library Live

Everything reviewed and approved. This is what the rest of the system will read from later β€” reuse is deliberately not built yet; get people uploading and reviewing first.

Add content

A video or photo, and who it came from.

οΌ‹
Choose videos or photos
Up to 500 MB each Β· pick as many as you like
Source
Phone
Parent
Student
Tags β€” pick existing ones where you can
Remarks

Catalogue health Live

Computed live from MediaAssets / MediaAssetUsage / MediaAssetAnalysis on every load. These are the numbers that justify the tool existing β€” and kid assets with unknown consent is the one an ops check should watch trend down.

Loading…

What the numbers actually say

What is NOT built yet

βœ•
No WhatsApp auto-ingest.Uploading works, but only through this page. 86 catalogue rows are still named WhatsApp Video 2025-07-03 at 16.09.41, so content already arrives by WhatsApp β€” if uploads/rep stay near zero in week 1, that is the fix, and it must capture media at receive time.
βœ•
Repurposing / clips β€” deliberately not built.Cut deliberately on 2026-08-19: get people uploading and reviewing first. Reuse is worth building once this is actually being used, and not before β€” the schema columns are still in place for it.
βœ•
Not every row has a poster yet.The live counts are in the strip above β€” this is no longer a hardcoded claim. Posters come free from each source (Instagram's thumbnail_url, YouTube's i.ytimg.com, Meta's picture) and are cut with ffmpeg for recovered local files. Where one is missing the frame is drawn and labelled as a placeholder rather than left as a broken image.
βœ•
Versions are modelled but not populated.The columns and the per-version comment threading exist; nothing creates a v2 yet because that arrives with upload.
βœ•
Not frame-accurate scrubbing.Comments anchor to a timestamp and step at 1/30s. True frame stepping needs proxy transcode β€” a week of infra for a feature three people will use twice at 10–40 assets/week.
βœ•
Ops checks are specced, not running.Two PLANNED entries exist on the Operations dashboard β€” uploads in the last 7 days (zero-activity is the failure mode, not an error rate) and kid assets with unknown consent. Neither has a run yet, so nothing is actually watching.

What IS live

πŸ”΄
There is NO consent gate right now.Deferred 2026-08-19 with reuse. consent_scope is still written on every upload and defaults to unknown, but nothing refuses an approval and nothing checks it. Safe only because nothing downstream can pull from this library yet. Re-instate before it can β€” the check is one if in decide().
βœ…
Frame-anchored comments with an audit trail.Author is the hub session email, never client-supplied. Threads are scoped per version so a note on v1 cannot read as approval of v3.
βœ…
Real AI review, not a mock.Analysed assets carry a gemini-2.5-flash MediaAssetAnalysis row β€” transcript, best soundbite with timecodes, the parent objection it answers, and an ad verdict. The live coverage is in the strip above. Note where that coverage sits: it was run almost entirely on the parent testimonials that the 2026-08-20 sweep then shelved, and barely at all on the ad creatives that were approved β€” the analysis and the library were pointed at opposite halves of the catalogue.
βœ…
The 2026-08-20 shelving was reversed on 2026-08-22.352 rows had been moved to the reference shelf for having no playable file. The files were never lost β€” 292 of them were still on the machine that ran the original import, in local_path, and are now in the bucket. Everything HoopStar-branded came back to approved; every one of those rows had reviewed_by IS NULL, so no human decision was overwritten. The live split of what remains shelved is in the strip above β€” it is a mix of competitor scrapes and the other portfolio brands, and neither group is cleanly identified by company_name alone.
βœ…
Competitor scrapes are off the human queue.They sit in review_state='reference', excluded by construction rather than by a filter someone can forget, and cannot be approved or clipped.
βœ…
Least-privilege writes.content_writer holds no DELETE on MediaAssets, so a wrong reject archives rather than destroys. Verified: DELETE, and reads of Leads / Users / Enrollment, all error 1142 as this user.
βœ…
No silently truncated lists.Every list returns the true total and flags truncation. A search showing 200 rows says whether that is 200 of 200 or 200 of 431.