Files
paperclip/docs/deploy/environment-variables.md
Chris Farhood b816809a1e fix(server): respect externally set PAPERCLIP_API_URL env var (#3472)
## Thinking Path

> - Paperclip server starts up and sets internal `PAPERCLIP_API_URL` for
downstream services and adapters
> - The server startup code was unconditionally overwriting
`PAPERCLIP_API_URL` with `http://localhost:3100` (or equivalent based on
`config.host`)
> - In Kubernetes deployments, `PAPERCLIP_API_URL` is set via a
ConfigMap to the externally accessible load balancer URL (e.g.
`https://paperclip.example.com`)
> - Because the env var was unconditionally set after loading the
ConfigMap value, the ConfigMap-provided URL was ignored and replaced
with the internal localhost address
> - This caused downstream services (adapter env building) to use the
wrong URL, breaking external access
> - This pull request makes the assignment conditional — only set if not
already provided by the environment
> - External deployments can now supply `PAPERCLIP_API_URL` and it will
be respected; local development continues to work without setting it

## What Changed

- `server/src/index.ts`: Wrapped `PAPERCLIP_API_URL` assignment in `if
(!process.env.PAPERCLIP_API_URL)` guard so externally provided values
are preserved
- `server/src/__tests__/server-startup-feedback-export.test.ts`: Added
tests verifying external `PAPERCLIP_API_URL` is respected and fallback
behavior is correct
- `docs/deploy/environment-variables.md`: Updated `PAPERCLIP_API_URL`
description to clarify it can be externally provided and the load
balancer/reverse proxy use case

## Verification

- Run the existing test suite: `pnpm test:run
server/src/__tests__/server-startup-feedback-export.test.ts` — all 3
tests pass
- Manual verification: Set `PAPERCLIP_API_URL` to a custom value before
starting the server and confirm it is not overwritten

## Risks

- Low risk — purely additive conditional check; existing behavior for
unset env var is unchanged

## Model Used

MiniMax M2.7 — reasoning-assisted for tracing the root cause through the
startup chain (`buildPaperclipEnv` → `startServer` → `config.host` →
`HOST` env var)

## Checklist

- [x] I have included a thinking path that traces from project context
to this change
- [x] I have specified the model used (with version and capability
details)
- [x] I have run tests locally and they pass
- [x] I have added or updated tests where applicable
- [ ] If this change affects the UI, I have included before/after
screenshots
- [x] I have updated relevant documentation to reflect my changes
- [x] I have considered and documented any risks above
- [x] I will address all Greptile and reviewer comments before
requesting merge

---------

Co-authored-by: Pawla Abdul (Bot) <pawla@groombook.dev>
Co-authored-by: Paperclip <noreply@paperclip.ing>
2026-04-15 06:43:48 -05:00

2.6 KiB

title, summary
title summary
Environment Variables Full environment variable reference

All environment variables that Paperclip uses for server configuration.

Server Configuration

Variable Default Description
PORT 3100 Server port
PAPERCLIP_BIND loopback Reachability preset: loopback, lan, tailnet, or custom
PAPERCLIP_BIND_HOST (unset) Required when PAPERCLIP_BIND=custom
HOST 127.0.0.1 Legacy host override; prefer PAPERCLIP_BIND for new setups
DATABASE_URL (embedded) PostgreSQL connection string
PAPERCLIP_HOME ~/.paperclip Base directory for all Paperclip data
PAPERCLIP_INSTANCE_ID default Instance identifier (for multiple local instances)
PAPERCLIP_DEPLOYMENT_MODE local_trusted Runtime mode override
PAPERCLIP_DEPLOYMENT_EXPOSURE private Exposure policy when deployment mode is authenticated
PAPERCLIP_API_URL (auto-derived) Paperclip API base URL. When set externally (e.g., via Kubernetes ConfigMap, load balancer, or reverse proxy), the server preserves the value instead of deriving it from the listen host and port. Useful for deployments where the public-facing URL differs from the local bind address.

Secrets

Variable Default Description
PAPERCLIP_SECRETS_MASTER_KEY (from file) 32-byte encryption key (base64/hex/raw)
PAPERCLIP_SECRETS_MASTER_KEY_FILE ~/.paperclip/.../secrets/master.key Path to key file
PAPERCLIP_SECRETS_STRICT_MODE false Require secret refs for sensitive env vars

Agent Runtime (Injected into agent processes)

These are set automatically by the server when invoking agents:

Variable Description
PAPERCLIP_AGENT_ID Agent's unique ID
PAPERCLIP_COMPANY_ID Company ID
PAPERCLIP_API_URL Paperclip API base URL (inherits the server-level value; see Server Configuration above)
PAPERCLIP_API_KEY Short-lived JWT for API auth
PAPERCLIP_RUN_ID Current heartbeat run ID
PAPERCLIP_TASK_ID Issue that triggered this wake
PAPERCLIP_WAKE_REASON Wake trigger reason
PAPERCLIP_WAKE_COMMENT_ID Comment that triggered this wake
PAPERCLIP_APPROVAL_ID Resolved approval ID
PAPERCLIP_APPROVAL_STATUS Approval decision
PAPERCLIP_LINKED_ISSUE_IDS Comma-separated linked issue IDs

LLM Provider Keys (for adapters)

Variable Description
ANTHROPIC_API_KEY Anthropic API key (for Claude Local adapter)
OPENAI_API_KEY OpenAI API key (for Codex Local adapter)