openvibers/openvibe.meme Commits
openvibe-shared v4.80.0 (was v4.79.0) (#44)
Changes
@@@ -127,7 +127,7 @@ Environment variable names are in [.env.example](.env.example); no value is comm- **PostgreSQL** — `DATABASE_URL` (through PgBouncer) and `DATABASE_DIRECT_URL` (migrations); embedded PGlite in`MEME_PGLITE_DIR` for development.- **Valkey** — optional `VALKEY_URL`, `VALKEY_PREFIX` (readiness lists it; the limits in v1 count in-process).--- **Packages** — `openvibe-contracts` v0.229.0, `openvibe-sdk` v0.74.0, `openvibe-shared` v4.79.0, the same++- **Packages** — `openvibe-contracts` v0.229.0, `openvibe-sdk` v0.74.0, `openvibe-shared` v4.80.0, the sametags OpenVibe.Today pins.## API@@@ -377,5 +377,5 @@ AGPL-3.0-only. See [LICENSE](LICENSE).<!-- versions:start -->- openvibe-contracts: v0.234.0- openvibe-sdk: v0.78.0--- openvibe-shared: v4.79.0++- openvibe-shared: v4.80.0<!-- versions:end -->@@@ -4,17 +4,17 @@"stage": "product","code": true,"wave": "W21",-- "plan": "OpenVibe.Meme: the open meme database rebuilt with AI \u2014 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",++ "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.234.0","sdk": "openvibe-sdk v0.78.0",-- "shared": "openvibe-shared v4.79.0",++ "shared": "openvibe-shared v4.80.0","packages": ["openvibe-contracts v0.234.0","openvibe-sdk v0.78.0",-- "openvibe-shared v4.79.0"++ "openvibe-shared v4.80.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": [@@@ -31,14 +31,14 @@"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 \u22652 uses on \u22652 days; hidden candidates only, never a publish",-- "Daily citation re-verification: 404/410 \u2192 gone, 401/403 \u2192 hidden, the origin gone hides the entry, a transient 5xx changes nothing",++ "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/<slug>) 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\u20134 lines \u00d7 120 characters, a blocked-word list, server-rendered HTML preview, text lines stored in jsonb",++ "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/<slug>) in meme_outbox, with a tombstone when an entry is hidden","Sign-in with OpenVibe.Network (PKCE S256, meme_at/meme_rt/meme_oauth), staff role global_mod+",@@@ -18,7 +18,7 @@"opentype.js": "^1.3.4","openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.234.0","openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.78.0",-- "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.79.0",++ "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.80.0","pg": "^8.23.0","sharp": "^0.33.5"},@@@ -1675,9 +1675,9 @@}},"node_modules/openvibe-shared": {-- "version": "4.79.0",-- "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.79.0",-- "integrity": "sha512-GYFDzpScBPYum5KABxeJJHkZmBJM+J1jIB9VnaSm7rZFjGVToKLWztSogZQMgdP06lRVf3oYS+jLFG/dpae+hQ==",++ "version": "4.80.0",++ "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.80.0",++ "integrity": "sha512-UtwFy57V2MuYnRzeFDJHeycpR6cOksOueqRCe2gM8ydPCzcFgIKtfNIhB2tFeXbrARvO8hW5Bj959asLiBhWAg==","license": "MIT","dependencies": {"jsonwebtoken": "^9.0.0",@@@ -29,7 +29,7 @@"opentype.js": "^1.3.4","openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.234.0","openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.78.0",-- "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.79.0",++ "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.80.0","pg": "^8.23.0","sharp": "^0.33.5"},
@@ -127,7 +127,7 @@ Environment variable names are in [.env.example](.env.example); no value is comm
@@ -127,7 +127,7 @@ Environment variable names are in [.env.example](.env.example); no value is comm
- **PostgreSQL** — `DATABASE_URL` (through PgBouncer) and `DATABASE_DIRECT_URL` (migrations); embedded PGlite in
- **PostgreSQL** — `DATABASE_URL` (through PgBouncer) and `DATABASE_DIRECT_URL` (migrations); embedded PGlite in
`MEME_PGLITE_DIR` for development.
`MEME_PGLITE_DIR` for development.
- **Valkey** — optional `VALKEY_URL`, `VALKEY_PREFIX` (readiness lists it; the limits in v1 count in-process).
- **Valkey** — optional `VALKEY_URL`, `VALKEY_PREFIX` (readiness lists it; the limits in v1 count in-process).
-- **Packages** — `openvibe-contracts` v0.229.0, `openvibe-sdk` v0.74.0, `openvibe-shared` v4.79.0, the same
+- **Packages** — `openvibe-contracts` v0.229.0, `openvibe-sdk` v0.74.0, `openvibe-shared` v4.80.0, the same
tags OpenVibe.Today pins.
tags OpenVibe.Today pins.
## API
## API
@@ -377,5 +377,5 @@ AGPL-3.0-only. See [LICENSE](LICENSE).
@@ -377,5 +377,5 @@ AGPL-3.0-only. See [LICENSE](LICENSE).
<!-- versions:start -->
<!-- versions:start -->
- openvibe-contracts: v0.234.0
- openvibe-contracts: v0.234.0
- openvibe-sdk: v0.78.0
- openvibe-sdk: v0.78.0
-- openvibe-shared: v4.79.0
+- openvibe-shared: v4.80.0
<!-- versions:end -->
<!-- versions:end -->
@@ -4,17 +4,17 @@
@@ -4,17 +4,17 @@
"stage": "product",
"stage": "product",
"code": true,
"code": true,
"wave": "W21",
"wave": "W21",
- "plan": "OpenVibe.Meme: the open meme database rebuilt with AI \u2014 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",
+ "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",
"runtime": "node 22, express 4, PostgreSQL 18 (openvibe-sdk/db, async) + Valkey 9",
"port": "5120",
"port": "5120",
"domain": "openvibe.meme",
"domain": "openvibe.meme",
"contracts": "openvibe-contracts v0.234.0",
"contracts": "openvibe-contracts v0.234.0",
"sdk": "openvibe-sdk v0.78.0",
"sdk": "openvibe-sdk v0.78.0",
- "shared": "openvibe-shared v4.79.0",
+ "shared": "openvibe-shared v4.80.0",
"packages": [
"packages": [
"openvibe-contracts v0.234.0",
"openvibe-contracts v0.234.0",
"openvibe-sdk v0.78.0",
"openvibe-sdk v0.78.0",
- "openvibe-shared v4.79.0"
+ "openvibe-shared v4.80.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.",
"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": [
"works": [
@@ -31,14 +31,14 @@
@@ -31,14 +31,14 @@
"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)",
"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",
"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",
"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 \u22652 uses on \u22652 days; hidden candidates only, never a publish",
- "Daily citation re-verification: 404/410 \u2192 gone, 401/403 \u2192 hidden, the origin gone hides the entry, a transient 5xx changes nothing",
+ "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",
"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",
"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 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",
"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/<slug>) with scope/labels facets and the origin as provenance, in meme_outbox, with a tombstone when an entry is hidden",
"Search Fabric documents (owner meme, type entry, /m/<slug>) 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\u20134 lines \u00d7 120 characters, a blocked-word list, server-rendered HTML preview, text lines stored in jsonb",
+ "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",
"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/<slug>) in meme_outbox, with a tombstone when an entry is hidden",
"Search Fabric documents (owner meme, type entry, /m/<slug>) in meme_outbox, with a tombstone when an entry is hidden",
"Sign-in with OpenVibe.Network (PKCE S256, meme_at/meme_rt/meme_oauth), staff role global_mod+",
"Sign-in with OpenVibe.Network (PKCE S256, meme_at/meme_rt/meme_oauth), staff role global_mod+",
@@ -18,7 +18,7 @@
@@ -18,7 +18,7 @@
"opentype.js": "^1.3.4",
"opentype.js": "^1.3.4",
"openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.234.0",
"openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.234.0",
"openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.78.0",
"openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.78.0",
- "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.79.0",
+ "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.80.0",
"pg": "^8.23.0",
"pg": "^8.23.0",
"sharp": "^0.33.5"
"sharp": "^0.33.5"
},
},
@@ -1675,9 +1675,9 @@
@@ -1675,9 +1675,9 @@
}
}
},
},
"node_modules/openvibe-shared": {
"node_modules/openvibe-shared": {
- "version": "4.79.0",
- "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.79.0",
- "integrity": "sha512-GYFDzpScBPYum5KABxeJJHkZmBJM+J1jIB9VnaSm7rZFjGVToKLWztSogZQMgdP06lRVf3oYS+jLFG/dpae+hQ==",
+ "version": "4.80.0",
+ "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.80.0",
+ "integrity": "sha512-UtwFy57V2MuYnRzeFDJHeycpR6cOksOueqRCe2gM8ydPCzcFgIKtfNIhB2tFeXbrARvO8hW5Bj959asLiBhWAg==",
"license": "MIT",
"license": "MIT",
"dependencies": {
"dependencies": {
"jsonwebtoken": "^9.0.0",
"jsonwebtoken": "^9.0.0",
@@ -29,7 +29,7 @@
@@ -29,7 +29,7 @@
"opentype.js": "^1.3.4",
"opentype.js": "^1.3.4",
"openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.234.0",
"openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.234.0",
"openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.78.0",
"openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.78.0",
- "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.79.0",
+ "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.80.0",
"pg": "^8.23.0",
"pg": "^8.23.0",
"sharp": "^0.33.5"
"sharp": "^0.33.5"
},
},