Showing preview only (3,647K chars total). Download the full file or copy to clipboard to get everything.
Repository: inket/stts
Branch: master
Commit: 2bd78c67e090
Files: 167
Total size: 17.1 MB
Directory structure:
gitextract_a2ozbqvp/
├── .bundle/
│ └── config
├── .gitattributes
├── .gitignore
├── .swiftlint.yml
├── Cartfile
├── Cartfile.resolved
├── Gemfile
├── LICENSE
├── README.md
├── Resources/
│ ├── AppIcon.icon/
│ │ └── icon.json
│ ├── Assets.xcassets/
│ │ └── Contents.json
│ ├── Base.lproj/
│ │ └── MainMenu.xib
│ ├── Info.plist
│ └── services.json
├── Scripts/
│ ├── generate_adobe_services.swift
│ ├── generate_apple_services.swift
│ ├── generate_aws_services.swift
│ ├── generate_azure_devops_services.swift
│ ├── generate_azure_services.swift
│ ├── generate_google_services.swift
│ ├── generate_salesforce_services.swift
│ └── generate_services_plist.sh
├── extract.rb
├── openai.html
├── sort.rb
├── stts/
│ ├── AppDelegate.swift
│ ├── AppearanceObserver.swift
│ ├── BottomBar.swift
│ ├── CustomScrollView.swift
│ ├── DataLoader.swift
│ ├── EditorTableView/
│ │ └── EditorTableCell.swift
│ ├── Extensions/
│ │ ├── Atomic.swift
│ │ ├── NSScreenExtensions.swift
│ │ ├── StringExtensions.swift
│ │ └── TaskExtensions.swift
│ ├── HeadlessHTMLRenderer.swift
│ ├── Icons.swift
│ ├── Preferences/
│ │ ├── PreferencesGeneralView.swift
│ │ ├── PreferencesServicesView.swift
│ │ └── PreferencesWindow.swift
│ ├── Preferences.swift
│ ├── PreferencesWindow/
│ │ ├── NSAppearance+Extensions.swift
│ │ ├── PreferencesAboutView.swift
│ │ ├── PreferencesSidebarMenu.swift
│ │ └── PreferencesWindowController.swift
│ ├── ServiceLoader/
│ │ ├── AppDefinedServiceDefinitionProvider.swift
│ │ ├── BundleServiceDefinitionProvider.swift
│ │ ├── ServiceDefinition.swift
│ │ ├── ServiceDefinitionProvider.swift
│ │ ├── ServiceLoader.swift
│ │ ├── ServicesStructure.swift
│ │ └── UserDefinedServiceDefinitionProvider.swift
│ ├── ServiceTableView/
│ │ ├── ServiceTableRowView.swift
│ │ ├── ServiceTableViewController.swift
│ │ ├── StatusIndicator.swift
│ │ └── StatusTableCell.swift
│ ├── Services/
│ │ ├── Algolia.swift
│ │ ├── AzureAll.swift
│ │ ├── AzureDevOpsAll.swift
│ │ ├── Beanstalk.swift
│ │ ├── Broadcom.swift
│ │ ├── Evernote.swift
│ │ ├── Fastly.swift
│ │ ├── Firebase.swift
│ │ ├── Generated/
│ │ │ ├── AWSServices.swift
│ │ │ ├── AdobeServices.swift
│ │ │ ├── AppleServices.swift
│ │ │ ├── AzureDevOpsServices.swift
│ │ │ ├── AzureServices.swift
│ │ │ ├── FirebaseServices.swift
│ │ │ ├── GoogleCloudPlatformServices.swift
│ │ │ └── SalesforceProducts.swift
│ │ ├── GoogleCloudPlatformAll.swift
│ │ ├── MiroAll.swift
│ │ ├── Okta.swift
│ │ ├── OracleNetSuite.swift
│ │ ├── PagerDuty/
│ │ │ └── PagerDuty.swift
│ │ ├── PayPal/
│ │ │ ├── PayPalAPIProduction.swift
│ │ │ ├── PayPalAPISandbox.swift
│ │ │ ├── PayPalProductProduction.swift
│ │ │ └── PayPalProductSandbox.swift
│ │ ├── PlayStation Network/
│ │ │ ├── PSNAmerica.swift
│ │ │ ├── PSNAsia.swift
│ │ │ └── PSNEurope.swift
│ │ ├── SendbirdAll.swift
│ │ ├── SignalWire.swift
│ │ ├── Slack.swift
│ │ ├── Stripe.swift
│ │ ├── Super/
│ │ │ ├── AWSService.swift
│ │ │ ├── AWSStore.swift
│ │ │ ├── Adobe.swift
│ │ │ ├── AdobeStore.swift
│ │ │ ├── Apple.swift
│ │ │ ├── AppleDeveloper.swift
│ │ │ ├── AppleStore.swift
│ │ │ ├── Azure.swift
│ │ │ ├── AzureDevOps.swift
│ │ │ ├── AzureDevOpsStore.swift
│ │ │ ├── AzureStore.swift
│ │ │ ├── BetterStackService.swift
│ │ │ ├── BetterUptimeService.swift
│ │ │ ├── CStateService.swift
│ │ │ ├── CachetService.swift
│ │ │ ├── ExanaService.swift
│ │ │ ├── FirebaseService.swift
│ │ │ ├── FirebaseStatusDashboardStore.swift
│ │ │ ├── GoogleCloudPlatform.swift
│ │ │ ├── GoogleStatusDashboardStore.swift
│ │ │ ├── IncidentIOService.swift
│ │ │ ├── IndependentService.swift
│ │ │ ├── InstatusService.swift
│ │ │ ├── LambStatusService.swift
│ │ │ ├── MiroService.swift
│ │ │ ├── PagerDutyService.swift
│ │ │ ├── PayPal.swift
│ │ │ ├── PlayStationNetwork.swift
│ │ │ ├── Salesforce.swift
│ │ │ ├── SalesforceCategories.swift
│ │ │ ├── SalesforceStore.swift
│ │ │ ├── SendbirdService.swift
│ │ │ ├── Service.swift
│ │ │ ├── ServiceStore.swift
│ │ │ ├── Site24x7Service.swift
│ │ │ ├── SorryService.swift
│ │ │ ├── StatusCakeService.swift
│ │ │ ├── StatusCastService.swift
│ │ │ ├── StatusHubService.swift
│ │ │ ├── StatusPageService.swift
│ │ │ ├── StatusioV1Service.swift
│ │ │ ├── StatuspalService.swift
│ │ │ └── UptimeDotComService.swift
│ │ ├── UptimeDotCom/
│ │ │ ├── JSDelivr.swift
│ │ │ ├── Recurly.swift
│ │ │ └── UptimeDotCom.swift
│ │ └── Zendesk.swift
│ ├── SwitchableTableViewController.swift
│ └── stts.entitlements
├── stts.xcodeproj/
│ ├── project.pbxproj
│ ├── project.xcworkspace/
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata/
│ │ ├── IDEWorkspaceChecks.plist
│ │ └── swiftpm/
│ │ └── Package.resolved
│ └── xcshareddata/
│ └── xcschemes/
│ └── stts.xcscheme
└── sttsTests/
├── AdobeTests.swift
├── BetterStackTests.swift
├── Helpers/
│ └── TestBundle.swift
├── IncidentIOTests.swift
├── Info.plist
├── InstatusTests.swift
├── MiroTests.swift
├── Mocks/
│ ├── ResponseOverridingURLSession.swift
│ └── ResponseSizeTrackingURLSession.swift
├── PagerDutyTests.swift
├── Resources/
│ ├── adobe-analytics-minor.json
│ ├── aiven-minor.html
│ ├── buildjet-good.html
│ ├── eyloo-major.html
│ ├── linear-good.html
│ ├── mastodonsocial-major.html
│ ├── miro-good.html
│ ├── miro-issue.html
│ ├── openai-major.html
│ ├── pagerduty-good.html
│ ├── pagerduty-minor.html
│ ├── rollbar-good.html
│ └── whereby-good.html
├── StringExtensionsTests.swift
└── sttsTests.swift
================================================
FILE CONTENTS
================================================
================================================
FILE: .bundle/config
================================================
---
BUNDLE_PATH: "vendor/bundle"
BUNDLE_FORCE_RUBY_PLATFORM: "true"
================================================
FILE: .gitattributes
================================================
sttsTests/Resources/** linguist-vendored
================================================
FILE: .gitignore
================================================
# Created by https://www.gitignore.io/api/swift
### Swift ###
# Xcode
#
# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
## Build generated
build/
DerivedData/
## Various settings
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata/
## Other
*.moved-aside
*.xcuserstate
## Obj-C/Swift specific
*.hmap
*.ipa
*.dSYM.zip
*.dSYM
## Playgrounds
timeline.xctimeline
playground.xcworkspace
# Swift Package Manager
#
# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.
# Packages/
.build/
# CocoaPods
#
# We recommend against adding the Pods directory to your .gitignore. However
# you should judge for yourself, the pros and cons are mentioned at:
# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
#
# Pods/
# Carthage
#
# Add this line if you want to avoid checking in source code from Carthage dependencies.
Carthage/Checkouts
Carthage/Build
# fastlane
#
# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the
# screenshots whenever they are needed.
# For more information about the recommended setup visit:
# https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Gitignore.md
fastlane/report.xml
fastlane/Preview.html
fastlane/screenshots
fastlane/test_output
# Ignore App Store assets (screenshots)
App Store
# Ruby vendor
vendor
# Claude
CLAUDE.md
.claude/
================================================
FILE: .swiftlint.yml
================================================
excluded:
- Pods
- Carthage
line_length:
warning: 120
ignores_comments: true
ignores_interpolated_strings: true
disabled_rules:
- type_body_length
- function_body_length
- nesting
- identifier_name
- file_length
- for_where
- blanket_disable_command
================================================
FILE: Cartfile
================================================
github "inket/StartAtLogin"
================================================
FILE: Cartfile.resolved
================================================
github "inket/StartAtLogin" "v6.0.0"
================================================
FILE: Gemfile
================================================
source 'https://rubygems.org'
gem 'xcodeproj'
gem 'synx'
================================================
FILE: LICENSE
================================================
MIT License
Copyright (c) 2016 Mahdi Bchetnia
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: README.md
================================================
## stts 
stts is a macOS app for monitoring the status of cloud services.
<img src="https://i.imgur.com/OAK3hR0.png" width="218" height="324" />
With a click of the menubar icon, you can see the status of your favorite services. You can also be notified when a service goes down or gets restored.
stts is designed to be unobtrusive, only giving you the information you need and allowing you to access the status page with a single click.
stts can be downloaded from the Mac App Store [here](https://itunes.apple.com/app/stts/id1187772509?l=en&mt=12).
### Support the project
<a href="https://www.buymeacoffee.com/mahdibchatnia" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png" alt="Buy Me A Coffee" height="48" width="173" ></a>
### Contribute
Most services can be added automatically with the included extract script:
```sh
# If you haven't already, clone the repo
git clone https://github.com/inket/stts.git
cd stts
# Install dependencies and run the extract script
bundle install
bundle exec ruby extract.rb <url>
# Example:
bundle exec ruby extract.rb https://status.notion.so/
```
For services that cannot be added with the script, feel free to create an issue.
#### Contact
[@inket](https://github.com/inket) / [@inket](https://twitter.com/inket) on Twitter / [mahdi.jp](https://mahdi.jp)
================================================
FILE: Resources/AppIcon.icon/icon.json
================================================
{
"fill" : {
"linear-gradient" : [
"display-p3:0.27726,0.27726,0.27726,1.00000",
"display-p3:0.18033,0.18033,0.18033,1.00000"
]
},
"groups" : [
{
"blend-mode" : "normal",
"blur-material" : null,
"hidden" : false,
"layers" : [
{
"blend-mode" : "normal",
"fill-specializations" : [
{
"value" : {
"linear-gradient" : [
"display-p3:0.99663,0.99663,0.99663,1.00000",
"display-p3:0.89697,0.89697,0.89697,1.00000"
]
}
},
{
"appearance" : "dark",
"value" : {
"linear-gradient" : [
"display-p3:0.99663,0.99663,0.99663,1.00000",
"display-p3:0.89697,0.89697,0.89697,1.00000"
]
}
}
],
"glass" : true,
"hidden" : false,
"image-name" : "noun-activity-680031.svg",
"name" : "noun-activity-680031",
"opacity" : 0.9,
"position" : {
"scale" : 6,
"translation-in-points" : [
30,
90
]
}
}
],
"lighting" : "individual",
"shadow" : {
"kind" : "neutral",
"opacity" : 0.5
},
"specular" : false,
"translucency" : {
"enabled" : false,
"value" : 0.5
}
}
],
"supported-platforms" : {
"circles" : [
"watchOS"
],
"squares" : "shared"
}
}
================================================
FILE: Resources/Assets.xcassets/Contents.json
================================================
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Resources/Base.lproj/MainMenu.xib
================================================
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="16097" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="16097"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="NSApplication">
<connections>
<outlet property="delegate" destination="Voe-Tx-rLC" id="GzC-gU-4Uq"/>
</connections>
</customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<customObject id="Voe-Tx-rLC" customClass="AppDelegate" customModule="stts" customModuleProvider="target"/>
<customObject id="YLy-65-1bz" customClass="NSFontManager"/>
<menu title="Main Menu" systemMenu="main" id="AYu-sK-qS6">
<items>
<menuItem title="stts" id="1Xt-HY-uBw">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="stts" systemMenu="apple" id="uQy-DD-JDr">
<items>
<menuItem title="About stts" id="5kV-Vb-QxS">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="orderFrontStandardAboutPanel:" target="-1" id="Exp-CZ-Vem"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="VOq-y0-SEH"/>
<menuItem title="Preferences…" keyEquivalent="," id="BOF-NM-1cW"/>
<menuItem isSeparatorItem="YES" id="wFC-TO-SCJ"/>
<menuItem title="Services" id="NMo-om-nkz">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Services" systemMenu="services" id="hz9-B4-Xy5"/>
</menuItem>
<menuItem isSeparatorItem="YES" id="4je-JR-u6R"/>
<menuItem title="Hide stts" keyEquivalent="h" id="Olw-nP-bQN">
<connections>
<action selector="hide:" target="-1" id="PnN-Uc-m68"/>
</connections>
</menuItem>
<menuItem title="Hide Others" keyEquivalent="h" id="Vdr-fp-XzO">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="hideOtherApplications:" target="-1" id="VT4-aY-XCT"/>
</connections>
</menuItem>
<menuItem title="Show All" id="Kd2-mp-pUS">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="unhideAllApplications:" target="-1" id="Dhg-Le-xox"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="kCx-OE-vgT"/>
<menuItem title="Quit stts" keyEquivalent="q" id="4sb-4s-VLi">
<connections>
<action selector="terminate:" target="-1" id="Te7-pn-YzF"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="File" id="dMs-cI-mzQ">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="File" id="bib-Uj-vzu">
<items>
<menuItem title="New" keyEquivalent="n" id="Was-JA-tGl">
<connections>
<action selector="newDocument:" target="-1" id="4Si-XN-c54"/>
</connections>
</menuItem>
<menuItem title="Open…" keyEquivalent="o" id="IAo-SY-fd9">
<connections>
<action selector="openDocument:" target="-1" id="bVn-NM-KNZ"/>
</connections>
</menuItem>
<menuItem title="Open Recent" id="tXI-mr-wws">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Open Recent" systemMenu="recentDocuments" id="oas-Oc-fiZ">
<items>
<menuItem title="Clear Menu" id="vNY-rz-j42">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="clearRecentDocuments:" target="-1" id="Daa-9d-B3U"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem isSeparatorItem="YES" id="m54-Is-iLE"/>
<menuItem title="Close" keyEquivalent="w" id="DVo-aG-piG">
<connections>
<action selector="performClose:" target="-1" id="HmO-Ls-i7Q"/>
</connections>
</menuItem>
<menuItem title="Save…" keyEquivalent="s" id="pxx-59-PXV">
<connections>
<action selector="saveDocument:" target="-1" id="teZ-XB-qJY"/>
</connections>
</menuItem>
<menuItem title="Save As…" keyEquivalent="S" id="Bw7-FT-i3A">
<connections>
<action selector="saveDocumentAs:" target="-1" id="mDf-zr-I0C"/>
</connections>
</menuItem>
<menuItem title="Revert to Saved" keyEquivalent="r" id="KaW-ft-85H">
<connections>
<action selector="revertDocumentToSaved:" target="-1" id="iJ3-Pv-kwq"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="aJh-i4-bef"/>
<menuItem title="Page Setup…" keyEquivalent="P" id="qIS-W8-SiK">
<modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/>
<connections>
<action selector="runPageLayout:" target="-1" id="Din-rz-gC5"/>
</connections>
</menuItem>
<menuItem title="Print…" keyEquivalent="p" id="aTl-1u-JFS">
<connections>
<action selector="print:" target="-1" id="qaZ-4w-aoO"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Edit" id="5QF-Oa-p0T">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Edit" id="W48-6f-4Dl">
<items>
<menuItem title="Undo" keyEquivalent="z" id="dRJ-4n-Yzg">
<connections>
<action selector="undo:" target="-1" id="M6e-cu-g7V"/>
</connections>
</menuItem>
<menuItem title="Redo" keyEquivalent="Z" id="6dh-zS-Vam">
<connections>
<action selector="redo:" target="-1" id="oIA-Rs-6OD"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="WRV-NI-Exz"/>
<menuItem title="Cut" keyEquivalent="x" id="uRl-iY-unG">
<connections>
<action selector="cut:" target="-1" id="YJe-68-I9s"/>
</connections>
</menuItem>
<menuItem title="Copy" keyEquivalent="c" id="x3v-GG-iWU">
<connections>
<action selector="copy:" target="-1" id="G1f-GL-Joy"/>
</connections>
</menuItem>
<menuItem title="Paste" keyEquivalent="v" id="gVA-U4-sdL">
<connections>
<action selector="paste:" target="-1" id="UvS-8e-Qdg"/>
</connections>
</menuItem>
<menuItem title="Paste and Match Style" keyEquivalent="V" id="WeT-3V-zwk">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="pasteAsPlainText:" target="-1" id="cEh-KX-wJQ"/>
</connections>
</menuItem>
<menuItem title="Delete" id="pa3-QI-u2k">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="delete:" target="-1" id="0Mk-Ml-PaM"/>
</connections>
</menuItem>
<menuItem title="Select All" keyEquivalent="a" id="Ruw-6m-B2m">
<connections>
<action selector="selectAll:" target="-1" id="VNm-Mi-diN"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="uyl-h8-XO2"/>
<menuItem title="Find" id="4EN-yA-p0u">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Find" id="1b7-l0-nxx">
<items>
<menuItem title="Find…" tag="1" keyEquivalent="f" id="Xz5-n4-O0W">
<connections>
<action selector="performFindPanelAction:" target="-1" id="cD7-Qs-BN4"/>
</connections>
</menuItem>
<menuItem title="Find and Replace…" tag="12" keyEquivalent="f" id="YEy-JH-Tfz">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="performFindPanelAction:" target="-1" id="WD3-Gg-5AJ"/>
</connections>
</menuItem>
<menuItem title="Find Next" tag="2" keyEquivalent="g" id="q09-fT-Sye">
<connections>
<action selector="performFindPanelAction:" target="-1" id="NDo-RZ-v9R"/>
</connections>
</menuItem>
<menuItem title="Find Previous" tag="3" keyEquivalent="G" id="OwM-mh-QMV">
<connections>
<action selector="performFindPanelAction:" target="-1" id="HOh-sY-3ay"/>
</connections>
</menuItem>
<menuItem title="Use Selection for Find" tag="7" keyEquivalent="e" id="buJ-ug-pKt">
<connections>
<action selector="performFindPanelAction:" target="-1" id="U76-nv-p5D"/>
</connections>
</menuItem>
<menuItem title="Jump to Selection" keyEquivalent="j" id="S0p-oC-mLd">
<connections>
<action selector="centerSelectionInVisibleArea:" target="-1" id="IOG-6D-g5B"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Spelling and Grammar" id="Dv1-io-Yv7">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Spelling" id="3IN-sU-3Bg">
<items>
<menuItem title="Show Spelling and Grammar" keyEquivalent=":" id="HFo-cy-zxI">
<connections>
<action selector="showGuessPanel:" target="-1" id="vFj-Ks-hy3"/>
</connections>
</menuItem>
<menuItem title="Check Document Now" keyEquivalent=";" id="hz2-CU-CR7">
<connections>
<action selector="checkSpelling:" target="-1" id="fz7-VC-reM"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="bNw-od-mp5"/>
<menuItem title="Check Spelling While Typing" id="rbD-Rh-wIN">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleContinuousSpellChecking:" target="-1" id="7w6-Qz-0kB"/>
</connections>
</menuItem>
<menuItem title="Check Grammar With Spelling" id="mK6-2p-4JG">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleGrammarChecking:" target="-1" id="muD-Qn-j4w"/>
</connections>
</menuItem>
<menuItem title="Correct Spelling Automatically" id="78Y-hA-62v">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticSpellingCorrection:" target="-1" id="2lM-Qi-WAP"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Substitutions" id="9ic-FL-obx">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Substitutions" id="FeM-D8-WVr">
<items>
<menuItem title="Show Substitutions" id="z6F-FW-3nz">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="orderFrontSubstitutionsPanel:" target="-1" id="oku-mr-iSq"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="gPx-C9-uUO"/>
<menuItem title="Smart Copy/Paste" id="9yt-4B-nSM">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleSmartInsertDelete:" target="-1" id="3IJ-Se-DZD"/>
</connections>
</menuItem>
<menuItem title="Smart Quotes" id="hQb-2v-fYv">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticQuoteSubstitution:" target="-1" id="ptq-xd-QOA"/>
</connections>
</menuItem>
<menuItem title="Smart Dashes" id="rgM-f4-ycn">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticDashSubstitution:" target="-1" id="oCt-pO-9gS"/>
</connections>
</menuItem>
<menuItem title="Smart Links" id="cwL-P1-jid">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticLinkDetection:" target="-1" id="Gip-E3-Fov"/>
</connections>
</menuItem>
<menuItem title="Data Detectors" id="tRr-pd-1PS">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticDataDetection:" target="-1" id="R1I-Nq-Kbl"/>
</connections>
</menuItem>
<menuItem title="Text Replacement" id="HFQ-gK-NFA">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticTextReplacement:" target="-1" id="DvP-Fe-Py6"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Transformations" id="2oI-Rn-ZJC">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Transformations" id="c8a-y6-VQd">
<items>
<menuItem title="Make Upper Case" id="vmV-6d-7jI">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="uppercaseWord:" target="-1" id="sPh-Tk-edu"/>
</connections>
</menuItem>
<menuItem title="Make Lower Case" id="d9M-CD-aMd">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="lowercaseWord:" target="-1" id="iUZ-b5-hil"/>
</connections>
</menuItem>
<menuItem title="Capitalize" id="UEZ-Bs-lqG">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="capitalizeWord:" target="-1" id="26H-TL-nsh"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Speech" id="xrE-MZ-jX0">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Speech" id="3rS-ZA-NoH">
<items>
<menuItem title="Start Speaking" id="Ynk-f8-cLZ">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="startSpeaking:" target="-1" id="654-Ng-kyl"/>
</connections>
</menuItem>
<menuItem title="Stop Speaking" id="Oyz-dy-DGm">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="stopSpeaking:" target="-1" id="dX8-6p-jy9"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Format" id="jxT-CU-nIS">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Format" id="GEO-Iw-cKr">
<items>
<menuItem title="Font" id="Gi5-1S-RQB">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Font" systemMenu="font" id="aXa-aM-Jaq">
<items>
<menuItem title="Show Fonts" keyEquivalent="t" id="Q5e-8K-NDq">
<connections>
<action selector="orderFrontFontPanel:" target="YLy-65-1bz" id="WHr-nq-2xA"/>
</connections>
</menuItem>
<menuItem title="Bold" tag="2" keyEquivalent="b" id="GB9-OM-e27">
<connections>
<action selector="addFontTrait:" target="YLy-65-1bz" id="hqk-hr-sYV"/>
</connections>
</menuItem>
<menuItem title="Italic" tag="1" keyEquivalent="i" id="Vjx-xi-njq">
<connections>
<action selector="addFontTrait:" target="YLy-65-1bz" id="IHV-OB-c03"/>
</connections>
</menuItem>
<menuItem title="Underline" keyEquivalent="u" id="WRG-CD-K1S">
<connections>
<action selector="underline:" target="-1" id="FYS-2b-JAY"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="5gT-KC-WSO"/>
<menuItem title="Bigger" tag="3" keyEquivalent="+" id="Ptp-SP-VEL">
<connections>
<action selector="modifyFont:" target="YLy-65-1bz" id="Uc7-di-UnL"/>
</connections>
</menuItem>
<menuItem title="Smaller" tag="4" keyEquivalent="-" id="i1d-Er-qST">
<connections>
<action selector="modifyFont:" target="YLy-65-1bz" id="HcX-Lf-eNd"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="kx3-Dk-x3B"/>
<menuItem title="Kern" id="jBQ-r6-VK2">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Kern" id="tlD-Oa-oAM">
<items>
<menuItem title="Use Default" id="GUa-eO-cwY">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="useStandardKerning:" target="-1" id="6dk-9l-Ckg"/>
</connections>
</menuItem>
<menuItem title="Use None" id="cDB-IK-hbR">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="turnOffKerning:" target="-1" id="U8a-gz-Maa"/>
</connections>
</menuItem>
<menuItem title="Tighten" id="46P-cB-AYj">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="tightenKerning:" target="-1" id="hr7-Nz-8ro"/>
</connections>
</menuItem>
<menuItem title="Loosen" id="ogc-rX-tC1">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="loosenKerning:" target="-1" id="8i4-f9-FKE"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Ligatures" id="o6e-r0-MWq">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Ligatures" id="w0m-vy-SC9">
<items>
<menuItem title="Use Default" id="agt-UL-0e3">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="useStandardLigatures:" target="-1" id="7uR-wd-Dx6"/>
</connections>
</menuItem>
<menuItem title="Use None" id="J7y-lM-qPV">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="turnOffLigatures:" target="-1" id="iX2-gA-Ilz"/>
</connections>
</menuItem>
<menuItem title="Use All" id="xQD-1f-W4t">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="useAllLigatures:" target="-1" id="KcB-kA-TuK"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Baseline" id="OaQ-X3-Vso">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Baseline" id="ijk-EB-dga">
<items>
<menuItem title="Use Default" id="3Om-Ey-2VK">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="unscript:" target="-1" id="0vZ-95-Ywn"/>
</connections>
</menuItem>
<menuItem title="Superscript" id="Rqc-34-cIF">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="superscript:" target="-1" id="3qV-fo-wpU"/>
</connections>
</menuItem>
<menuItem title="Subscript" id="I0S-gh-46l">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="subscript:" target="-1" id="Q6W-4W-IGz"/>
</connections>
</menuItem>
<menuItem title="Raise" id="2h7-ER-AoG">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="raiseBaseline:" target="-1" id="4sk-31-7Q9"/>
</connections>
</menuItem>
<menuItem title="Lower" id="1tx-W0-xDw">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="lowerBaseline:" target="-1" id="OF1-bc-KW4"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem isSeparatorItem="YES" id="Ndw-q3-faq"/>
<menuItem title="Show Colors" keyEquivalent="C" id="bgn-CT-cEk">
<connections>
<action selector="orderFrontColorPanel:" target="-1" id="mSX-Xz-DV3"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="iMs-zA-UFJ"/>
<menuItem title="Copy Style" keyEquivalent="c" id="5Vv-lz-BsD">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="copyFont:" target="-1" id="GJO-xA-L4q"/>
</connections>
</menuItem>
<menuItem title="Paste Style" keyEquivalent="v" id="vKC-jM-MkH">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="pasteFont:" target="-1" id="JfD-CL-leO"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Text" id="Fal-I4-PZk">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Text" id="d9c-me-L2H">
<items>
<menuItem title="Align Left" keyEquivalent="{" id="ZM1-6Q-yy1">
<connections>
<action selector="alignLeft:" target="-1" id="zUv-R1-uAa"/>
</connections>
</menuItem>
<menuItem title="Center" keyEquivalent="|" id="VIY-Ag-zcb">
<connections>
<action selector="alignCenter:" target="-1" id="spX-mk-kcS"/>
</connections>
</menuItem>
<menuItem title="Justify" id="J5U-5w-g23">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="alignJustified:" target="-1" id="ljL-7U-jND"/>
</connections>
</menuItem>
<menuItem title="Align Right" keyEquivalent="}" id="wb2-vD-lq4">
<connections>
<action selector="alignRight:" target="-1" id="r48-bG-YeY"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="4s2-GY-VfK"/>
<menuItem title="Writing Direction" id="H1b-Si-o9J">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Writing Direction" id="8mr-sm-Yjd">
<items>
<menuItem title="Paragraph" enabled="NO" id="ZvO-Gk-QUH">
<modifierMask key="keyEquivalentModifierMask"/>
</menuItem>
<menuItem id="YGs-j5-SAR">
<string key="title"> Default</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeBaseWritingDirectionNatural:" target="-1" id="qtV-5e-UBP"/>
</connections>
</menuItem>
<menuItem id="Lbh-J2-qVU">
<string key="title"> Left to Right</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeBaseWritingDirectionLeftToRight:" target="-1" id="S0X-9S-QSf"/>
</connections>
</menuItem>
<menuItem id="jFq-tB-4Kx">
<string key="title"> Right to Left</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeBaseWritingDirectionRightToLeft:" target="-1" id="5fk-qB-AqJ"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="swp-gr-a21"/>
<menuItem title="Selection" enabled="NO" id="cqv-fj-IhA">
<modifierMask key="keyEquivalentModifierMask"/>
</menuItem>
<menuItem id="Nop-cj-93Q">
<string key="title"> Default</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeTextWritingDirectionNatural:" target="-1" id="lPI-Se-ZHp"/>
</connections>
</menuItem>
<menuItem id="BgM-ve-c93">
<string key="title"> Left to Right</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeTextWritingDirectionLeftToRight:" target="-1" id="caW-Bv-w94"/>
</connections>
</menuItem>
<menuItem id="RB4-Sm-HuC">
<string key="title"> Right to Left</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeTextWritingDirectionRightToLeft:" target="-1" id="EXD-6r-ZUu"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem isSeparatorItem="YES" id="fKy-g9-1gm"/>
<menuItem title="Show Ruler" id="vLm-3I-IUL">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleRuler:" target="-1" id="FOx-HJ-KwY"/>
</connections>
</menuItem>
<menuItem title="Copy Ruler" keyEquivalent="c" id="MkV-Pr-PK5">
<modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
<connections>
<action selector="copyRuler:" target="-1" id="71i-fW-3W2"/>
</connections>
</menuItem>
<menuItem title="Paste Ruler" keyEquivalent="v" id="LVM-kO-fVI">
<modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
<connections>
<action selector="pasteRuler:" target="-1" id="cSh-wd-qM2"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="View" id="H8h-7b-M4v">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="View" id="HyV-fh-RgO">
<items>
<menuItem title="Show Toolbar" keyEquivalent="t" id="snW-S8-Cw5">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="toggleToolbarShown:" target="-1" id="BXY-wc-z0C"/>
</connections>
</menuItem>
<menuItem title="Customize Toolbar…" id="1UK-8n-QPP">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="runToolbarCustomizationPalette:" target="-1" id="pQI-g3-MTW"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Window" id="aUF-d1-5bR">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Window" systemMenu="window" id="Td7-aD-5lo">
<items>
<menuItem title="Minimize" keyEquivalent="m" id="OY7-WF-poV">
<connections>
<action selector="performMiniaturize:" target="-1" id="VwT-WD-YPe"/>
</connections>
</menuItem>
<menuItem title="Zoom" id="R4o-n2-Eq4">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="performZoom:" target="-1" id="DIl-cC-cCs"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="eu3-7i-yIM"/>
<menuItem title="Bring All to Front" id="LE2-aR-0XJ">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="arrangeInFront:" target="-1" id="DRN-fu-gQh"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Help" id="wpr-3q-Mcd">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Help" systemMenu="help" id="F2S-fz-NVQ">
<items>
<menuItem title="stts Help" keyEquivalent="?" id="FKE-Sm-Kum">
<connections>
<action selector="showHelp:" target="-1" id="y7X-2Q-9no"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
</items>
<point key="canvasLocation" x="139" y="154"/>
</menu>
</objects>
</document>
================================================
FILE: Resources/Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIconFile</key>
<string>AppIcon.icon</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>$(MARKETING_VERSION)</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>$(CURRENT_PROJECT_VERSION)</string>
<key>ITSAppUsesNonExemptEncryption</key>
<false/>
<key>LSApplicationCategoryType</key>
<string>public.app-category.utilities</string>
<key>LSMinimumSystemVersion</key>
<string>$(MACOSX_DEPLOYMENT_TARGET)</string>
<key>LSUIElement</key>
<true/>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>status.aws.amazon.com</key>
<dict>
<key>NSExceptionMinimumTLSVersion</key>
<string>TLSv1.0</string>
<key>NSExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
<key>status.beanstalkapp.com</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
</dict>
<key>status.evernote.com</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
</dict>
</dict>
</dict>
<key>NSHumanReadableCopyright</key>
<string>Copyright © 2016 Mahdi Bchetnia. All rights reserved.</string>
<key>NSMainNibFile</key>
<string>MainMenu</string>
<key>NSPrincipalClass</key>
<string>NSApplication</string>
</dict>
</plist>
================================================
FILE: Resources/services.json
================================================
{
"betterstack": [
{
"name": "Better Stack",
"url": "https://status.betterstack.com",
"old_names": [
"BetterStack"
]
},
{
"name": "BuildJet",
"url": "https://status.buildjet.com"
},
{
"name": "Keygen",
"url": "https://status.keygen.sh"
},
{
"name": "Runway: App Store Connect",
"url": "https://runway-asc.betteruptime.com",
"old_names": [
"RunwayASC"
]
},
{
"name": "Unraid",
"url": "https://status.unraid.net"
}
],
"betteruptime": [
{
"name": "Plausible Analytics",
"url": "https://status.plausible.io",
"old_names": [
"PlausibleAnalytics"
]
},
{
"name": "Runway",
"url": "https://status.runway.team"
},
],
"cstate": [
{
"name": "Civo",
"url": "https://status.civo.com/"
}
],
"incidentio": [
{
"name": "Aiven",
"url": "https://status.aiven.io"
},
{
"name": "Brevo",
"url": "https://status.brevo.com",
"old_names": [
"Sendinblue"
]
},
{
"name": "Code Climate",
"url": "https://status.codeclimate.com",
"old_names": [
"CodeClimate"
]
},
{
"name": "HashiCorp",
"url": "https://status.hashicorp.com"
},
{
"name": "Intercom - AU Hosting",
"url": "https://www.intercomstatus.com/au-hosting",
"old_names": [
"IntercomAU"
]
},
{
"name": "Intercom - EU Hosting",
"url": "https://www.intercomstatus.com/eu-hosting",
"old_names": [
"IntercomEU"
]
},
{
"name": "Intercom - US Hosting",
"url": "https://www.intercomstatus.com/us-hosting",
"old_names": [
"IntercomUS",
"Intercom"
]
},
{
"name": "Linear",
"url": "https://linearstatus.com"
},
{
"name": "OneSignal",
"url": "https://status.onesignal.com"
},
{
"name": "OpenAI",
"url": "https://status.openai.com"
},
{
"name": "Rollbar",
"url": "https://status.rollbar.com"
},
{
"name": "Strategic Roadmaps",
"url": "https://status.roadmunk.com",
"old_names": [
"Roadmunk"
]
},
{
"name": "Tempo",
"url": "https://status.tempo.io"
},
{
"name": "Zapier",
"url": "https://status.zapier.com"
}
],
"instatus": [
{
"name": "Bitmovin",
"url": "https://status.bitmovin.com"
},
{
"name": "Instatus",
"url": "https://instat.us"
},
{
"name": "Primcloud",
"url": "https://primcloud.instatus.com"
},
{
"name": "Railway",
"url": "https://status.railway.app"
},
{
"name": "Sketch",
"url": "https://status.sketch.com"
},
{
"name": "Threader",
"url": "https://threader.instatus.com"
},
{
"name": "Whereby",
"url": "https://wherebystatus.com"
},
{
"name": "mastodon.social",
"url": "https://status.mastodon.social",
"old_names": [
"MastodonSocial"
]
}
],
"lamb": [
{
"name": "Codacy",
"url": "https://status.codacy.com"
}
],
"miro": [
{
"name": "Miro (AU)",
"url": "https://status.miro.com/au",
"subservice": true
},
{
"name": "Miro (EU)",
"url": "https://status.miro.com/eu",
"subservice": true
},
{
"name": "Miro (US)",
"url": "https://status.miro.com/us",
"subservice": true
}
],
"site24x7": [
{
"name": "Canonical",
"url": "https://status.canonical.com",
"id": "KNms6QK9ewuzz-7xUsPsN927u5djVcb3oZX1-zOu_go="
},
{
"name": "Site24x7",
"url": "https://status.site24x7.com",
"id": "7Ca9wFlVF-AlbjpE2tzER6FUegHamCQNyZF5CbAffCs="
}
],
"sorry": [
{
"name": "Pingdom",
"url": "https://status.pingdom.com",
"id": "2273"
},
{
"name": "Pipedrive",
"url": "https://status.pipedrive.com",
"id": "2754"
},
{
"name": "Postmark",
"url": "https://status.postmarkapp.com",
"id": "12903"
}
],
"statusiov1": [
{
"name": "ClickUp",
"url": "https://status.clickup.com",
"id": "5b6e0963c662144d00913a09"
},
{
"name": "CoreWeave",
"url": "https://status.coreweave.com",
"id": "5e126e998f2f032e1f8f0f4b"
},
{
"name": "Dashlane",
"url": "https://status.dashlane.com",
"id": "5aabcb89fccc4b04d3774443"
},
{
"name": "Docker",
"url": "https://status.docker.com",
"id": "533c6539221ae15e3f000031"
},
{
"name": "GitLab",
"url": "https://status.gitlab.com",
"id": "5b36dc6502d06804c08349f7"
},
{
"name": "Let's Encrypt",
"url": "https://letsencrypt.status.io",
"id": "55957a99e800baa4470002da",
"old_names": [
"LetsEncrypt"
]
},
{
"name": "OneLogin (EU)",
"url": "https://status.eu.onelogin.com",
"id": "54da2ea0e6bd61bf0d00002b",
"old_names": [
"OneLoginEU"
]
},
{
"name": "OneLogin (US)",
"url": "https://status.us.onelogin.com",
"id": "538511e2ce5cb97537000144",
"old_names": [
"OneLoginUS"
]
},
{
"name": "Roblox",
"url": "https://status.roblox.com",
"id": "59db90dbcdeb2f04dadcf16d"
},
{
"name": "SumoLogic",
"url": "https://status.sumologic.com",
"id": "5ea1c7ba3f2f1604b93ca38e"
}
],
"statuscake": [
{
"name": "MailChimp",
"url": "https://status.mailchimp.com",
"id": "58JncZazfp"
}
],
"statuscast": [
{
"name": "8x8",
"url": "https://status.8x8.com",
"hasCurrentStatus": false,
"old_names": [
"EightXEight"
]
},
{
"name": "Airship (EU)",
"url": "https://status.airship.eu",
"hasCurrentStatus": true,
"old_names": [
"AirshipEU"
]
},
{
"name": "Airship (US)",
"url": "https://status.airship.com",
"hasCurrentStatus": true,
"old_names": [
"AirshipUS",
"UrbanAirship"
]
},
{
"name": "Campaign Monitor",
"url": "https://status.campaignmonitor.com",
"hasCurrentStatus": true,
"old_names": [
"CampaignMonitor"
]
},
{
"name": "StatusCast",
"url": "https://status.statuscast.com",
"hasCurrentStatus": false
}
],
"statushub": [
{
"name": "WP Engine",
"url": "https://wpenginestatus.com",
"old_names": [
"WPEngine"
]
}
],
"statuspage": [
{
"name": "1Password",
"url": "https://1password.statuspage.io",
"id": "z5s8xghvb0vf",
"old_names": [
"OnePassword"
]
},
{
"name": "Acoustic",
"url": "https://status.goacoustic.com",
"id": "rx9084q34820"
},
{
"name": "Acquia",
"url": "https://status.acquia.com",
"id": "c3bdbqpxhzcc"
},
{
"name": "Airbase",
"url": "https://status.airbase.com",
"id": "pc6tsj7kht1c"
},
{
"name": "Alert Logic",
"url": "https://status.alertlogic.com",
"id": "bkbjcmdhhfbp",
"old_names": [
"AlertLogic"
]
},
{
"name": "Anthropic",
"url": "https://status.anthropic.com",
"id": "tymt9n04zgry"
},
{
"name": "Aptible",
"url": "https://status.aptible.com",
"id": "fmwgqnbnbc4r"
},
{
"name": "Asana",
"url": "https://trust.asana.com",
"id": "w58858w0sjxx"
},
{
"name": "Atlassian Access",
"url": "https://access.status.atlassian.com",
"id": "5qmgwsxwsz78",
"old_names": [
"AtlassianAccess"
]
},
{
"name": "Atlassian Developer",
"url": "https://developer.status.atlassian.com",
"id": "n8766lc3ybbs",
"old_names": [
"AtlassianDeveloper"
]
},
{
"name": "Atlassian Partners",
"url": "https://partners.status.atlassian.com",
"id": "tfc0vzc0cq1n",
"old_names": [
"AtlassianPartners"
]
},
{
"name": "Atlassian Statuspage",
"url": "https://metastatuspage.com",
"id": "y2j98763l56x",
"host": "metastatuspage.com",
"old_names": [
"StatusPage",
"Statuspage"
]
},
{
"name": "Atlassian Support",
"url": "https://support.status.atlassian.com",
"id": "3tbw4lb9t3qp",
"old_names": [
"AtlassianSupport"
]
},
{
"name": "AuroraSolar",
"url": "https://status.aurorasolar.com",
"id": "vbgjcnqcyyw7"
},
{
"name": "Auth0",
"url": "https://status.auth0.com",
"id": "8q60stg1rk7l"
},
{
"name": "Authorize.Net",
"url": "https://status.authorize.net",
"id": "06v575cbzlpr",
"old_names": [
"AuthorizeNet"
]
},
{
"name": "Avalara",
"url": "https://status.avalara.com",
"id": "m10fpsk86bhy"
},
{
"name": "Basecamp",
"url": "https://www.basecampstatus.com",
"id": "thc30769z1m9"
},
{
"name": "BigCommerce",
"url": "https://status.bigcommerce.com",
"id": "qbn4dyd29jby"
},
{
"name": "Bitbucket",
"url": "https://bitbucket.status.atlassian.com",
"id": "bqlf8qjztdtr",
"old_names": [
"BitBucket"
]
},
{
"name": "Bitrise",
"url": "https://status.bitrise.io",
"id": "1q8r4n02vb2k"
},
{
"name": "Blend",
"url": "https://status.blend.com",
"id": "wp6n3nr9gm7w"
},
{
"name": "Bolt",
"url": "https://status.bolt.com",
"id": "hgyc600tg2jq"
},
{
"name": "Box",
"url": "https://status.box.com",
"id": "208q92hckwws"
},
{
"name": "Branch",
"url": "https://status.branch.io",
"id": "74brn6fz1jt2"
},
{
"name": "Bugsnag",
"url": "https://status.bugsnag.com",
"id": "6xl1gdp6yn0x"
},
{
"name": "Buildkite",
"url": "https://www.buildkitestatus.com",
"id": "ltljpr68dygn"
},
{
"name": "Bullhorn",
"url": "https://status.bullhorn.com",
"id": "cdxw86qkmw3x"
},
{
"name": "Chargebee",
"url": "https://status.chargebee.com",
"id": "7h56br5y94wh"
},
{
"name": "Checkly",
"url": "https://is.checkly.online",
"id": "nq8lf8mrmvw6"
},
{
"name": "CircleCI",
"url": "https://status.circleci.com",
"id": "6w4r0ttlx5ft"
},
{
"name": "Click",
"url": "https://status.clicksoftware.com",
"id": "57wtfpyjb9p3"
},
{
"name": "Cloud66",
"url": "https://status.cloud66.com",
"id": "mpfrt81d47gt"
},
{
"name": "CloudAMQP",
"url": "https://status.cloudamqp.com",
"id": "2126xm8ctzlk"
},
{
"name": "CloudApp",
"url": "https://status.getcloudapp.com",
"id": "jv7lgzmdfxr1"
},
{
"name": "Cloudflare",
"url": "https://www.cloudflarestatus.com",
"id": "yh6f0r4529hb"
},
{
"name": "Cloudinary",
"url": "https://status.cloudinary.com",
"id": "d8rszhl2bj7r"
},
{
"name": "Clubhouse",
"url": "https://status.clubhouse.io",
"id": "27fcn0qntr9w"
},
{
"name": "CocoaPods",
"url": "https://status.cocoapods.org",
"id": "7k11xygtyyyg"
},
{
"name": "Codecov",
"url": "https://status.codecov.io",
"id": "wdzsn5dlywj9"
},
{
"name": "CoderPad",
"url": "https://status.coderpad.io",
"id": "29rb067ttd9j"
},
{
"name": "Coinbase",
"url": "https://status.coinbase.com",
"id": "kr0djjh0jyy9"
},
{
"name": "Compass",
"url": "https://compass.status.atlassian.com",
"id": "6b7xgjptl20c"
},
{
"name": "Confluence",
"url": "https://confluence.status.atlassian.com",
"id": "4g2my7tbhjsq"
},
{
"name": "Confluent Cloud",
"url": "https://status.confluent.cloud",
"id": "3yz1tdpdnjl3",
"old_names": [
"ConfluentCloud"
]
},
{
"name": "Contentful",
"url": "https://www.contentfulstatus.com",
"id": "4bv17htq00cz"
},
{
"name": "Coveralls",
"url": "https://status.coveralls.io",
"id": "3h72wtpg5fqs"
},
{
"name": "Cursor",
"url": "https://status.cursor.com/",
"id": "0tp9ssgtptvs"
},
{
"name": "Customer.io",
"url": "https://status.customerio.com",
"id": "w4qr97njbszt",
"old_names": [
"Customerio"
]
},
{
"name": "Cybersource",
"url": "https://status.cybersource.com",
"id": "ttbtd8wrjg1b"
},
{
"name": "Cypress",
"url": "https://www.cypressstatus.com/",
"id": "prr339fdc8ry"
},
{
"name": "DNSimple",
"url": "https://dnsimple.statuspage.io",
"id": "tjym90yyv2zt"
},
{
"name": "Datadog",
"url": "https://status.datadoghq.com",
"id": "1k6wzpspjf99"
},
{
"name": "Datadog (EU)",
"url": "https://status.datadoghq.eu",
"id": "5by3sysm209d",
"old_names": [
"DatadogEU"
]
},
{
"name": "DeepSeek",
"url": "https://status.deepseek.com",
"id": "0db0rq26tg1l"
},
{
"name": "Dialpad",
"url": "https://status.dialpad.com",
"id": "80trk830s0hg"
},
{
"name": "DigitalOcean",
"url": "https://status.digitalocean.com",
"id": "w4cz49tckxhp"
},
{
"name": "Discord",
"url": "https://status.discordapp.com",
"id": "srhpyqt94yxb"
},
{
"name": "Doppler",
"url": "https://www.dopplerstatus.com",
"id": "05hwsyqkr9z7"
},
{
"name": "Dropbox",
"url": "https://status.dropbox.com",
"id": "t34htyd6jblf"
},
{
"name": "Duo",
"url": "https://status.duo.com",
"id": "qrxf5mzbrsxw"
},
{
"name": "Dwolla",
"url": "https://status.dwolla.com",
"id": "tnynfs0nwlgr"
},
{
"name": "EasyPost",
"url": "https://www.easypoststatus.com",
"id": "n1jtz5983249"
},
{
"name": "Egnyte",
"url": "https://status.egnyte.com",
"id": "jr196z1ns266"
},
{
"name": "Elastic Cloud",
"url": "https://cloud-status.elastic.co",
"id": "8wpbdv4sl8gv",
"old_names": [
"ElasticCloud"
]
},
{
"name": "Emailable",
"url": "https://status.emailable.com",
"id": "ntzxwsjy15bq"
},
{
"name": "Engine Yard",
"url": "https://status.engineyard.com",
"id": "76sphw1bc50q",
"old_names": [
"EngineYard"
]
},
{
"name": "Equinix Metal",
"url": "https://status.equinixmetal.com",
"id": "39f8vhy6rw5d",
"old_names": [
"EquinixMetal",
"Packet"
]
},
{
"name": "Figma",
"url": "https://status.figma.com",
"id": "rxpksf93ynw6"
},
{
"name": "Files.com",
"url": "https://status.files.com",
"id": "qcl58pn3j90b",
"old_names": [
"FilesCom",
"Lumanox"
]
},
{
"name": "Filestack",
"url": "https://status.filestack.com",
"id": "z8cjgbr8sqmh"
},
{
"name": "Fivetran",
"url": "https://status.fivetran.com",
"id": "2lfd8mfks09w"
},
{
"name": "Fleek",
"url": "https://status.fleek.xyz",
"id": "0flwwyd0s5n2"
},
{
"name": "Fly.io",
"url": "https://status.flyio.net",
"id": "65rccr4mbblw",
"old_names": [
"Flyio"
]
},
{
"name": "FreeAgent",
"url": "https://status.freeagent.com",
"id": "tn2dcgpy021r"
},
{
"name": "Gandi.net",
"url": "https://status.gandi.net",
"id": "xnm08yh10bv5",
"old_names": [
"Gandi"
]
},
{
"name": "GitHub",
"url": "https://www.githubstatus.com",
"id": "kctbh9vrtdwd"
},
{
"name": "HelloSign / HelloFax",
"url": "https://status.hellosign.com",
"id": "djw9397fmqd1",
"old_names": [
"HelloSignHelloFax"
]
},
{
"name": "HouseCanary",
"url": "https://status.housecanary.com/",
"id": "pkkpjjckfnnb"
},
{
"name": "HubSpot",
"url": "https://status.hubspot.com",
"id": "8b9w1wwq3g7d"
},
{
"name": "Internet Computer",
"url": "https://status.internetcomputer.org",
"id": "kc2llmsd16bk",
"old_names": [
"InternetComputer"
]
},
{
"name": "JAMF",
"url": "https://status.jamf.com",
"id": "5z7bmx2nb2yj"
},
{
"name": "Jira Align",
"url": "https://jira-align.status.atlassian.com",
"id": "jrg4crndtsgz",
"old_names": [
"JiraAlign"
]
},
{
"name": "Jira Product Discovery",
"url": "https://jira-product-discovery.status.atlassian.com",
"id": "qmzzdxyvmbmk",
"old_names": [
"JiraProductDiscovery"
]
},
{
"name": "Jira Service Management",
"url": "https://jira-service-management.status.atlassian.com",
"id": "pv54g7ltsc24",
"old_names": [
"JiraServiceManagement"
]
},
{
"name": "Jira Software",
"url": "https://jira-software.status.atlassian.com",
"id": "7yh3h3y0c0x1",
"old_names": [
"JiraSoftware"
]
},
{
"name": "Jira Work Management",
"url": "https://jira-work-management.status.atlassian.com",
"id": "s6f0gm5gcpmy",
"old_names": [
"JiraWorkManagement"
]
},
{
"name": "JumpCloud",
"url": "https://status.jumpcloud.com",
"id": "nflr6k3n1c0h"
},
{
"name": "KeenIO",
"url": "https://status.keen.io",
"id": "z3mvdbpvy7yh"
},
{
"name": "Keeper Security",
"url": "https://statuspage.keeper.io",
"id": "wg5bvczw1rtf",
"old_names": [
"KeeperSecurity"
]
},
{
"name": "Kentik",
"url": "https://status.kentik.com",
"id": "25fy3sprxcv3"
},
{
"name": "Kustomer",
"url": "https://status.kustomer.com",
"id": "lhn2sb4njk08"
},
{
"name": "LastPass",
"url": "https://status.lastpass.com",
"id": "ytnz8gj3wjpg"
},
{
"name": "Lattice",
"url": "https://status.lattice.com",
"id": "gj13f8gmt9b6"
},
{
"name": "LaunchDarkly",
"url": "https://status.launchdarkly.com",
"id": "9404kdk7lkn7"
},
{
"name": "Lever",
"url": "https://status.lever.co",
"id": "34ygfdwr11jd"
},
{
"name": "LinkedIn API",
"url": "https://linkedin.statuspage.io",
"id": "mxfydrt8b8xw",
"old_names": [
"LinkedInAPI"
]
},
{
"name": "Linode",
"url": "https://status.linode.com",
"id": "8dn0wstr1chc"
},
{
"name": "Lob",
"url": "https://lob.statuspage.io",
"id": "2xkb3rfdd3lg"
},
{
"name": "Loggly",
"url": "https://status.loggly.com",
"id": "701xnxqmhdh3"
},
{
"name": "Loom",
"url": "https://loom.status.atlassian.com",
"id": "j9r9w5bcs26w"
},
{
"name": "Mailgun",
"url": "https://status.mailgun.com",
"id": "6jp439mdyy0k"
},
{
"name": "Mapbox",
"url": "https://status.mapbox.com",
"id": "l363gv8nm9gc"
},
{
"name": "Medium",
"url": "https://medium.statuspage.io",
"id": "q9n7m9kv0533"
},
{
"name": "MeridianLink",
"url": "https://status.meridianlink.com",
"id": "n1pskh7dw1c1"
},
{
"name": "MessageBird",
"url": "https://status.messagebird.com",
"id": "xf8120tyqx8n"
},
{
"name": "Mixpanel",
"url": "https://status.mixpanel.com",
"id": "x4m91ldrf511"
},
{
"name": "Mode Analytics",
"url": "https://status.modeanalytics.com",
"id": "th35d4vb90h8",
"old_names": [
"ModeAnalytics"
]
},
{
"name": "MongoDB Cloud",
"url": "https://status.cloud.mongodb.com",
"id": "smhnl3lt74kc",
"old_names": [
"MongoDBCloud"
]
},
{
"name": "Mozilla",
"url": "https://status.services.mozilla.com",
"id": "29l4z1kld06b",
"old_names": [
"FirefoxRelay"
]
},
{
"name": "Mural",
"url": "https://status.mural.co",
"id": "dbk70dpy3n7h"
},
{
"name": "Nasdaq Data Link",
"url": "https://status.data.nasdaq.com",
"id": "dyfxchz1hcb1",
"old_names": [
"NasdaqDataLink",
"Quandl"
]
},
{
"name": "Netlify",
"url": "https://www.netlifystatus.com",
"id": "83dz7syz0j3x"
},
{
"name": "New Relic",
"url": "https://status.newrelic.com",
"id": "nwg5xmnm9d17",
"old_names": [
"NewRelic"
]
},
{
"name": "Notion",
"url": "https://status.notion.so",
"id": "kgl53swp0yg1"
},
{
"name": "Opsgenie",
"url": "https://opsgenie.status.atlassian.com",
"id": "t05vdsszxwtq"
},
{
"name": "Pantheon",
"url": "https://status.pantheon.io",
"id": "80f0zgsx80zh"
},
{
"name": "Papertrail",
"url": "https://www.papertrailstatus.com",
"id": "0n5jhb30j32t"
},
{
"name": "Pardot",
"url": "https://trust.pardot.com",
"id": "j0hnsfnqtllz"
},
{
"name": "Pendo",
"url": "https://status.pendo.io",
"id": "qxvy69hcwh22"
},
{
"name": "Planning Center",
"url": "https://status.planningcenter.com",
"id": "mj14zc034yxl",
"old_names": [
"PlanningCenter"
]
},
{
"name": "Platform.sh",
"url": "https://status.platform.sh",
"id": "l2x5n4czt1ph",
"old_names": [
"PlatformSH"
]
},
{
"name": "PlayFab",
"url": "https://status.playfab.com",
"id": "hndmlgmdcpdk"
},
{
"name": "Poka",
"url": "https://www.pokastatus.io",
"id": "6gqznhly63gc"
},
{
"name": "Productboard",
"url": "https://status.productboard.com",
"id": "wwwnvh1nlpt1"
},
{
"name": "Proton",
"url": "https://status.proton.me",
"id": "wy8ls9q1ttmm",
"old_names": [
"ProtonMail"
]
},
{
"name": "PubNub",
"url": "https://status.pubnub.com",
"id": "j2pr9thwz01t"
},
{
"name": "Pusher",
"url": "https://status.pusher.com",
"id": "p6t5x7tdq8yq"
},
{
"name": "Python",
"url": "https://status.python.org",
"id": "2p66nmmycsj3"
},
{
"name": "QuickBooks",
"url": "https://status.quickbooks.intuit.com",
"id": "2dv2gqw9hrgc"
},
{
"name": "ReadMe",
"url": "https://www.readmestatus.com",
"id": "nz3r09cr7dk1"
},
{
"name": "Recruiterbox",
"url": "https://status.recruiterbox.com",
"id": "mnlrk0049tgf"
},
{
"name": "Red Hat",
"url": "https://status.redhat.com",
"id": "dn6mqn7xvzz3",
"old_names": [
"RedHat"
]
},
{
"name": "Reddit",
"url": "https://www.redditstatus.com",
"id": "2kbc0d48tv3j"
},
{
"name": "RevenueCat",
"url": "https://status.revenuecat.com",
"id": "d7wjfp7kgjkd"
},
{
"name": "Robin",
"url": "https://status.robinpowered.com",
"id": "4hy25vm4h6fc"
},
{
"name": "Robinhood",
"url": "https://status.robinhood.com",
"id": "49plxygx5s1k"
},
{
"name": "RubyGems",
"url": "https://status.rubygems.org",
"id": "pclby00q90vc"
},
{
"name": "Sauce Labs",
"url": "https://status.saucelabs.com",
"id": "kd2w7ghdk56w",
"old_names": [
"SauceLabs"
]
},
{
"name": "Scaleway",
"url": "https://status.scaleway.com",
"id": "s2kbtscly3pj"
},
{
"name": "SecurID",
"url": "https://status.securid.com",
"id": "1xw7gmwkm0bg"
},
{
"name": "Segment",
"url": "https://status.segment.com",
"id": "yzw83vcxbysq"
},
{
"name": "Semaphore",
"url": "https://status.semaphoreci.com",
"id": "zq6qk8cct5d8"
},
{
"name": "SendGrid",
"url": "https://status.sendgrid.com",
"id": "3tgl2vf85cht"
},
{
"name": "Sentry",
"url": "https://status.sentry.io",
"id": "t687h3m0nh65"
},
{
"name": "Shopify",
"url": "https://www.shopifystatus.com",
"id": "d33g96wd23dd"
},
{
"name": "Smarty",
"url": "https://status.smarty.com",
"id": "q1z5r94tnt56",
"old_names": [
"SmartyStreets"
]
},
{
"name": "Snowflake",
"url": "https://status.snowflake.com",
"id": "94s7z8vpy1n8"
},
{
"name": "Snyk",
"url": "https://snyk.statuspage.io",
"id": "myj6w6kw42c6"
},
{
"name": "Squarespace",
"url": "https://status.squarespace.com",
"id": "1jkhm1drpysj"
},
{
"name": "Stream",
"url": "https://status.getstream.io",
"id": "gsms7w17y9wc"
},
{
"name": "Teleport Cloud",
"url": "https://status.teleport.sh",
"id": "j16wc0h3wc86",
"old_names": [
"TeleportCloud"
]
},
{
"name": "Temporal",
"url": "https://status.temporal.io",
"id": "dnmfkqzkp304"
},
{
"name": "TravisCI",
"url": "https://www.traviscistatus.com",
"id": "pnpcptp8xh9k"
},
{
"name": "Trello",
"url": "https://trello.status.atlassian.com",
"id": "h5frqhb041yq"
},
{
"name": "Twilio",
"url": "https://status.twilio.com",
"id": "gpkpyklzq55q"
},
{
"name": "Twitch",
"url": "https://status.twitch.tv",
"id": "yfj40zdsk34s"
},
{
"name": "Tyk",
"url": "https://status.tyk.io/",
"id": "wygv0lcrzvq7"
},
{
"name": "Typeform",
"url": "https://status.typeform.com",
"id": "fv5fyw3p7k8n"
},
{
"name": "Unsplash",
"url": "https://status.unsplash.com",
"id": "gcw6g25tpdkv"
},
{
"name": "VMware Workspace ONE",
"url": "https://status.workspaceone.com",
"id": "3l65ysrm5cly",
"old_names": [
"VMwareWorkspaceONE"
]
},
{
"name": "Vercel",
"url": "https://www.vercel-status.com",
"id": "lvglq8h0mdyh"
},
{
"name": "VictorOps",
"url": "https://status.victorops.com",
"id": "tj7j024mr40d"
},
{
"name": "Vimeo",
"url": "https://www.vimeostatus.com",
"id": "sccqh0pnqrh8"
},
{
"name": "Visual Studio App Center",
"url": "https://status.appcenter.ms",
"id": "kkc10kz2t8yc",
"old_names": [
"VisualStudioAppCenter"
]
},
{
"name": "Wasabi",
"url": "https://status.wasabi.com",
"id": "2r1tdgqr8ld5"
},
{
"name": "WeTransfer",
"url": "https://wetransfer.statuspage.io",
"id": "sc26zwwp3c0r"
},
{
"name": "Wiz",
"url": "https://status.wiz.io/",
"id": "bgx79l11xfsj"
},
{
"name": "Wodby",
"url": "https://status.wodby.com",
"id": "hmm9v8wzw86x"
},
{
"name": "Workflowy",
"url": "https://status.workflowy.com",
"id": "m8f43n57h83g"
},
{
"name": "Xandr",
"url": "https://status.xandr.com",
"id": "z7jb4dcjs0nl"
},
{
"name": "Zoom",
"url": "https://status.zoom.us",
"id": "14qjgk812kgk"
},
{
"name": "Zwift",
"url": "https://status.zwift.com",
"id": "sj50pfj5p1yv"
},
{
"name": "bunny.net",
"url": "https://status.bunny.net",
"id": "jggkjgplmcdc",
"old_names": [
"Bunnynet"
]
},
{
"name": "imgix",
"url": "https://status.imgix.com",
"id": "032k0f0j3bsz",
"old_names": [
"Imgix"
]
},
{
"name": "logz.io",
"url": "https://status.logz.io",
"id": "flbqdmg201t4",
"old_names": [
"LogzIO"
]
},
{
"name": "npm",
"url": "https://status.npmjs.org",
"id": "wyvgptkd90hm",
"old_names": [
"NPM"
]
}
],
"statuspal": [
{
"name": "Booxi",
"url": "https://status.booxi.com"
},
{
"name": "Exoscale",
"url": "https://exoscalestatus.com"
},
{
"name": "Unity",
"url": "https://status.unity.com"
}
],
"sendbird": [
{
"name": "Sendbird (Canada)",
"url": "https://status-canada.sendbird.com",
"id": "xnlfmklffhwg",
"subservice": true,
"old_names": [
"SendbirdCanada"
]
},
{
"name": "Sendbird (Frankfurt)",
"url": "https://status-frankfurt.sendbird.com/",
"id": "qt3xhnxvn2sw",
"subservice": true,
"old_names": [
"SendbirdFrankfurt"
]
},
{
"name": "Sendbird (Mumbai)",
"url": "https://status-mumbai.sendbird.com/",
"id": "sng1ltdy77pf",
"subservice": true,
"old_names": [
"SendbirdMumbai"
]
},
{
"name": "Sendbird (North Virginia 2)",
"url": "https://status-nvirginia2.sendbird.com/",
"id": "nwc3tc3ghc55",
"subservice": true,
"old_names": [
"SendbirdNorthVirginia2"
]
},
{
"name": "Sendbird (North Virginia)",
"url": "https://status-nvirginia1.sendbird.com/",
"id": "xlrzypr8w8p5",
"subservice": true,
"old_names": [
"SendbirdNorthVirginia"
]
},
{
"name": "Sendbird (Oregon)",
"url": "https://status-oregon.sendbird.com/",
"id": "phbv0js99n45",
"subservice": true,
"old_names": [
"SendbirdOregon"
]
},
{
"name": "Sendbird (Seoul)",
"url": "https://status-seoul.sendbird.com/",
"id": "6r983tc47nw4",
"subservice": true,
"old_names": [
"SendbirdSeoul"
]
},
{
"name": "Sendbird (Singapore 2)",
"url": "https://status-singapore2.sendbird.com/",
"id": "2knm7ggfmh3s",
"subservice": true,
"old_names": [
"SendbirdSingapore2"
]
},
{
"name": "Sendbird (Singapore)",
"url": "https://status-singapore.sendbird.com/",
"id": "phbv0js99n45",
"subservice": true,
"old_names": [
"SendbirdSingapore"
]
},
{
"name": "Sendbird (Sydney)",
"url": "https://status-sydney.sendbird.com/",
"id": "dy9hbf5scsg1",
"subservice": true,
"old_names": [
"SendbirdSydney"
]
},
{
"name": "Sendbird (Tokyo)",
"url": "https://status-tokyo.sendbird.com/",
"id": "rfx6f11vcjtc",
"subservice": true,
"old_names": [
"SendbirdTokyo"
]
}
]
}
================================================
FILE: Scripts/generate_adobe_services.swift
================================================
#!/usr/bin/swift
import Foundation
struct Cloud {
let id: String
let name: String
let products: [Product]
init?(dictionary: [String: Any], productsMap: [String: Product]) {
guard
let id = dictionary["id"] as? String,
let name = dictionary["name"] as? String,
let productIDs = dictionary["cloudProducts"] as? [String]
else {
return nil
}
self.id = id
self.name = name
products = productIDs.compactMap { productsMap[$0] }
}
}
struct Product {
let id: String
let name: String
init?(dictionary: [String: Any]) {
guard
let id = dictionary["id"] as? String,
let name = dictionary["name"] as? String
else {
return nil
}
self.id = id
self.name = name
}
}
struct AdobeService {
enum ServiceType {
case category
case service
case subService
}
let id: String
let parentName: String
let name: String
let type: ServiceType
var className: String {
var sanitizedName = name
sanitizedName = sanitizedName.replacingOccurrences(of: " & ", with: "And")
sanitizedName = sanitizedName.replacingOccurrences(of: "/", with: "")
sanitizedName = sanitizedName.replacingOccurrences(of: ":", with: "")
sanitizedName = sanitizedName.replacingOccurrences(of: "-", with: "")
sanitizedName = sanitizedName.replacingOccurrences(of: ".", with: "")
sanitizedName = sanitizedName.replacingOccurrences(of: "(", with: "")
sanitizedName = sanitizedName.replacingOccurrences(of: ")", with: "")
return sanitizedName
.components(separatedBy: " ")
.map { $0.capitalized(firstLetterOnly: true) }
.joined(separator: "")
}
init(id: String, parentName: String, name: String, type: ServiceType) {
self.id = id
self.parentName = parentName
self.type = type
if !name.hasPrefix("Adobe") {
self.name = "Adobe \(name)"
} else {
self.name = name
}
}
var output: String {
switch type {
case .category:
return """
final class \(className)All: \(className), ServiceCategory {
let categoryName = "\(name)"
let subServiceSuperclass: AnyObject.Type = Base\(className).self
let name = "\(name) (All)"
let id = "\(id)"
}
"""
case .service:
return """
final class \(className): \(parentName) {
let name = "\(name)"
let id = "\(id)"
}
"""
case .subService:
return """
final class \(className): \(parentName), SubService {
let name = "\(name)"
let id = "\(id)"
}
"""
}
}
}
extension String {
func capitalized(firstLetterOnly: Bool) -> String {
return firstLetterOnly ? (prefix(1).capitalized + dropFirst()) : self
}
}
func envVariable(forKey key: String) -> String {
guard let variable = ProcessInfo.processInfo.environment[key] else {
print("error: Environment variable '\(key)' not set")
exit(1)
}
return variable
}
func discoverServices() -> [AdobeService] {
var dataResult: Data?
let semaphore = DispatchSemaphore(value: 0)
let url = URL(string: "https://data.status.adobe.com/adobestatus/SnowServiceRegistry")!
URLSession.shared.dataTask(with: url) { data, _, _ in
dataResult = data
semaphore.signal()
}.resume()
_ = semaphore.wait(timeout: .now() + .seconds(10))
guard
let data = dataResult,
let structure = try? JSONSerialization.jsonObject(with: data) as? [String: Any]
else {
print("warning: Build script generate_adobe_services could not retrieve list of Adobe services")
exit(0)
}
let productsDictionary = (structure["products"] as? [String: Any]) ?? [:]
let productsMap = productsDictionary.compactMapValues { (value: Any) -> Product? in
guard let dict = value as? [String: Any] else { return nil }
return Product(dictionary: dict)
}
let cloudsDictionary = (structure["clouds"] as? [String: Any]) ?? [:]
let clouds = cloudsDictionary.compactMap { (_, value) -> Cloud? in
guard let dict = value as? [String: Any] else { return nil }
return Cloud(dictionary: dict, productsMap: productsMap)
}
var uniqueNames = Set<String>()
// Create the categories from the clouds
var categories = [String: AdobeService]()
clouds.forEach { cloud in
var name = cloud.name
if uniqueNames.contains(name) {
name = "\(name) (\(cloud.id))"
}
uniqueNames.insert(name)
let category = AdobeService(id: cloud.id, parentName: "", name: name, type: .category)
categories[cloud.id] = category
// Create the subservices from the products
cloud.products.forEach { product in
var name = product.name
if uniqueNames.contains(name) {
name = "\(name) (\(product.id))"
}
uniqueNames.insert(name)
let subService = AdobeService(id: product.id, parentName: category.className, name: name, type: .subService)
categories[product.id] = subService
}
}
let result: [AdobeService] = categories.values.sorted {
$0.name.caseInsensitiveCompare($1.name) != .orderedDescending
}
return result
}
func main() {
let srcRoot = envVariable(forKey: "SRCROOT")
let outputPath = "\(srcRoot)/stts/Services/Generated/AdobeServices.swift"
let services = discoverServices()
let header = """
// This file is generated by generate_adobe_services.swift and should not be modified manually.
// swiftlint:disable superfluous_disable_command type_name
import Foundation
"""
let content = services.map { $0.output }.joined(separator: "\n\n")
let footer = ""
let output = [header, content, footer].joined(separator: "\n")
// swiftlint:disable:next force_try
try! output.write(toFile: outputPath, atomically: true, encoding: .utf8)
print("Finished generating Adobe services.")
}
main()
================================================
FILE: Scripts/generate_apple_services.swift
================================================
#!/usr/bin/swift
import Foundation
private struct AppleResponseData: Codable {
struct Service: Codable {
let serviceName: String
}
let services: [Service]
}
struct AppleService {
enum ServiceType {
case category
case subService
}
let parentName: String
var name: String
let serviceName: String
let type: ServiceType
var className: String {
var sanitizedName = name
sanitizedName = sanitizedName.replacingOccurrences(of: " & ", with: "And")
sanitizedName = sanitizedName.replacingOccurrences(of: "/", with: "")
sanitizedName = sanitizedName.replacingOccurrences(of: ":", with: "")
sanitizedName = sanitizedName.replacingOccurrences(of: "-", with: "")
sanitizedName = sanitizedName.replacingOccurrences(of: ".", with: "")
sanitizedName = sanitizedName.replacingOccurrences(of: "(", with: "")
sanitizedName = sanitizedName.replacingOccurrences(of: ")", with: "")
sanitizedName = sanitizedName.replacingOccurrences(of: "+", with: "")
sanitizedName = sanitizedName.replacingOccurrences(of: ",", with: "")
sanitizedName = sanitizedName.replacingOccurrences(of: "|", with: "")
return sanitizedName
.components(separatedBy: " ")
.map { $0.capitalized(firstLetterOnly: true) }
.joined(separator: "")
}
init(parentName: String, name: String, type: ServiceType) {
self.parentName = parentName
self.type = type
self.serviceName = name
if !name.hasPrefix("Apple") {
self.name = "Apple \(name)"
} else {
self.name = name
}
}
var output: String {
switch type {
case .category:
return """
final class \(className)All: \(className), ServiceCategory {
let categoryName = "\(name)"
let subServiceSuperclass: AnyObject.Type = Base\(className).self
let name = "\(name) (All)"
let serviceName = "*"
}
"""
case .subService:
return """
final class \(className): \(parentName), SubService {
let name = "\(name)"
let serviceName = "\(serviceName)"
}
"""
}
}
}
extension String {
func capitalized(firstLetterOnly: Bool) -> String {
return firstLetterOnly ? (prefix(1).capitalized + dropFirst()) : self
}
var innerJSONString: String {
let callbackPrefix = "jsonCallback("
let callbackSuffix = ");"
let trimmedString = trimmingCharacters(in: .whitespacesAndNewlines)
guard trimmedString.hasPrefix(callbackPrefix) && trimmedString.hasSuffix(callbackSuffix) else { return self }
return String(trimmedString[
trimmedString.index(trimmedString.startIndex, offsetBy: callbackPrefix.count) ..<
trimmedString.index(trimmedString.endIndex, offsetBy: -callbackSuffix.count)
])
}
}
func envVariable(forKey key: String) -> String {
guard let variable = ProcessInfo.processInfo.environment[key] else {
print("error: Environment variable '\(key)' not set")
exit(1)
}
return variable
}
func discoverServices(url: String, categoryName: String, categoryClassName: String) -> [AppleService] {
var dataResult: Data?
let semaphore = DispatchSemaphore(value: 0)
let url = URL(string: url)!
URLSession.shared.dataTask(with: url) { data, _, _ in
dataResult = data
semaphore.signal()
}.resume()
_ = semaphore.wait(timeout: .now() + .seconds(10))
guard
let data = dataResult,
let jsonData = String(data: data, encoding: .utf8)?.innerJSONString.data(using: .utf8),
let responseData = try? JSONDecoder().decode(AppleResponseData.self, from: jsonData)
else {
print("warning: Build script generate_apple_services could not retrieve list of \(categoryName) services")
exit(0)
}
let result: [AppleService] =
[AppleService(parentName: "", name: categoryName, type: .category)] +
responseData.services.map {
AppleService(parentName: categoryClassName, name: $0.serviceName, type: .subService)
}
return result
}
func main() {
let srcRoot = envVariable(forKey: "SRCROOT")
let outputPath = "\(srcRoot)/stts/Services/Generated/AppleServices.swift"
let services = discoverServices(
url: "https://www.apple.com/support/systemstatus/data/system_status_en_US.js",
categoryName: "Apple",
categoryClassName: "Apple"
)
var developerServices = discoverServices(
url: "https://www.apple.com/support/systemstatus/data/developer/system_status_en_US.js",
categoryName: "Apple Developer",
categoryClassName: "AppleDeveloper"
)
// Fix name collisions
let serviceNames = services.map { $0.name }
developerServices = developerServices.map {
if serviceNames.contains($0.name) {
var renamedService = $0
renamedService.name = "\($0.name) (Developer)"
return renamedService
} else {
return $0
}
}
let header = """
// This file is generated by generate_apple_services.swift and should not be modified manually.
// swiftlint:disable superfluous_disable_command type_name
import Foundation
"""
let content = (services + developerServices).map { $0.output }.joined(separator: "\n\n")
let footer = ""
let output = [header, content, footer].joined(separator: "\n")
// swiftlint:disable:next force_try
try! output.write(toFile: outputPath, atomically: true, encoding: .utf8)
print("Finished generating Apple services.")
}
main()
================================================
FILE: Scripts/generate_aws_services.swift
================================================
#!/usr/bin/swift
import Foundation
extension String {
func capitalized(firstLetterOnly: Bool) -> String {
return firstLetterOnly ? (prefix(1).capitalized + dropFirst()) : self
}
}
func envVariable(forKey key: String) -> String {
guard let variable = ProcessInfo.processInfo.environment[key] else {
print("error: Environment variable '\(key)' not set")
exit(1)
}
return variable
}
struct Service: Codable {
enum CodingKeys: String, CodingKey {
case id = "service"
case name = "service_name"
case regionName = "region_name"
case regionID = "region_id"
}
let id: String
let name: String
let regionName: String?
let regionID: String?
}
protocol OutputService {
var output: String { get }
var sortingName: String { get }
}
class OutputNamedService: OutputService {
let name: String
var ids = Set<String>()
var sortingName: String {
usableName
}
var usableName: String {
var result = name
if !result.hasPrefix("Amazon "), !result.hasPrefix("AWS ") {
result = "AWS \(name)"
}
return result
}
var className: String {
var sanitizedName = usableName
sanitizedName = sanitizedName.replacingOccurrences(of: " & ", with: "And")
sanitizedName = sanitizedName.replacingOccurrences(of: "/", with: "")
sanitizedName = sanitizedName.replacingOccurrences(of: ":", with: "")
sanitizedName = sanitizedName.replacingOccurrences(of: "-", with: "")
sanitizedName = sanitizedName.replacingOccurrences(of: ".", with: "")
sanitizedName = sanitizedName.replacingOccurrences(of: "(", with: "")
sanitizedName = sanitizedName.replacingOccurrences(of: ")", with: "")
return sanitizedName
.components(separatedBy: " ")
.map { $0.capitalized(firstLetterOnly: true) }
.joined(separator: "")
}
var output: String {
"""
final class \(className): AWSNamedService, SubService {
let name = "\(usableName)"
let ids = Set<String>([
"\(ids.sorted().joined(separator: "\",\n \""))"
])
}
"""
}
init(initialService: Service) {
name = initialService.name
add(initialService)
}
func add(_ service: Service) {
ids.insert(service.id)
}
}
class OutputRegion: OutputService {
let id: String
let name: String
var sortingName: String {
"111\(usableName)"
}
var usableName: String {
"AWS (\(name))"
}
var className: String {
var sanitizedName = usableName
sanitizedName = sanitizedName.replacingOccurrences(of: " & ", with: "And")
sanitizedName = sanitizedName.replacingOccurrences(of: "/", with: "")
sanitizedName = sanitizedName.replacingOccurrences(of: ":", with: "")
sanitizedName = sanitizedName.replacingOccurrences(of: "-", with: "")
sanitizedName = sanitizedName.replacingOccurrences(of: ".", with: "")
sanitizedName = sanitizedName.replacingOccurrences(of: "(", with: "")
sanitizedName = sanitizedName.replacingOccurrences(of: ")", with: "")
return sanitizedName
.components(separatedBy: " ")
.map { $0.capitalized(firstLetterOnly: true) }
.joined(separator: "")
}
var output: String {
"""
final class \(className): AWSRegionService, SubService {
let id = "\(id)"
let name = "\(usableName)"
}
"""
}
init(id: String, name: String) {
self.id = id
self.name = name
}
}
func discoverServices() -> [OutputService] {
var dataResult: Data?
let semaphore = DispatchSemaphore(value: 0)
let url = URL(string: "https://d3s31nlw3sm5l8.cloudfront.net/services.json")!
URLSession.shared.dataTask(with: url) { data, _, _ in
dataResult = data
semaphore.signal()
}.resume()
_ = semaphore.wait(timeout: .now() + .seconds(10))
guard
let data = dataResult,
let services = try? JSONDecoder().decode([Service].self, from: data)
else {
print("warning: Build script generate_aws_services could not retrieve list of AWS services")
exit(0)
}
var servicesByName: [String: OutputNamedService] = [:]
var regions: [String: OutputRegion] = [:]
services.forEach {
let namedService = servicesByName[$0.name] ?? OutputNamedService(initialService: $0)
namedService.add($0)
servicesByName[$0.name] = namedService
if let regionID = $0.regionID, let regionName = $0.regionName {
if regions[regionID] == nil {
regions[regionID] = OutputRegion(id: regionID, name: regionName)
}
}
}
let namedServices: [OutputService] = [OutputNamedService](servicesByName.values)
let regionServices: [OutputService] = [OutputRegion](regions.values)
return namedServices + regionServices
}
func main() {
let srcRoot = envVariable(forKey: "SRCROOT")
let outputPath = "\(srcRoot)/stts/Services/Generated/AWSServices.swift"
let services = discoverServices()
let header = """
// This file is generated by generate_aws_services.swift and should not be modified manually.
// swiftlint:disable superfluous_disable_command type_name
import Foundation
final class AWSRegions: AWSAllService, ServiceCategory {
let categoryName = "Amazon Web Services (by region)"
let subServiceSuperclass: AnyObject.Type = BaseAWSRegionService.self
let name = "AWS Regions (All)"
}
final class AWSServices: AWSAllService, ServiceCategory {
let categoryName = "Amazon Web Services"
let subServiceSuperclass: AnyObject.Type = BaseAWSNamedService.self
let name = "AWS (All)"
}
"""
let content = services.sorted(by: { one, two in
one.sortingName < two.sortingName
}).map { $0.output }.joined(separator: "\n\n")
let footer = ""
let output = [header, content, footer].joined(separator: "\n")
debugPrint(output)
// swiftlint:disable:next force_try
try! output.write(toFile: outputPath, atomically: true, encoding: .utf8)
print("Finished generating AWS services.")
}
main()
================================================
FILE: Scripts/generate_azure_devops_services.swift
================================================
#!/usr/bin/swift
import Foundation
struct AzureDevOpsService {
let serviceName: String
var friendlyName: String {
let friendlyServiceName = serviceName.components(separatedBy: " ").map {
$0.capitalized(firstLetterOnly: true)
}.joined(separator: " ")
return "Azure DevOps \(friendlyServiceName)"
}
var className: String {
var sanitizedName = serviceName
sanitizedName = sanitizedName.replacingOccurrences(of: " & ", with: "And")
sanitizedName = sanitizedName.replacingOccurrences(of: "/", with: "")
sanitizedName = sanitizedName.replacingOccurrences(of: ":", with: "")
sanitizedName = sanitizedName.components(separatedBy: " ")
.map { $0.capitalized(firstLetterOnly: true) }
.joined(separator: "")
return "AzureDevOps\(sanitizedName)"
}
var output: String {
return """
final class \(className): AzureDevOps, SubService {
let name = "\(friendlyName)"
let serviceName = "\(serviceName)"
}
"""
}
}
extension String {
subscript(_ range: NSRange) -> String {
// Why we still have to do this shit in 2019 I don't know
let start = self.index(self.startIndex, offsetBy: range.lowerBound)
let end = self.index(self.startIndex, offsetBy: range.upperBound)
let subString = self[start..<end]
return String(subString)
}
func capitalized(firstLetterOnly: Bool) -> String {
return firstLetterOnly ? (prefix(1).capitalized + dropFirst()) : self
}
}
struct AzureDevOpsDataProviders: Codable {
struct ResponseData: Codable {
struct MetadataProvider: Codable {
let services: [[String: String]]
var serviceNames: [String] {
return services.compactMap { $0["id"] }
}
}
enum CodingKeys: String, CodingKey {
case metadataProvider = "ms.vss-status-web.public-status-metadata-data-provider"
}
let metadataProvider: MetadataProvider
}
let data: ResponseData
}
func envVariable(forKey key: String) -> String {
guard let variable = ProcessInfo.processInfo.environment[key] else {
print("error: Environment variable '\(key)' not set")
exit(1)
}
return variable
}
func discoverServices() -> [AzureDevOpsService] {
var result = [AzureDevOpsService]()
var dataResult: Data?
let semaphore = DispatchSemaphore(value: 0)
URLSession.shared.dataTask(with: URL(string: "https://status.dev.azure.com")!) { data, _, _ in
dataResult = data
semaphore.signal()
}.resume()
_ = semaphore.wait(timeout: .now() + .seconds(10))
guard let data = dataResult, let body = String(data: data, encoding: .utf8) as NSString? else {
print("warning: Build script generate_azure_devops_services could not retrieve list of Azure DevOps services")
exit(0)
}
// swiftlint:disable:next force_try
let regex = try! NSRegularExpression(
pattern: "<script id=\"dataProviders\".*?>(.*?)</script>",
options: [.caseInsensitive, .dotMatchesLineSeparators]
)
let range = NSRange(location: 0, length: body.length)
regex.enumerateMatches(in: body as String, options: [], range: range) { textCheckingResult, _, _ in
guard let textCheckingResult = textCheckingResult, textCheckingResult.numberOfRanges == 2 else { return }
let json = body.substring(with: textCheckingResult.range(at: 1))
let jsonData = json.data(using: .utf8)!
guard let decodedProviders = try? JSONDecoder().decode(AzureDevOpsDataProviders.self, from: jsonData) else {
print(
"warning: Build script generate_azure_devops_services could not retrieve list of Azure DevOps services"
)
exit(0)
}
decodedProviders.data.metadataProvider.serviceNames.forEach {
result.append(AzureDevOpsService(serviceName: $0))
}
}
return result
}
func main() {
let srcRoot = envVariable(forKey: "SRCROOT")
let outputPath = "\(srcRoot)/stts/Services/Generated/AzureDevOpsServices.swift"
let services = discoverServices()
let header = """
// This file is generated by generate_azure_devops_services.swift and should not be modified manually.
// swiftlint:disable superfluous_disable_command type_name
import Foundation
"""
let content = services.map { $0.output }.joined(separator: "\n\n")
let footer = ""
let output = [header, content, footer].joined(separator: "\n")
// swiftlint:disable:next force_try
try! output.write(toFile: outputPath, atomically: true, encoding: .utf8)
print("Finished generating Azure DevOps services.")
}
main()
================================================
FILE: Scripts/generate_azure_services.swift
================================================
#!/usr/bin/swift
import Foundation
struct AzureZone {
let serviceName: String
let zoneIdentifier: String
var className: String {
var sanitizedName = serviceName
sanitizedName = sanitizedName.replacingOccurrences(of: " & ", with: "And")
sanitizedName = sanitizedName.replacingOccurrences(of: "/", with: "")
sanitizedName = sanitizedName.replacingOccurrences(of: ":", with: "")
return sanitizedName.components(separatedBy: " ")
.map { $0.capitalized(firstLetterOnly: true) }
.joined(separator: "")
}
init(identifier: String, serviceName: String) {
zoneIdentifier = identifier
if !serviceName.hasPrefix("Azure") {
self.serviceName = "Azure \(serviceName)"
} else {
self.serviceName = serviceName
}
}
var output: String {
return """
final class \(className): Azure, SubService {
let name = "\(serviceName)"
let zoneIdentifier = "\(zoneIdentifier)"
}
"""
}
}
extension String {
subscript(_ range: NSRange) -> String {
// Why we still have to do this shit in 2019 I don't know
let start = self.index(self.startIndex, offsetBy: range.lowerBound)
let end = self.index(self.startIndex, offsetBy: range.upperBound)
let subString = self[start..<end]
return String(subString)
}
func capitalized(firstLetterOnly: Bool) -> String {
return firstLetterOnly ? (prefix(1).capitalized + dropFirst()) : self
}
}
func envVariable(forKey key: String) -> String {
guard let variable = ProcessInfo.processInfo.environment[key] else {
print("error: Environment variable '\(key)' not set")
exit(1)
}
return variable
}
func discoverZones() -> [AzureZone] {
var result = [AzureZone]()
var dataResult: Data?
let semaphore = DispatchSemaphore(value: 0)
URLSession.shared.dataTask(with: URL(string: "https://status.azure.com/en-us/status")!) { data, _, _ in
dataResult = data
semaphore.signal()
}.resume()
_ = semaphore.wait(timeout: .now() + .seconds(10))
guard let data = dataResult, var body = String(data: data, encoding: .utf8) else {
print("warning: Build script generate_azure_services could not retrieve list of Azure zones")
exit(0)
}
body = body.replacingOccurrences(of: "\n", with: "")
// swiftlint:disable:next force_try
let regex = try! NSRegularExpression(
pattern: "li role=\"presentation\".*?data-zone-name=\"(.*?)\".*?data-event-property=\"(.*?)\"",
options: [.caseInsensitive, .dotMatchesLineSeparators]
)
// Some tabs in the Azure status website do not correspond to actual zones, so we exclude them
let excludedZoneIdentifiers = Set(["current-impact"])
let range = NSRange(location: 0, length: body.count)
regex.enumerateMatches(in: body, options: [], range: range) { textCheckingResult, _, _ in
guard let textCheckingResult = textCheckingResult, textCheckingResult.numberOfRanges == 3 else { return }
let identifier = body[textCheckingResult.range(at: 1)]
let serviceName = body[textCheckingResult.range(at: 2)]
if excludedZoneIdentifiers.contains(identifier) == false {
result.append(AzureZone(identifier: identifier, serviceName: serviceName))
}
}
return result
}
func main() {
let srcRoot = envVariable(forKey: "SRCROOT")
let outputPath = "\(srcRoot)/stts/Services/Generated/AzureServices.swift"
let zones = discoverZones()
let header = """
// This file is generated by generate_azure_services.swift and should not be modified manually.
// swiftlint:disable superfluous_disable_command type_name
import Foundation
"""
let content = zones.map { $0.output }.joined(separator: "\n\n")
let footer = ""
let output = [header, content, footer].joined(separator: "\n")
// swiftlint:disable:next force_try
try! output.write(toFile: outputPath, atomically: true, encoding: .utf8)
print("Finished generating Azure services.")
}
main()
================================================
FILE: Scripts/generate_google_services.swift
================================================
#!/usr/bin/swift
import Foundation
enum GooglePlatform: CaseIterable {
case cloudPlatform
case firebase
var url: URL {
switch self {
case .cloudPlatform:
// swiftlint:disable:next force_unwrapping
return URL(string: "https://status.cloud.google.com")!
case .firebase:
// swiftlint:disable:next force_unwrapping
return URL(string: "https://status.firebase.google.com")!
}
}
func outputPath(root: String) -> String {
switch self {
case .cloudPlatform:
return "\(root)/stts/Services/Generated/GoogleCloudPlatformServices.swift"
case .firebase:
return "\(root)/stts/Services/Generated/FirebaseServices.swift"
}
}
}
protocol Service {
var serviceName: String { get }
var className: String { get }
var output: String { get }
}
extension Service {
var className: String {
var sanitizedName = serviceName
sanitizedName = sanitizedName.replacingOccurrences(of: " & ", with: "And")
sanitizedName = sanitizedName.replacingOccurrences(of: "/", with: "")
sanitizedName = sanitizedName.replacingOccurrences(of: ":", with: "")
sanitizedName = sanitizedName.replacingOccurrences(of: "-", with: "")
sanitizedName = sanitizedName.replacingOccurrences(of: "(", with: "")
sanitizedName = sanitizedName.replacingOccurrences(of: ")", with: "")
return sanitizedName.components(separatedBy: " ")
.map { $0.capitalized(firstLetterOnly: true) }
.joined(separator: "")
}
}
struct GCPService: Service {
let serviceName: String
let dashboardName: String
init(dashboardName: String) {
self.dashboardName = dashboardName
if !dashboardName.hasPrefix("Google") {
serviceName = "Google \(dashboardName)"
} else {
serviceName = dashboardName
}
}
var output: String {
return """
final class \(className): GoogleCloudPlatform, SubService {
let name = "\(serviceName)"
let dashboardName = "\(dashboardName)"
}
"""
}
}
struct FirebaseService: Service {
let serviceName: String
init(dashboardName: String) {
if !dashboardName.hasPrefix("Firebase") {
serviceName = "Firebase \(dashboardName)"
} else {
serviceName = dashboardName
}
}
var output: String {
return """
final class \(className): FirebaseService, SubService {
let name = "\(serviceName)"
}
"""
}
}
extension String {
subscript(_ range: NSRange) -> String {
// Why we still have to do this shit in 2019 I don't know
let start = self.index(self.startIndex, offsetBy: range.lowerBound)
let end = self.index(self.startIndex, offsetBy: range.upperBound)
let subString = self[start..<end]
return String(subString)
}
func capitalized(firstLetterOnly: Bool) -> String {
return firstLetterOnly ? (prefix(1).capitalized + dropFirst()) : self
}
}
func envVariable(forKey key: String) -> String {
guard let variable = ProcessInfo.processInfo.environment[key] else {
print("error: Environment variable '\(key)' not set")
exit(1)
}
return variable
}
func discoverServices(for platform: GooglePlatform) -> [Service] {
var result = [Service]()
var dataResult: Data?
let semaphore = DispatchSemaphore(value: 0)
URLSession.shared.dataTask(with: platform.url) { data, _, _ in
dataResult = data
semaphore.signal()
}.resume()
_ = semaphore.wait(timeout: .now() + .seconds(10))
guard let data = dataResult, var body = String(data: data, encoding: .utf8) else {
print("""
warning: Build script generate_google_services could not retrieve
list of Google Cloud Platform/Firebase services
""")
exit(0)
}
body = body.replacingOccurrences(of: "\n", with: "")
let regex: NSRegularExpression
switch platform {
case .cloudPlatform:
// swiftlint:disable:next force_try
regex = try! NSRegularExpression(
pattern: "__product\">[\\s\\n]*(.+?)[\\s\\n]*<.*?\\/th>",
options: [.caseInsensitive, .dotMatchesLineSeparators]
)
case .firebase:
// swiftlint:disable:next force_try
regex = try! NSRegularExpression(
pattern: "class=\"product-name\">.*?[\\s\\n]*([^>]*?)[\\s\\n]*<\\/",
options: [.caseInsensitive, .dotMatchesLineSeparators]
)
}
let range = NSRange(location: 0, length: body.count)
regex.enumerateMatches(in: body, options: [], range: range) { textCheckingResult, _, _ in
guard let textCheckingResult = textCheckingResult, textCheckingResult.numberOfRanges == 2 else { return }
let serviceName = body[textCheckingResult.range(at: 1)]
switch platform {
case .cloudPlatform:
result.append(GCPService(dashboardName: serviceName))
case .firebase:
result.append(FirebaseService(dashboardName: serviceName))
}
}
return result
}
func main() {
let srcRoot = envVariable(forKey: "SRCROOT")
GooglePlatform.allCases.forEach { platform in
let services = discoverServices(for: platform)
let header = """
// This file is generated by generate_google_services.swift and should not be modified manually.
// swiftlint:disable superfluous_disable_command type_name
import Foundation
"""
let content = services.map { $0.output }.joined(separator: "\n\n")
let footer = ""
let output = [header, content, footer].joined(separator: "\n")
// swiftlint:disable:next force_try
try! output.write(toFile: platform.outputPath(root: srcRoot), atomically: true, encoding: .utf8)
}
print("Finished generating Google services.")
}
main()
================================================
FILE: Scripts/generate_salesforce_services.swift
================================================
#!/usr/bin/swift
import Foundation
enum Location: String {
case na = "NA"
case emea = "EMEA"
case apac = "APAC"
case all = "ALL"
var suffix: String {
switch self {
case .na, .emea, .apac:
return "(\(rawValue))"
case .all:
return "(All Regions)"
}
}
var classFormat: String {
switch self {
case .na, .emea, .apac:
return rawValue
case .all:
return "All"
}
}
var appFormat: String {
switch self {
case .na, .emea, .apac:
return rawValue
case .all:
return "*"
}
}
}
struct SalesforceProductRegion {
let name: String
let key: String
let location: Location
var className: String {
var sanitizedName = name
sanitizedName = sanitizedName.replacingOccurrences(of: " & ", with: "And")
sanitizedName = sanitizedName.replacingOccurrences(of: "/", with: "")
sanitizedName = sanitizedName.replacingOccurrences(of: ":", with: "")
return sanitizedName.components(separatedBy: " ")
.map { $0.capitalized(firstLetterOnly: true) }
.joined(separator: "")
}
var classNameWithRegion: String {
"\(className) \(location.classFormat)"
.components(separatedBy: " ")
.map { $0.capitalized(firstLetterOnly: true) }
.joined(separator: "")
}
var serviceName: String {
"\(name) \(location.suffix)"
}
init(key: String, location: Location) {
self.key = key
self.location = location
switch key {
case "Salesforce_Services":
name = "Salesforce Services"
case "Marketing_Cloud":
name = "Salesforce Marketing Cloud"
case "B2C_Commerce_Cloud":
name = "Salesforce B2C Commerce Cloud"
case "Social_Studio":
name = "Salesforce Social Studio"
case "Community_Cloud":
name = "Salesforce Experience Cloud"
default:
// Keep it instead of failing so that we notice when new products are added.
name = key
}
}
var superOutput: String {
"""
typealias \(className) =
Base\(className) & RequiredServiceProperties & SalesforceStoreService
class Base\(className): BaseSalesforceCategory {
static var store = SalesforceStore(key: "\(key)")
let url = URL(string: "https://status.salesforce.com/products/\(key)")!
}
"""
}
var output: String {
let commonDefinitions: [String] = [
"let name = \"\(serviceName)\"",
"let key = \"\(key)\"",
"let location = \"\(location.appFormat)\""
]
if location == .all {
return """
final class \(classNameWithRegion): \(className), ServiceCategory {
let categoryName = "\(name)"
let subServiceSuperclass: AnyObject.Type = Base\(className).self
\(commonDefinitions.joined(separator: "\n "))
}
"""
} else {
return """
final class \(classNameWithRegion): \(className), SubService {
\(commonDefinitions.joined(separator: "\n "))
}
"""
}
}
}
struct Instance: Codable {
enum CodingKeys: String, CodingKey {
case location
case products = "Products"
}
let location: String
let products: [Product]
}
struct Product: Codable {
let key: String
}
extension String {
func capitalized(firstLetterOnly: Bool) -> String {
return firstLetterOnly ? (prefix(1).capitalized + dropFirst()) : self
}
}
func envVariable(forKey key: String) -> String {
guard let variable = ProcessInfo.processInfo.environment[key] else {
print("error: Environment variable '\(key)' not set")
exit(1)
}
return variable
}
func discoverProducts() -> [SalesforceProductRegion] {
var result = [SalesforceProductRegion]()
var dataResult: Data?
let semaphore = DispatchSemaphore(value: 0)
let url = URL(string: "https://api.status.salesforce.com/v1/instances?childProducts=false")!
URLSession.shared.dataTask(with: url) { data, _, _ in
dataResult = data
semaphore.signal()
}.resume()
_ = semaphore.wait(timeout: .now() + .seconds(10))
guard let data = dataResult, let instances = try? JSONDecoder().decode([Instance].self, from: data) else {
print("warning: Build script generate_salesforce_services could not retrieve list of Salesforce products")
exit(0)
}
var productsSet = Set<String>()
var productsAndRegions: [String: Set<String>] = [:]
instances.forEach {
guard let product = $0.products.first else { return }
var regions = productsAndRegions[product.key] ?? Set<String>()
regions.insert($0.location)
productsAndRegions[product.key] = regions
productsSet.insert(product.key)
}
let sortedProducts = productsSet.sorted()
sortedProducts.forEach { productKey in
result.append(SalesforceProductRegion(key: productKey, location: .all))
productsAndRegions[productKey]?.sorted().forEach {
guard let location = Location(rawValue: $0) else { return }
result.append(SalesforceProductRegion(key: productKey, location: location))
}
}
return result
}
func generateProducts(from products: [SalesforceProductRegion]) {
let srcRoot = envVariable(forKey: "SRCROOT")
let outputPath = "\(srcRoot)/stts/Services/Generated/SalesforceProducts.swift"
let header = """
// This file is generated by generate_salesforce_services.swift and should not be modified manually.
// swiftlint:disable superfluous_disable_command type_name
import Foundation
"""
let content = products.map { $0.output }.joined(separator: "\n\n")
let footer = ""
let output = [header, content, footer].joined(separator: "\n")
// swiftlint:disable:next force_try
try! output.write(toFile: outputPath, atomically: true, encoding: .utf8)
}
func generateSuper(from products: [SalesforceProductRegion]) {
let srcRoot = envVariable(forKey: "SRCROOT")
let outputPath = "\(srcRoot)/stts/Services/Super/SalesforceCategories.swift"
let header = """
// This file is generated by generate_salesforce_services.swift and should not be modified manually.
// swiftlint:disable superfluous_disable_command type_name
import Foundation
"""
let content = products.filter { $0.location == .all }.map { $0.superOutput }.joined(separator: "\n\n")
let footer = ""
let output = [header, content, footer].joined(separator: "\n")
// swiftlint:disable:next force_try
try! output.write(toFile: outputPath, atomically: true, encoding: .utf8)
}
func main() {
let products = discoverProducts()
generateProducts(from: products)
generateSuper(from: products)
print("Finished generating Salesforce services.")
}
main()
================================================
FILE: Scripts/generate_services_plist.sh
================================================
#!/bin/sh
RESOURCES_PATH="$BUILT_PRODUCTS_DIR/$UNLOCALIZED_RESOURCES_FOLDER_PATH"
SERVICES_PLIST="$RESOURCES_PATH/services.plist"
# Retrieve the list of services
REGULAR_SERVICES=$(find "$SRCROOT/stts/Services" -name "*.swift" -not -path "*Super*" -not -path "*Generated*" | awk -F/ '{ print $NF }' | sed s/.swift//g | sort | sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/ /g')
GENERATED_SERVICES=$(find "$SRCROOT/stts/Services/Generated" -name "*.swift" -print0 | xargs -0 cat | grep "class " | sed s/'final class '//g | sed s/'class '//g | sed 's/:.*//' | tr '\n' ' ')
SERVICES="$REGULAR_SERVICES $GENERATED_SERVICES"
# Create the services plist file
echo "{}" > "$SERVICES_PLIST"
# Write the list of services into the plist file as an array
defaults write "$SERVICES_PLIST" "services" -array $SERVICES
# Remove all quarantine attributes as they block submissions to App Store
xattr -c "$SERVICES_PLIST"
================================================
FILE: extract.rb
================================================
require 'net/https'
require 'xcodeproj'
require 'json'
require 'synx'
@project_file = "stts.xcodeproj"
def source_for(url)
uri = URI.parse(url)
path = uri.path == "" ? "/" : uri.path
result = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == 'https') { |http| http.get(path) }
result.code.to_i == 200 ? result.body : nil
end
def extract_instatus(source, custom_name)
data = source.scan(/__NEXT_DATA__.*?(\{.*?\})<\/script>/mi).flatten.first
return false if data == nil || data.empty?
site = JSON.parse(data)["props"]["pageProps"]["site"]
custom_domain = site["customDomain"]
if custom_domain && custom_domain != ""
domain = custom_domain
else
domain = "#{site["subdomain"]}.instatus.com"
end
name = custom_name || site["name"]
url = "https://#{domain}"
safe_name = sanitized_name(name)
definitions = [
"let url = URL(string: \"#{url}\")!"
]
definitions.unshift("let name = \"#{name}\"") if safe_name != name
create_file "stts/Services/Instatus/#{safe_name}.swift", <<-INSTATUS
//
// #{safe_name}.swift
// stts
//
import Foundation
class #{safe_name}: InstatusService {
#{definitions.join("\n ")}
}
INSTATUS
return true
end
def extract_statuspage(url, custom_name)
source = source_for("#{url}/api/v2/summary.json")
return false unless source
page = JSON.parse(source)["page"]
id = page["id"]
name = custom_name || page["name"]
safe_name = sanitized_name(name)
definitions = [
"let url = URL(string: \"#{url}\")!",
"let statusPageID = \"#{id}\""
]
definitions.unshift("let name = \"#{name}\"") if safe_name != name
create_file "stts/Services/StatusPage/#{safe_name}.swift", <<-STATUSPAGE
//
// #{safe_name}.swift
// stts
//
import Foundation
class #{safe_name}: StatusPageService {
#{definitions.join("\n ")}
}
STATUSPAGE
true
end
def extract_site24x7(url, source, custom_name)
encrypted_status_page_id = source.scan(/"enc_statuspage_id":.*?"(.*?)"/mi).flatten.first
return false if encrypted_status_page_id == nil || encrypted_status_page_id.empty?
if custom_name == nil || custom_name.empty?
puts "Site24x7 service detected! Please provide the service name since it cannot be automatically found."
puts
puts "Usage:"
puts "bundle exec ruby extract.rb <url> <name>"
exit(1)
end
id = encrypted_status_page_id
safe_name = sanitized_name(custom_name)
definitions = [
"let url = URL(string: \"#{url}\")!",
"let encryptedStatusPageID = \"#{id}\""
]
definitions.unshift("let name = \"#{custom_name}\"") if safe_name != custom_name
create_file "stts/Services/Site24x7/#{safe_name}.swift", <<-SITE24X7
//
// #{safe_name}.swift
// stts
//
import Foundation
class #{safe_name}: Site24x7Service {
#{definitions.join("\n ")}
}
SITE24X7
true
end
def extract_cstate(url, custom_name)
source = source_for("#{url}/index.json")
return false unless source
data = JSON.parse(source)
return false unless data["cStateVersion"] != nil
name = custom_name || better_name(data["title"])
base_url = data["baseURL"] || url
safe_name = sanitized_name(name)
definitions = [
"let url = URL(string: \"#{base_url}\")!"
]
definitions.unshift("let name = \"#{name}\"") if safe_name != name
create_file "stts/Services/CState/#{safe_name}.swift", <<-CSTATE
//
// #{safe_name}.swift
// stts
//
import Foundation
class #{safe_name}: CStateService {
#{definitions.join("\n ")}
}
CSTATE
true
end
def create_file(path, content)
File.open(path, "w") do |f|
f.write(content)
end
puts "Updated #{path}"
# Open the existing Xcode project
project = Xcodeproj::Project.open(@project_file)
# Add a file to the project
file_name = path.split("/").last
group = project.main_group
path.split("/")[0..-2].each do |group_name|
group = group[group_name] if group[group_name]
end
if group.files.map(&:path).include?(file_name)
puts "Skipped adding #{file_name} to project: already exists"
return
end
# Get the file reference for the file to add
file = group.new_file(file_name)
# Add the file reference to the target
main_target = project.targets.first
main_target.add_file_references([file])
# Sort it
project.main_group.sort_recursively_by_type
# Save it
project.save
puts "Added #{file_name} to project"
end
def better_name(name)
name.gsub(/(\'|\‘)?\sstatus$/i, "")
end
def sanitized_name(name)
new_name = name.gsub(" & ", "And")
.gsub("/", "")
.gsub(":", "")
.gsub("-", "")
.gsub(".", "")
.gsub("(", "")
.gsub(")", "")
.gsub("+", "")
.gsub(",", "")
.gsub(/(\'|\‘)?\sstatus$/i, "")
words = new_name.split(" ").map do |word|
# capitalize, first character only (CamelCase)
word[0].upcase + word[1..-1]
end
words.join("")
end
def finish
puts "Done!"
puts "Running synx..."
run_synx
exit
end
def fail_params
puts "Usage:"
puts "bundle exec ruby extract.rb <url>"
puts
puts "Example:"
puts "bundle exec ruby extract.rb https://status.notion.so/"
exit 1
end
def fail_network
puts "Could not check that link :("
puts "Network issue or invalid link?"
exit 1
end
def fail
puts "No service found :("
puts "Maybe create a ticket? https://github.com/inket/stts/issues"
exit 1
end
def run_synx
project = Synx::Project.open(@project_file)
project.sync(
prune: true,
quiet: true,
no_color: false,
no_default_exclusions: false,
no_sort_by_name: false,
group_exclusions: []
)
end
if Process.uid == 0
puts "Cannot run extract script as root.".red
exit 1
end
url = ARGV[0]
url = url.strip if url
fail_params unless url && url != ""
custom_name = ARGV[1]
custom_name = custom_name.strip if custom_name
custom_name = nil if custom_name == ""
url = "https://#{url}" if URI.parse(url).scheme == nil
source = source_for(url)
fail_network unless source
finish if extract_instatus(source, custom_name)
finish if extract_site24x7(url, source, custom_name)
finish if extract_statuspage(url, custom_name)
finish if extract_cstate(url, custom_name)
fail
================================================
FILE: openai.html
================================================
<!DOCTYPE html><html lang="en" class="inter_48f560a7-module__FmDrPW__className h-full"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" imageSrcSet="/_next/image?url=https%3A%2F%2Fstorage.googleapis.com%2Fincident-io-status-page-logos%2F01H537TKYPX5W42WRCKR1AGPFT%2Fopenai-1%2Fxrs545k8.png&w=640&q=75 640w, /_next/image?url=https%3A%2F%2Fstorage.googleapis.com%2Fincident-io-status-page-logos%2F01H537TKYPX5W42WRCKR1AGPFT%2Fopenai-1%2Fxrs545k8.png&w=750&q=75 750w, /_next/image?url=https%3A%2F%2Fstorage.googleapis.com%2Fincident-io-status-page-logos%2F01H537TKYPX5W42WRCKR1AGPFT%2Fopenai-1%2Fxrs545k8.png&w=828&q=75 828w, /_next/image?url=https%3A%2F%2Fstorage.googleapis.com%2Fincident-io-status-page-logos%2F01H537TKYPX5W42WRCKR1AGPFT%2Fopenai-1%2Fxrs545k8.png&w=1080&q=75 1080w, /_next/image?url=https%3A%2F%2Fstorage.googleapis.com%2Fincident-io-status-page-logos%2F01H537TKYPX5W42WRCKR1AGPFT%2Fopenai-1%2Fxrs545k8.png&w=1200&q=75 1200w, /_next/image?url=https%3A%2F%2Fstorage.googleapis.com%2Fincident-io-status-page-logos%2F01H537TKYPX5W42WRCKR1AGPFT%2Fopenai-1%2Fxrs545k8.png&w=1920&q=75 1920w, /_next/image?url=https%3A%2F%2Fstorage.googleapis.com%2Fincident-io-status-page-logos%2F01H537TKYPX5W42WRCKR1AGPFT%2Fopenai-1%2Fxrs545k8.png&w=2048&q=75 2048w, /_next/image?url=https%3A%2F%2Fstorage.googleapis.com%2Fincident-io-status-page-logos%2F01H537TKYPX5W42WRCKR1AGPFT%2Fopenai-1%2Fxrs545k8.png&w=3840&q=75 3840w" imageSizes="100vw"/><link rel="stylesheet" href="/_next/static/chunks/665f62a6c30acc6c.css?dpl=dpl_9tBXvs18KDKSsymSBBAUgyHAMPVH" data-precedence="next"/><link rel="stylesheet" href="/_next/static/chunks/081ff82a2bab5048.css?dpl=dpl_9tBXvs18KDKSsymSBBAUgyHAMPVH" data-precedence="next"/><link rel="stylesheet" href="/_next/static/chunks/9e00295b23fa92cb.css?dpl=dpl_9tBXvs18KDKSsymSBBAUgyHAMPVH" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/026754e95891a404.js?dpl=dpl_9tBXvs18KDKSsymSBBAUgyHAMPVH"/><script src="/_next/static/chunks/e7ff85ad2d18b625.js?dpl=dpl_9tBXvs18KDKSsymSBBAUgyHAMPVH" async=""></script><script src="/_next/static/chunks/5566283649f53d20.js?dpl=dpl_9tBXvs18KDKSsymSBBAUgyHAMPVH" async=""></script><script src="/_next/static/chunks/b4053b1dd34bef99.js?dpl=dpl_9tBXvs18KDKSsymSBBAUgyHAMPVH" async=""></script><script src="/_next/static/chunks/turbopack-e15aaa85e69655f1.js?dpl=dpl_9tBXvs18KDKSsymSBBAUgyHAMPVH" async=""></script><script src="/_next/static/chunks/ea59b1a51894dbe6.js?dpl=dpl_9tBXvs18KDKSsymSBBAUgyHAMPVH" async=""></script><script src="/_next/static/chunks/d384171cf7a30a07.js?dpl=dpl_9tBXvs18KDKSsymSBBAUgyHAMPVH" async=""></script><script src="/_next/static/chunks/2953506f51149cba.js?dpl=dpl_9tBXvs18KDKSsymSBBAUgyHAMPVH" async=""></script><script src="/_next/static/chunks/6d7aaad3f6c1fcd4.js?dpl=dpl_9tBXvs18KDKSsymSBBAUgyHAMPVH" async=""></script><script src="/_next/static/chunks/d2ce492b6f5820b2.js?dpl=dpl_9tBXvs18KDKSsymSBBAUgyHAMPVH" async=""></script><script src="/_next/static/chunks/698c98e88cd6d44a.js?dpl=dpl_9tBXvs18KDKSsymSBBAUgyHAMPVH" async=""></script><script src="/_next/static/chunks/0b24667fe3cb7e1c.js?dpl=dpl_9tBXvs18KDKSsymSBBAUgyHAMPVH" async=""></script><script src="/_next/static/chunks/65ade3a01f57f237.js?dpl=dpl_9tBXvs18KDKSsymSBBAUgyHAMPVH" async=""></script><script src="/_next/static/chunks/6744e5affbd1f630.js?dpl=dpl_9tBXvs18KDKSsymSBBAUgyHAMPVH" async=""></script><script src="/_next/static/chunks/0f6ece3e504fe79d.js?dpl=dpl_9tBXvs18KDKSsymSBBAUgyHAMPVH" async=""></script><script src="/_next/static/chunks/b32284605a182f22.js?dpl=dpl_9tBXvs18KDKSsymSBBAUgyHAMPVH" async=""></script><script src="/_next/static/chunks/ffc3e3479a355f1d.js?dpl=dpl_9tBXvs18KDKSsymSBBAUgyHAMPVH" async=""></script><script src="/_next/static/chunks/1e79b578d1c55e1f.js?dpl=dpl_9tBXvs18KDKSsymSBBAUgyHAMPVH" async=""></script><meta name="next-size-adjust" content=""/><meta name="theme-color" content="#15171c"/><meta name="color-scheme" content="dark"/><title>OpenAI Status</title><meta name="robots" content="index, follow"/><link rel="canonical" href="https://status.openai.com"/><link rel="alternate" type="application/rss+xml" href="https://status.openai.com/feed.rss"/><link rel="alternate" type="application/atom+xml" href="https://status.openai.com/feed.atom"/><meta property="og:title" content="OpenAI Status"/><meta property="og:description" content="Latest service status for OpenAI"/><meta property="og:url" content="https://status.openai.com"/><meta property="og:site_name" content="OpenAI Status"/><meta property="og:locale" content="en-US"/><meta property="og:type" content="website"/><meta name="twitter:card" content="summary"/><meta name="twitter:title" content="OpenAI Status"/><meta name="twitter:description" content="Latest service status for OpenAI"/><link rel="icon" href="/_next/image?url=https%3A%2F%2Fstorage.googleapis.com%2Fincident-io-status-page-logos%2F01H537TKYPX5W42WRCKR1AGPFT%2Fopenai-1%2Fv0bc3jd3.png&w=96&h=96&q=100" sizes="96x96" type="image/png"/><link rel="icon" href="/_next/image?url=https%3A%2F%2Fstorage.googleapis.com%2Fincident-io-status-page-logos%2F01H537TKYPX5W42WRCKR1AGPFT%2Fopenai-1%2Fv0bc3jd3.png&w=32&h=32&q=100" sizes="32x32" type="image/png"/><link rel="icon" href="/_next/image?url=https%3A%2F%2Fstorage.googleapis.com%2Fincident-io-status-page-logos%2F01H537TKYPX5W42WRCKR1AGPFT%2Fopenai-1%2Fv0bc3jd3.png&w=16&h=16&q=100" sizes="16x16" type="image/png"/><meta name="sentry-trace" content="fe003ebeeb2c71066aac1aff2d282d59-375d817b962669b0-0"/><meta name="baggage" content="sentry-environment=production,sentry-release=647d867a20fa721d8e560e1558a0c0732db81927,sentry-public_key=5d578c0eb4bd4811adf4f2176db9a1c8,sentry-trace_id=fe003ebeeb2c71066aac1aff2d282d59,sentry-org_id=494704,sentry-sampled=false,sentry-sample_rand=0.5603115302301942,sentry-sample_rate=0"/><script src="/_next/static/chunks/a6dad97d9634a72d.js?dpl=dpl_9tBXvs18KDKSsymSBBAUgyHAMPVH" noModule=""></script></head><body class="bg-white dark:bg-global h-full" style="background-color:#ffffff"><div hidden=""><!--$--><!--/$--></div><!--$--><!--/$--><div class="min-h-screen flex flex-col"><div class="flex flex-col container px-4 py-2 space-y-4 mx-auto md:px-2 md:max-w-[718px] md:py-4 md:space-y-6 flex-1 AppWrapper-module-scss-module__vWjDVa__withSelection"><div class="flex-1 sm:px-4 py-2 space-y-6"><div class="flex items-center min-h-[36px] mt-2" data-testid="status-page-header"><div class="flex items-center grow h-6 relative"><a class="cursor-pointer touch-manipulation" href="https://status.openai.com/"><h1 class="text-2xl text-slate-900 dark:text-slate-100 font-medium"><img alt="OpenAI" decoding="async" data-nimg="fill" class="max-w-[initial] object-scale-down object-left" style="position:absolute;height:100%;width:100%;left:0;top:0;right:0;bottom:0;color:transparent" sizes="100vw" srcSet="/_next/image?url=https%3A%2F%2Fstorage.googleapis.com%2Fincident-io-status-page-logos%2F01H537TKYPX5W42WRCKR1AGPFT%2Fopenai-1%2Fxrs545k8.png&w=640&q=75 640w, /_next/image?url=https%3A%2F%2Fstorage.googleapis.com%2Fincident-io-status-page-logos%2F01H537TKYPX5W42WRCKR1AGPFT%2Fopenai-1%2Fxrs545k8.png&w=750&q=75 750w, /_next/image?url=https%3A%2F%2Fstorage.googleapis.com%2Fincident-io-status-page-logos%2F01H537TKYPX5W42WRCKR1AGPFT%2Fopenai-1%2Fxrs545k8.png&w=828&q=75 828w, /_next/image?url=https%3A%2F%2Fstorage.googleapis.com%2Fincident-io-status-page-logos%2F01H537TKYPX5W42WRCKR1AGPFT%2Fopenai-1%2Fxrs545k8.png&w=1080&q=75 1080w, /_next/image?url=https%3A%2F%2Fstorage.googleapis.com%2Fincident-io-status-page-logos%2F01H537TKYPX5W42WRCKR1AGPFT%2Fopenai-1%2Fxrs545k8.png&w=1200&q=75 1200w, /_next/image?url=https%3A%2F%2Fstorage.googleapis.com%2Fincident-io-status-page-logos%2F01H537TKYPX5W42WRCKR1AGPFT%2Fopenai-1%2Fxrs545k8.png&w=1920&q=75 1920w, /_next/image?url=https%3A%2F%2Fstorage.googleapis.com%2Fincident-io-status-page-logos%2F01H537TKYPX5W42WRCKR1AGPFT%2Fopenai-1%2Fxrs545k8.png&w=2048&q=75 2048w, /_next/image?url=https%3A%2F%2Fstorage.googleapis.com%2Fincident-io-status-page-logos%2F01H537TKYPX5W42WRCKR1AGPFT%2Fopenai-1%2Fxrs545k8.png&w=3840&q=75 3840w" src="/_next/image?url=https%3A%2F%2Fstorage.googleapis.com%2Fincident-io-status-page-logos%2F01H537TKYPX5W42WRCKR1AGPFT%2Fopenai-1%2Fxrs545k8.png&w=3840&q=75"/></h1></a></div><div class="sm:inline-flex items-center space-x-4"><button title="Subscribe to updates" type="button" class="transition text-sm focus:outline-none px-2.5 py-1.5 Button-module-scss-module__cwkHSa__primary">Subscribe to updates</button></div></div><div data-testid="heads-up" class="rounded-lg p-px shadow-sm dark:shadow-none ContentBox-module-scss-module__Pj3ila__default"><div class="relative rounded-[7px] bg-white dark:bg-global"><div class="ContentBox-module-scss-module__Pj3ila__header rounded-t-[7px] text-base font-medium px-4 py-3.5"><li class="flex items-center text-slate-900 dark:text-slate-50 py-0.5"><svg width="17" height="16" viewBox="0 0 17 16" fill="none" xmlns="http://www.w3.org/2000/svg" class="mr-2 text-slate-500 dark:text-slate-300"><path fill-rule="evenodd" clip-rule="evenodd" d="M9.63422 2.19162C9.17333 1.27158 7.86032 1.27138 7.39915 2.19121L7.39914 2.19122L2.13614 12.6882L1.46569 12.3521L2.13614 12.6882C1.7194 13.5194 2.32373 14.4985 3.25356 14.4985H13.7748C14.7044 14.4985 15.3087 13.5198 14.8924 12.6887L14.8924 12.6887L9.63423 2.19163L9.63422 2.19162ZM6.05824 1.51891C7.07287 -0.504787 9.96145 -0.504211 10.9754 1.5198L10.9754 1.51981L16.2336 12.0169L16.2336 12.0169C17.1495 13.8454 15.82 15.9985 13.7748 15.9985H3.25356C1.20794 15.9985 -0.121611 13.8446 0.795244 12.0159L6.05824 1.51892L6.05824 1.51891ZM8.51342 4.99848C9.06571 4.99848 9.51342 5.4462 9.51342 5.99848V7.99848C9.51342 8.55077 9.06571 8.99848 8.51342 8.99848C7.96114 8.99848 7.51342 8.55077 7.51342 7.99848V5.99848C7.51342 5.4462 7.96114 4.99848 8.51342 4.99848ZM9.51342 11.9985C9.51342 12.5508 9.06571 12.9985 8.51342 12.9985C7.96114 12.9985 7.51342 12.5508 7.51342 11.9985C7.51342 11.4462 7.96114 10.9985 8.51342 10.9985C9.06571 10.9985 9.51342 11.4462 9.51342 11.9985Z" fill="currentColor"></path><path fill-rule="evenodd" clip-rule="evenodd" d="M9.63422 2.19162C9.17333 1.27158 7.86032 1.27138 7.39915 2.19121L7.39914 2.19122L2.13614 12.6882L1.46569 12.3521L2.13614 12.6882C1.7194 13.5194 2.32373 14.4985 3.25356 14.4985H13.7748C14.7044 14.4985 15.3087 13.5198 14.8924 12.6887L14.8924 12.6887L9.63423 2.19163L9.63422 2.19162ZM6.05824 1.51891C7.07287 -0.504787 9.96145 -0.504211 10.9754 1.5198L10.9754 1.51981L16.2336 12.0169L16.2336 12.0169C17.1495 13.8454 15.82 15.9985 13.7748 15.9985H3.25356C1.20794 15.9985 -0.121611 13.8446 0.795244 12.0159L6.05824 1.51892L6.05824 1.51891ZM8.51342 4.99848C9.06571 4.99848 9.51342 5.4462 9.51342 5.99848V7.99848C9.51342 8.55077 9.06571 8.99848 8.51342 8.99848C7.96114 8.99848 7.51342 8.55077 7.51342 7.99848V5.99848C7.51342 5.4462 7.96114 4.99848 8.51342 4.99848ZM9.51342 11.9985C9.51342 12.5508 9.06571 12.9985 8.51342 12.9985C7.96114 12.9985 7.51342 12.5508 7.51342 11.9985C7.51342 11.4462 7.96114 10.9985 8.51342 10.9985C9.06571 10.9985 9.51342 11.4462 9.51342 11.9985Z" fill="currentColor"></path></svg>We’re currently experiencing issues</li></div><div class="text-slate-900 dark:text-slate-100"><div class="text-sm"><div class="flex flex-col"><div class="p-1"><div class="bg-transparent !rounded w-auto rounded-lg bg-default border border-transparent hover:bg-slate-50 dark:hover:bg-slate-800/60 transition"><a class="p-3 flex w-full cursor-pointer touch-manipulation" href="/incidents/01KKWW47249GJZZP9ZGR1PTHV5"><div class="flex flex-row gap-2 w-full"><svg class="animate-pulse mr-[3px] ml-1 mt-1.5 text-icon-full-outage" width="9" height="8" viewBox="0 0 9 8" fill="none" xmlns="http://www.w3.org/2000/svg"><circle cx="4.5" cy="4" r="4" fill="currentColor"></circle></svg><div class="flex flex-col space-y-2"><div class="flex items-center text-slate-900 dark:text-slate-200 font-medium">Elevated errors for sign-in and account creation</div><div class="text-slate-900 dark:text-slate-200 font-normal"><div class="break-words"><div><p class="mb-[10px] last:mb-0 whitespace-pre-line"><span class="">We have applied the mitigation and are monitoring the recovery.</span></p></div></div></div><div class="text-slate-500"><span>Monitoring</span><span class="px-2">·</span><div class="inline"><span>Ongoing for <var duration>12</var> hours</span></div></div></div></div></a></div></div></div></div></div></div></div><div data-testid="system-status" class="rounded-lg p-px shadow-sm dark:shadow-none ContentBox-module-scss-module__Pj3ila__default"><div class="relative rounded-[7px] bg-white dark:bg-global"><div class="ContentBox-module-scss-module__Pj3ila__header rounded-t-[7px] text-base font-medium px-4 py-3.5"><div class="flex md:items-center justify-between md:flex-row flex-col md:gap-2 gap-4 items-start"><div class="flex items-center space-x-4"><h2 class="text-slate-900 dark:text-slate-50">System status</h2><div class="hidden md:flex items-center text-sm font-normal space-x-1 mt-[1px] text-slate-500"><div><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" width="6" height="10" class="text-slate-300 dark:text-slate-500 w-4 h-4 font-semibold cursor-pointer transition text-slate-400 hover:text-slate-500 dark:text-slate-500 dark:hover:text-slate-300"><path d="M15.75 19.5L8.25 12l7.5-7.5" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path></svg></div><div class="select-none flex justify-center whitespace-nowrap text-slate-400 dark:text-slate-500">Dec 2025<span class="px-1">-</span>Mar 2026</div><div><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" class="text-slate-300 dark:text-slate-500 w-4 h-4 font-semibold cursor-not-allowed !text-slate-100 dark:!text-slate-700"><path d="M8.25 4.5l7.5 7.5-7.5 7.5" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path></svg></div></div></div></div></div><div class="text-slate-900 dark:text-slate-100"><div class="divide-y divide-solid text-sm divide-slate-50 dark:divide-slate-800"><div class="p-4 md:pt-3 md:pb-3 text-sm"><div><div class="h-7 flex flex-grow items-center text-medium"><div style="opacity:1;width:auto"><div><svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg" class="w-[16px] h-[16px] mr-2 text-icon-operational"><path xmlns="http://www.w3.org/2000/svg" d="M8 0C3.589 0 0 3.589 0 8C0 12.411 3.589 16 8 16C12.411 16 16 12.411 16 8C16 3.589 12.411 0 8 0ZM11.947 5.641C10.088 7.023 8.512 8.931 7.264 11.31C7.135 11.557 6.879 11.712 6.6 11.712C6.323 11.715 6.062 11.555 5.933 11.305C5.358 10.188 4.715 9.28 3.968 8.529C3.676 8.236 3.677 7.76 3.971 7.468C4.263 7.176 4.739 7.176 5.032 7.471C5.605 8.047 6.122 8.699 6.595 9.443C7.834 7.398 9.329 5.717 11.053 4.436C11.385 4.19 11.855 4.258 12.102 4.591C12.349 4.923 12.28 5.394 11.947 5.641Z" fill="currentColor"></path></svg></div></div><div class="hidden md:flex space-x-2 flex-grow items-center text-md"><div class="flex space-x-1.5 items-center"><h3 class="font-medium text-slate-900 dark:text-slate-100">APIs</h3><div class="transition text-slate-300 hover:text-slate-500 dark:text-slate-500 dark:hover:text-slate-300 mt-[1px] hidden md:block"><div><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-4 h-4"><path stroke-linecap="round" stroke-linejoin="round" d="M11.25 11.25l.041-.02a.75.75 0 011.063.852l-.708 2.836a.75.75 0 001.063.853l.041-.021M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9-3.75h.008v.008H12V8.25z"></path></svg></div></div><div class="flex flex-row items-center cursor-pointer group transition"></div></div><span class="flex items-center cursor-pointer group transition text-slate-500 hover:text-slate-900 dark:hover:text-slate-200"><span class="hidden md:inline">12 components</span><span class="flex items-center justify-center w-3 h-6 mt-[2px] ml-1"><svg class="text-slate-300 dark:text-slate-500 transition text-slate-300 group-hover:text-slate-900 dark:text-slate-500 dark:group-hover:text-slate-300" width="10" height="6" viewBox="0 0 10 6" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M9 0.980774L5.25 5.01924L1.5 0.980774" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path></svg></span></span><div class="flex-grow"></div><div class="ml-2 font-normal flex flex-row items-center gap-1 text-slate-400"><div style="opacity:0"><span class="whitespace-nowrap"><var percentage>99.76</var>% uptime</span></div></div></div><div class="flex md:hidden items-center text-md min-w-[0px]"><h3 class="font-medium">APIs</h3><span class="flex items-center cursor-pointer group transition text-slate-500 hover:text-slate-900 dark:hover:text-slate-200"><span class="hidden md:inline">12 components</span><span class="flex items-center justify-center w-3 h-6 mt-[2px] ml-1"><svg class="text-slate-300 dark:text-slate-500 transition text-slate-300 group-hover:text-slate-900 dark:text-slate-500 dark:group-hover:text-slate-300" width="10" height="6" viewBox="0 0 10 6" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M9 0.980774L5.25 5.01924L1.5 0.980774" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path></svg></span></span></div></div><div class="hidden md:flex"><div class="w-full" style="height:auto;opacity:1;margin-top:4px;visibility:visible;overflow:visible"><div class="text-slate-500"><svg width="100%" height="16" viewBox="0 0 668 16" class="mb-1"><rect x="0" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillPartialOutage"></rect><rect x="7.34065934065934" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="14.68131868131868" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="22.021978021978022" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="29.36263736263736" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="36.7032967032967" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="44.043956043956044" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="51.38461538461538" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="58.72527472527472" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="66.06593406593406" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="73.4065934065934" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="80.74725274725274" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="88.08791208791209" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="95.42857142857143" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="102.76923076923076" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="110.1098901098901" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="117.45054945054945" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="124.79120879120879" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="132.13186813186812" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="139.47252747252747" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="146.8131868131868" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="154.15384615384616" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="161.4945054945055" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillPartialOutage"></rect><rect x="168.83516483516482" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="176.17582417582418" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="183.5164835164835" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="190.85714285714286" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="198.1978021978022" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="205.53846153846152" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="212.87912087912088" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="220.2197802197802" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="227.56043956043956" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="234.9010989010989" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="242.24175824175822" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="249.58241758241758" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="256.9230769230769" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="264.26373626373623" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="271.6043956043956" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="278.94505494505495" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="286.2857142857143" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="293.6263736263736" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="300.96703296703294" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="308.3076923076923" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="315.64835164835165" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="322.989010989011" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="330.3296703296703" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="337.67032967032964" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="345.010989010989" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="352.35164835164835" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="359.6923076923077" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="367.032967032967" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="374.37362637362634" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="381.7142857142857" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="389.05494505494505" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="396.3956043956044" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="403.7362637362637" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="411.07692307692304" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="418.4175824175824" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="425.75824175824175" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="433.0989010989011" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="440.4395604395604" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="447.78021978021974" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="455.1208791208791" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="462.46153846153845" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="469.8021978021978" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="477.1428571428571" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="484.48351648351644" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="491.8241758241758" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="499.16483516483515" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="506.5054945054945" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="513.8461538461538" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="521.1868131868132" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="528.5274725274725" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="535.8681318681319" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="543.2087912087912" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="550.5494505494505" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="557.8901098901099" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="565.2307692307692" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="572.5714285714286" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="579.9120879120879" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="587.2527472527472" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="594.5934065934066" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="601.9340659340659" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="609.2747252747253" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="616.6153846153846" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="623.9560439560439" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="631.2967032967033" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="638.6373626373626" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="645.978021978022" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="653.3186813186813" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="660.6593406593406" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect></svg></div></div></div></div></div><div class="p-4 md:pt-3 md:pb-3 text-sm"><div><div class="h-7 flex flex-grow items-center text-medium"><div style="opacity:1;width:auto"><div><svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg" class="w-[16px] h-[16px] mr-2 text-icon-operational"><path xmlns="http://www.w3.org/2000/svg" d="M8 0C3.589 0 0 3.589 0 8C0 12.411 3.589 16 8 16C12.411 16 16 12.411 16 8C16 3.589 12.411 0 8 0ZM11.947 5.641C10.088 7.023 8.512 8.931 7.264 11.31C7.135 11.557 6.879 11.712 6.6 11.712C6.323 11.715 6.062 11.555 5.933 11.305C5.358 10.188 4.715 9.28 3.968 8.529C3.676 8.236 3.677 7.76 3.971 7.468C4.263 7.176 4.739 7.176 5.032 7.471C5.605 8.047 6.122 8.699 6.595 9.443C7.834 7.398 9.329 5.717 11.053 4.436C11.385 4.19 11.855 4.258 12.102 4.591C12.349 4.923 12.28 5.394 11.947 5.641Z" fill="currentColor"></path></svg></div></div><div class="hidden md:flex space-x-2 flex-grow items-center text-md"><div class="flex space-x-1.5 items-center"><h3 class="font-medium text-slate-900 dark:text-slate-100">ChatGPT</h3><div class="transition text-slate-300 hover:text-slate-500 dark:text-slate-500 dark:hover:text-slate-300 mt-[1px] hidden md:block"><div><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-4 h-4"><path stroke-linecap="round" stroke-linejoin="round" d="M11.25 11.25l.041-.02a.75.75 0 011.063.852l-.708 2.836a.75.75 0 001.063.853l.041-.021M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9-3.75h.008v.008H12V8.25z"></path></svg></div></div><div class="flex flex-row items-center cursor-pointer group transition"></div></div><span class="flex items-center cursor-pointer group transition text-slate-500 hover:text-slate-900 dark:hover:text-slate-200"><span class="hidden md:inline">13 components</span><span class="flex items-center justify-center w-3 h-6 mt-[2px] ml-1"><svg class="text-slate-300 dark:text-slate-500 transition text-slate-300 group-hover:text-slate-900 dark:text-slate-500 dark:group-hover:text-slate-300" width="10" height="6" viewBox="0 0 10 6" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M9 0.980774L5.25 5.01924L1.5 0.980774" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path></svg></span></span><div class="flex-grow"></div><div class="ml-2 font-normal flex flex-row items-center gap-1 text-slate-400"><div style="opacity:0"><span class="whitespace-nowrap"><var percentage>99.08</var>% uptime</span></div></div></div><div class="flex md:hidden items-center text-md min-w-[0px]"><h3 class="font-medium">ChatGPT</h3><span class="flex items-center cursor-pointer group transition text-slate-500 hover:text-slate-900 dark:hover:text-slate-200"><span class="hidden md:inline">13 components</span><span class="flex items-center justify-center w-3 h-6 mt-[2px] ml-1"><svg class="text-slate-300 dark:text-slate-500 transition text-slate-300 group-hover:text-slate-900 dark:text-slate-500 dark:group-hover:text-slate-300" width="10" height="6" viewBox="0 0 10 6" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M9 0.980774L5.25 5.01924L1.5 0.980774" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path></svg></span></span></div></div><div class="hidden md:flex"><div class="w-full" style="height:auto;opacity:1;margin-top:4px;visibility:visible;overflow:visible"><div class="text-slate-500"><svg width="100%" height="16" viewBox="0 0 668 16" class="mb-1"><rect x="0" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillPartialOutage"></rect><rect x="7.34065934065934" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillPartialOutage"></rect><rect x="14.68131868131868" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="22.021978021978022" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="29.36263736263736" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="36.7032967032967" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="44.043956043956044" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="51.38461538461538" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="58.72527472527472" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="66.06593406593406" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="73.4065934065934" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="80.74725274725274" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="88.08791208791209" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="95.42857142857143" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="102.76923076923076" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="110.1098901098901" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="117.45054945054945" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="124.79120879120879" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="132.13186813186812" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="139.47252747252747" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="146.8131868131868" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="154.15384615384616" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="161.4945054945055" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillPartialOutage"></rect><rect x="168.83516483516482" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="176.17582417582418" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="183.5164835164835" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="190.85714285714286" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="198.1978021978022" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="205.53846153846152" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="212.87912087912088" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="220.2197802197802" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="227.56043956043956" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="234.9010989010989" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="242.24175824175822" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="249.58241758241758" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="256.9230769230769" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="264.26373626373623" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="271.6043956043956" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="278.94505494505495" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="286.2857142857143" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="293.6263736263736" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="300.96703296703294" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="308.3076923076923" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="315.64835164835165" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="322.989010989011" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillPartialOutage"></rect><rect x="330.3296703296703" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="337.67032967032964" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="345.010989010989" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="352.35164835164835" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="359.6923076923077" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="367.032967032967" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="374.37362637362634" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="381.7142857142857" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="389.05494505494505" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="396.3956043956044" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="403.7362637362637" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="411.07692307692304" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="418.4175824175824" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="425.75824175824175" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="433.0989010989011" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="440.4395604395604" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="447.78021978021974" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillFullOutage"></rect><rect x="455.1208791208791" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="462.46153846153845" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="469.8021978021978" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="477.1428571428571" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="484.48351648351644" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="491.8241758241758" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="499.16483516483515" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="506.5054945054945" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="513.8461538461538" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="521.1868131868132" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillPartialOutage"></rect><rect x="528.5274725274725" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="535.8681318681319" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="543.2087912087912" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="550.5494505494505" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="557.8901098901099" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="565.2307692307692" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="572.5714285714286" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="579.9120879120879" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="587.2527472527472" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="594.5934065934066" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="601.9340659340659" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="609.2747252747253" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="616.6153846153846" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="623.9560439560439" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="631.2967032967033" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="638.6373626373626" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="645.978021978022" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="653.3186813186813" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="660.6593406593406" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect></svg></div></div></div></div></div><div class="p-4 md:pt-3 md:pb-3 text-sm"><div><div class="h-7 flex flex-grow items-center text-medium"><div style="opacity:1;width:auto"><div><svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg" class="w-[16px] h-[16px] mr-2 text-icon-operational"><path xmlns="http://www.w3.org/2000/svg" d="M8 0C3.589 0 0 3.589 0 8C0 12.411 3.589 16 8 16C12.411 16 16 12.411 16 8C16 3.589 12.411 0 8 0ZM11.947 5.641C10.088 7.023 8.512 8.931 7.264 11.31C7.135 11.557 6.879 11.712 6.6 11.712C6.323 11.715 6.062 11.555 5.933 11.305C5.358 10.188 4.715 9.28 3.968 8.529C3.676 8.236 3.677 7.76 3.971 7.468C4.263 7.176 4.739 7.176 5.032 7.471C5.605 8.047 6.122 8.699 6.595 9.443C7.834 7.398 9.329 5.717 11.053 4.436C11.385 4.19 11.855 4.258 12.102 4.591C12.349 4.923 12.28 5.394 11.947 5.641Z" fill="currentColor"></path></svg></div></div><div class="hidden md:flex space-x-2 flex-grow items-center text-md"><div class="flex space-x-1.5 items-center"><h3 class="font-medium text-slate-900 dark:text-slate-100">Sora</h3><div class="transition text-slate-300 hover:text-slate-500 dark:text-slate-500 dark:hover:text-slate-300 mt-[1px] hidden md:block"><div><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-4 h-4"><path stroke-linecap="round" stroke-linejoin="round" d="M11.25 11.25l.041-.02a.75.75 0 011.063.852l-.708 2.836a.75.75 0 001.063.853l.041-.021M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9-3.75h.008v.008H12V8.25z"></path></svg></div></div><div class="flex flex-row items-center cursor-pointer group transition"></div></div><span class="flex items-center cursor-pointer group transition text-slate-500 hover:text-slate-900 dark:hover:text-slate-200"><span class="hidden md:inline">5 components</span><span class="flex items-center justify-center w-3 h-6 mt-[2px] ml-1"><svg class="text-slate-300 dark:text-slate-500 transition text-slate-300 group-hover:text-slate-900 dark:text-slate-500 dark:group-hover:text-slate-300" width="10" height="6" viewBox="0 0 10 6" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M9 0.980774L5.25 5.01924L1.5 0.980774" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path></svg></span></span><div class="flex-grow"></div><div class="ml-2 font-normal flex flex-row items-center gap-1 text-slate-400"><div style="opacity:0"><span class="whitespace-nowrap"><var percentage>99.98</var>% uptime</span></div></div></div><div class="flex md:hidden items-center text-md min-w-[0px]"><h3 class="font-medium">Sora</h3><span class="flex items-center cursor-pointer group transition text-slate-500 hover:text-slate-900 dark:hover:text-slate-200"><span class="hidden md:inline">5 components</span><span class="flex items-center justify-center w-3 h-6 mt-[2px] ml-1"><svg class="text-slate-300 dark:text-slate-500 transition text-slate-300 group-hover:text-slate-900 dark:text-slate-500 dark:group-hover:text-slate-300" width="10" height="6" viewBox="0 0 10 6" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M9 0.980774L5.25 5.01924L1.5 0.980774" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path></svg></span></span></div></div><div class="hidden md:flex"><div class="w-full" style="height:auto;opacity:1;margin-top:4px;visibility:visible;overflow:visible"><div class="text-slate-500"><svg width="100%" height="16" viewBox="0 0 668 16" class="mb-1"><rect x="0" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="7.34065934065934" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillFullOutage"></rect><rect x="14.68131868131868" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="22.021978021978022" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="29.36263736263736" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="36.7032967032967" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="44.043956043956044" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="51.38461538461538" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="58.72527472527472" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="66.06593406593406" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="73.4065934065934" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="80.74725274725274" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="88.08791208791209" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="95.42857142857143" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="102.76923076923076" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="110.1098901098901" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="117.45054945054945" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="124.79120879120879" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="132.13186813186812" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="139.47252747252747" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="146.8131868131868" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="154.15384615384616" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="161.4945054945055" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="168.83516483516482" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="176.17582417582418" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="183.5164835164835" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="190.85714285714286" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="198.1978021978022" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="205.53846153846152" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="212.87912087912088" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="220.2197802197802" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="227.56043956043956" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="234.9010989010989" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="242.24175824175822" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="249.58241758241758" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="256.9230769230769" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="264.26373626373623" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="271.6043956043956" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="278.94505494505495" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="286.2857142857143" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="293.6263736263736" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="300.96703296703294" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="308.3076923076923" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillDegradedPerformance"></rect><rect x="315.64835164835165" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="322.989010989011" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="330.3296703296703" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><rect x="337.67032967032964" y="0" width="5" height="16" rx="1" ry="1" class="transition UptimeChart-module-scss-module__oGQuNq__pillOperational"></rect><r
gitextract_a2ozbqvp/
├── .bundle/
│ └── config
├── .gitattributes
├── .gitignore
├── .swiftlint.yml
├── Cartfile
├── Cartfile.resolved
├── Gemfile
├── LICENSE
├── README.md
├── Resources/
│ ├── AppIcon.icon/
│ │ └── icon.json
│ ├── Assets.xcassets/
│ │ └── Contents.json
│ ├── Base.lproj/
│ │ └── MainMenu.xib
│ ├── Info.plist
│ └── services.json
├── Scripts/
│ ├── generate_adobe_services.swift
│ ├── generate_apple_services.swift
│ ├── generate_aws_services.swift
│ ├── generate_azure_devops_services.swift
│ ├── generate_azure_services.swift
│ ├── generate_google_services.swift
│ ├── generate_salesforce_services.swift
│ └── generate_services_plist.sh
├── extract.rb
├── openai.html
├── sort.rb
├── stts/
│ ├── AppDelegate.swift
│ ├── AppearanceObserver.swift
│ ├── BottomBar.swift
│ ├── CustomScrollView.swift
│ ├── DataLoader.swift
│ ├── EditorTableView/
│ │ └── EditorTableCell.swift
│ ├── Extensions/
│ │ ├── Atomic.swift
│ │ ├── NSScreenExtensions.swift
│ │ ├── StringExtensions.swift
│ │ └── TaskExtensions.swift
│ ├── HeadlessHTMLRenderer.swift
│ ├── Icons.swift
│ ├── Preferences/
│ │ ├── PreferencesGeneralView.swift
│ │ ├── PreferencesServicesView.swift
│ │ └── PreferencesWindow.swift
│ ├── Preferences.swift
│ ├── PreferencesWindow/
│ │ ├── NSAppearance+Extensions.swift
│ │ ├── PreferencesAboutView.swift
│ │ ├── PreferencesSidebarMenu.swift
│ │ └── PreferencesWindowController.swift
│ ├── ServiceLoader/
│ │ ├── AppDefinedServiceDefinitionProvider.swift
│ │ ├── BundleServiceDefinitionProvider.swift
│ │ ├── ServiceDefinition.swift
│ │ ├── ServiceDefinitionProvider.swift
│ │ ├── ServiceLoader.swift
│ │ ├── ServicesStructure.swift
│ │ └── UserDefinedServiceDefinitionProvider.swift
│ ├── ServiceTableView/
│ │ ├── ServiceTableRowView.swift
│ │ ├── ServiceTableViewController.swift
│ │ ├── StatusIndicator.swift
│ │ └── StatusTableCell.swift
│ ├── Services/
│ │ ├── Algolia.swift
│ │ ├── AzureAll.swift
│ │ ├── AzureDevOpsAll.swift
│ │ ├── Beanstalk.swift
│ │ ├── Broadcom.swift
│ │ ├── Evernote.swift
│ │ ├── Fastly.swift
│ │ ├── Firebase.swift
│ │ ├── Generated/
│ │ │ ├── AWSServices.swift
│ │ │ ├── AdobeServices.swift
│ │ │ ├── AppleServices.swift
│ │ │ ├── AzureDevOpsServices.swift
│ │ │ ├── AzureServices.swift
│ │ │ ├── FirebaseServices.swift
│ │ │ ├── GoogleCloudPlatformServices.swift
│ │ │ └── SalesforceProducts.swift
│ │ ├── GoogleCloudPlatformAll.swift
│ │ ├── MiroAll.swift
│ │ ├── Okta.swift
│ │ ├── OracleNetSuite.swift
│ │ ├── PagerDuty/
│ │ │ └── PagerDuty.swift
│ │ ├── PayPal/
│ │ │ ├── PayPalAPIProduction.swift
│ │ │ ├── PayPalAPISandbox.swift
│ │ │ ├── PayPalProductProduction.swift
│ │ │ └── PayPalProductSandbox.swift
│ │ ├── PlayStation Network/
│ │ │ ├── PSNAmerica.swift
│ │ │ ├── PSNAsia.swift
│ │ │ └── PSNEurope.swift
│ │ ├── SendbirdAll.swift
│ │ ├── SignalWire.swift
│ │ ├── Slack.swift
│ │ ├── Stripe.swift
│ │ ├── Super/
│ │ │ ├── AWSService.swift
│ │ │ ├── AWSStore.swift
│ │ │ ├── Adobe.swift
│ │ │ ├── AdobeStore.swift
│ │ │ ├── Apple.swift
│ │ │ ├── AppleDeveloper.swift
│ │ │ ├── AppleStore.swift
│ │ │ ├── Azure.swift
│ │ │ ├── AzureDevOps.swift
│ │ │ ├── AzureDevOpsStore.swift
│ │ │ ├── AzureStore.swift
│ │ │ ├── BetterStackService.swift
│ │ │ ├── BetterUptimeService.swift
│ │ │ ├── CStateService.swift
│ │ │ ├── CachetService.swift
│ │ │ ├── ExanaService.swift
│ │ │ ├── FirebaseService.swift
│ │ │ ├── FirebaseStatusDashboardStore.swift
│ │ │ ├── GoogleCloudPlatform.swift
│ │ │ ├── GoogleStatusDashboardStore.swift
│ │ │ ├── IncidentIOService.swift
│ │ │ ├── IndependentService.swift
│ │ │ ├── InstatusService.swift
│ │ │ ├── LambStatusService.swift
│ │ │ ├── MiroService.swift
│ │ │ ├── PagerDutyService.swift
│ │ │ ├── PayPal.swift
│ │ │ ├── PlayStationNetwork.swift
│ │ │ ├── Salesforce.swift
│ │ │ ├── SalesforceCategories.swift
│ │ │ ├── SalesforceStore.swift
│ │ │ ├── SendbirdService.swift
│ │ │ ├── Service.swift
│ │ │ ├── ServiceStore.swift
│ │ │ ├── Site24x7Service.swift
│ │ │ ├── SorryService.swift
│ │ │ ├── StatusCakeService.swift
│ │ │ ├── StatusCastService.swift
│ │ │ ├── StatusHubService.swift
│ │ │ ├── StatusPageService.swift
│ │ │ ├── StatusioV1Service.swift
│ │ │ ├── StatuspalService.swift
│ │ │ └── UptimeDotComService.swift
│ │ ├── UptimeDotCom/
│ │ │ ├── JSDelivr.swift
│ │ │ ├── Recurly.swift
│ │ │ └── UptimeDotCom.swift
│ │ └── Zendesk.swift
│ ├── SwitchableTableViewController.swift
│ └── stts.entitlements
├── stts.xcodeproj/
│ ├── project.pbxproj
│ ├── project.xcworkspace/
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata/
│ │ ├── IDEWorkspaceChecks.plist
│ │ └── swiftpm/
│ │ └── Package.resolved
│ └── xcshareddata/
│ └── xcschemes/
│ └── stts.xcscheme
└── sttsTests/
├── AdobeTests.swift
├── BetterStackTests.swift
├── Helpers/
│ └── TestBundle.swift
├── IncidentIOTests.swift
├── Info.plist
├── InstatusTests.swift
├── MiroTests.swift
├── Mocks/
│ ├── ResponseOverridingURLSession.swift
│ └── ResponseSizeTrackingURLSession.swift
├── PagerDutyTests.swift
├── Resources/
│ ├── adobe-analytics-minor.json
│ ├── aiven-minor.html
│ ├── buildjet-good.html
│ ├── eyloo-major.html
│ ├── linear-good.html
│ ├── mastodonsocial-major.html
│ ├── miro-good.html
│ ├── miro-issue.html
│ ├── openai-major.html
│ ├── pagerduty-good.html
│ ├── pagerduty-minor.html
│ ├── rollbar-good.html
│ └── whereby-good.html
├── StringExtensionsTests.swift
└── sttsTests.swift
SYMBOL INDEX (13 symbols across 1 files) FILE: extract.rb function source_for (line 8) | def source_for(url) function extract_instatus (line 15) | def extract_instatus(source, custom_name) function extract_statuspage (line 54) | def extract_statuspage(url, custom_name) function extract_site24x7 (line 86) | def extract_site24x7(url, source, custom_name) function extract_cstate (line 124) | def extract_cstate(url, custom_name) function create_file (line 158) | def create_file(path, content) function better_name (line 197) | def better_name(name) function sanitized_name (line 201) | def sanitized_name(name) function finish (line 221) | def finish function fail_params (line 230) | def fail_params function fail_network (line 239) | def fail_network function fail (line 245) | def fail function run_synx (line 251) | def run_synx
Condensed preview — 167 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (3,959K chars).
[
{
"path": ".bundle/config",
"chars": 68,
"preview": "---\nBUNDLE_PATH: \"vendor/bundle\"\nBUNDLE_FORCE_RUBY_PLATFORM: \"true\"\n"
},
{
"path": ".gitattributes",
"chars": 41,
"preview": "sttsTests/Resources/** linguist-vendored\n"
},
{
"path": ".gitignore",
"chars": 1582,
"preview": "\n# Created by https://www.gitignore.io/api/swift\n\n### Swift ###\n# Xcode\n#\n# gitignore contributors: remember to update G"
},
{
"path": ".swiftlint.yml",
"chars": 280,
"preview": "excluded:\n - Pods\n - Carthage\nline_length:\n warning: 120\n ignores_comments: true\n ignores_interpolated_string"
},
{
"path": "Cartfile",
"chars": 28,
"preview": "github \"inket/StartAtLogin\"\n"
},
{
"path": "Cartfile.resolved",
"chars": 37,
"preview": "github \"inket/StartAtLogin\" \"v6.0.0\"\n"
},
{
"path": "Gemfile",
"chars": 58,
"preview": "source 'https://rubygems.org'\n\ngem 'xcodeproj'\ngem 'synx'\n"
},
{
"path": "LICENSE",
"chars": 1071,
"preview": "MIT License\n\nCopyright (c) 2016 Mahdi Bchetnia\n\nPermission is hereby granted, free of charge, to any person obtaining a "
},
{
"path": "README.md",
"chars": 1399,
"preview": "## stts \n\nstts is a macOS app for monitoring the status of cloud ser"
},
{
"path": "Resources/AppIcon.icon/icon.json",
"chars": 1597,
"preview": "{\n \"fill\" : {\n \"linear-gradient\" : [\n \"display-p3:0.27726,0.27726,0.27726,1.00000\",\n \"display-p3:0.18033,0"
},
{
"path": "Resources/Assets.xcassets/Contents.json",
"chars": 63,
"preview": "{\n \"info\" : {\n \"author\" : \"xcode\",\n \"version\" : 1\n }\n}\n"
},
{
"path": "Resources/Base.lproj/MainMenu.xib",
"chars": 48702,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion"
},
{
"path": "Resources/Info.plist",
"chars": 1843,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Resources/services.json",
"chars": 31755,
"preview": "{\n \"betterstack\": [\n {\n \"name\": \"Better Stack\",\n \"url\": \"https://status.betterstack.com\",\n \"old_names"
},
{
"path": "Scripts/generate_adobe_services.swift",
"chars": 6428,
"preview": "#!/usr/bin/swift\n\nimport Foundation\n\nstruct Cloud {\n let id: String\n let name: String\n let products: [Product]\n"
},
{
"path": "Scripts/generate_apple_services.swift",
"chars": 5843,
"preview": "#!/usr/bin/swift\n\nimport Foundation\n\nprivate struct AppleResponseData: Codable {\n struct Service: Codable {\n l"
},
{
"path": "Scripts/generate_aws_services.swift",
"chars": 6387,
"preview": "#!/usr/bin/swift\n\nimport Foundation\n\nextension String {\n func capitalized(firstLetterOnly: Bool) -> String {\n "
},
{
"path": "Scripts/generate_azure_devops_services.swift",
"chars": 4824,
"preview": "#!/usr/bin/swift\n\nimport Foundation\n\nstruct AzureDevOpsService {\n let serviceName: String\n\n var friendlyName: Stri"
},
{
"path": "Scripts/generate_azure_services.swift",
"chars": 4176,
"preview": "#!/usr/bin/swift\n\nimport Foundation\n\nstruct AzureZone {\n let serviceName: String\n let zoneIdentifier: String\n\n "
},
{
"path": "Scripts/generate_google_services.swift",
"chars": 6053,
"preview": "#!/usr/bin/swift\n\nimport Foundation\n\nenum GooglePlatform: CaseIterable {\n case cloudPlatform\n case firebase\n\n v"
},
{
"path": "Scripts/generate_salesforce_services.swift",
"chars": 7166,
"preview": "#!/usr/bin/swift\n\nimport Foundation\n\nenum Location: String {\n case na = \"NA\"\n case emea = \"EMEA\"\n case apac = \""
},
{
"path": "Scripts/generate_services_plist.sh",
"chars": 903,
"preview": "#!/bin/sh\n\nRESOURCES_PATH=\"$BUILT_PRODUCTS_DIR/$UNLOCALIZED_RESOURCES_FOLDER_PATH\"\nSERVICES_PLIST=\"$RESOURCES_PATH/servi"
},
{
"path": "extract.rb",
"chars": 6476,
"preview": "require 'net/https'\nrequire 'xcodeproj'\nrequire 'json'\nrequire 'synx'\n\n@project_file = \"stts.xcodeproj\"\n\ndef source_for("
},
{
"path": "openai.html",
"chars": 254943,
"preview": "<!DOCTYPE html><html lang=\"en\" class=\"inter_48f560a7-module__FmDrPW__className h-full\"><head><meta charSet=\"utf-8\"/><met"
},
{
"path": "sort.rb",
"chars": 235,
"preview": "require 'xcodeproj'\n\n# Open the existing Xcode project\nproject_file = \"stts.xcodeproj\"\nproject = Xcodeproj::Project.open"
},
{
"path": "stts/AppDelegate.swift",
"chars": 5333,
"preview": "//\n// AppDelegate.swift\n// stts\n//\n\nimport Cocoa\nimport MBPopup\nimport PreferencesWindow\nimport Reachability\n\n@NSAppli"
},
{
"path": "stts/AppearanceObserver.swift",
"chars": 1565,
"preview": "//\n// Appearance.swift\n// stts\n//\n\nimport Cocoa\n\nprotocol AppearanceObserver: AnyObject {\n func changeAppearance(to"
},
{
"path": "stts/BottomBar.swift",
"chars": 5388,
"preview": "//\n// BottomBar.swift\n// stts\n//\n\nimport Cocoa\n\nenum BottomBarStatus {\n case undetermined\n case updating\n cas"
},
{
"path": "stts/CustomScrollView.swift",
"chars": 203,
"preview": "//\n// CustomScrollView.swift\n// stts\n//\n\nimport Cocoa\n\nclass CustomScrollView: NSScrollView {\n var topConstraint: N"
},
{
"path": "stts/DataLoader.swift",
"chars": 3130,
"preview": "//\n// Loading.swift\n// stts\n//\n\nimport Foundation\nimport Kanna\n\nprivate var _sharedWithoutCaching: URLSession?\n\nextens"
},
{
"path": "stts/EditorTableView/EditorTableCell.swift",
"chars": 6962,
"preview": "//\n// EditorTableCell.swift\n// stts\n//\n\nimport Cocoa\nimport SFSafeSymbols\n\nfinal class EditorTableCell: NSTableCellVie"
},
{
"path": "stts/Extensions/Atomic.swift",
"chars": 968,
"preview": "//\n// Atomic.swift\n// stts\n//\n\nimport Foundation\nimport os.lock\n\nprivate final class UnfairLock {\n private var _loc"
},
{
"path": "stts/Extensions/NSScreenExtensions.swift",
"chars": 994,
"preview": "//\n// NSScreenExtensions.swift\n// stts\n//\n\nimport Cocoa\n\nextension NSScreen {\n static var usableHeightOfActiveScree"
},
{
"path": "stts/Extensions/StringExtensions.swift",
"chars": 3950,
"preview": "//\n// StringExtensions.swift\n// stts\n//\n\nimport Cocoa\n\nextension String {\n var innerJSONString: String {\n le"
},
{
"path": "stts/Extensions/TaskExtensions.swift",
"chars": 290,
"preview": "//\n// Task.swift\n// stts\n//\n\nimport Foundation\n\npublic extension Task where Success == Never, Failure == Never {\n s"
},
{
"path": "stts/HeadlessHTMLRenderer.swift",
"chars": 2568,
"preview": "//\n// HeadlessHTMLRenderer.swift\n// stts\n//\n\nimport Cocoa\nimport WebKit\n\n// Because some services obfuscate the javasc"
},
{
"path": "stts/Icons.swift",
"chars": 18803,
"preview": "//\n// Icons.swift\n// stts\n//\n\nimport Cocoa\n\nclass CheckmarkIcon: NSView {\n var color: NSColor = NSColor(calibratedR"
},
{
"path": "stts/Preferences/PreferencesGeneralView.swift",
"chars": 7937,
"preview": "//\n// PreferencesGeneralView.swift\n// stts\n//\n\nimport Cocoa\nimport PreferencesWindow\n\nclass PreferencesGeneralView: Ve"
},
{
"path": "stts/Preferences/PreferencesServicesView.swift",
"chars": 14441,
"preview": "//\n// PreferencesServicesView.swift\n// stts\n//\n\nimport Cocoa\nimport PreferencesWindow\nimport Combine\n\nfinal class Pref"
},
{
"path": "stts/Preferences/PreferencesWindow.swift",
"chars": 2099,
"preview": "//\n// PreferencesWindow.swift\n// stts\n//\n\nimport Cocoa\nimport PreferencesWindow\nimport SFSafeSymbols\n\nfinal class Pref"
},
{
"path": "stts/Preferences.swift",
"chars": 3286,
"preview": "//\n// Preferences.swift\n// stts\n//\n\nimport Foundation\n\nclass Preferences {\n private let serviceLoader: ServiceLoade"
},
{
"path": "stts/PreferencesWindow/NSAppearance+Extensions.swift",
"chars": 187,
"preview": "//\n// NSAppearance+Extensions.swift\n// PreferencesWindow\n//\n\nimport Cocoa\n\nextension NSAppearance {\n var isDarkMode"
},
{
"path": "stts/PreferencesWindow/PreferencesAboutView.swift",
"chars": 4308,
"preview": "//\n// PreferencesAboutView.swift\n// PreferencesWindow\n//\n\nimport Cocoa\n\npublic struct AboutContent {\n public struct"
},
{
"path": "stts/PreferencesWindow/PreferencesSidebarMenu.swift",
"chars": 744,
"preview": "//\n// PreferencesSidebarMenu.swift\n// PreferencesWindow\n//\n\nimport Cocoa\nimport SFSafeSymbols\n\npublic protocol Prefere"
},
{
"path": "stts/PreferencesWindow/PreferencesWindowController.swift",
"chars": 10609,
"preview": "//\n// PreferencesWindowController.swift\n// PreferencesWindow\n//\n\nimport Cocoa\nimport SFSafeSymbols\n\npublic class Prefe"
},
{
"path": "stts/ServiceLoader/AppDefinedServiceDefinitionProvider.swift",
"chars": 628,
"preview": "//\n// AppDefinedServiceDefinitionProvider.swift\n// stts\n//\n\nimport Foundation\n\nenum AppDefinedServiceDefinitionProvide"
},
{
"path": "stts/ServiceLoader/BundleServiceDefinitionProvider.swift",
"chars": 759,
"preview": "//\n// BundleServiceDefinitionProvider.swift\n// stts\n//\n\nimport Foundation\n\nenum BundleServiceDefinitionProviderError: "
},
{
"path": "stts/ServiceLoader/ServiceDefinition.swift",
"chars": 3012,
"preview": "//\n// ServiceDefinition.swift\n// stts\n//\n\nimport Foundation\n\nprotocol ServiceDefinition: CodableServiceDefinition {\n "
},
{
"path": "stts/ServiceLoader/ServiceDefinitionProvider.swift",
"chars": 1201,
"preview": "//\n// ServiceDefinitionProvider.swift\n// stts\n//\n\nimport Foundation\n\nprotocol ServiceDefinitionProvider {\n func def"
},
{
"path": "stts/ServiceLoader/ServiceLoader.swift",
"chars": 1810,
"preview": "//\n// ServiceLoader.swift\n// stts\n//\n\nimport Foundation\n\nfinal class ServiceLoader {\n private let providers: [Servi"
},
{
"path": "stts/ServiceLoader/ServicesStructure.swift",
"chars": 2660,
"preview": "//\n// ServicesStructure.swift\n// stts\n//\n\nimport Foundation\n\nstruct ServicesStructure: Codable {\n enum CodingKeys: "
},
{
"path": "stts/ServiceLoader/UserDefinedServiceDefinitionProvider.swift",
"chars": 1109,
"preview": "//\n// UserDefinedServiceDefinitionProvider.swift\n// stts\n//\n\nimport Foundation\n\n// swiftlint:disable:next type_name\nen"
},
{
"path": "stts/ServiceTableView/ServiceTableRowView.swift",
"chars": 2050,
"preview": "//\n// ServiceTableRowView.swift\n// stts\n//\n\nimport Cocoa\n\nclass ServiceTableRowView: NSTableRowView {\n var showSepa"
},
{
"path": "stts/ServiceTableView/ServiceTableViewController.swift",
"chars": 10372,
"preview": "//\n// ServiceTableViewController.swift\n// stts\n//\n\nimport Cocoa\nimport MBPopup\nimport PreferencesWindow\n\nclass Service"
},
{
"path": "stts/ServiceTableView/StatusIndicator.swift",
"chars": 1649,
"preview": "//\n// StatusIndicator.swift\n// stts\n//\n\nimport Cocoa\n\nclass StatusIndicator: NSView {\n var checkmarkIcon = Checkmar"
},
{
"path": "stts/ServiceTableView/StatusTableCell.swift",
"chars": 4444,
"preview": "//\n// StatusTableCell.swift\n// stts\n//\n\nimport Cocoa\n\nclass StatusTableCell: NSTableCellView {\n let statusIndicator"
},
{
"path": "stts/Services/Algolia.swift",
"chars": 1880,
"preview": "//\n// Algolia.swift\n// stts\n//\n\nimport Foundation\nimport Kanna\n\nclass Algolia: IndependentService {\n private enum A"
},
{
"path": "stts/Services/AzureAll.swift",
"chars": 257,
"preview": "//\n// AzureAll.swift\n// stts\n//\n\nimport Foundation\n\nclass AzureAll: Azure, ServiceCategory {\n let categoryName = \"A"
},
{
"path": "stts/Services/AzureDevOpsAll.swift",
"chars": 284,
"preview": "//\n// AzureDevOpsAll.swift\n// stts\n//\n\nimport Foundation\n\nclass AzureDevOpsAll: AzureDevOps, ServiceCategory {\n let"
},
{
"path": "stts/Services/Beanstalk.swift",
"chars": 1274,
"preview": "//\n// Beanstalk.swift\n// stts\n//\n\nimport Foundation\nimport Kanna\n\nclass Beanstalk: IndependentService {\n let url = "
},
{
"path": "stts/Services/Broadcom.swift",
"chars": 1866,
"preview": "//\n// Broadcom.swift\n// stts\n//\n\nimport Foundation\n\nclass Broadcom: IndependentService {\n let url = URL(string: \"ht"
},
{
"path": "stts/Services/Evernote.swift",
"chars": 1000,
"preview": "//\n// Evernote.swift\n// stts\n//\n\nimport Foundation\nimport Kanna\n\nclass Evernote: IndependentService {\n let url = UR"
},
{
"path": "stts/Services/Fastly.swift",
"chars": 4285,
"preview": "//\n// Fastly.swift\n// stts\n\nimport Foundation\nimport Kanna\n\nclass Fastly: IndependentService {\n let url = URL(strin"
},
{
"path": "stts/Services/Firebase.swift",
"chars": 249,
"preview": "//\n// FirebaseAll.swift\n// stts\n//\n\nimport Foundation\n\nclass Firebase: FirebaseService, ServiceCategory {\n let cate"
},
{
"path": "stts/Services/Generated/AWSServices.swift",
"chars": 237988,
"preview": "// This file is generated by generate_aws_services.swift and should not be modified manually.\n// swiftlint:disable super"
},
{
"path": "stts/Services/Generated/AdobeServices.swift",
"chars": 10897,
"preview": "// This file is generated by generate_adobe_services.swift and should not be modified manually.\n// swiftlint:disable sup"
},
{
"path": "stts/Services/Generated/AppleServices.swift",
"chars": 18766,
"preview": "// This file is generated by generate_apple_services.swift and should not be modified manually.\n// swiftlint:disable sup"
},
{
"path": "stts/Services/Generated/AzureDevOpsServices.swift",
"chars": 1146,
"preview": "// This file is generated by generate_azure_devops_services.swift and should not be modified manually.\n// swiftlint:disa"
},
{
"path": "stts/Services/Generated/AzureServices.swift",
"chars": 1026,
"preview": "// This file is generated by generate_azure_services.swift and should not be modified manually.\n// swiftlint:disable sup"
},
{
"path": "stts/Services/Generated/FirebaseServices.swift",
"chars": 2507,
"preview": "// This file is generated by generate_google_services.swift and should not be modified manually.\n// swiftlint:disable su"
},
{
"path": "stts/Services/Generated/GoogleCloudPlatformServices.swift",
"chars": 29321,
"preview": "// This file is generated by generate_google_services.swift and should not be modified manually.\n// swiftlint:disable su"
},
{
"path": "stts/Services/Generated/SalesforceProducts.swift",
"chars": 7951,
"preview": "// This file is generated by generate_salesforce_services.swift and should not be modified manually.\n// swiftlint:disabl"
},
{
"path": "stts/Services/GoogleCloudPlatformAll.swift",
"chars": 308,
"preview": "//\n// GoogleCloudPlatformAll.swift\n// stts\n//\n\nimport Foundation\n\nclass GoogleCloudPlatformAll: GoogleCloudPlatform, S"
},
{
"path": "stts/Services/MiroAll.swift",
"chars": 2165,
"preview": "//\n// MiroAll.swift\n// stts\n\nimport Foundation\nimport Kanna\n\nclass MiroAll: IndependentService, ServiceCategory {\n "
},
{
"path": "stts/Services/Okta.swift",
"chars": 2518,
"preview": "//\n// Okta.swift\n// stts\n//\n\nimport Foundation\nimport Kanna\n\nclass Okta: IndependentService {\n private struct Incid"
},
{
"path": "stts/Services/OracleNetSuite.swift",
"chars": 1291,
"preview": "//\n// OracleNetSuite.swift\n// stts\n//\n\nimport Foundation\n\nprivate struct NetSuiteResponse: Codable {\n struct NetSui"
},
{
"path": "stts/Services/PagerDuty/PagerDuty.swift",
"chars": 158,
"preview": "//\n// PagerDuty.swift\n// stts\n//\n\nimport Foundation\n\nfinal class PagerDuty: PagerDutyService {\n let url = URL(strin"
},
{
"path": "stts/Services/PayPal/PayPalAPIProduction.swift",
"chars": 190,
"preview": "//\n// PayPalAPIProduction.swift\n// stts\n//\n\nimport Foundation\n\nfinal class PayPalAPIProduction: PayPal {\n let name "
},
{
"path": "stts/Services/PayPal/PayPalAPISandbox.swift",
"chars": 191,
"preview": "//\n// PayPalAPISandbox.swift\n// stts\n//\n\nimport Foundation\n\nfinal class PayPalAPISandbox: PayPal {\n let name = \"Pay"
},
{
"path": "stts/Services/PayPal/PayPalProductProduction.swift",
"chars": 206,
"preview": "//\n// PayPalProductProduction.swift\n// stts\n//\n\nimport Foundation\n\nfinal class PayPalProductProduction: PayPal {\n l"
},
{
"path": "stts/Services/PayPal/PayPalProductSandbox.swift",
"chars": 207,
"preview": "//\n// PayPalProductSandbox.swift\n// stts\n//\n\nimport Foundation\n\nfinal class PayPalProductSandbox: PayPal {\n let nam"
},
{
"path": "stts/Services/PlayStation Network/PSNAmerica.swift",
"chars": 199,
"preview": "//\n// PSNAmerica.swift\n// stts\n//\n\nimport Foundation\n\nfinal class PSNAmerica: PlayStationNetwork {\n let region: Pla"
},
{
"path": "stts/Services/PlayStation Network/PSNAsia.swift",
"chars": 191,
"preview": "//\n// PSNAsia.swift\n// stts\n//\n\nimport Foundation\n\nfinal class PSNAsia: PlayStationNetwork {\n let region: PlayStati"
},
{
"path": "stts/Services/PlayStation Network/PSNEurope.swift",
"chars": 196,
"preview": "//\n// PSNEurope.swift\n// stts\n//\n\nimport Foundation\n\nfinal class PSNEurope: PlayStationNetwork {\n let region: PlayS"
},
{
"path": "stts/Services/SendbirdAll.swift",
"chars": 1735,
"preview": "//\n// SendbirdAll.swift\n// SendbirdAll\n//\n\nimport Foundation\n\nclass SendbirdAll: IndependentService, ServiceCategory {"
},
{
"path": "stts/Services/SignalWire.swift",
"chars": 1692,
"preview": "//\n// SignalWire.swift\n// stts\n//\n\nimport Foundation\n\nclass SignalWire: IndependentService {\n let url = URL(string:"
},
{
"path": "stts/Services/Slack.swift",
"chars": 1536,
"preview": "//\n// Slack.swift\n// stts\n//\n\nimport Foundation\nimport Kanna\n\nclass Slack: IndependentService {\n private enum Slack"
},
{
"path": "stts/Services/Stripe.swift",
"chars": 1357,
"preview": "//\n// Stripe.swift\n// stts\n//\n\nimport Foundation\n\nprivate struct StripeCurrentStatus: Codable {\n enum Status: Strin"
},
{
"path": "stts/Services/Super/AWSService.swift",
"chars": 1644,
"preview": "//\n// AWSService.swift\n// stts\n//\n\nimport Foundation\n\ntypealias AWSAllService = BaseAWSAllService & RequiredServicePro"
},
{
"path": "stts/Services/Super/AWSStore.swift",
"chars": 6206,
"preview": "//\n// AWSStore.swift\n// stts\n//\n\nimport Foundation\n\n// When all is good, the response from currentevents is empty; luc"
},
{
"path": "stts/Services/Super/Adobe.swift",
"chars": 1264,
"preview": "//\n// Adobe.swift\n// stts\n//\n\nimport Foundation\n\ntypealias AdobeCreativeCloud = BaseAdobeCreativeCloud & RequiredServi"
},
{
"path": "stts/Services/Super/AdobeStore.swift",
"chars": 9383,
"preview": "//\n// AdobeStore.swift\n// stts\n//\n\nimport Foundation\n\nprotocol AdobeStoreService {\n var id: String { get }\n}\n\npriva"
},
{
"path": "stts/Services/Super/Apple.swift",
"chars": 647,
"preview": "//\n// Apple.swift\n// stts\n//\n\nimport Foundation\n\ntypealias Apple = BaseApple & RequiredServiceProperties & AppleStoreS"
},
{
"path": "stts/Services/Super/AppleDeveloper.swift",
"chars": 719,
"preview": "//\n// AppleDeveloper.swift\n// stts\n//\n\nimport Foundation\n\ntypealias AppleDeveloper = BaseAppleDeveloper & RequiredServ"
},
{
"path": "stts/Services/Super/AppleStore.swift",
"chars": 4082,
"preview": "//\n// AppleStore.swift\n// stts\n//\n\nimport Foundation\n\nprotocol AppleStoreService {\n var serviceName: String { get }"
},
{
"path": "stts/Services/Super/Azure.swift",
"chars": 550,
"preview": "//\n// Azure.swift\n// stts\n//\n\nimport Foundation\n\ntypealias Azure = BaseAzure & RequiredServiceProperties & AzureStoreS"
},
{
"path": "stts/Services/Super/AzureDevOps.swift",
"chars": 601,
"preview": "//\n// AzureDevOpsDevOps.swift\n// stts\n//\n\nimport Foundation\n\ntypealias AzureDevOps = BaseAzureDevOps & RequiredService"
},
{
"path": "stts/Services/Super/AzureDevOpsStore.swift",
"chars": 3343,
"preview": "//\n// AzureDevOpsStore.swift\n// stts\n//\n\nimport Foundation\nimport Kanna\n\nprotocol AzureDevOpsStoreService {\n var se"
},
{
"path": "stts/Services/Super/AzureStore.swift",
"chars": 2358,
"preview": "//\n// AzureStore.swift\n// stts\n//\n\nimport Foundation\nimport Kanna\n\nprotocol AzureStoreService {\n var name: String {"
},
{
"path": "stts/Services/Super/BetterStackService.swift",
"chars": 4013,
"preview": "//\n// BetterStackService.swift\n// stts\n//\n\nimport Foundation\nimport Kanna\n\nclass BetterStackServiceDefinition: Codable"
},
{
"path": "stts/Services/Super/BetterUptimeService.swift",
"chars": 3326,
"preview": "//\n// BetterUptimeService.swift\n// stts\n//\n\nimport Foundation\nimport Kanna\n\nclass BetterUptimeServiceDefinition: Codab"
},
{
"path": "stts/Services/Super/CStateService.swift",
"chars": 2491,
"preview": "//\n// CStateService.swift\n// stts\n//\n\nimport Foundation\n\nclass CStateServiceDefinition: CodableServiceDefinition, Serv"
},
{
"path": "stts/Services/Super/CachetService.swift",
"chars": 2260,
"preview": "//\n// CachetService.swift\n// stts\n//\n\nimport Foundation\n\nclass CachetServiceDefinition: CodableServiceDefinition, Serv"
},
{
"path": "stts/Services/Super/ExanaService.swift",
"chars": 3900,
"preview": "//\n// ExanaService.swift\n// stts\n//\n\nimport Foundation\nimport Kanna\n\nclass ExanaServiceDefinition: CodableServiceDefin"
},
{
"path": "stts/Services/Super/FirebaseService.swift",
"chars": 1193,
"preview": "//\n// Firebase.swift\n// stts\n//\n\nimport Foundation\n\ntypealias FirebaseService = BaseFirebaseService & RequiredServiceP"
},
{
"path": "stts/Services/Super/FirebaseStatusDashboardStore.swift",
"chars": 3222,
"preview": "//\n// FirebaseStatusDashboardStore.swift\n// stts\n//\n\nimport Foundation\nimport Kanna\n\nprotocol FirebaseStatusDashboardS"
},
{
"path": "stts/Services/Super/GoogleCloudPlatform.swift",
"chars": 741,
"preview": "//\n// GoogleCloudPlatform.swift\n// stts\n//\n\nimport Foundation\n\ntypealias GoogleCloudPlatform = BaseGoogleCloudPlatform"
},
{
"path": "stts/Services/Super/GoogleStatusDashboardStore.swift",
"chars": 3462,
"preview": "//\n// GoogleStatusDashboardStore.swift\n// stts\n//\n\nimport Foundation\nimport Kanna\n\nprotocol GoogleStatusDashboardStore"
},
{
"path": "stts/Services/Super/IncidentIOService.swift",
"chars": 3043,
"preview": "//\n// IncidentIOService.swift\n// stts\n//\n\nimport Foundation\nimport Kanna\n\nclass IncidentIOServiceDefinition: CodableSe"
},
{
"path": "stts/Services/Super/IndependentService.swift",
"chars": 2343,
"preview": "//\n// IndependentService.swift\n// stts\n//\n\nimport Foundation\n\nclass IndependentServiceDefinition: CodableServiceDefini"
},
{
"path": "stts/Services/Super/InstatusService.swift",
"chars": 6845,
"preview": "//\n// InstatusService.swift\n// stts\n//\n\nimport Foundation\nimport Kanna\n\nclass InstatusServiceDefinition: CodableServic"
},
{
"path": "stts/Services/Super/LambStatusService.swift",
"chars": 2126,
"preview": "//\n// LambStatusService.swift\n// stts\n//\n\nimport Foundation\n\nclass LambStatusServiceDefinition: CodableServiceDefiniti"
},
{
"path": "stts/Services/Super/MiroService.swift",
"chars": 235,
"preview": "//\n// MiroService.swift\n// stts\n//\n\nimport Foundation\n\nclass MiroServiceDefinition: IncidentIOServiceDefinition {\n "
},
{
"path": "stts/Services/Super/PagerDutyService.swift",
"chars": 4221,
"preview": "//\n// PagerDutyService.swift\n// stts\n//\n\nimport Foundation\nimport Kanna\n\ntypealias PagerDutyService = BasePagerDutySer"
},
{
"path": "stts/Services/Super/PayPal.swift",
"chars": 3715,
"preview": "//\n// PayPal.swift\n// stts\n//\n\nimport Foundation\n\ntypealias PayPal = BasePayPal & RequiredServiceProperties & Required"
},
{
"path": "stts/Services/Super/PlayStationNetwork.swift",
"chars": 2233,
"preview": "//\n// PlayStationNetwork.swift\n// stts\n//\n\nimport Foundation\n\ntypealias PlayStationNetwork = BasePlayStationNetwork & "
},
{
"path": "stts/Services/Super/Salesforce.swift",
"chars": 771,
"preview": "//\n// Salesforce.swift\n// Salesforce\n//\n\nimport Foundation\n\ntypealias Salesforce = BaseSalesforce & RequiredServicePro"
},
{
"path": "stts/Services/Super/SalesforceCategories.swift",
"chars": 3516,
"preview": "// This file is generated by generate_salesforce_services.swift and should not be modified manually.\n// swiftlint:disabl"
},
{
"path": "stts/Services/Super/SalesforceStore.swift",
"chars": 2959,
"preview": "//\n// SalesforceStore.swift\n// SalesforceStore\n//\n\nimport Foundation\n\nprotocol SalesforceStoreService {\n var key: S"
},
{
"path": "stts/Services/Super/SendbirdService.swift",
"chars": 262,
"preview": "//\n// SendbirdService.swift\n// SendbirdService\n//\n\nimport Foundation\n\nclass SendbirdServiceDefinition: StatusPageServi"
},
{
"path": "stts/Services/Super/Service.swift",
"chars": 5140,
"preview": "//\n// Service.swift\n// stts\n//\n\nimport Foundation\n\npublic enum ServiceStatus: Int, Comparable {\n case undetermined\n"
},
{
"path": "stts/Services/Super/ServiceStore.swift",
"chars": 1635,
"preview": "//\n// ServiceStore.swift\n// stts\n//\n\nimport Foundation\n\nprotocol InitializableState {\n init()\n}\n\nextension Dictiona"
},
{
"path": "stts/Services/Super/Site24x7Service.swift",
"chars": 6483,
"preview": "//\n// Site24x7Service.swift\n// stts\n//\n\nimport Foundation\n\nclass Site24x7ServiceDefinition: CodableServiceDefinition, "
},
{
"path": "stts/Services/Super/SorryService.swift",
"chars": 2555,
"preview": "//\n// SorryService.swift\n// stts\n//\n\nimport Foundation\n\nclass SorryServiceDefinition: CodableServiceDefinition, Servic"
},
{
"path": "stts/Services/Super/StatusCakeService.swift",
"chars": 2291,
"preview": "//\n// StatusCakeService.swift\n// stts\n//\n\nimport Foundation\n\nclass StatusCakeServiceDefinition: CodableServiceDefiniti"
},
{
"path": "stts/Services/Super/StatusCastService.swift",
"chars": 2083,
"preview": "//\n// StatusCastService.swift\n// stts\n//\n\nimport Foundation\nimport Kanna\n\nclass StatusCastServiceDefinition: CodableSe"
},
{
"path": "stts/Services/Super/StatusHubService.swift",
"chars": 2393,
"preview": "//\n// StatusHubService.swift\n// stts\n//\n\nimport Foundation\n\nclass StatusHubServiceDefinition: CodableServiceDefinition"
},
{
"path": "stts/Services/Super/StatusPageService.swift",
"chars": 6639,
"preview": "//\n// StatusPageService.swift\n// stts\n//\n\nimport Foundation\n\nclass StatusPageServiceDefinition: CodableServiceDefiniti"
},
{
"path": "stts/Services/Super/StatusioV1Service.swift",
"chars": 2649,
"preview": "//\n// StatusioV1Service.swift\n// stts\n//\n\nimport Foundation\n\nclass StatusioV1ServiceDefinition: CodableServiceDefiniti"
},
{
"path": "stts/Services/Super/StatuspalService.swift",
"chars": 2148,
"preview": "//\n// StatuspalService.swift\n// stts\n//\n\nimport Foundation\nimport Kanna\n\nclass StatuspalServiceDefinition: CodableServ"
},
{
"path": "stts/Services/Super/UptimeDotComService.swift",
"chars": 1048,
"preview": "//\n// UptimeDotComService.swift\n// stts\n//\n\nimport Foundation\n\ntypealias UptimeDotComService = BaseUptimeDotComService"
},
{
"path": "stts/Services/UptimeDotCom/JSDelivr.swift",
"chars": 178,
"preview": "//\n// JSDelivr.swift\n// stts\n//\n\nimport Foundation\n\nclass JSDelivr: UptimeDotComService {\n let name = \"jsDelivr\"\n "
},
{
"path": "stts/Services/UptimeDotCom/Recurly.swift",
"chars": 149,
"preview": "//\n// Recurly.swift\n// stts\n//\n\nimport Foundation\n\nclass Recurly: UptimeDotComService {\n let url = URL(string: \"htt"
},
{
"path": "stts/Services/UptimeDotCom/UptimeDotCom.swift",
"chars": 186,
"preview": "//\n// UptimeDotCom.swift\n// stts\n//\n\nimport Foundation\n\nclass UptimeDotCom: UptimeDotComService {\n let name = \"Upti"
},
{
"path": "stts/Services/Zendesk.swift",
"chars": 1422,
"preview": "//\n// Zendesk.swift\n// stts\n//\n\nimport Foundation\n\nprivate struct ZendeskIncidentsResponse: Codable {\n struct Incid"
},
{
"path": "stts/SwitchableTableViewController.swift",
"chars": 427,
"preview": "//\n// SwitchableTableViewController.swift\n// stts\n//\n\nimport Cocoa\n\nprotocol SwitchableTableViewController: AnyObject "
},
{
"path": "stts/stts.entitlements",
"chars": 295,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "stts.xcodeproj/project.pbxproj",
"chars": 101493,
"preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 54;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
},
{
"path": "stts.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
"chars": 135,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n version = \"1.0\">\n <FileRef\n location = \"self:\">\n </FileRef"
},
{
"path": "stts.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
"chars": 238,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "stts.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved",
"chars": 1191,
"preview": "{\n \"originHash\" : \"6757785d4818500b15e48de30606d42ef095eca4264e87c401b91dbf5cd6125b\",\n \"pins\" : [\n {\n \"identit"
},
{
"path": "stts.xcodeproj/xcshareddata/xcschemes/stts.xcscheme",
"chars": 3660,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n LastUpgradeVersion = \"2600\"\n version = \"1.3\">\n <BuildAction\n "
},
{
"path": "sttsTests/AdobeTests.swift",
"chars": 1215,
"preview": "//\n// AdobeTests.swift\n// sttsTests\n//\n\nimport XCTest\n@testable import stts\n\nfinal class AdobeTests: XCTestCase {\n "
},
{
"path": "sttsTests/BetterStackTests.swift",
"chars": 1565,
"preview": "//\n// BetterStackTests.swift\n// sttsTests\n//\n\nimport XCTest\n@testable import stts\n\nfinal class BetterStackTests: XCTes"
},
{
"path": "sttsTests/Helpers/TestBundle.swift",
"chars": 184,
"preview": "//\n// TestBundle.swift\n// sttsTests\n//\n\nimport Foundation\n\nprivate class TestBundle {}\n\nextension Bundle {\n static "
},
{
"path": "sttsTests/IncidentIOTests.swift",
"chars": 4283,
"preview": "//\n// IncidentIOTests.swift\n// sttsTests\n//\n\nimport XCTest\n@testable import stts\n\nfinal class IncidentIOTests: XCTestC"
},
{
"path": "sttsTests/Info.plist",
"chars": 701,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "sttsTests/InstatusTests.swift",
"chars": 2143,
"preview": "//\n// InstatusTests.swift\n// sttsTests\n//\n\nimport XCTest\n@testable import stts\n\nfinal class InstatusTests: XCTestCase "
},
{
"path": "sttsTests/MiroTests.swift",
"chars": 1315,
"preview": "//\n// MiroTests.swift\n// sttsTests\n//\n\nimport XCTest\n@testable import stts\n\nfinal class MiroTests: XCTestCase {\n pr"
},
{
"path": "sttsTests/Mocks/ResponseOverridingURLSession.swift",
"chars": 1594,
"preview": "//\n// ResponseOverridingURLSession.swift\n// sttsTests\n//\n\nimport Foundation\nimport stts\n\nfinal class ResponseOverridin"
},
{
"path": "sttsTests/Mocks/ResponseSizeTrackingURLSession.swift",
"chars": 902,
"preview": "//\n// ResponseSizeTrackingURLSession.swift\n// sttsTests\n//\n\nimport Foundation\nimport stts\n\nfinal class ResponseSizeTra"
},
{
"path": "sttsTests/PagerDutyTests.swift",
"chars": 1257,
"preview": "//\n// PagerDutyTests.swift\n// sttsTests\n//\n\nimport XCTest\n@testable import stts\n\nfinal class PagerDutyTests: XCTestCas"
},
{
"path": "sttsTests/Resources/aiven-minor.html",
"chars": 113422,
"preview": "<!DOCTYPE html><html lang=\"en\" class=\"inter_48f560a7-module__FmDrPW__className h-full\"><head><meta charSet=\"utf-8\"/><met"
},
{
"path": "sttsTests/Resources/buildjet-good.html",
"chars": 64271,
"preview": "<!DOCTYPE html>\n<html class='h-full light' lang='en' prefix='og: https://ogp.me/ns#'>\n<head>\n<meta content='text/html; c"
},
{
"path": "sttsTests/Resources/eyloo-major.html",
"chars": 99011,
"preview": "<!DOCTYPE html>\n<html class='h-full light' lang='en' prefix='og: https://ogp.me/ns#'>\n<head>\n<meta content='text/html; c"
},
{
"path": "sttsTests/Resources/linear-good.html",
"chars": 232566,
"preview": "<!DOCTYPE html><html lang=\"en\" class=\"inter_48f560a7-module__FmDrPW__className h-full dark\"><head><meta charSet=\"utf-8\"/"
},
{
"path": "sttsTests/Resources/mastodonsocial-major.html",
"chars": 246648,
"preview": "<!DOCTYPE html><html lang=\"en\"><head><meta charSet=\"utf-8\"/><meta name=\"viewport\" content=\"width=device-width, initial-s"
},
{
"path": "sttsTests/Resources/miro-good.html",
"chars": 64581,
"preview": "<!DOCTYPE html><html lang=\"en\" class=\"inter_48f560a7-module__FmDrPW__className h-full\"><head><meta charSet=\"utf-8\"/><met"
},
{
"path": "sttsTests/Resources/miro-issue.html",
"chars": 64581,
"preview": "<!DOCTYPE html><html lang=\"en\" class=\"inter_48f560a7-module__FmDrPW__className h-full\"><head><meta charSet=\"utf-8\"/><met"
},
{
"path": "sttsTests/Resources/openai-major.html",
"chars": 255029,
"preview": "<!DOCTYPE html><html lang=\"en\" class=\"inter_48f560a7-module__FmDrPW__className h-full\"><head><meta charSet=\"utf-8\"/><met"
},
{
"path": "sttsTests/Resources/pagerduty-good.html",
"chars": 464952,
"preview": "\n<!DOCTYPE html>\n<html>\n <head>\n <meta charset=\"utf-8\">\n <!-- TODO set title -->\n <title>Status "
},
{
"path": "sttsTests/Resources/pagerduty-minor.html",
"chars": 467397,
"preview": "\n<!DOCTYPE html>\n<html>\n <head>\n <meta charset=\"utf-8\">\n <!-- TODO set title -->\n <title>Status "
},
{
"path": "sttsTests/Resources/rollbar-good.html",
"chars": 283577,
"preview": "<!DOCTYPE html><html lang=\"en\" class=\"inter_48f560a7-module__FmDrPW__className h-full\"><head><meta charSet=\"utf-8\"/><met"
},
{
"path": "sttsTests/Resources/whereby-good.html",
"chars": 154895,
"preview": "<!DOCTYPE html><html lang=\"en\"><head><meta charSet=\"utf-8\"/><meta name=\"viewport\" content=\"width=device-width, initial-s"
},
{
"path": "sttsTests/StringExtensionsTests.swift",
"chars": 1972,
"preview": "//\n// StringExtensionsTests.swift\n// sttsTests\n//\n\nimport XCTest\n@testable import stts\n\nclass StringExtensionsTests: X"
},
{
"path": "sttsTests/sttsTests.swift",
"chars": 2802,
"preview": "//\n// sttsTests.swift\n// sttsTests\n//\n\nimport XCTest\n@testable import stts\n\nclass SttsTests: XCTestCase {\n override"
}
]
// ... and 1 more files (download for full content)
About this extraction
This page contains the full source code of the inket/stts GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 167 files (17.1 MB), approximately 911.6k tokens, and a symbol index with 13 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.