Skip to main content
sentry-desktop-setup Configure Sentry for comprehensive desktop application crash reporting, error monitoring, performance tracking, and release health for Electron and native desktop apps
설치로 이동 Skills Marketplace 커뮤니티가 만든 AI 스킬을 발견하고 탐색하세요.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
직접 명령은 검토 Prompt를 거치지 않습니다. 실행하기 전에 소스를 확인하세요.
npx skills add https://github.com/a5c-ai/babysitter --skill sentry-desktop-setup명령은 한 줄로 유지됩니다. 복사하기 전에 가로로 스크롤해 전체 내용을 확인하세요.
로컬 사본을 원하시나요? SkillsMP에서 현재 제공할 수 있는 파일을 다운로드하세요.
Zip 다운로드 다운로드 중... name sentry-desktop-setup description Configure Sentry for comprehensive desktop application crash reporting, error monitoring, performance tracking, and release health for Electron and native desktop apps allowed-tools Read, Write, Edit, Bash, Glob, Grep tags ["desktop","monitoring","crash-reporting","sentry","electron","observability"] graph {"domains":["domain:software-engineering"],"specializations":["specialization:desktop-development"],"skillAreas":["skill-area:observability-instrumentation","skill-area:cross-platform-desktop"],"roles":["role:desktop-developer","role:fullstack-engineer"],"workflows":["workflow:feature-development","workflow:release-management"]}
sentry-desktop-setup
Configure Sentry for comprehensive desktop application monitoring including crash reporting, error tracking, performance monitoring, and release health. This skill sets up Sentry SDK integration for Electron and native desktop applications with source maps, session tracking, and custom instrumentation.
Capabilities
Configure Sentry SDK for Electron (main + renderer processes)
Set up native crash reporting with minidump support
Configure source map uploads for readable stack traces
Implement performance monitoring and tracing
Set up release tracking with commit integration
Configure session tracking for release health
Implement custom error boundaries and handlers
Set up user feedback collection
Configure environment-specific DSNs and sampling
Input Schema {
"type" : "object" ,
"properties" : {
"projectPath" : {
"type" : "string" ,
"description" : "Path to the desktop application project"
} ,
"framework" : {
"enum" : [ "electron" , "tauri" , "qt" , "wpf" , "macos-native" ] ,
"default" : "electron"
} ,
"sentryConfig" : {
"type" : "object" ,
"properties" : {
"dsn" : { "type" : "string" , "description" : "Sentry DSN (or use env variable)" } ,
"organization" : { "type" : "string" } ,
"project" : { "type" : "string" } ,
"environment" : { "type" : "string" , "default" : "production" }
} ,
"required" : [ "organization" , "project" ]
} ,
"features" : {
"type" : "array" ,
"items" : {
"enum" : [
"crashReporting" ,
"errorTracking" ,
"performanceMonitoring" ,
"sessionTracking" ,
"releaseHealth" ,
"sourceMaps" ,
"userFeedback" ,
"customContext" ,
"breadcrumbs" ,
"nativeCrashes"
]
} ,
"default" : [ "crashReporting" , "errorTracking" , "performanceMonitoring" , "sourceMaps" ]
} ,
"sampling" : {
"type" : "object" ,
"properties" : {
"tracesSampleRate" : { "type" : "number" , "default" : 0.1 } ,
"errorSampleRate" : { "type" : "number" , "default" : 1.0 } ,
"profilesSampleRate" : { "type" : "number" , "default" : 0.1 }
}
} ,
"privacy" : {
"type" : "object" ,
"properties" : {
"scrubData" : { "type" : "boolean" , "default" : true } ,
"scrubFields" : { "type" : "array" , "items" : { "type" : "string" } } ,
"ipAddress" : { "enum" : [ "auto" , "off" ] , "default" : "off" }
}
} ,
"ci" : {
"type" : "object" ,
"properties" : {
"generateWorkflow" : { "type" : "boolean" , "default" : true } ,
"provider" : { "enum" : [ "github-actions" , "azure-devops" , "circleci" ] }
}
}
} ,
"required" : [ "projectPath" , "sentryConfig" ]
}
Output Schema {
"type" : "object" ,
"properties" : {
"success" : { "type" : "boolean" } ,
"files" : {
"type" : "array" ,
"items" : {
"type" : "object" ,
"properties" : {
"path" : { "type" : "string" } ,
"type" : { "enum" : [ "config" , "main" , "renderer" , "utils" , "ci" ] }
}
}
} ,
"commands" : {
"type" : "object" ,
"properties" : {
"uploadSourceMaps" : { "type" : "string" } ,
"createRelease" : { "type" : "string" } ,
"testIntegration" : { "type" : "string" }
}
} ,
"envVariables" : {
"type" : "array" ,
"items" : {
"type" : "object" ,
"properties" : {
"name" : { "type" : "string" } ,
"description" : { "type" : "string" }
}
}
}
} ,
"required" : [ "success" , "files" ]
}
Generated File Structure src/
main/
sentry/
sentry-main.ts # Main process Sentry init
crash-reporter.ts # Native crash handling
ipc-handlers.ts # Sentry IPC handlers
renderer/
sentry/
sentry-renderer.ts # Renderer Sentry init
error-boundary.tsx # React error boundary
user-feedback.ts # Feedback dialog
shared/
sentry-config.ts # Shared configuration
context-utils.ts # Context helpers
scripts/
sentry-release.js # Release script
.github/workflows/
sentry-release.yml # CI workflow
Code Templates
Main Process Sentry Configuration
import * as Sentry from '@sentry/electron/main' ;
import { app } from 'electron' ;
export function initSentryMain ( ) {
Sentry .init ({
dsn : process.env .SENTRY_DSN ,
environment : process.env .NODE_ENV || 'production' ,
release : `${app.getName()} @${app.getVersion()} ` ,
tracesSampleRate : process.env .NODE_ENV === 'production' ? 0.1 : 1.0 ,
profilesSampleRate : 0.1 ,
autoSessionTracking : true ,
enableNative : true ,
beforeSend (event ) {
if (event.user ) {
delete event.user .ip_address ;
}
return event;
},
integrations : [
Sentry .electronMinidumpIntegration (),
Sentry .mainProcessIntegration (),
],
});
Sentry .setContext ('app' , {
name : app.getName (),
version : app.getVersion (),
platform : process.platform ,
arch : process.arch ,
electron : process.versions .electron ,
});
}
export function captureMainException (error : Error , context ?: Record <string , unknown > ) {
Sentry .withScope ((scope ) => {
scope.setTag ('process' , 'main' );
if (context) {
scope.setExtras (context);
}
Sentry .captureException (error);
});
}
Renderer Process Sentry Configuration
import * as Sentry from '@sentry/electron/renderer' ;
import { init as sentryReactInit, browserTracingIntegration } from '@sentry/react' ;
export function initSentryRenderer ( ) {
sentryReactInit ({
dsn : process.env .SENTRY_DSN ,
environment : process.env .NODE_ENV || 'production' ,
release : window .electronAPI .getAppVersion (),
tracesSampleRate : 0.1 ,
integrations : [
browserTracingIntegration (),
Sentry .electronRendererIntegration (),
],
beforeBreadcrumb (breadcrumb ) {
if (breadcrumb.category === 'console' && breadcrumb.level === 'debug' ) {
return null ;
}
return breadcrumb;
},
});
Sentry .setTag ('renderer' , 'main-window' );
}
export function withSentryErrorBoundary<P extends object >(
Component : React .ComponentType <P>,
fallback : React .ReactNode
) {
return Sentry .withErrorBoundary (Component , {
fallback,
showDialog : true ,
});
}
React Error Boundary
import React from 'react' ;
import * as Sentry from '@sentry/react' ;
interface Props {
children : React .ReactNode ;
fallback ?: React .ReactNode ;
}
interface State {
hasError : boolean ;
eventId : string | null ;
}
export class ErrorBoundary extends React.Component <Props , State > {
state : State = { hasError : false , eventId : null };
static getDerivedStateFromError (): State {
return { hasError : true , eventId : null };
}
componentDidCatch (error : Error , errorInfo : React .ErrorInfo ) {
Sentry .withScope ((scope ) => {
scope.setExtras ({
componentStack : errorInfo.componentStack ,
});
const eventId = Sentry .captureException (error);
this .setState ({ eventId });
});
}
handleReportClick = () => {
if (this .state .eventId ) {
Sentry .showReportDialog ({ eventId : this .state .eventId });
}
};
handleReload = () => {
window .location .reload ();
};
render ( ) {
if (this .state .hasError ) {
return (
this .props .fallback || (
<div className ="error-boundary" >
<h2 > Something went wrong</h2 >
<p > We've been notified and are working on a fix.</p >
<div className ="error-actions" >
<button onClick ={this.handleReportClick} >
Report Feedback
</button >
<button onClick ={this.handleReload} >
Reload Application
</button >
</div >
</div >
)
);
}
return this .props .children ;
}
}
User Feedback Collection
import * as Sentry from '@sentry/react' ;
export interface FeedbackData {
name : string ;
email : string ;
comments : string ;
}
export async function submitUserFeedback (
eventId : string ,
feedback : FeedbackData
) {
await Sentry .sendFeedback ({
event_id : eventId,
name : feedback.name ,
email : feedback.email ,
message : feedback.comments ,
});
}
export function showFeedbackDialog (eventId ?: string ) {
Sentry .showReportDialog ({
eventId,
title : 'Help us improve' ,
subtitle : 'Tell us what happened' ,
subtitle2 : 'Your feedback helps us fix issues faster' ,
labelSubmit : 'Send Report' ,
labelClose : 'Close' ,
});
}
export function captureUserFeedback (
category : string ,
message : string ,
metadata ?: Record <string , unknown >
) {
Sentry .captureMessage (message, {
level : 'info' ,
tags : { category, type : 'user-feedback' },
extra : metadata,
});
}
Performance Monitoring
import * as Sentry from '@sentry/electron/renderer' ;
export function measureAppStartup ( ) {
const transaction = Sentry .startTransaction ({
name : 'app-startup' ,
op : 'app.startup' ,
});
return {
finish : () => transaction.finish (),
setMeasurement : (name : string , value : number , unit : string ) => {
transaction.setMeasurement (name, value, unit as any );
},
};
}
export async function measureOperation<T>(
name : string ,
operation : () => Promise <T>
): Promise <T> {
const span = Sentry .startSpan ({
name,
op : 'function' ,
}, async (span) => {
try {
return await operation ();
} finally {
span?.end ();
}
});
return span;
}
export function trackMetric (
name : string ,
value : number ,
unit : 'none' | 'millisecond' | 'byte' | 'percent' = 'none'
) {
Sentry .setMeasurement (name, value, unit);
}
Release Script
const { execSync } = require ('child_process' );
const pkg = require ('../package.json' );
const release = `${pkg.name} @${pkg.version} ` ;
const org = process.env .SENTRY_ORG ;
const project = process.env .SENTRY_PROJECT ;
console .log (`Creating Sentry release: ${release} ` );
execSync (`sentry-cli releases new ${release} --org ${org} --project ${project} ` );
execSync (`sentry-cli releases set-commits ${release} --auto --org ${org} ` );
execSync (`sentry-cli releases files ${release} upload-sourcemaps ./dist --org ${org} --project ${project} ` );
if (process.platform === 'darwin' || process.platform === 'win32' ) {
execSync (`sentry-cli upload-dif ./dist --org ${org} --project ${project} ` );
}
execSync (`sentry-cli releases finalize ${release} --org ${org} ` );
const environment = process.env .NODE_ENV || 'production' ;
execSync (`sentry-cli releases deploys ${release} new -e ${environment} --org ${org} ` );
console .log ('Sentry release complete!' );
GitHub Actions Workflow
name: Sentry Release
on:
release:
types: [published ]
jobs:
sentry:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: actions/setup-node@v4
with:
node-version: 20
- name: Install dependencies
run: npm ci
- name: Build application
run: npm run build
- name: Create Sentry release
env:
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
SENTRY_ORG: ${{ vars.SENTRY_ORG }}
SENTRY_PROJECT: ${{ vars.SENTRY_PROJECT }}
run: |
npm install -g @sentry/cli
sentry-cli releases new "${{ github.event.release.tag_name }}"
sentry-cli releases set-commits "${{ github.event.release.tag_name }}" --auto
sentry-cli releases files "${{ github.event.release.tag_name }}" upload-sourcemaps ./dist
sentry-cli releases finalize "${{ github.event.release.tag_name }}"
sentry-cli releases deploys "${{ github.event.release.tag_name }}" new -e production
Environment Variables Variable Description Required SENTRY_DSNSentry Data Source Name Yes SENTRY_AUTH_TOKENAuthentication token for CLI For releases SENTRY_ORGSentry organization slug For releases SENTRY_PROJECTSentry project slug For releases
Best Practices
Use environment-specific DSNs - Different projects for dev/staging/prod
Enable source maps - Critical for readable stack traces
Set meaningful release names - Include version and build number
Configure sampling appropriately - Balance data with cost
Scrub sensitive data - Remove PII before sending
Track release health - Monitor crash-free sessions
Community References
Related Skills
electron-builder-config - Build configuration
electron-auto-updater-setup - Track update issues
gdpr-consent-manager - Privacy compliance
Related Agents
desktop-test-architect - Testing strategy
release-manager - Release coordination
이 저장소의 다른 Skills Reference for querying the Atlas knowledge graph through its MCP tools — the SECONDARY enrichment/comparison layer that adds best-practice context to systems you have ALREADY scanned from your real sources (`az`, repos, dirs). Use when you need to look up nodes, edges, kinds, clusters, stats, or wiki pages in Atlas to compare against your real inventory. (atlas graph, query atlas, atlas mcp, search the graph, graph neighbors, atlas record, atlas kinds, enrichment layer)
Atlas turns your STATED NEED into a real systems atlas by SCANNING your actual sources (Azure via `az`, git repos, local dirs) and process/data mining them, THEN enriching against the Atlas knowledge graph. Use this skill when asked to inventory/map your real systems, scan your cloud + repos + directories, mine the real processes or data they contain, or collect their real constraints/gotchas. (atlas, scan my systems, inventory our azure account, map my repos, real systems atlas, process mining, data mining, collect nuances, system discovery)
assimilate-popular-workflows This skill should be used when the user asks to "find skills in the wild", "assimilate popular workflows", "discover SKILL.md files in repos", "research external skills", "find workflow patterns", "survey the skill landscape", "what skills exist out there", or wants to investigate public repositories for extractable processes, babysitter plugins, and reusable procedural insights. Searches GitHub for SKILL.md files, classifies repos by archetype, and maintains structured research under docs/reference-repos/.