# Transport mode (http = remote server, stdio = local) TRANSPORT=http PORT=3000 # Stripe subscription billing STRIPE_SECRET_KEY= # sk_test_... or sk_live_... STRIPE_WEBHOOK_SECRET= # whsec_... STRIPE_STARTER_PRICE_ID= # price_... ($9.99/mo Starter — read by src/lib/stripe.ts:22; ACTIVATION-PAYWALL-W1 side-fix 2026-05-20) STRIPE_PRO_PRICE_ID= # price_... STRIPE_ENTERPRISE_PRICE_ID= # price_... CQS_API_KEY= # For local testing of pro tier # x402 payments (USDC on Base) # Set your recipient wallet address to enable x402 micropayments. # Without this, the server still works on free/API-key tiers. X402_WALLET_ADDRESS=0xYourBaseWalletAddress X402_NETWORK=base-mainnet # or base-sepolia for testing X402_FACILITATOR_URL=http://facilitator:4022 # self-hosted facilitator (Docker internal) # Self-hosted facilitator (gas wallet for on-chain settlement) # Generate a fresh key — this wallet only needs ~0.01 ETH on Base for gas. FACILITATOR_PRIVATE_KEY=0xYourGasWalletPrivateKey # Database (if set, uses PostgreSQL; if not, uses local SQLite) DATABASE_URL=postgresql://algovault:password@localhost:5432/signal_performance # Admin analytics endpoint (optional — enables GET /analytics) ADMIN_API_KEY= # Monitoring (optional) UPTIMEROBOT_API_KEY=ur_xxxxxxxxxxxx # ERC-8004 agent identity (Base mainnet — wave ERC-8004-W1, 2026-05-16) # Wallet A per 2026-05-16 architect pivot from Plan-Mode-ratified Wallet B: # set this to the SAME value as MERKLE_PUBLISHER_KEY above (reuse the Merkle # anchor wallet for operational simplicity — agentId is a transferable ERC-721 # NFT, so isolation can be added later via safeTransferFrom if needed). # (Note: dotenv does NOT auto-interpolate ${VAR}; copy the literal hex string.) ERC8004_AGENT_OWNER_KEY=0xSameValueAsMerklePublisherKeyAbove # Auto-written by register-erc8004-agent.ts post-mint; pin via # set -a; . ~/.config/algovault/erc8004.env; set +a # DO NOT commit a real value — this is a documentation hint only. # ERC-8004-W1 discovery (2026-05-16): the same wallet (MERKLE_PUBLISHER_KEY = # FACILITATOR_PRIVATE_KEY = 0x804B82544E0B779c69192Ff5FC64a4c5d1017B80) had a # prior molthunt-launch.ts mint at agentId=44544, block 44597447, # tx 0xd2c1983e4fb55691736733960ddbdbd87ca2f7c4eb08faa856b85f30953786d8, # timestamp 2026-04-12T08:57:21Z. C1 adopts that agentId via `--update-uri` # mode (one setAgentURI tx) rather than minting a new one. Pre-set these env # vars before running the script: # ERC8004_AGENT_ID=44544 # ERC8004_FIRST_REGISTERED_AT=2026-04-12T08:57:21Z # ERC8004_ORIGINAL_TX_HASH=0xd2c1983e4fb55691736733960ddbdbd87ca2f7c4eb08faa856b85f30953786d8 ERC8004_AGENT_ID= ERC8004_REGISTRATION_TX_HASH= ERC8004_FIRST_REGISTERED_AT= ERC8004_ORIGINAL_TX_HASH= # IPFS pinning (Pinata is the only provider implemented; Storacha is a future # wave). Get a JWT at https://app.pinata.cloud/keys. IPFS_PINNING_PROVIDER=pinata IPFS_PINNING_TOKEN= # BUNDLE-EXPAND-BLOG-W1 (2026-05-19) — KnowledgeBundle.pages[] content fetchers. # Refreshed weekly by Hetzner Sun 06:00 UTC cron (scripts/refresh-knowledge-pages.mjs). # Each fetcher graceful-degrades to [] when its credential is absent — bundle # ships with whichever sources succeeded (Promise.allSettled contract). DEV_TO_API_KEY= # https://dev.to/settings/extensions; public handle = algovaultlabs (lowercase, trailing s) per Mr.1 Q-4 2026-05-19 MEDIUM_AUTHOR_HANDLE=algovault # Medium @ handle, NO @ prefix; lowercase, NO "labs" suffix per Mr.1 Q-3 2026-05-19 (RSS HTTP 200 confirmed) YOUTUBE_API_KEY= # GCloud API key with YouTube Data API v3 enabled; project = algovaultlabs@gmail.com per project_algovault_brand_account memory YOUTUBE_CHANNEL_HANDLE=@AlgoVaultLabs # YouTube channel handle (mixed case) per Mr.1 Q-2 2026-05-19