A full-stack business development operating system for government contract capture teams.
Live demo: https://bd.edgewatertech.net
BD Command Center replaces a collection of Excel workbooks and Access databases with a governed, web-based pipeline tool for business development teams pursuing government contracts. It monitors over a dozen federal procurement sources, normalizes incoming opportunities through an AI-assisted review inbox, tracks active pursuits through proposal submission, and surfaces AI-generated intelligence via a RAG pipeline built on a searchable past performance and proposal document library.
- Monitors 15+ sources: SAM.gov API, USAspending.gov, DOE/NNSA lab procurement sites (Pantex, ORNL, UCOR, WIPP, PNNL, CNS, LANL, NREL, N3B, SCMC, and more), and regional manager Excel uploads
- Multi-tier scraping pipeline: direct HTTP → Trafilatura → Jina AI Reader (JS rendering) → Groq/Ollama/Anthropic LLM extraction
- Review inbox gates every incoming item before it enters the tracked pipeline
- AI Opportunity Brief generated on first open: work scope, timeline, ROM estimate, bid context, evidence cited
- Bulk approve with auto-populated fields from pre-extracted source data
- Full pursuit lifecycle: Identified → Qualifying → Pursuing → Proposal → Awarded / No Bid
- Capture timeline combining activity notes, BD task events, document uploads, and AI events
- Stage aging indicators (>30 days stale, >14 days for high-priority) with executive exceptions dashboard
- Pwin% tracking and weighted pipeline value on analytics
- Quick-log notes from pipeline list without leaving the page
- Recompete flag with predecessor contract linkage
- Solicitation PDFs chunked and indexed in pgvector (768-dim via Ollama
nomic-embed-text); semantic search retrieves relevant past performance and proposal passages as grounded LLM context - Agentic procurement analysis: parses RFP/solicitation documents, generates Fit Score, Compliance Matrix, Win Themes, and Proposal Outline against program requirements
- AI Opportunity Brief on every inbox item: work scope, timeline, ROM estimate, bid context, evidence cited — with DOE/NNSA capture-style structured output
- All AI outputs land as
draft— domain experts accept or reject before they affect pipeline decisions - LLM provider cascade: Groq → Ollama → Anthropic (configurable; no vendor lock-in)
- Import from Excel, CSV, or Access (.accdb)
- CPARS ratings (Overall, Quality, Schedule, Cost Control, Management) with color-coded display
- Attach PDFs per record; each document indexed for semantic AI context
- "Promote to Past Performance" one-click workflow from won opportunities
- Organizations (customers, partners, competitors, agencies) with bulk import
- Contact roles per opportunity (capture manager, proposal lead, incumbent, etc.)
- Teaming agreement status and partner capability profiles
- Source yield analytics: per-source funnel from Approved → Pursued → Won
- Role-based access: Viewer / Editor / Admin
- Admin invites new users by email; user sets their own password via branded invite link
- SAM.gov NAICS codes managed in-app (add/remove, auto-seeded from config)
- Saved watchlists with email alerts on new matches
- Full audit log, source health monitoring, and data quality flags
┌─────────────────────────────────────────────────────────────┐
│ Ingest Layer │
│ SAM.gov API │ Website Scrapers │ Regional Uploads │ Manual │
└──────────────────────────┬──────────────────────────────────┘
│ V2 Intake Contract
▼
┌─────────────────────────────────────────────────────────────┐
│ Review Inbox (Human Gate) │
│ AI Brief generation │ Pre-extracted fields │ Bulk approve │
└──────────────────────────┬──────────────────────────────────┘
│ Approval
▼
┌─────────────────────────────────────────────────────────────┐
│ Tracked Pipeline │
│ V2Opportunity + V2Pursuit │ Dates │ Contacts │ Tasks │
└──────────┬───────────────────────────────┬──────────────────┘
│ PDF upload / auto-fetch │ Past Performance
▼ ▼
┌──────────────────────┐ ┌──────────────────────────────── ┐
│ Document Intelligence│ │ Past Performance DB │
│ pypdf → pgvector │ │ CPARS ratings │ PDF indexing │
│ Groq/Ollama/Anthropic│ │ Semantic similarity search │
└──────────────────────┘ └─────────────────────────────────┘
Stack: Python 3.14, FastAPI, SQLAlchemy, Alembic, PostgreSQL 17 + pgvector, Jinja2, Docker Compose, AWS EC2 + RDS
Prerequisites: Docker Desktop, Python 3.14
# Clone and set up the environment
git clone https://github.com/jspires-edgewater/bd-opportunity-monitor.git
cd bd-opportunity-monitor
python -m venv .venv
.venv\Scripts\activate # Windows
# source .venv/bin/activate # macOS/Linux
pip install -r requirements.txt
# Configure environment
cp .env.example .env
# Edit .env — set APP_SECRET_KEY, APP_ADMIN_PASSWORD, and optionally GROQ_API_KEY
# Start the database and run migrations
docker compose up -d db
alembic upgrade head
# Start the app
python -m bd_opportunity_monitor --serve
# Open http://localhost:8080Default local login: admin / the password you set in .env
docker compose up -d
# App runs at http://localhost:8080python -m bd_opportunity_monitor --seed-pilot-dataCopy .env.example to .env and fill in the required values. Key variables:
| Variable | Required | Description |
|---|---|---|
DATABASE_URL |
Yes | PostgreSQL connection string |
APP_SECRET_KEY |
Yes | Random secret for session signing |
APP_ADMIN_PASSWORD |
Yes | Initial admin account password |
APP_BASE_URL |
Yes | Full URL of the app (used in emails) |
GROQ_API_KEY |
Recommended | LLM provider for AI briefs and scraping |
SAM_GOV_API_KEY |
Recommended | SAM.gov opportunity ingestion |
SMTP_* |
Optional | Email notifications and user invites |
OPENAI_API_KEY |
Optional | Higher-quality embeddings (1536-dim) |
See .env.example for the full list with comments.
The production instance runs on AWS EC2 with Docker Compose and a Caddy HTTPS sidecar. The target production architecture is ECS Fargate + RDS PostgreSQL + S3 + EventBridge + CloudWatch.
See docs/ecs-deployment-readiness.md for the full ECS readiness checklist.
Security hardening included:
- Non-root container (uid 10001)
- Fail-closed production config (startup blocked when insecure defaults present)
- CSP + HSTS headers, request-body size guard (60 MB), upload extension allowlist
- PBKDF2-600k password hashing, login lockout, no user enumeration on reset
/docs,/redoc,/openapi.jsondisabled in shared mode
# Ingestion
python -m bd_opportunity_monitor --refresh-v2-sam --sam-posted-from MM/dd/yyyy --sam-posted-to MM/dd/yyyy
python -m bd_opportunity_monitor --refresh-v2-usaspending --usaspending-start-date YYYY-MM-DD --usaspending-end-date YYYY-MM-DD
# Document intelligence
python -m bd_opportunity_monitor --reembed-documents
# Alerts
python -m bd_opportunity_monitor --send-alerts
# Diagnostics
python -m bd_opportunity_monitor --verify-v2
python -m bd_opportunity_monitor --audit-v2-data-model
python -m bd_opportunity_monitor --audit-source-field-coveragebd_opportunity_monitor/
├── webapp.py # All FastAPI routes
├── config.py # Environment variable config
├── auth.py # Password hashing, session tokens
├── ingest/ # Scrapers, LLM extraction, normalization
├── services/ # Core service layer
└── v2/ # V2 domain layer (canonical)
├── models.py # SQLAlchemy models
├── workflow.py # Approval and review workflow
├── sam_gov.py # SAM.gov API ingestion
├── document_intelligence.py # PDF storage, AI analysis
├── embedding_service.py # Ollama/OpenAI embedding dispatch
└── notification_email.py # Assignment and alert emails
Full data model documentation: DATA_MODEL_V2.md
Architecture details: docs/architecture.md
Internal use — Edgewater Technical Associates. Not licensed for public distribution.