secubox-deb/packages/secubox-billets/api
CyberMind-FR a95f157eb1 feat(billets): communiqué style + embed snapshot vignette + portable HTML archive (ref #851)
- Per-billet 'style' (default|communique). Communiqué permalink = the poster
  mockup (Space Grotesk/JetBrains Mono, ROUTE side-band, TRANSMISSION frame,
  slogans/footer); funky feed unchanged.
- Embed snapshot vignette: api/services/snapshot.py tries headless Chromium
  (guarded/optional), falls back to SSRF-guarded og:image, re-encoded via the
  media service. Captured off-loop on save (communiqué billets, cached per
  embed_url). Public render shows the vignette; click-to-load the live iframe.
- Portable single-HTML archive: GET /admin/billets/{id}/archive.html — self-
  contained (inlined CSS, system fonts, media+snapshot as base64 data-URIs,
  embed = snapshot linking to original, no iframe). Off-loop render.
- migration 0003 (style + embed_snapshot); models/repo/admin/main wired.
- CSP: style-src adds 'unsafe-inline' so the WAF-injected health-banner's
  dynamic <style> renders (was blocked → banner fell unstyled to page bottom);
  script-src stays 'self'. Google-Fonts relaxation page-scoped to communiqué.
- 118 tests (11 new: snapshot fallback/SSRF, communiqué render, archive self-containment).

Co-Authored-By: Gerald KERMA <devel@cybermind.fr>
2026-07-14 07:57:54 +02:00
..
migrations feat(billets): communiqué style + embed snapshot vignette + portable HTML archive (ref #851) 2026-07-14 07:57:54 +02:00
routes feat(billets): communiqué style + embed snapshot vignette + portable HTML archive (ref #851) 2026-07-14 07:57:54 +02:00
services feat(billets): communiqué style + embed snapshot vignette + portable HTML archive (ref #851) 2026-07-14 07:57:54 +02:00
static feat(billets): communiqué style + embed snapshot vignette + portable HTML archive (ref #851) 2026-07-14 07:57:54 +02:00
templates feat(billets): communiqué style + embed snapshot vignette + portable HTML archive (ref #851) 2026-07-14 07:57:54 +02:00
__init__.py feat(billets): step 1 — data layer (schema, models, db, ULID, chained event log) 2026-07-11 14:52:22 +02:00
asgi.py feat(billets): step 7 — ASGI entrypoint, systemd/nginx/debian deploy, README 2026-07-11 15:52:08 +02:00
db.py feat(billets): SecuBox webui panel + navbar integration 2026-07-11 16:19:35 +02:00
ids.py feat(billets): step 1 — data layer (schema, models, db, ULID, chained event log) 2026-07-11 14:52:22 +02:00
main.py feat(billets): communiqué style + embed snapshot vignette + portable HTML archive (ref #851) 2026-07-14 07:57:54 +02:00
manage.py feat(billets): step 7 — ASGI entrypoint, systemd/nginx/debian deploy, README 2026-07-11 15:52:08 +02:00
models.py feat(billets): communiqué style + embed snapshot vignette + portable HTML archive (ref #851) 2026-07-14 07:57:54 +02:00
repo.py feat(billets): communiqué style + embed snapshot vignette + portable HTML archive (ref #851) 2026-07-14 07:57:54 +02:00
seed.py feat(billets): step 2 — public feed + permalinks + gitea revision store 2026-07-11 15:02:17 +02:00