diff --git a/.env.example b/.env.example index cf33833..a265ac8 100644 --- a/.env.example +++ b/.env.example @@ -5,6 +5,9 @@ ANTHROPIC_API_KEY= # sk-ant-api* format OPENAI_API_KEY= # sk-* format (fallback if Anthropic unavailable) +# Model override (optional - defaults to claude-haiku-4-5-20250315) +EXITSTORM_ANALYSIS_MODEL= + # Database DB_PATH=data/contributions.db diff --git a/.superpowers/brainstorm/50469-1774880047/content/homepage-direction.html b/.superpowers/brainstorm/50469-1774880047/content/homepage-direction.html new file mode 100644 index 0000000..fb16413 --- /dev/null +++ b/.superpowers/brainstorm/50469-1774880047/content/homepage-direction.html @@ -0,0 +1,51 @@ +

ExitStorm Homepage - Direction

+

What vibe should the homepage set?

+ +
+
+
+
+
analyzeProject("AdLens", "AI ad optimization")
+
+
+
8.1
+
PRIORITY
+
+
+
$96K
+
ARR
+
+
+
7,500
+
POINTS
+
+
+
+
+

A: Dark Tech / Developer-Focused

+

Dark background, terminal-style code snippets, glowing accent colors. Speaks to builders and AI agents. Shows the pipeline as a live demo. "Drop an idea, get a financial model."

+
+
+ +
+
+
+
Turn Ideas Into Exits
+
Financial models. Priority scores. Team matching. Automated.
+
+
+
8 Criteria
+
SCORING
+
+
+
5 Tiers
+
VALUATION
+
+
+
+
+

B: Clean / Business-Focused

+

Light background, clean typography, professional feel. Speaks to founders and operators. Shows the value prop clearly. "The operating system for micro-SaaS exits."

+
+
+
diff --git a/.superpowers/brainstorm/50469-1774880047/content/homepage-layout.html b/.superpowers/brainstorm/50469-1774880047/content/homepage-layout.html new file mode 100644 index 0000000..baf42ad --- /dev/null +++ b/.superpowers/brainstorm/50469-1774880047/content/homepage-layout.html @@ -0,0 +1,37 @@ +

Homepage Layout - Sections

+

How should the page flow? Click to select.

+ +
+
+
A
+
+

Split Audience - Tabs

+

Hero section shared, then two tabs: "I'm Building" and "I'm Investing". Each tab shows tailored messaging. Keeps the page short, lets each audience self-select.

+
+ Hero -> [Builders Tab | Investors Tab] -> How It Works -> CTA +
+
+
+ +
+
B
+
+

Single Scroll - Two Zones

+

Bold hero that hooks everyone, then a "For Builders" section with the pipeline and scoring, then a "For Investors" section with due diligence and portfolio analysis. Natural scroll, no tabs.

+
+ Hero -> For Builders (pipeline, scoring, teams) -> For Investors (analysis, portfolio, due diligence) -> CTA +
+
+
+ +
+
C
+
+

Unified Story - Woven Together

+

One narrative that serves both: "Here's how ideas become exits." Each section naturally speaks to both audiences - builders see the tools, investors see the rigor. Audience-specific CTAs at the bottom.

+
+ Hero -> The Pipeline -> Scoring -> Financials -> Teams -> Track Record -> Builder CTA | Investor CTA +
+
+
+
diff --git a/.superpowers/brainstorm/50469-1774880047/content/homepage-mockup.html b/.superpowers/brainstorm/50469-1774880047/content/homepage-mockup.html new file mode 100644 index 0000000..d127a8a --- /dev/null +++ b/.superpowers/brainstorm/50469-1774880047/content/homepage-mockup.html @@ -0,0 +1,445 @@ + + + + + +ExitStorm - Homepage Mockup + + + + + +
+

Stop Building Things
That Won't Sell

+

ExitStorm turns raw ideas into financial models, priority scores, and exit plans. Know if it's worth building before you write a line of code.

+
+
+
8.1
+
Priority Score
+
+
+
$96K
+
Projected ARR
+
+
+
$1.15M
+
Exit Valuation
+
+
+
+ + +
+
+ +

From Idea to Exit in 6 Steps

+

Every idea goes through the same rigorous process. No gut feelings. No guessing.

+
+
+
💡
+

Idea Input

+

Title + description. That's all it takes.

+
+
+
📈
+

Financial Model

+

ARR projections, valuation, breakeven timeline.

+
+
+
🎯
+

Priority Score

+

8 weighted criteria. 0-10 score. Build or skip.

+
+
+
👥
+

Team Assembly

+

Auto-matched from contributor history.

+
+
+
📊
+

Milestone Tracking

+

Points unlock as you hit real targets.

+
+
+
💰
+

Exit

+

List on Flippa/Acquire.com. Distribute proceeds.

+
+
+
+
+ + +
+
Scoring
+

8 Criteria That Predict Exit-ability

+

Not generic startup metrics. These are tuned for what Flippa and Acquire.com buyers actually look for.

+
+
+
15%
+

ARR Quality

How recurring and predictable is the revenue?

+
+
+
15%
+

Rule of 40 Potential

Growth + margin headroom within 12 months.

+
+
+
15%
+

Build Speed

Under 2 weeks = 10. Over a year = 1. Ship fast, flip fast.

+
+
+
15%
+

Defensibility

Proprietary data, network effects, or thin wrapper?

+
+
+
10%
+

Churn Achievability

Embedded workflow tool or novelty single-use?

+
+
+
10%
+

Founder Independence

Fully automated = 10. Founder-dependent = 2. Buyers want hands-off.

+
+
+
10%
+

Pricing Power

Solves a $10K+/yr pain point, or commodity?

+
+
+
10%
+

Market Timing

Riding a trend, or ahead of the market?

+
+
+
+

Verdicts: Score under 5 = don't build. 5-7 = queue it. 7-8 = solid. 8+ = build first. The math is deterministic - AI provides the ratings, the weights are locked in code.

+
+
+ + +
+
Financial Modeling
+

Know Your Exit Number Before You Code

+

Every idea gets a complete financial model using acquisition multiples that match what buyers actually pay.

+
+
+

12-Month ARR

+
$96K
+
Realistic scenario
+
Conservative: $36K / Optimistic: $180K
+
+
+

Valuation Range

+
$288K - $1.15M
+
8-12x ARR (B2B AI SaaS)
+
+
+

Breakeven

+
8 mo
+
Exit window: 18-24 months
+
+
+ + + + + + + + + + + +
TypeMultipleWhy
B2B AI SaaS8-12x ARRHighest demand from acquirers right now
B2C SaaS3-5x ARRHigher churn, lower switching costs
Micro-SaaS2.5-4.5x SDESolo-buildable, under 3 months. SDE = ARR x 0.6
API Tools5-8x ARRUsage-based, sticky integration
Marketplace3-6x ARRNetwork effects offset by liquidity risk
+
+ + +
+
+ +

Earn What You Contribute. No Equity Fights.

+

Points replace equity negotiations. Earned by verified work, vested against real milestones, backed by a complete audit trail.

+ +
+
Lead Builder35%
+
Co-Builder20%
+
Designer / UX15%
+
QA / Testing10%
+
Growth / Marketing10%
+
Community5%
+
Docs / PM5%
+
+ +
+

Points unlock as the project hits real milestones:

+
+
5%
Kickoff
+
20%
MVP
+
35%
1st Customer
+
50%
$1K MRR
+
65%
$5K MRR
+
80%
Breakeven
+
95%
ARR Target
+
100%
Exit
+
+
+
+
+ + +
+
For Investors
+

Due Diligence, Automated

+

Every project in the pipeline comes with structured data you can actually evaluate. No decks. No pitch theater. Just numbers.

+
+
+
📊
+

Standardized Financial Models

+

Every project gets the same analysis: 3-scenario ARR, valuation ranges using real acquisition multiples, breakeven timeline. Compare apples to apples across the entire pipeline.

+
+
+
🎯
+

8-Criteria Scoring

+

Weighted for exit-ability, not vanity. Founder Independence, Build Speed, and Defensibility are scored explicitly. The math is deterministic and auditable.

+
+
+
👥
+

Team Composition Data

+

See who's building what, matched by verified contribution history. No self-reported skills. Every team member earned their role through tracked, evidenced work.

+
+
+
🔒
+

Complete Audit Trail

+

Every contribution has a source, evidence, and timestamp. Daily point caps, vouch limits, and anti-gaming constraints mean the data is trustworthy enough to allocate real money against.

+
+
+
+ + + + + + + + diff --git a/.superpowers/brainstorm/50469-1774880047/state/events b/.superpowers/brainstorm/50469-1774880047/state/events new file mode 100644 index 0000000..50fe92d --- /dev/null +++ b/.superpowers/brainstorm/50469-1774880047/state/events @@ -0,0 +1 @@ +{"type":"click","text":"⚡\n Turn Ideas Into Exits\n Financial models. Priority scores. Team matching. Automated.\n \n \n 8 Criteria\n SCORING\n \n \n 5 Tiers\n VALUATION\n \n \n \n \n B: Clean / Business-Focused\n Light background, clean typography, professional feel. Speaks to founders and operators. Shows the value prop clearly. \"The operating system for micro-SaaS exits.\"","choice":"b","id":null,"timestamp":1774884555107} diff --git a/.superpowers/brainstorm/50469-1774880047/state/server-stopped b/.superpowers/brainstorm/50469-1774880047/state/server-stopped new file mode 100644 index 0000000..4e39d79 --- /dev/null +++ b/.superpowers/brainstorm/50469-1774880047/state/server-stopped @@ -0,0 +1 @@ +{"reason":"idle timeout","timestamp":1774881907261} diff --git a/.superpowers/brainstorm/50469-1774880047/state/server.pid b/.superpowers/brainstorm/50469-1774880047/state/server.pid new file mode 100644 index 0000000..72c21f8 --- /dev/null +++ b/.superpowers/brainstorm/50469-1774880047/state/server.pid @@ -0,0 +1 @@ +50479 diff --git a/README.md b/README.md index 0a150e4..3610be6 100644 --- a/README.md +++ b/README.md @@ -63,6 +63,18 @@ pnpm build pnpm test ``` +### Environment variables + +Copy `.env.example` to `.env` and fill in at least one AI provider key: + +| Variable | Required | Default | Description | +|---|---|---|---| +| `ANTHROPIC_API_KEY` | One of these two | - | Anthropic API key (`sk-ant-api*`). Preferred provider. | +| `OPENAI_API_KEY` | One of these two | - | OpenAI key (`sk-*`). Fallback if Anthropic is unavailable or unset. | +| `EXITSTORM_ANALYSIS_MODEL` | No | `claude-haiku-4-5-20250315` | Override the Anthropic model used for analysis. | +| `DB_PATH` | No | `data/contributions.db` | Path to the SQLite database file. | +| `EXITSTORM_IMAGE_SCRIPT` | No | - | Path to an external image generation script. Graphics are skipped if unset. | + ### CLI usage ```bash diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 0000000..a6d469e --- /dev/null +++ b/docs/index.html @@ -0,0 +1,711 @@ + + + + + +Exitstorm + + + + + + +
+
+
+ +
+
+ +
+
+
+
ARC Web
+

Exitstorm
TypeScript

+
Community-powered micro-SaaS exit machine. Discord → financial model → team → build → exit.
+
TypeScriptOpen Source
+
+
+ +
+ +
+
+
+
The problem
+

What's broken without this

+
+
+
+ 🤔 +
Idea viability unclear
+
Founders pitch ideas without financial projections, making it impossible to compare which projects deserve resources.
+
+
+ 👥 +
Team matching is manual
+
Assigning contributors to roles relies on gut feel rather than analyzing actual contribution patterns and skill fit.
+
+
+ 📊 +
No standardized scoring
+
Exit potential and project priority are subjective arguments instead of calculated outputs from consistent criteria.
+
+
+
+ +
+ +
+
+
+
The difference
+

Why it matters

+ +
+
+
Without
+
Manual work
Slow iteration
Repeated mistakes
+
+
+
With this
+
Runs as a package inside AI agents—no separate API or bot infrastructure to maintain
Combines financial modeling, team matching, and points allocation in one deterministic pipeline
Outputs machine-readable JSON designed for downstream automation, not human dashboards
+
+
+
+
+ +
+ +
+
+
+
Under the hood
+

How it works

+ +
+
+
📥
+
+
Parse idea + codebase
+
AI agent reads GitHub repo, extracts project scope, tech stack, and contributor history.
+ +
+
+
+
⚙️
+
+
Run analyzer pipeline
+
ExitStorm calculates ARR projections across 8 weighted criteria (market size, defensibility, team capacity), generates priority scores, matches contributors by role affinity, and allocates points by milestone.
+ +
+
+
+
📤
+
+
Return structured output
+
Agent receives financial model, valuation range, team assignments, and points breakdown as JSON—ready to feed into decision systems.
+ +
+
+
+
+ +
+ +
+
+
+
What it does
+

Core capabilities

+
+
+
+ +
Fast
+
Optimized for speed and efficiency.
+
+
+ 🎯 +
Reliable
+
Built to work consistently.
+
+
+ 🔌 +
Integrates
+
Works with your existing tools.
+
+
+
+ +
+ +
+
+
+
We built this so AI agents can score and staff projects the same way every time, without asking humans to guess.
+
+
arc-web/exitstorm
+
+
+ +
+ +
+
+
+
Codebase
+

Built with care

+
+
+
+ 💻 +
TypeScript
+
Built in TypeScript for type safety and reliability.
+
+
+ 🏗️ +
Architecture
+
SDK/Library
+
+
+ 📦 +
Key deps
+
@types/node, turbo, typescript
+
+
+ 🔓 +
Open Source (MIT / PolyForm)
+
Fork it, extend it, ship it. It's yours.
+
+
+
+ +
+ +
+
+
+
Built by
+

Mike Ensor
Arc Web

+
AI automation, marketing technology, building tools that work.
+
Mike builds open-source AI tools for agencies, marketers, and operators who are done waiting for software to catch up. All Arc Web projects are open source by default — fork them, extend them, ship them.
+
+
+
+ + +
1 / 8
+
\u2190 \u2192 arrow keys  |  P to play  |  M to mute
+
+ + + + + \ No newline at end of file diff --git a/docs/presentation/index.html b/docs/presentation/index.html new file mode 100644 index 0000000..a6d469e --- /dev/null +++ b/docs/presentation/index.html @@ -0,0 +1,711 @@ + + + + + +Exitstorm + + + + + + +
+
+
+ +
+
+ +
+
+
+
ARC Web
+

Exitstorm
TypeScript

+
Community-powered micro-SaaS exit machine. Discord → financial model → team → build → exit.
+
TypeScriptOpen Source
+
+
+ +
+ +
+
+
+
The problem
+

What's broken without this

+
+
+
+ 🤔 +
Idea viability unclear
+
Founders pitch ideas without financial projections, making it impossible to compare which projects deserve resources.
+
+
+ 👥 +
Team matching is manual
+
Assigning contributors to roles relies on gut feel rather than analyzing actual contribution patterns and skill fit.
+
+
+ 📊 +
No standardized scoring
+
Exit potential and project priority are subjective arguments instead of calculated outputs from consistent criteria.
+
+
+
+ +
+ +
+
+
+
The difference
+

Why it matters

+ +
+
+
Without
+
Manual work
Slow iteration
Repeated mistakes
+
+
+
With this
+
Runs as a package inside AI agents—no separate API or bot infrastructure to maintain
Combines financial modeling, team matching, and points allocation in one deterministic pipeline
Outputs machine-readable JSON designed for downstream automation, not human dashboards
+
+
+
+
+ +
+ +
+
+
+
Under the hood
+

How it works

+ +
+
+
📥
+
+
Parse idea + codebase
+
AI agent reads GitHub repo, extracts project scope, tech stack, and contributor history.
+ +
+
+
+
⚙️
+
+
Run analyzer pipeline
+
ExitStorm calculates ARR projections across 8 weighted criteria (market size, defensibility, team capacity), generates priority scores, matches contributors by role affinity, and allocates points by milestone.
+ +
+
+
+
📤
+
+
Return structured output
+
Agent receives financial model, valuation range, team assignments, and points breakdown as JSON—ready to feed into decision systems.
+ +
+
+
+
+ +
+ +
+
+
+
What it does
+

Core capabilities

+
+
+
+ +
Fast
+
Optimized for speed and efficiency.
+
+
+ 🎯 +
Reliable
+
Built to work consistently.
+
+
+ 🔌 +
Integrates
+
Works with your existing tools.
+
+
+
+ +
+ +
+
+
+
We built this so AI agents can score and staff projects the same way every time, without asking humans to guess.
+
+
arc-web/exitstorm
+
+
+ +
+ +
+
+
+
Codebase
+

Built with care

+
+
+
+ 💻 +
TypeScript
+
Built in TypeScript for type safety and reliability.
+
+
+ 🏗️ +
Architecture
+
SDK/Library
+
+
+ 📦 +
Key deps
+
@types/node, turbo, typescript
+
+
+ 🔓 +
Open Source (MIT / PolyForm)
+
Fork it, extend it, ship it. It's yours.
+
+
+
+ +
+ +
+
+
+
Built by
+

Mike Ensor
Arc Web

+
AI automation, marketing technology, building tools that work.
+
Mike builds open-source AI tools for agencies, marketers, and operators who are done waiting for software to catch up. All Arc Web projects are open source by default — fork them, extend them, ship them.
+
+
+
+ + +
1 / 8
+
\u2190 \u2192 arrow keys  |  P to play  |  M to mute
+
+ + + + + \ No newline at end of file diff --git a/packages/analyzer/src/analyze.ts b/packages/analyzer/src/analyze.ts index 8ecb890..0d97347 100644 --- a/packages/analyzer/src/analyze.ts +++ b/packages/analyzer/src/analyze.ts @@ -8,11 +8,39 @@ import { buildAnalysisPrompt } from './prompt.js'; // ── AI Providers ─────────────────────────────────────────────────────────── +const ANALYSIS_MODEL = process.env.EXITSTORM_ANALYSIS_MODEL ?? 'claude-haiku-4-5-20250315'; + +/** Fetch with a timeout and up to `retries` retry attempts on network errors. */ +async function fetchWithRetry( + url: string, + init: RequestInit, + timeoutMs = 30_000, + retries = 2, +): Promise { + let lastErr: unknown; + for (let attempt = 0; attempt <= retries; attempt++) { + const controller = new AbortController(); + const timer = setTimeout(() => controller.abort(), timeoutMs); + try { + const res = await fetch(url, { ...init, signal: controller.signal }); + clearTimeout(timer); + return res; + } catch (err) { + clearTimeout(timer); + lastErr = err; + if (attempt < retries) { + await new Promise((r) => setTimeout(r, 500 * (attempt + 1))); + } + } + } + throw lastErr; +} + async function callAnthropic(apiKey: string, prompt: string): Promise { const { default: Anthropic } = await import('@anthropic-ai/sdk'); const client = new Anthropic({ apiKey }); const response = await client.messages.create({ - model: 'claude-haiku-4-5-20250315', + model: ANALYSIS_MODEL, max_tokens: 1800, messages: [{ role: 'user', content: prompt }], }); @@ -21,7 +49,12 @@ async function callAnthropic(apiKey: string, prompt: string): Promise { } async function callOpenAI(apiKey: string, prompt: string): Promise { - const res = await fetch('https://api.openai.com/v1/chat/completions', { + if (!apiKey?.startsWith('sk-')) { + throw new Error( + 'OPENAI_API_KEY is missing or malformed. Set it to a valid sk-* key before using the OpenAI provider.', + ); + } + const res = await fetchWithRetry('https://api.openai.com/v1/chat/completions', { method: 'POST', headers: { Authorization: `Bearer ${apiKey}`,