ExitStorm takes project ideas and produces financial models, priority scores, team recommendations, and points allocations. It is designed for use by AI agents that read the codebase on GitHub and call the package functions directly - no Discord bot, no web UI, no API server required.
What it does:
- Financial modeling. Every idea gets ARR projections, valuation ranges, and a priority score across 8 weighted criteria.
- Team matching. Matches contributors to project roles based on contribution history and role affinity scores.
- Points allocation. Calculates total project points by ARR tier, applies a priority multiplier, and breaks down unlocks by milestone.
Five packages. No apps layer. Agents call the packages directly.
+--------------+
| @exitstorm |
| /core | <- types, constants, utils
+------+-------+
|
+---------------+---------------+
| | |
+------+------+ +------+------+ +------+-------+
| @exitstorm | | @exitstorm | | @exitstorm |
| /analyzer | | /graphics | | /team-engine |
+------+------+ +------+------+ +------+-------+
| | |
| | +------+-------+
| | | @exitstorm |
| | | /db |
| | +------+-------+
| | |
+---------------+---------------+
(agent calls directly)
Dependency rules: core has no internal deps. analyzer and graphics depend only on core. team-engine depends on core and db. db depends on core.
# Install and build
pnpm install
pnpm build
pnpm testCopy .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. |
# Analyze a project idea
node packages/analyzer/dist/cli.js "AdLens" "AI-powered ad optimization for SMBs"
# Allocate points for an approved project
node packages/team-engine/dist/cli.js allocate --arr 85000 --priority 8.2import { analyzeProject } from '@exitstorm/analyzer';
import { allocateProjectPoints } from '@exitstorm/team-engine';
// Run financial analysis
const analysis = await analyzeProject('AdLens', 'AI-powered ad optimization for SMBs');
console.log(analysis.priorityScore); // 0-10
console.log(analysis.arr.realistic); // projected ARR
// Calculate points allocation
const allocation = allocateProjectPoints(analysis);
console.log(allocation.totalPoints);
console.log(allocation.milestones);| Package | Description | Key Exports |
|---|---|---|
@exitstorm/core |
Shared types, constants, and utilities | ProjectAnalysis, Member, Contribution, scoring constants |
@exitstorm/analyzer |
AI financial analysis engine | analyzeProject(), computePriorityScore(), priorityVerdict() |
@exitstorm/team-engine |
Contributor matching and points allocation | recommendTeam(), allocateProjectPoints() |
@exitstorm/graphics |
AI image generation for project visuals | generateProjectGraphics() |
@exitstorm/db |
SQLite database layer with migrations | ContributionDB, query helpers, migration runner |
| Type | Source | Base Points |
|---|---|---|
helpful_conversation |
AI analysis | 5-15 |
teaching_moment |
AI analysis | 8-20 |
tool_share |
AI analysis | 5-10 |
pr_merged |
GitHub webhook | 15-30 |
pr_review |
GitHub webhook | 10-20 |
peer_vouch |
Direct call | 5 |
challenge_completed |
Bounty system | Variable |
streak_bonus |
Daily activity | 3-30 |
Every project is scored 0-10 across 8 weighted dimensions:
| Criterion | Weight | What It Measures |
|---|---|---|
| ARR Quality | 15% | Recurring, predictable revenue |
| Churn Achievability | 10% | Product stickiness |
| Founder Independence | 10% | Automation level |
| Rule of 40 Potential | 15% | Growth + margin headroom |
| Pricing Power | 10% | Ability to raise prices |
| Market Timing | 10% | Window opportunity |
| Build Speed | 15% | Time to MVP |
| Defensibility | 15% | Competitive moat |
Verdicts: <5 skip · 5-7 queue · 7-8 solid · 8+ build first
Points scale with the project's realistic ARR projection:
| Realistic 12mo ARR | Base Points | With 8+ Priority (1.5x) |
|---|---|---|
| < $10K | 500 | 750 |
| $10K-$50K | 1,500 | 2,250 |
| $50K-$200K | 5,000 | 7,500 |
| $200K-$1M | 15,000 | 22,500 |
| $1M+ | 50,000 | 75,000 |
Points unlock progressively as the project hits milestones:
Kickoff (5%) -> MVP (20%) -> First Customer (35%) -> $1K MRR (50%)
-> $5K MRR (65%) -> Breakeven (80%) -> Target ARR (95%) -> Exit (100%)
| Level | Name | Min Points |
|---|---|---|
| 1 | Newcomer | 0 |
| 2 | Participant | 50 |
| 3 | Contributor | 200 |
| 4 | Regular | 500 |
| 5 | Champion | 1,000 |
| 6 | Legend | 2,500 |
| 7 | Architect | 5,000 |
ExitStorm supports custom analyzers via the AnalyzerPlugin interface from @exitstorm/core:
import type { AnalyzerPlugin, ProjectAnalysis } from '@exitstorm/core';
export const myAnalyzer: AnalyzerPlugin = {
name: 'my-analyzer',
version: '1.0.0',
analyze: async (title, description) => {
// Your analysis logic
return { /* Partial<ProjectAnalysis> */ };
},
};exitstorm/
├── packages/
│ ├── core/ # Shared types, constants, utilities
│ ├── analyzer/ # AI financial analysis engine
│ ├── graphics/ # AI image generation
│ ├── team-engine/ # Contributor matching + points allocation
│ └── db/ # SQLite database + migrations
├── scripts/ # Migration and setup scripts
├── docs/ # Architecture and contribution docs
├── turbo.json # Turborepo pipeline config
├── pnpm-workspace.yaml # pnpm workspace config
└── package.json # Root package.json
See CONTRIBUTING.md for guidelines.
MIT - see LICENSE for details.
Built by Advertising Report Card