gabriel / musehub public
Open
aaronrene aaronrene · 19 days ago

musehub#129: rich OG repo preview cards

Summary

Implements dynamic Open Graph preview cards for public repo links (musehub#129).

  • GET /{owner}/{repo}/opengraph-image — 1200×630 PNG via Playwright HTML→PNG
  • Content-hash cache in BlobBackend (objects/sha256:{hash})
  • Repo pages emit og:image / twitter:card=summary_large_image with ?cb= cache bust
  • base.html renders og_meta tags (property for OG, name for Twitter)

Test plan

  • Local Docker: http://localhost:1337/aaronrene/musehub/opengraph-image → 200 PNG 1200×630
  • Local repo page meta tags include og:image + ?cb=
  • OG_01–OG_06 pytest (local harness DB auth issue — app path verified manually)
  • Facebook Sharing Debugger on https://staging.musehub.ai/gabriel/muse after merge (Phase 3b acceptance)

Notes

  • Dockerfile adds Chromium + libcairo (cairosvg for avatar rasterization)
  • Stars omitted from card stats (no star_count on repos yet)
  • Please self-assign reviewer if collaborator self-assign 403s

Closes musehub#129 (pending debugger screenshot post-deploy).

Symbol Delta

177 symbols
143 added 34 modified
docs/issues/opengraph-repo-cards-design.md 33
+ musehub#129 — Open Graph repo cards (Phase 1 design)
+ musehub#129 — Open Graph repo cards (Phase 1 design).Decision 1 — Rendering approach
+ musehub#129 — Open Graph repo cards (Phase 1 design).Decision 1 — Rendering approach.Avatar embedding
+ musehub#129 — Open Graph repo cards (Phase 1 design).Decision 1 — Rendering approach.Chosen: HTML template → headless Chromium screenshot (Playwright)
+ musehub#129 — Open Graph repo cards (Phase 1 design).Decision 1 — Rendering approach.Chosen: HTML template → headless Chromium screenshot (Playwright).table
+ musehub#129 — Open Graph repo cards (Phase 1 design).Decision 1 — Rendering approach.Font strategy (amended)
+ musehub#129 — Open Graph repo cards (Phase 1 design).Decision 1 — Rendering approach.Runtime lifecycle (amended)
+ musehub#129 — Open Graph repo cards (Phase 1 design).Decision 2 — Card layout
+ musehub#129 — Open Graph repo cards (Phase 1 design).Decision 2 — Card layout.Fallbacks
+ musehub#129 — Open Graph repo cards (Phase 1 design).Decision 2 — Card layout.Fallbacks.table
+ musehub#129 — Open Graph repo cards (Phase 1 design).Decision 2 — Card layout.Fields and data sources
+ musehub#129 — Open Graph repo cards (Phase 1 design).Decision 2 — Card layout.Fields and data sources.table
+ musehub#129 — Open Graph repo cards (Phase 1 design).Decision 2 — Card layout.Wireframe (1200×630)
+ musehub#129 — Open Graph repo cards (Phase 1 design).Decision 2 — Card layout.Wireframe (1200×630).code
+ musehub#129 — Open Graph repo cards (Phase 1 design).Decision 3 — Caching
+ musehub#129 — Open Graph repo cards (Phase 1 design).Decision 3 — Caching.Crawler cache busting (amended — Phase 3)
+ musehub#129 — Open Graph repo cards (Phase 1 design).Decision 3 — Caching.Crawler cache busting (amended — Phase 3).code
+ musehub#129 — Open Graph repo cards (Phase 1 design).Decision 3 — Caching.Strategy: content-hash key + BlobBackend persistence
+ musehub#129 — Open Graph repo cards (Phase 1 design).Decision 3 — Caching.Strategy: content-hash key + BlobBackend persistence.code
+ musehub#129 — Open Graph repo cards (Phase 1 design).Decision 3 — Caching.Strategy: content-hash key + BlobBackend persistence.code[json]
+ musehub#129 — Open Graph repo cards (Phase 1 design).Decision 4 — Routing and wiring
+ musehub#129 — Open Graph repo cards (Phase 1 design).Decision 4 — Routing and wiring.Endpoint
+ musehub#129 — Open Graph repo cards (Phase 1 design).Decision 4 — Routing and wiring.New endpoint.code
+ musehub#129 — Open Graph repo cards (Phase 1 design).Decision 4 — Routing and wiring.Phase 3 — base.html meta tags (amended)
+ musehub#129 — Open Graph repo cards (Phase 1 design).Decision 4 — Routing and wiring.Phase 3 — base.html meta tags (amended).code[html]
+ musehub#129 — Open Graph repo cards (Phase 1 design).Decision 4 — Routing and wiring.Phase 3 — ui_repo.py
+ musehub#129 — Open Graph repo cards (Phase 1 design).Docker amendments
+ musehub#129 — Open Graph repo cards (Phase 1 design).Goal
+ musehub#129 — Open Graph repo cards (Phase 1 design).Problem (verified in code)
+ musehub#129 — Open Graph repo cards (Phase 1 design).Problem (verified in code).table
+ musehub#129 — Open Graph repo cards (Phase 1 design).Review checklist
+ musehub#129 — Open Graph repo cards (Phase 1 design).Test matrix
+ musehub#129 — Open Graph repo cards (Phase 1 design).Test matrix.table
musehub/api/routes/musehub/__init__.py 1
musehub/api/routes/musehub/_ui_helpers.py 1
musehub/api/routes/musehub/ui_repo.py 1
musehub/config.py 1
~ Settings breaking
musehub/rate_limits.py 1
musehub/templates/musehub/base.html 1
~ footer@46 breaking
musehub/templates/musehub/opengraph/repo_card.html 1
pyproject.toml 2

Files Changed

16 of 1,036
A docs/issues/opengraph-repo-cards-design.md
A musehub/api/routes/musehub/ui_opengraph.py
A musehub/services/opengraph_cards.py
A musehub/services/opengraph_renderer.py
A musehub/templates/musehub/opengraph/repo_card.html
A tests/test_opengraph_repo_cards.py
M Dockerfile
M musehub/api/routes/musehub/__init__.py
M musehub/api/routes/musehub/_ui_helpers.py
M musehub/api/routes/musehub/ui_repo.py
M musehub/config.py
M musehub/main.py
M musehub/rate_limits.py
M musehub/templates/musehub/base.html
M pyproject.toml
M requirements.txt

Commits

2
feat
feat(musehub#129): OG repo preview cards — endpoint, cache, meta wiring Phase 2–3:...
aaronrene · 19 days ago
docs
docs(musehub#129): freeze Phase 1 OG repo card design Rendering (Playwright...
aaronrene · 19 days ago

Divergence Analysis

feat/opengraph-repo-cards → dev
0%
0% divergence
Very compatible — minimal differences

Review comments

0

No review comments yet

Be the first to leave a review comment on this merge proposal.

Muse CLI

Comment muse hub proposal comment create sha256:9c735192f00fe8ad15fe5c4fbf32b7af43966f93f8a44baea6eebfbdfa365822 --body "…"
Approve muse hub proposal review submit sha256:9c735192f00fe8ad15fe5c4fbf32b7af43966f93f8a44baea6eebfbdfa365822 --verdict approve
Request changes muse hub proposal review submit sha256:9c735192f00fe8ad15fe5c4fbf32b7af43966f93f8a44baea6eebfbdfa365822 --verdict request_changes --body "…"
Close muse hub proposal close sha256:9c735192f00fe8ad15fe5c4fbf32b7af43966f93f8a44baea6eebfbdfa365822
Merge muse hub proposal merge sha256:9c735192f00fe8ad15fe5c4fbf32b7af43966f93f8a44baea6eebfbdfa365822 --hub http://staging.musehub.ai