Monte Carlo tools: three-point cost estimation and an educational retirement drawdown simulator.
One address for any MCP client. No sign-in needed on this server.
1 read1 other
Grouped by tool name. At most: only reads or looks up information.
Odel charges nothing per call. The publisher may charge for its own service.
A mobile-first contractor cost estimation app that uses Monte Carlo simulation to provide probabilistic risk analysis for job quotes. Built natively for iOS (SwiftUI) and Android (Jetpack Compose).
EstiMate helps tradespeople and contractors move beyond single-point estimates to understand the range of likely costs and risks. Instead of guessing a single number, you input your estimates with uncertainty levels, and the app runs thousands of simulations to show you the probability distribution of total costs.
Key Value Propositions:
| Region | Currency | Distance | Terminology |
|---|---|---|---|
| US | USD ($) | Miles | Contractor, Labor |
| UK | GBP (£) | Miles | Tradesperson, Labour |
| Canada | CAD ($) | Kilometers | Contractor, Labour |
| Australia | AUD ($) | Kilometers | Tradie, Labour |
| New Zealand | NZD ($) | Kilometers | Tradie, Labour |
contractors_app/
├── ios/RiskEstimator/ # iOS application
│ └── RiskEstimator/
│ ├── RiskEstimatorApp.swift # App entry point
│ ├── ContentView.swift # Root navigation
│ ├── ViewModels/
│ │ └── EstimatorViewModel.swift
│ ├── Models/
│ │ ├── Project.swift
│ │ ├── LineItem.swift
│ │ ├── Worker.swift
│ │ └── SimulationResult.swift
│ ├── Services/
│ │ ├── MonteCarloEngine.swift
│ │ ├── StorageService.swift
│ │ └── PDFService.swift
│ ├── Views/
│ │ ├── Screens/
│ │ │ ├── HomeScreen.swift
│ │ │ ├── EstimatorScreen.swift
│ │ │ └── ResultsScreen.swift
│ │ └── Components/
│ │ ├── RiskSlider.swift
│ │ ├── ComplexitySlider.swift
│ │ ├── TrafficSlider.swift
│ │ ├── BellCurveChart.swift
│ │ └── ...
│ └── Utils/
│ ├── Localization.swift
│ └── CurrencyFormatter.swift
│
├── android/RiskEstimator/ # Android application
│ └── app/src/main/java/com/riskestimator/app/
│ ├── MainActivity.kt
│ ├── ui/
│ │ ├── RiskEstimatorApp.kt
│ │ ├── EstimatorViewModel.kt
│ │ ├── screens/
│ │ │ ├── HomeScreen.kt
│ │ │ ├── EstimatorScreen.kt
│ │ │ └── ResultsScreen.kt
│ │ ├── components/
│ │ │ ├── RiskSlider.kt
│ │ │ ├── BellCurveChart.kt
│ │ │ └── ...
│ │ └── theme/
│ ├── data/
│ │ ├── model/
│ │ └── repository/
│ └── domain/
│ ├── MonteCarloEngine.kt
│ └── PDFService.kt
│
├── icons/ # App icon assets
├── PROGRESS.md # Project roadmap & status
└── contractor_app_market_research.md
Both platforms follow the MVVM (Model-View-ViewModel) pattern:
┌─────────────────────────────────────────────────────────┐
│ Views │
│ (SwiftUI Views / Jetpack Compose Screens) │
└─────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ ViewModel │
│ - Manages UI state │
│ - Coordinates between Views and Services │
│ - Triggers simulations │
└─────────────────────────────────────────────────────────┘
│
┌───────────────┼───────────────┐
▼ ▼ ▼
┌─────────────────┐ ┌───────────┐ ┌─────────────────┐
│ MonteCarloEngine│ │StorageRepo│ │ PDFService │
│ │ │ │ │ │
│ - Simulation │ │ - CRUD │ │ - Generate PDF │
│ - Statistics │ │ - Persist │ │ - Export │
└─────────────────┘ └───────────┘ └─────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ Models │
│ Project, LineItem, Worker, SimulationResult │
└─────────────────────────────────────────────────────────┘
struct Project {
id: UUID
name: String
clientName: String
createdAt: Date
profitMargin: Double // Default 15%
lineItems: [LineItem]
workers: [Worker] // iOS only
estimatedDays: Double
complexityLevel: ComplexityLevel
hourlyLaborRate: Double
hoursPerDay: Double
travelTimeMinutes: Double
trafficVariability: TrafficVariability
numberOfSiteVisits: Int // 0 = auto-calculate
includeReturnTrip: Bool
mileageRate: Double
distance: Double
}
struct LineItem {
id: UUID
name: String
estimatedCost: Double
category: ItemCategory // Material, Labor, Subcontractor, Other
riskLevel: RiskLevel // Certain, Low, Medium, High, WildGuess
}
struct SimulationResult {
simulations: [Double] // All iteration results
percentile10/50/80/90/95: Double
mean: Double
standardDeviation: Double
min, max: Double
// Category breakdowns
materialCostP50/P80: Double
durationCostP50/P80: Double
travelCostP50/P80: Double
iterationsRun: Int
isConverged: Bool
}
| Level | Variance | Use Case |
|---|---|---|
| Certain | ±2% | Fixed contracts, locked prices |
| Low | ±8% | Reliable suppliers, stable costs |
| Medium | ±15% | Standard market variability |
| High | ±25% | Volatile materials, uncertain labor |
| Wild Guess | ±40% | Unknown scope, new vendors |
| Complexity | Variance | Use Case |
|---|---|---|
| Routine | ±10% | Repeat jobs, familiar scope |
| Moderate | ±25% | Standard projects |
| Complex | ±40% | Multi-trade, custom work |
| Unknown Scope | ±60% | Discovery needed, unknowns |
| Traffic | Variance | Use Case |
|---|---|---|
| Predictable | ±10% | Rural, fixed schedule |
| Variable | ±25% | Suburban, normal traffic |
| High Variability | ±50% | Urban, rush hour |
ios/RiskEstimator/RiskEstimator.xcodeproj in XcodeRequirements:
android/RiskEstimator in Android StudioRequirements:
The simulation engine uses the Box-Muller transform to generate normally distributed random values with optional skew toward overages (reflecting real-world project behavior).
For each iteration (1,000 - 10,000):
1. For each line item:
- Generate random variance based on risk level
- Apply skewed normal distribution (bias toward overages)
- Calculate simulated cost
2. For duration:
- Generate random variance based on complexity
- Calculate labor cost = days × hours × rate
3. For travel:
- Correlate visits with duration uncertainty
- Generate traffic variance
- Calculate travel time + mileage costs
4. Sum all costs + profit margin
Calculate statistics from all iterations
Check for convergence (P80 standard error < 0.5%)
The engine runs adaptively:
Quotes are generated for client presentation:
Both platforms use local-only storage:
No cloud sync, no server required - works fully offline in the field.
Version: 1.1 (MVP Feature-Complete)
See PROGRESS.md for detailed roadmap.
Proprietary - All rights reserved.
The web app publishes /.well-known/changes.json and /changes.json (verified-changes/0.1). See web/README.md.