ReachOps is an outreach-research tool. It builds a database of US companies with hiring signal (a Form 5500 backbone), resolves each company's domain, discovers their job boards and open postings, surfaces hiring stakeholders (leaders and recruiters), and drafts outreach emails for a human to review and send.
For AI agents / contributors: start with
AGENTS.md(durable architecture reference: stack, module map, routes, constraints), thenHANDOFF.md(live data state and build history). Check the app is alive and read the live state section before changing anything. Never commitreachops.db— it holds plaintext API keys and is gitignored.
The app is a Python (Flask + Jinja2, server-rendered) + SQLite system. This npm package bundles that app and provides a small CLI for setup, running, and porting the database safely.
- Node.js >= 14 (for the CLI)
- Python 3 on your PATH (for the app runtime; you can override with
PYTHON=...) - Network access on first setup (installs Python deps)
npx reachops setup # creates a venv, installs deps, migrates the schema
npx reachops serve # starts the dashboard at http://localhost:5050setup is idempotent: it reuses an existing .venv and skips already-applied
migrations. Run it in the directory where you want your ReachOps workspace to
live (the database reachops.db and the .venv are created there).
| Command | Purpose |
|---|---|
reachops setup |
One-command setup: create venv, install requirements, migrate the schema. |
reachops serve |
Run the dashboard on http://localhost:5050 (Ctrl-C to stop). |
reachops migrate |
Apply any pending schema migrations. |
reachops export-db [--out file] |
Copy the database to a portable file. |
reachops import-db <file> |
Load a database export into place. |
| Variable | Purpose |
|---|---|
REACHOPS_DB |
Override the database path (default: ./reachops.db). |
PYTHON |
Override the Python binary to use for the venv/runtime. |
REACHOPS_<CONFIG_KEY> |
Supply a secret at import time, e.g. REACHOPS_LLM_API_KEY. |
Secrets never travel through an export file.
export-dbproduces a full SQLite copy of your database with every secret config value blanked. The non-secret settings (provider, model, SMTP host, etc.) and all your data (companies, stakeholders, postings, outreach) are included. The secret keys that are stripped are:tavily_api_key,brave_api_key,firecrawl_api_key,apollo_api_key,hunter_api_key,llm_api_key,smtp_username,smtp_password.import-dbloads an export into place. It first backs up whatever is currently there (toreachops.db.bak-<timestamp>), then:- keeps your existing local secrets (they are never overwritten by the file),
- fills any secret that is still missing from
REACHOPS_<KEY>env vars, - never reads a secret from the import file.
So an export is safe to share or move between machines: it carries your data and non-secret configuration, but no credentials.
setup only migrates the schema. The database starts empty. Loading the Form
5500 company set and industry codes is a separate, large step run with the
bundled loader scripts (see the repo). Existing databases can be moved with
export-db / import-db instead.
This package is configured to be published to npm as reachops:
npm publish # requires your npm account / authMIT