CrashForge Server ingests iOS crash payloads, symbolicates them with uploaded dSYMs, enriches frames with source context, sends webhooks, and can open automated fix PRs.
- Accepts dSYM uploads per app/build.
- Accepts crash payloads from iOS clients/SDKs.
- Symbolicates addresses to symbols using
xcrun atos. - Enriches frames using one of:
- GitHub repo + commit SHA
- local source directory
- uploaded source zip
- Streams crash events and auto-fix logs to a web UI via SSE.
- Supports webhook routing with per-app templated rules.
- Runs optional auto-fix PR generation (OpenAI-compatible LLM + GitHub).
- Suppresses duplicate auto-fix runs for identical crash signatures.
- Cleans up temporary cloned repos after each auto-fix run.
- Supports optional dashboard password protection.
- Supports storage provider selection (
localors3) from settings.
This README is for the server repository only.
- Swift SDK repo:
https://github.com/JoshuaRileyDev/crashforge-ios-sdk
- macOS host for symbolication (
xcrun dwarfdump,xcrun atos) - Node.js 20+
- PostgreSQL 14+
- Xcode command line tools
npm install
cp .env.example .env
npm run devHealth check:
curl http://localhost:3000/healthUI:
- Dashboard:
http://localhost:3000 - Settings / Auto-fix config:
http://localhost:3000/settings - Webhook rules:
http://localhost:3000/webhooks - Live auto-fix logs:
http://localhost:3000/logs - Login page (when enabled):
http://localhost:3000/login
Bring up both services:
docker compose up -d --buildIf you changed .env, restart with:
docker compose up -d --build --force-recreatePorts:
- API:
http://localhost:3000
Notes:
- The server container now waits for PostgreSQL readiness before starting.
- PostgreSQL is internal-only in Compose (no host port published).
- Inside Docker Compose, server DB host is
postgreson private networkcrashforge-backend. - For Compose overrides use
APP_DATABASE_URL, notDATABASE_URL.
Upload dSYM zip for an app/build.
Required multipart fields:
appIdbuildVersiondsym(zip file)
Optional multipart fields:
sourceType:repo | local_dirrepoUrl+commitSha(repo mode)localSourceDir(local dir mode)
Upload source zip for source-mode zip.
Multipart fields:
appIdbuildVersionsources(zip file)
Register source mapping manually.
JSON:
appIdbuildVersionsourceType:repo | local_dir | zip- Plus source-specific fields (
repoUrl,commitSha,localPath,extractedPath).
Submit crash payload.
Required:
appIdbuildVersionframes[]binaryImages[]
Optional metadata overrides:
metadata.sourceTypemetadata.repoUrlmetadata.commitShametadata.localPath
Response includes:
crashIdsymbolicatedFramesduplicateCrash(boolean)autoFixTriggered(boolean)
- Query:
limit(default50) - Query:
full=1to include full payload/symbolication details.
Fetch a single full crash record by id.
SSE stream of new crash summaries.
Read automation settings.
Update automation settings:
dashboardAuthEnableddashboardPasswordcliApiKey(for CLI repo mapping auth)autoFixEnabledllmBaseUrlllmApiKeyllmModelgithubTokengitUserNamegitUserEmaildefaultBaseBranchfixBranchPrefix
Generate and rotate a new CLI API key. Returns plaintext key once and stores only hash server-side.
List appId -> repo mappings.
Upsert mapping fields:
appIdrepoUrlbaseBranchisActive
Auth: dashboard session cookie or x-crashforge-api-key (also accepts Authorization: Bearer <key>).
Update one mapping.
Delete one mapping.
List recent auto-fix runs.
List persisted auto-fix logs (limit, optional runId).
SSE stream for real-time auto-fix logs.
For each crash, source context is selected in this order:
- Crash payload metadata override.
- Latest
source_mappingsrow forappId + buildVersion. - Fallback from uploaded dSYM metadata (
repoUrl/commitSha/localSourceDir).
Per-app webhook rules support {{...}} placeholders.
Examples:
{{crash.id}}{{crash.payload.appId}}{{crash.payload.exceptionType}}{{crash.payload.terminationReason}}{{crash.symbolicatedFrames.0.symbolicated}}{{crash.dsym.repoUrl}}
When autoFixEnabled=true and crash is not a duplicate signature:
- Resolve app-to-repo mapping.
- Clone target repo and create fix branch.
- Ask configured model for structured JSON edit plan (Vercel AI SDK).
- Apply/stage edits, commit, push.
- Open draft PR (GitHub API with token, or
ghCLI fallback). - Remove temporary clone directory.
Use BUILD_PHASE_AGENT_GUIDE.md for the complete script and required xcconfig variables.
src/: API, storage, symbolication, auto-fix pipelinepublic/: dashboard/settings/webhooks/logs UIdata/: local runtime storage foldersswift-sdk/: iOS SDK package (to become separate repo)ios-sample/: demo Xcode app
npm run check
npm run buildOptional end-to-end local checks (if sample/SDK still present in workspace):
cd swift-sdk && swift test
xcodebuild -project ios-sample/CrashDemoApp/CrashDemoApp.xcodeproj -scheme CrashDemoApp -configuration Debug -sdk iphonesimulator -destination 'generic/platform=iOS Simulator' build