Install
$ agentstack add skill-rshankras-claude-code-apple-skills-error-monitoring ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
Error Monitoring Generator
Generates a production-ready error monitoring infrastructure with protocol-based architecture for easy provider swapping.
When This Skill Activates
- User asks to "add crash reporting" or "error monitoring"
- User mentions "Sentry", "Crashlytics", or "crash analytics"
- User wants to "track errors in production"
- User asks about "debugging production issues"
Pre-Generation Checks (CRITICAL)
1. Project Context Detection
Before generating, ALWAYS check:
# Check for existing crash reporting
rg -l "Sentry|Crashlytics|CrashReporter" --type swift
# Check Package.swift for existing SDKs
cat Package.swift | grep -i "sentry\|firebase\|crashlytics"
# Check for existing error handling patterns
rg "captureError|recordError|logError" --type swift | head -5
2. Conflict Detection
If existing crash reporting found:
- Ask: Replace, wrap existing, or create parallel system?
Configuration Questions
Ask user via AskUserQuestion:
- Initial provider?
- Sentry (recommended for indie devs)
- Firebase Crashlytics (if already using Firebase)
- None (set up infrastructure only)
- Include breadcrumbs?
- Yes (track navigation, user actions)
- No (errors only)
- Include user context?
- Yes (anonymized user ID, app state)
- No (minimal data collection)
Generation Process
Step 1: Create Core Files
Always generate:
Sources/ErrorMonitoring/
├── ErrorMonitoringService.swift # Protocol
├── ErrorContext.swift # Breadcrumbs, user info
└── NoOpErrorMonitoring.swift # Testing/privacy
Based on provider selection:
Sources/ErrorMonitoring/Providers/
├── SentryErrorMonitoring.swift # If Sentry selected
└── CrashlyticsErrorMonitoring.swift # If Crashlytics selected
Step 2: Read Templates
Read templates from this skill:
templates/ErrorMonitoringService.swifttemplates/ErrorContext.swifttemplates/NoOpErrorMonitoring.swifttemplates/SentryErrorMonitoring.swift(if selected)templates/CrashlyticsErrorMonitoring.swift(if selected)
Step 3: Customize for Project
Adapt templates to match:
- Project naming conventions
- Existing error types
- Bundle identifier for Sentry DSN
Step 4: Integration
In App.swift:
import SwiftUI
@main
struct MyApp: App {
init() {
// Configure error monitoring
ErrorMonitoring.shared.configure()
}
var body: some Scene {
WindowGroup {
ContentView()
.environment(\.errorMonitoring, ErrorMonitoring.shared.service)
}
}
}
Capturing errors:
do {
try await riskyOperation()
} catch {
ErrorMonitoring.shared.service.captureError(error)
}
Adding breadcrumbs:
ErrorMonitoring.shared.service.addBreadcrumb(
Breadcrumb(category: "navigation", message: "Opened settings")
)
Provider Setup
Sentry
- Create account at sentry.io
- Create project for iOS/macOS
- Get DSN from Project Settings > Client Keys
- Add to Package.swift:
.package(url: "https://github.com/getsentry/sentry-cocoa", from: "8.0.0")
Firebase Crashlytics
- Add Firebase to your project via console.firebase.google.com
- Download GoogleService-Info.plist
- Add Firebase SDK via SPM or CocoaPods
- Enable Crashlytics in Firebase console
Generated Code Patterns
Protocol (Stable Interface)
protocol ErrorMonitoringService: Sendable {
func configure()
func captureError(_ error: Error, context: ErrorContext?)
func captureMessage(_ message: String, level: ErrorLevel)
func addBreadcrumb(_ breadcrumb: Breadcrumb)
func setUser(_ user: MonitoringUser?)
func reset()
}
Swapping Providers
// In ErrorMonitoring.swift
final class ErrorMonitoring {
static let shared = ErrorMonitoring()
// Change this ONE line to swap providers:
let service: ErrorMonitoringService = SentryErrorMonitoring()
// let service: ErrorMonitoringService = CrashlyticsErrorMonitoring()
// let service: ErrorMonitoringService = NoOpErrorMonitoring()
}
Breadcrumb Tracking
// Automatic navigation breadcrumbs
struct ContentView: View {
@Environment(\.errorMonitoring) var errorMonitoring
var body: some View {
Button("Open Details") {
errorMonitoring.addBreadcrumb(
Breadcrumb(category: "ui", message: "Tapped details button")
)
showDetails = true
}
}
}
Verification Checklist
After generation, verify:
- [ ] App compiles without errors
- [ ] Provider SDK added (if applicable)
- [ ] DSN/config set correctly
- [ ] Test error appears in dashboard
- [ ] Breadcrumbs captured correctly
- [ ] User context (if enabled) shows in reports
- [ ] NoOp mode works for debug/testing
Privacy Considerations
GDPR Compliance
- Use
NoOpErrorMonitoringfor EU users who opt out - Don't capture PII in error messages
- Anonymize user IDs
App Store Guidelines
- Disclose crash reporting in privacy policy
- Use App Tracking Transparency if combining with analytics
- Don't capture unnecessary device identifiers
Privacy Manifest (iOS 17+)
Add to PrivacyInfo.xcprivacy if using Sentry/Crashlytics:
NSPrivacyCollectedDataTypes
NSPrivacyCollectedDataType
NSPrivacyCollectedDataTypeCrashData
NSPrivacyCollectedDataTypeLinked
NSPrivacyCollectedDataTypeTracking
NSPrivacyCollectedDataTypePurposes
NSPrivacyCollectedDataTypePurposeAppFunctionality
Common Customizations
Custom Error Types
enum AppError: Error {
case networkFailure(URLError)
case decodingFailure(DecodingError)
case authenticationRequired
var context: ErrorContext {
ErrorContext(
tags: ["error_type": String(describing: self)],
extra: ["recoverable": isRecoverable]
)
}
}
// Capture with context
errorMonitoring.captureError(error, context: error.context)
Performance Monitoring
// Sentry supports performance monitoring
let transaction = SentrySDK.startTransaction(name: "Load Data", operation: "http")
defer { transaction.finish() }
let data = try await fetchData()
Release Tracking
// Include version info
SentrySDK.start { options in
options.dsn = "YOUR_DSN"
options.releaseName = "\(Bundle.main.appVersion)-\(Bundle.main.buildNumber)"
}
Troubleshooting
Errors Not Appearing in Dashboard
- Check DSN is correct and not expired
- Verify network connectivity
- Check debug mode isn't suppressing uploads
- Look for SDK initialization errors in console
Symbolication Not Working
- Upload dSYMs to Sentry/Firebase
- Enable "Upload Debug Symbols" build phase
- Check build settings include debug info
High Volume / Costs
- Filter common/expected errors
- Sample errors (e.g., capture 10%)
- Group similar errors
Related Skills
analytics-setup- Often combined with error monitoringlogging-setup- Use Logger for debug, error monitoring for production
References
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: rshankras
- Source: rshankras/claude-code-apple-skills
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.