# OpenVibe.Meme — environment (production: /etc/openvibe/meme.env). Names only; never commit values. NODE_ENV=production PORT=5120 HOST=127.0.0.1 BASE_URL=https://openvibe.meme TRUST_PROXY=2 # PostgreSQL (ADR-035), written by OpenVibe.Host roles/data/add-service.sh: the runtime role through PgBouncer, # the owner on a direct connection (migrations), and Valkey (shared limit counters). # Without DATABASE_URL, development uses an embedded PGlite database in data/pglite. DATABASE_URL= DATABASE_DIRECT_URL= VALKEY_URL= VALKEY_PREFIX=ov:meme: # Per-actor limits (server/http/api.js) and per-address limits (server/app.js). #MEME_LIMITS_MINUTE=120 #MEME_LIMITS_HOUR=3000 #MEME_API_RATE_LIMIT_PER_MIN=240 #MEME_RATE_LIMIT_PER_MIN=300 # OpenVibe.Network: SSO (OAuth client `meme`, PKCE S256) and its JWKS; app tokens for audience openvibe.meme. OV_NETWORK_URL=https://openvibe.network OV_NETWORK_INTERNAL_URL=http://127.0.0.1:4000 # OV_NETWORK_ISSUER=https://openvibe.network OV_OAUTH_CLIENT_ID=meme OV_OAUTH_CLIENT_SECRET= # OV_OAUTH_REDIRECT_URI=https://openvibe.meme/auth/callback # MEME_AUDIENCE=openvibe.meme # OV_SESSION_AUDIENCE=openvibe.network # MEME_PGLITE_DIR=./data/pglite # OpenVibe.Events: account export/deletion deliveries to POST /internal/events. The secret signs a delivery # (comma-separated for rotation, 32+ characters each; unset makes the route answer 503). MEME_EVENTS_SECRET= MEME_EVENTS_URL= # Relay queued public caption events after Contracts #444 is released and Events accepts the topic. MEME_CAPTION_EVENTS_ENABLED=off #MEME_EVENTS_ENDPOINT=http://127.0.0.1:5120/internal/events # OpenVibe.Search's owner API: the queued Search documents (meme_outbox) are delivered there. Unset: they wait. #MEME_SEARCH_URL=http://127.0.0.1:4710 #MEME_EVENTS_INTERVAL_MS=5000 # The public APIs the importer and the citation re-verifier read. No service grant is used for them. OV_CHAT_URL=https://openvibe.chat OV_LIVE_URL=https://openvibe.live OV_VIDEO_URL=https://openvibe.video #MEME_UPSTREAM_TIMEOUT_MS=8000 # OpenVibe.AI: the judge and the encyclopedia's writing pass. Meme calls ai.generate as the service `meme` with a # Network client-credentials token (audience openvibe.ai, scope ai.run.create); Network grants the ai.generate # namespace. Meme never names a provider — AI's routing decides. OV_AI_INTERNAL_URL=http://127.0.0.1:4700 #MEME_AI_AUDIENCE=openvibe.ai #MEME_AI_SCOPE=ai.run.create #MEME_AI_WAIT_MS=55000 #MEME_AI_TIMEOUT_MS=120000 #MEME_AI_POLL_MS=1500 #MEME_AI_MAX_TOKENS=1400 # The judge: it scores a candidate from its own citations and writes the entry. Only what clears the bar is # published; everything else stays hidden for staff with its score. #MEME_JUDGE_INTERVAL_MS=1800000 #MEME_JUDGE_MIN_SCORE=0.75 #MEME_JUDGE_MIN_USES=3 #MEME_JUDGE_MIN_DAYS=2 #MEME_JUDGE_MIN_CHANNELS=2 #MEME_JUDGE_MAX_PER_RUN=10 #MEME_JUDGE_CONTEXT_LINES=6 # The encyclopedia and the templates: Wikipedia (CC BY-SA), Wikidata (CC0) and Wikimedia Commons (each file under # its own licence). Read-only public APIs; a site whose terms forbid it is never scraped. #MEME_WIKIPEDIA_URL=https://en.wikipedia.org #MEME_WIKIDATA_URL=https://www.wikidata.org #MEME_COMMONS_URL=https://commons.wikimedia.org #MEME_WIKI_USER_AGENT=OpenVibe.Meme/0.2 (+https://openvibe.meme; contact@openvibe.network) #MEME_WIKI_TIMEOUT_MS=20000 #MEME_WIKI_MIN_INTERVAL_MS=250 #MEME_ENCYCLOPEDIA_LIMIT=400 #MEME_ENCYCLOPEDIA_LISTS=List_of_Internet_phenomena #MEME_ENCYCLOPEDIA_CATEGORIES=Internet memes,Memes #MEME_ENCYCLOPEDIA_MIN_SCORE=0.75 #MEME_TEMPLATES_LIMIT=40 # The candidate importer: every 30 minutes, hidden candidates only, off under MEME_DRILL. #MEME_IMPORTER_INTERVAL_MS=1800000 #MEME_IMPORTER_MIN_USES=2 #MEME_IMPORTER_MIN_DAYS=2 #MEME_IMPORTER_MAX_TOPICS=12 #MEME_IMPORTER_MAX_VODS=12 #MEME_IMPORTER_MAX_CANDIDATES=10 # Citation re-verification: daily, off under MEME_DRILL. #MEME_REVERIFY_INTERVAL_MS=86400000 <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD # Reddit's official API (OAuth2 client credentials; create a "script" app at reddit.com/prefs/apps). The trends # importer is off while either credential is empty. Never commit the secret. MEME_REDDIT_CLIENT_ID= MEME_REDDIT_CLIENT_SECRET= #MEME_REDDIT_USER_AGENT=web:openvibe.meme:v0.2 (by /u/OpenVibe) #MEME_REDDIT_SUBREDDITS=memes,dankmemes,MemeEconomy,wholesomememes #MEME_REDDIT_INTERVAL_MS=900000 #MEME_REDDIT_MAX_POSTS=100 #MEME_REDDIT_MIN_TEMPLATE_POSTS=3 #MEME_REDDIT_MAX_IMAGE_BYTES=8388608 # OpenVibe.Media object API v2 for trend pictures and generated memes (namespace `meme`). Needs the Network # client secret and a grant of media.object.upload/read for namespace meme; without it the source URL is kept. OV_MEDIA_INTERNAL_URL= #MEME_MEDIA_NAMESPACE=meme # Register the Reddit source (disabled) in OpenVibe.Sources once. Needs sources.source.read/manage. OV_SOURCES_INTERNAL_URL= #MEME_SOURCES_REGISTER=0 ======= # OpenVibe.AI for analyse (pics.describe_image + ai.extract), later research and generation. Off without the # internal URL and the Network client secret. Needs ai.run.create/read and the workflow namespaces it calls. # The URL above is the judge's; this runner uses the same URL and is off when it is not set. #MEME_AI_DAILY_CALLS=200 #MEME_AI_DAILY_BUDGET_USD=5 #MEME_AI_WAIT_MS=60000 # Reddit's official API, for a Reddit URL's spread and comments (and the trends importer). Off while empty. MEME_REDDIT_CLIENT_ID= MEME_REDDIT_CLIENT_SECRET= #MEME_REDDIT_USER_AGENT=web:openvibe.meme:v0.3 (by /u/OpenVibe) >>>>>>> 827a65d (Meme M4: analyse a meme with OpenVibe.AI vision and a structured call, inside a daily budget) ======= # Deep dives (M5): research.gather + ai.generate. Off without OV_AI_INTERNAL_URL and the Network client secret. # Needs ai.run.create/read plus the research.* and ai.* workflow namespaces. OV_AI_INTERNAL_URL= #MEME_RESEARCH_MAX_SOURCES=12 #MEME_RESEARCH_DAILY_CALLS=40 #MEME_RESEARCH_DAILY_BUDGET_USD=5 #MEME_RESEARCH_WAIT_MS=180000 >>>>>>> b07c350 (Meme M5: AI-researched deep dives whose every claim carries its source) ======= # The generator (M6): research.gather + ai.extract, then a server-side PNG stored in OpenVibe.Media. Off without # OV_AI_INTERNAL_URL or Media. Needs media.object.upload/read for namespace meme. OV_MEDIA_INTERNAL_URL= #MEME_MEDIA_NAMESPACE=meme #MEME_GENERATE_DAILY_CALLS=60 #MEME_GENERATE_DAILY_BUDGET_USD=5 #MEME_GENERATE_MAX_SOURCES=6 #MEME_GENERATE_WAIT_MS=150000 >>>>>>> bdce686 (Meme M6: generate a meme from the template's own layout and bundled fonts, stored in Media) # A restore drill starts no jobs and creates no subscriptions. #MEME_DRILL=0 # optional: defaults to true in production # COOKIE_SECURE=true