{ "repository": "OpenVibers/OpenVibe.Meme", "version": "0.1.0", "stage": "product", "code": true, "wave": "W21", "plan": "OpenVibe.Meme: the open meme database rebuilt with AI — entries built from OpenVibe's own running jokes, each cited to the moment it happened, a timeline of later uses, a status, meme of the week and a caption generator on templates", "runtime": "node 22, express 4, PostgreSQL 18 (openvibe-sdk/db, async) + Valkey 9", "port": "5120", "domain": "openvibe.meme", "contracts": "openvibe-contracts v0.419.0", "sdk": "openvibe-sdk v0.161.0", "shared": "openvibe-shared v4.237.0", "packages": [ "openvibe-contracts v0.419.0", "openvibe-sdk v0.161.0", "openvibe-shared v4.237.0" ], "summary": "OpenVibe.Meme is the open meme encyclopedia, rebuilt with AI. Internet entries carry an origin citation, spread points, variations, Media examples, meaning, L1 labels, related memes and a moderated revision history; OpenVibe's own running jokes keep the original importer. The importer reads only public Chat and Live APIs and proposes a candidate when a recurring phrase appears in at least two uses on two different days; the candidate is born hidden with a verbatim citation for every use and stays hidden until a staff person publishes it. Every citation is re-verified daily, a 404 marks it gone and an entry whose origin is gone is hidden. People vote once a week for meme of the week, and a caption is plain text over a template, never a rendered image. Trends come from Reddit's official API (no scraping), measured by score samples and perceptual hashes. Every public entry is one Search Fabric document queued in the service's outbox. Deep dives gather sources and fail unless every claim is cited. The generator renders real PNGs from the template's own layout and stores them in Media.", "works": [ "Entries with a unique slug, kind, AI summary stored as written (L24: no looks filter), status and status history, first/last seen, visibility and a revision that goes up on every change", "The encyclopedia (M2): scope openvibe/internet, an origin with a public citation, spread points (date, place, URL, count), variations, Media examples, meaning/usage, L1 labels, related memes", "Wiki-style revisions: a signed-in proposal is hidden and pending; staff approve or reject it, an approval copies the diff onto the entry and re-indexes it", "Trends (M3): Reddit's official API for r/memes, r/dankmemes, r/MemeEconomy and r/wholesomememes; a score sample per post, upvote velocity, dHash new-template clusters, and a disabled Sources registry row", "GET /api/v1/trends?window=day|week: rising posts with velocity, new templates and the public entries used in the window", "Entries with a unique slug, kind, AI summary passing noLooks, status and status history, first/last seen, visibility and a revision that goes up on every change", "Analyse (M4): POST /api/v1/analyze {url|media_id} runs OpenVibe.AI's vision call and one structured extraction; template, matched entries, origin guesses with confidence, meaning/usage, L1 labels, and a Reddit URL's spread and comments tone", "The daily AI budget: calls reserved before a run and the run's stated cost recorded in meme_ai_usage; 429 meme.ai_budget when spent", "Deep dives (M5): POST /api/v1/research starts a job that gathers an evidence pack with research.gather and writes a cited Markdown long read with ai.generate; every paragraph must cite a numbered source or the job fails as ungrounded", "A succeeded read can be saved as a public deep-dive entry; GET /entries/:slug/deep-dive serves its full text and sources", "The generator (M6): POST /api/v1/generate {template_slug|topic, lines?} researches current uses with research.gather, writes captions and L1 labels with ai.extract, and renders a PNG server-side from the template's own layout and bundled DejaVu fonts (outline, wrap, per-box alignment)", "Generated PNGs are stored in OpenVibe.Media; the caption row keeps its labels and media_id; generation has its own daily call/cost budget", "Citations with role origin/use/example, verbatim quote and sha256, canonical OpenVibe.Video URL, VOD seconds, observed time and source_status live/hidden/gone", "The public importer: Chat history/timeline, Rundown topics and segments, VOD transcripts; a recurring phrase across ≥2 uses on ≥2 days; hidden candidates only, never a publish", "Daily citation re-verification: 404/410 → gone, 401/403 → hidden, the origin gone hides the entry, a transient 5xx changes nothing", "The fixed deny list: VOD 5709 and clip 483 are never cited, cached or rendered", "Meme of the week: ISO weeks, one ballot per week and person, a second vote changes the choice", "The caption generator: a template, 1–4 lines × 120 characters, a blocked-word list, server-rendered HTML preview, text lines stored in jsonb", "The API: public entries filtered by scope/q/status/label and sorted newest or top-this-week per channel (Live), an entry with origin/citations/spread/variations/examples/related/revisions, a zero-filled use series, trending, the week, templates, captions, reports, proposals and staff publish/hide/patch/review", "Search Fabric documents (owner meme, type entry, /m/) with scope/labels facets and the origin as provenance, in meme_outbox, with a tombstone when an entry is hidden", "The caption generator: a template, 1–4 lines × 120 characters, a blocked-word list, server-rendered HTML preview, text lines stored in jsonb", "The API: public cursor-paged entries, an entry with citations and timeline, a zero-filled use series, trending, the week, templates, captions, reports, and staff publish/hide/patch", "Search Fabric documents (owner meme, type entry, /m/) in meme_outbox, with a tombstone when an entry is hidden, delivered to Search's owner API by openvibe-publishing/search-relay", "Sign-in with OpenVibe.Network (PKCE S256, meme_at/meme_rt/meme_oauth), staff role global_mod+", "Account export and deletion over votes, captions and reports", "Server-rendered pages with stable mm- ids/classes, cache headers, discovery artifacts and deploy files" ], "notYet": [ "A per-message Chat permalink API; a chat citation stores the message id and the public history is re-read to verify it", "Automatic status transitions by the proposed rising/peaked/classic/dead rules; the importer sets a first status and staff can change it", "Real template artwork: v1 ships three data-free local SVG placeholders; a real template is an openvibe.media object", "A staff moderation screen beyond the JSON queue (GET /api/v1/moderation/revisions); reports and revisions are stored and read through the API", "A cron/startup backfill of the proof beyond scripts/seed-proof.js" ], "capabilitiesRegistered": false, "serviceManifestRegistered": false, "deployed": false, "placeholderInSites": false, "features": [ "entries and citations", "encyclopedia entries (scope, origin, spread, variations, examples, meaning, labels, related)", "wiki-style revisions and staff moderation", "Live Memes API (top this week, per channel)", "Reddit trends (official API)", "upvote velocity and perceptual-hash template detection", "meme analysis (vision + structured AI)", "AI daily budget", "AI-researched deep dives with numbered citations", "research job queue and daily budget", "server-side meme generation with template layouts", "bundled open fonts and generated PNGs in Media", "hidden candidate importer", "citation re-verification and deny list", "meme of the week vote", "caption generator", "templates", "reports", "staff publish/hide/patch", "Search Fabric outbox", "account export and deletion", "Network sign-in", "server-rendered pages", "discovery", "deploy files" ], "deployment": "not deployed: the unit and nginx vhost are deploy/systemd/openvibe-meme.service and deploy/nginx/openvibe.meme.conf", "updated": "2026-11-13" }