Skip to content

Commit 4836bd4

Browse files
rayketchamclaude
andcommitted
Add demo seed data, env file support, finalize deployment
5 seed ideas across security, devops, privacy, automation, compliance. Systemd service loads .env file for API key. Cron gracefully handles missing API key. Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 040d083 commit 4836bd4

3 files changed

Lines changed: 150 additions & 0 deletions

File tree

scripts/generate-once.sh

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,19 @@
33
set -euo pipefail
44

55
cd /opt/project-forge
6+
7+
# Load API key from .env if it exists
8+
if [ -f .env ]; then
9+
set -a
10+
source .env
11+
set +a
12+
fi
13+
614
export FORGE_DB_PATH="${FORGE_DB_PATH:-/opt/project-forge/data/forge.db}"
715

16+
if [ -z "${ANTHROPIC_API_KEY:-}" ]; then
17+
echo "$(date): ANTHROPIC_API_KEY not set. Create /opt/project-forge/.env with ANTHROPIC_API_KEY=sk-ant-..."
18+
exit 0
19+
fi
20+
821
exec python3 -m project_forge.cron.runner

scripts/project-forge-web.service

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ User=claude
88
WorkingDirectory=/opt/project-forge
99
Environment=FORGE_DB_PATH=/opt/project-forge/data/forge.db
1010
Environment=FORGE_PORT=55443
11+
EnvironmentFile=-/opt/project-forge/.env
1112
ExecStart=/usr/bin/python3 -m uvicorn project_forge.web.app:app --host 0.0.0.0 --port 55443 --log-level info
1213
Restart=on-failure
1314
RestartSec=5

scripts/seed-demo.py

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
"""Seed the database with example ideas for demo purposes."""
2+
3+
import asyncio
4+
import sys
5+
from pathlib import Path
6+
7+
sys.path.insert(0, str(Path(__file__).parent.parent / "src"))
8+
9+
from project_forge.models import Idea, IdeaCategory # noqa: E402
10+
from project_forge.storage.db import Database # noqa: E402
11+
12+
DEMO_IDEAS = [
13+
Idea(
14+
name="Ghost Keys",
15+
tagline="Detect orphaned API keys across your entire infrastructure",
16+
description=(
17+
"Ghost Keys scans your infrastructure for API keys that are still active but no longer "
18+
"used by any service. It integrates with cloud providers, secret managers, and application "
19+
"logs to build a dependency graph of key usage. Keys with no recent activity get flagged "
20+
"for rotation or revocation.\n\n"
21+
"Most organizations have hundreds of API keys that nobody remembers creating. "
22+
"Each one is a potential attack vector waiting to be exploited."
23+
),
24+
category=IdeaCategory.SECURITY_TOOL,
25+
market_analysis=(
26+
"API key sprawl is a growing problem as organizations adopt more SaaS tools and "
27+
"microservices. Existing secret scanners find exposed keys but don't track usage. "
28+
"This fills the gap between secret detection and secret lifecycle management."
29+
),
30+
feasibility_score=0.85,
31+
mvp_scope=(
32+
"CLI tool that scans AWS IAM, GitHub tokens, and common secret managers. "
33+
"Reports unused keys older than 30 days. No rotation in MVP, just detection."
34+
),
35+
tech_stack=["python", "boto3", "click", "sqlite"],
36+
),
37+
Idea(
38+
name="Drift Sentinel",
39+
tagline="Real-time infrastructure drift detection with auto-fix suggestions",
40+
description=(
41+
"Drift Sentinel continuously monitors your infrastructure state against your IaC "
42+
"definitions and alerts when drift occurs. Unlike terraform plan which is point-in-time, "
43+
"this runs continuously and catches manual changes, failed deployments, and config drift "
44+
"the moment they happen.\n\n"
45+
"It generates fix suggestions as PR-ready IaC patches, not just alerts."
46+
),
47+
category=IdeaCategory.DEVOPS_TOOLING,
48+
market_analysis=(
49+
"Infrastructure drift costs teams hours of debugging when production diverges from code. "
50+
"Existing tools detect drift but don't help fix it. The auto-fix-as-PR approach is novel."
51+
),
52+
feasibility_score=0.78,
53+
mvp_scope=(
54+
"Agent that polls Terraform state vs actual AWS resources every 5 minutes. "
55+
"Generates diff reports and creates PRs with suggested .tf fixes."
56+
),
57+
tech_stack=["python", "terraform", "boto3", "fastapi"],
58+
),
59+
Idea(
60+
name="Consent Mesh",
61+
tagline="Distributed consent management for microservice architectures",
62+
description=(
63+
"Consent Mesh provides a sidecar-style consent enforcement layer for microservices. "
64+
"When user consent is granted or revoked, it propagates across all services in real-time "
65+
"via an event mesh. Each service checks consent before processing PII.\n\n"
66+
"GDPR and CCPA require consent propagation but most architectures have no mechanism for it."
67+
),
68+
category=IdeaCategory.PRIVACY,
69+
market_analysis=(
70+
"Privacy regulations are getting stricter globally. Most consent management is centralized "
71+
"and can't keep up with distributed architectures. A mesh approach is the right pattern."
72+
),
73+
feasibility_score=0.72,
74+
mvp_scope=(
75+
"Go sidecar that intercepts HTTP requests, checks consent status from a central store, "
76+
"and blocks or allows based on consent scope. REST API for consent CRUD."
77+
),
78+
tech_stack=["go", "redis", "grpc", "protobuf"],
79+
),
80+
Idea(
81+
name="Pipeline Profiler",
82+
tagline="Find and fix the slowest steps in your CI/CD pipeline",
83+
description=(
84+
"Pipeline Profiler analyzes your GitHub Actions (or GitLab/Jenkins) workflow runs to "
85+
"identify bottlenecks, cache misses, redundant steps, and parallelization opportunities. "
86+
"It generates actionable recommendations with estimated time savings.\n\n"
87+
"Most teams accept slow CI as inevitable. This tool shows exactly where time is wasted."
88+
),
89+
category=IdeaCategory.AUTOMATION,
90+
market_analysis=(
91+
"CI/CD costs are rising fast. A 10-minute pipeline running 50 times a day wastes "
92+
"8+ hours of developer wait time daily. Tools that cut this are immediately valuable."
93+
),
94+
feasibility_score=0.88,
95+
mvp_scope=(
96+
"GitHub App that analyzes workflow run logs, generates a flamegraph-style visualization "
97+
"of step durations, and suggests optimizations via PR comments."
98+
),
99+
tech_stack=["python", "fastapi", "github-api", "d3.js"],
100+
),
101+
Idea(
102+
name="SBOM Watcher",
103+
tagline="Continuous SBOM generation with real-time vulnerability tracking",
104+
description=(
105+
"SBOM Watcher generates Software Bill of Materials on every commit and continuously "
106+
"monitors all dependencies for new CVEs. When a vulnerability is disclosed, it instantly "
107+
"identifies which of your projects are affected and creates prioritized fix PRs.\n\n"
108+
"Current SBOM tools are point-in-time snapshots. This is a living, breathing SBOM."
109+
),
110+
category=IdeaCategory.COMPLIANCE,
111+
market_analysis=(
112+
"SBOM requirements are becoming law (US Executive Order, EU CRA). Most tools generate "
113+
"static SBOMs. A continuous, reactive SBOM with auto-remediation is what the market needs."
114+
),
115+
feasibility_score=0.82,
116+
mvp_scope=(
117+
"GitHub Action that generates CycloneDX SBOM on push, stores versions, "
118+
"and polls NVD/OSV for new CVEs affecting listed components. Slack alerts + PR creation."
119+
),
120+
tech_stack=["python", "cyclonedx", "github-actions", "sqlite"],
121+
),
122+
]
123+
124+
125+
async def main():
126+
db = Database(Path("/opt/project-forge/data/forge.db"))
127+
await db.connect()
128+
for idea in DEMO_IDEAS:
129+
await db.save_idea(idea)
130+
print(f"Seeded: {idea.name} ({idea.category.value}, score: {idea.feasibility_score})")
131+
await db.close()
132+
print(f"\nSeeded {len(DEMO_IDEAS)} demo ideas. Visit http://localhost:55443")
133+
134+
135+
if __name__ == "__main__":
136+
asyncio.run(main())

0 commit comments

Comments
 (0)