openvibers/openvibe.meme .env.example
.env.example
| 1 | # OpenVibe.Meme — environment (production: /etc/openvibe/meme.env). Names only; never commit values. |
| 2 | |
| 3 | NODE_ENV=production |
| 4 | PORT=5120 |
| 5 | HOST=127.0.0.1 |
| 6 | BASE_URL=https://openvibe.meme |
| 7 | TRUST_PROXY=2 |
| 8 | # PostgreSQL (ADR-035), written by OpenVibe.Host roles/data/add-service.sh: the runtime role through PgBouncer, |
| 9 | # the owner on a direct connection (migrations), and Valkey (shared limit counters). |
| 10 | # Without DATABASE_URL, development uses an embedded PGlite database in data/pglite. |
| 11 | DATABASE_URL= |
| 12 | DATABASE_DIRECT_URL= |
| 13 | VALKEY_URL= |
| 14 | VALKEY_PREFIX=ov:meme: |
| 15 | # Per-actor limits (server/http/api.js) and per-address limits (server/app.js). |
| 16 | #MEME_LIMITS_MINUTE=120 |
| 17 | #MEME_LIMITS_HOUR=3000 |
| 18 | #MEME_API_RATE_LIMIT_PER_MIN=240 |
| 19 | #MEME_RATE_LIMIT_PER_MIN=300 |
| 20 | |
| 21 | # OpenVibe.Network: SSO (OAuth client `meme`, PKCE S256) and its JWKS; app tokens for audience openvibe.meme. |
| 22 | OV_NETWORK_URL=https://openvibe.network |
| 23 | OV_NETWORK_INTERNAL_URL=http://127.0.0.1:4000 |
| 24 | # OV_NETWORK_ISSUER=https://openvibe.network |
| 25 | OV_OAUTH_CLIENT_ID=meme |
| 26 | OV_OAUTH_CLIENT_SECRET= |
| 27 | # OV_OAUTH_REDIRECT_URI=https://openvibe.meme/auth/callback |
| 28 | # MEME_AUDIENCE=openvibe.meme |
| 29 | # OV_SESSION_AUDIENCE=openvibe.network |
| 30 | # MEME_PGLITE_DIR=./data/pglite |
| 31 | |
| 32 | # OpenVibe.Events: account export/deletion deliveries to POST /internal/events. The secret signs a delivery |
| 33 | # (comma-separated for rotation, 32+ characters each; unset makes the route answer 503). |
| 34 | MEME_EVENTS_SECRET= |
| 35 | MEME_EVENTS_URL= |
| 36 | # Relay queued public caption events after Contracts #444 is released and Events accepts the topic. |
| 37 | MEME_CAPTION_EVENTS_ENABLED=off |
| 38 | #MEME_EVENTS_ENDPOINT=http://127.0.0.1:5120/internal/events |
| 39 | # OpenVibe.Search's owner API: the queued Search documents (meme_outbox) are delivered there. Unset: they wait. |
| 40 | #MEME_SEARCH_URL=http://127.0.0.1:4710 |
| 41 | #MEME_EVENTS_INTERVAL_MS=5000 |
| 42 | |
| 43 | # The public APIs the importer and the citation re-verifier read. No service grant is used for them. |
| 44 | OV_CHAT_URL=https://openvibe.chat |
| 45 | OV_LIVE_URL=https://openvibe.live |
| 46 | OV_VIDEO_URL=https://openvibe.video |
| 47 | #MEME_UPSTREAM_TIMEOUT_MS=8000 |
| 48 | |
| 49 | # OpenVibe.AI: the judge and the encyclopedia's writing pass. Meme calls ai.generate as the service `meme` with a |
| 50 | # Network client-credentials token (audience openvibe.ai, scope ai.run.create); Network grants the ai.generate |
| 51 | # namespace. Meme never names a provider — AI's routing decides. |
| 52 | OV_AI_INTERNAL_URL=http://127.0.0.1:4700 |
| 53 | #MEME_AI_AUDIENCE=openvibe.ai |
| 54 | #MEME_AI_SCOPE=ai.run.create |
| 55 | #MEME_AI_WAIT_MS=55000 |
| 56 | #MEME_AI_TIMEOUT_MS=120000 |
| 57 | #MEME_AI_POLL_MS=1500 |
| 58 | #MEME_AI_MAX_TOKENS=1400 |
| 59 | |
| 60 | # The judge: it scores a candidate from its own citations and writes the entry. Only what clears the bar is |
| 61 | # published; everything else stays hidden for staff with its score. |
| 62 | #MEME_JUDGE_INTERVAL_MS=1800000 |
| 63 | #MEME_JUDGE_MIN_SCORE=0.75 |
| 64 | #MEME_JUDGE_MIN_USES=3 |
| 65 | #MEME_JUDGE_MIN_DAYS=2 |
| 66 | #MEME_JUDGE_MIN_CHANNELS=2 |
| 67 | #MEME_JUDGE_MAX_PER_RUN=10 |
| 68 | #MEME_JUDGE_CONTEXT_LINES=6 |
| 69 | |
| 70 | # The encyclopedia and the templates: Wikipedia (CC BY-SA), Wikidata (CC0) and Wikimedia Commons (each file under |
| 71 | # its own licence). Read-only public APIs; a site whose terms forbid it is never scraped. |
| 72 | #MEME_WIKIPEDIA_URL=https://en.wikipedia.org |
| 73 | #MEME_WIKIDATA_URL=https://www.wikidata.org |
| 74 | #MEME_COMMONS_URL=https://commons.wikimedia.org |
| 75 | #MEME_WIKI_USER_AGENT=OpenVibe.Meme/0.2 (+https://openvibe.meme; [email protected]) |
| 76 | #MEME_WIKI_TIMEOUT_MS=20000 |
| 77 | #MEME_WIKI_MIN_INTERVAL_MS=250 |
| 78 | #MEME_ENCYCLOPEDIA_LIMIT=400 |
| 79 | #MEME_ENCYCLOPEDIA_LISTS=List_of_Internet_phenomena |
| 80 | #MEME_ENCYCLOPEDIA_CATEGORIES=Internet memes,Memes |
| 81 | #MEME_ENCYCLOPEDIA_MIN_SCORE=0.75 |
| 82 | #MEME_TEMPLATES_LIMIT=40 |
| 83 | |
| 84 | # The candidate importer: every 30 minutes, hidden candidates only, off under MEME_DRILL. |
| 85 | #MEME_IMPORTER_INTERVAL_MS=1800000 |
| 86 | #MEME_IMPORTER_MIN_USES=2 |
| 87 | #MEME_IMPORTER_MIN_DAYS=2 |
| 88 | #MEME_IMPORTER_MAX_TOPICS=12 |
| 89 | #MEME_IMPORTER_MAX_VODS=12 |
| 90 | #MEME_IMPORTER_MAX_CANDIDATES=10 |
| 91 | |
| 92 | # Citation re-verification: daily, off under MEME_DRILL. |
| 93 | #MEME_REVERIFY_INTERVAL_MS=86400000 |
| 94 | |
| 95 | <<<<<<< HEAD |
| 96 | <<<<<<< HEAD |
| 97 | <<<<<<< HEAD |
| 98 | # Reddit's official API (OAuth2 client credentials; create a "script" app at reddit.com/prefs/apps). The trends |
| 99 | # importer is off while either credential is empty. Never commit the secret. |
| 100 | MEME_REDDIT_CLIENT_ID= |
| 101 | MEME_REDDIT_CLIENT_SECRET= |
| 102 | #MEME_REDDIT_USER_AGENT=web:openvibe.meme:v0.2 (by /u/OpenVibe) |
| 103 | #MEME_REDDIT_SUBREDDITS=memes,dankmemes,MemeEconomy,wholesomememes |
| 104 | #MEME_REDDIT_INTERVAL_MS=900000 |
| 105 | #MEME_REDDIT_MAX_POSTS=100 |
| 106 | #MEME_REDDIT_MIN_TEMPLATE_POSTS=3 |
| 107 | #MEME_REDDIT_MAX_IMAGE_BYTES=8388608 |
| 108 | |
| 109 | # OpenVibe.Media object API v2 for trend pictures and generated memes (namespace `meme`). Needs the Network |
| 110 | # client secret and a grant of media.object.upload/read for namespace meme; without it the source URL is kept. |
| 111 | OV_MEDIA_INTERNAL_URL= |
| 112 | #MEME_MEDIA_NAMESPACE=meme |
| 113 | |
| 114 | # Register the Reddit source (disabled) in OpenVibe.Sources once. Needs sources.source.read/manage. |
| 115 | OV_SOURCES_INTERNAL_URL= |
| 116 | #MEME_SOURCES_REGISTER=0 |
| 117 | ======= |
| 118 | # OpenVibe.AI for analyse (pics.describe_image + ai.extract), later research and generation. Off without the |
| 119 | # internal URL and the Network client secret. Needs ai.run.create/read and the workflow namespaces it calls. |
| 120 | # The URL above is the judge's; this runner uses the same URL and is off when it is not set. |
| 121 | #MEME_AI_DAILY_CALLS=200 |
| 122 | #MEME_AI_DAILY_BUDGET_USD=5 |
| 123 | #MEME_AI_WAIT_MS=60000 |
| 124 | |
| 125 | # Reddit's official API, for a Reddit URL's spread and comments (and the trends importer). Off while empty. |
| 126 | MEME_REDDIT_CLIENT_ID= |
| 127 | MEME_REDDIT_CLIENT_SECRET= |
| 128 | #MEME_REDDIT_USER_AGENT=web:openvibe.meme:v0.3 (by /u/OpenVibe) |
| 129 | >>>>>>> 827a65d (Meme M4: analyse a meme with OpenVibe.AI vision and a structured call, inside a daily budget) |
| 130 | ======= |
| 131 | # Deep dives (M5): research.gather + ai.generate. Off without OV_AI_INTERNAL_URL and the Network client secret. |
| 132 | # Needs ai.run.create/read plus the research.* and ai.* workflow namespaces. |
| 133 | OV_AI_INTERNAL_URL= |
| 134 | #MEME_RESEARCH_MAX_SOURCES=12 |
| 135 | #MEME_RESEARCH_DAILY_CALLS=40 |
| 136 | #MEME_RESEARCH_DAILY_BUDGET_USD=5 |
| 137 | #MEME_RESEARCH_WAIT_MS=180000 |
| 138 | >>>>>>> b07c350 (Meme M5: AI-researched deep dives whose every claim carries its source) |
| 139 | ======= |
| 140 | # The generator (M6): research.gather + ai.extract, then a server-side PNG stored in OpenVibe.Media. Off without |
| 141 | # OV_AI_INTERNAL_URL or Media. Needs media.object.upload/read for namespace meme. |
| 142 | OV_MEDIA_INTERNAL_URL= |
| 143 | #MEME_MEDIA_NAMESPACE=meme |
| 144 | #MEME_GENERATE_DAILY_CALLS=60 |
| 145 | #MEME_GENERATE_DAILY_BUDGET_USD=5 |
| 146 | #MEME_GENERATE_MAX_SOURCES=6 |
| 147 | #MEME_GENERATE_WAIT_MS=150000 |
| 148 | >>>>>>> bdce686 (Meme M6: generate a meme from the template's own layout and bundled fonts, stored in Media) |
| 149 | |
| 150 | # A restore drill starts no jobs and creates no subscriptions. |
| 151 | #MEME_DRILL=0 |
| 152 | |
| 153 | # optional: defaults to true in production |
| 154 | # COOKIE_SECURE=true |
| 155 |