BrandPilot is a production-oriented full-stack implementation of the master plan:
- Parallel marketing agent fleet (Competitor, Reviews, Mentions, Opportunities)
- Intelligence compiler digest
- Single command-center UI with clear multi-section workflow
- Cloud-ready storage, notifications, and scheduled execution
- Final pack:
docs/hackathon_submission_pack.md - Judge script:
docs/judge_demo_script.md - Live runbook:
docs/demo_runbook_live.md
Current deployed environment note:
- Production deployment runs
AgentMode=livewith Nova Act + AgentCore Browser in Lambda. - Bedrock digest generation, S3 persistence, scheduler, and SNS delivery are live.
- UI runtime badge shows per-run execution source (
Live,Fallback,Mixed,Mock) from backend telemetry.
- FastAPI API (
/health,/api/system/status,/api/onboarding,/api/run,/api/runs,/api/dashboard/{persona},/api/digest/latest) - Built-in authentication:
- Email/password register + login
- Google login (when
GOOGLE_CLIENT_ID+GOOGLE_CLIENT_SECRETare configured) - Bearer token auth for all workspace APIs
- Multi-user isolation:
- Per-user onboarding, runs, dashboards, strategy, timeline, and integrations data
- User-scoped S3/local storage namespaces
- Parallel agent orchestration with execution modes:
mock: deterministic demo datahybrid: try Nova Act, fallback to mock on failurelive: only live Nova Act (captures errors in runtime metadata)
- Digest pipeline:
- Rule-based digest always available
- Optional Bedrock Nova 2 Lite digest (
converse) with safe fallback
- Storage adapters:
- Local filesystem
- S3 bucket
- Optional SNS publishing of digest
- Local interval scheduler hook
- AWS Lambda handlers:
app.lambda_handler.handlerfor scheduled runsapp.lambda_api.handlerfor serverless API via Mangum
- React + TypeScript dashboard
- Unified command-center layout with guided sections
- Onboarding form and one-click fleet run
- Digest + signal cards
- Run timeline and execution telemetry
- Runtime indicators (mode, digest engine, SNS delivery status)
- SAM template (
infra/template.yaml) provisioning:- S3 results bucket
- SNS digest topic
- HTTP API container Lambda (Mangum/FastAPI)
- Scheduled container Lambda run with IAM for S3/SNS/Bedrock and Nova Act runtime dependencies
- Deployment helper script (
infra/deploy.ps1)
backend/FastAPI services, agents, tests, Lambda handlersfrontend/Vite React appinfra/SAM template and deployment script
cd backend
python -m venv .venv
. .venv/Scripts/activate
pip install -r requirements.txt
copy .env.example .env
uvicorn app.main:app --reload --port 8000Optional live Nova Act dependency:
pip install -r requirements-optional.txtcd frontend
npm install
copy .env.example .env
npm run devIf backend API_KEY is set, also set VITE_API_KEY in frontend/.env.
- Frontend:
http://localhost:5173 - Backend:
http://localhost:8000
docker compose up --build- Frontend:
http://localhost:8080 - Backend:
http://localhost:8000
Use backend/.env.example as reference.
Core:
APP_VERSION=1.1.0API_KEY=<optional; when set, required via X-API-Key for POST endpoints>AUTH_TOKEN_SECRET=<required in production>AUTH_TOKEN_TTL_HOURS=168STORAGE_BACKEND=local|s3S3_BUCKET=<bucket-name>whens3AWS_REGION=us-east-1AWS_PROFILE=<optional-profile>
Agent runtime:
AGENT_MODE=mock|hybrid|liveNOVA_ACT_API_KEY=<required for live Nova Act>NOVA_ACT_MAX_LINKS=3NOVA_ACT_HEADLESS=1(recommended in Lambda/container runtimes)NOVA_ACT_CHROME_CHANNEL=chromium(recommended in Lambda/container runtimes)NOVA_ACT_BROWSER_ARGS=--no-sandbox --disable-setuid-sandbox --disable-dev-shm-usage --disable-gpu(recommended in Lambda/container runtimes)USE_MOCK_DATA=true|false(legacy compatibility)
Digest intelligence:
BEDROCK_ENABLED=true|falseBEDROCK_MODEL_ID=us.amazon.nova-2-lite-v1:0BEDROCK_TEMPERATURE=0.2BEDROCK_MAX_TOKENS=700
Notifications:
SNS_ENABLED=true|falseSNS_TOPIC_ARN=<topic-arn>SNS_MESSAGE_SUBJECT=BrandPilot Weekly Digest
Scheduler:
SCHEDULER_ENABLED=true|falseSCHEDULER_INTERVAL_MINUTES=10080
OAuth integrations:
FRONTEND_BASE_URL=<frontend public URL used for OAuth callback redirects>OAUTH_STATE_SECRET=<required non-empty secret for signing OAuth state>GOOGLE_CLIENT_ID=<optional>GOOGLE_CLIENT_SECRET=<optional>META_CLIENT_ID=<optional>META_CLIENT_SECRET=<optional>LINKEDIN_CLIENT_ID=<optional>LINKEDIN_CLIENT_SECRET=<optional>X_CLIENT_ID=<optional>X_CLIENT_SECRET=<optional>
OAuth callback paths (configure these in each provider console):
- Google:
<API_URL>/api/integrations/oauth/google/callback - Meta:
<API_URL>/api/integrations/oauth/meta/callback - LinkedIn:
<API_URL>/api/integrations/oauth/linkedin/callback - X:
<API_URL>/api/integrations/oauth/x/callback
Hackathon demo note:
- OAuth is optional for judging and can remain unconfigured for demo runs.
- The UI already shows provider connection controls and configuration state.
- For demo narration: "OAuth connectors are production-ready in code and activate once provider credentials are supplied."
Prerequisites:
- AWS CLI + SAM CLI configured
- Python 3.12 runtime target
Deploy:
./infra/deploy.ps1 -StackName brandpilot-prod -Region us-east-1 -AgentMode live -NovaActApiKey <your_nova_key> -ApiKey <optional_api_key>AgentMode=live enables Nova Act execution for both manual API runs and scheduled runs.
For browser access from deployed frontend, pass allowed origins:
./infra/deploy.ps1 -StackName brandpilot-prod -Region us-east-1 -AgentMode mock -CorsOrigins "http://localhost:5173,http://brandpilot-web-<account>-us-east-1.s3-website-us-east-1.amazonaws.com"Finalize (without full image rebuild) after you have a valid Nova key:
./infra/finalize.ps1 -StackName brandpilot-prod -Region us-east-1 -NovaActApiKey <your_nova_key> -AgentMode live -NotificationEmail <your_email>Configure real OAuth credentials in the deployed stack:
./infra/finalize.ps1 \
-StackName brandpilot-prod \
-Region us-east-1 \
-NovaActApiKey <your_nova_key> \
-AgentMode live \
-OauthStateSecret <long_random_secret> \
-GoogleClientId <google_client_id> \
-GoogleClientSecret <google_client_secret> \
-MetaClientId <meta_client_id> \
-MetaClientSecret <meta_client_secret> \
-LinkedinClientId <linkedin_client_id> \
-LinkedinClientSecret <linkedin_client_secret> \
-XClientId <x_client_id> \
-XClientSecret <x_client_secret>After this, connect providers from the Channels section in the app and verify /api/system/status shows oauth_providers_configured=true for providers you set.
Run a deployment verification and generate a report:
./infra/verify.ps1 -StackName brandpilot-prod -Region us-east-1 -ApiUrl https://givev7ga9i.execute-api.us-east-1.amazonaws.comTemplate file: infra/template.yaml
Default schedule expression in template: cron(0 8 ? * MON *).
The scheduler function is image-based and deployed with --resolve-image-repos.
Deploy the React frontend to an S3 static website bucket wired to the live API:
./infra/deploy_frontend.ps1 -StackName brandpilot-prod -Region us-east-1The script will:
- Resolve API URL from CloudFormation outputs
- Build frontend with
VITE_API_BASE_URLpointing to deployed API - Configure S3 static website hosting and upload build artifacts
- Print the public website URL
SNS publish is live after deployment, but email delivery requires at least one subscription:
aws sns subscribe \
--topic-arn <DigestTopicArn output> \
--protocol email \
--notification-endpoint <your-email>Then confirm the subscription from the inbox confirmation email.
GET /healthPOST /api/auth/registerPOST /api/auth/loginGET /api/auth/meGET /api/auth/google/startGET /api/auth/google/callbackGET /api/system/statusGET /api/onboardingPOST /api/onboardingPOST /api/runGET /api/runsGET /api/dashboard/{persona}GET /api/digest/latestGET /api/strategy/latestGET /api/timelinePOST /api/timelinePOST /api/timeline/itemPATCH /api/timeline/{item_id}GET /api/integrationsGET /api/integrations/oauth/{provider}/startGET /api/integrations/oauth/{provider}/callbackPOST /api/integrations/{provider}/disconnect
Backend:
cd backend
pytestFrontend:
cd frontend
npm run buildImplemented in code:
- Multi-agent fleet execution
- Persona dashboards
- Parallel orchestration
- S3-compatible results persistence
- Bedrock digest integration path
- SNS digest publish path
- Scheduler integration path
- Verification script + readiness report generation (
infra/verify.ps1) - Demo runbook (
docs/hackathon_runbook.md)
Still manual (outside code):
- YouTube demo recording/upload
- Devpost submission form completion
- Blog post publishing and link submission