Showing preview only (2,958K chars total). Download the full file or copy to clipboard to get everything.
Repository: bluewave-labs/Checkmate
Branch: develop
Commit: bc2bab87ba94
Files: 542
Total size: 2.7 MB
Directory structure:
gitextract_otmdzcso/
├── .coderabbit.yml
├── .github/
│ ├── CODEOWNERS
│ ├── FUNDING.yml
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.md
│ │ └── feature_request.md
│ ├── pull_request_template.md
│ ├── scripts/
│ │ ├── download-translations.js
│ │ └── upload-translations.js
│ └── workflows/
│ ├── README.md
│ ├── check-build.yml
│ ├── check-format.yml
│ ├── deploy-images-on-release.yml
│ ├── deploy-images.yml
│ ├── poeditor-sync.yml
│ ├── production-deploy.yml
│ ├── staging-deploy.yml
│ └── upload-poeditor.yml
├── .gitignore
├── .husky/
│ └── pre-commit
├── CLAUDE.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── Checkmate.CodeCanvas
├── LICENSE
├── PULLREQUESTS.md
├── README.es.md
├── README.md
├── SECURITY.md
├── charts/
│ └── helm/
│ └── checkmate/
│ ├── .helmignore
│ ├── Chart.yaml
│ ├── INSTALLATION.md
│ ├── templates/
│ │ ├── client-deployment.yaml
│ │ ├── client-ingress.yaml
│ │ ├── client-service.yaml
│ │ ├── mongodb-service.yaml
│ │ ├── mongodb-statefulsets.yaml
│ │ ├── prechecks.yaml
│ │ ├── redis-service.yaml
│ │ ├── redis-statefulsets.yaml
│ │ ├── secrets.yaml
│ │ ├── server-deployment.yaml
│ │ ├── server-ingress.yaml
│ │ ├── server-nginx-cm.yaml
│ │ └── server-service.yaml
│ └── values.yaml
├── client/
│ ├── .coderrabbit.yaml
│ ├── .dockerignore
│ ├── .eslintrc.cjs
│ ├── .gitignore
│ ├── .prettierrc
│ ├── README.md
│ ├── env.sh
│ ├── index.html
│ ├── package.json
│ ├── public/
│ │ ├── bulk_import_monitors_sample.csv
│ │ └── bulk_import_monitors_template.csv
│ ├── renovate.json
│ ├── src/
│ │ ├── App.tsx
│ │ ├── Components/
│ │ │ ├── LanguageSelector.jsx
│ │ │ ├── actions-menu/
│ │ │ │ └── index.tsx
│ │ │ ├── common/
│ │ │ │ ├── charts/
│ │ │ │ │ ├── HeatmapResponseTime.tsx
│ │ │ │ │ ├── HeatmapResponseTimeTooltip.tsx
│ │ │ │ │ └── HistogramResponseTime.tsx
│ │ │ │ ├── controls/
│ │ │ │ │ ├── HeaderCreate.tsx
│ │ │ │ │ └── HeaderTimeRange.tsx
│ │ │ │ └── index.ts
│ │ │ ├── design-elements/
│ │ │ │ ├── Avatar.tsx
│ │ │ │ ├── BaseBox.tsx
│ │ │ │ ├── BaseChart.tsx
│ │ │ │ ├── BasePage.tsx
│ │ │ │ ├── Breadcrumb.tsx
│ │ │ │ ├── BulletPointCheck.tsx
│ │ │ │ ├── Dot.tsx
│ │ │ │ ├── Fallback.tsx
│ │ │ │ ├── Gauge.tsx
│ │ │ │ ├── Icon.tsx
│ │ │ │ ├── MonitorStatus.tsx
│ │ │ │ ├── OfflineBanner.tsx
│ │ │ │ ├── PulseDot.tsx
│ │ │ │ ├── SkeletonCard.tsx
│ │ │ │ ├── SplitBox.tsx
│ │ │ │ ├── StatBox.tsx
│ │ │ │ ├── StatusBox.tsx
│ │ │ │ ├── StatusLabel.tsx
│ │ │ │ ├── Table.tsx
│ │ │ │ ├── Tabs.tsx
│ │ │ │ ├── TextLink.tsx
│ │ │ │ ├── Tooltip.tsx
│ │ │ │ └── index.tsx
│ │ │ ├── i18nLoader/
│ │ │ │ └── index.tsx
│ │ │ ├── inputs/
│ │ │ │ ├── AutoComplete.tsx
│ │ │ │ ├── Button.tsx
│ │ │ │ ├── Checkbox.tsx
│ │ │ │ ├── ColorPicker.tsx
│ │ │ │ ├── DatePicker.tsx
│ │ │ │ ├── Dialog.tsx
│ │ │ │ ├── FieldLabel.tsx
│ │ │ │ ├── ImageUpload.tsx
│ │ │ │ ├── LanguageSelector.tsx
│ │ │ │ ├── Radio.tsx
│ │ │ │ ├── Select.tsx
│ │ │ │ ├── Slider.tsx
│ │ │ │ ├── Switch.tsx
│ │ │ │ ├── SwitchTheme.tsx
│ │ │ │ ├── TextInput.tsx
│ │ │ │ ├── TimePicker.tsx
│ │ │ │ ├── ToggleButton.tsx
│ │ │ │ └── index.tsx
│ │ │ ├── layout/
│ │ │ │ ├── AppLayout.tsx
│ │ │ │ └── RootLayout.tsx
│ │ │ ├── monitors/
│ │ │ │ ├── ControlsFilter.tsx
│ │ │ │ ├── GeoChecksMap.tsx
│ │ │ │ ├── HeaderGeoTabs.tsx
│ │ │ │ ├── HeaderMonitorControls.tsx
│ │ │ │ ├── HeaderMonitorsSummary.tsx
│ │ │ │ ├── MonitorStatBoxes.tsx
│ │ │ │ ├── charts/
│ │ │ │ │ ├── HistogramDetails.tsx
│ │ │ │ │ ├── HistogramInfrastructure.tsx
│ │ │ │ │ ├── HistogramPageSpeed.tsx
│ │ │ │ │ ├── HistogramPageSpeedDetails.tsx
│ │ │ │ │ ├── HistogramPageSpeedDetailsTooltip.tsx
│ │ │ │ │ ├── HistogramPageSpeedTooltip.tsx
│ │ │ │ │ ├── HistogramStatus.tsx
│ │ │ │ │ ├── PiePageSpeed.tsx
│ │ │ │ │ ├── PiePageSpeedLegend.tsx
│ │ │ │ │ └── RadialAvgResponse.tsx
│ │ │ │ └── index.tsx
│ │ │ ├── routing/
│ │ │ │ └── RouteProtected.tsx
│ │ │ └── sidebar/
│ │ │ ├── Authfooter.tsx
│ │ │ ├── Logo.tsx
│ │ │ ├── Menu.tsx
│ │ │ ├── NavItem.tsx
│ │ │ ├── StarPrompt.tsx
│ │ │ └── index.tsx
│ │ ├── Features/
│ │ │ ├── Auth/
│ │ │ │ └── authSlice.ts
│ │ │ └── UI/
│ │ │ └── uiSlice.ts
│ │ ├── Hooks/
│ │ │ ├── UseApi.ts
│ │ │ ├── UseToast.ts
│ │ │ ├── useAddTeamMemberForm.ts
│ │ │ ├── useDebounce.ts
│ │ │ ├── useEditUserForm.ts
│ │ │ ├── useInviteForm.ts
│ │ │ ├── useIsAdmin.ts
│ │ │ ├── useLoginForm.ts
│ │ │ ├── useMaintenanceWindowForm.ts
│ │ │ ├── useMonitorForm.ts
│ │ │ ├── useNotificationForm.ts
│ │ │ ├── usePasswordForm.ts
│ │ │ ├── useProfileForm.ts
│ │ │ ├── useRecoveryForm.ts
│ │ │ ├── useRegisterForm.ts
│ │ │ ├── useSetNewPasswordForm.ts
│ │ │ ├── useSettingsForm.ts
│ │ │ ├── useSidebar.ts
│ │ │ └── useStatusPageForm.ts
│ │ ├── Pages/
│ │ │ ├── Account/
│ │ │ │ ├── EditUser/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── TabPassword.tsx
│ │ │ │ ├── TabProfile.tsx
│ │ │ │ ├── TabTeam.tsx
│ │ │ │ ├── components/
│ │ │ │ │ ├── AddTeamMemberDialog.tsx
│ │ │ │ │ ├── HeaderTeamControls.tsx
│ │ │ │ │ ├── InviteTeamMemberDialog.tsx
│ │ │ │ │ └── TeamTable.tsx
│ │ │ │ └── index.tsx
│ │ │ ├── Auth/
│ │ │ │ ├── Login/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── Recovery/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── Register/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── SetNewPassword/
│ │ │ │ │ └── index.tsx
│ │ │ │ └── components/
│ │ │ │ └── HeaderAuthControls.tsx
│ │ │ ├── Checks/
│ │ │ │ ├── Components/
│ │ │ │ │ └── ChecksTable.tsx
│ │ │ │ └── index.tsx
│ │ │ ├── CreateMonitor/
│ │ │ │ └── index.tsx
│ │ │ ├── Incidents/
│ │ │ │ ├── Components/
│ │ │ │ │ ├── CardDetails.tsx
│ │ │ │ │ ├── CardSummary.tsx
│ │ │ │ │ ├── ControlsIncidentFilter.tsx
│ │ │ │ │ ├── DialogIncidentDetails.tsx
│ │ │ │ │ ├── DialogResolution.tsx
│ │ │ │ │ └── IncidentTable.tsx
│ │ │ │ ├── index.tsx
│ │ │ │ └── utils.ts
│ │ │ ├── Infrastructure/
│ │ │ │ ├── Details/
│ │ │ │ │ ├── Components/
│ │ │ │ │ │ ├── Charts.tsx
│ │ │ │ │ │ ├── ChartsNetwork.tsx
│ │ │ │ │ │ ├── Gauges.tsx
│ │ │ │ │ │ ├── StatusBoxes.tsx
│ │ │ │ │ │ ├── TabNetwork.tsx
│ │ │ │ │ │ └── TabOverview.tsx
│ │ │ │ │ └── index.tsx
│ │ │ │ └── Monitors/
│ │ │ │ ├── Components/
│ │ │ │ │ └── MonitorsTable.tsx
│ │ │ │ └── index.tsx
│ │ │ ├── Logs/
│ │ │ │ ├── TabDiagnostics.tsx
│ │ │ │ ├── TabLogs.tsx
│ │ │ │ ├── TabQueue.tsx
│ │ │ │ ├── components/
│ │ │ │ │ ├── Metrics.tsx
│ │ │ │ │ ├── StatGauges.tsx
│ │ │ │ │ ├── Stats.tsx
│ │ │ │ │ ├── TableJobs.tsx
│ │ │ │ │ └── TableLogs.tsx
│ │ │ │ └── index.tsx
│ │ │ ├── Maintenance/
│ │ │ │ ├── MaintenanceWindowTable.tsx
│ │ │ │ ├── create/
│ │ │ │ │ └── index.tsx
│ │ │ │ └── index.tsx
│ │ │ ├── NotFound/
│ │ │ │ └── index.tsx
│ │ │ ├── Notifications/
│ │ │ │ ├── components/
│ │ │ │ │ └── NotificationsTable.tsx
│ │ │ │ ├── create/
│ │ │ │ │ └── index.tsx
│ │ │ │ └── index.tsx
│ │ │ ├── PageSpeed/
│ │ │ │ ├── Details/
│ │ │ │ │ └── index.tsx
│ │ │ │ └── Monitors/
│ │ │ │ ├── Components/
│ │ │ │ │ └── PageSpeedMonitorsTable.tsx
│ │ │ │ └── index.tsx
│ │ │ ├── Settings/
│ │ │ │ ├── DummyChart.tsx
│ │ │ │ └── index.tsx
│ │ │ ├── StatusPage/
│ │ │ │ ├── Create/
│ │ │ │ │ ├── Components/
│ │ │ │ │ │ └── HeaderConfigStatusControls.tsx
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── Status/
│ │ │ │ │ ├── Components/
│ │ │ │ │ │ ├── HeaderStatusPageControls.tsx
│ │ │ │ │ │ ├── InfrastructureMetrics.tsx
│ │ │ │ │ │ ├── MonitorsList.tsx
│ │ │ │ │ │ └── StatusBar.tsx
│ │ │ │ │ └── index.tsx
│ │ │ │ └── StatusPages/
│ │ │ │ ├── Components/
│ │ │ │ │ └── StatusPagesTable.tsx
│ │ │ │ └── index.tsx
│ │ │ └── Uptime/
│ │ │ ├── Details/
│ │ │ │ ├── Components/
│ │ │ │ │ ├── ChecksTable.tsx
│ │ │ │ │ └── GeoChecksTable.tsx
│ │ │ │ └── index.tsx
│ │ │ └── Monitors/
│ │ │ ├── Components/
│ │ │ │ └── UptimeMonitorsTable.tsx
│ │ │ └── index.tsx
│ │ ├── Routes/
│ │ │ └── index.tsx
│ │ ├── Types/
│ │ │ ├── Check.ts
│ │ │ ├── Diagnostics.ts
│ │ │ ├── GeoCheck.ts
│ │ │ ├── Incident.ts
│ │ │ ├── Log.ts
│ │ │ ├── MaintenanceWindow.ts
│ │ │ ├── Monitor.ts
│ │ │ ├── Notification.ts
│ │ │ ├── Queue.ts
│ │ │ ├── Settings.ts
│ │ │ ├── StatusPage.ts
│ │ │ ├── User.ts
│ │ │ ├── env.d.ts
│ │ │ ├── mui.d.ts
│ │ │ └── state.ts
│ │ ├── Utils/
│ │ │ ├── ApiClient.ts
│ │ │ ├── DataUtils.ts
│ │ │ ├── FormatUtils.ts
│ │ │ ├── InfraUtils.ts
│ │ │ ├── MonitorUtils.ts
│ │ │ ├── Theme/
│ │ │ │ ├── Palette.ts
│ │ │ │ ├── Theme.ts
│ │ │ │ └── constants.ts
│ │ │ ├── TimeUtils.ts
│ │ │ ├── i18n.ts
│ │ │ ├── logger.ts
│ │ │ ├── timezones.json
│ │ │ └── toastUtils.jsx
│ │ ├── Validation/
│ │ │ ├── addTeamMember.ts
│ │ │ ├── editUser.ts
│ │ │ ├── invite.ts
│ │ │ ├── login.ts
│ │ │ ├── maintenanceWindow.ts
│ │ │ ├── monitor.ts
│ │ │ ├── notifications.ts
│ │ │ ├── password.ts
│ │ │ ├── patterns.ts
│ │ │ ├── profile.ts
│ │ │ ├── recovery.ts
│ │ │ ├── register.ts
│ │ │ ├── setNewPassword.ts
│ │ │ ├── settings.ts
│ │ │ ├── statusPage.ts
│ │ │ └── validation.js
│ │ ├── index.css
│ │ ├── locales/
│ │ │ ├── ar.json
│ │ │ ├── cs.json
│ │ │ ├── de.json
│ │ │ ├── en.json
│ │ │ ├── es.json
│ │ │ ├── fi.json
│ │ │ ├── fr.json
│ │ │ ├── ja.json
│ │ │ ├── pt-BR.json
│ │ │ ├── ru.json
│ │ │ ├── th.json
│ │ │ ├── tr.json
│ │ │ ├── uk.json
│ │ │ ├── vi.json
│ │ │ ├── zh-CN.json
│ │ │ └── zh-TW.json
│ │ ├── main.tsx
│ │ └── store.ts
│ ├── tsconfig.app.json
│ ├── tsconfig.json
│ ├── tsconfig.node.json
│ ├── tsconfig.tsbuildinfo
│ └── vite.config.ts
├── docker/
│ ├── .gitignore
│ ├── coolify/
│ │ ├── build_images.sh
│ │ ├── client.Dockerfile
│ │ ├── mongoDB.Dockerfile
│ │ ├── nginx/
│ │ │ └── conf.d/
│ │ │ └── default.conf
│ │ ├── redis.Dockerfile
│ │ └── server.Dockerfile
│ ├── dev/
│ │ ├── build_images.sh
│ │ ├── certs/
│ │ │ └── .gitkeep
│ │ ├── client.Dockerfile
│ │ ├── docker-compose.custom-ca-example.yaml
│ │ ├── docker-compose.yaml
│ │ ├── mongoDB.Dockerfile
│ │ ├── nginx/
│ │ │ └── conf.d/
│ │ │ └── default.conf
│ │ ├── nginx-test/
│ │ │ ├── docker-compose.nginx-test.yaml
│ │ │ └── nginx.conf
│ │ └── server.Dockerfile
│ ├── dist/
│ │ ├── build_images.sh
│ │ ├── client.Dockerfile
│ │ ├── docker-compose.yaml
│ │ ├── mongoDB.Dockerfile
│ │ ├── nginx/
│ │ │ └── conf.d/
│ │ │ └── default.conf
│ │ └── server.Dockerfile
│ ├── dist-arm/
│ │ ├── build_images.sh
│ │ ├── docker-compose.yaml
│ │ └── server.Dockerfile
│ ├── dist-mono/
│ │ ├── build_images.sh
│ │ ├── docker-compose-local.yaml
│ │ ├── docker-compose.yaml
│ │ ├── mongoDB.Dockerfile
│ │ └── server.Dockerfile
│ ├── prod/
│ │ ├── build_images.sh
│ │ ├── certbot-compose.yaml
│ │ ├── client.Dockerfile
│ │ ├── docker-compose.yaml
│ │ ├── mongoDB.Dockerfile
│ │ ├── nginx/
│ │ │ └── conf.d/
│ │ │ ├── cerbot
│ │ │ └── default.conf
│ │ └── server.Dockerfile
│ └── staging/
│ ├── build_images.sh
│ ├── cerbot-compose.yaml
│ ├── client.Dockerfile
│ ├── docker-compose.yaml
│ ├── mongoDB.Dockerfile
│ ├── nginx/
│ │ └── conf.d/
│ │ ├── certbot
│ │ └── default.conf
│ └── server.Dockerfile
├── docs/
│ ├── README.md
│ ├── custom-ca-quick-reference.md
│ ├── custom-ca-trust.md
│ └── infrastructure-disk-selection.md
├── package.json
├── scripts/
│ └── flatten-locales.js
└── server/
├── .dockerignore
├── .github/
│ ├── pull_request_template.md
│ └── workflows/
│ └── staging-deploy.yml
├── .gitignore
├── .mocharc.cjs
├── .nycrc
├── .prettierrc
├── LICENSE
├── README.md
├── eslint.config.js
├── jest.config.ts
├── nodemon.json
├── openapi.json
├── package.json
├── scripts/
│ └── generate-checks.js
├── src/
│ ├── app.ts
│ ├── config/
│ │ ├── controllers.ts
│ │ ├── routes.ts
│ │ └── services.ts
│ ├── controllers/
│ │ ├── authController.ts
│ │ ├── checkController.ts
│ │ ├── controllerUtils.ts
│ │ ├── diagnosticController.ts
│ │ ├── geoCheckController.ts
│ │ ├── incidentController.ts
│ │ ├── inviteController.ts
│ │ ├── logController.ts
│ │ ├── maintenanceWindowController.ts
│ │ ├── monitorController.ts
│ │ ├── notificationController.ts
│ │ ├── queueController.ts
│ │ ├── settingsController.ts
│ │ └── statusPageController.ts
│ ├── db/
│ │ ├── IDb.ts
│ │ ├── MongoDB.ts
│ │ ├── migration/
│ │ │ ├── 0001_migrateStatusWindowThreshold.ts
│ │ │ ├── 0002_convertChecksToTimeSeries.ts
│ │ │ ├── 0003_cleanupDuplicateMonitorStats.ts
│ │ │ ├── 0004_fixInfrastructureThresholds.ts
│ │ │ ├── 0005_migrateStatusPageTypeToArray.ts
│ │ │ └── index.ts
│ │ └── models/
│ │ ├── AppSettings.ts
│ │ ├── Check.ts
│ │ ├── GeoCheck.ts
│ │ ├── Incident.ts
│ │ ├── Invite.ts
│ │ ├── MaintenanceWindow.ts
│ │ ├── Migration.ts
│ │ ├── Monitor.ts
│ │ ├── MonitorStats.ts
│ │ ├── Notification.ts
│ │ ├── RecoveryToken.ts
│ │ ├── StatusPage.ts
│ │ ├── Team.ts
│ │ ├── User.ts
│ │ └── index.ts
│ ├── index.ts
│ ├── middleware/
│ │ ├── handleErrors.ts
│ │ ├── isAllowed.ts
│ │ ├── rateLimiter.ts
│ │ ├── sanitization.ts
│ │ ├── verifyJWT.ts
│ │ └── verifyStatusPageAccess.ts
│ ├── repositories/
│ │ ├── checks/
│ │ │ ├── IChecksRepository.ts
│ │ │ └── MongoChecksRepistory.ts
│ │ ├── geo-checks/
│ │ │ ├── IGeoChecksRepository.ts
│ │ │ └── MongoGeoChecksRepository.ts
│ │ ├── incidents/
│ │ │ ├── IIncidentsRepository.ts
│ │ │ └── MongoIncidentRepository.ts
│ │ ├── index.ts
│ │ ├── invites/
│ │ │ ├── IInvitesRepository.ts
│ │ │ └── MongoInviteRepository.ts
│ │ ├── maintenance-windows/
│ │ │ ├── IMaintenanceWindowsRepository.ts
│ │ │ └── MongoMaintenanceWindowsRepository.ts
│ │ ├── monitor-stats/
│ │ │ ├── IMonitorStatsRepository.ts
│ │ │ └── MongoMonitorStatsRepository.ts
│ │ ├── monitors/
│ │ │ ├── IMonitorsRepository.ts
│ │ │ └── MongoMonitorsRepository.ts
│ │ ├── notifications/
│ │ │ ├── INotificationsRepository.ts
│ │ │ └── MongoNotificationsRepository.ts
│ │ ├── recovery-tokens/
│ │ │ ├── IRecoveryTokensRepository.ts
│ │ │ └── MongoRecoveryTokensRepository.ts
│ │ ├── settings/
│ │ │ ├── ISettingsRepository.ts
│ │ │ └── MongoSettingsRepository.ts
│ │ ├── status-pages/
│ │ │ ├── IStatusPagesRepository.ts
│ │ │ └── MongoStatusPagesRepository.ts
│ │ ├── teams/
│ │ │ ├── ITeamsRepository.ts
│ │ │ └── MongoTeamsRepository.ts
│ │ └── users/
│ │ ├── IUsersRepository.ts
│ │ └── MongoUsersRepository.ts
│ ├── routes/
│ │ ├── authRoute.ts
│ │ ├── checkRoute.ts
│ │ ├── diagnosticRoute.ts
│ │ ├── geoCheckRoutes.ts
│ │ ├── incidentRoute.ts
│ │ ├── inviteRoute.ts
│ │ ├── logRoutes.ts
│ │ ├── maintenanceWindowRoute.ts
│ │ ├── monitorRoute.ts
│ │ ├── notificationRoute.ts
│ │ ├── queueRoute.ts
│ │ ├── settingsRoute.ts
│ │ └── statusPageRoute.ts
│ ├── service/
│ │ ├── business/
│ │ │ ├── checkService.ts
│ │ │ ├── diagnosticService.ts
│ │ │ ├── geoChecksService.ts
│ │ │ ├── incidentService.ts
│ │ │ ├── inviteService.ts
│ │ │ ├── maintenanceWindowService.ts
│ │ │ ├── monitorService.ts
│ │ │ ├── statusPageService.ts
│ │ │ └── userService.ts
│ │ ├── index.ts
│ │ ├── infrastructure/
│ │ │ ├── SuperSimpleQueue/
│ │ │ │ ├── SuperSimpleQueue.ts
│ │ │ │ └── SuperSimpleQueueHelper.ts
│ │ │ ├── bufferService.ts
│ │ │ ├── emailService.ts
│ │ │ ├── globalPingService.ts
│ │ │ ├── network/
│ │ │ │ ├── AdvancedMatcher.ts
│ │ │ │ ├── DockerProvider.ts
│ │ │ │ ├── GameProvider.ts
│ │ │ │ ├── GrpcProvider.ts
│ │ │ │ ├── HardwareProvider.ts
│ │ │ │ ├── HttpProvider.ts
│ │ │ │ ├── IStatusProvider.ts
│ │ │ │ ├── PageSpeedProvider.ts
│ │ │ │ ├── PingProvider.ts
│ │ │ │ ├── PortProvider.ts
│ │ │ │ ├── WebSocketProvider.ts
│ │ │ │ └── utils.ts
│ │ │ ├── networkService.ts
│ │ │ ├── notificationMessageBuilder.ts
│ │ │ ├── notificationProviders/
│ │ │ │ ├── INotificationProvider.ts
│ │ │ │ ├── discord.ts
│ │ │ │ ├── email.ts
│ │ │ │ ├── matrix.ts
│ │ │ │ ├── pagerduty.ts
│ │ │ │ ├── slack.ts
│ │ │ │ ├── teams.ts
│ │ │ │ ├── utils.ts
│ │ │ │ └── webhook.ts
│ │ │ ├── notificationsService.ts
│ │ │ ├── protos/
│ │ │ │ └── health.proto
│ │ │ └── statusService.ts
│ │ └── system/
│ │ └── settingsService.ts
│ ├── shutdown.ts
│ ├── templates/
│ │ ├── addReview.mjml
│ │ ├── employeeActivation.mjml
│ │ ├── noIncidentsThisWeek.mjml
│ │ ├── passwordReset.mjml
│ │ ├── testEmailTemplate.mjml
│ │ ├── unifiedNotification.mjml
│ │ └── welcomeEmail.mjml
│ ├── types/
│ │ ├── alert.ts
│ │ ├── check.ts
│ │ ├── email.ts
│ │ ├── express.d.ts
│ │ ├── geoCheck.ts
│ │ ├── incident.ts
│ │ ├── index.ts
│ │ ├── invite.ts
│ │ ├── maintenanceWindow.ts
│ │ ├── monitor.ts
│ │ ├── monitorStats.ts
│ │ ├── network.ts
│ │ ├── notification.ts
│ │ ├── notificationMessage.ts
│ │ ├── recoveryToken.ts
│ │ ├── settings.ts
│ │ ├── ssl-checker.d.ts
│ │ ├── statusPage.ts
│ │ ├── team.ts
│ │ └── user.ts
│ ├── utils/
│ │ ├── AppError.ts
│ │ ├── dataUtils.ts
│ │ ├── demoMonitors.json
│ │ ├── imageProcessing.ts
│ │ ├── logger.ts
│ │ └── utils.ts
│ └── validation/
│ ├── authValidation.ts
│ ├── checkValidation.ts
│ ├── envValidation.ts
│ ├── incidentValidation.ts
│ ├── index.ts
│ ├── maintenanceWindowValidation.ts
│ ├── monitorValidation.ts
│ ├── notificationValidation.ts
│ ├── settingsValidation.ts
│ ├── shared.ts
│ ├── statusPageValidation.ts
│ └── userValidation.ts
├── test/
│ ├── monitorService.test.ts
│ ├── superSimpleQueueHelper.test.ts
│ └── teamsProvider.test.ts
├── tsconfig.jest.json
└── tsconfig.json
================================================
FILE CONTENTS
================================================
================================================
FILE: .coderabbit.yml
================================================
release_notes: false
================================================
FILE: .github/CODEOWNERS
================================================
* @ajhollid @mohicody @Br0wnHammer @Owaiseimdad @karenvicent @shanikauwu1
================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
polar: # Replace with a single Polar username
buy_me_a_coffee: gorkemcetin
thanks_dev: # Replace with a single thanks.dev username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: ''
assignees: ''
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Desktop (please complete the following information):**
- Browser [e.g. Chrome, Safari]
- Version [e.g. 22]
**Additional context**
Add any other context about the problem here.
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: ''
assignees: ''
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.
================================================
FILE: .github/pull_request_template.md
================================================
**(Please remove this line only before submitting your PR. Ensure that all relevant items are checked before submission.)**
## Describe your changes
Briefly describe the changes you made and their purpose.
## Write your issue number after "Fixes "
Fixes #123
## Please ensure all items are checked off before requesting a review. "Checked off" means you need to add an "x" character between brackets so they turn into checkmarks.
- [ ] (Do not skip this or your PR will be closed) I deployed the application locally.
- [ ] (Do not skip this or your PR will be closed) I have performed a self-review and testing of my code.
- [ ] I have included the issue # in the PR.
- [ ] I have added i18n support to visible strings (instead of `<div>Add</div>`, use):
```Javascript
const { t } = useTranslation();
<div>{t('add')}</div>
```
- [ ] I have **not** included any files that are not related to my pull request, including package-lock and package-json if dependencies have not changed
- [ ] I didn't use any hardcoded values (otherwise it will not scale, and will make it difficult to maintain consistency across the application).
- [ ] I made sure font sizes, color choices etc are all referenced from the theme. I don't have any hardcoded dimensions.
- [ ] My PR is granular and targeted to one specific feature.
- [ ] I ran `npm run format` in server and client directories, which automatically formats your code.
- [ ] I took a screenshot or a video and attached to this PR if there is a UI change.
================================================
FILE: .github/scripts/download-translations.js
================================================
import axios from "axios";
import fs from "fs-extra";
import path from "path";
import { URLSearchParams } from "url";
// POEditor API information
const API_TOKEN = process.env.POEDITOR_API;
const PROJECT_ID = process.env.POEDITOR_PROJECT_ID;
const LANGUAGES = (
process.env.LANGUAGES || "ar,zh-tw,cs,en,fi,fr,de,pt-br,ru,es,tr,ja,zh-cn,th"
).split(",");
const EXPORT_FORMAT = process.env.EXPORT_FORMAT || "key_value_json";
// POEditor API endpoint
const API_URL = "https://api.poeditor.com/v2";
function normalizeLanguageCode(language) {
if (language.includes("-")) {
const [base, region] = language.split("-");
return `${base}-${region.toUpperCase()}`;
}
return language;
}
// Function to download translations
async function downloadTranslations() {
try {
console.log("Downloading translations from POEditor...");
console.log(`Using export format: ${EXPORT_FORMAT}`);
for (const language of LANGUAGES) {
console.log(`Downloading translations for ${language} language...`);
// Get export URL from POEditor
const exportResponse = await axios.post(
`${API_URL}/projects/export`,
new URLSearchParams({
api_token: API_TOKEN,
id: PROJECT_ID,
language: language,
type: EXPORT_FORMAT,
})
);
if (exportResponse.data.response.status !== "success") {
throw new Error(
`Failed to get export URL for ${language} language: ${JSON.stringify(
exportResponse.data
)}`
);
}
const fileUrl = exportResponse.data.result.url;
console.log(`Export URL obtained for ${language}`);
// Download translation file
const downloadResponse = await axios.get(fileUrl, {
responseType: "json",
});
const translations = downloadResponse.data;
console.log(`Downloaded translations for ${language}`);
// Check the format of data returned from POEditor and convert if necessary
let formattedTranslations = translations;
// If data is in array format, convert it to key-value format
if (Array.isArray(translations)) {
console.log(
`Converting array format to key-value format for ${language}`
);
formattedTranslations = {};
translations.forEach((item) => {
if (item.term && item.definition) {
formattedTranslations[item.term] = item.definition;
}
});
}
// Determine the output filename based on language
const normalizedLanguage = normalizeLanguageCode(language);
const filename = `${normalizedLanguage}.json`;
const outputPath = path.join(process.cwd(), "temp", filename);
await fs.writeJson(outputPath, formattedTranslations, { spaces: 2 });
console.log(
`Translations for ${language} language successfully downloaded and saved as: ${filename}`
);
}
console.log("All translations successfully downloaded!");
} catch (error) {
console.error("An error occurred while downloading translations:", error);
process.exit(1);
}
}
// Main function
async function main() {
try {
// Clean temp folder
await fs.emptyDir(path.join(process.cwd(), "temp"));
// Download translations
await downloadTranslations();
} catch (error) {
console.error("An error occurred during the process:", error);
process.exit(1);
}
}
// Run script
main();
================================================
FILE: .github/scripts/upload-translations.js
================================================
import axios from "axios";
import FormData from "form-data";
import fs from "fs-extra";
// POEditor API information
const API_TOKEN = process.env.POEDITOR_API;
const PROJECT_ID = process.env.POEDITOR_PROJECT_ID;
const FILE_PATH = process.env.FILE_PATH;
const LANGUAGE = process.env.LANGUAGE;
// POEditor API endpoint
const API_URL = 'https://api.poeditor.com/v2';
// Function to upload translations
async function uploadTranslations() {
try {
console.log(`Uploading translations for ${LANGUAGE} language from ${FILE_PATH}... test1`);
// Check if file exists
if (!await fs.pathExists(FILE_PATH)) {
throw new Error(`File not found: ${FILE_PATH}`);
}
// Read file content
const fileContent = await fs.readFile(FILE_PATH, 'utf8');
// Validate JSON format
try {
JSON.parse(fileContent);
} catch (error) {
throw new Error(`Invalid JSON format in ${FILE_PATH}: ${error.message}`);
}
// Create form data for upload
const formData = new FormData();
formData.append('api_token', API_TOKEN);
formData.append('id', PROJECT_ID);
formData.append('language', LANGUAGE);
formData.append('updating', 'terms_translations');
formData.append('file', fs.createReadStream(FILE_PATH));
formData.append('overwrite', '1');
formData.append('sync_terms', '1');
// Upload to POEditor
const response = await axios.post(`${API_URL}/projects/upload`, formData, {
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
}
});
if (response.data.response.status !== 'success') {
throw new Error(`Failed to upload translations: ${JSON.stringify(response.data)}`);
}
console.log(`Successfully uploaded translations for ${LANGUAGE} language.`);
console.log(`Statistics: ${JSON.stringify(response.data.result)}`);
} catch (error) {
console.error('An error occurred while uploading translations:', error);
process.exit(1);
}
}
// Run script
uploadTranslations();
================================================
FILE: .github/workflows/README.md
================================================
# POEditor Translation Synchronization
This GitHub Actions workflow automatically downloads translation files from POEditor and integrates them into the project.
## How It Works
The workflow can be triggered in two ways:
1. **Manual Trigger**: You can manually run the "POEditor Translation Synchronization" workflow from the "Actions" tab in the GitHub interface.
2. **Automatic Trigger**: The workflow runs automatically every day at midnight (UTC).
## Required Settings
For this workflow to function, you need to define the following secrets in your GitHub repository:
1. `POEDITOR_API_TOKEN`: Your POEditor API token
2. `POEDITOR_PROJECT_ID`: Your POEditor project ID
You can add these secrets in the "Settings > Secrets and variables > Actions" section of your GitHub repository.
## Manual Execution
When running the workflow manually, you can specify which languages to download. Languages should be entered as comma-separated values (e.g., `tr,gb,es`).
If you don't specify any languages, the default languages `tr` and `en` will be downloaded.
## Output
When the workflow completes successfully:
1. Translation files for the specified languages are downloaded from POEditor
2. These files are copied to the `src/locales/` directory
3. Changes are automatically committed and pushed to the main branch
## Troubleshooting
If the workflow fails:
1. Check the GitHub Actions logs
2. Make sure your POEditor API token and project ID are correct
3. Ensure that the languages you specified exist in your POEditor project
# POEditor Upload Workflow
## Summary of Implemented Translation Workflow
We have successfully created a GitHub Actions workflow that automatically uploads translation files to POEditor when changes are merged to the develop branch. Here's a summary of what we've implemented:
### Created Files
1. .github/scripts/upload-translations.js
- A Node.js script that handles the upload of translation files to POEditor
- Uses the POEditor API to upload JSON translation files
- Validates file existence and JSON format before uploading
- Provides detailed logging of the upload process
2. .github/workflows/poeditor-upload-on-merge.yml - A GitHub Actions workflow that triggers when PRs are merged to the develop branch - Only runs when changes are made to files in the src/locales directory - Detects which translation files were changed in the PR - Extracts language codes from filenames (e.g., tr.json → "tr") - Calls the upload script for each changed file
### Workflow Process
1. When a PR is merged to the develop branch, the workflow checks if any files in src/locales were modified.
1. If translation files were changed, the workflow:
- Sets up the necessary Node.js environment
- Installs required dependencies
- Identifies which specific translation files were changed
- For each changed file, extracts the language code and uploads to POEditor
- Provides status notifications about the upload process
This automated workflow ensures that your translations are always in sync between your codebase and POEditor, eliminating the need for manual uploads and reducing the risk of translation inconsistencies.
================================================
FILE: .github/workflows/check-build.yml
================================================
name: Build Check (Client & Server)
on:
pull_request:
workflow_dispatch:
jobs:
build-client:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Node
uses: actions/setup-node@v4
with:
node-version: 22
- name: Install client dependencies
working-directory: client
run: npm install
- name: Check client build
working-directory: client
run: npm run build
build-server:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Node
uses: actions/setup-node@v4
with:
node-version: 22
- name: Install server dependencies
working-directory: server
run: npm install
- name: Check server build
working-directory: server
run: npm run build
================================================
FILE: .github/workflows/check-format.yml
================================================
name: Format Check (Client & Server)
on:
pull_request:
workflow_dispatch:
jobs:
format-client:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Node
uses: actions/setup-node@v4
with:
node-version: 22
- name: Install client dependencies
working-directory: client
run: npm install
- name: Check client formatting
working-directory: client
run: npm run format-check
format-server:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Node
uses: actions/setup-node@v4
with:
node-version: 22
- name: Install server dependencies
working-directory: server
run: npm install
- name: Check server formatting
working-directory: server
run: npm run format-check
================================================
FILE: .github/workflows/deploy-images-on-release.yml
================================================
name: Deploy images on release
on:
push:
tags:
- "v*"
workflow_dispatch:
jobs:
docker-build-and-push-client:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Extract version from tag
id: extract_tag
run: echo "version=${GITHUB_REF#refs/tags/}" >> "$GITHUB_OUTPUT"
- name: Log in to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build Client Docker image
run: |
docker build \
-t ghcr.io/bluewave-labs/checkmate-client:${{ steps.extract_tag.outputs.version }} \
-f ./docker/dist/client.Dockerfile \
--label org.opencontainers.image.source=https://github.com/bluewave-labs/checkmate \
.
- name: Push Client Docker image
run: |
docker push ghcr.io/bluewave-labs/checkmate-client:${{ steps.extract_tag.outputs.version }}
docker-build-and-push-server:
needs: docker-build-and-push-client
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Extract version
id: extract_tag
run: echo "version=${GITHUB_REF#refs/tags/}" >> "$GITHUB_OUTPUT"
- name: Log in to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build Server Docker image
run: |
docker build \
-t ghcr.io/bluewave-labs/checkmate-backend:${{ steps.extract_tag.outputs.version }} \
-f ./docker/dist/server.Dockerfile \
--label org.opencontainers.image.source=https://github.com/bluewave-labs/checkmate \
.
- name: Push Server Docker image
run: |
docker push ghcr.io/bluewave-labs/checkmate-backend:${{ steps.extract_tag.outputs.version }}
- name: Build Mongo Docker image
run: |
docker build \
-t ghcr.io/bluewave-labs/checkmate-mongo:${{ steps.extract_tag.outputs.version }} \
-f ./docker/dist/mongoDB.Dockerfile \
--label org.opencontainers.image.source=https://github.com/bluewave-labs/checkmate \
.
- name: Push MongoDB Docker image
run: |
docker push ghcr.io/bluewave-labs/checkmate-mongo:${{ steps.extract_tag.outputs.version }}
docker-build-and-push-server-mono-multiarch:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Extract version
id: extract_tag
run: echo "version=${GITHUB_REF#refs/tags/}" >> "$GITHUB_OUTPUT"
- name: Log in to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push multi-arch Docker image
uses: docker/build-push-action@v5
with:
context: .
file: ./docker/dist-arm/server.Dockerfile
push: true
no-cache: true
tags: |
ghcr.io/bluewave-labs/checkmate-backend-mono-multiarch:${{ steps.extract_tag.outputs.version }}
platforms: linux/amd64,linux/arm64
labels: |
org.opencontainers.image.source=https://github.com/bluewave-labs/checkmate
build-args: |
VITE_APP_VERSION=${{ steps.extract_tag.outputs.version }}
docker-build-and-push-server-mono:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Extract version
id: extract_tag
run: echo "version=${GITHUB_REF#refs/tags/}" >> "$GITHUB_OUTPUT"
- name: Log in to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build Server Docker image
run: |
docker build \
-t ghcr.io/bluewave-labs/checkmate-backend-mono:${{ steps.extract_tag.outputs.version }} \
-f ./docker/dist-mono/server.Dockerfile \
--label org.opencontainers.image.source=https://github.com/bluewave-labs/checkmate \
--build-arg VITE_APP_VERSION=${{ steps.extract_tag.outputs.version }} \
.
- name: Push Server Docker image
run: docker push ghcr.io/bluewave-labs/checkmate-backend-mono:${{ steps.extract_tag.outputs.version }}
================================================
FILE: .github/workflows/deploy-images.yml
================================================
name: Deploy images
on:
push:
branches: ["master"]
workflow_dispatch:
jobs:
docker-build-and-push-client:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Log in to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Get version
id: vars
run: echo "VERSION=$(git describe --tags --abbrev=0)" >> $GITHUB_ENV
- name: Build Client Docker image
run: |
docker build \
-t ghcr.io/bluewave-labs/checkmate-client:latest \
-f ./docker/dist/client.Dockerfile \
--label org.opencontainers.image.source=https://github.com/bluewave-labs/checkmate \
--build-arg VITE_APP_VERSION=${{ env.VERSION }} \
.
- name: Push Client Docker image
run: |
docker push ghcr.io/bluewave-labs/checkmate-client:latest
docker-build-and-push-server:
needs: docker-build-and-push-client
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Log in to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build Server Docker image
run: |
docker build \
-t ghcr.io/bluewave-labs/checkmate-backend:latest \
-f ./docker/dist/server.Dockerfile \
--label org.opencontainers.image.source=https://github.com/bluewave-labs/checkmate \
.
- name: Push Server Docker image
run: |
docker push ghcr.io/bluewave-labs/checkmate-backend:latest
- name: Build Mongo Docker image
run: |
docker build \
-t ghcr.io/bluewave-labs/checkmate-mongo:latest \
-f ./docker/dist/mongoDB.Dockerfile \
--label org.opencontainers.image.source=https://github.com/bluewave-labs/checkmate \
.
- name: Push MongoDB Docker image
run: |
docker push ghcr.io/bluewave-labs/checkmate-mongo:latest
docker-build-and-push-server-mono-multiarch:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Log in to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Get version
id: vars
run: echo "VERSION=$(git describe --tags --abbrev=0)" >> $GITHUB_ENV
- name: Build and push multi-arch Docker image
uses: docker/build-push-action@v5
with:
context: .
file: ./docker/dist-arm/server.Dockerfile
push: true
no-cache: true
tags: |
ghcr.io/bluewave-labs/checkmate-backend-mono-multiarch:latest
platforms: linux/amd64,linux/arm64
labels: |
org.opencontainers.image.source=https://github.com/bluewave-labs/checkmate
build-args: |
VITE_APP_VERSION=${{ env.VERSION }}
docker-build-and-push-server-mono:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Log in to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Get version
id: vars
run: echo "VERSION=$(git describe --tags --abbrev=0)" >> $GITHUB_ENV
- name: Build Server Docker image
run: |
docker build \
-t ghcr.io/bluewave-labs/checkmate-backend-mono:latest \
-f ./docker/dist-mono/server.Dockerfile \
--label org.opencontainers.image.source=https://github.com/bluewave-labs/checkmate \
--build-arg VITE_APP_VERSION=${{ env.VERSION }} \
.
- name: Push Server Docker image
run: docker push ghcr.io/bluewave-labs/checkmate-backend-mono:latest
================================================
FILE: .github/workflows/poeditor-sync.yml
================================================
name: POEditor Translation Synchronization
on:
# For manual triggering
workflow_dispatch:
inputs:
languages:
description: "Languages to synchronize (comma separated, e.g.: tr,en,es)"
required: false
default: "ar,zh-tw,cs,en,fi,fr,de,pt-br,ru,es,tr,ja,zh-cn,th"
format:
description: "Export format (key_value_json or json)"
required: false
default: "key_value_json"
permissions:
contents: write
pull-requests: write
jobs:
sync-translations:
runs-on: ubuntu-latest
permissions:
contents: write
issues: write
pull-requests: write
steps:
- name: Checkout code
uses: actions/checkout@v3
with:
token: ${{ secrets.GITHUB_TOKEN }}
fetch-depth: 0
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: "22"
- name: Create package.json for scripts
run: |
mkdir -p .github/scripts
cat > .github/scripts/package.json << EOF
{
"name": "poeditor-scripts",
"version": "1.0.0",
"private": true,
"type": "module",
"dependencies": {
"axios": "^1.6.0",
"fs-extra": "^11.1.1"
}
}
EOF
- name: Install dependencies
run: |
cd .github/scripts
npm install
- name: Download translations from POEditor
env:
POEDITOR_API: ${{ secrets.POEDITOR_API }}
POEDITOR_PROJECT_ID: ${{ secrets.POEDITOR_PROJECT_ID }}
LANGUAGES: ${{ github.event.inputs.languages || 'tr,en' }}
EXPORT_FORMAT: ${{ github.event.inputs.format || 'key_value_json' }}
run: |
mkdir -p temp
node .github/scripts/download-translations.js
- name: Verify translation files
run: |
echo "Verifying translation files..."
for file in temp/*.json; do
echo "Checking $file"
if [ ! -s "$file" ]; then
echo "Error: $file is empty or does not exist"
exit 1
fi
# Validate JSON format
cat "$file" | jq . > /dev/null || { echo "Error: $file is not valid JSON"; exit 1; }
done
echo "All translation files are valid"
- name: Copy translations to project
run: |
mkdir -p client/src/locales
cp -r temp/* client/src/locales/
echo "Translation files copied to client/src/locales/"
- name: Get current date
id: date
run: echo "date=$(date +'%Y-%m-%d %H:%M:%S')" >> $GITHUB_OUTPUT
- name: Format client code
run: |
cd client
npm ci
npm run format
- name: Create Pull Request
uses: peter-evans/create-pull-request@v7
with:
token: ${{ secrets.GITHUB_TOKEN }}
commit-message: "feat: translations updated from POEditor"
title: "🌐 Updated Translations from POEditor"
body: |
This PR contains the latest translations from POEditor.
📅 Update Date: ${{ steps.date.outputs.date }}
🔄 Updated Languages: ${{ github.event.inputs.languages || 'tr,en' }}
⚠️ Please review the translations and approve the PR if everything looks correct.
branch: translation-update-${{ github.run_number }}
delete-branch: true
base: develop
add-paths: |
client/src/locales/*.json
committer: GitHub Action <github-actions[bot]@users.noreply.github.com>
author: GitHub Action <github-actions[bot]@users.noreply.github.com>
================================================
FILE: .github/workflows/production-deploy.yml
================================================
name: Demo deploy
on:
push:
branches: ["demo"]
workflow_dispatch:
jobs:
docker-build-and-push-client:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Log in to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Get version
id: vars
run: echo "VERSION=$(git describe --tags --abbrev=0)" >> $GITHUB_ENV
- name: Build Client Docker image
run: |
docker build \
-t ghcr.io/bluewave-labs/checkmate:frontend-demo \
-f ./docker/prod/client.Dockerfile \
--label org.opencontainers.image.source=https://github.com/bluewave-labs/checkmate \
--build-arg VITE_APP_VERSION=${{ env.VERSION }} \
.
- name: Push Client Docker image
run: docker push ghcr.io/bluewave-labs/checkmate:frontend-demo
docker-build-and-push-server:
needs: docker-build-and-push-client
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Log in to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build Server Docker image
run: |
docker build \
-t ghcr.io/bluewave-labs/checkmate:backend-demo \
-f ./docker/prod/server.Dockerfile \
--label org.opencontainers.image.source=https://github.com/bluewave-labs/checkmate \
.
- name: Push Server Docker image
run: docker push ghcr.io/bluewave-labs/checkmate:backend-demo
- name: Build Mongo Docker image
run: |
docker build \
-t ghcr.io/bluewave-labs/checkmate:mongo-demo \
-f ./docker/prod/mongoDB.Dockerfile \
--label org.opencontainers.image.source=https://github.com/bluewave-labs/checkmate \
.
- name: Push MongoDB Docker image
run: docker push ghcr.io/bluewave-labs/checkmate:mongo-demo
deploy-to-demo:
needs: docker-build-and-push-server
runs-on: ubuntu-latest
steps:
- name: SSH into server and restart container using Docker Compose
uses: appleboy/ssh-action@v1.2.2
with:
host: ${{ secrets.DEMO_SERVER_HOST }}
username: ${{ secrets.DEMO_SERVER_USER }}
key: ${{ secrets.DEMO_SERVER_SSH_KEY }}
script: |
cd checkmate
git pull
cd docker/prod
docker compose down
docker compose pull
docker compose up -d
================================================
FILE: .github/workflows/staging-deploy.yml
================================================
name: Staging deploy
on:
push:
branches: ["develop"]
jobs:
docker-build-and-push-client:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Log in to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Get version
id: vars
run: echo "VERSION=$(git describe --tags --abbrev=0)" >> $GITHUB_ENV
- name: Build Client Docker image
run: |
docker build \
-t ghcr.io/bluewave-labs/checkmate:frontend-staging \
-f ./docker/staging/client.Dockerfile \
--label org.opencontainers.image.source=https://github.com/bluewave-labs/checkmate \
--build-arg VITE_APP_VERSION=${{ env.VERSION }} \
.
- name: Push Client Docker image
run: docker push ghcr.io/bluewave-labs/checkmate:frontend-staging
docker-build-and-push-server:
needs: docker-build-and-push-client
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Log in to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build Server Docker image
run: |
docker build \
-t ghcr.io/bluewave-labs/checkmate:backend-staging \
-f ./docker/staging/server.Dockerfile \
--label org.opencontainers.image.source=https://github.com/bluewave-labs/checkmate \
.
- name: Push Server Docker image
run: docker push ghcr.io/bluewave-labs/checkmate:backend-staging
- name: Build Mongo Docker image
run: |
docker build \
-t ghcr.io/bluewave-labs/checkmate:mongo-staging \
-f ./docker/staging/mongoDB.Dockerfile \
--label org.opencontainers.image.source=https://github.com/bluewave-labs/checkmate \
.
- name: Push MongoDB Docker image
run: docker push ghcr.io/bluewave-labs/checkmate:mongo-staging
deploy-to-staging:
needs: docker-build-and-push-server
runs-on: ubuntu-latest
steps:
- name: SSH into server and restart container using Docker Compose
uses: appleboy/ssh-action@v1.2.2
with:
host: ${{ secrets.STAGING_SERVER_HOST }}
username: ${{ secrets.STAGING_SERVER_USER }}
key: ${{ secrets.STAGING_SERVER_SSH_KEY }}
script: |
cd checkmate
git pull
cd docker/staging
docker compose down
docker compose pull
docker compose up -d
docker system prune -af
================================================
FILE: .github/workflows/upload-poeditor.yml
================================================
name: Upload Translations to POEditor on PR Merge
on:
pull_request:
types: [closed]
branches:
- develop
paths:
- "client/src/locales/**"
jobs:
upload-translations:
# Only run if the PR was merged (not just closed) or manually triggered
if: github.event.pull_request.merged == true
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
with:
fetch-depth: 0 # Fetch all history to get changed files
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: "22"
- name: Create package.json for scripts
run: |
mkdir -p .github/scripts
cat > .github/scripts/package.json << EOF
{
"name": "poeditor-scripts",
"version": "1.0.0",
"private": true,
"type": "module",
"dependencies": {
"axios": "^1.6.0",
"fs-extra": "^11.1.1",
"form-data": "^4.0.0"
}
}
EOF
- name: Install dependencies
run: |
cd .github/scripts
npm install
- name: Get changed locale files
id: changed-files
if: github.event_name == 'pull_request'
run: |
# Get base and head commits
BASE_SHA=${{ github.event.pull_request.base.sha }}
HEAD_SHA=${{ github.event.pull_request.head.sha }}
echo "Base SHA: $BASE_SHA"
echo "Head SHA: $HEAD_SHA"
# Get list of changed files in client/src/locales directory
CHANGED_FILES=$(git diff --name-only $BASE_SHA..$HEAD_SHA -- 'client/src/locales/*.json' || git ls-files 'client/src/locales/*.json')
if [ -z "$CHANGED_FILES" ]; then
echo "No changes detected in locale files"
echo "CHANGED_FILES=" >> $GITHUB_ENV
else
echo "Changed files:"
echo "$CHANGED_FILES"
echo "CHANGED_FILES<<EOF" >> $GITHUB_ENV
echo "$CHANGED_FILES" >> $GITHUB_ENV
echo "EOF" >> $GITHUB_ENV
fi
- name: Upload changed translations to POEditor
if: env.CHANGED_FILES != ''
env:
POEDITOR_API: ${{ secrets.POEDITOR_API }}
POEDITOR_PROJECT_ID: ${{ secrets.POEDITOR_PROJECT_ID }}
run: |
# Process each changed file
for FILE in $CHANGED_FILES; do
if [[ -f "$FILE" ]]; then
# Extract language code from filename (e.g., client/src/locales/en.json -> en)
FILENAME=$(basename "$FILE")
# Special case: map gb.json to en language code
if [ "$FILENAME" == "gb.json" ]; then
LANG="en"
echo "Found gb.json, mapping to language code 'en'"
else
LANG=$(basename "$FILE" .json)
fi
echo "Processing $FILE for language $LANG"
# Upload to POEditor
LANGUAGE=$LANG FILE_PATH=$FILE node .github/scripts/upload-translations.js
fi
done
- name: Notify on success
if: success() && env.CHANGED_FILES != ''
run: |
echo "Successfully uploaded translation files to POEditor."
if [ "${{ github.event_name }}" == "workflow_dispatch" ]; then
echo "Manual trigger comment: ${{ github.event.inputs.comment }}"
fi
- name: Notify on no changes
if: env.CHANGED_FILES == ''
run: |
echo "No translation files were found to upload."
================================================
FILE: .gitignore
================================================
.idea
.vscode
.VSCodeCounter
*.sh
mongo
node_modules/
docs/architecture
docs/reviews
docs/todo
docs/frontend
================================================
FILE: .husky/pre-commit
================================================
#!/bin/sh
echo "Running lint-staged..."
cd client && npx lint-staged && cd ..
cd server && npx lint-staged && cd ..
================================================
FILE: CLAUDE.md
================================================
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Project Overview
Checkmate is an open-source uptime and infrastructure monitoring application. It monitors server hardware, uptime, response times, and incidents with real-time alerts. The companion agent [Capture](https://github.com/bluewave-labs/capture) provides infrastructure metrics (CPU, RAM, disk, temperature).
## Development Commands
### Client (React/Vite)
```bash
cd client
npm install
npm run dev # Start dev server at http://localhost:5173
npm run build # TypeScript check + production build
npm run lint # ESLint (strict, max-warnings 0)
npm run format # Prettier formatting
npm run format-check # Check formatting
```
### Server (Node.js/Express)
```bash
cd server
npm install
npm run dev # Start with hot-reload (nodemon + tsx) at http://localhost:52345
npm run build # TypeScript compile + path alias resolution
npm run test # Run Mocha tests with c8 coverage
npm run lint # ESLint v9
npm run lint-fix # Auto-fix lint issues
npm run format # Prettier formatting
```
### Docker Development
```bash
cd docker/dev
./build_images.sh
docker run -d -p 27017:27017 -v uptime_mongo_data:/data/db --name uptime_database_mongo mongo:6.0
```
## Environment Setup
### Server `.env` (minimum required)
```env
CLIENT_HOST="http://localhost:5173"
JWT_SECRET="my_secret_key_change_this"
DB_CONNECTION_STRING="mongodb://localhost:27017/uptime_db"
TOKEN_TTL="99d"
ORIGIN="localhost"
LOG_LEVEL="debug"
```
### Client `.env`
```env
VITE_APP_API_BASE_URL="http://localhost:52345/api/v1"
VITE_APP_LOG_LEVEL="debug"
```
## Architecture
### Monorepo Structure
- `/client` - React 18 + TypeScript + Vite + MUI frontend
- `/server` - Node.js 20+ + Express + TypeScript backend
- `/docker` - Multi-environment Docker configs (dev, staging, prod, arm, mono)
### Backend Layers
```
server/src/
├── controllers/ # Route handlers (authController, monitorController, etc.)
├── service/ # Business logic
│ ├── business/ # Core monitoring logic
│ ├── infrastructure/ # Server/system utilities
│ └── system/ # App-level settings
├── db/
│ ├── models/ # Mongoose schemas (Monitor, Check, Incident, User, etc.)
│ ├── migration/ # Database migrations (run on startup)
│ └── modules/ # Database-specific modules
├── middleware/v1/ # verifyJWT, rateLimiter, sanitization, responseHandler
├── routes/v1/ # API route definitions
├── validation/ # Joi input validation schemas
└── repositories/ # Data access layer
```
### Frontend Structure
```
client/src/
├── Components/ # Reusable UI components
├── Pages/ # Page components (Auth, Uptime, Infrastructure, Incidents, etc.)
├── Features/ # Redux slices (Auth, UI)
├── Hooks/ # Custom React hooks
├── Utils/ # Utilities (NetworkService.js is main API client)
├── Validation/ # Input validation
└── locales/ # i18n translations
```
### API
- Base URL: `/api/v1`
- Documentation: `http://localhost:52345/api-docs` (Swagger UI)
- OpenAPI spec: `/server/openapi.json`
### Key Technologies
- **State Management**: Redux Toolkit + Redux-Persist
- **Data Fetching**: SWR + Axios
- **Database**: MongoDB with Mongoose ODM
- **Queue/Cache**: Redis + BullMQ + Pulse (cron scheduling)
- **i18n**: i18next + react-i18next (translations via PoEditor)
## Code Conventions
### Internationalization
All user-facing strings must use the translation function:
```javascript
t('your.key') // Never hardcode UI strings
```
### Branching
- Always branch from `develop` (not master)
- Use descriptive names: `feat/add-alerts`, `fix/login-error`
- PRs target `develop` branch
### Formatting
- **Client**: Prettier with `printWidth: 90`, tabs, double quotes
- **Server**: Prettier with `printWidth: 150`, tabs, double quotes
- Both use ESLint with strict settings
### Testing
Server tests use Mocha + Chai + Sinon:
```bash
npm test # Run all tests with coverage
npm test -- --grep "pattern" # Run specific tests
```
Test files: `server/tests/**/*.test.js`
## Database Models
Key Mongoose models in `/server/src/db/models/`:
- **Monitor** - Monitoring configuration (website, infrastructure, port, etc.)
- **Check** - Individual monitoring check results
- **Incident** - Downtime incidents
- **User** - User accounts
- **Team** - Team/workspace management
- **StatusPage** - Public status pages
- **Notification** - Alert configuration (email, Discord, Slack, webhooks)
- **MaintenanceWindow** - Scheduled maintenance periods
- **AppSettings** - Global application settings
================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Contributor Covenant Code of Conduct
## Our Pledge
We as members, contributors, and leaders pledge to make participation in the **bluewave-uptime** project and community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation.
We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community, especially during Hacktoberfest, where we encourage new contributors to join and feel supported.
## Our Standards
Examples of behavior that contributes to a positive environment for our community include:
- Demonstrating empathy and kindness toward other people
- Being respectful of differing opinions, viewpoints, and experiences
- Giving and gracefully accepting constructive feedback
- Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience
- Focusing on what is best not just for us as individuals, but for the overall community
Examples of unacceptable behavior include:
- The use of sexualized language or imagery, and sexual attention or advances of any kind
- Trolling, insulting or derogatory comments, and personal or political attacks
- Public or private harassment
- Publishing others' private information, such as a physical or email address, without their explicit permission
- Other conduct which could reasonably be considered inappropriate in a professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful.
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned with this Code of Conduct, especially during Hacktoberfest to ensure a positive experience for all contributors.
## Scope
This Code of Conduct applies within all project spaces, and it also applies when an individual is officially representing the project or its community in public spaces. Examples of representing our project include using an official project email address, posting via an official social media account, or acting as an appointed representative at an online or offline event.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at hello@bluewavelabs.ca. All complaints will be reviewed and investigated promptly and fairly.
All project team members are obligated to respect the privacy and security of the reporter of any incident.
## Enforcement Guidelines
Project maintainers will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:
### 1. Correction
**Community Impact**: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community.
**Consequence**: A private, written warning from project maintainers, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested.
### 2. Warning
**Community Impact**: A violation through a single incident or series of actions.
**Consequence**: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban.
### 3. Temporary Ban
**Community Impact**: A serious violation of community standards, including sustained inappropriate behavior.
**Consequence**: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.
### 4. Permanent Ban
**Community Impact**: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals.
**Consequence**: A permanent ban from any sort of public interaction within the community.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org), version 2.0, available at https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
---
By following this Code of Conduct, we can ensure a welcoming and inclusive environment, encouraging new contributors to engage with the project and the community. Thank you for helping make **bluewave-uptime** a positive space for all!
================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to Checkmate
Thanks for your interest in contributing! Checkmate is an open-source, friendly project focused on learning and growth.
We truly appreciate all kinds of contributions — code, ideas, translations or documentation. Contributing helps you level up while making the project better for everyone.
Before you start, please take a moment to read the relevant section. It helps us review and accept contributions faster, and makes the whole process smoother for everyone. 💚
PS: **We work closely with contributors on our [Discord channel](https://discord.com/invite/NAb6H3UTjK)**. You'll find community members, core maintainers, and first-timers helping each other out.
---
## 🚀 Quick Setup Checklist
Before you dive in, make sure you have these installed:
```bash
# Check Node.js (v16+ required)
node --version
# Check npm
npm --version
# Check Docker
docker --version
# Check Git
git --version
```
**New to contributing?** Start here:
1. Pick a [`good-first-issue`](https://github.com/bluewave-labs/checkmate/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22)
2. Comment that you'd like to work on it
3. Follow the [setup guide](#set-up-checkmate-locally) below
4. Join our [Discord](https://discord.com/invite/NAb6H3UTjK) if you get stuck
## Table of contents
- [How do I...?](#how-do-i)
- [Get help or ask a question?](#get-help-or-ask-a-question)
- [Report a bug?](#report-a-bug)
- [Suggest a new feature?](#suggest-a-new-feature)
- [Set up Checkmate locally?](#set-up-checkmate-locally)
- [Start contributing code?](#start-contributing-code)
- [Improve the documentation?](#improve-the-documentation)
- [Help with translations?](#help-with-translations)
- [Submit a pull request?](#submit-a-pull-request)
- [Code guidelines](#code-guidelines)
- [Pull request checklist](#pull-request-checklist)
- [Branching model](#branching-model)
- [Thank you](#thank-you)
---
## How do I...
### Get help or ask a question?
Ask anything in our [Discord server](https://discord.com/invite/NAb6H3UTjK) — we're friendly and happy to help. [Our core contributors](https://github.com/bluewave-labs/checkmate?tab=readme-ov-file#-contributing) are active and ready to support you. You can also use [GitHub Discussions](https://github.com/bluewave-labs/Checkmate/discussions) section to ask your questions.
### Report a bug?
1. Search [existing issues](https://github.com/bluewave-labs/checkmate/issues).
2. If it's not listed, open a **new issue**.
3. Include as much detail as possible: what happened, what you expected, and steps to reproduce. Logs and screenshots help.
### Suggest a new feature?
1. Open a new issue with the **feature request** template.
2. Share your use case and why it would help.
3. You can discuss it in [Discord](https://discord.com/invite/NAb6H3UTjK) before you code.
### Set up Checkmate locally?
#### Prerequisites
- Node.js (with npm)
- Docker
- Git
#### Step 1: Clone the Repository
```bash
git clone https://github.com/bluewave-labs/Checkmate.git
cd Checkmate
```
#### Step 2: Set Up Docker Containers (MongoDB)
Navigate to the Docker dev directory:
```bash
cd docker/dev
```
Build the Docker images:
```bash
./build_images.sh
```
Run MongoDB container:
```bash
docker run -d -p 27017:27017 -v uptime_mongo_data:/data/db --name uptime_database_mongo mongo:6.0
```
Navigate back to the root directory:
```bash
cd ../..
```
#### Step 3: Set Up the Backend (Server)
Navigate to the server directory:
```bash
cd server
```
Install dependencies:
```bash
npm install
```
Create a `.env` file in the `server` directory with the following minimum required configuration:
```env
CLIENT_HOST="http://localhost:5173"
JWT_SECRET="my_secret_key_change_this"
DB_CONNECTION_STRING="mongodb://localhost:27017/uptime_db"
TOKEN_TTL="99d"
ORIGIN="localhost"
LOG_LEVEL="debug"
```
**Environment Variables Explained:**
- `CLIENT_HOST`: Frontend URL (default: http://localhost:5173)
- `JWT_SECRET`: Secret key for JWT tokens (change to something secure)
- `DB_CONNECTION_STRING`: MongoDB connection URL
- `ORIGIN`: Origin for CORS purposes
- `TOKEN_TTL`: Token time to live (in vercel/ms format)
- `LOG_LEVEL`: Debug level (debug, info, warn, error)
Start the backend server:
```bash
npm run dev
```
The server will run at `http://localhost:52345`.
#### Step 4: Set Up the Frontend (Client)
Open a new terminal window and navigate to the client directory from the root:
```bash
cd client
```
Install dependencies:
```bash
npm install
```
Create a `.env` file in the `client` directory:
```env
VITE_APP_API_BASE_URL="http://localhost:52345/api/v1"
VITE_APP_LOG_LEVEL="debug"
```
**Environment Variables Explained:**
- `VITE_APP_API_BASE_URL`: Backend API URL
- `VITE_APP_LOG_LEVEL`: Log level (none, error, warn, debug, info)
Start the frontend:
```bash
npm run dev
```
The client will run at `http://localhost:5173`.
#### Step 5: Access the Application
Open your browser and navigate to:
- **Frontend**: http://localhost:5173
- **Backend API**: http://localhost:52345
- **API Documentation**: http://localhost:52345/api-docs
#### Managing Docker Containers
Stop containers:
```bash
docker stop uptime_database_mongo
```
Start containers:
```bash
docker start uptime_database_mongo
```
Remove containers (if needed):
```bash
docker rm uptime_database_mongo
```
#### Troubleshooting
**Port already in use:**
- Check if another service is using ports 5173, 52345, 27017, or 6379
- Stop the conflicting service or change the port in `.env` files
**MongoDB connection issues:**
- Verify container is running: `docker ps`
- Check container logs: `docker logs uptime_database_mongo`
**Module not found errors:**
- Ensure you ran `npm install` in both `client` and `server` directories
**Need more help?**
- Check the [full documentation](https://docs.checkmate.so)
- Ask on [Discord](https://discord.com/invite/NAb6H3UTjK)
### Start contributing code?
1. Pick or open an issue (check `good-first-issue`s first)
2. (optional but highly suggested) Read a detailed structure of [Checkmate](https://deepwiki.com/bluewave-labs/Checkmate) if you would like to deep dive into the architecture.
3. Ask to be assigned. If there is already someone assigned and it's been more than 7 days, you can raise the flag and ask to be assigned as well.
4. Create a branch from `develop`.
5. Write your code.
6. Run and test locally.
7. Open a PR to `develop`.
Start with [good first issues](https://github.com/bluewave-labs/checkmate/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22).
### Improve the documentation?
Docs live in [checkmate-documentation](https://github.com/bluewave-labs/checkmate-documentation). You can fix typos, add guides, or explain features better.
### Help with translations?
We use [PoEditor](https://poeditor.com) for translations. You can:
- [Sign up and join your language team](https://poeditor.com/join/project/lRUoGZFCsJ).
- Translate UI strings.
- Ask questions on Discord in the relevant #translations channel.
Make sure all new UI strings in code use `t('key')`.
### Submit a pull request?
Follow the [pull request checklist](#pull-request-checklist). Your PR should:
- Be focused on one issue.
- Be tested locally.
- Use our linting and translation rules.
- Include the related issue (e.g. `Fixes #123`).
- Be opened against the `develop` branch.
---
## Code guidelines
- Use ESLint and Prettier (`npm run lint`).
- Follow naming conventions: `camelCase` for variables, `PascalCase` for components, `UPPER_CASE` for constants.
- No hard-coded strings — use `t('your.key')` for everything visible.
- Use the shared theme and components. No magic numbers or hardcoded styles.
- Follow structure and patterns already used in the codebase.
---
## Pull request checklist
Before submitting your pull request, please confirm the following:
- **You have tested the app locally and confirmed your changes work.**
- You reviewed your code and removed debug logs or leftover code.
- The GitHub issue is assigned to you.
- You included the related issue number in the PR description (e.g. `Fixes #123`).
- All user-facing text uses the translation function `t('key')`; no hardcoded strings.
- You avoided hardcoded URLs, config values, or sensitive data.
- You used the shared theme for any styling — no magic numbers or inline styles.
- The pull request addresses only one issue or topic.
- You added screenshots or a video for any UI-related changes.
- Your code passes linting and has no TypeScript errors.
If one or more of these are missing, we may ask you to update your pull request before we can merge it.
---
## Branching model
- Code contributions should go to the `develop` branch.
- `master` is used for stable releases.
- Use descriptive branch names, like `fix/login-error` or `feat/add-alerts`.
- Make sure that you are using the latest version.
- Make sure you run the code locally. The Checkmate [documentation](https://docs.checkmate.so) covers it.
- Find out if the functionality is already covered, maybe by an individual configuration.
- Perform a [search](/issues) to see if the enhancement has already been suggested. If it has, add a comment to the existing issue instead of opening a new one.
- Find out whether your idea fits with the scope and aims of the project. It's up to you to make a strong case to convince the project's developers of the merits of this feature. Keep in mind that we want features that will be useful to the majority of our users and not just a small subset. If you're just targeting a minority of users, consider writing an add-on/plugin library.
---
## Thank you
Thanks for making Checkmate better. We mean it. Whether it's your first pull request or your 50th, we're excited to build with you.
PS: feel free to introduce yourself on [Discord](https://discord.gg/NAb6H3UTjK) and say hi.
-- Checkmate team
Also make sure you read the [document about how to make a good pull request](/PULLREQUESTS.md).
================================================
FILE: Checkmate.CodeCanvas
================================================
{
"drawioXML": "<mxfile>\n <diagram id=\"89EWfH2uZ2hayMIEMftf\" name=\"Page-1\">\n <mxGraphModel dx=\"3249\" dy=\"1738\" grid=\"0\" gridSize=\"10\" guides=\"1\" tooltips=\"1\" connect=\"0\" arrows=\"1\" fold=\"1\" page=\"0\" pageScale=\"1\" pageWidth=\"850\" pageHeight=\"1100\" math=\"0\" shadow=\"0\">\n <root>\n <mxCell id=\"0\" />\n <mxCell id=\"1\" style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#fffefe\" parent=\"0\" />\n <UserObject label=\"client\" value=\"client\" id=\"0b23ea66-3e37-4643-b3b9-acb87ea02bae\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#fffefe\" vertex=\"1\" parent=\"1\">\n <mxGeometry x=\"245\" y=\"70\" width=\"4850\" height=\"11102.865179846314\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"src\" value=\"src\" id=\"d3264577-10f0-42fe-9411-7e9df0754d1e\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#f9f3f3\" vertex=\"1\" parent=\"0b23ea66-3e37-4643-b3b9-acb87ea02bae\">\n <mxGeometry x=\"175\" y=\"70\" width=\"4500\" height=\"10962.865179846314\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Pages\" value=\"Pages\" id=\"f0feab85-316a-41b5-a2f1-629220018846\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#f4e9e9\" vertex=\"1\" parent=\"d3264577-10f0-42fe-9411-7e9df0754d1e\">\n <mxGeometry x=\"875\" y=\"172\" width=\"2310\" height=\"10466.86517984631\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"v1\" value=\"v1\" id=\"1a083b4a-787c-4eb4-8029-6700de987679\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#efdfdf\" vertex=\"1\" parent=\"f0feab85-316a-41b5-a2f1-629220018846\">\n <mxGeometry x=\"175\" y=\"70\" width=\"1950\" height=\"10326.86517984631\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Uptime\" value=\"Uptime\" id=\"7090fcdb-09be-4c85-86fd-e73553bbb2ff\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#ead5d5\" vertex=\"1\" parent=\"1a083b4a-787c-4eb4-8029-6700de987679\">\n <mxGeometry x=\"350\" y=\"4492.607033820289\" width=\"1290\" height=\"2027.4731598690946\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Create\" value=\"Create\" id=\"3dba5acc-cf25-40b7-ad21-9cd715454cd5\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#e5cbcb\" vertex=\"1\" parent=\"7090fcdb-09be-4c85-86fd-e73553bbb2ff\">\n <mxGeometry x=\"310\" y=\"70.00000000000006\" width=\"805\" height=\"370\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"index.jsx\" value=\"index.jsx\" id=\"391ad99e-3114-4f54-a6ca-fd89b33c7e06\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#e0c1c1\" vertex=\"1\" parent=\"3dba5acc-cf25-40b7-ad21-9cd715454cd5\">\n <mxGeometry x=\"70\" y=\"70\" width=\"640\" height=\"230\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Uptime Monitor Creation: Display Form - index.jsx:L315-802\" value=\"Uptime Monitor Creation: Display Form - index.jsx:L315-802\" id=\"7a2da928-a65c-49d8-b0a3-c159a6df2bc5\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"391ad99e-3114-4f54-a6ca-fd89b33c7e06\">\n <mxGeometry x=\"70\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Uptime Monitor Creation: Handle Form Submission and Validation - index.jsx:L170-248\" value=\"Uptime Monitor Creation: Handle Form Submission and Validation - index.jsx:L170-248\" id=\"a81f4ae8-41fe-4d1b-95ce-86abcc67b53c\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"391ad99e-3114-4f54-a6ca-fd89b33c7e06\">\n <mxGeometry x=\"390\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <mxCell id=\"0e09aa33-d7c7-4c89-9da8-f0937658f4d3\" value=\"Uptime Monitor
Creation: Form
Submission\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=11;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" edge=\"1\" parent=\"391ad99e-3114-4f54-a6ca-fd89b33c7e06\" source=\"7a2da928-a65c-49d8-b0a3-c159a6df2bc5\" target=\"a81f4ae8-41fe-4d1b-95ce-86abcc67b53c\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\" />\n </mxGeometry>\n </mxCell>\n <UserObject label=\"Details\" value=\"Details\" id=\"273f3009-69d0-46fe-af57-3cd94a24b55b\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#e5cbcb\" vertex=\"1\" parent=\"7090fcdb-09be-4c85-86fd-e73553bbb2ff\">\n <mxGeometry x=\"197.5\" y=\"1037.2632062932591\" width=\"815\" height=\"920.2099535758355\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"index.jsx\" value=\"index.jsx\" id=\"1807d5b9-54be-430b-8997-cada4dd9b521\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#e0c1c1\" vertex=\"1\" parent=\"273f3009-69d0-46fe-af57-3cd94a24b55b\">\n <mxGeometry x=\"400\" y=\"620.2099535758355\" width=\"320\" height=\"230\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Navigate to Monitor Details - index.jsx:L27-188\" value=\"Navigate to Monitor Details - index.jsx:L27-188\" id=\"78a8a7c5-41d3-4453-a7f7-ac632bbef288\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"1807d5b9-54be-430b-8997-cada4dd9b521\">\n <mxGeometry x=\"70\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Components\" value=\"Components\" id=\"6aed78bb-62f1-4ac1-9b9a-9d5977e87404\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#e0c1c1\" vertex=\"1\" parent=\"273f3009-69d0-46fe-af57-3cd94a24b55b\">\n <mxGeometry x=\"95\" y=\"70\" width=\"650\" height=\"510\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"ResponseTable\" value=\"ResponseTable\" id=\"5ac0878f-d238-4763-8464-a85b4885a40f\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#e0c1c1\" vertex=\"1\" parent=\"6aed78bb-62f1-4ac1-9b9a-9d5977e87404\">\n <mxGeometry x=\"95\" y=\"70\" width=\"485\" height=\"370\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"index.jsx\" value=\"index.jsx\" id=\"d3f74ac7-3b9a-4cae-8d77-a0d5d605bb27\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#e0c1c1\" vertex=\"1\" parent=\"5ac0878f-d238-4763-8464-a85b4885a40f\">\n <mxGeometry x=\"95\" y=\"70\" width=\"320\" height=\"230\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Render Historical Data Table - index.jsx:L11-92\" value=\"Render Historical Data Table - index.jsx:L11-92\" id=\"c996f7ca-9384-4252-b343-7bfc049d14bb\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"d3f74ac7-3b9a-4cae-8d77-a0d5d605bb27\">\n <mxGeometry x=\"70\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"BulkImport\" value=\"BulkImport\" id=\"56dae13e-5735-4089-a9a4-e18be315aff7\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#e5cbcb\" vertex=\"1\" parent=\"7090fcdb-09be-4c85-86fd-e73553bbb2ff\">\n <mxGeometry x=\"95\" y=\"480.00000000000006\" width=\"1020\" height=\"517.2632062932591\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"index.jsx\" value=\"index.jsx\" id=\"29b6ad3c-9538-47bc-8796-aab942dc4b71\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#e0c1c1\" vertex=\"1\" parent=\"56dae13e-5735-4089-a9a4-e18be315aff7\">\n <mxGeometry x=\"605\" y=\"70\" width=\"320\" height=\"360\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Flow 1: CSV Import - Submit Upload - index.jsx:L32-45\" value=\"Flow 1: CSV Import - Submit Upload - index.jsx:L32-45\" id=\"dd2f9356-fad3-47d4-81d5-a5e038298e2b\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"29b6ad3c-9538-47bc-8796-aab942dc4b71\">\n <mxGeometry x=\"70\" y=\"200\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Flow 1: CSV Import - Client Handles Success - index.jsx:L37-41\" value=\"Flow 1: CSV Import - Client Handles Success - index.jsx:L37-41\" id=\"ae3b7e23-ed64-40aa-9760-389f0a869f8d\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"29b6ad3c-9538-47bc-8796-aab942dc4b71\">\n <mxGeometry x=\"70\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Upload.jsx\" value=\"Upload.jsx\" id=\"cd84476a-1c8b-4781-811f-58fb9944365b\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#e0c1c1\" vertex=\"1\" parent=\"56dae13e-5735-4089-a9a4-e18be315aff7\">\n <mxGeometry x=\"95\" y=\"217.26320629325912\" width=\"320\" height=\"230\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Flow 1: CSV Import - User Selects File - Upload.jsx:L23-31\" value=\"Flow 1: CSV Import - User Selects File - Upload.jsx:L23-31\" id=\"6f1948fa-e84a-4f8e-8f3b-8f24c511b3d8\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"cd84476a-1c8b-4781-811f-58fb9944365b\">\n <mxGeometry x=\"70\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <mxCell id=\"e03a8ce2-c2cd-4147-8bab-63d6c2cf0a48\" value=\"Flow 1:
CSV Import
- File
State Update\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=12;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" edge=\"1\" parent=\"56dae13e-5735-4089-a9a4-e18be315aff7\" source=\"6f1948fa-e84a-4f8e-8f3b-8f24c511b3d8\" target=\"dd2f9356-fad3-47d4-81d5-a5e038298e2b\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"480\" y=\"332.26320629325915\" />\n <mxPoint x=\"480\" y=\"315\" />\n </Array>\n </mxGeometry>\n </mxCell>\n <UserObject label=\"Infrastructure\" value=\"Infrastructure\" id=\"3f26b33e-477f-41df-a78a-3e3e4f4209ae\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#ead5d5\" vertex=\"1\" parent=\"1a083b4a-787c-4eb4-8029-6700de987679\">\n <mxGeometry x=\"412.5\" y=\"8646.86517984631\" width=\"1165\" height=\"1610\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Create\" value=\"Create\" id=\"74019e8a-3148-4a32-aae2-5afd16f3eb9b\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#e5cbcb\" vertex=\"1\" parent=\"3f26b33e-477f-41df-a78a-3e3e4f4209ae\">\n <mxGeometry x=\"340\" y=\"70\" width=\"650\" height=\"510\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Components\" value=\"Components\" id=\"ceded1fc-87a9-43c8-a756-746be3d4ad8d\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#e0c1c1\" vertex=\"1\" parent=\"74019e8a-3148-4a32-aae2-5afd16f3eb9b\">\n <mxGeometry x=\"70\" y=\"70\" width=\"485\" height=\"370\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"CustomAlertsSection.jsx\" value=\"CustomAlertsSection.jsx\" id=\"83800be3-2a0e-4419-b379-3f995f4050e7\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#e0c1c1\" vertex=\"1\" parent=\"ceded1fc-87a9-43c8-a756-746be3d4ad8d\">\n <mxGeometry x=\"70\" y=\"70\" width=\"320\" height=\"230\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Configuration: User Sets Alert Thresholds - CustomAlertsSection.jsx:L45-53\" value=\"Configuration: User Sets Alert Thresholds - CustomAlertsSection.jsx:L45-53\" id=\"9651d084-5c16-4417-89c1-f52ae6572a95\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"83800be3-2a0e-4419-b379-3f995f4050e7\">\n <mxGeometry x=\"70\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Details\" value=\"Details\" id=\"591128f9-0994-4e01-a1ab-f23357f97aff\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#e5cbcb\" vertex=\"1\" parent=\"3f26b33e-477f-41df-a78a-3e3e4f4209ae\">\n <mxGeometry x=\"95\" y=\"619.9999999999999\" width=\"895\" height=\"920.0000000000001\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"index.jsx\" value=\"index.jsx\" id=\"e292c552-b3df-4bac-bd9a-8f44c260a5aa\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#e0c1c1\" vertex=\"1\" parent=\"591128f9-0994-4e01-a1ab-f23357f97aff\">\n <mxGeometry x=\"327.5\" y=\"620\" width=\"320\" height=\"230\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Visualization: User Views Monitor Details - index.jsx:L23-31\" value=\"Visualization: User Views Monitor Details - index.jsx:L23-31\" id=\"801fe70a-1a19-406c-8f0d-770b0cb74409\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"e292c552-b3df-4bac-bd9a-8f44c260a5aa\">\n <mxGeometry x=\"70\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Components\" value=\"Components\" id=\"e97d4e61-483e-4ac5-85a1-0ff72fcdd449\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#e0c1c1\" vertex=\"1\" parent=\"591128f9-0994-4e01-a1ab-f23357f97aff\">\n <mxGeometry x=\"175\" y=\"70\" width=\"650\" height=\"510\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"GaugeBoxes\" value=\"GaugeBoxes\" id=\"6a7c7720-a399-4d4d-8225-36e0b2f59731\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#e0c1c1\" vertex=\"1\" parent=\"e97d4e61-483e-4ac5-85a1-0ff72fcdd449\">\n <mxGeometry x=\"95\" y=\"70\" width=\"485\" height=\"370\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"index.jsx\" value=\"index.jsx\" id=\"8fe3d890-3605-407d-b06c-1d890a354e46\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#e0c1c1\" vertex=\"1\" parent=\"6a7c7720-a399-4d4d-8225-36e0b2f59731\">\n <mxGeometry x=\"95\" y=\"70\" width=\"320\" height=\"230\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Visualization: Frontend Renders Charts and Gauges - index.jsx:L22-51\" value=\"Visualization: Frontend Renders Charts and Gauges - index.jsx:L22-51\" id=\"9ea2e32d-1ea8-42f2-9a17-613844723ae6\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"8fe3d890-3605-407d-b06c-1d890a354e46\">\n <mxGeometry x=\"70\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Notifications\" value=\"Notifications\" id=\"b3575a92-df07-4cf7-810f-8e5e0672d666\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#ead5d5\" vertex=\"1\" parent=\"1a083b4a-787c-4eb4-8029-6700de987679\">\n <mxGeometry x=\"1125\" y=\"3942.607033820289\" width=\"650\" height=\"510\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"create\" value=\"create\" id=\"a6fb23f0-73bc-40ee-bb3c-ed93605a2bcb\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#e5cbcb\" vertex=\"1\" parent=\"b3575a92-df07-4cf7-810f-8e5e0672d666\">\n <mxGeometry x=\"70\" y=\"70\" width=\"485\" height=\"370\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"index.jsx\" value=\"index.jsx\" id=\"b71b02fb-d08e-4fcf-b959-de1b9547d9c2\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#e0c1c1\" vertex=\"1\" parent=\"a6fb23f0-73bc-40ee-bb3c-ed93605a2bcb\">\n <mxGeometry x=\"70\" y=\"70\" width=\"320\" height=\"230\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Flow 1: Render Notification Creation Form - index.jsx:L157-321\" value=\"Flow 1: Render Notification Creation Form - index.jsx:L157-321\" id=\"15486629-84b3-463a-962b-06083f69e4bf\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"b71b02fb-d08e-4fcf-b959-de1b9547d9c2\">\n <mxGeometry x=\"70\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"StatusPage\" value=\"StatusPage\" id=\"9d662180-8b65-4426-ad37-cfed4bc01fb4\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#ead5d5\" vertex=\"1\" parent=\"1a083b4a-787c-4eb4-8029-6700de987679\">\n <mxGeometry x=\"280\" y=\"1072.6070338202887\" width=\"1430\" height=\"1470\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Create\" value=\"Create\" id=\"08602a28-f073-484e-9403-7eb798126dd4\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#e5cbcb\" vertex=\"1\" parent=\"9d662180-8b65-4426-ad37-cfed4bc01fb4\">\n <mxGeometry x=\"70\" y=\"70\" width=\"1185\" height=\"510\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"index.jsx\" value=\"index.jsx\" id=\"e2d2bbf6-dffd-4edf-8c5d-34088d9d4745\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#e0c1c1\" vertex=\"1\" parent=\"08602a28-f073-484e-9403-7eb798126dd4\">\n <mxGeometry x=\"70\" y=\"140\" width=\"320\" height=\"230\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Create Status Page: User Initiates Creation - index.jsx:L26-313\" value=\"Create Status Page: User Initiates Creation - index.jsx:L26-313\" id=\"00289d11-0015-4b2a-9c5b-dc9fd0f32b80\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"e2d2bbf6-dffd-4edf-8c5d-34088d9d4745\">\n <mxGeometry x=\"70\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Hooks\" value=\"Hooks\" id=\"56f6775e-9843-4ca2-bc8c-1c263b6c35e9\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#e0c1c1\" vertex=\"1\" parent=\"08602a28-f073-484e-9403-7eb798126dd4\">\n <mxGeometry x=\"580\" y=\"70\" width=\"510\" height=\"370\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"useCreateStatusPage.jsx\" value=\"useCreateStatusPage.jsx\" id=\"3945e05f-2d99-4d6d-9a3e-b6c75ea3c45a\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#e0c1c1\" vertex=\"1\" parent=\"56f6775e-9843-4ca2-bc8c-1c263b6c35e9\">\n <mxGeometry x=\"95\" y=\"70\" width=\"320\" height=\"230\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Create Status Page: Client Hook Sends API Request - useCreateStatusPage.jsx:L8-11\" value=\"Create Status Page: Client Hook Sends API Request - useCreateStatusPage.jsx:L8-11\" id=\"aa5d6d07-05f0-45f3-b19a-199af50e35f1\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"3945e05f-2d99-4d6d-9a3e-b6c75ea3c45a\">\n <mxGeometry x=\"70\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <mxCell id=\"de23eee2-b60a-4236-a890-3c5b78388bb3\" value=\"Create Status
Page: Form
Submission\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=10;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" edge=\"1\" parent=\"08602a28-f073-484e-9403-7eb798126dd4\" source=\"00289d11-0015-4b2a-9c5b-dc9fd0f32b80\" target=\"aa5d6d07-05f0-45f3-b19a-199af50e35f1\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\" />\n </mxGeometry>\n </mxCell>\n <UserObject label=\"Status\" value=\"Status\" id=\"8ef70566-37d9-48fb-b5e8-37e5b68768a2\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#e5cbcb\" vertex=\"1\" parent=\"9d662180-8b65-4426-ad37-cfed4bc01fb4\">\n <mxGeometry x=\"221.66666666666666\" y=\"620\" width=\"780\" height=\"780\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"index.jsx\" value=\"index.jsx\" id=\"e1e6f5e0-fd8c-4260-aa4f-cdb096c6b1c3\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#e0c1c1\" vertex=\"1\" parent=\"8ef70566-37d9-48fb-b5e8-37e5b68768a2\">\n <mxGeometry x=\"175\" y=\"70\" width=\"320\" height=\"230\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"View Status Page: Component Renders UI - index.jsx:L145-163\" value=\"View Status Page: Component Renders UI - index.jsx:L145-163\" id=\"f59b91de-5196-4a43-9d57-3f28402c0672\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"e1e6f5e0-fd8c-4260-aa4f-cdb096c6b1c3\">\n <mxGeometry x=\"70\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Hooks\" value=\"Hooks\" id=\"79da0721-d810-4f7f-9cf9-3ea462bf0bff\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#e0c1c1\" vertex=\"1\" parent=\"8ef70566-37d9-48fb-b5e8-37e5b68768a2\">\n <mxGeometry x=\"175\" y=\"340\" width=\"510\" height=\"370\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"useStatusPageFetch.jsx\" value=\"useStatusPageFetch.jsx\" id=\"5b2cdab8-66f1-40a1-9621-0efaf54e04ae\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#e0c1c1\" vertex=\"1\" parent=\"79da0721-d810-4f7f-9cf9-3ea462bf0bff\">\n <mxGeometry x=\"95\" y=\"70\" width=\"320\" height=\"230\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"View Status Page: Client Hook Sends API Request - useStatusPageFetch.jsx:L15-18\" value=\"View Status Page: Client Hook Sends API Request - useStatusPageFetch.jsx:L15-18\" id=\"ecfb2d04-2681-4f16-af75-632f69e1a868\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"5b2cdab8-66f1-40a1-9621-0efaf54e04ae\">\n <mxGeometry x=\"70\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"PageSpeed\" value=\"PageSpeed\" id=\"043d3dac-d4bb-449b-a3a7-270d53b66dac\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#ead5d5\" vertex=\"1\" parent=\"1a083b4a-787c-4eb4-8029-6700de987679\">\n <mxGeometry x=\"670\" y=\"70\" width=\"650\" height=\"920.010195392\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Create\" value=\"Create\" id=\"414c500b-7b68-42ba-8110-e855efbee750\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#e5cbcb\" vertex=\"1\" parent=\"043d3dac-d4bb-449b-a3a7-270d53b66dac\">\n <mxGeometry x=\"70\" y=\"480.01019539199996\" width=\"485\" height=\"370\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"index.jsx\" value=\"index.jsx\" id=\"5ffe0baa-054a-4e5b-8b29-1254f07ea975\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#e0c1c1\" vertex=\"1\" parent=\"414c500b-7b68-42ba-8110-e855efbee750\">\n <mxGeometry x=\"70\" y=\"70\" width=\"320\" height=\"230\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Create PageSpeed Monitor - index.jsx:L111-143\" value=\"Create PageSpeed Monitor - index.jsx:L111-143\" id=\"0622b212-3a4a-484d-9b7a-125864d785cd\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"5ffe0baa-054a-4e5b-8b29-1254f07ea975\">\n <mxGeometry x=\"70\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Details\" value=\"Details\" id=\"581b4919-8b0c-4f0d-ae67-ad6de11d8c8b\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#e5cbcb\" vertex=\"1\" parent=\"043d3dac-d4bb-449b-a3a7-270d53b66dac\">\n <mxGeometry x=\"95\" y=\"70\" width=\"485\" height=\"370\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"index.jsx\" value=\"index.jsx\" id=\"c4a7bb58-1d9c-4690-b6b8-460c1cc33702\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#e0c1c1\" vertex=\"1\" parent=\"581b4919-8b0c-4f0d-ae67-ad6de11d8c8b\">\n <mxGeometry x=\"95\" y=\"70\" width=\"320\" height=\"230\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Frontend Renders Performance Charts - index.jsx:L91-126\" value=\"Frontend Renders Performance Charts - index.jsx:L91-126\" id=\"9ef9e218-4742-487a-9a88-5c70e788ccdc\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"c4a7bb58-1d9c-4690-b6b8-460c1cc33702\">\n <mxGeometry x=\"70\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Maintenance\" value=\"Maintenance\" id=\"8021b55d-2d3a-4416-b598-e134e76c9434\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#ead5d5\" vertex=\"1\" parent=\"1a083b4a-787c-4eb4-8029-6700de987679\">\n <mxGeometry x=\"215\" y=\"6560.080193689384\" width=\"1560\" height=\"1366.78498615693\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"CreateMaintenance\" value=\"CreateMaintenance\" id=\"6f7119ac-d65a-4fdf-a6f2-31052e0f5549\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#e5cbcb\" vertex=\"1\" parent=\"8021b55d-2d3a-4416-b598-e134e76c9434\">\n <mxGeometry x=\"175\" y=\"70\" width=\"1210\" height=\"546.7778279053807\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"index.jsx\" value=\"index.jsx\" id=\"92c244d2-e6a7-4804-a643-1e8d36baf9c6\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#e0c1c1\" vertex=\"1\" parent=\"6f7119ac-d65a-4fdf-a6f2-31052e0f5549\">\n <mxGeometry x=\"95\" y=\"70\" width=\"320\" height=\"360.23526566400005\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Flow: Create Maintenance Window - User Interaction - index.jsx:L46-131\" value=\"Flow: Create Maintenance Window - User Interaction - index.jsx:L46-131\" id=\"20335f29-a2ac-4e0c-aba6-28707748ecd4\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"92c244d2-e6a7-4804-a643-1e8d36baf9c6\">\n <mxGeometry x=\"70\" y=\"200.235265664\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Flow: Create Maintenance Window - UI Update - index.jsx:L111-119\" value=\"Flow: Create Maintenance Window - UI Update - index.jsx:L111-119\" id=\"a5a84b08-8c70-4023-8d08-b74e23aab4d7\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"92c244d2-e6a7-4804-a643-1e8d36baf9c6\">\n <mxGeometry x=\"70\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"hooks\" value=\"hooks\" id=\"015a17fc-3fcf-45e0-8936-19f5e2ca86a3\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#e0c1c1\" vertex=\"1\" parent=\"6f7119ac-d65a-4fdf-a6f2-31052e0f5549\">\n <mxGeometry x=\"605\" y=\"106.77782790538079\" width=\"510\" height=\"370\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"useMaintenanceActions.jsx\" value=\"useMaintenanceActions.jsx\" id=\"6ad0396e-9b38-4f5d-9ad9-6c9fcb4434f4\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#e0c1c1\" vertex=\"1\" parent=\"015a17fc-3fcf-45e0-8936-19f5e2ca86a3\">\n <mxGeometry x=\"95\" y=\"70\" width=\"320\" height=\"230\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Flow: Create Maintenance Window - Prepare API Request - useMaintenanceActions.jsx:L25-58\" value=\"Flow: Create Maintenance Window - Prepare API Request - useMaintenanceActions.jsx:L25-58\" id=\"5bdfdfa4-5d93-49fa-b05c-905813e6cf9d\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"6ad0396e-9b38-4f5d-9ad9-6c9fcb4434f4\">\n <mxGeometry x=\"70\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <mxCell id=\"d3bdc6ff-875e-472e-88c8-eb10b20c526e\" value=\"Flow: Create
Maintenance Window
- Form
Submission\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=12;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" edge=\"1\" parent=\"6f7119ac-d65a-4fdf-a6f2-31052e0f5549\" source=\"20335f29-a2ac-4e0c-aba6-28707748ecd4\" target=\"5bdfdfa4-5d93-49fa-b05c-905813e6cf9d\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"480\" y=\"315.2352656640011\" />\n <mxPoint x=\"480\" y=\"291.77782790538186\" />\n </Array>\n </mxGeometry>\n </mxCell>\n <UserObject label=\"index.jsx\" value=\"index.jsx\" id=\"1eae6263-aaa2-4206-b92e-1e67f529c1c9\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#e5cbcb\" vertex=\"1\" parent=\"8021b55d-2d3a-4416-b598-e134e76c9434\">\n <mxGeometry x=\"1065\" y=\"656.7778279053807\" width=\"320\" height=\"230\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Flow: View Maintenance Windows - Page Load - index.jsx:L25-47\" value=\"Flow: View Maintenance Windows - Page Load - index.jsx:L25-47\" id=\"d145bb4c-e1e0-473a-b6bc-decc932b738b\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"1eae6263-aaa2-4206-b92e-1e67f529c1c9\">\n <mxGeometry x=\"70\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"MaintenanceTable\" value=\"MaintenanceTable\" id=\"5ad4d33f-0932-479c-bb57-22ce6405758f\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#e5cbcb\" vertex=\"1\" parent=\"8021b55d-2d3a-4416-b598-e134e76c9434\">\n <mxGeometry x=\"175\" y=\"926.78498615693\" width=\"485\" height=\"370\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"index.jsx\" value=\"index.jsx\" id=\"e7ec5ca9-6d25-4bf2-9695-639556f7d141\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#e0c1c1\" vertex=\"1\" parent=\"5ad4d33f-0932-479c-bb57-22ce6405758f\">\n <mxGeometry x=\"95\" y=\"70\" width=\"320\" height=\"230\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Flow: View Maintenance Windows - UI Rendering - index.jsx:L195-201\" value=\"Flow: View Maintenance Windows - UI Rendering - index.jsx:L195-201\" id=\"970e2002-7c0e-40ef-80d8-e5e6d0a60735\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"e7ec5ca9-6d25-4bf2-9695-639556f7d141\">\n <mxGeometry x=\"70\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Account\" value=\"Account\" id=\"3cad7666-0d1a-4e31-b6ca-70d9c3a46b19\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#ead5d5\" vertex=\"1\" parent=\"1a083b4a-787c-4eb4-8029-6700de987679\">\n <mxGeometry x=\"402.5\" y=\"2582.607033820289\" width=\"1185\" height=\"640\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"index.jsx\" value=\"index.jsx\" id=\"33960806-1b9e-4d61-a163-e4bebf82d87a\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#e5cbcb\" vertex=\"1\" parent=\"3cad7666-0d1a-4e31-b6ca-70d9c3a46b19\">\n <mxGeometry x=\"70\" y=\"287.5203768220729\" width=\"320\" height=\"230\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Client: Conditional UI Rendering Based on Role - index.jsx:L37-41\" value=\"Client: Conditional UI Rendering Based on Role - index.jsx:L37-41\" id=\"3de2d413-5e9b-49f4-9409-74be32c52e0f\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"33960806-1b9e-4d61-a163-e4bebf82d87a\">\n <mxGeometry x=\"70\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"components\" value=\"components\" id=\"425a4c15-043f-4d05-8832-da00e18f97b9\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#e5cbcb\" vertex=\"1\" parent=\"3cad7666-0d1a-4e31-b6ca-70d9c3a46b19\">\n <mxGeometry x=\"580\" y=\"70\" width=\"510\" height=\"500\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"TeamPanel.jsx\" value=\"TeamPanel.jsx\" id=\"1145f351-2257-411d-86f7-30bf8c26ad68\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#e0c1c1\" vertex=\"1\" parent=\"425a4c15-043f-4d05-8832-da00e18f97b9\">\n <mxGeometry x=\"95\" y=\"70\" width=\"320\" height=\"360\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Client: Initiate User Invitation - TeamPanel.jsx:L348-354\" value=\"Client: Initiate User Invitation - TeamPanel.jsx:L348-354\" id=\"b27f1bba-c655-40c6-a1dc-71e78c590c92\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"1145f351-2257-411d-86f7-30bf8c26ad68\">\n <mxGeometry x=\"70\" y=\"200\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Client: Display Success Feedback - TeamPanel.jsx:L145-149\" value=\"Client: Display Success Feedback - TeamPanel.jsx:L145-149\" id=\"02d87257-883c-4822-a421-823c983532ec\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"1145f351-2257-411d-86f7-30bf8c26ad68\">\n <mxGeometry x=\"70\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <mxCell id=\"c441312f-f3c6-48c6-b1b9-7c12749d91bb\" value=\"Client: User
Navigates to
Team Panel\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=12;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" edge=\"1\" parent=\"3cad7666-0d1a-4e31-b6ca-70d9c3a46b19\" source=\"3de2d413-5e9b-49f4-9409-74be32c52e0f\" target=\"b27f1bba-c655-40c6-a1dc-71e78c590c92\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"455\" y=\"402.52037682207174\" />\n <mxPoint x=\"455\" y=\"384.99999999999886\" />\n </Array>\n </mxGeometry>\n </mxCell>\n <UserObject label=\"Settings\" value=\"Settings\" id=\"50f77798-f41b-4f5b-b096-7afc921a0419\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#ead5d5\" vertex=\"1\" parent=\"1a083b4a-787c-4eb4-8029-6700de987679\">\n <mxGeometry x=\"861.6666666666666\" y=\"7966.865179846312\" width=\"590\" height=\"640\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"index.jsx\" value=\"index.jsx\" id=\"d4b34195-7e1e-47a0-9303-603987c81f95\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#e5cbcb\" vertex=\"1\" parent=\"50f77798-f41b-4f5b-b096-7afc921a0419\">\n <mxGeometry x=\"95\" y=\"70\" width=\"320\" height=\"230\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Flow 1: Render Settings Page - index.jsx:L25-52\" value=\"Flow 1: Render Settings Page - index.jsx:L25-52\" id=\"97908daf-d071-4df5-8366-1f5f4d8d534a\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"d4b34195-7e1e-47a0-9303-603987c81f95\">\n <mxGeometry x=\"70\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"SettingsEmail.jsx\" value=\"SettingsEmail.jsx\" id=\"d8aa5b9e-f2a7-44c8-8813-d79c3f3238ee\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#e5cbcb\" vertex=\"1\" parent=\"50f77798-f41b-4f5b-b096-7afc921a0419\">\n <mxGeometry x=\"95\" y=\"340\" width=\"320\" height=\"230\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"User Interaction: Modify Email Settings - SettingsEmail.jsx:L119-167\" value=\"User Interaction: Modify Email Settings - SettingsEmail.jsx:L119-167\" id=\"09cb194a-0ea4-46e2-b32b-36b62fa87f40\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"d8aa5b9e-f2a7-44c8-8813-d79c3f3238ee\">\n <mxGeometry x=\"70\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Logs\" value=\"Logs\" id=\"1716ec41-8b42-4386-9850-55b8a607638e\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#ead5d5\" vertex=\"1\" parent=\"1a083b4a-787c-4eb4-8029-6700de987679\">\n <mxGeometry x=\"1125\" y=\"3262.607033820289\" width=\"650\" height=\"640\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Diagnostics\" value=\"Diagnostics\" id=\"e0cb598c-e300-4fd3-8554-db7ffd6201f1\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#e5cbcb\" vertex=\"1\" parent=\"1716ec41-8b42-4386-9850-55b8a607638e\">\n <mxGeometry x=\"70\" y=\"70\" width=\"485\" height=\"500\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"index.jsx\" value=\"index.jsx\" id=\"87e0e2ea-4a6d-460d-95bc-31e2efd9c9cf\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#e0c1c1\" vertex=\"1\" parent=\"e0cb598c-e300-4fd3-8554-db7ffd6201f1\">\n <mxGeometry x=\"70\" y=\"70\" width=\"320\" height=\"360\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Flow 2: Navigate to Diagnostics Page - index.jsx:L14-15\" value=\"Flow 2: Navigate to Diagnostics Page - index.jsx:L14-15\" id=\"704e2ec8-9f2f-47e5-852f-c6ada67a02e0\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"87e0e2ea-4a6d-460d-95bc-31e2efd9c9cf\">\n <mxGeometry x=\"70\" y=\"200\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"UI Update: Display System Health - index.jsx:L59-63\" value=\"UI Update: Display System Health - index.jsx:L59-63\" id=\"4b418736-6b72-47e0-917a-d86d4bed9ecd\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"87e0e2ea-4a6d-460d-95bc-31e2efd9c9cf\">\n <mxGeometry x=\"70\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Hooks\" value=\"Hooks\" id=\"4295a047-076f-4c07-95dd-b3123b6614f7\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#f4e9e9\" vertex=\"1\" parent=\"d3264577-10f0-42fe-9411-7e9df0754d1e\">\n <mxGeometry x=\"3375\" y=\"7802.246623286175\" width=\"950\" height=\"1439.9999999999998\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"v1\" value=\"v1\" id=\"3bf0c0f9-cbb0-4f0c-8cb3-6e2a4abc0961\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#efdfdf\" vertex=\"1\" parent=\"4295a047-076f-4c07-95dd-b3123b6614f7\">\n <mxGeometry x=\"175\" y=\"70\" width=\"600\" height=\"1299.9999999999998\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"monitorHooks.js\" value=\"monitorHooks.js\" id=\"595cf0e8-2f86-4543-b51c-b2aeac307f4b\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=16;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"3bf0c0f9-cbb0-4f0c-8cb3-6e2a4abc0961\">\n <mxGeometry x=\"255\" y=\"740.0000000000001\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"useNotifications.js\" value=\"useNotifications.js\" id=\"cd2428fd-6545-48dd-b685-5261311b7532\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#ead5d5\" vertex=\"1\" parent=\"3bf0c0f9-cbb0-4f0c-8cb3-6e2a4abc0961\">\n <mxGeometry x=\"185\" y=\"70\" width=\"320\" height=\"230\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Flow 1: Frontend API Call - useNotifications.js:L14-17\" value=\"Flow 1: Frontend API Call - useNotifications.js:L14-17\" id=\"a07b805e-e55f-46cb-b54b-765b7813b0ca\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"cd2428fd-6545-48dd-b685-5261311b7532\">\n <mxGeometry x=\"70\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"checkHooks.js\" value=\"checkHooks.js\" id=\"933a6cdc-349c-4725-b7ae-14cf780bfde8\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#ead5d5\" vertex=\"1\" parent=\"3bf0c0f9-cbb0-4f0c-8cb3-6e2a4abc0961\">\n <mxGeometry x=\"185\" y=\"340\" width=\"320\" height=\"360\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Fetch Monitor Checks Hook - checkHooks.js:L89-121\" value=\"Fetch Monitor Checks Hook - checkHooks.js:L89-121\" id=\"4a5847d0-91a0-4b4c-8517-2f4ff9a7e8d4\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"933a6cdc-349c-4725-b7ae-14cf780bfde8\">\n <mxGeometry x=\"70\" y=\"200\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Update Frontend State - checkHooks.js:L109-110\" value=\"Update Frontend State - checkHooks.js:L109-110\" id=\"ceb9cda3-968d-44aa-b223-49902adb93b4\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"933a6cdc-349c-4725-b7ae-14cf780bfde8\">\n <mxGeometry x=\"70\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"settingsHooks.js\" value=\"settingsHooks.js\" id=\"8ee5d524-e61d-4e39-a729-babf54929def\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#ead5d5\" vertex=\"1\" parent=\"3bf0c0f9-cbb0-4f0c-8cb3-6e2a4abc0961\">\n <mxGeometry x=\"185\" y=\"869.9999999999998\" width=\"320\" height=\"360\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"API Call: Update Application Settings - settingsHooks.js:L41-67\" value=\"API Call: Update Application Settings - settingsHooks.js:L41-67\" id=\"1b2cf182-9ee3-4218-a7ec-b74e427ccddf\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"8ee5d524-e61d-4e39-a729-babf54929def\">\n <mxGeometry x=\"70\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"UI Update: Display Success Confirmation - settingsHooks.js:L58\" value=\"UI Update: Display Success Confirmation - settingsHooks.js:L58\" id=\"fff5dde4-8eb8-4c21-9c6d-0845a9749ff3\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"8ee5d524-e61d-4e39-a729-babf54929def\">\n <mxGeometry x=\"70\" y=\"200\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Utils\" value=\"Utils\" id=\"02b07589-ec21-4366-b7d2-9071e8f3bad8\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#f4e9e9\" vertex=\"1\" parent=\"d3264577-10f0-42fe-9411-7e9df0754d1e\">\n <mxGeometry x=\"3595\" y=\"5026.542220848842\" width=\"510\" height=\"500\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"NetworkService.js\" value=\"NetworkService.js\" id=\"16731e9d-3f73-4055-9d79-5ca9be679f68\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#efdfdf\" vertex=\"1\" parent=\"02b07589-ec21-4366-b7d2-9071e8f3bad8\">\n <mxGeometry x=\"95\" y=\"70\" width=\"320\" height=\"360\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Uptime Monitor Creation: Send API Request - NetworkService.js:L119-121\" value=\"Uptime Monitor Creation: Send API Request - NetworkService.js:L119-121\" id=\"a30ac765-c546-4993-988e-8c8cfdb7532f\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"16731e9d-3f73-4055-9d79-5ca9be679f68\">\n <mxGeometry x=\"70\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Flow 1: CSV Import - Send API Request - NetworkService.js:L978-983\" value=\"Flow 1: CSV Import - Send API Request - NetworkService.js:L978-983\" id=\"5967e576-f542-4c0b-a3f4-9446ae992721\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"16731e9d-3f73-4055-9d79-5ca9be679f68\">\n <mxGeometry x=\"70\" y=\"200\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <mxCell id=\"1f6f04a9-0123-4729-b06a-8f3da6d1b58c\" value=\"Uptime Monitor
Creation: Call
Network Service\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=20;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" edge=\"1\" parent=\"d3264577-10f0-42fe-9411-7e9df0754d1e\" source=\"a81f4ae8-41fe-4d1b-95ce-86abcc67b53c\" target=\"a30ac765-c546-4993-988e-8c8cfdb7532f\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"2580\" y=\"4989.607033820288\" />\n <mxPoint x=\"2580\" y=\"4990.369748321168\" />\n <mxPoint x=\"3290\" y=\"4990.36974832117\" />\n <mxPoint x=\"3290\" y=\"5211.5422208488435\" />\n </Array>\n </mxGeometry>\n </mxCell>\n <mxCell id=\"54497b9a-4910-4df4-b016-480b9ac250a7\" value=\"Flow 1:
Submit Form
Data for
Creation\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=20;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" edge=\"1\" parent=\"d3264577-10f0-42fe-9411-7e9df0754d1e\" source=\"15486629-84b3-463a-962b-06083f69e4bf\" target=\"a07b805e-e55f-46cb-b54b-765b7813b0ca\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"3280\" y=\"4439.607033820289\" />\n <mxPoint x=\"3280\" y=\"8192.650474325575\" />\n <mxPoint x=\"3485\" y=\"8192.650474325574\" />\n <mxPoint x=\"3485\" y=\"8192.124804485014\" />\n <mxPoint x=\"3660\" y=\"8192.124804485018\" />\n <mxPoint x=\"3660\" y=\"8057.246623286176\" />\n </Array>\n </mxGeometry>\n </mxCell>\n <UserObject label=\"Routes\" value=\"Routes\" id=\"987f145b-5df6-4c30-bf1c-2a2d2b0e5cdc\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#f4e9e9\" vertex=\"1\" parent=\"d3264577-10f0-42fe-9411-7e9df0754d1e\">\n <mxGeometry x=\"175\" y=\"4690.325785083435\" width=\"510\" height=\"500.0000000000001\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"index.jsx\" value=\"index.jsx\" id=\"c4d7e7dd-75b1-44f1-a34a-6ed290a8e562\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#efdfdf\" vertex=\"1\" parent=\"987f145b-5df6-4c30-bf1c-2a2d2b0e5cdc\">\n <mxGeometry x=\"95\" y=\"70\" width=\"320\" height=\"360.00000000000006\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"View Status Page: User Navigates to URL - index.jsx:L148-152\" value=\"View Status Page: User Navigates to URL - index.jsx:L148-152\" id=\"30aaee38-f509-4e19-a917-e6d2f4bba61c\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"c4d7e7dd-75b1-44f1-a34a-6ed290a8e562\">\n <mxGeometry x=\"70\" y=\"200.00000000000003\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Flow 1: CSV Import - Navigate to Bulk Import Page - index.jsx:L88-91\" value=\"Flow 1: CSV Import - Navigate to Bulk Import Page - index.jsx:L88-91\" id=\"c4caeba8-ed9a-4cbc-9888-38cc8ca55362\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"c4d7e7dd-75b1-44f1-a34a-6ed290a8e562\">\n <mxGeometry x=\"70\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <mxCell id=\"0575bf87-5362-4988-b895-7e514148d420\" value=\"View Status
Page: Component
Triggers Data
Fetch\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=20;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" edge=\"1\" parent=\"d3264577-10f0-42fe-9411-7e9df0754d1e\" source=\"30aaee38-f509-4e19-a917-e6d2f4bba61c\" target=\"ecfb2d04-2681-4f16-af75-632f69e1a868\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"760\" y=\"5005.325785083435\" />\n <mxPoint x=\"760\" y=\"4700.621306201958\" />\n <mxPoint x=\"985\" y=\"4700.621306201958\" />\n <mxPoint x=\"985\" y=\"4700.584553505045\" />\n <mxPoint x=\"1180\" y=\"4700.584553505045\" />\n <mxPoint x=\"1180\" y=\"2459.607033820289\" />\n </Array>\n </mxGeometry>\n </mxCell>\n <mxCell id=\"e90e4943-6108-46e3-8a2c-a9a1c7361279\" value=\"Trigger Check
History Fetch\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=20;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" edge=\"1\" parent=\"d3264577-10f0-42fe-9411-7e9df0754d1e\" source=\"78a8a7c5-41d3-4453-a7f7-ac632bbef288\" target=\"4a5847d0-91a0-4b4c-8517-2f4ff9a7e8d4\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"3250\" y=\"6507.080193689383\" />\n <mxPoint x=\"3250\" y=\"8457.246623286175\" />\n </Array>\n </mxGeometry>\n </mxCell>\n <mxCell id=\"74b0dd89-9fea-4219-af1f-9571316a9d5a\" value=\"Pass Data
to UI
Components\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=20;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" edge=\"1\" parent=\"d3264577-10f0-42fe-9411-7e9df0754d1e\" source=\"ceb9cda3-968d-44aa-b223-49902adb93b4\" target=\"c996f7ca-9384-4252-b343-7bfc049d14bb\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"4390\" y=\"8327.246623286173\" />\n <mxPoint x=\"4390\" y=\"10688.865179846314\" />\n <mxPoint x=\"780\" y=\"10688.865179846314\" />\n <mxPoint x=\"780\" y=\"8549.135157943725\" />\n <mxPoint x=\"1170\" y=\"8549.135157943725\" />\n <mxPoint x=\"1170\" y=\"6096.870240113547\" />\n </Array>\n </mxGeometry>\n </mxCell>\n <mxCell id=\"c9a012bc-d53f-494f-82f2-1ee3f40ce646\" value=\"Flow 1:
CSV Import
- Render
UI\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=20;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" edge=\"1\" parent=\"d3264577-10f0-42fe-9411-7e9df0754d1e\" source=\"c4caeba8-ed9a-4cbc-9888-38cc8ca55362\" target=\"6f1948fa-e84a-4f8e-8f3b-8f24c511b3d8\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"750\" y=\"4875.325785083435\" />\n <mxPoint x=\"750\" y=\"4690.621306201958\" />\n <mxPoint x=\"985\" y=\"4690.621306201958\" />\n <mxPoint x=\"985\" y=\"4690.584553505045\" />\n <mxPoint x=\"1170\" y=\"4690.584553505045\" />\n <mxPoint x=\"1170\" y=\"5546.870240113548\" />\n </Array>\n </mxGeometry>\n </mxCell>\n <mxCell id=\"b8c0292d-afbb-4648-b484-1c27be96d52f\" value=\"Flow 1:
CSV Import
- Prepare
Form Data\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=20;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" edge=\"1\" parent=\"d3264577-10f0-42fe-9411-7e9df0754d1e\" source=\"dd2f9356-fad3-47d4-81d5-a5e038298e2b\" target=\"5967e576-f542-4c0b-a3f4-9446ae992721\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"3290\" y=\"5529.60703382029\" />\n <mxPoint x=\"3290\" y=\"5341.542220848843\" />\n </Array>\n </mxGeometry>\n </mxCell>\n <mxCell id=\"8c107d79-f796-49eb-ab88-f553dd6f9d95\" value=\"User Action:
Save Settings\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=20;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" edge=\"1\" parent=\"d3264577-10f0-42fe-9411-7e9df0754d1e\" source=\"09cb194a-0ea4-46e2-b32b-36b62fa87f40\" target=\"1b2cf182-9ee3-4218-a7ec-b74e427ccddf\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"3280\" y=\"8663.865179846309\" />\n <mxPoint x=\"3280\" y=\"8857.246623286173\" />\n </Array>\n </mxGeometry>\n </mxCell>\n <UserObject label=\"server\" value=\"server\" id=\"98af25c7-efc2-43d2-a273-c8da4e1038ad\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#fffefe\" vertex=\"1\" parent=\"1\">\n <mxGeometry x=\"5345\" y=\"70\" width=\"9275\" height=\"10756.873756414825\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"src\" value=\"src\" id=\"35864a2c-7bd0-4428-84fc-c0aa90c7f1be\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#f9f3f3\" vertex=\"1\" parent=\"98af25c7-efc2-43d2-a273-c8da4e1038ad\">\n <mxGeometry x=\"175\" y=\"70\" width=\"9005\" height=\"10616.873756414825\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"routes\" value=\"routes\" id=\"ffaaf471-ac3c-4ea3-a5a9-d5255169e54b\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#f4e9e9\" vertex=\"1\" parent=\"35864a2c-7bd0-4428-84fc-c0aa90c7f1be\">\n <mxGeometry x=\"215\" y=\"783\" width=\"1030\" height=\"1984.0802430260385\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"v1\" value=\"v1\" id=\"d3375a20-2776-4771-b806-649bbeb541bd\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#efdfdf\" vertex=\"1\" parent=\"ffaaf471-ac3c-4ea3-a5a9-d5255169e54b\">\n <mxGeometry x=\"175\" y=\"70.00000000000006\" width=\"680\" height=\"1844.0802430260385\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"monitorRoute.js\" value=\"monitorRoute.js\" id=\"10611636-ec73-4a26-87a5-654ae64a4843\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#ead5d5\" vertex=\"1\" parent=\"d3375a20-2776-4771-b806-649bbeb541bd\">\n <mxGeometry x=\"185\" y=\"600.0000000000001\" width=\"320\" height=\"360.24710152500006\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Flow 1: CSV Import - Server Receives Request - monitorRoute.js:L46\" value=\"Flow 1: CSV Import - Server Receives Request - monitorRoute.js:L46\" id=\"c1ac3c26-996a-43ef-9c34-4c2776188784\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"10611636-ec73-4a26-87a5-654ae64a4843\">\n <mxGeometry x=\"70\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Flow 2: CSV Export - Initiate Export - monitorRoute.js:L45\" value=\"Flow 2: CSV Export - Initiate Export - monitorRoute.js:L45\" id=\"26d76516-fd7e-4ae8-956a-d077de4257fa\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"10611636-ec73-4a26-87a5-654ae64a4843\">\n <mxGeometry x=\"70\" y=\"200.24710152500003\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"notificationRoute.js\" value=\"notificationRoute.js\" id=\"96250197-23af-4059-9904-fd6751f70ad5\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#ead5d5\" vertex=\"1\" parent=\"d3375a20-2776-4771-b806-649bbeb541bd\">\n <mxGeometry x=\"185\" y=\"1414.0802430260383\" width=\"320\" height=\"360\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Flow 1: Backend Route Handling - notificationRoute.js:L10\" value=\"Flow 1: Backend Route Handling - notificationRoute.js:L10\" id=\"d0a4737f-715f-4f50-b6d5-5e4b31f86f93\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"96250197-23af-4059-9904-fd6751f70ad5\">\n <mxGeometry x=\"70\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Flow 1: Backend Receives Test Request - notificationRoute.js:L13\" value=\"Flow 1: Backend Receives Test Request - notificationRoute.js:L13\" id=\"29c2c56e-9dc0-4304-bfbf-e0c0f8915a39\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"96250197-23af-4059-9904-fd6751f70ad5\">\n <mxGeometry x=\"70\" y=\"200\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"statusPageRoute.js\" value=\"statusPageRoute.js\" id=\"773e1065-b0a5-46a9-b0cc-6b963f69f5cc\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#ead5d5\" vertex=\"1\" parent=\"d3375a20-2776-4771-b806-649bbeb541bd\">\n <mxGeometry x=\"185\" y=\"70\" width=\"320\" height=\"360\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Create Status Page: Backend Route Handling - statusPageRoute.js:L14\" value=\"Create Status Page: Backend Route Handling - statusPageRoute.js:L14\" id=\"3efddcad-588f-4492-9808-b0c81c823c96\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"773e1065-b0a5-46a9-b0cc-6b963f69f5cc\">\n <mxGeometry x=\"70\" y=\"200\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"View Status Page: Backend Route Handling - statusPageRoute.js:L16\" value=\"View Status Page: Backend Route Handling - statusPageRoute.js:L16\" id=\"2e26cd2f-1413-4c16-8e63-ea7808ab6c52\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"773e1065-b0a5-46a9-b0cc-6b963f69f5cc\">\n <mxGeometry x=\"70\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"checkRoute.js\" value=\"checkRoute.js\" id=\"d18dbe1d-2f2c-4336-bd21-47c1670f7bab\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#ead5d5\" vertex=\"1\" parent=\"d3375a20-2776-4771-b806-649bbeb541bd\">\n <mxGeometry x=\"185\" y=\"1135.7525647938676\" width=\"320\" height=\"230\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Route Request to Controller - checkRoute.js:L19\" value=\"Route Request to Controller - checkRoute.js:L19\" id=\"cdd090be-0b62-45b4-baa0-fec01fc3ffd1\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"d18dbe1d-2f2c-4336-bd21-47c1670f7bab\">\n <mxGeometry x=\"70\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"maintenanceWindowRoute.js\" value=\"maintenanceWindowRoute.js\" id=\"5f21f109-1967-416f-a649-9b48e78b90f6\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"d3375a20-2776-4771-b806-649bbeb541bd\">\n <mxGeometry x=\"255\" y=\"470.0000000000001\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"inviteRoute.js\" value=\"inviteRoute.js\" id=\"9edafb8a-3661-4a7e-8510-a47f3cbc7564\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=16;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"d3375a20-2776-4771-b806-649bbeb541bd\">\n <mxGeometry x=\"255\" y=\"1000.2471015250001\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"controllers\" value=\"controllers\" id=\"478e649c-1d1b-41d2-9b7b-6927e1dec7e1\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#f4e9e9\" vertex=\"1\" parent=\"35864a2c-7bd0-4428-84fc-c0aa90c7f1be\">\n <mxGeometry x=\"1465\" y=\"3609.569505991416\" width=\"1470\" height=\"3164.7713082929035\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"v1\" value=\"v1\" id=\"fc591f7a-d4ac-4565-949d-a87a58a79bbc\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#efdfdf\" vertex=\"1\" parent=\"478e649c-1d1b-41d2-9b7b-6927e1dec7e1\">\n <mxGeometry x=\"175\" y=\"70\" width=\"1120\" height=\"3024.7713082929035\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"monitorController.js\" value=\"monitorController.js\" id=\"341f2784-67ee-4477-9445-a8c240ee6261\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#ead5d5\" vertex=\"1\" parent=\"fc591f7a-d4ac-4565-949d-a87a58a79bbc\">\n <mxGeometry x=\"225\" y=\"600\" width=\"720\" height=\"750\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Uptime Monitor Creation: Controller to Service - monitorController.js:L195\" value=\"Uptime Monitor Creation: Controller to Service - monitorController.js:L195\" id=\"f0409948-75dc-457f-a02d-6b9774258e48\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"341f2784-67ee-4477-9445-a8c240ee6261\">\n <mxGeometry x=\"150\" y=\"200\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Flow 1: CSV Import - Controller Processes Data - monitorController.js:L228-232\" value=\"Flow 1: CSV Import - Controller Processes Data - monitorController.js:L228-232\" id=\"0e520a6d-34bf-467b-a894-e73979364478\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"341f2784-67ee-4477-9445-a8c240ee6261\">\n <mxGeometry x=\"150\" y=\"329.99999999999994\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Flow 1: CSV Import - Send Success Response - monitorController.js:L232-235\" value=\"Flow 1: CSV Import - Send Success Response - monitorController.js:L232-235\" id=\"72b55fa1-d944-4e46-ac98-f6a6cb201afa\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"341f2784-67ee-4477-9445-a8c240ee6261\">\n <mxGeometry x=\"150\" y=\"70.00000000000001\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Flow 2: CSV Export - Controller Handles Request - monitorController.js:L427-434\" value=\"Flow 2: CSV Export - Controller Handles Request - monitorController.js:L427-434\" id=\"a3106388-6a3d-4b68-a3fc-3761a0d54f98\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"341f2784-67ee-4477-9445-a8c240ee6261\">\n <mxGeometry x=\"150\" y=\"460.00000000000006\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Flow 2: CSV Export - Send File Response - monitorController.js:L434-440\" value=\"Flow 2: CSV Export - Send File Response - monitorController.js:L434-440\" id=\"f151f89d-6399-48f0-aecd-5eb1572b48cc\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"341f2784-67ee-4477-9445-a8c240ee6261\">\n <mxGeometry x=\"150\" y=\"590\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Flow 2: CSV Export - Browser Prompts Download - monitorController.js:L434-440\" value=\"Flow 2: CSV Export - Browser Prompts Download - monitorController.js:L434-440\" id=\"d8877474-7203-484f-bd47-fc69e3c7c482\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"341f2784-67ee-4477-9445-a8c240ee6261\">\n <mxGeometry x=\"470\" y=\"590\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <mxCell id=\"3dfb432a-2ce4-4f92-98ce-5d114b5f7f03\" value=\"Flow 2:
CSV Export
- Transmit
File to
Client\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=11;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" edge=\"1\" parent=\"341f2784-67ee-4477-9445-a8c240ee6261\" source=\"f151f89d-6399-48f0-aecd-5eb1572b48cc\" target=\"d8877474-7203-484f-bd47-fc69e3c7c482\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\" />\n </mxGeometry>\n </mxCell>\n <UserObject label=\"notificationController.js\" value=\"notificationController.js\" id=\"8e5941e1-e577-455f-bbf2-83a418ad5908\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"fc591f7a-d4ac-4565-949d-a87a58a79bbc\">\n <mxGeometry x=\"495\" y=\"469.9999999999999\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"statusPageController.js\" value=\"statusPageController.js\" id=\"17a4f435-5a8e-4433-84a6-9ac17362709a\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#ead5d5\" vertex=\"1\" parent=\"fc591f7a-d4ac-4565-949d-a87a58a79bbc\">\n <mxGeometry x=\"345\" y=\"1920\" width=\"480\" height=\"620\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Create Status Page: Controller Logic - statusPageController.js:L18-24\" value=\"Create Status Page: Controller Logic - statusPageController.js:L18-24\" id=\"f15ef77e-380f-4768-98cb-7f0dd4113841\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"17a4f435-5a8e-4433-84a6-9ac17362709a\">\n <mxGeometry x=\"150\" y=\"199.99999999999997\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Create Status Page: Controller Sends Success Response - statusPageController.js:L25-28\" value=\"Create Status Page: Controller Sends Success Response - statusPageController.js:L25-28\" id=\"058ded1f-83ce-40a7-a99d-d178c81fe557\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"17a4f435-5a8e-4433-84a6-9ac17362709a\">\n <mxGeometry x=\"150\" y=\"329.9999999999999\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"View Status Page: Controller Logic - statusPageController.js:L75-78\" value=\"View Status Page: Controller Logic - statusPageController.js:L75-78\" id=\"9f217674-4cd7-4ef8-b088-d5620042a7ba\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"17a4f435-5a8e-4433-84a6-9ac17362709a\">\n <mxGeometry x=\"150\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"View Status Page: Controller Sends Success Response - statusPageController.js:L79-82\" value=\"View Status Page: Controller Sends Success Response - statusPageController.js:L79-82\" id=\"d76e70e0-41f9-46cc-b775-b2027c5a0d5b\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"17a4f435-5a8e-4433-84a6-9ac17362709a\">\n <mxGeometry x=\"150\" y=\"460\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"checkController.js\" value=\"checkController.js\" id=\"d983e54f-2fbe-496a-932d-a827e1124804\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#ead5d5\" vertex=\"1\" parent=\"fc591f7a-d4ac-4565-949d-a87a58a79bbc\">\n <mxGeometry x=\"425\" y=\"70\" width=\"320\" height=\"230\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Return Check Data - checkController.js:L87-90\" value=\"Return Check Data - checkController.js:L87-90\" id=\"14df9f01-1358-442d-96f5-eab9a4c4abbf\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"d983e54f-2fbe-496a-932d-a827e1124804\">\n <mxGeometry x=\"70\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"maintenanceWindowController.js\" value=\"maintenanceWindowController.js\" id=\"a0cae18c-3c0e-40d3-ab03-eef7eace65d6\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#ead5d5\" vertex=\"1\" parent=\"fc591f7a-d4ac-4565-949d-a87a58a79bbc\">\n <mxGeometry x=\"425\" y=\"1519.9999999999998\" width=\"320\" height=\"360\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Flow: Create Maintenance Window - Controller Logic - maintenanceWindowController.js:L27-41\" value=\"Flow: Create Maintenance Window - Controller Logic - maintenanceWindowController.js:L27-41\" id=\"0fae6e75-38ea-444d-a1bf-0f820ba443b9\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"a0cae18c-3c0e-40d3-ab03-eef7eace65d6\">\n <mxGeometry x=\"70\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Flow: View Maintenance Windows - Controller and Service - maintenanceWindowController.js:L75\" value=\"Flow: View Maintenance Windows - Controller and Service - maintenanceWindowController.js:L75\" id=\"c35a065c-2808-402c-877e-9055d956ce0d\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"a0cae18c-3c0e-40d3-ab03-eef7eace65d6\">\n <mxGeometry x=\"70\" y=\"200\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"inviteController.js\" value=\"inviteController.js\" id=\"6a186805-9d50-4bc3-9d56-e627a7ec2eb8\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=14;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"fc591f7a-d4ac-4565-949d-a87a58a79bbc\">\n <mxGeometry x=\"495\" y=\"339.9999999999999\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"settingsController.js\" value=\"settingsController.js\" id=\"a1fea5b0-fb7c-4189-9484-9d3312660767\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#ead5d5\" vertex=\"1\" parent=\"fc591f7a-d4ac-4565-949d-a87a58a79bbc\">\n <mxGeometry x=\"425\" y=\"2594.7713082929035\" width=\"320\" height=\"360\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Backend: Retrieve Settings from Database - settingsController.js:L40-49\" value=\"Backend: Retrieve Settings from Database - settingsController.js:L40-49\" id=\"83596bd1-dfca-4196-b52e-955f6824fafb\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"a1fea5b0-fb7c-4189-9484-9d3312660767\">\n <mxGeometry x=\"70\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Backend: Persist Updated Settings - settingsController.js:L54-64\" value=\"Backend: Persist Updated Settings - settingsController.js:L54-64\" id=\"cce3b9c8-f3b7-434b-b3c6-d8d164714f86\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"a1fea5b0-fb7c-4189-9484-9d3312660767\">\n <mxGeometry x=\"70\" y=\"200\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"diagnosticController.js\" value=\"diagnosticController.js\" id=\"5882419e-8a92-4edd-a71a-1252983f9af7\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"fc591f7a-d4ac-4565-949d-a87a58a79bbc\">\n <mxGeometry x=\"495\" y=\"1390\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"service\" value=\"service\" id=\"99e9b746-7809-41f4-a433-1de7cc90574b\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#f4e9e9\" vertex=\"1\" parent=\"35864a2c-7bd0-4428-84fc-c0aa90c7f1be\">\n <mxGeometry x=\"4835\" y=\"3072.0802430260387\" width=\"3965\" height=\"3896.797033318495\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"v1\" value=\"v1\" id=\"bbbe53d6-f595-498a-ae45-e08611f39c3d\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#efdfdf\" vertex=\"1\" parent=\"99e9b746-7809-41f4-a433-1de7cc90574b\">\n <mxGeometry x=\"175\" y=\"890.0000000000002\" width=\"3615\" height=\"2936.797033318495\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"business\" value=\"business\" id=\"87d3b101-9443-4ed4-9c4f-f759d41677eb\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#ead5d5\" vertex=\"1\" parent=\"bbbe53d6-f595-498a-ae45-e08611f39c3d\">\n <mxGeometry x=\"1231.1538461538462\" y=\"70\" width=\"1000\" height=\"1713.9996160245596\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"monitorService.js\" value=\"monitorService.js\" id=\"b4e479df-9b21-4430-9383-84831f503c2e\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#e5cbcb\" vertex=\"1\" parent=\"87d3b101-9443-4ed4-9c4f-f759d41677eb\">\n <mxGeometry x=\"265\" y=\"880.7789018663125\" width=\"480\" height=\"490\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Flow 1: CSV Import - Service Parses CSV - monitorService.js:L85-134\" value=\"Flow 1: CSV Import - Service Parses CSV - monitorService.js:L85-134\" id=\"6139e487-1dd5-405a-ba7d-ededec4b282e\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"b4e479df-9b21-4430-9383-84831f503c2e\">\n <mxGeometry x=\"150\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Flow 1: CSV Import - Enqueue Monitor Jobs - monitorService.js:L128-132\" value=\"Flow 1: CSV Import - Enqueue Monitor Jobs - monitorService.js:L128-132\" id=\"1e1d975f-7f0f-4132-bd71-2563b35e99b3\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"b4e479df-9b21-4430-9383-84831f503c2e\">\n <mxGeometry x=\"150\" y=\"330\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Flow 2: CSV Export - Generate CSV - monitorService.js:L245-266\" value=\"Flow 2: CSV Export - Generate CSV - monitorService.js:L245-266\" id=\"ab9cb862-0ac7-45a3-9888-f64e87bdda54\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"b4e479df-9b21-4430-9383-84831f503c2e\">\n <mxGeometry x=\"150\" y=\"200\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"checkService.js\" value=\"checkService.js\" id=\"f90db867-e1e7-4554-b446-fa78fc6a8578\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#e5cbcb\" vertex=\"1\" parent=\"87d3b101-9443-4ed4-9c4f-f759d41677eb\">\n <mxGeometry x=\"345\" y=\"610.7789018663126\" width=\"320\" height=\"230\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Fetch Checks from Database - checkService.js:L36-45\" value=\"Fetch Checks from Database - checkService.js:L36-45\" id=\"499b46a2-f2a2-4ccd-aecd-012eade2bd23\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"f90db867-e1e7-4554-b446-fa78fc6a8578\">\n <mxGeometry x=\"70\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"maintenanceWindowService.js\" value=\"maintenanceWindowService.js\" id=\"26b8daff-aa48-4baa-9d6c-05f771bf0990\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#e5cbcb\" vertex=\"1\" parent=\"87d3b101-9443-4ed4-9c4f-f759d41677eb\">\n <mxGeometry x=\"345\" y=\"1413.9996160245596\" width=\"320\" height=\"230\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Flow: Create Maintenance Window - Business Logic Execution - maintenanceWindowService.js:L18-39\" value=\"Flow: Create Maintenance Window - Business Logic Execution - maintenanceWindowService.js:L18-39\" id=\"560d268b-ef0f-4cd2-bcfe-9dc0a0e2ce6f\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"26b8daff-aa48-4baa-9d6c-05f771bf0990\">\n <mxGeometry x=\"70\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"inviteService.js\" value=\"inviteService.js\" id=\"570278b7-9b72-4299-9fd9-46b253b48e9b\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#e5cbcb\" vertex=\"1\" parent=\"87d3b101-9443-4ed4-9c4f-f759d41677eb\">\n <mxGeometry x=\"185\" y=\"70\" width=\"640\" height=\"230.7789018663125\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Server: Process Invitation in Service Layer - inviteService.js:L24-28\" value=\"Server: Process Invitation in Service Layer - inviteService.js:L24-28\" id=\"ae858158-8db6-4917-8fda-0966a953f6ed\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"570278b7-9b72-4299-9fd9-46b253b48e9b\">\n <mxGeometry x=\"70\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Server: Dispatch Invitation Email - inviteService.js:L26-28\" value=\"Server: Dispatch Invitation Email - inviteService.js:L26-28\" id=\"a7be2d0b-0227-4228-a0a6-074f7324fd89\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"570278b7-9b72-4299-9fd9-46b253b48e9b\">\n <mxGeometry x=\"390\" y=\"70.77890186631251\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <mxCell id=\"bdd52e6f-ddf7-4966-b3af-957f9553082f\" value=\"Database Query:
Create and
Store Invite
Token\" style=\"edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;sketch=0;jumpStyle=arc;jumpSize=17;orthogonalLoop=1;jettySize=auto;html=0;shadow=0;labelBackgroundColor=none;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontSize=11;fontColor=#5C5C5C;endArrow=block;endFill=1;endSize=5;sourcePerimeterSpacing=0;targetPerimeterSpacing=0;strokeColor=#A1A1A1;strokeWidth=2;arcSize=50;labelPosition=center;verticalLabelPosition=top;align=center;verticalAlign=bottom;container=1;\" edge=\"1\" parent=\"570278b7-9b72-4299-9fd9-46b253b48e9b\" source=\"ae858158-8db6-4917-8fda-0966a953f6ed\" target=\"a7be2d0b-0227-4228-a0a6-074f7324fd89\">\n <mxGeometry relative=\"1\" as=\"geometry\">\n <Array as=\"points\">\n <mxPoint x=\"290\" y=\"115\" />\n <mxPoint x=\"290\" y=\"115.77890186631251\" />\n </Array>\n </mxGeometry>\n </mxCell>\n <UserObject label=\"diagnosticService.js\" value=\"diagnosticService.js\" id=\"643b26c1-3bfb-4c41-8179-96dfc237d99e\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#e5cbcb\" vertex=\"1\" parent=\"87d3b101-9443-4ed4-9c4f-f759d41677eb\">\n <mxGeometry x=\"185\" y=\"340.7789018663125\" width=\"320\" height=\"230\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Backend: Gather System Statistics - diagnosticService.js:L39-95\" value=\"Backend: Gather System Statistics - diagnosticService.js:L39-95\" id=\"09f07e80-185e-4547-aab4-edaf8ae7501e\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"643b26c1-3bfb-4c41-8179-96dfc237d99e\">\n <mxGeometry x=\"70\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"infrastructure\" value=\"infrastructure\" id=\"1670815f-860d-4ea4-92e1-b238a799d3dc\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#ead5d5\" vertex=\"1\" parent=\"bbbe53d6-f595-498a-ae45-e08611f39c3d\">\n <mxGeometry x=\"195\" y=\"1845.4635994752946\" width=\"3245\" height=\"1021.3334338432\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"SuperSimpleQueue\" value=\"SuperSimpleQueue\" id=\"dda70a36-2d1d-4e46-8bcc-52d0d474bf7b\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#e5cbcb\" vertex=\"1\" parent=\"1670815f-860d-4ea4-92e1-b238a799d3dc\">\n <mxGeometry x=\"95\" y=\"121.00000000000001\" width=\"1525\" height=\"770.3334338432\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"SuperSimpleQueue.js\" value=\"SuperSimpleQueue.js\" id=\"d9c0127e-31aa-4509-b5c9-f7017d10d69a\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#e0c1c1\" vertex=\"1\" parent=\"dda70a36-2d1d-4e46-8bcc-52d0d474bf7b\">\n <mxGeometry x=\"175\" y=\"70\" width=\"320\" height=\"230\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Uptime Monitor Creation: Schedule Job - SuperSimpleQueue.js:L50-57\" value=\"Uptime Monitor Creation: Schedule Job - SuperSimpleQueue.js:L50-57\" id=\"51e8db5f-2fdd-4ddc-9605-43981db9d940\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"d9c0127e-31aa-4509-b5c9-f7017d10d69a\">\n <mxGeometry x=\"70\" y=\"70\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"SuperSimpleQueueHelper.js\" value=\"SuperSimpleQueueHelper.js\" id=\"04c12e9a-e025-457c-a634-5f7472a42985\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=9;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;align=left;verticalAlign=bottom;spacing=0;spacingTop=-14;spacingLeft=15;arcSize=4;labelPosition=center;verticalLabelPosition=top;;fillColor=#e0c1c1\" vertex=\"1\" parent=\"dda70a36-2d1d-4e46-8bcc-52d0d474bf7b\">\n <mxGeometry x=\"150\" y=\"340.33343384320005\" width=\"1280\" height=\"360\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Service Monitoring: Job Execution - SuperSimpleQueueHelper.js:L27-73\" value=\"Service Monitoring: Job Execution - SuperSimpleQueueHelper.js:L27-73\" id=\"18c13391-0cf7-4303-8180-0a40cfd64b58\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"04c12e9a-e025-457c-a634-5f7472a42985\">\n <mxGeometry x=\"1030\" y=\"200\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Flow: Monitor Suppression - Job Execution Start - SuperSimpleQueueHelper.js:L30-45\" value=\"Flow: Monitor Suppression - Job Execution Start - SuperSimpleQueueHelper.js:L30-45\" id=\"23630a1f-7452-4373-a864-7ec7821137f2\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"04c12e9a-e025-457c-a634-5f7472a42985\">\n <mxGeometry x=\"70\" y=\"93.00716143795759\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Flow: Monitor Suppression - Fetching Maintenance Windows - SuperSimpleQueueHelper.js:L80-83\" value=\"Flow: Monitor Suppression - Fetching Maintenance Windows - SuperSimpleQueueHelper.js:L80-83\" id=\"fc78b5b6-7fad-4f8f-a5a3-c7c38931daba\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"04c12e9a-e025-457c-a634-5f7472a42985\">\n <mxGeometry x=\"390\" y=\"93.00716143795759\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Flow: Monitor Suppression - Time Evaluation - SuperSimpleQueueHelper.js:L85-113\" value=\"Flow: Monitor Suppression - Time Evaluation - SuperSimpleQueueHelper.js:L85-113\" id=\"0fe32416-db43-49b9-9438-3796ba1a0add\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"04c12e9a-e025-457c-a634-5f7472a42985\">\n <mxGeometry x=\"710\" y=\"93.00716143795759\" width=\"180\" height=\"90\" as=\"geometry\" />\n </mxCell>\n </UserObject>\n <UserObject label=\"Flow: Monitor Suppression - Conditional Job Termination - SuperSimpleQueueHelper.js:L37-44\" value=\"Flow: Monitor Suppression - Conditional Job Termination - SuperSimpleQueueHelper.js:L37-44\" id=\"01e042c3-40b4-416a-8d9e-6d6fd323d60b\">\n <mxCell style=\"rounded=1;whiteSpace=wrap;html=1;container=1;glass=0;comic=0;fontSize=12;fontColor=#615B5B;strokeWidth=0.7;strokeColor=#999190;fontFamily=Poppins;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DPoppins;fontStyle=0;\" vertex=\"1\" parent=\"04c12e9a-e025-45
gitextract_otmdzcso/
├── .coderabbit.yml
├── .github/
│ ├── CODEOWNERS
│ ├── FUNDING.yml
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.md
│ │ └── feature_request.md
│ ├── pull_request_template.md
│ ├── scripts/
│ │ ├── download-translations.js
│ │ └── upload-translations.js
│ └── workflows/
│ ├── README.md
│ ├── check-build.yml
│ ├── check-format.yml
│ ├── deploy-images-on-release.yml
│ ├── deploy-images.yml
│ ├── poeditor-sync.yml
│ ├── production-deploy.yml
│ ├── staging-deploy.yml
│ └── upload-poeditor.yml
├── .gitignore
├── .husky/
│ └── pre-commit
├── CLAUDE.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── Checkmate.CodeCanvas
├── LICENSE
├── PULLREQUESTS.md
├── README.es.md
├── README.md
├── SECURITY.md
├── charts/
│ └── helm/
│ └── checkmate/
│ ├── .helmignore
│ ├── Chart.yaml
│ ├── INSTALLATION.md
│ ├── templates/
│ │ ├── client-deployment.yaml
│ │ ├── client-ingress.yaml
│ │ ├── client-service.yaml
│ │ ├── mongodb-service.yaml
│ │ ├── mongodb-statefulsets.yaml
│ │ ├── prechecks.yaml
│ │ ├── redis-service.yaml
│ │ ├── redis-statefulsets.yaml
│ │ ├── secrets.yaml
│ │ ├── server-deployment.yaml
│ │ ├── server-ingress.yaml
│ │ ├── server-nginx-cm.yaml
│ │ └── server-service.yaml
│ └── values.yaml
├── client/
│ ├── .coderrabbit.yaml
│ ├── .dockerignore
│ ├── .eslintrc.cjs
│ ├── .gitignore
│ ├── .prettierrc
│ ├── README.md
│ ├── env.sh
│ ├── index.html
│ ├── package.json
│ ├── public/
│ │ ├── bulk_import_monitors_sample.csv
│ │ └── bulk_import_monitors_template.csv
│ ├── renovate.json
│ ├── src/
│ │ ├── App.tsx
│ │ ├── Components/
│ │ │ ├── LanguageSelector.jsx
│ │ │ ├── actions-menu/
│ │ │ │ └── index.tsx
│ │ │ ├── common/
│ │ │ │ ├── charts/
│ │ │ │ │ ├── HeatmapResponseTime.tsx
│ │ │ │ │ ├── HeatmapResponseTimeTooltip.tsx
│ │ │ │ │ └── HistogramResponseTime.tsx
│ │ │ │ ├── controls/
│ │ │ │ │ ├── HeaderCreate.tsx
│ │ │ │ │ └── HeaderTimeRange.tsx
│ │ │ │ └── index.ts
│ │ │ ├── design-elements/
│ │ │ │ ├── Avatar.tsx
│ │ │ │ ├── BaseBox.tsx
│ │ │ │ ├── BaseChart.tsx
│ │ │ │ ├── BasePage.tsx
│ │ │ │ ├── Breadcrumb.tsx
│ │ │ │ ├── BulletPointCheck.tsx
│ │ │ │ ├── Dot.tsx
│ │ │ │ ├── Fallback.tsx
│ │ │ │ ├── Gauge.tsx
│ │ │ │ ├── Icon.tsx
│ │ │ │ ├── MonitorStatus.tsx
│ │ │ │ ├── OfflineBanner.tsx
│ │ │ │ ├── PulseDot.tsx
│ │ │ │ ├── SkeletonCard.tsx
│ │ │ │ ├── SplitBox.tsx
│ │ │ │ ├── StatBox.tsx
│ │ │ │ ├── StatusBox.tsx
│ │ │ │ ├── StatusLabel.tsx
│ │ │ │ ├── Table.tsx
│ │ │ │ ├── Tabs.tsx
│ │ │ │ ├── TextLink.tsx
│ │ │ │ ├── Tooltip.tsx
│ │ │ │ └── index.tsx
│ │ │ ├── i18nLoader/
│ │ │ │ └── index.tsx
│ │ │ ├── inputs/
│ │ │ │ ├── AutoComplete.tsx
│ │ │ │ ├── Button.tsx
│ │ │ │ ├── Checkbox.tsx
│ │ │ │ ├── ColorPicker.tsx
│ │ │ │ ├── DatePicker.tsx
│ │ │ │ ├── Dialog.tsx
│ │ │ │ ├── FieldLabel.tsx
│ │ │ │ ├── ImageUpload.tsx
│ │ │ │ ├── LanguageSelector.tsx
│ │ │ │ ├── Radio.tsx
│ │ │ │ ├── Select.tsx
│ │ │ │ ├── Slider.tsx
│ │ │ │ ├── Switch.tsx
│ │ │ │ ├── SwitchTheme.tsx
│ │ │ │ ├── TextInput.tsx
│ │ │ │ ├── TimePicker.tsx
│ │ │ │ ├── ToggleButton.tsx
│ │ │ │ └── index.tsx
│ │ │ ├── layout/
│ │ │ │ ├── AppLayout.tsx
│ │ │ │ └── RootLayout.tsx
│ │ │ ├── monitors/
│ │ │ │ ├── ControlsFilter.tsx
│ │ │ │ ├── GeoChecksMap.tsx
│ │ │ │ ├── HeaderGeoTabs.tsx
│ │ │ │ ├── HeaderMonitorControls.tsx
│ │ │ │ ├── HeaderMonitorsSummary.tsx
│ │ │ │ ├── MonitorStatBoxes.tsx
│ │ │ │ ├── charts/
│ │ │ │ │ ├── HistogramDetails.tsx
│ │ │ │ │ ├── HistogramInfrastructure.tsx
│ │ │ │ │ ├── HistogramPageSpeed.tsx
│ │ │ │ │ ├── HistogramPageSpeedDetails.tsx
│ │ │ │ │ ├── HistogramPageSpeedDetailsTooltip.tsx
│ │ │ │ │ ├── HistogramPageSpeedTooltip.tsx
│ │ │ │ │ ├── HistogramStatus.tsx
│ │ │ │ │ ├── PiePageSpeed.tsx
│ │ │ │ │ ├── PiePageSpeedLegend.tsx
│ │ │ │ │ └── RadialAvgResponse.tsx
│ │ │ │ └── index.tsx
│ │ │ ├── routing/
│ │ │ │ └── RouteProtected.tsx
│ │ │ └── sidebar/
│ │ │ ├── Authfooter.tsx
│ │ │ ├── Logo.tsx
│ │ │ ├── Menu.tsx
│ │ │ ├── NavItem.tsx
│ │ │ ├── StarPrompt.tsx
│ │ │ └── index.tsx
│ │ ├── Features/
│ │ │ ├── Auth/
│ │ │ │ └── authSlice.ts
│ │ │ └── UI/
│ │ │ └── uiSlice.ts
│ │ ├── Hooks/
│ │ │ ├── UseApi.ts
│ │ │ ├── UseToast.ts
│ │ │ ├── useAddTeamMemberForm.ts
│ │ │ ├── useDebounce.ts
│ │ │ ├── useEditUserForm.ts
│ │ │ ├── useInviteForm.ts
│ │ │ ├── useIsAdmin.ts
│ │ │ ├── useLoginForm.ts
│ │ │ ├── useMaintenanceWindowForm.ts
│ │ │ ├── useMonitorForm.ts
│ │ │ ├── useNotificationForm.ts
│ │ │ ├── usePasswordForm.ts
│ │ │ ├── useProfileForm.ts
│ │ │ ├── useRecoveryForm.ts
│ │ │ ├── useRegisterForm.ts
│ │ │ ├── useSetNewPasswordForm.ts
│ │ │ ├── useSettingsForm.ts
│ │ │ ├── useSidebar.ts
│ │ │ └── useStatusPageForm.ts
│ │ ├── Pages/
│ │ │ ├── Account/
│ │ │ │ ├── EditUser/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── TabPassword.tsx
│ │ │ │ ├── TabProfile.tsx
│ │ │ │ ├── TabTeam.tsx
│ │ │ │ ├── components/
│ │ │ │ │ ├── AddTeamMemberDialog.tsx
│ │ │ │ │ ├── HeaderTeamControls.tsx
│ │ │ │ │ ├── InviteTeamMemberDialog.tsx
│ │ │ │ │ └── TeamTable.tsx
│ │ │ │ └── index.tsx
│ │ │ ├── Auth/
│ │ │ │ ├── Login/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── Recovery/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── Register/
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── SetNewPassword/
│ │ │ │ │ └── index.tsx
│ │ │ │ └── components/
│ │ │ │ └── HeaderAuthControls.tsx
│ │ │ ├── Checks/
│ │ │ │ ├── Components/
│ │ │ │ │ └── ChecksTable.tsx
│ │ │ │ └── index.tsx
│ │ │ ├── CreateMonitor/
│ │ │ │ └── index.tsx
│ │ │ ├── Incidents/
│ │ │ │ ├── Components/
│ │ │ │ │ ├── CardDetails.tsx
│ │ │ │ │ ├── CardSummary.tsx
│ │ │ │ │ ├── ControlsIncidentFilter.tsx
│ │ │ │ │ ├── DialogIncidentDetails.tsx
│ │ │ │ │ ├── DialogResolution.tsx
│ │ │ │ │ └── IncidentTable.tsx
│ │ │ │ ├── index.tsx
│ │ │ │ └── utils.ts
│ │ │ ├── Infrastructure/
│ │ │ │ ├── Details/
│ │ │ │ │ ├── Components/
│ │ │ │ │ │ ├── Charts.tsx
│ │ │ │ │ │ ├── ChartsNetwork.tsx
│ │ │ │ │ │ ├── Gauges.tsx
│ │ │ │ │ │ ├── StatusBoxes.tsx
│ │ │ │ │ │ ├── TabNetwork.tsx
│ │ │ │ │ │ └── TabOverview.tsx
│ │ │ │ │ └── index.tsx
│ │ │ │ └── Monitors/
│ │ │ │ ├── Components/
│ │ │ │ │ └── MonitorsTable.tsx
│ │ │ │ └── index.tsx
│ │ │ ├── Logs/
│ │ │ │ ├── TabDiagnostics.tsx
│ │ │ │ ├── TabLogs.tsx
│ │ │ │ ├── TabQueue.tsx
│ │ │ │ ├── components/
│ │ │ │ │ ├── Metrics.tsx
│ │ │ │ │ ├── StatGauges.tsx
│ │ │ │ │ ├── Stats.tsx
│ │ │ │ │ ├── TableJobs.tsx
│ │ │ │ │ └── TableLogs.tsx
│ │ │ │ └── index.tsx
│ │ │ ├── Maintenance/
│ │ │ │ ├── MaintenanceWindowTable.tsx
│ │ │ │ ├── create/
│ │ │ │ │ └── index.tsx
│ │ │ │ └── index.tsx
│ │ │ ├── NotFound/
│ │ │ │ └── index.tsx
│ │ │ ├── Notifications/
│ │ │ │ ├── components/
│ │ │ │ │ └── NotificationsTable.tsx
│ │ │ │ ├── create/
│ │ │ │ │ └── index.tsx
│ │ │ │ └── index.tsx
│ │ │ ├── PageSpeed/
│ │ │ │ ├── Details/
│ │ │ │ │ └── index.tsx
│ │ │ │ └── Monitors/
│ │ │ │ ├── Components/
│ │ │ │ │ └── PageSpeedMonitorsTable.tsx
│ │ │ │ └── index.tsx
│ │ │ ├── Settings/
│ │ │ │ ├── DummyChart.tsx
│ │ │ │ └── index.tsx
│ │ │ ├── StatusPage/
│ │ │ │ ├── Create/
│ │ │ │ │ ├── Components/
│ │ │ │ │ │ └── HeaderConfigStatusControls.tsx
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── Status/
│ │ │ │ │ ├── Components/
│ │ │ │ │ │ ├── HeaderStatusPageControls.tsx
│ │ │ │ │ │ ├── InfrastructureMetrics.tsx
│ │ │ │ │ │ ├── MonitorsList.tsx
│ │ │ │ │ │ └── StatusBar.tsx
│ │ │ │ │ └── index.tsx
│ │ │ │ └── StatusPages/
│ │ │ │ ├── Components/
│ │ │ │ │ └── StatusPagesTable.tsx
│ │ │ │ └── index.tsx
│ │ │ └── Uptime/
│ │ │ ├── Details/
│ │ │ │ ├── Components/
│ │ │ │ │ ├── ChecksTable.tsx
│ │ │ │ │ └── GeoChecksTable.tsx
│ │ │ │ └── index.tsx
│ │ │ └── Monitors/
│ │ │ ├── Components/
│ │ │ │ └── UptimeMonitorsTable.tsx
│ │ │ └── index.tsx
│ │ ├── Routes/
│ │ │ └── index.tsx
│ │ ├── Types/
│ │ │ ├── Check.ts
│ │ │ ├── Diagnostics.ts
│ │ │ ├── GeoCheck.ts
│ │ │ ├── Incident.ts
│ │ │ ├── Log.ts
│ │ │ ├── MaintenanceWindow.ts
│ │ │ ├── Monitor.ts
│ │ │ ├── Notification.ts
│ │ │ ├── Queue.ts
│ │ │ ├── Settings.ts
│ │ │ ├── StatusPage.ts
│ │ │ ├── User.ts
│ │ │ ├── env.d.ts
│ │ │ ├── mui.d.ts
│ │ │ └── state.ts
│ │ ├── Utils/
│ │ │ ├── ApiClient.ts
│ │ │ ├── DataUtils.ts
│ │ │ ├── FormatUtils.ts
│ │ │ ├── InfraUtils.ts
│ │ │ ├── MonitorUtils.ts
│ │ │ ├── Theme/
│ │ │ │ ├── Palette.ts
│ │ │ │ ├── Theme.ts
│ │ │ │ └── constants.ts
│ │ │ ├── TimeUtils.ts
│ │ │ ├── i18n.ts
│ │ │ ├── logger.ts
│ │ │ ├── timezones.json
│ │ │ └── toastUtils.jsx
│ │ ├── Validation/
│ │ │ ├── addTeamMember.ts
│ │ │ ├── editUser.ts
│ │ │ ├── invite.ts
│ │ │ ├── login.ts
│ │ │ ├── maintenanceWindow.ts
│ │ │ ├── monitor.ts
│ │ │ ├── notifications.ts
│ │ │ ├── password.ts
│ │ │ ├── patterns.ts
│ │ │ ├── profile.ts
│ │ │ ├── recovery.ts
│ │ │ ├── register.ts
│ │ │ ├── setNewPassword.ts
│ │ │ ├── settings.ts
│ │ │ ├── statusPage.ts
│ │ │ └── validation.js
│ │ ├── index.css
│ │ ├── locales/
│ │ │ ├── ar.json
│ │ │ ├── cs.json
│ │ │ ├── de.json
│ │ │ ├── en.json
│ │ │ ├── es.json
│ │ │ ├── fi.json
│ │ │ ├── fr.json
│ │ │ ├── ja.json
│ │ │ ├── pt-BR.json
│ │ │ ├── ru.json
│ │ │ ├── th.json
│ │ │ ├── tr.json
│ │ │ ├── uk.json
│ │ │ ├── vi.json
│ │ │ ├── zh-CN.json
│ │ │ └── zh-TW.json
│ │ ├── main.tsx
│ │ └── store.ts
│ ├── tsconfig.app.json
│ ├── tsconfig.json
│ ├── tsconfig.node.json
│ ├── tsconfig.tsbuildinfo
│ └── vite.config.ts
├── docker/
│ ├── .gitignore
│ ├── coolify/
│ │ ├── build_images.sh
│ │ ├── client.Dockerfile
│ │ ├── mongoDB.Dockerfile
│ │ ├── nginx/
│ │ │ └── conf.d/
│ │ │ └── default.conf
│ │ ├── redis.Dockerfile
│ │ └── server.Dockerfile
│ ├── dev/
│ │ ├── build_images.sh
│ │ ├── certs/
│ │ │ └── .gitkeep
│ │ ├── client.Dockerfile
│ │ ├── docker-compose.custom-ca-example.yaml
│ │ ├── docker-compose.yaml
│ │ ├── mongoDB.Dockerfile
│ │ ├── nginx/
│ │ │ └── conf.d/
│ │ │ └── default.conf
│ │ ├── nginx-test/
│ │ │ ├── docker-compose.nginx-test.yaml
│ │ │ └── nginx.conf
│ │ └── server.Dockerfile
│ ├── dist/
│ │ ├── build_images.sh
│ │ ├── client.Dockerfile
│ │ ├── docker-compose.yaml
│ │ ├── mongoDB.Dockerfile
│ │ ├── nginx/
│ │ │ └── conf.d/
│ │ │ └── default.conf
│ │ └── server.Dockerfile
│ ├── dist-arm/
│ │ ├── build_images.sh
│ │ ├── docker-compose.yaml
│ │ └── server.Dockerfile
│ ├── dist-mono/
│ │ ├── build_images.sh
│ │ ├── docker-compose-local.yaml
│ │ ├── docker-compose.yaml
│ │ ├── mongoDB.Dockerfile
│ │ └── server.Dockerfile
│ ├── prod/
│ │ ├── build_images.sh
│ │ ├── certbot-compose.yaml
│ │ ├── client.Dockerfile
│ │ ├── docker-compose.yaml
│ │ ├── mongoDB.Dockerfile
│ │ ├── nginx/
│ │ │ └── conf.d/
│ │ │ ├── cerbot
│ │ │ └── default.conf
│ │ └── server.Dockerfile
│ └── staging/
│ ├── build_images.sh
│ ├── cerbot-compose.yaml
│ ├── client.Dockerfile
│ ├── docker-compose.yaml
│ ├── mongoDB.Dockerfile
│ ├── nginx/
│ │ └── conf.d/
│ │ ├── certbot
│ │ └── default.conf
│ └── server.Dockerfile
├── docs/
│ ├── README.md
│ ├── custom-ca-quick-reference.md
│ ├── custom-ca-trust.md
│ └── infrastructure-disk-selection.md
├── package.json
├── scripts/
│ └── flatten-locales.js
└── server/
├── .dockerignore
├── .github/
│ ├── pull_request_template.md
│ └── workflows/
│ └── staging-deploy.yml
├── .gitignore
├── .mocharc.cjs
├── .nycrc
├── .prettierrc
├── LICENSE
├── README.md
├── eslint.config.js
├── jest.config.ts
├── nodemon.json
├── openapi.json
├── package.json
├── scripts/
│ └── generate-checks.js
├── src/
│ ├── app.ts
│ ├── config/
│ │ ├── controllers.ts
│ │ ├── routes.ts
│ │ └── services.ts
│ ├── controllers/
│ │ ├── authController.ts
│ │ ├── checkController.ts
│ │ ├── controllerUtils.ts
│ │ ├── diagnosticController.ts
│ │ ├── geoCheckController.ts
│ │ ├── incidentController.ts
│ │ ├── inviteController.ts
│ │ ├── logController.ts
│ │ ├── maintenanceWindowController.ts
│ │ ├── monitorController.ts
│ │ ├── notificationController.ts
│ │ ├── queueController.ts
│ │ ├── settingsController.ts
│ │ └── statusPageController.ts
│ ├── db/
│ │ ├── IDb.ts
│ │ ├── MongoDB.ts
│ │ ├── migration/
│ │ │ ├── 0001_migrateStatusWindowThreshold.ts
│ │ │ ├── 0002_convertChecksToTimeSeries.ts
│ │ │ ├── 0003_cleanupDuplicateMonitorStats.ts
│ │ │ ├── 0004_fixInfrastructureThresholds.ts
│ │ │ ├── 0005_migrateStatusPageTypeToArray.ts
│ │ │ └── index.ts
│ │ └── models/
│ │ ├── AppSettings.ts
│ │ ├── Check.ts
│ │ ├── GeoCheck.ts
│ │ ├── Incident.ts
│ │ ├── Invite.ts
│ │ ├── MaintenanceWindow.ts
│ │ ├── Migration.ts
│ │ ├── Monitor.ts
│ │ ├── MonitorStats.ts
│ │ ├── Notification.ts
│ │ ├── RecoveryToken.ts
│ │ ├── StatusPage.ts
│ │ ├── Team.ts
│ │ ├── User.ts
│ │ └── index.ts
│ ├── index.ts
│ ├── middleware/
│ │ ├── handleErrors.ts
│ │ ├── isAllowed.ts
│ │ ├── rateLimiter.ts
│ │ ├── sanitization.ts
│ │ ├── verifyJWT.ts
│ │ └── verifyStatusPageAccess.ts
│ ├── repositories/
│ │ ├── checks/
│ │ │ ├── IChecksRepository.ts
│ │ │ └── MongoChecksRepistory.ts
│ │ ├── geo-checks/
│ │ │ ├── IGeoChecksRepository.ts
│ │ │ └── MongoGeoChecksRepository.ts
│ │ ├── incidents/
│ │ │ ├── IIncidentsRepository.ts
│ │ │ └── MongoIncidentRepository.ts
│ │ ├── index.ts
│ │ ├── invites/
│ │ │ ├── IInvitesRepository.ts
│ │ │ └── MongoInviteRepository.ts
│ │ ├── maintenance-windows/
│ │ │ ├── IMaintenanceWindowsRepository.ts
│ │ │ └── MongoMaintenanceWindowsRepository.ts
│ │ ├── monitor-stats/
│ │ │ ├── IMonitorStatsRepository.ts
│ │ │ └── MongoMonitorStatsRepository.ts
│ │ ├── monitors/
│ │ │ ├── IMonitorsRepository.ts
│ │ │ └── MongoMonitorsRepository.ts
│ │ ├── notifications/
│ │ │ ├── INotificationsRepository.ts
│ │ │ └── MongoNotificationsRepository.ts
│ │ ├── recovery-tokens/
│ │ │ ├── IRecoveryTokensRepository.ts
│ │ │ └── MongoRecoveryTokensRepository.ts
│ │ ├── settings/
│ │ │ ├── ISettingsRepository.ts
│ │ │ └── MongoSettingsRepository.ts
│ │ ├── status-pages/
│ │ │ ├── IStatusPagesRepository.ts
│ │ │ └── MongoStatusPagesRepository.ts
│ │ ├── teams/
│ │ │ ├── ITeamsRepository.ts
│ │ │ └── MongoTeamsRepository.ts
│ │ └── users/
│ │ ├── IUsersRepository.ts
│ │ └── MongoUsersRepository.ts
│ ├── routes/
│ │ ├── authRoute.ts
│ │ ├── checkRoute.ts
│ │ ├── diagnosticRoute.ts
│ │ ├── geoCheckRoutes.ts
│ │ ├── incidentRoute.ts
│ │ ├── inviteRoute.ts
│ │ ├── logRoutes.ts
│ │ ├── maintenanceWindowRoute.ts
│ │ ├── monitorRoute.ts
│ │ ├── notificationRoute.ts
│ │ ├── queueRoute.ts
│ │ ├── settingsRoute.ts
│ │ └── statusPageRoute.ts
│ ├── service/
│ │ ├── business/
│ │ │ ├── checkService.ts
│ │ │ ├── diagnosticService.ts
│ │ │ ├── geoChecksService.ts
│ │ │ ├── incidentService.ts
│ │ │ ├── inviteService.ts
│ │ │ ├── maintenanceWindowService.ts
│ │ │ ├── monitorService.ts
│ │ │ ├── statusPageService.ts
│ │ │ └── userService.ts
│ │ ├── index.ts
│ │ ├── infrastructure/
│ │ │ ├── SuperSimpleQueue/
│ │ │ │ ├── SuperSimpleQueue.ts
│ │ │ │ └── SuperSimpleQueueHelper.ts
│ │ │ ├── bufferService.ts
│ │ │ ├── emailService.ts
│ │ │ ├── globalPingService.ts
│ │ │ ├── network/
│ │ │ │ ├── AdvancedMatcher.ts
│ │ │ │ ├── DockerProvider.ts
│ │ │ │ ├── GameProvider.ts
│ │ │ │ ├── GrpcProvider.ts
│ │ │ │ ├── HardwareProvider.ts
│ │ │ │ ├── HttpProvider.ts
│ │ │ │ ├── IStatusProvider.ts
│ │ │ │ ├── PageSpeedProvider.ts
│ │ │ │ ├── PingProvider.ts
│ │ │ │ ├── PortProvider.ts
│ │ │ │ ├── WebSocketProvider.ts
│ │ │ │ └── utils.ts
│ │ │ ├── networkService.ts
│ │ │ ├── notificationMessageBuilder.ts
│ │ │ ├── notificationProviders/
│ │ │ │ ├── INotificationProvider.ts
│ │ │ │ ├── discord.ts
│ │ │ │ ├── email.ts
│ │ │ │ ├── matrix.ts
│ │ │ │ ├── pagerduty.ts
│ │ │ │ ├── slack.ts
│ │ │ │ ├── teams.ts
│ │ │ │ ├── utils.ts
│ │ │ │ └── webhook.ts
│ │ │ ├── notificationsService.ts
│ │ │ ├── protos/
│ │ │ │ └── health.proto
│ │ │ └── statusService.ts
│ │ └── system/
│ │ └── settingsService.ts
│ ├── shutdown.ts
│ ├── templates/
│ │ ├── addReview.mjml
│ │ ├── employeeActivation.mjml
│ │ ├── noIncidentsThisWeek.mjml
│ │ ├── passwordReset.mjml
│ │ ├── testEmailTemplate.mjml
│ │ ├── unifiedNotification.mjml
│ │ └── welcomeEmail.mjml
│ ├── types/
│ │ ├── alert.ts
│ │ ├── check.ts
│ │ ├── email.ts
│ │ ├── express.d.ts
│ │ ├── geoCheck.ts
│ │ ├── incident.ts
│ │ ├── index.ts
│ │ ├── invite.ts
│ │ ├── maintenanceWindow.ts
│ │ ├── monitor.ts
│ │ ├── monitorStats.ts
│ │ ├── network.ts
│ │ ├── notification.ts
│ │ ├── notificationMessage.ts
│ │ ├── recoveryToken.ts
│ │ ├── settings.ts
│ │ ├── ssl-checker.d.ts
│ │ ├── statusPage.ts
│ │ ├── team.ts
│ │ └── user.ts
│ ├── utils/
│ │ ├── AppError.ts
│ │ ├── dataUtils.ts
│ │ ├── demoMonitors.json
│ │ ├── imageProcessing.ts
│ │ ├── logger.ts
│ │ └── utils.ts
│ └── validation/
│ ├── authValidation.ts
│ ├── checkValidation.ts
│ ├── envValidation.ts
│ ├── incidentValidation.ts
│ ├── index.ts
│ ├── maintenanceWindowValidation.ts
│ ├── monitorValidation.ts
│ ├── notificationValidation.ts
│ ├── settingsValidation.ts
│ ├── shared.ts
│ ├── statusPageValidation.ts
│ └── userValidation.ts
├── test/
│ ├── monitorService.test.ts
│ ├── superSimpleQueueHelper.test.ts
│ └── teamsProvider.test.ts
├── tsconfig.jest.json
└── tsconfig.json
SYMBOL INDEX (894 symbols across 280 files)
FILE: .github/scripts/download-translations.js
constant API_TOKEN (line 7) | const API_TOKEN = process.env.POEDITOR_API;
constant PROJECT_ID (line 8) | const PROJECT_ID = process.env.POEDITOR_PROJECT_ID;
constant LANGUAGES (line 9) | const LANGUAGES = (
constant EXPORT_FORMAT (line 12) | const EXPORT_FORMAT = process.env.EXPORT_FORMAT || "key_value_json";
constant API_URL (line 15) | const API_URL = "https://api.poeditor.com/v2";
function normalizeLanguageCode (line 17) | function normalizeLanguageCode(language) {
function downloadTranslations (line 26) | async function downloadTranslations() {
function main (line 98) | async function main() {
FILE: .github/scripts/upload-translations.js
constant API_TOKEN (line 6) | const API_TOKEN = process.env.POEDITOR_API;
constant PROJECT_ID (line 7) | const PROJECT_ID = process.env.POEDITOR_PROJECT_ID;
constant FILE_PATH (line 8) | const FILE_PATH = process.env.FILE_PATH;
constant LANGUAGE (line 9) | const LANGUAGE = process.env.LANGUAGE;
constant API_URL (line 12) | const API_URL = 'https://api.poeditor.com/v2';
function uploadTranslations (line 15) | async function uploadTranslations() {
FILE: client/src/App.tsx
function App (line 23) | function App() {
FILE: client/src/Components/actions-menu/index.tsx
type ActionMenuItem (line 7) | type ActionMenuItem = {
FILE: client/src/Components/common/charts/HeatmapResponseTime.tsx
type PlaceholderCheck (line 9) | interface PlaceholderCheck {
type HeatmapResponseTimeProps (line 15) | interface HeatmapResponseTimeProps {
FILE: client/src/Components/common/charts/HeatmapResponseTimeTooltip.tsx
type HeatmapCheck (line 11) | type HeatmapCheck =
FILE: client/src/Components/common/charts/HistogramResponseTime.tsx
type HistogramResponseTimeProps (line 11) | interface HistogramResponseTimeProps {
type ResponseTimeStats (line 19) | interface ResponseTimeStats {
constant DEFAULT_HEIGHT (line 24) | const DEFAULT_HEIGHT = 50;
FILE: client/src/Components/common/controls/HeaderCreate.tsx
type HeaderCreateProps (line 6) | interface HeaderCreateProps {
FILE: client/src/Components/common/controls/HeaderTimeRange.tsx
type MonitorTimeFrameHeaderProps (line 10) | interface MonitorTimeFrameHeaderProps {
FILE: client/src/Components/design-elements/Avatar.tsx
type AvatarProps (line 7) | interface AvatarProps {
FILE: client/src/Components/design-elements/BaseChart.tsx
type BaseChartProps (line 10) | type BaseChartProps = React.PropsWithChildren<{
FILE: client/src/Components/design-elements/BasePage.tsx
type BasePageProps (line 53) | interface BasePageProps extends StackProps {
type BasePageWithStatesProps (line 104) | interface BasePageWithStatesProps extends StackProps {
type MonitorBasePageWithStatesProps (line 150) | interface MonitorBasePageWithStatesProps extends StackProps {
type BaseAuthPageProps (line 209) | interface BaseAuthPageProps extends React.PropsWithChildren, StackProps {
FILE: client/src/Components/design-elements/Dot.tsx
type DotProps (line 3) | interface DotProps {
FILE: client/src/Components/design-elements/Fallback.tsx
type BaseFallbackProps (line 12) | interface BaseFallbackProps extends StackProps {
FILE: client/src/Components/design-elements/Gauge.tsx
constant MINIMUM_VALUE (line 10) | const MINIMUM_VALUE = 0;
constant MAXIMUM_VALUE (line 11) | const MAXIMUM_VALUE = 100;
FILE: client/src/Components/design-elements/Icon.tsx
type IconProps (line 3) | interface IconProps {
FILE: client/src/Components/design-elements/OfflineBanner.tsx
type OfflineBannerProps (line 9) | interface OfflineBannerProps {
FILE: client/src/Components/design-elements/PulseDot.tsx
type PulseDotProps (line 16) | interface PulseDotProps {
FILE: client/src/Components/design-elements/SkeletonCard.tsx
type SkeletonCardProps (line 3) | interface SkeletonCardProps {
FILE: client/src/Components/design-elements/StatBox.tsx
type GradientBox (line 11) | type GradientBox = React.PropsWithChildren<{
type StatBoxProps (line 41) | type StatBoxProps = React.PropsWithChildren<{
FILE: client/src/Components/design-elements/StatusBox.tsx
type StatusBoxProps (line 10) | type StatusBoxProps = React.PropsWithChildren<{
FILE: client/src/Components/design-elements/StatusLabel.tsx
type ValueType (line 12) | type ValueType = (typeof ValueTypes)[number];
FILE: client/src/Components/design-elements/Table.tsx
type Header (line 36) | type Header<T> = {
type DataTableProps (line 43) | type DataTableProps<T extends { id?: string | number; _id?: string | num...
function DataTable (line 55) | function DataTable<
type TablePaginationActionsProps (line 263) | interface TablePaginationActionsProps {
function TablePaginationActions (line 270) | function TablePaginationActions(props: TablePaginationActionsProps) {
type HasMoreTablePaginationActionsProps (line 367) | interface HasMoreTablePaginationActionsProps {
function HasMoreTablePaginationActions (line 372) | function HasMoreTablePaginationActions(props: HasMoreTablePaginationActi...
type PaginationProps (line 459) | interface PaginationProps extends TablePaginationOwnProps {
FILE: client/src/Components/design-elements/Tabs.tsx
type CustomTabsProps (line 4) | interface CustomTabsProps extends TabsProps {}
type CustomTabProps (line 31) | interface CustomTabProps extends TabProps {}
FILE: client/src/Components/design-elements/TextLink.tsx
type TextLinkProps (line 9) | interface TextLinkProps extends StackProps {
FILE: client/src/Components/design-elements/Tooltip.tsx
type StyledTooltipProps (line 7) | type StyledTooltipProps = TooltipProps;
type TooltipWithInfoProps (line 38) | interface TooltipWithInfoProps extends Omit<StyledTooltipProps, "childre...
FILE: client/src/Components/inputs/AutoComplete.tsx
type AutoCompleteInputProps (line 10) | type AutoCompleteInputProps = Omit<
FILE: client/src/Components/inputs/Checkbox.tsx
type CheckboxInputProps (line 7) | type CheckboxInputProps = CheckboxProps & {
FILE: client/src/Components/inputs/ColorPicker.tsx
type ColorPickerProps (line 8) | interface ColorPickerProps extends MuiColorInputProps {
FILE: client/src/Components/inputs/DatePicker.tsx
type DatePickerComponentProps (line 12) | interface DatePickerComponentProps extends Omit<DatePickerProps<Dayjs>, ...
FILE: client/src/Components/inputs/FieldLabel.tsx
type FieldLabelProps (line 4) | interface FieldLabelProps {
FILE: client/src/Components/inputs/ImageUpload.tsx
type FileObject (line 7) | interface FileObject {
type ImageUploadProps (line 13) | interface ImageUploadProps {
FILE: client/src/Components/inputs/Radio.tsx
type RadioInputProps (line 8) | interface RadioInputProps extends RadioProps {}
FILE: client/src/Components/inputs/Select.tsx
type SelectInputProps (line 10) | interface SelectInputProps<T> extends Omit<SelectProps<T>, "label"> {
FILE: client/src/Components/inputs/Slider.tsx
type SliderInputProps (line 11) | interface SliderInputProps extends SliderProps {
type SliderWithLabelProps (line 68) | interface SliderWithLabelProps extends SliderProps {
FILE: client/src/Components/inputs/Switch.tsx
type SwitchComponentProps (line 6) | interface SwitchComponentProps extends SwitchProps {
FILE: client/src/Components/inputs/TextInput.tsx
type TextInputProps (line 9) | interface TextInputProps extends Omit<TextFieldProps, "label"> {
FILE: client/src/Components/inputs/TimePicker.tsx
type TimePickerComponentProps (line 10) | interface TimePickerComponentProps extends Omit<MobileTimePickerProps<Da...
FILE: client/src/Components/layout/AppLayout.tsx
type AppLayoutProps (line 7) | interface AppLayoutProps {
FILE: client/src/Components/monitors/GeoChecksMap.tsx
type GeoChecksMapProps (line 8) | interface GeoChecksMapProps {
FILE: client/src/Components/monitors/HeaderGeoTabs.tsx
type HeaderGeoTabsProps (line 7) | interface HeaderGeoTabsProps {
FILE: client/src/Components/monitors/HeaderMonitorControls.tsx
type BaseHeaderProps (line 12) | interface BaseHeaderProps {
type HeaderMonitorControlsProps (line 31) | interface HeaderMonitorControlsProps {
type HeaderDeleteControlsProps (line 116) | interface HeaderDeleteControlsProps {
FILE: client/src/Components/monitors/HeaderMonitorsSummary.tsx
type MonitorsSummaryProps (line 13) | interface MonitorsSummaryProps {
FILE: client/src/Components/monitors/MonitorStatBoxes.tsx
type MonitorStatBoxesProps (line 10) | interface MonitorStatBoxesProps {
FILE: client/src/Components/monitors/charts/HistogramDetails.tsx
type XTickProps (line 24) | type XTickProps = {
type ResponseTimeToolTipProps (line 49) | type ResponseTimeToolTipProps = {
FILE: client/src/Components/monitors/charts/HistogramInfrastructure.tsx
constant AREA_COLORS (line 16) | const AREA_COLORS = [
FILE: client/src/Components/monitors/charts/HistogramPageSpeedDetails.tsx
type PaletteColorKey (line 17) | type PaletteColorKey = Extract<
type ConfigItem (line 22) | interface ConfigItem {
FILE: client/src/Components/monitors/charts/HistogramPageSpeedDetailsTooltip.tsx
type HistogramPageSpeedScoresTooltipProps (line 12) | interface HistogramPageSpeedScoresTooltipProps extends Partial<
FILE: client/src/Components/monitors/charts/HistogramStatus.tsx
type XLabelProps (line 13) | interface XLabelProps {
type HistogramStatusProps (line 49) | interface HistogramStatusProps {
FILE: client/src/Components/routing/RouteProtected.tsx
type ProtectedRouteProps (line 6) | interface ProtectedRouteProps {
type RoleProtectedRouteProps (line 23) | interface RoleProtectedRouteProps {
FILE: client/src/Components/sidebar/Authfooter.tsx
type AuthFooterProps (line 18) | interface AuthFooterProps {
FILE: client/src/Components/sidebar/NavItem.tsx
type NavData (line 9) | interface NavData {
FILE: client/src/Components/sidebar/index.tsx
constant URL_MAP (line 20) | const URL_MAP: Record<string, string> = {
FILE: client/src/Features/Auth/authSlice.ts
type AuthState (line 4) | interface AuthState {
FILE: client/src/Features/UI/uiSlice.ts
type ThemeMode (line 3) | type ThemeMode = "light" | "dark";
type ChartType (line 4) | type ChartType = "histogram" | "line";
type TableName (line 5) | type TableName = "monitors" | "team" | "maintenance" | "infrastructure" ...
type TableState (line 7) | interface TableState {
type SidebarState (line 11) | interface SidebarState {
type UIState (line 15) | interface UIState {
FILE: client/src/Hooks/UseApi.ts
type ApiResponse (line 9) | interface ApiResponse<T> {
FILE: client/src/Hooks/useMaintenanceWindowForm.ts
type UseMaintenanceWindowFormOptions (line 10) | interface UseMaintenanceWindowFormOptions {
FILE: client/src/Hooks/useMonitorForm.ts
type UseMonitorFormOptions (line 5) | interface UseMonitorFormOptions {
FILE: client/src/Hooks/useNotificationForm.ts
type UseNotificationFormOptions (line 5) | interface UseNotificationFormOptions {
FILE: client/src/Hooks/useSettingsForm.ts
type UseSettingsFormOptions (line 6) | interface UseSettingsFormOptions {
FILE: client/src/Hooks/useSidebar.ts
constant SIDEBAR_WIDTH_VAR (line 5) | const SIDEBAR_WIDTH_VAR = 250;
constant SIDEBAR_COLLAPSED_WIDTH_VAR (line 6) | const SIDEBAR_COLLAPSED_WIDTH_VAR = 64;
constant SIDEBAR_TRANSITION (line 9) | const SIDEBAR_TRANSITION = "width 650ms cubic-bezier(0.36, -0.01, 0, 0.7...
FILE: client/src/Hooks/useStatusPageForm.ts
type UseStatusPageFormOptions (line 6) | interface UseStatusPageFormOptions {
FILE: client/src/Pages/Account/EditUser/index.tsx
type RoleOption (line 26) | interface RoleOption {
FILE: client/src/Pages/Account/components/AddTeamMemberDialog.tsx
type AddTeamMemberDialogProps (line 13) | interface AddTeamMemberDialogProps {
type RegisterPayload (line 19) | interface RegisterPayload {
FILE: client/src/Pages/Account/components/HeaderTeamControls.tsx
type HeaderTeamControlsProps (line 13) | interface HeaderTeamControlsProps {
FILE: client/src/Pages/Account/components/InviteTeamMemberDialog.tsx
constant CLIENT_HOST (line 13) | const CLIENT_HOST = import.meta.env.VITE_APP_CLIENT_HOST;
type InviteResponse (line 15) | interface InviteResponse {
type InviteTeamMemberDialogProps (line 19) | interface InviteTeamMemberDialogProps {
FILE: client/src/Pages/Account/components/TeamTable.tsx
type TeamTableProps (line 9) | interface TeamTableProps {
FILE: client/src/Pages/Account/index.tsx
type AccountProps (line 8) | interface AccountProps {
constant TAB_MAP (line 12) | const TAB_MAP = {
FILE: client/src/Pages/Auth/Register/index.tsx
type RegisterPayload (line 15) | interface RegisterPayload {
type InviteVerifyResponse (line 20) | interface InviteVerifyResponse {
FILE: client/src/Pages/Auth/components/HeaderAuthControls.tsx
type HeaderAuthControlsProps (line 9) | interface HeaderAuthControlsProps extends StackProps {
FILE: client/src/Pages/CreateMonitor/index.tsx
type GeneralSettingsConfig (line 44) | interface GeneralSettingsConfig {
FILE: client/src/Pages/Incidents/Components/CardDetails.tsx
type CardDetailsProps (line 17) | interface CardDetailsProps {
FILE: client/src/Pages/Incidents/Components/CardSummary.tsx
type SummaryItemProps (line 14) | interface SummaryItemProps {
type SummaryCardProps (line 47) | interface SummaryCardProps {
type SummaryCardActiveIncidentsProps (line 85) | interface SummaryCardActiveIncidentsProps {
type SummaryCardLatestIncidentsProps (line 185) | interface SummaryCardLatestIncidentsProps {
type SummaryCardStatsProps (line 213) | interface SummaryCardStatsProps {
FILE: client/src/Pages/Incidents/Components/ControlsIncidentFilter.tsx
type ControlsIncidentFilterProps (line 11) | interface ControlsIncidentFilterProps {
FILE: client/src/Pages/Incidents/Components/DialogIncidentDetails.tsx
type DialogIncidentDetailsProps (line 8) | interface DialogIncidentDetailsProps {
FILE: client/src/Pages/Incidents/Components/DialogResolution.tsx
type DialogResolutionProps (line 8) | interface DialogResolutionProps {
FILE: client/src/Pages/Incidents/Components/IncidentTable.tsx
type IncidentsTableProps (line 20) | interface IncidentsTableProps {
FILE: client/src/Pages/Incidents/utils.ts
type IncidentLike (line 4) | type IncidentLike = Pick<Incident, "startTime" | "endTime" | "status">;
FILE: client/src/Pages/Infrastructure/Details/Components/ChartsNetwork.tsx
type ChartConfig (line 12) | interface ChartConfig {
FILE: client/src/Pages/Logs/components/Metrics.tsx
type MetricsProps (line 8) | interface MetricsProps {
FILE: client/src/Pages/Logs/components/StatGauges.tsx
type StatGaugesProps (line 10) | interface StatGaugesProps {
FILE: client/src/Pages/Logs/components/Stats.tsx
type StatsProps (line 10) | interface StatsProps {
FILE: client/src/Pages/Logs/components/TableJobs.tsx
type QueueJobWithId (line 10) | type QueueJobWithId = QueueJobSummary & { id: string | number };
type TableJobsProps (line 12) | interface TableJobsProps {
type QueueJobFailureWithId (line 102) | type QueueJobFailureWithId = QueueJobFailure & { id: string | number };
type TableFailedJobsProps (line 104) | interface TableFailedJobsProps {
FILE: client/src/Pages/Logs/components/TableLogs.tsx
type LogWithId (line 14) | type LogWithId = Log & { id: number };
type TableLogsProps (line 16) | interface TableLogsProps {
FILE: client/src/Pages/Maintenance/MaintenanceWindowTable.tsx
type MaintenanceWindowTableProps (line 22) | interface MaintenanceWindowTableProps {
FILE: client/src/Pages/Maintenance/index.tsx
type MaintenanceWindowsResponse (line 12) | interface MaintenanceWindowsResponse {
FILE: client/src/Pages/NotFound/index.tsx
type NotFoundProps (line 11) | interface NotFoundProps {
FILE: client/src/Pages/Notifications/components/NotificationsTable.tsx
type NotificationsTableProps (line 11) | interface NotificationsTableProps {
FILE: client/src/Pages/Settings/DummyChart.tsx
type DummyChartProps (line 7) | interface DummyChartProps {
FILE: client/src/Pages/Settings/index.tsx
type Timezone (line 42) | interface Timezone {
type SettingsResponse (line 47) | interface SettingsResponse {
FILE: client/src/Pages/StatusPage/Create/Components/HeaderConfigStatusControls.tsx
type HeaderConfigStatusControlsProps (line 9) | interface HeaderConfigStatusControlsProps {
FILE: client/src/Pages/StatusPage/Create/index.tsx
type TimezoneOption (line 46) | interface TimezoneOption {
FILE: client/src/Pages/StatusPage/Status/Components/HeaderStatusPageControls.tsx
type HeaderStatusPageControlsProps (line 13) | interface HeaderStatusPageControlsProps {
FILE: client/src/Pages/StatusPage/Status/Components/InfrastructureMetrics.tsx
constant GAUGE_RADIUS (line 13) | const GAUGE_RADIUS = 60;
constant GAUGE_STROKE_WIDTH (line 14) | const GAUGE_STROKE_WIDTH = 12;
constant PERCENTAGE_MULTIPLIER (line 15) | const PERCENTAGE_MULTIPLIER = 100;
type StatusPageMonitor (line 17) | interface StatusPageMonitor extends Monitor {
type MetricDetail (line 21) | interface MetricDetail {
type MetricConfig (line 26) | interface MetricConfig {
type MetricItemProps (line 52) | interface MetricItemProps {
type LatestCheck (line 110) | type LatestCheck = NonNullable<Monitor["recentChecks"]>[number];
FILE: client/src/Pages/StatusPage/Status/Components/MonitorsList.tsx
type StatusPageMonitor (line 19) | interface StatusPageMonitor extends Monitor {
type MonitorsListProps (line 23) | interface MonitorsListProps {
FILE: client/src/Pages/StatusPage/Status/Components/StatusBar.tsx
type StatusBarProps (line 35) | interface StatusBarProps {
FILE: client/src/Pages/StatusPage/StatusPages/Components/StatusPagesTable.tsx
type StatusPagesTableProps (line 14) | interface StatusPagesTableProps {
FILE: client/src/Pages/Uptime/Details/index.tsx
type CertificateResponse (line 37) | interface CertificateResponse {
FILE: client/src/Types/Check.ts
constant CHECK_TTL_SENTINEL (line 1) | const CHECK_TTL_SENTINEL = 366;
type CheckMetadata (line 3) | interface CheckMetadata {
type CheckCpuInfo (line 17) | interface CheckCpuInfo {
type CheckMemoryInfo (line 27) | interface CheckMemoryInfo {
type CheckHostInfo (line 34) | interface CheckHostInfo {
type CheckCaptureInfo (line 41) | interface CheckCaptureInfo {
type CheckDiskInfo (line 46) | interface CheckDiskInfo {
type CheckErrorInfo (line 63) | interface CheckErrorInfo {
type CheckNetworkInterfaceInfo (line 68) | interface CheckNetworkInterfaceInfo {
type CheckAudits (line 82) | interface CheckAudits {
type ILighthouseAudit (line 90) | interface ILighthouseAudit {
type CheckTimings (line 99) | interface CheckTimings {
type Check (line 122) | interface Check {
type GroupedCheck (line 146) | interface GroupedCheck {
type PageSpeedGroupedCheck (line 152) | interface PageSpeedGroupedCheck {
type LatestCheck (line 161) | interface LatestCheck {
type ChecksResponse (line 168) | interface ChecksResponse {
type MonitorType (line 173) | type MonitorType =
type ChecksQueryResult (line 183) | interface ChecksQueryResult {
type PageSpeedChecksResult (line 188) | interface PageSpeedChecksResult {
type HardwareChecksResult (line 193) | interface HardwareChecksResult {
type UptimeChecksResult (line 230) | interface UptimeChecksResult {
type ChecksSummary (line 239) | interface ChecksSummary {
type CheckSnapshot (line 244) | type CheckSnapshot = Omit<Check, "metadata" | "__v" | "updatedAt"> & {
type HasResponseTime (line 248) | interface HasResponseTime {
type NormalizedCheck (line 252) | type NormalizedCheck<T extends HasResponseTime = Check> = T & {
type NormalizedUptimeCheck (line 256) | type NormalizedUptimeCheck<T extends GroupedCheck = GroupedCheck> = T & {
FILE: client/src/Types/Diagnostics.ts
type Diagnostics (line 1) | interface Diagnostics {
type OsStats (line 10) | interface OsStats {
type MemoryUsage (line 15) | interface MemoryUsage {
type CpuUsage (line 23) | interface CpuUsage {
type V8HeapStats (line 29) | interface V8HeapStats {
FILE: client/src/Types/GeoCheck.ts
type GeoContinent (line 2) | type GeoContinent = (typeof GeoContinents)[number];
type GeoCheckMetadata (line 4) | interface GeoCheckMetadata {
type GeoCheckTimings (line 10) | interface GeoCheckTimings {
type GeoCheckLocation (line 19) | interface GeoCheckLocation {
type GeoCheckResult (line 29) | interface GeoCheckResult {
type GeoCheck (line 36) | interface GeoCheck {
type FlatGeoCheck (line 46) | interface FlatGeoCheck {
type GroupedGeoCheck (line 59) | interface GroupedGeoCheck {
type GeoChecksResult (line 67) | interface GeoChecksResult {
type GeoChecksResponse (line 72) | interface GeoChecksResponse {
type FlatGeoChecksResponse (line 77) | interface FlatGeoChecksResponse {
FILE: client/src/Types/Incident.ts
type Incident (line 1) | interface Incident {
type IncidentsResponse (line 18) | interface IncidentsResponse {
type IncidentSummaryTopMonitor (line 23) | interface IncidentSummaryTopMonitor {
type IncidentSummaryItem (line 29) | interface IncidentSummaryItem {
type IncidentSummary (line 42) | interface IncidentSummary {
FILE: client/src/Types/Log.ts
constant LOG_LEVELS (line 1) | const LOG_LEVELS = ["debug", "info", "warn", "error"] as const;
type LogLevel (line 2) | type LogLevel = (typeof LOG_LEVELS)[number];
constant LOG_LEVEL_OPTIONS (line 3) | const LOG_LEVEL_OPTIONS = ["all", ...LOG_LEVELS] as const;
type LogLevelOption (line 4) | type LogLevelOption = (typeof LOG_LEVEL_OPTIONS)[number];
type Log (line 5) | interface Log {
FILE: client/src/Types/MaintenanceWindow.ts
type DurationUnit (line 1) | type DurationUnit = "seconds" | "minutes" | "hours" | "days";
type MaintenanceWindow (line 3) | interface MaintenanceWindow {
FILE: client/src/Types/Monitor.ts
type MonitorType (line 18) | type MonitorType = (typeof MonitorTypes)[number];
type MonitorStatus (line 37) | type MonitorStatus = (typeof MonitorStatuses)[number];
type MonitorMatchMethod (line 39) | type MonitorMatchMethod = "equal" | "include" | "regex" | "";
type Monitor (line 41) | interface Monitor {
type MonitorWithChecks (line 84) | type MonitorWithChecks = Monitor;
type MonitorsSummary (line 86) | interface MonitorsSummary {
type MonitorsWithChecksResponse (line 96) | interface MonitorsWithChecksResponse {
type MonitorStats (line 102) | interface MonitorStats {
type MonitorData (line 118) | interface MonitorData {
type MonitorDetailsResponse (line 127) | interface MonitorDetailsResponse {
type PageSpeedDetailsResponse (line 132) | interface PageSpeedDetailsResponse {
type HardwareDiskStats (line 140) | interface HardwareDiskStats {
type HardwareNetStats (line 149) | interface HardwareNetStats {
type HardwareCheckStats (line 163) | interface HardwareCheckStats {
type HardwareStats (line 172) | interface HardwareStats {
type HardwareDetailsResponse (line 182) | interface HardwareDetailsResponse {
type Game (line 188) | interface Game {
type GamesMap (line 195) | type GamesMap = Record<string, Game>;
FILE: client/src/Types/Notification.ts
type NotificationChannel (line 10) | type NotificationChannel = (typeof NotificationChannels)[number];
type Notification (line 12) | interface Notification {
FILE: client/src/Types/Queue.ts
type QueueJobFailure (line 3) | interface QueueJobFailure {
type QueueMetrics (line 12) | interface QueueMetrics {
type QueueJobSummary (line 21) | interface QueueJobSummary {
type QueueData (line 37) | interface QueueData {
FILE: client/src/Types/Settings.ts
type SettingsThresholds (line 1) | interface SettingsThresholds {
type Settings (line 8) | interface Settings {
type AppSettingsResponse (line 30) | interface AppSettingsResponse {
FILE: client/src/Types/StatusPage.ts
type MonitorDisplayType (line 2) | type MonitorDisplayType = "uptime" | "infrastructure";
constant MONITOR_TYPE_KEYS (line 4) | const MONITOR_TYPE_KEYS: Partial<Record<MonitorType, string>> = {
type StatusPage (line 24) | interface StatusPage {
type StatusPageResponse (line 50) | interface StatusPageResponse {
FILE: client/src/Types/User.ts
type UserRole (line 2) | type UserRole = (typeof UserRoles)[number];
type UserProfileImage (line 4) | interface UserProfileImage {
type User (line 9) | interface User {
type AuthResponse (line 25) | interface AuthResponse {
FILE: client/src/Types/env.d.ts
type ImportMetaEnv (line 5) | interface ImportMetaEnv {
type ImportMeta (line 10) | interface ImportMeta {
FILE: client/src/Types/mui.d.ts
type Palette (line 4) | interface Palette {}
type PaletteOptions (line 5) | interface PaletteOptions {}
type ButtonPropsColorOverrides (line 9) | interface ButtonPropsColorOverrides {
type CircularProgressPropsColorOverrides (line 15) | interface CircularProgressPropsColorOverrides {}
FILE: client/src/Types/state.ts
type AuthState (line 4) | interface AuthState {
type UIState (line 12) | interface UIState {
type RootState (line 44) | interface RootState {
FILE: client/src/Utils/ApiClient.ts
constant BASE_URL (line 5) | const BASE_URL = import.meta.env.VITE_APP_API_BASE_URL;
type StoreType (line 11) | type StoreType = {
type ServerUnreachableCallback (line 18) | type ServerUnreachableCallback = (unreachable: boolean) => void;
FILE: client/src/Utils/DataUtils.ts
constant MIN_OUT (line 1) | const MIN_OUT = 10;
constant MAX_OUT (line 2) | const MAX_OUT = 100;
FILE: client/src/Utils/Theme/Theme.ts
type PaletteKey (line 6) | type PaletteKey = {
FILE: client/src/Utils/Theme/constants.ts
constant SPACING (line 1) | const SPACING = {
constant LAYOUT (line 10) | const LAYOUT = {
FILE: client/src/Utils/TimeUtils.ts
constant MS_PER_SECOND (line 12) | const MS_PER_SECOND = 1000;
constant MS_PER_MINUTE (line 13) | const MS_PER_MINUTE = 60 * MS_PER_SECOND;
constant MS_PER_HOUR (line 14) | const MS_PER_HOUR = 60 * MS_PER_MINUTE;
constant MS_PER_DAY (line 15) | const MS_PER_DAY = 24 * MS_PER_HOUR;
constant MS_PER_WEEK (line 16) | const MS_PER_WEEK = MS_PER_DAY * 7;
FILE: client/src/Utils/i18n.ts
type TranslationModule (line 7) | interface TranslationModule {
FILE: client/src/Utils/logger.ts
type LogContext (line 3) | interface LogContext {
constant LOG_LEVEL_PRIORITY (line 7) | const LOG_LEVEL_PRIORITY: Record<LogLevel, number> = {
type ErrorLogData (line 14) | interface ErrorLogData {
type ILogger (line 125) | interface ILogger {
FILE: client/src/Validation/addTeamMember.ts
type AddTeamMemberFormData (line 9) | type AddTeamMemberFormData = z.infer<typeof addTeamMemberSchema>;
FILE: client/src/Validation/editUser.ts
type EditUserFormData (line 19) | type EditUserFormData = z.infer<typeof editUserSchema>;
FILE: client/src/Validation/invite.ts
type InviteFormData (line 9) | type InviteFormData = z.infer<typeof inviteSchema>;
FILE: client/src/Validation/login.ts
type LoginFormData (line 11) | type LoginFormData = z.infer<typeof loginSchema>;
FILE: client/src/Validation/maintenanceWindow.ts
type MaintenanceWindowFormData (line 43) | type MaintenanceWindowFormData = z.infer<typeof maintenanceWindowSchema>;
FILE: client/src/Validation/monitor.ts
type MonitorFormData (line 138) | type MonitorFormData = z.infer<typeof monitorSchema>;
FILE: client/src/Validation/notifications.ts
type NotificationFormData (line 63) | type NotificationFormData = z.infer<typeof notificationSchema>;
FILE: client/src/Validation/password.ts
type PasswordFormData (line 25) | type PasswordFormData = z.infer<typeof passwordSchema>;
FILE: client/src/Validation/profile.ts
type ProfileFormData (line 19) | type ProfileFormData = z.infer<typeof profileSchema>;
FILE: client/src/Validation/recovery.ts
type RecoveryFormData (line 10) | type RecoveryFormData = z.infer<typeof recoverySchema>;
FILE: client/src/Validation/register.ts
type RegisterFormData (line 40) | type RegisterFormData = z.infer<typeof registerSchema>;
FILE: client/src/Validation/setNewPassword.ts
type SetNewPasswordFormData (line 24) | type SetNewPasswordFormData = z.infer<typeof setNewPasswordSchema>;
FILE: client/src/Validation/settings.ts
type SettingsFormInput (line 55) | type SettingsFormInput = z.input<typeof settingsSchema>;
type SettingsFormData (line 56) | type SettingsFormData = z.infer<typeof settingsSchema>;
FILE: client/src/Validation/statusPage.ts
type StatusPageFormData (line 37) | type StatusPageFormData = z.infer<typeof statusPageSchema>;
FILE: client/src/Validation/validation.js
constant ROLES (line 3) | const ROLES = {
constant VALID_ROLES (line 10) | const VALID_ROLES = [ROLES.ADMIN, ROLES.USER, ROLES.DEMO];
constant EDITABLE_ROLES (line 12) | const EDITABLE_ROLES = [
constant THRESHOLD_COMMON_BASE_MSG (line 17) | const THRESHOLD_COMMON_BASE_MSG = "Threshold must be a number.";
FILE: client/src/store.ts
type RootState (line 47) | type RootState = ReturnType<typeof rootReducer>;
type AppDispatch (line 48) | type AppDispatch = typeof store.dispatch;
FILE: scripts/flatten-locales.js
function flattenKeys (line 6) | function flattenKeys(obj, prefix = "", result = []) {
FILE: server/scripts/generate-checks.js
constant DEFAULT_MONITOR_ID (line 5) | const DEFAULT_MONITOR_ID = "000000000000000000000001";
constant DEFAULT_MONITOR_TYPE (line 6) | const DEFAULT_MONITOR_TYPE = "http";
constant DEFAULT_TOTAL (line 7) | const DEFAULT_TOTAL = 1_000_000;
constant DEFAULT_BATCH_SIZE (line 8) | const DEFAULT_BATCH_SIZE = 5_000;
function ensureMonitor (line 19) | async function ensureMonitor({ monitorId, teamId, userId, type }) {
function run (line 52) | async function run() {
FILE: server/src/config/controllers.ts
type InitializedControllers (line 16) | interface InitializedControllers {
FILE: server/src/config/services.ts
type InitializedServices (line 114) | type InitializedServices = {
FILE: server/src/controllers/authController.ts
constant SERVICE_NAME (line 24) | const SERVICE_NAME = "authController";
type IAuthController (line 26) | interface IAuthController {
class AuthController (line 43) | class AuthController implements IAuthController {
method constructor (line 48) | constructor(userService: IUserService) {
method serviceName (line 52) | get serviceName() {
FILE: server/src/controllers/checkController.ts
constant SERVICE_NAME (line 13) | const SERVICE_NAME = "checkController";
type ICheckController (line 15) | interface ICheckController {
class CheckController (line 24) | class CheckController implements ICheckController {
method constructor (line 28) | constructor(checkService: ICheckService) {
method serviceName (line 32) | get serviceName() {
FILE: server/src/controllers/controllerUtils.ts
type SSLCheckerType (line 4) | type SSLCheckerType = typeof sslChecker;
FILE: server/src/controllers/diagnosticController.ts
constant SERVICE_NAME (line 4) | const SERVICE_NAME = "diagnosticController";
type IDiagnosticController (line 6) | interface IDiagnosticController {
class DiagnosticController (line 10) | class DiagnosticController implements IDiagnosticController {
method constructor (line 15) | constructor(diagnosticService: IDiagnosticService) {
method serviceName (line 19) | get serviceName() {
FILE: server/src/controllers/geoCheckController.ts
constant SERVICE_NAME (line 7) | const SERVICE_NAME = "geoCheckController";
type IGeoCheckController (line 9) | interface IGeoCheckController {
class GeoCheckController (line 12) | class GeoCheckController implements IGeoCheckController {
method constructor (line 16) | constructor(geoChecksService: IGeoChecksService) {
method serviceName (line 20) | get serviceName() {
FILE: server/src/controllers/incidentController.ts
constant SERVICE_NAME (line 7) | const SERVICE_NAME = "IncidentController";
type IIncidentController (line 9) | interface IIncidentController {
class IncidentController (line 15) | class IncidentController implements IIncidentController {
method constructor (line 17) | constructor(incidentService: IIncidentService) {
FILE: server/src/controllers/inviteController.ts
constant SERVICE_NAME (line 5) | const SERVICE_NAME = "inviteController";
type IInviteController (line 7) | interface IInviteController {
class InviteController (line 13) | class InviteController implements IInviteController {
method constructor (line 16) | constructor(inviteService: IInviteService) {
method serviceName (line 20) | get serviceName() {
FILE: server/src/controllers/logController.ts
constant SERVICE_NAME (line 4) | const SERVICE_NAME = "LogController";
type ILogController (line 6) | interface ILogController {
class LogController (line 10) | class LogController {
method constructor (line 13) | constructor(logger: ILogger) {
method serviceName (line 16) | get serviceName() {
FILE: server/src/controllers/maintenanceWindowController.ts
type IMaintenanceWindowController (line 14) | interface IMaintenanceWindowController {
class MaintenanceWindowController (line 22) | class MaintenanceWindowController implements IMaintenanceWindowController {
method constructor (line 24) | constructor(maintenanceWindowService: IMaintenanceWindowService) {
FILE: server/src/controllers/monitorController.ts
constant SERVICE_NAME (line 22) | const SERVICE_NAME = "monitorController";
type IMonitorController (line 24) | interface IMonitorController {
class MonitorController (line 44) | class MonitorController implements IMonitorController {
method constructor (line 49) | constructor(monitorService: IMonitorService) {
method serviceName (line 53) | get serviceName() {
FILE: server/src/controllers/notificationController.ts
constant SERVICE_NAME (line 16) | const SERVICE_NAME = "NotificationController";
type INotificationController (line 18) | interface INotificationController {
class NotificationController (line 27) | class NotificationController implements INotificationController {
method constructor (line 30) | constructor(notificationsService: INotificationsService, monitorsRepos...
FILE: server/src/controllers/queueController.ts
constant SERVICE_NAME (line 4) | const SERVICE_NAME = "JobQueueController";
type IJobQueueController (line 6) | interface IJobQueueController {
class JobQueueController (line 13) | class JobQueueController implements IJobQueueController {
method constructor (line 16) | constructor(jobQueue: ISuperSimpleQueue) {
method serviceName (line 20) | get serviceName() {
FILE: server/src/controllers/settingsController.ts
constant SERVICE_NAME (line 8) | const SERVICE_NAME = "SettingsController";
type ISettingsController (line 10) | interface ISettingsController {
class SettingsController (line 17) | class SettingsController implements ISettingsController {
method constructor (line 21) | constructor(settingsService: ISettingsService, emailService: IEmailSer...
method serviceName (line 26) | get serviceName() {
FILE: server/src/controllers/statusPageController.ts
constant SERVICE_NAME (line 16) | const SERVICE_NAME = "statusPageController";
type IStatusPageController (line 18) | interface IStatusPageController {
class StatusPageController (line 27) | class StatusPageController implements IStatusPageController {
method constructor (line 32) | constructor(statusPageService: IStatusPageService, monitorsRepository:...
method serviceName (line 38) | get serviceName() {
FILE: server/src/db/IDb.ts
type IDb (line 1) | interface IDb {
FILE: server/src/db/MongoDB.ts
constant SERVICE_NAME (line 6) | const SERVICE_NAME = "MongoDB";
class MongoDB (line 9) | class MongoDB implements IDb {
method constructor (line 15) | constructor(logger: ILogger, envSettings: EnvConfig) {
method serviceName (line 20) | get serviceName() {
FILE: server/src/db/migration/0001_migrateStatusWindowThreshold.ts
function migrateStatusWindowThreshold (line 2) | async function migrateStatusWindowThreshold() {
FILE: server/src/db/migration/0002_convertChecksToTimeSeries.ts
constant CHECKS_COLLECTION (line 4) | const CHECKS_COLLECTION = "checks";
constant BACKUP_COLLECTION (line 5) | const BACKUP_COLLECTION = "checks_backup";
constant FAILED_DOCS_COLLECTION (line 6) | const FAILED_DOCS_COLLECTION = "checks_migration_failed";
constant BATCH_SIZE (line 7) | const BATCH_SIZE = 1000;
type MigrationStats (line 9) | interface MigrationStats {
FILE: server/src/db/migration/0003_cleanupDuplicateMonitorStats.ts
function cleanupDuplicateMonitorStats (line 9) | async function cleanupDuplicateMonitorStats(): Promise<void> {
FILE: server/src/db/migration/0004_fixInfrastructureThresholds.ts
function fixInfrastructureThresholds (line 8) | async function fixInfrastructureThresholds(): Promise<void> {
FILE: server/src/db/migration/0005_migrateStatusPageTypeToArray.ts
function migrateStatusPageTypeToArray (line 5) | async function migrateStatusPageTypeToArray(): Promise<void> {
FILE: server/src/db/migration/index.ts
type MigrationEntry (line 9) | type MigrationEntry = {
FILE: server/src/db/models/AppSettings.ts
type AppSettingsDocument (line 4) | interface AppSettingsDocument extends Omit<Settings, "id" | "createdAt" ...
FILE: server/src/db/models/Check.ts
type CheckMetadataDocument (line 18) | type CheckMetadataDocument = Omit<CheckMetadata, "monitorId" | "teamId">...
type CheckDocumentBase (line 24) | type CheckDocumentBase = Omit<Check, "id" | "metadata" | "createdAt" | "...
type CheckDocument (line 30) | interface CheckDocument extends CheckDocumentBase {
FILE: server/src/db/models/GeoCheck.ts
type GeoCheckMetadataDocument (line 5) | type GeoCheckMetadataDocument = Omit<GeoCheckMetadata, "monitorId" | "te...
type GeoCheckDocumentBase (line 11) | type GeoCheckDocumentBase = Omit<GeoCheck, "id" | "metadata" | "expiry" ...
type GeoCheckDocument (line 20) | interface GeoCheckDocument extends GeoCheckDocumentBase {
FILE: server/src/db/models/Incident.ts
type IncidentDocumentBase (line 4) | type IncidentDocumentBase = Omit<Incident, "id" | "monitorId" | "teamId"...
type IncidentDocument (line 14) | interface IncidentDocument extends IncidentDocumentBase {
FILE: server/src/db/models/Invite.ts
type InviteDocumentBase (line 4) | type InviteDocumentBase = Omit<Invite, "id" | "teamId" | "createdAt" | "...
type InviteDocument (line 9) | interface InviteDocument extends InviteDocumentBase {
FILE: server/src/db/models/MaintenanceWindow.ts
type MaintenanceWindowDocumentBase (line 4) | type MaintenanceWindowDocumentBase = Omit<MaintenanceWindow, "id" | "mon...
type MaintenanceWindowDocument (line 14) | interface MaintenanceWindowDocument extends MaintenanceWindowDocumentBase {
FILE: server/src/db/models/Monitor.ts
type CheckSnapshotDocument (line 17) | type CheckSnapshotDocument = Omit<CheckSnapshot, "createdAt"> & { create...
type MonitorDocumentBase (line 19) | type MonitorDocumentBase = Omit<
type MonitorDocument (line 30) | interface MonitorDocument extends MonitorDocumentBase {
method set (line 338) | set(value: string | null) {
FILE: server/src/db/models/MonitorStats.ts
type MonitorStatsDocumentBase (line 4) | type MonitorStatsDocumentBase = Omit<MonitorStatsEntity, "id" | "monitor...
type MonitorStatsDocument (line 8) | interface MonitorStatsDocument extends MonitorStatsDocumentBase {
FILE: server/src/db/models/Notification.ts
type NotificationDocument (line 4) | interface NotificationDocument extends Omit<Notification, "id" | "userId...
FILE: server/src/db/models/RecoveryToken.ts
type RecoveryTokenDocumentBase (line 4) | type RecoveryTokenDocumentBase = Omit<RecoveryTokenEntity, "id" | "creat...
type RecoveryTokenDocument (line 8) | interface RecoveryTokenDocument extends RecoveryTokenDocumentBase {
FILE: server/src/db/models/StatusPage.ts
type StatusPageDocumentBase (line 5) | type StatusPageDocumentBase = Omit<
type StatusPageDocument (line 15) | interface StatusPageDocument extends StatusPageDocumentBase {
FILE: server/src/db/models/Team.ts
type TeamDocumentBase (line 5) | type TeamDocumentBase = Omit<Team, "id" | "createdAt" | "updatedAt"> & {};
type TeamDocument (line 6) | interface TeamDocument extends TeamDocumentBase {
FILE: server/src/db/models/User.ts
type UserDocumentBase (line 8) | type UserDocumentBase = Omit<User, "id" | "teamId" | "createdAt" | "upda...
type UserDocument (line 13) | interface UserDocument extends UserDocumentBase {
FILE: server/src/index.ts
constant SERVICE_NAME (line 15) | const SERVICE_NAME = "Server";
FILE: server/src/middleware/isAllowed.ts
constant SERVICE_NAME (line 2) | const SERVICE_NAME = "allowedRoles";
FILE: server/src/middleware/sanitization.ts
function sanitizeInput (line 6) | function sanitizeInput(input: unknown, options = {}): unknown {
FILE: server/src/middleware/verifyJWT.ts
constant SERVICE_NAME (line 8) | const SERVICE_NAME = "verifyJWT";
constant TOKEN_PREFIX (line 9) | const TOKEN_PREFIX = "Bearer ";
FILE: server/src/repositories/checks/IChecksRepository.ts
type IChecksRepository (line 12) | interface IChecksRepository {
FILE: server/src/repositories/checks/MongoChecksRepistory.ts
constant SERVICE_NAME (line 21) | const SERVICE_NAME = "StatusService";
type LatestChecksMap (line 23) | type LatestChecksMap = Record<string, Check[]>;
type DateRange (line 24) | type DateRange = { start: Date; end: Date };
type HardwareUpChecks (line 25) | type HardwareUpChecks = { totalChecks: number };
class MongoChecksRepository (line 27) | class MongoChecksRepository implements IChecksRepository {
method constructor (line 31) | constructor(logger: ILogger) {
FILE: server/src/repositories/geo-checks/IGeoChecksRepository.ts
type GeoChecksQueryResult (line 4) | interface GeoChecksQueryResult {
type FlatGeoChecksQueryResult (line 9) | interface FlatGeoChecksQueryResult {
type IGeoChecksRepository (line 14) | interface IGeoChecksRepository {
FILE: server/src/repositories/geo-checks/MongoGeoChecksRepository.ts
constant SERVICE_NAME (line 9) | const SERVICE_NAME = "GeoChecksRepository";
class MongoGeoChecksRepository (line 11) | class MongoGeoChecksRepository implements IGeoChecksRepository {
method constructor (line 15) | constructor(logger: ILogger) {
FILE: server/src/repositories/incidents/IIncidentsRepository.ts
type IIncidentsRepository (line 3) | interface IIncidentsRepository {
FILE: server/src/repositories/incidents/MongoIncidentRepository.ts
class MongoIncidentRepository (line 8) | class MongoIncidentRepository implements IIncidentsRepository {
method buildMatchStage (line 23) | private buildMatchStage({
method create (line 78) | async create(incident: Partial<Incident>): Promise<Incident> {
FILE: server/src/repositories/invites/IInvitesRepository.ts
type IInvitesRepository (line 3) | interface IInvitesRepository {
FILE: server/src/repositories/invites/MongoInviteRepository.ts
class MongoInvitesRepository (line 8) | class MongoInvitesRepository implements IInvitesRepository {
FILE: server/src/repositories/maintenance-windows/IMaintenanceWindowsRepository.ts
type IMaintenanceWindowsRepository (line 2) | interface IMaintenanceWindowsRepository {
FILE: server/src/repositories/maintenance-windows/MongoMaintenanceWindowsRepository.ts
class MongoMaintenanceWindowsRepository (line 7) | class MongoMaintenanceWindowsRepository implements IMaintenanceWindowsRe...
FILE: server/src/repositories/monitor-stats/IMonitorStatsRepository.ts
type IMonitorStatsRepository (line 2) | interface IMonitorStatsRepository {
FILE: server/src/repositories/monitor-stats/MongoMonitorStatsRepository.ts
class MongoMonitorStatsRepository (line 6) | class MongoMonitorStatsRepository implements IMonitorStatsRepository {
FILE: server/src/repositories/monitors/IMonitorsRepository.ts
type TeamQueryConfig (line 3) | interface TeamQueryConfig {
type SummaryConfig (line 13) | interface SummaryConfig {
type IMonitorsRepository (line 17) | interface IMonitorsRepository {
FILE: server/src/repositories/monitors/MongoMonitorsRepository.ts
class MongoMonitorsRepository (line 9) | class MongoMonitorsRepository implements IMonitorsRepository {
FILE: server/src/repositories/notifications/INotificationsRepository.ts
type INotificationsRepository (line 2) | interface INotificationsRepository {
FILE: server/src/repositories/notifications/MongoNotificationsRepository.ts
class MongoNotificationsRepository (line 7) | class MongoNotificationsRepository implements INotificationsRepository {
FILE: server/src/repositories/recovery-tokens/IRecoveryTokensRepository.ts
type IRecoveryTokensRepository (line 3) | interface IRecoveryTokensRepository {
FILE: server/src/repositories/recovery-tokens/MongoRecoveryTokensRepository.ts
constant SERVICE_NAME (line 8) | const SERVICE_NAME = "MongoRecoveryTokensRepository";
class MongoRecoveryTokensRepository (line 10) | class MongoRecoveryTokensRepository implements IRecoveryTokensRepository {
FILE: server/src/repositories/settings/ISettingsRepository.ts
type ISettingsRepository (line 2) | interface ISettingsRepository {
FILE: server/src/repositories/settings/MongoSettingsRepository.ts
class MongoSettingsRepository (line 6) | class MongoSettingsRepository implements ISettingsRepository {
FILE: server/src/repositories/status-pages/IStatusPagesRepository.ts
type IStatusPagesRepository (line 3) | interface IStatusPagesRepository {
FILE: server/src/repositories/status-pages/MongoStatusPagesRepository.ts
type StatusPageUpdateData (line 8) | type StatusPageUpdateData = Partial<Omit<StatusPage, "id" | "userId" | "...
class MongoStatusPagesRepository (line 11) | class MongoStatusPagesRepository implements IStatusPagesRepository {
FILE: server/src/repositories/teams/ITeamsRepository.ts
type ITeamsRepository (line 2) | interface ITeamsRepository {
FILE: server/src/repositories/teams/MongoTeamsRepository.ts
class MongoTeamsRepository (line 6) | class MongoTeamsRepository implements ITeamsRepository {
FILE: server/src/repositories/users/IUsersRepository.ts
type IUsersRepository (line 2) | interface IUsersRepository {
FILE: server/src/repositories/users/MongoUsersRepository.ts
constant SERVICE_NAME (line 8) | const SERVICE_NAME = "MongoUsersRepository";
class MongoUsersRepository (line 10) | class MongoUsersRepository implements IUsersRepository {
FILE: server/src/routes/authRoute.ts
class AuthRoutes (line 8) | class AuthRoutes {
method constructor (line 12) | constructor(authController: IAuthController, verifyJWT: RequestHandler) {
method initRoutes (line 18) | initRoutes(verifyJWT: RequestHandler) {
method getRouter (line 39) | getRouter() {
FILE: server/src/routes/checkRoute.ts
class CheckRoutes (line 6) | class CheckRoutes {
method constructor (line 10) | constructor(checkController: ICheckController) {
method initRoutes (line 16) | initRoutes() {
method getRouter (line 24) | getRouter() {
FILE: server/src/routes/diagnosticRoute.ts
class DiagnosticRoutes (line 5) | class DiagnosticRoutes {
method constructor (line 9) | constructor(diagnosticController: IDiagnosticController, verifyJWT: Re...
method initRoutes (line 15) | initRoutes(verifyJWT: RequestHandler) {
method getRouter (line 19) | getRouter() {
FILE: server/src/routes/geoCheckRoutes.ts
class GeoCheckRoutes (line 4) | class GeoCheckRoutes {
method constructor (line 8) | constructor(geoCheckController: IGeoCheckController) {
method initRoutes (line 14) | initRoutes() {
method getRouter (line 18) | getRouter() {
FILE: server/src/routes/incidentRoute.ts
class IncidentRoutes (line 5) | class IncidentRoutes {
method constructor (line 9) | constructor(incidentController: IIncidentController) {
method initRoutes (line 15) | initRoutes() {
method getRouter (line 25) | getRouter() {
FILE: server/src/routes/inviteRoute.ts
class InviteRoutes (line 5) | class InviteRoutes {
method constructor (line 9) | constructor(inviteController: IInviteController, verifyJWT: RequestHan...
method initRoutes (line 15) | initRoutes(verifyJWT: RequestHandler) {
method getRouter (line 21) | getRouter() {
FILE: server/src/routes/logRoutes.ts
class LogRoutes (line 4) | class LogRoutes {
method constructor (line 8) | constructor(logController: ILogController) {
method initRoutes (line 13) | initRoutes() {
method getRouter (line 17) | getRouter() {
FILE: server/src/routes/maintenanceWindowRoute.ts
class MaintenanceWindowRoutes (line 4) | class MaintenanceWindowRoutes {
method constructor (line 8) | constructor(maintenanceWindowController: IMaintenanceWindowController) {
method initRoutes (line 13) | initRoutes() {
method getRouter (line 24) | getRouter() {
FILE: server/src/routes/monitorRoute.ts
class MonitorRoutes (line 5) | class MonitorRoutes {
method constructor (line 8) | constructor(monitorController: IMonitorController) {
method initRoutes (line 14) | initRoutes() {
method getRouter (line 57) | getRouter() {
FILE: server/src/routes/notificationRoute.ts
class NotificationRoutes (line 3) | class NotificationRoutes {
method constructor (line 7) | constructor(notificationController: INotificationController) {
method initializeRoutes (line 13) | initializeRoutes() {
method getRouter (line 26) | getRouter() {
FILE: server/src/routes/queueRoute.ts
class QueueRoutes (line 4) | class QueueRoutes {
method constructor (line 8) | constructor(queueController: IJobQueueController) {
method initRoutes (line 13) | initRoutes() {
method getRouter (line 21) | getRouter() {
FILE: server/src/routes/settingsRoute.ts
class SettingsRoutes (line 5) | class SettingsRoutes {
method constructor (line 9) | constructor(settingsController: ISettingsController) {
method initRoutes (line 15) | initRoutes() {
method getRouter (line 21) | getRouter() {
FILE: server/src/routes/statusPageRoute.ts
class StatusPageRoutes (line 6) | class StatusPageRoutes {
method constructor (line 10) | constructor(statusPageController: IStatusPageController, verifyJWT: Re...
method initRoutes (line 16) | initRoutes(verifyJWT: RequestHandler, verifyStatusPageAccess: RequestH...
method getRouter (line 26) | getRouter() {
FILE: server/src/service/business/checkService.ts
constant SERVICE_NAME (line 16) | const SERVICE_NAME = "checkService";
type ICheckService (line 18) | interface ICheckService {
class CheckService (line 45) | class CheckService implements ICheckService {
method constructor (line 51) | constructor(monitorsRepository: IMonitorsRepository, logger: ILogger, ...
method serviceName (line 57) | get serviceName() {
FILE: server/src/service/business/diagnosticService.ts
constant SERVICE_NAME (line 4) | const SERVICE_NAME = "diagnosticService";
type IDiagnosticService (line 6) | interface IDiagnosticService {
class DiagnosticService (line 18) | class DiagnosticService implements IDiagnosticService {
method constructor (line 21) | constructor() {
method serviceName (line 33) | get serviceName() {
FILE: server/src/service/business/geoChecksService.ts
constant SERVICE_NAME (line 10) | const SERVICE_NAME = "GeoChecksService";
type IGeoChecksService (line 12) | interface IGeoChecksService {
class GeoChecksService (line 27) | class GeoChecksService implements IGeoChecksService {
method constructor (line 35) | constructor({
method serviceName (line 52) | get serviceName() {
method buildGeoCheck (line 56) | async buildGeoCheck(monitor: Monitor): Promise<GeoCheck | null> {
method createGeoCheckDocument (line 126) | private createGeoCheckDocument(monitor: Monitor, results: GeoCheckResu...
FILE: server/src/service/business/incidentService.ts
constant SERVICE_NAME (line 1) | const SERVICE_NAME = "incidentService";
type IIncidentService (line 12) | interface IIncidentService {
class IncidentService (line 34) | class IncidentService implements IIncidentService {
method constructor (line 43) | constructor(
method serviceName (line 57) | get serviceName() {
method buildThresholdBreachMessage (line 111) | private buildThresholdBreachMessage(monitor: Monitor, monitorStatusRes...
FILE: server/src/service/business/inviteService.ts
constant SERVICE_NAME (line 8) | const SERVICE_NAME = "inviteService";
type IInviteService (line 10) | interface IInviteService {
class InviteService (line 16) | class InviteService implements IInviteService {
method constructor (line 23) | constructor({
method serviceName (line 37) | get serviceName() {
FILE: server/src/service/business/maintenanceWindowService.ts
constant SERVICE_NAME (line 5) | const SERVICE_NAME = "maintenanceWindowService";
type IMaintenanceWindowService (line 7) | interface IMaintenanceWindowService {
class MaintenanceWindowService (line 33) | class MaintenanceWindowService implements IMaintenanceWindowService {
method constructor (line 38) | constructor({
method serviceName (line 49) | get serviceName() {
FILE: server/src/service/business/monitorService.ts
constant SERVICE_NAME (line 29) | const SERVICE_NAME = "MonitorService";
type DateRangeKey (line 30) | type DateRangeKey = "recent" | "day" | "week" | "month" | "all";
type IMonitorService (line 32) | interface IMonitorService {
class MonitorService (line 87) | class MonitorService implements IMonitorService {
method constructor (line 101) | constructor({
method serviceName (line 136) | get serviceName(): string {
FILE: server/src/service/business/statusPageService.ts
type IStatusPageService (line 3) | interface IStatusPageService {
class StatusPageService (line 12) | class StatusPageService implements IStatusPageService {
method constructor (line 14) | constructor(statusPagesRepository: IStatusPagesRepository) {
FILE: server/src/service/business/userService.ts
type CryptoType (line 19) | type CryptoType = typeof crypto;
type JwtType (line 20) | type JwtType = typeof jwt;
constant SERVICE_NAME (line 21) | const SERVICE_NAME = "userService";
type IUserService (line 23) | interface IUserService {
class UserService (line 46) | class UserService implements IUserService {
method constructor (line 67) | constructor({
method serviceName (line 108) | get serviceName() {
FILE: server/src/service/infrastructure/SuperSimpleQueue/SuperSimpleQueue.ts
constant SERVICE_NAME (line 6) | const SERVICE_NAME = "JobQueue";
type QueueJobFailure (line 8) | type QueueJobFailure = {
type QueueMetrics (line 17) | type QueueMetrics = {
type QueueJobSummary (line 26) | type QueueJobSummary = {
type ISuperSimpleQueue (line 42) | interface ISuperSimpleQueue {
class SuperSimpleQueue (line 57) | class SuperSimpleQueue implements ISuperSimpleQueue {
method constructor (line 65) | constructor(logger: ILogger, helper: ISuperSimpleQueueHelper, monitors...
method serviceName (line 72) | get serviceName() {
method create (line 76) | static async create(logger: ILogger, helper: ISuperSimpleQueueHelper, ...
FILE: server/src/service/infrastructure/SuperSimpleQueue/SuperSimpleQueueHelper.ts
constant SERVICE_NAME (line 1) | const SERVICE_NAME = "JobQueueHelper";
type ISuperSimpleQueueHelper (line 27) | interface ISuperSimpleQueueHelper {
type MonitorActionDecision (line 36) | interface MonitorActionDecision {
class SuperSimpleQueueHelper (line 50) | class SuperSimpleQueueHelper implements ISuperSimpleQueueHelper {
method constructor (line 70) | constructor(
method serviceName (line 106) | get serviceName() {
method isInMaintenanceWindow (line 357) | async isInMaintenanceWindow(monitorId: string, teamId: string) {
method evaluateMonitorAction (line 421) | private evaluateMonitorAction(statusChangeResult: StatusChangeResult):...
FILE: server/src/service/infrastructure/bufferService.ts
constant SERVICE_NAME (line 7) | const SERVICE_NAME = "BufferService";
type IBufferService (line 9) | interface IBufferService {
class BufferService (line 18) | class BufferService implements IBufferService {
method constructor (line 29) | constructor(logger: ILogger, checkService: ICheckService, geoChecksSer...
method serviceName (line 45) | get serviceName() {
method addToBuffer (line 49) | addToBuffer(check: Check) {
method addGeoCheckToBuffer (line 62) | addGeoCheckToBuffer(geoCheck: GeoCheck) {
method removeCheckFromBuffer (line 75) | removeCheckFromBuffer(checkToRemove: Check) {
method scheduleNextFlush (line 113) | scheduleNextFlush() {
method flushBuffer (line 134) | async flushBuffer() {
method flushGeoBuffer (line 157) | async flushGeoBuffer() {
FILE: server/src/service/infrastructure/emailService.ts
constant SERVICE_NAME (line 13) | const SERVICE_NAME = "EmailService";
type MjmlFn (line 14) | type MjmlFn = typeof mjml2html;
type FileSystem (line 15) | type FileSystem = typeof fs;
type PathModule (line 16) | type PathModule = typeof path;
type Mailer (line 17) | type Mailer = typeof nodemailer;
type TemplateCompiler (line 18) | type TemplateCompiler = (template: string) => (context: Record<string, u...
type IEmailService (line 20) | interface IEmailService {
class EmailService (line 26) | class EmailService implements IEmailService {
method constructor (line 40) | constructor(
method serviceName (line 61) | get serviceName() {
FILE: server/src/service/infrastructure/globalPingService.ts
constant SERVICE_NAME (line 7) | const SERVICE_NAME = "GlobalPingService";
constant GLOBAL_PING_API_BASE (line 8) | const GLOBAL_PING_API_BASE = "https://api.globalping.io/v1";
constant POLL_INTERVAL_MS (line 9) | const POLL_INTERVAL_MS = 2000;
constant MAX_POLL_TIMEOUT_MS (line 10) | const MAX_POLL_TIMEOUT_MS = 30000;
type GlobalPingMeasurementRequest (line 12) | interface GlobalPingMeasurementRequest {
type GlobalPingMeasurementResponse (line 19) | interface GlobalPingMeasurementResponse {
type GlobalPingProbeResult (line 27) | interface GlobalPingProbeResult {
type IGlobalPingService (line 62) | interface IGlobalPingService {
class GlobalPingService (line 68) | class GlobalPingService implements IGlobalPingService {
method constructor (line 73) | constructor(logger: ILogger) {
method serviceName (line 77) | get serviceName() {
method createMeasurement (line 81) | async createMeasurement(monitorType: MonitorType, url: string, locatio...
method pollForResults (line 122) | async pollForResults(measurementId: string, timeoutMs: number = MAX_PO...
method transformResults (line 177) | private transformResults(probeResults: GlobalPingProbeResult[]): GeoCh...
method sleep (line 232) | private sleep(ms: number): Promise<void> {
FILE: server/src/service/infrastructure/network/AdvancedMatcher.ts
type JmesPath (line 3) | type JmesPath = typeof jmespath;
type IAdvancedMatcher (line 5) | interface IAdvancedMatcher {
class AdvancedMatcher (line 9) | class AdvancedMatcher implements IAdvancedMatcher {
method constructor (line 10) | constructor(private jmespath: JmesPath) {}
method compare (line 12) | private compare(actual: unknown, expected: string, method?: string): b...
method validate (line 19) | validate<T>(payload: T, monitor: Monitor): { ok: boolean; message: str...
FILE: server/src/service/infrastructure/network/DockerProvider.ts
type DockerodeType (line 9) | type DockerodeType = typeof Dockerode;
constant SERVICE_NAME (line 11) | const SERVICE_NAME = "DockerProvider";
type DockerError (line 13) | interface DockerError extends Error {
class DockerProvider (line 19) | class DockerProvider implements IStatusProvider<DockerStatusPayload> {
method constructor (line 22) | constructor(
method supports (line 29) | supports(type: MonitorType): boolean {
method isDockerError (line 33) | private isDockerError(error: unknown): error is DockerError {
method handle (line 37) | async handle(monitor: Monitor): Promise<MonitorStatusResponse<DockerSt...
FILE: server/src/service/infrastructure/network/GameProvider.ts
type GameDigType (line 9) | type GameDigType = typeof GameDig;
constant SERVICE_NAME (line 11) | const SERVICE_NAME = "GameProvider";
class GameProvider (line 12) | class GameProvider implements IStatusProvider<GameStatusPayload> {
method constructor (line 14) | constructor(
method supports (line 19) | supports(type: MonitorType): boolean {
method handle (line 23) | async handle(monitor: Monitor): Promise<MonitorStatusResponse<GameStat...
FILE: server/src/service/infrastructure/network/GrpcProvider.ts
type GrpcType (line 12) | type GrpcType = typeof grpc;
type ProtoLoaderType (line 13) | type ProtoLoaderType = typeof protoLoader;
constant SERVICE_NAME (line 15) | const SERVICE_NAME = "GrpcProvider";
class GrpcProvider (line 17) | class GrpcProvider implements IStatusProvider<GrpcStatusPayload> {
method constructor (line 19) | constructor(
method supports (line 24) | supports(type: MonitorType): boolean {
method getGrpcStatusName (line 28) | private getGrpcStatusName(code: number): string {
method handle (line 51) | async handle(monitor: Monitor): Promise<MonitorStatusResponse<GrpcStat...
FILE: server/src/service/infrastructure/network/HardwareProvider.ts
class HardwareProvider (line 7) | class HardwareProvider implements IStatusProvider<HardwareStatusPayload> {
method constructor (line 9) | constructor(private httpProvider: HttpProvider) {}
method supports (line 11) | supports(type: MonitorType) {
method handle (line 15) | async handle(monitor: Monitor): Promise<MonitorStatusResponse<Hardware...
FILE: server/src/service/infrastructure/network/HttpProvider.ts
class HttpProvider (line 11) | class HttpProvider implements IStatusProvider<HttpStatusPayload> {
method constructor (line 14) | constructor(
method supports (line 28) | supports(type: MonitorType) {
method handleHttpError (line 32) | private handleHttpError<T>(error: unknown, monitor: Monitor): MonitorS...
method handle (line 59) | async handle<T>(monitor: Monitor): Promise<MonitorStatusResponse<T>> {
FILE: server/src/service/infrastructure/network/IStatusProvider.ts
type IStatusProvider (line 4) | interface IStatusProvider<T> {
FILE: server/src/service/infrastructure/network/PageSpeedProvider.ts
class PageSpeedProvider (line 9) | class PageSpeedProvider implements IStatusProvider<PageSpeedStatusPayloa...
method constructor (line 11) | constructor(
method supports (line 17) | supports(type: MonitorType) {
method handle (line 21) | async handle(monitor: Monitor): Promise<MonitorStatusResponse<PageSpee...
FILE: server/src/service/infrastructure/network/PingProvider.ts
constant SERVICE_NAME (line 8) | const SERVICE_NAME = "PingProvider";
type Ping (line 10) | type Ping = typeof ping;
class PingProvider (line 12) | class PingProvider implements IStatusProvider<PingStatusPayload> {
method constructor (line 15) | constructor(private ping: Ping) {}
method supports (line 17) | supports(type: MonitorType): boolean {
method sanitizeHost (line 21) | private sanitizeHost(url: string): string {
method handle (line 28) | async handle(monitor: Monitor): Promise<MonitorStatusResponse<PingStat...
FILE: server/src/service/infrastructure/network/PortProvider.ts
type NetType (line 7) | type NetType = typeof net;
constant SERVICE_NAME (line 9) | const SERVICE_NAME = "PortProvider";
class PortProvider (line 11) | class PortProvider implements IStatusProvider<PortStatusPayload> {
method constructor (line 14) | constructor(private net: NetType) {}
method supports (line 16) | supports(type: MonitorType): boolean {
method handle (line 20) | async handle(monitor: Monitor): Promise<MonitorStatusResponse<PortStat...
FILE: server/src/service/infrastructure/network/WebSocketProvider.ts
type WebSocketConstructor (line 8) | type WebSocketConstructor = typeof WebSocket;
constant SERVICE_NAME (line 10) | const SERVICE_NAME = "WebSocketProvider";
constant TIMEOUT_MS (line 11) | const TIMEOUT_MS = 10000;
class WebSocketProvider (line 13) | class WebSocketProvider implements IStatusProvider<WebSocketStatusPayloa...
method constructor (line 16) | constructor(private WS: WebSocketConstructor) {}
method supports (line 18) | supports(type: MonitorType): boolean {
method handle (line 22) | async handle(monitor: Monitor): Promise<MonitorStatusResponse<WebSocke...
FILE: server/src/service/infrastructure/network/utils.ts
constant NETWORK_ERROR (line 13) | const NETWORK_ERROR = 5000;
constant PING_ERROR (line 14) | const PING_ERROR = 5001;
FILE: server/src/service/infrastructure/networkService.ts
constant SERVICE_NAME (line 7) | const SERVICE_NAME = "NetworkService";
type INetworkService (line 9) | interface INetworkService {
class NetworkService (line 26) | class NetworkService implements INetworkService {
method constructor (line 32) | constructor(
method serviceName (line 41) | get serviceName(): string {
method requestStatus (line 46) | async requestStatus<T extends MonitorType>(monitor: Monitor & { type: ...
method handleUnsupportedType (line 54) | private async handleUnsupportedType(type: string): Promise<MonitorStat...
method requestWebhook (line 66) | async requestWebhook(type: string, url: string, body: unknown) {
method requestPagerDuty (line 108) | async requestPagerDuty({ message, routingKey, monitorUrl }: { message:...
method requestMatrix (line 137) | async requestMatrix({
FILE: server/src/service/infrastructure/notificationMessageBuilder.ts
type INotificationMessageBuilder (line 11) | interface INotificationMessageBuilder {
constant SERVICE_NAME (line 21) | const SERVICE_NAME = "NotificationMessageBuilder";
class NotificationMessageBuilder (line 23) | class NotificationMessageBuilder implements INotificationMessageBuilder {
method buildMessage (line 26) | buildMessage(
method determineNotificationType (line 55) | private determineNotificationType(decision: MonitorActionDecision, mon...
method determineSeverity (line 80) | private determineSeverity(type: NotificationType): NotificationSeverity {
method buildContent (line 96) | private buildContent(type: NotificationType, monitor: Monitor, monitor...
method buildMonitorDownContent (line 111) | private buildMonitorDownContent(monitor: Monitor, monitorStatusRespons...
method buildMonitorUpContent (line 134) | private buildMonitorUpContent(monitor: Monitor): NotificationContent {
method buildThresholdBreachContent (line 147) | private buildThresholdBreachContent(monitor: Monitor, monitorStatusRes...
method buildThresholdResolvedContent (line 163) | private buildThresholdResolvedContent(monitor: Monitor): NotificationC...
method buildDefaultContent (line 176) | private buildDefaultContent(monitor: Monitor): NotificationContent {
method extractThresholdBreaches (line 185) | public extractThresholdBreaches(monitor: Monitor, monitorStatusRespons...
FILE: server/src/service/infrastructure/notificationProviders/INotificationProvider.ts
type INotificationProvider (line 4) | interface INotificationProvider {
FILE: server/src/service/infrastructure/notificationProviders/discord.ts
constant SERVICE_NAME (line 1) | const SERVICE_NAME = "DiscordProvider";
class DiscordProvider (line 9) | class DiscordProvider implements INotificationProvider {
method constructor (line 12) | constructor(logger: ILogger) {
method sendMessage (line 40) | async sendMessage(notification: Notification, message: NotificationMes...
method buildDiscordEmbed (line 72) | private buildDiscordEmbed(message: NotificationMessage): AlertDiscordP...
FILE: server/src/service/infrastructure/notificationProviders/email.ts
constant SERVICE_NAME (line 1) | const SERVICE_NAME = "EmailProvider";
class EmailProvider (line 8) | class EmailProvider implements INotificationProvider {
method constructor (line 12) | constructor(emailService: IEmailService, logger: ILogger) {
method sendTestAlert (line 17) | async sendTestAlert(notification: Partial<Notification>): Promise<bool...
method sendMessage (line 51) | async sendMessage(notification: Notification, message: NotificationMes...
method buildSubject (line 80) | private buildSubject(message: NotificationMessage): string {
method buildEmailFromMessage (line 95) | private async buildEmailFromMessage(message: NotificationMessage): Pro...
method getColorForSeverity (line 121) | private getColorForSeverity(severity: string): string {
FILE: server/src/service/infrastructure/notificationProviders/matrix.ts
constant SERVICE_NAME (line 1) | const SERVICE_NAME = "MatrixProvider";
class MatrixProvider (line 9) | class MatrixProvider implements INotificationProvider {
method constructor (line 12) | constructor(logger: ILogger) {
method buildMatrixMessage (line 88) | private buildMatrixMessage(message: NotificationMessage): AlertMatrixP...
method escapeHtml (line 181) | private escapeHtml(text: string): string {
FILE: server/src/service/infrastructure/notificationProviders/pagerduty.ts
constant SERVICE_NAME (line 1) | const SERVICE_NAME = "PagerDutyProvider";
class PagerDutyProvider (line 10) | class PagerDutyProvider implements INotificationProvider {
method constructor (line 13) | constructor(logger: ILogger) {
method sendTestAlert (line 17) | async sendTestAlert(notification: Partial<Notification>): Promise<bool...
method sendMessage (line 48) | async sendMessage(notification: Notification, message: NotificationMes...
method buildPagerDutyPayload (line 81) | private buildPagerDutyPayload(notification: Notification, message: Not...
FILE: server/src/service/infrastructure/notificationProviders/slack.ts
constant SERVICE_NAME (line 1) | const SERVICE_NAME = "SlackProvider";
class SlackProvider (line 9) | class SlackProvider implements INotificationProvider {
method constructor (line 12) | constructor(logger: ILogger) {
method sendTestAlert (line 16) | async sendTestAlert(notification: Partial<Notification>): Promise<bool...
method sendMessage (line 44) | async sendMessage(notification: Notification, message: NotificationMes...
method buildSlackPayload (line 80) | private buildSlackPayload(message: NotificationMessage): object {
FILE: server/src/service/infrastructure/notificationProviders/teams.ts
constant SERVICE_NAME (line 1) | const SERVICE_NAME = "TeamsProvider";
type TextBlock (line 10) | type TextBlock = {
type ColumnSet (line 21) | type ColumnSet = {
type Fact (line 28) | type Fact = {
type FactSet (line 33) | type FactSet = {
type Action (line 38) | type Action = {
type AdaptiveCard (line 44) | type AdaptiveCard = {
type TeamsMessage (line 52) | type TeamsMessage = {
class TeamsProvider (line 61) | class TeamsProvider implements INotificationProvider {
method constructor (line 64) | constructor(logger: ILogger) {
method sendTestAlert (line 68) | async sendTestAlert(notification: Partial<Notification>): Promise<bool...
method sendMessage (line 107) | async sendMessage(notification: Notification, message: NotificationMes...
method wrapAdaptiveCard (line 142) | private wrapAdaptiveCard(card: AdaptiveCard): TeamsMessage {
method buildAdaptiveCard (line 158) | private buildAdaptiveCard(message: NotificationMessage): AdaptiveCard {
FILE: server/src/service/infrastructure/notificationProviders/webhook.ts
constant SERVICE_NAME (line 1) | const SERVICE_NAME = "WebhookProvider";
class WebhookProvider (line 9) | class WebhookProvider implements INotificationProvider {
method constructor (line 12) | constructor(logger: ILogger) {
method buildWebhookPayload (line 49) | private buildWebhookPayload(message: NotificationMessage): object {
FILE: server/src/service/infrastructure/notificationsService.ts
type INotificationsService (line 10) | interface INotificationsService {
constant SERVICE_NAME (line 22) | const SERVICE_NAME = "NotificationsService";
class NotificationsService (line 24) | class NotificationsService implements INotificationsService {
method constructor (line 40) | constructor(
FILE: server/src/service/infrastructure/statusService.ts
constant SERVICE_NAME (line 23) | const SERVICE_NAME = "StatusService";
type IStatusService (line 25) | interface IStatusService {
class StatusService (line 43) | class StatusService implements IStatusService {
method constructor (line 51) | constructor(
method serviceName (line 65) | get serviceName() {
method updateRunningStats (line 69) | async updateRunningStats(monitor: Monitor, networkResponse: MonitorSta...
FILE: server/src/service/system/settingsService.ts
constant SERVICE_NAME (line 6) | const SERVICE_NAME = "SettingsService";
type EnvConfig (line 8) | type EnvConfig = {
type ISettingsService (line 17) | interface ISettingsService {
class SettingsService (line 25) | class SettingsService implements ISettingsService {
method constructor (line 30) | constructor(settingsRepository: ISettingsRepository, env: ValidatedEnv) {
method serviceName (line 42) | get serviceName() {
method loadSettings (line 46) | loadSettings() {
method getSettings (line 50) | getSettings() {
FILE: server/src/types/alert.ts
type AlertWebhookPayload (line 2) | interface AlertWebhookPayload {
type AlertPagerDutyPayload (line 6) | interface AlertPagerDutyPayload {
type AlertMatrixPayload (line 13) | interface AlertMatrixPayload {
type DiscordEmbedField (line 18) | interface DiscordEmbedField {
type AlertDiscordPayload (line 24) | interface AlertDiscordPayload {
type Alert (line 32) | interface Alert {
FILE: server/src/types/check.ts
constant CHECK_TTL_SENTINEL (line 4) | const CHECK_TTL_SENTINEL = 366;
type GotTimings (line 6) | type GotTimings = Response["timings"];
type CheckMetadata (line 8) | interface CheckMetadata {
type CheckCpuInfo (line 14) | interface CheckCpuInfo {
type CheckMemoryInfo (line 24) | interface CheckMemoryInfo {
type CheckHostInfo (line 31) | interface CheckHostInfo {
type CheckCaptureInfo (line 38) | interface CheckCaptureInfo {
type CheckDiskInfo (line 43) | interface CheckDiskInfo {
type CheckErrorInfo (line 60) | interface CheckErrorInfo {
type CheckNetworkInterfaceInfo (line 65) | interface CheckNetworkInterfaceInfo {
type CheckAudits (line 79) | interface CheckAudits {
type ILighthouseAudit (line 87) | interface ILighthouseAudit {
type Check (line 96) | interface Check {
type ChecksQueryResult (line 119) | interface ChecksQueryResult {
type PageSpeedChecksResult (line 124) | interface PageSpeedChecksResult {
type HardwareChecksResult (line 129) | interface HardwareChecksResult {
type GroupedCheck (line 166) | interface GroupedCheck {
type PageSpeedGroupedCheck (line 172) | interface PageSpeedGroupedCheck {
type UptimeChecksResult (line 181) | interface UptimeChecksResult {
type ChecksSummary (line 190) | interface ChecksSummary {
type HasResponseTime (line 195) | interface HasResponseTime {
type NormalizedCheck (line 199) | type NormalizedCheck<T extends HasResponseTime = Check> = T & {
type NormalizedUptimeCheck (line 203) | type NormalizedUptimeCheck<T extends GroupedCheck = GroupedCheck> = T & {
type CheckSnapshot (line 207) | type CheckSnapshot = Omit<Check, "metadata" | "updatedAt">;
FILE: server/src/types/email.ts
type EmailTransportConfig (line 3) | type EmailTransportConfig = Pick<
FILE: server/src/types/express.d.ts
type Request (line 5) | interface Request {
FILE: server/src/types/geoCheck.ts
type GeoContinent (line 4) | type GeoContinent = (typeof GeoContinents)[number];
type GeoCheckMetadata (line 6) | interface GeoCheckMetadata {
type GeoCheckTimings (line 12) | interface GeoCheckTimings {
type GeoCheckLocation (line 21) | interface GeoCheckLocation {
type GeoCheckResult (line 31) | interface GeoCheckResult {
type GeoCheck (line 38) | interface GeoCheck {
type FlatGeoCheck (line 48) | interface FlatGeoCheck {
type GroupedGeoCheck (line 61) | interface GroupedGeoCheck {
type GeoChecksResult (line 69) | interface GeoChecksResult {
FILE: server/src/types/incident.ts
type IncidentResolutionType (line 4) | type IncidentResolutionType = (typeof IncidentResolutionTypes)[number];
type Incident (line 6) | interface Incident {
type IncidentSummaryTopMonitor (line 23) | interface IncidentSummaryTopMonitor {
type IncidentSummaryItem (line 29) | interface IncidentSummaryItem {
type IncidentSummary (line 42) | interface IncidentSummary {
FILE: server/src/types/invite.ts
type Invite (line 3) | interface Invite {
FILE: server/src/types/maintenanceWindow.ts
type DurationUnit (line 1) | type DurationUnit = "seconds" | "minutes" | "hours" | "days";
type MaintenanceWindow (line 3) | interface MaintenanceWindow {
FILE: server/src/types/monitor.ts
type MonitorType (line 7) | type MonitorType = (typeof MonitorTypes)[number];
type MonitorStatus (line 13) | type MonitorStatus = (typeof MonitorStatuses)[number];
type MonitorMatchMethod (line 16) | type MonitorMatchMethod = (typeof MonitorMatchMethods)[number] | "";
type Monitor (line 18) | interface Monitor {
type MonitorsSummary (line 61) | interface MonitorsSummary {
type MonitorsWithChecksByTeamIdResult (line 71) | interface MonitorsWithChecksByTeamIdResult {
type GroupedGeoCheckResult (line 77) | interface GroupedGeoCheckResult {
type UptimeDetailsResult (line 81) | interface UptimeDetailsResult {
type HardwareDiskStats (line 93) | interface HardwareDiskStats {
type HardwareNetStats (line 102) | interface HardwareNetStats {
type HardwareCheckStats (line 116) | interface HardwareCheckStats {
type HardwareStats (line 125) | interface HardwareStats {
type HardwareDetailsResult (line 135) | interface HardwareDetailsResult {
type PageSpeedDetailsResult (line 141) | interface PageSpeedDetailsResult {
type Game (line 149) | interface Game {
type GamesMap (line 162) | type GamesMap = Record<string, Game>;
FILE: server/src/types/monitorStats.ts
type MonitorStats (line 1) | interface MonitorStats {
FILE: server/src/types/network.ts
type MonitorStatusResponse (line 19) | interface MonitorStatusResponse<
type PingStatusPayload (line 51) | interface PingStatusPayload {
type HttpStatusPayload (line 65) | type HttpStatusPayload = unknown;
type PageSpeedCategoryScore (line 67) | interface PageSpeedCategoryScore {
type PageSpeedStatusPayload (line 71) | interface PageSpeedStatusPayload {
type HardwareStatusMetrics (line 85) | interface HardwareStatusMetrics {
type HardwareStatusPayload (line 93) | interface HardwareStatusPayload {
type DockerStatusPayload (line 100) | type DockerStatusPayload = Record<string, unknown>;
type PortStatusPayload (line 102) | interface PortStatusPayload {
type GameStatusPayload (line 106) | type GameStatusPayload = QueryResult;
type GrpcStatusPayload (line 108) | interface GrpcStatusPayload {
type WebSocketStatusPayload (line 115) | interface WebSocketStatusPayload {
type MonitorPayloadMap (line 119) | interface MonitorPayloadMap {
type StatusChangeResult (line 132) | type StatusChangeResult = {
type MonitorStatusResponseOverrides (line 146) | type MonitorStatusResponseOverrides<T> = Partial<Omit<MonitorStatusRespo...
FILE: server/src/types/notification.ts
type NotificationChannel (line 2) | type NotificationChannel = (typeof NotificationChannels)[number];
type Notification (line 4) | interface Notification {
FILE: server/src/types/notificationMessage.ts
type NotificationType (line 6) | type NotificationType = "monitor_down" | "monitor_up" | "threshold_breac...
type NotificationSeverity (line 8) | type NotificationSeverity = "critical" | "warning" | "info" | "success";
type MonitorInfo (line 10) | interface MonitorInfo {
type ThresholdBreach (line 18) | interface ThresholdBreach {
type IncidentInfo (line 26) | interface IncidentInfo {
type NotificationContent (line 34) | interface NotificationContent {
type NotificationMessage (line 43) | interface NotificationMessage {
FILE: server/src/types/recoveryToken.ts
type RecoveryToken (line 1) | interface RecoveryToken {
FILE: server/src/types/settings.ts
type SettingsThresholds (line 1) | interface SettingsThresholds {
type SettingsUpdate (line 8) | type SettingsUpdate = {
type Settings (line 12) | interface Settings {
FILE: server/src/types/ssl-checker.d.ts
type SSLDetails (line 4) | interface SSLDetails {
type SSLOptions (line 12) | interface SSLOptions {
FILE: server/src/types/statusPage.ts
type StatusPageType (line 2) | type StatusPageType = (typeof StatusPageTypes)[number];
type StatusPageLogo (line 4) | interface StatusPageLogo {
type StatusPageLogoDocument (line 9) | interface StatusPageLogoDocument {
type StatusPage (line 14) | interface StatusPage {
FILE: server/src/types/team.ts
type Team (line 1) | interface Team {
FILE: server/src/types/user.ts
type UserRole (line 2) | type UserRole = (typeof UserRoles)[number];
type UserProfileImage (line 15) | interface UserProfileImage {
type User (line 20) | interface User {
FILE: server/src/utils/AppError.ts
type AppErrorConfig (line 1) | interface AppErrorConfig {
class AppError (line 9) | class AppError extends Error {
method constructor (line 15) | constructor({ message, status = 500, service = "unknownService", metho...
FILE: server/src/utils/logger.ts
constant SERVICE_NAME (line 7) | const SERVICE_NAME = "Logger";
type LogConfig (line 9) | interface LogConfig {
type LogEntry (line 17) | interface LogEntry extends LogConfig {
type ILogger (line 22) | interface ILogger {
class Logger (line 33) | class Logger implements ILogger {
method constructor (line 41) | constructor({ envSettings }: { envSettings: Partial<EnvConfig> }) {
method serviceName (line 104) | get serviceName() {
method info (line 108) | info(config: LogConfig) {
method warn (line 114) | warn(config: LogConfig) {
method error (line 120) | error(config: LogConfig) {
method debug (line 126) | debug(config: LogConfig) {
method cacheLog (line 132) | cacheLog(entry: LogEntry) {
method getLogs (line 139) | getLogs() {
method buildLogEntry (line 143) | buildLogEntry(level: string, config: LogConfig): LogEntry {
FILE: server/src/validation/envValidation.ts
type ValidatedEnv (line 23) | type ValidatedEnv = z.infer<typeof envSchema>;
FILE: server/src/validation/monitorValidation.ts
type ImportedMonitor (line 171) | type ImportedMonitor = z.output<typeof importedMonitorSchema>;
Condensed preview — 542 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (3,348K chars).
[
{
"path": ".coderabbit.yml",
"chars": 21,
"preview": "release_notes: false\n"
},
{
"path": ".github/CODEOWNERS",
"chars": 77,
"preview": "* @ajhollid @mohicody @Br0wnHammer @Owaiseimdad @karenvicent @shanikauwu1"
},
{
"path": ".github/FUNDING.yml",
"chars": 884,
"preview": "# These are supported funding model platforms\n\ngithub: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [u"
},
{
"path": ".github/ISSUE_TEMPLATE/bug_report.md",
"chars": 647,
"preview": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n**Describe the b"
},
{
"path": ".github/ISSUE_TEMPLATE/feature_request.md",
"chars": 595,
"preview": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n**Is your fea"
},
{
"path": ".github/pull_request_template.md",
"chars": 1510,
"preview": "**(Please remove this line only before submitting your PR. Ensure that all relevant items are checked before submission."
},
{
"path": ".github/scripts/download-translations.js",
"chars": 3443,
"preview": "import axios from \"axios\";\nimport fs from \"fs-extra\";\nimport path from \"path\";\nimport { URLSearchParams } from \"url\";\n\n/"
},
{
"path": ".github/scripts/upload-translations.js",
"chars": 2005,
"preview": "import axios from \"axios\";\nimport FormData from \"form-data\";\nimport fs from \"fs-extra\";\n\n// POEditor API information\ncon"
},
{
"path": ".github/workflows/README.md",
"chars": 3161,
"preview": "# POEditor Translation Synchronization\n\nThis GitHub Actions workflow automatically downloads translation files from POEd"
},
{
"path": ".github/workflows/check-build.yml",
"chars": 862,
"preview": "name: Build Check (Client & Server)\non:\n pull_request:\n workflow_dispatch:\n\njobs:\n build-client:\n runs-on: ubuntu-"
},
{
"path": ".github/workflows/check-format.yml",
"chars": 890,
"preview": "name: Format Check (Client & Server)\non:\n pull_request:\n workflow_dispatch:\n\njobs:\n format-client:\n runs-on: ubunt"
},
{
"path": ".github/workflows/deploy-images-on-release.yml",
"chars": 4946,
"preview": "name: Deploy images on release\n\non:\n push:\n tags:\n - \"v*\"\n workflow_dispatch:\njobs:\n docker-build-and-push-cl"
},
{
"path": ".github/workflows/deploy-images.yml",
"chars": 4490,
"preview": "name: Deploy images\n\non:\n push:\n branches: [\"master\"]\n workflow_dispatch:\njobs:\n docker-build-and-push-client:\n "
},
{
"path": ".github/workflows/poeditor-sync.yml",
"chars": 3724,
"preview": "name: POEditor Translation Synchronization\n\non:\n # For manual triggering\n workflow_dispatch:\n inputs:\n languag"
},
{
"path": ".github/workflows/production-deploy.yml",
"chars": 2846,
"preview": "name: Demo deploy\n\non:\n push:\n branches: [\"demo\"]\n workflow_dispatch:\njobs:\n docker-build-and-push-client:\n run"
},
{
"path": ".github/workflows/staging-deploy.yml",
"chars": 2910,
"preview": "name: Staging deploy\n\non:\n push:\n branches: [\"develop\"]\n\njobs:\n docker-build-and-push-client:\n runs-on: ubuntu-l"
},
{
"path": ".github/workflows/upload-poeditor.yml",
"chars": 3656,
"preview": "name: Upload Translations to POEditor on PR Merge\n\non:\n pull_request:\n types: [closed]\n branches:\n - develop"
},
{
"path": ".gitignore",
"chars": 108,
"preview": ".idea\n.vscode\n.VSCodeCounter\n*.sh\nmongo\nnode_modules/\ndocs/architecture\ndocs/reviews\ndocs/todo\ndocs/frontend"
},
{
"path": ".husky/pre-commit",
"chars": 115,
"preview": "#!/bin/sh\necho \"Running lint-staged...\"\ncd client && npx lint-staged && cd ..\ncd server && npx lint-staged && cd .."
},
{
"path": "CLAUDE.md",
"chars": 4768,
"preview": "# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.\n\n## "
},
{
"path": "CODE_OF_CONDUCT.md",
"chars": 5288,
"preview": "# Contributor Covenant Code of Conduct\r\n\r\n## Our Pledge\r\n\r\nWe as members, contributors, and leaders pledge to make parti"
},
{
"path": "CONTRIBUTING.md",
"chars": 10020,
"preview": "# Contributing to Checkmate\n\nThanks for your interest in contributing! Checkmate is an open-source, friendly project foc"
},
{
"path": "Checkmate.CodeCanvas",
"chars": 813080,
"preview": "{\n\t\"drawioXML\": \"<mxfile>\\n <diagram id=\\\"89EWfH2uZ2hayMIEMftf\\\" name=\\\"Page-1\\\">\\n <mxGraphModel dx=\\\"3249\\\" dy=\\\"1"
},
{
"path": "LICENSE",
"chars": 34523,
"preview": " GNU AFFERO GENERAL PUBLIC LICENSE\n Version 3, 19 November 2007\n\n Copyright (C)"
},
{
"path": "PULLREQUESTS.md",
"chars": 2537,
"preview": "## The Importance of Small Pull Requests\n\n\nPull requests are an integral part of our workflow, but does the scope of you"
},
{
"path": "README.es.md",
"chars": 10645,
"preview": "<p align=center> <a href=\"https://trendshift.io/repositories/12443\" target=\"_blank\"><img src=\"https://trendshift.io/api/"
},
{
"path": "README.md",
"chars": 9959,
"preview": "<p align=center> <a href=\"https://trendshift.io/repositories/12443\" target=\"_blank\"><img src=\"https://trendshift.io/api/"
},
{
"path": "SECURITY.md",
"chars": 141,
"preview": "# Security Policy\n\nIf you find a vulnerability, [create an issue here](https://github.com/bluewave-labs/checkmate/securi"
},
{
"path": "charts/helm/checkmate/.helmignore",
"chars": 127,
"preview": ".DS_Store\n.git/\n.gitignore\n.bzr/\n.bzrignore\n.hg/\n.hgignore\n.svn/\n*.swp\n*.bak\n*.tmp\n*.orig\n*~\n.project\n.idea/\n*.tmproj\n.v"
},
{
"path": "charts/helm/checkmate/Chart.yaml",
"chars": 132,
"preview": "apiVersion: v2\nname: checkmate-chart\ndescription: A Helm chart for Checkmate App\ntype: application\nversion: 0.1.0\nappVer"
},
{
"path": "charts/helm/checkmate/INSTALLATION.md",
"chars": 3547,
"preview": "# Kubernetes Installation Guide for Checkmate\n\nThis guide walks you through deploying Checkmate on your Kubernetes clust"
},
{
"path": "charts/helm/checkmate/templates/client-deployment.yaml",
"chars": 1318,
"preview": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: checkmate-client\nspec:\n replicas: 1\n selector:\n matchLabels:"
},
{
"path": "charts/helm/checkmate/templates/client-ingress.yaml",
"chars": 923,
"preview": "{{- if .Values.client.ingress.enabled }}\napiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n name: checkmate-clie"
},
{
"path": "charts/helm/checkmate/templates/client-service.yaml",
"chars": 155,
"preview": "apiVersion: v1\nkind: Service\nmetadata:\n name: checkmate-client\nspec:\n selector:\n app: checkmate-client\n ports:\n "
},
{
"path": "charts/helm/checkmate/templates/mongodb-service.yaml",
"chars": 157,
"preview": "apiVersion: v1\nkind: Service\nmetadata:\n name: checkmate-mongodb\nspec:\n selector:\n app: checkmate-mongodb\n ports:\n "
},
{
"path": "charts/helm/checkmate/templates/mongodb-statefulsets.yaml",
"chars": 1291,
"preview": "apiVersion: apps/v1\nkind: StatefulSet\nmetadata:\n name: checkmate-mongodb\nspec:\n replicas: 1\n selector:\n matchLabel"
},
{
"path": "charts/helm/checkmate/templates/prechecks.yaml",
"chars": 2589,
"preview": "{{- if eq .Values.client.ingress.host \"change_me\" }}\n {{- fail \"client.ingress.host must be overridden and not set to '"
},
{
"path": "charts/helm/checkmate/templates/redis-service.yaml",
"chars": 195,
"preview": "{{- if .Values.redis.enabled }}\napiVersion: v1\nkind: Service\nmetadata:\n name: checkmate-redis\nspec:\n selector:\n app"
},
{
"path": "charts/helm/checkmate/templates/redis-statefulsets.yaml",
"chars": 849,
"preview": "{{- if .Values.redis.enabled }}\napiVersion: apps/v1\nkind: StatefulSet\nmetadata:\n name: checkmate-redis\nspec:\n replicas"
},
{
"path": "charts/helm/checkmate/templates/secrets.yaml",
"chars": 376,
"preview": "{{- $secrets := .Values.secrets }}\n\n{{- if or (not $secrets.JWT_SECRET) (eq $secrets.JWT_SECRET \"change_me\") }}\n {{- fa"
},
{
"path": "charts/helm/checkmate/templates/server-deployment.yaml",
"chars": 987,
"preview": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: checkmate-server\nspec:\n replicas: 1\n selector:\n matchLabels:"
},
{
"path": "charts/helm/checkmate/templates/server-ingress.yaml",
"chars": 1504,
"preview": "{{- if .Values.server.ingress.enabled }}\napiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n name: checkmate-serv"
},
{
"path": "charts/helm/checkmate/templates/server-nginx-cm.yaml",
"chars": 1213,
"preview": "apiVersion: v1\nkind: ConfigMap \nmetadata:\n name: checkmate-server-nginx-cm\ndata:\n default.conf: |\n server {\n l"
},
{
"path": "charts/helm/checkmate/templates/server-service.yaml",
"chars": 155,
"preview": "apiVersion: v1\nkind: Service\nmetadata:\n name: checkmate-server\nspec:\n selector:\n app: checkmate-server\n ports:\n "
},
{
"path": "charts/helm/checkmate/values.yaml",
"chars": 2173,
"preview": "client:\n image: ghcr.io/bluewave-labs/checkmate-client:v3.2.0\n port: 80\n protocol: http\n ingress:\n enabled: true\n"
},
{
"path": "client/.coderrabbit.yaml",
"chars": 366,
"preview": "language: \"en-CA\"\ntone_instructions: \"His palms are sweaty, knees weak, arms are heavy There’s vomit on his sweater alre"
},
{
"path": "client/.dockerignore",
"chars": 54,
"preview": "Client/node_modules/\nServer/node_modules/\nServer/*.env"
},
{
"path": "client/.eslintrc.cjs",
"chars": 636,
"preview": "module.exports = {\n\troot: true,\n\tenv: { browser: true, es2020: true },\n\textends: [\n\t\t\"eslint:recommended\",\n\t\t\"plugin:rea"
},
{
"path": "client/.gitignore",
"chars": 300,
"preview": "# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\nlerna-debug.log*\n\nnode_modules\ndist\ndis"
},
{
"path": "client/.prettierrc",
"chars": 347,
"preview": "{\n\t\"printWidth\": 90,\n\t\"useTabs\": true,\n\t\"tabWidth\": 2,\n\t\"singleQuote\": false,\n\t\"bracketSpacing\": true,\n\t\"proseWrap\": \"pr"
},
{
"path": "client/README.md",
"chars": 65,
"preview": "This directory contains the client side (frontend) of Checkmate.\n"
},
{
"path": "client/env.sh",
"chars": 267,
"preview": "#!/bin/sh\nfor i in $(env | grep UPTIME_APP_)\ndo\n key=$(echo $i | cut -d '=' -f 1)\n value=$(echo $i | cut -d '=' -f"
},
{
"path": "client/index.html",
"chars": 362,
"preview": "<!doctype html>\n<html lang=\"en\">\n\t<head>\n\t\t<meta charset=\"UTF-8\" />\n\t\t<link\n\t\t\trel=\"icon\"\n\t\t\thref=\"./checkmate_favicon.s"
},
{
"path": "client/package.json",
"chars": 1888,
"preview": "{\n\t\"name\": \"client\",\n\t\"private\": true,\n\t\"version\": \"0.0.0\",\n\t\"type\": \"module\",\n\t\"scripts\": {\n\t\t\"dev\": \"vite\",\n\t\t\"build\":"
},
{
"path": "client/public/bulk_import_monitors_sample.csv",
"chars": 372,
"preview": "type,name,url,interval,port,expectedValue,jsonPath,matchMethod\nhttp,HTTP Monitor,https://www.google.com,60000,,,,\nhttp,A"
},
{
"path": "client/public/bulk_import_monitors_template.csv",
"chars": 62,
"preview": "type,name,url,interval,port,expectedValue,jsonPath,matchMethod"
},
{
"path": "client/renovate.json",
"chars": 133,
"preview": "{\n\t\"$schema\": \"https://docs.renovatebot.com/renovate-schema.json\",\n\t\"extends\": [\"config:recommended\"],\n\t\"labels\": [\"depe"
},
{
"path": "client/src/App.tsx",
"chars": 1438,
"preview": "import { type CSSProperties } from \"react\";\nimport { useSelector } from \"react-redux\";\nimport \"react-toastify/dist/React"
},
{
"path": "client/src/Components/LanguageSelector.jsx",
"chars": 2081,
"preview": "import { useTranslation } from \"react-i18next\";\nimport { Box, MenuItem, Select, Stack } from \"@mui/material\";\nimport { u"
},
{
"path": "client/src/Components/actions-menu/index.tsx",
"chars": 1237,
"preview": "import React, { useState } from \"react\";\nimport Menu from \"@mui/material/Menu\";\nimport MenuItem from \"@mui/material/Menu"
},
{
"path": "client/src/Components/common/charts/HeatmapResponseTime.tsx",
"chars": 3474,
"preview": "import Box from \"@mui/material/Box\";\nimport { useTheme } from \"@mui/material/styles\";\nimport type { CheckSnapshot } from"
},
{
"path": "client/src/Components/common/charts/HeatmapResponseTimeTooltip.tsx",
"chars": 2028,
"preview": "import Stack from \"@mui/material/Stack\";\nimport Tooltip from \"@mui/material/Tooltip\";\nimport Typography from \"@mui/mater"
},
{
"path": "client/src/Components/common/charts/HistogramResponseTime.tsx",
"chars": 4180,
"preview": "import Box from \"@mui/material/Box\";\nimport Stack from \"@mui/material/Stack\";\nimport Typography from \"@mui/material/Typo"
},
{
"path": "client/src/Components/common/controls/HeaderCreate.tsx",
"chars": 863,
"preview": "import { Stack } from \"@mui/material\";\nimport { useNavigate } from \"react-router-dom\";\nimport { ButtonInput } from \"../."
},
{
"path": "client/src/Components/common/controls/HeaderTimeRange.tsx",
"chars": 2111,
"preview": "import Stack from \"@mui/material/Stack\";\nimport Box from \"@mui/material/Box\";\nimport Typography from \"@mui/material/Typo"
},
{
"path": "client/src/Components/common/index.ts",
"chars": 232,
"preview": "export * from \"./charts/HistogramResponseTime\";\nexport * from \"./charts/HeatmapResponseTime\";\nexport * from \"./charts/He"
},
{
"path": "client/src/Components/design-elements/Avatar.tsx",
"chars": 1296,
"preview": "import { Avatar as MuiAvatar } from \"@mui/material\";\nimport { useSelector } from \"react-redux\";\nimport { useEffect, useS"
},
{
"path": "client/src/Components/design-elements/BaseBox.tsx",
"chars": 435,
"preview": "import Box, { type BoxProps } from \"@mui/material/Box\";\nimport { useTheme } from \"@mui/material/styles\";\n\nexport const B"
},
{
"path": "client/src/Components/design-elements/BaseChart.tsx",
"chars": 1579,
"preview": "import { BaseBox } from \".\";\nimport Stack from \"@mui/material/Stack\";\nimport Box from \"@mui/material/Box\";\nimport Typogr"
},
{
"path": "client/src/Components/design-elements/BasePage.tsx",
"chars": 5102,
"preview": "import Logo from \"@/assets/icons/checkmate-icon.svg?react\";\nimport Stack from \"@mui/material/Stack\";\nimport Box from \"@m"
},
{
"path": "client/src/Components/design-elements/Breadcrumb.tsx",
"chars": 3430,
"preview": "import MuiBreadcrumbs from \"@mui/material/Breadcrumbs\";\nimport Typography from \"@mui/material/Typography\";\nimport { Link"
},
{
"path": "client/src/Components/design-elements/BulletPointCheck.tsx",
"chars": 1080,
"preview": "import Stack from \"@mui/material/Stack\";\nimport Typography from \"@mui/material/Typography\";\nimport { Check } from \"lucid"
},
{
"path": "client/src/Components/design-elements/Dot.tsx",
"chars": 389,
"preview": "import type { CSSProperties } from \"react\";\n\ninterface DotProps {\n\tcolor?: string;\n\tsize?: string;\n\tstyle?: CSSPropertie"
},
{
"path": "client/src/Components/design-elements/Fallback.tsx",
"chars": 3694,
"preview": "import Stack from \"@mui/material/Stack\";\nimport Typography from \"@mui/material/Typography\";\nimport { BulletPointCheck, S"
},
{
"path": "client/src/Components/design-elements/Gauge.tsx",
"chars": 3413,
"preview": "import { BaseChart } from \"@/Components/design-elements\";\nimport Stack from \"@mui/material/Stack\";\nimport Box from \"@mui"
},
{
"path": "client/src/Components/design-elements/Icon.tsx",
"chars": 322,
"preview": "import type { LucideIcon } from \"lucide-react\";\n\ninterface IconProps {\n\ticon: LucideIcon;\n\tsize?: number;\n\tstrokeWidth?:"
},
{
"path": "client/src/Components/design-elements/MonitorStatus.tsx",
"chars": 1487,
"preview": "import type { Monitor } from \"@/Types/Monitor\";\nimport Stack from \"@mui/material/Stack\";\nimport Typography from \"@mui/ma"
},
{
"path": "client/src/Components/design-elements/OfflineBanner.tsx",
"chars": 1565,
"preview": "import Box from \"@mui/material/Box\";\nimport Stack from \"@mui/material/Stack\";\nimport Typography from \"@mui/material/Typo"
},
{
"path": "client/src/Components/design-elements/PulseDot.tsx",
"chars": 1175,
"preview": "import Box from \"@mui/material/Box\";\nimport Stack from \"@mui/material/Stack\";\nimport { useTheme, keyframes } from \"@mui/"
},
{
"path": "client/src/Components/design-elements/SkeletonCard.tsx",
"chars": 3546,
"preview": "import { Box, Stack, useTheme } from \"@mui/material\";\n\ninterface SkeletonCardProps {\n\twidth?: number | string | { xs?: n"
},
{
"path": "client/src/Components/design-elements/SplitBox.tsx",
"chars": 1795,
"preview": "import Stack from \"@mui/material/Stack\";\nimport Box from \"@mui/material/Box\";\nimport Typography from \"@mui/material/Typo"
},
{
"path": "client/src/Components/design-elements/StatBox.tsx",
"chars": 2293,
"preview": "import Stack from \"@mui/material/Stack\";\nimport Typography from \"@mui/material/Typography\";\nimport Box from \"@mui/materi"
},
{
"path": "client/src/Components/design-elements/StatusBox.tsx",
"chars": 4090,
"preview": "import Stack from \"@mui/material/Stack\";\nimport Typography from \"@mui/material/Typography\";\nimport Box from \"@mui/materi"
},
{
"path": "client/src/Components/design-elements/StatusLabel.tsx",
"chars": 2776,
"preview": "import Box from \"@mui/material/Box\";\nimport { BaseBox } from \"@/Components/design-elements\";\nimport Typography from \"@mu"
},
{
"path": "client/src/Components/design-elements/Table.tsx",
"chars": 14660,
"preview": "import Stack from \"@mui/material/Stack\";\nimport Grid2 from \"@mui/material/Grid\";\nimport Box from \"@mui/material/Box\";\nim"
},
{
"path": "client/src/Components/design-elements/Tabs.tsx",
"chars": 1431,
"preview": "import MuiTabs from \"@mui/material/Tabs\";\nimport type { TabsProps } from \"@mui/material/Tabs\";\nimport { useTheme } from "
},
{
"path": "client/src/Components/design-elements/TextLink.tsx",
"chars": 893,
"preview": "import Typography from \"@mui/material/Typography\";\nimport Stack from \"@mui/material/Stack\";\nimport type { StackProps } f"
},
{
"path": "client/src/Components/design-elements/Tooltip.tsx",
"chars": 1785,
"preview": "import MuiTooltip from \"@mui/material/Tooltip\";\nimport { useTheme } from \"@mui/material/styles\";\nimport { Info } from \"l"
},
{
"path": "client/src/Components/design-elements/index.tsx",
"chars": 685,
"preview": "export * from \"./Breadcrumb\";\nexport * from \"./BasePage\";\nexport * from \"./Fallback\";\nexport * from \"./SkeletonCard\";\nex"
},
{
"path": "client/src/Components/i18nLoader/index.tsx",
"chars": 432,
"preview": "import i18n from \"@/Utils/i18n.js\";\nimport { useSelector } from \"react-redux\";\nimport { useEffect } from \"react\";\nimport"
},
{
"path": "client/src/Components/inputs/AutoComplete.tsx",
"chars": 2089,
"preview": "import Autocomplete from \"@mui/material/Autocomplete\";\nimport type { AutocompleteProps } from \"@mui/material/Autocomplet"
},
{
"path": "client/src/Components/inputs/Button.tsx",
"chars": 797,
"preview": "import Button from \"@mui/material/Button\";\nimport type { ButtonProps } from \"@mui/material/Button\";\nimport { useTheme } "
},
{
"path": "client/src/Components/inputs/Checkbox.tsx",
"chars": 1207,
"preview": "import { forwardRef } from \"react\";\nimport Checkbox from \"@mui/material/Checkbox\";\nimport type { CheckboxProps } from \"@"
},
{
"path": "client/src/Components/inputs/ColorPicker.tsx",
"chars": 1227,
"preview": "import { MuiColorInput } from \"mui-color-input\";\nimport type { MuiColorInputProps } from \"mui-color-input\";\nimport { typ"
},
{
"path": "client/src/Components/inputs/DatePicker.tsx",
"chars": 2540,
"preview": "import { DatePicker } from \"@mui/x-date-pickers/DatePicker\";\nimport type { DatePickerProps } from \"@mui/x-date-pickers/D"
},
{
"path": "client/src/Components/inputs/Dialog.tsx",
"chars": 1937,
"preview": "import Dialog from \"@mui/material/Dialog\";\nimport type { DialogProps } from \"@mui/material/Dialog\";\nimport DialogActions"
},
{
"path": "client/src/Components/inputs/FieldLabel.tsx",
"chars": 788,
"preview": "import Typography from \"@mui/material/Typography\";\nimport { useTheme } from \"@mui/material/styles\";\n\ninterface FieldLabe"
},
{
"path": "client/src/Components/inputs/ImageUpload.tsx",
"chars": 4155,
"preview": "import { Box, Stack, Typography, IconButton } from \"@mui/material\";\nimport { useTheme } from \"@mui/material/styles\";\nimp"
},
{
"path": "client/src/Components/inputs/LanguageSelector.tsx",
"chars": 2317,
"preview": "import Stack from \"@mui/material/Stack\";\nimport Box from \"@mui/material/Box\";\nimport MenuItem from \"@mui/material/MenuIt"
},
{
"path": "client/src/Components/inputs/Radio.tsx",
"chars": 1878,
"preview": "import Radio from \"@mui/material/Radio\";\nimport type { RadioProps } from \"@mui/material/Radio\";\nimport { useTheme } from"
},
{
"path": "client/src/Components/inputs/Select.tsx",
"chars": 3058,
"preview": "import Select from \"@mui/material/Select\";\nimport type { SelectProps } from \"@mui/material/Select\";\nimport React, { forw"
},
{
"path": "client/src/Components/inputs/Slider.tsx",
"chars": 2653,
"preview": "import Typography from \"@mui/material/Typography\";\nimport { forwardRef } from \"react\";\nimport Slider from \"@mui/material"
},
{
"path": "client/src/Components/inputs/Switch.tsx",
"chars": 1078,
"preview": "import { forwardRef } from \"react\";\nimport Switch from \"@mui/material/Switch\";\nimport type { SwitchProps } from \"@mui/ma"
},
{
"path": "client/src/Components/inputs/SwitchTheme.tsx",
"chars": 1103,
"preview": "import IconButton from \"@mui/material/IconButton\";\n\nimport { Moon, Sun } from \"lucide-react\";\n\nimport { setMode } from \""
},
{
"path": "client/src/Components/inputs/TextInput.tsx",
"chars": 1359,
"preview": "import { forwardRef } from \"react\";\nimport TextField from \"@mui/material/TextField\";\nimport type { TextFieldProps } from"
},
{
"path": "client/src/Components/inputs/TimePicker.tsx",
"chars": 1575,
"preview": "import { MobileTimePicker } from \"@mui/x-date-pickers/MobileTimePicker\";\nimport type { MobileTimePickerProps } from \"@mu"
},
{
"path": "client/src/Components/inputs/ToggleButton.tsx",
"chars": 1202,
"preview": "import ToggleButton from \"@mui/material/ToggleButton\";\nimport ToggleButtonGroup from \"@mui/material/ToggleButtonGroup\";\n"
},
{
"path": "client/src/Components/inputs/index.tsx",
"chars": 812,
"preview": "export { ButtonInput as Button } from \"./Button\";\nexport * from \"./FieldLabel\";\nexport { SelectInput as Select } from \"."
},
{
"path": "client/src/Components/layout/AppLayout.tsx",
"chars": 1312,
"preview": "import Box from \"@mui/material/Box\";\nimport { useState, useEffect, useRef } from \"react\";\nimport { useTheme } from \"@mui"
},
{
"path": "client/src/Components/layout/RootLayout.tsx",
"chars": 994,
"preview": "import { Sidebar } from \"@/Components/sidebar\";\nimport { Outlet } from \"react-router\";\nimport Stack from \"@mui/material/"
},
{
"path": "client/src/Components/monitors/ControlsFilter.tsx",
"chars": 2744,
"preview": "import Stack from \"@mui/material/Stack\";\nimport { Select, Button } from \"@/Components/inputs\";\nimport MenuItem from \"@mu"
},
{
"path": "client/src/Components/monitors/GeoChecksMap.tsx",
"chars": 5200,
"preview": "import { useRef, useEffect, useState } from \"react\";\nimport { Box, Typography, Stack, useTheme, GlobalStyles } from \"@mu"
},
{
"path": "client/src/Components/monitors/HeaderGeoTabs.tsx",
"chars": 1308,
"preview": "import Stack from \"@mui/material/Stack\";\nimport { Tabs, Tab } from \"@/Components/design-elements\";\nimport { useTheme } f"
},
{
"path": "client/src/Components/monitors/HeaderMonitorControls.tsx",
"chars": 4080,
"preview": "import Stack from \"@mui/material/Stack\";\nimport { Icon, MonitorStatus } from \"@/Components/design-elements\";\nimport { Bu"
},
{
"path": "client/src/Components/monitors/HeaderMonitorsSummary.tsx",
"chars": 918,
"preview": "import {\n\tUpStatusBox,\n\tDownStatusBox,\n\tPausedStatusBox,\n\tInitializingStatusBox,\n\tBreachedStatusBox,\n} from \"@/Component"
},
{
"path": "client/src/Components/monitors/MonitorStatBoxes.tsx",
"chars": 2041,
"preview": "import Stack from \"@mui/material/Stack\";\nimport { StatBox } from \"@/Components/design-elements\";\n\nimport prettyMilliseco"
},
{
"path": "client/src/Components/monitors/charts/HistogramDetails.tsx",
"chars": 3388,
"preview": "import { BaseChart, BaseBox } from \"@/Components/design-elements\";\nimport { Clock } from \"lucide-react\";\nimport {\n\tAreaC"
},
{
"path": "client/src/Components/monitors/charts/HistogramInfrastructure.tsx",
"chars": 4539,
"preview": "import { BaseChart } from \"@/Components/design-elements\";\nimport {\n\tAreaChart,\n\tArea,\n\tXAxis,\n\tYAxis,\n\tCartesianGrid,\n\tR"
},
{
"path": "client/src/Components/monitors/charts/HistogramPageSpeed.tsx",
"chars": 2606,
"preview": "import Stack from \"@mui/material/Stack\";\nimport { Area, AreaChart, CartesianGrid, ResponsiveContainer, Tooltip } from \"r"
},
{
"path": "client/src/Components/monitors/charts/HistogramPageSpeedDetails.tsx",
"chars": 3017,
"preview": "import { BaseChart } from \"@/Components/design-elements\";\nimport { TrendingUp } from \"lucide-react\";\nimport { XTick } fr"
},
{
"path": "client/src/Components/monitors/charts/HistogramPageSpeedDetailsTooltip.tsx",
"chars": 2202,
"preview": "import Box from \"@mui/material/Box\";\nimport Stack from \"@mui/material/Stack\";\nimport Typography from \"@mui/material/Typo"
},
{
"path": "client/src/Components/monitors/charts/HistogramPageSpeedTooltip.tsx",
"chars": 1060,
"preview": "import Stack from \"@mui/material/Stack\";\nimport Typography from \"@mui/material/Typography\";\nimport { formatDateWithTz } "
},
{
"path": "client/src/Components/monitors/charts/HistogramStatus.tsx",
"chars": 4093,
"preview": "import Stack from \"@mui/material/Stack\";\nimport Typography from \"@mui/material/Typography\";\nimport { BaseChart } from \"@"
},
{
"path": "client/src/Components/monitors/charts/PiePageSpeed.tsx",
"chars": 4486,
"preview": "import { BaseChart } from \"@/Components/design-elements\";\nimport { FileText } from \"lucide-react\";\nimport type { CheckAu"
},
{
"path": "client/src/Components/monitors/charts/PiePageSpeedLegend.tsx",
"chars": 2617,
"preview": "import Stack from \"@mui/material/Stack\";\nimport Box from \"@mui/material/Box\";\nimport { BarChart3 } from \"lucide-react\";\n"
},
{
"path": "client/src/Components/monitors/charts/RadialAvgResponse.tsx",
"chars": 2242,
"preview": "import { BaseChart } from \"@/Components/design-elements\";\nimport Stack from \"@mui/material/Stack\";\nimport Typography fro"
},
{
"path": "client/src/Components/monitors/index.tsx",
"chars": 688,
"preview": "export * from \"./ControlsFilter\";\nexport * from \"./MonitorStatBoxes\";\nexport * from \"./HeaderMonitorControls\";\nexport * "
},
{
"path": "client/src/Components/routing/RouteProtected.tsx",
"chars": 931,
"preview": "import { Navigate } from \"react-router-dom\";\nimport { useSelector } from \"react-redux\";\nimport type { RootState } from \""
},
{
"path": "client/src/Components/sidebar/Authfooter.tsx",
"chars": 4891,
"preview": "import Stack from \"@mui/material/Stack\";\nimport Box from \"@mui/material/Box\";\nimport Typography from \"@mui/material/Typo"
},
{
"path": "client/src/Components/sidebar/Logo.tsx",
"chars": 1497,
"preview": "import Stack, { type StackProps } from \"@mui/material/Stack\";\nimport Box from \"@mui/material/Box\";\nimport Typography fro"
},
{
"path": "client/src/Components/sidebar/Menu.tsx",
"chars": 2404,
"preview": "import { Icon } from \"@/Components/design-elements\";\n\nimport {\n\tGlobe,\n\tGauge,\n\tLink,\n\tBell,\n\tFileText,\n\tAlertTriangle,\n"
},
{
"path": "client/src/Components/sidebar/NavItem.tsx",
"chars": 2523,
"preview": "import Tooltip from \"@mui/material/Tooltip\";\nimport ListItemButton from \"@mui/material/ListItemButton\";\nimport ListItemI"
},
{
"path": "client/src/Components/sidebar/StarPrompt.tsx",
"chars": 2616,
"preview": "import { Typography, IconButton, Stack, Box } from \"@mui/material\";\nimport { Icon } from \"@/Components/design-elements\";"
},
{
"path": "client/src/Components/sidebar/index.tsx",
"chars": 3651,
"preview": "import { useEffect } from \"react\";\nimport Backdrop from \"@mui/material/Backdrop\";\nimport Stack from \"@mui/material/Stack"
},
{
"path": "client/src/Features/Auth/authSlice.ts",
"chars": 1198,
"preview": "import { createSlice, type PayloadAction } from \"@reduxjs/toolkit\";\nimport type { User } from \"@/Types/User\";\n\ninterface"
},
{
"path": "client/src/Features/UI/uiSlice.ts",
"chars": 2732,
"preview": "import { createSlice, type PayloadAction } from \"@reduxjs/toolkit\";\n\ntype ThemeMode = \"light\" | \"dark\";\ntype ChartType ="
},
{
"path": "client/src/Hooks/UseApi.ts",
"chars": 5325,
"preview": "import useSWR from \"swr\";\nimport type { SWRConfiguration } from \"swr\";\nimport type { AxiosRequestConfig } from \"axios\";\n"
},
{
"path": "client/src/Hooks/UseToast.ts",
"chars": 758,
"preview": "import { toast, type ToastOptions } from \"react-toastify\";\n\nexport const useToast = () => {\n\tconst showToast = (message:"
},
{
"path": "client/src/Hooks/useAddTeamMemberForm.ts",
"chars": 345,
"preview": "import {\n\taddTeamMemberSchema,\n\ttype AddTeamMemberFormData,\n} from \"@/Validation/addTeamMember\";\n\nexport const useAddTea"
},
{
"path": "client/src/Hooks/useDebounce.ts",
"chars": 394,
"preview": "import { useState, useEffect } from \"react\";\n\nconst useDebounce = <T>(value: T, delay: number): T => {\n\tconst [debounced"
},
{
"path": "client/src/Hooks/useEditUserForm.ts",
"chars": 319,
"preview": "import { zodResolver } from \"@hookform/resolvers/zod\";\nimport { editUserSchema, type EditUserFormData } from \"@/Validati"
},
{
"path": "client/src/Hooks/useInviteForm.ts",
"chars": 306,
"preview": "import { zodResolver } from \"@hookform/resolvers/zod\";\nimport { inviteSchema, type InviteFormData } from \"@/Validation/i"
},
{
"path": "client/src/Hooks/useIsAdmin.ts",
"chars": 565,
"preview": "import type { RootState } from \"@/Types/state\";\nimport { useSelector } from \"react-redux\";\n\nconst useIsAdmin = (): boole"
},
{
"path": "client/src/Hooks/useLoginForm.ts",
"chars": 293,
"preview": "import { useMemo } from \"react\";\nimport { loginSchema, type LoginFormData } from \"@/Validation/login\";\n\nexport const use"
},
{
"path": "client/src/Hooks/useMaintenanceWindowForm.ts",
"chars": 1311,
"preview": "import { useMemo } from \"react\";\nimport dayjs from \"dayjs\";\nimport {\n\tmaintenanceWindowSchema,\n\trepeatOptions,\n\ttype Mai"
},
{
"path": "client/src/Hooks/useMonitorForm.ts",
"chars": 3149,
"preview": "import { useMemo } from \"react\";\nimport { monitorSchema, type MonitorFormData } from \"@/Validation/monitor\";\nimport type"
},
{
"path": "client/src/Hooks/useNotificationForm.ts",
"chars": 865,
"preview": "import { useMemo } from \"react\";\nimport { notificationSchema } from \"@/Validation/notifications\";\nimport type { Notifica"
},
{
"path": "client/src/Hooks/usePasswordForm.ts",
"chars": 331,
"preview": "import { zodResolver } from \"@hookform/resolvers/zod\";\nimport { passwordSchema, type PasswordFormData } from \"@/Validati"
},
{
"path": "client/src/Hooks/useProfileForm.ts",
"chars": 353,
"preview": "import { zodResolver } from \"@hookform/resolvers/zod\";\nimport { profileSchema, type ProfileFormData } from \"@/Validation"
},
{
"path": "client/src/Hooks/useRecoveryForm.ts",
"chars": 189,
"preview": "import { recoverySchema } from \"@/Validation/recovery\";\n\nexport const useRecoveryForm = () => {\n\tconst defaults = {\n\t\tem"
},
{
"path": "client/src/Hooks/useRegisterForm.ts",
"chars": 294,
"preview": "import { registerSchema, type RegisterFormData } from \"@/Validation/register\";\n\nexport const useRegisterForm = () => {\n\t"
},
{
"path": "client/src/Hooks/useSetNewPasswordForm.ts",
"chars": 287,
"preview": "import {\n\tsetNewPasswordSchema,\n\ttype SetNewPasswordFormData,\n} from \"@/Validation/setNewPassword\";\n\nexport const useSet"
},
{
"path": "client/src/Hooks/useSettingsForm.ts",
"chars": 1824,
"preview": "import { useMemo } from \"react\";\nimport { settingsSchema } from \"@/Validation/settings\";\nimport type { Settings } from \""
},
{
"path": "client/src/Hooks/useSidebar.ts",
"chars": 707,
"preview": "import type { RootState } from \"@/Types/state\";\nimport { useSelector } from \"react-redux\";\n\n// CSS variable names for si"
},
{
"path": "client/src/Hooks/useStatusPageForm.ts",
"chars": 1487,
"preview": "import { useMemo } from \"react\";\nimport { statusPageSchema, type StatusPageFormData } from \"@/Validation/statusPage\";\nim"
},
{
"path": "client/src/Pages/Account/EditUser/index.tsx",
"chars": 7398,
"preview": "import { Trash2 } from \"lucide-react\";\nimport { TextField, Button, Autocomplete } from \"@/Components/inputs\";\nimport Sta"
},
{
"path": "client/src/Pages/Account/TabPassword.tsx",
"chars": 3304,
"preview": "import { Stack } from \"@mui/material\";\nimport { ConfigBox } from \"@/Components/design-elements\";\nimport { TextField, But"
},
{
"path": "client/src/Pages/Account/TabProfile.tsx",
"chars": 4091,
"preview": "import { Stack } from \"@mui/material\";\nimport { ConfigBox } from \"@/Components/design-elements\";\nimport { TextField, But"
},
{
"path": "client/src/Pages/Account/TabTeam.tsx",
"chars": 1813,
"preview": "import { Stack } from \"@mui/material\";\nimport { useTheme } from \"@mui/material\";\nimport { useState, useMemo } from \"reac"
},
{
"path": "client/src/Pages/Account/components/AddTeamMemberDialog.tsx",
"chars": 4957,
"preview": "import { Stack } from \"@mui/material\";\nimport MenuItem from \"@mui/material/MenuItem\";\nimport { useTheme } from \"@mui/mat"
},
{
"path": "client/src/Pages/Account/components/HeaderTeamControls.tsx",
"chars": 2022,
"preview": "import Stack from \"@mui/material/Stack\";\nimport MenuItem from \"@mui/material/MenuItem\";\nimport { Button, Select } from \""
},
{
"path": "client/src/Pages/Account/components/InviteTeamMemberDialog.tsx",
"chars": 4251,
"preview": "import { Stack } from \"@mui/material\";\nimport MenuItem from \"@mui/material/MenuItem\";\nimport { useTheme, FormHelperText,"
},
{
"path": "client/src/Pages/Account/components/TeamTable.tsx",
"chars": 1520,
"preview": "import Typography from \"@mui/material/Typography\";\nimport { useNavigate } from \"react-router-dom\";\nimport { useTranslati"
},
{
"path": "client/src/Pages/Account/index.tsx",
"chars": 1170,
"preview": "import { BasePage, Tabs, Tab } from \"@/Components/design-elements\";\nimport { useState, useEffect } from \"react\";\nimport "
},
{
"path": "client/src/Pages/Auth/Login/index.tsx",
"chars": 2712,
"preview": "import { BaseAuthPage, TextLink } from \"@/Components/design-elements\";\nimport { Button, TextField } from \"@/Components/i"
},
{
"path": "client/src/Pages/Auth/Recovery/index.tsx",
"chars": 1932,
"preview": "import { Button, TextField } from \"@/Components/inputs\";\nimport { BaseAuthPage, TextLink } from \"@/Components/design-ele"
},
{
"path": "client/src/Pages/Auth/Register/index.tsx",
"chars": 4885,
"preview": "import { BaseAuthPage } from \"@/Components/design-elements\";\nimport { Button, TextField } from \"@/Components/inputs\";\nim"
},
{
"path": "client/src/Pages/Auth/SetNewPassword/index.tsx",
"chars": 4229,
"preview": "import { BaseAuthPage, BulletPointCheck, TextLink } from \"@/Components/design-elements\";\nimport { Button, TextField } fr"
},
{
"path": "client/src/Pages/Auth/components/HeaderAuthControls.tsx",
"chars": 1237,
"preview": "import Stack, { type StackProps } from \"@mui/material/Stack\";\nimport Typography from \"@mui/material/Typography\";\nimport "
},
{
"path": "client/src/Pages/Checks/Components/ChecksTable.tsx",
"chars": 2834,
"preview": "import { Table, Pagination, ValueLabel, StatusLabel } from \"@/Components/design-elements\";\nimport Box from \"@mui/materia"
},
{
"path": "client/src/Pages/Checks/index.tsx",
"chars": 5348,
"preview": "import Stack from \"@mui/material/Stack\";\nimport {\n\tBasePage,\n\tTotalChecksBox,\n\tUpChecksBox,\n\tDownChecksBox,\n} from \"@/Co"
},
{
"path": "client/src/Pages/CreateMonitor/index.tsx",
"chars": 32199,
"preview": "import { useMemo, useState } from \"react\";\nimport { useEffect } from \"react\";\nimport { logger } from \"@/Utils/logger\";\ni"
},
{
"path": "client/src/Pages/Incidents/Components/CardDetails.tsx",
"chars": 5735,
"preview": "import Stack from \"@mui/material/Stack\";\nimport Grid from \"@mui/material/Grid\";\nimport Divider from \"@mui/material/Divid"
},
{
"path": "client/src/Pages/Incidents/Components/CardSummary.tsx",
"chars": 5626,
"preview": "import Stack from \"@mui/material/Stack\";\nimport Typography from \"@mui/material/Typography\";\nimport Divider from \"@mui/ma"
},
{
"path": "client/src/Pages/Incidents/Components/ControlsIncidentFilter.tsx",
"chars": 2318,
"preview": "import Stack from \"@mui/material/Stack\";\nimport { Select, Button } from \"@/Components/inputs\";\nimport MenuItem from \"@mu"
},
{
"path": "client/src/Pages/Incidents/Components/DialogIncidentDetails.tsx",
"chars": 982,
"preview": "import { Dialog } from \"@/Components/inputs\";\nimport { CardDetails } from \"@/Pages/Incidents/Components/CardDetails\";\n\ni"
},
{
"path": "client/src/Pages/Incidents/Components/DialogResolution.tsx",
"chars": 1691,
"preview": "import { useState, useEffect } from \"react\";\nimport Box from \"@mui/material/Box\";\nimport { Dialog, TextField } from \"@/C"
},
{
"path": "client/src/Pages/Incidents/Components/IncidentTable.tsx",
"chars": 5658,
"preview": "import { Table } from \"@/Components/design-elements\";\nimport { Pagination } from \"@/Components/design-elements/Table\";\ni"
},
{
"path": "client/src/Pages/Incidents/index.tsx",
"chars": 7856,
"preview": "import { BasePage } from \"@/Components/design-elements\";\nimport Stack from \"@mui/material/Stack\";\nimport Typography from"
},
{
"path": "client/src/Pages/Incidents/utils.ts",
"chars": 733,
"preview": "import type { Incident, IncidentSummaryItem } from \"@/Types/Incident\";\nimport prettyMilliseconds from \"pretty-ms\";\n\ntype"
},
{
"path": "client/src/Pages/Infrastructure/Details/Components/Charts.tsx",
"chars": 2855,
"preview": "import Grid from \"@mui/material/Grid\";\nimport { HistogramInfrastructure } from \"@/Components/monitors\";\n\nimport { useTra"
},
{
"path": "client/src/Pages/Infrastructure/Details/Components/ChartsNetwork.tsx",
"chars": 2709,
"preview": "import Grid from \"@mui/material/Grid\";\nimport { HistogramInfrastructure } from \"@/Components/monitors\";\n\nimport { useTra"
},
{
"path": "client/src/Pages/Infrastructure/Details/Components/Gauges.tsx",
"chars": 2117,
"preview": "import Stack from \"@mui/material/Stack\";\nimport { DetailGauge } from \"@/Components/design-elements\";\n\nimport prettyBytes"
},
{
"path": "client/src/Pages/Infrastructure/Details/Components/StatusBoxes.tsx",
"chars": 2178,
"preview": "import Stack from \"@mui/material/Stack\";\nimport { StatBox } from \"@/Components/design-elements\";\n\nimport prettyBytes fro"
},
{
"path": "client/src/Pages/Infrastructure/Details/Components/TabNetwork.tsx",
"chars": 545,
"preview": "import Stack from \"@mui/material/Stack\";\nimport { InfraNetworkCharts } from \"./ChartsNetwork\";\n\nimport { useTheme } from"
},
{
"path": "client/src/Pages/Infrastructure/Details/Components/TabOverview.tsx",
"chars": 902,
"preview": "import Stack from \"@mui/material/Stack\";\nimport { InfraDetailsGauges } from \"@/Pages/Infrastructure/Details/Components/G"
},
{
"path": "client/src/Pages/Infrastructure/Details/index.tsx",
"chars": 2502,
"preview": "import { BasePage, Tab, Tabs } from \"@/Components/design-elements\";\nimport { HeaderTimeRange } from \"@/Components/common"
},
{
"path": "client/src/Pages/Infrastructure/Monitors/Components/MonitorsTable.tsx",
"chars": 6247,
"preview": "import Box from \"@mui/material/Box\";\nimport Typography from \"@mui/material/Typography\";\nimport { Table, Pagination, Stat"
},
{
"path": "client/src/Pages/Infrastructure/Monitors/index.tsx",
"chars": 6246,
"preview": "import Stack from \"@mui/material/Stack\";\nimport useMediaQuery from \"@mui/material/useMediaQuery\";\nimport { MonitorBasePa"
},
{
"path": "client/src/Pages/Logs/TabDiagnostics.tsx",
"chars": 684,
"preview": "import Stack from \"@mui/material/Stack\";\nimport { Stats } from \"@/Pages/Logs/components/Stats\";\nimport { StatGauges } fr"
},
{
"path": "client/src/Pages/Logs/TabLogs.tsx",
"chars": 1829,
"preview": "import Stack from \"@mui/material/Stack\";\nimport MenuItem from \"@mui/material/MenuItem\";\nimport Typography from \"@mui/mat"
},
{
"path": "client/src/Pages/Logs/TabQueue.tsx",
"chars": 1535,
"preview": "import Stack from \"@mui/material/Stack\";\nimport Typography from \"@mui/material/Typography\";\nimport { TableJobs, TableFai"
},
{
"path": "client/src/Pages/Logs/components/Metrics.tsx",
"chars": 1274,
"preview": "import Stack from \"@mui/material/Stack\";\nimport { StatBox } from \"@/Components/design-elements\";\n\nimport { useTheme } fr"
},
{
"path": "client/src/Pages/Logs/components/StatGauges.tsx",
"chars": 2487,
"preview": "import Stack from \"@mui/material/Stack\";\nimport { DetailGauge } from \"@/Components/design-elements\";\n\nimport { getPercen"
},
{
"path": "client/src/Pages/Logs/components/Stats.tsx",
"chars": 1460,
"preview": "import Stack from \"@mui/material/Stack\";\nimport { StatBox } from \"@/Components/design-elements\";\n\nimport prettyBytes fro"
},
{
"path": "client/src/Pages/Logs/components/TableJobs.tsx",
"chars": 4149,
"preview": "import { Table } from \"@/Components/design-elements\";\nimport { Typography, useTheme } from \"@mui/material\";\nimport prett"
},
{
"path": "client/src/Pages/Logs/components/TableLogs.tsx",
"chars": 3189,
"preview": "import Box from \"@mui/material/Box\";\nimport Typography from \"@mui/material/Typography\";\nimport { Table } from \"@/Compone"
},
{
"path": "client/src/Pages/Logs/index.tsx",
"chars": 868,
"preview": "import { BasePage, Tabs, Tab } from \"@/Components/design-elements\";\nimport { TabLogs } from \"@/Pages/Logs/TabLogs\";\nimpo"
},
{
"path": "client/src/Pages/Maintenance/MaintenanceWindowTable.tsx",
"chars": 5748,
"preview": "import Typography from \"@mui/material/Typography\";\nimport { Table, ValueLabel } from \"@/Components/design-elements\";\nimp"
},
{
"path": "client/src/Pages/Maintenance/create/index.tsx",
"chars": 10980,
"preview": "import Stack from \"@mui/material/Stack\";\nimport MenuItem from \"@mui/material/MenuItem\";\nimport { logger } from \"@/Utils/"
}
]
// ... and 342 more files (download for full content)
About this extraction
This page contains the full source code of the bluewave-labs/Checkmate GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 542 files (2.7 MB), approximately 742.7k tokens, and a symbol index with 894 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.