Configuration

Pulse is configured entirely through environment variables. Every one has a default, so an empty environment still runs.

How configuration loads#

Node 24 reads env files natively, so there is no dotenv dependency. Pulse loads .env.local first and then .env from the working directory. A variable already set in the real environment wins over both files, and .env.local wins over .env. Empty values are treated as unset.

Numeric variables must be positive integers. Anything else falls back to the default. Comma-separated variables are split on commas with whitespace trimmed.

Environment variables#

All variables read by src/lib/env.ts. The first group matches .env.example.
VariableDefaultPurpose
DATABASE_URLemptyPostgres connection string. Empty uses the embedded PGlite archive. Example with the bundled compose file: postgres://pulse:pulse@localhost:5544/pulse.
PORT8787Port for the API and dashboard.
PUBLIC_URLemptyPublic base URL of the dashboard. When set, each Telegram issue starts with an "Open the dashboard" link to PUBLIC_URL/#/reports/<day>.
REPORT_TIMEZONEUTCIANA time zone that defines the newsletter's local day.
REPORT_HOUR13Local hour (0-23) at or after which the day's issue is generated, once per local day.
TELEGRAM_BOT_TOKENemptyBot token from @BotFather. Sending needs both this and TELEGRAM_CHAT_ID.
TELEGRAM_CHAT_IDemptyTarget chat or channel, for example @my_channel. The bot must be an admin of the channel.
ANTHROPIC_API_KEYemptyOptional. Adds a short written overview at the top of each issue, constrained to that day's data. Without it the issue is data only.
ANTHROPIC_MODELclaude-sonnet-5-5Model used for the written overview.
SNAPSHOT_EVERY_MIN5Minutes between collection cycles.
STREAMSonSet to off to disable the Solana firehose. The collector, API and dashboard keep running.
SOLANA_RPC_URLShttps://api.mainnet-beta.solana.comComma-separated Solana HTTP RPC endpoints.
SOLANA_WS_URLSwss://api.mainnet-beta.solana.comComma-separated Solana WebSocket endpoints for the firehose log subscription. The public endpoint drops connections often. A dedicated endpoint keeps the stream steady.
ROBINHOOD_RPC_URLShttps://rpc.mainnet.chain.robinhood.comComma-separated Robinhood Chain RPC endpoints used to read launchpad factory logs.
PGLITE_DIR./data/pgliteDirectory of the embedded PGlite archive. Only used when DATABASE_URL is empty. Not listed in .env.example.

MCP server variable#

VariableDefaultPurpose
PULSE_URLhttp://localhost:8787Base URL of the Pulse API that pulse-mcp reads. Set it in the MCP client's env block. See MCP server.

Command-line flags#

Flags are read by the entry point src/main.ts (also reachable through pulse start and pulse collect).

FlagEffect
--onceRun one collection cycle and exit. No firehose, no server.
--jobsWith --once, also import wallet labels and score wallets now instead of waiting for their cadence.
--no-streamDo not start the Solana firehose, regardless of STREAMS.
--no-serverDo not start the API and dashboard.
--migrateApply migrations and exit.

Cadences that are not configurable#

Each of these is checked at the end of every collection cycle, so the effective resolution is SNAPSHOT_EVERY_MIN.

Secrets. Keep TELEGRAM_BOT_TOKEN, ANTHROPIC_API_KEY and any RPC URLs that embed an API key in your secret manager or an untracked .env. .env and .env.local are in the repository's .gitignore.