Openstatus www.openstatus.dev

chore: report template content (#1801)

* chore: report template content

* fix: metadata base path

authored by

Maximilian Kaske and committed by
GitHub
2175ea78 4e1b9eeb

+1736 -36
+5 -2
apps/web/src/app/(landing)/blog/[slug]/page.tsx
··· 29 29 return; 30 30 } 31 31 32 - const metadata = getPageMetadata(post); 32 + const metadata = getPageMetadata(post, "blog"); 33 33 34 34 return metadata; 35 35 } ··· 53 53 notFound(); 54 54 } 55 55 56 - const jsonLDBlog: WithContext<BlogPosting> = getJsonLDBlogPosting(post); 56 + const jsonLDBlog: WithContext<BlogPosting> = getJsonLDBlogPosting( 57 + post, 58 + "blog", 59 + ); 57 60 58 61 return ( 59 62 <section className="prose dark:prose-invert max-w-none">
+1 -1
apps/web/src/app/(landing)/blog/category/[slug]/page.tsx
··· 9 9 import type { Metadata } from "next"; 10 10 11 11 const TITLE = "Blog Category"; 12 - const DESCRIPTION = "All the latest articles and news from OpenStatus."; 12 + const DESCRIPTION = "All the latest articles and news from openstatus."; 13 13 14 14 export const metadata: Metadata = { 15 15 ...defaultMetadata,
+1 -1
apps/web/src/app/(landing)/blog/page.tsx
··· 7 7 import { ContentList } from "../content-list"; 8 8 9 9 const TITLE = "Blog"; 10 - const DESCRIPTION = "All the latest articles and news from OpenStatus."; 10 + const DESCRIPTION = "All the latest articles and news from openstatus."; 11 11 12 12 export const metadata: Metadata = { 13 13 ...defaultMetadata,
+9 -24
apps/web/src/app/(landing)/changelog/[slug]/page.tsx
··· 1 - import { getPageMetadata } from "@/app/shared-metadata"; 1 + import { getJsonLDBlogPosting, getPageMetadata } from "@/app/shared-metadata"; 2 2 import { CustomMDX } from "@/content/mdx"; 3 3 import { formatDate, getChangelogPosts } from "@/content/utils"; 4 4 import type { Metadata } from "next"; 5 5 import Image from "next/image"; 6 6 import { notFound } from "next/navigation"; 7 + import type { BlogPosting, WithContext } from "schema-dts"; 7 8 import { ContentPagination } from "../../content-pagination"; 8 - 9 - const baseUrl = "http://localhost:3000"; 10 9 11 10 export const dynamicParams = false; 12 11 ··· 29 28 return; 30 29 } 31 30 32 - const metadata = getPageMetadata(post); 31 + const metadata = getPageMetadata(post, "changelog"); 33 32 34 33 return metadata; 35 34 } ··· 53 52 notFound(); 54 53 } 55 54 55 + const jsonLDBlog: WithContext<BlogPosting> = getJsonLDBlogPosting( 56 + post, 57 + "changelog", 58 + ); 59 + 56 60 return ( 57 61 <section className="prose dark:prose-invert max-w-none"> 58 62 <script ··· 60 64 suppressHydrationWarning 61 65 // biome-ignore lint/security/noDangerouslySetInnerHtml: <explanation> 62 66 dangerouslySetInnerHTML={{ 63 - __html: JSON.stringify({ 64 - "@context": "https://schema.org", 65 - "@type": "BlogPosting", 66 - headline: post.metadata.title, 67 - datePublished: post.metadata.publishedAt, 68 - dateModified: post.metadata.publishedAt, 69 - description: post.metadata.description, 70 - image: post.metadata.image 71 - ? `${baseUrl}${post.metadata.image}` 72 - : `/api/og?title=${encodeURIComponent( 73 - post.metadata.title, 74 - )}&description=${encodeURIComponent( 75 - post.metadata.description, 76 - )}&category=${encodeURIComponent(post.metadata.category)}`, 77 - url: `${baseUrl}/changelog/${post.slug}`, 78 - author: { 79 - "@type": "Person", 80 - name: post.metadata.author, 81 - }, 82 - }), 67 + __html: JSON.stringify(jsonLDBlog).replace(/</g, "\\u003c"), 83 68 }} 84 69 /> 85 70 <h1>{post.metadata.title}</h1>
+1 -1
apps/web/src/app/(landing)/changelog/category/[slug]/page.tsx
··· 9 9 import type { Metadata } from "next"; 10 10 11 11 const TITLE = "Changelog Category"; 12 - const DESCRIPTION = "All the latest changes and updates to OpenStatus."; 12 + const DESCRIPTION = "All the latest changes and updates to openstatus."; 13 13 14 14 export const metadata: Metadata = { 15 15 ...defaultMetadata,
+1 -1
apps/web/src/app/(landing)/changelog/page.tsx
··· 7 7 import { ContentList } from "../content-list"; 8 8 9 9 const TITLE = "Changelog"; 10 - const DESCRIPTION = "All the latest changes and updates to OpenStatus."; 10 + const DESCRIPTION = "All the latest changes and updates to openstatus."; 11 11 12 12 export const metadata: Metadata = { 13 13 ...defaultMetadata,
+107
apps/web/src/app/(landing)/report-template/[slug]/page.tsx
··· 1 + import { getJsonLDBlogPosting, getPageMetadata } from "@/app/shared-metadata"; 2 + import { CustomMDX } from "@/content/mdx"; 3 + import { formatDate, getReportTemplates } from "@/content/utils"; 4 + import { getAuthor } from "@/data/author"; 5 + import type { Metadata } from "next"; 6 + import Image from "next/image"; 7 + import { notFound } from "next/navigation"; 8 + import type { BlogPosting, WithContext } from "schema-dts"; 9 + import { ContentPagination } from "../../content-pagination"; 10 + 11 + export const dynamicParams = false; 12 + 13 + export async function generateStaticParams() { 14 + const posts = getReportTemplates(); 15 + 16 + return posts.map((post) => ({ 17 + slug: post.slug, 18 + })); 19 + } 20 + 21 + export async function generateMetadata({ 22 + params, 23 + }: { 24 + params: Promise<{ slug: string }>; 25 + }): Promise<Metadata | undefined> { 26 + const { slug } = await params; 27 + const post = getReportTemplates().find((post) => post.slug === slug); 28 + if (!post) { 29 + return; 30 + } 31 + 32 + const metadata = getPageMetadata(post, "report-template"); 33 + 34 + return metadata; 35 + } 36 + 37 + export default async function ReportTemplate({ 38 + params, 39 + }: { 40 + params: Promise<{ slug: string }>; 41 + }) { 42 + const { slug } = await params; 43 + const posts = getReportTemplates().sort( 44 + (a, b) => 45 + b.metadata.publishedAt.getTime() - a.metadata.publishedAt.getTime(), 46 + ); 47 + const postIndex = posts.findIndex((post) => post.slug === slug); 48 + const post = posts[postIndex]; 49 + const previousPost = posts[postIndex - 1]; 50 + const nextPost = posts[postIndex + 1]; 51 + 52 + if (!post) { 53 + notFound(); 54 + } 55 + 56 + const jsonLDBlog: WithContext<BlogPosting> = getJsonLDBlogPosting( 57 + post, 58 + "report-template", 59 + ); 60 + 61 + return ( 62 + <section className="prose dark:prose-invert max-w-none"> 63 + <script 64 + type="application/ld+json" 65 + suppressHydrationWarning 66 + // biome-ignore lint/security/noDangerouslySetInnerHtml: <explanation> 67 + dangerouslySetInnerHTML={{ 68 + __html: JSON.stringify(jsonLDBlog).replace(/</g, "\\u003c"), 69 + }} 70 + /> 71 + <h1>{post.metadata.title}</h1> 72 + <p className="flex items-center gap-2.5 divide-x divide-border text-muted-foreground"> 73 + {formatDate(post.metadata.publishedAt)} | by{" "} 74 + <Author author={post.metadata.author} /> | [{post.metadata.category}] 75 + </p> 76 + {post.metadata.image ? ( 77 + <div className="relative aspect-video w-full overflow-hidden border border-border"> 78 + <Image 79 + src={post.metadata.image} 80 + alt={post.metadata.title} 81 + fill 82 + className="object-contain" 83 + /> 84 + </div> 85 + ) : null} 86 + <CustomMDX source={post.content} /> 87 + <ContentPagination 88 + previousPost={previousPost} 89 + nextPost={nextPost} 90 + prefix="/report-template" 91 + /> 92 + </section> 93 + ); 94 + } 95 + 96 + function Author({ author }: { author: string }) { 97 + const authorData = getAuthor(author); 98 + if (typeof authorData === "string") { 99 + return author; 100 + } 101 + 102 + return ( 103 + <a href={authorData.url} target="_blank" rel="noopener noreferrer"> 104 + {authorData.name} 105 + </a> 106 + ); 107 + }
+60
apps/web/src/app/(landing)/report-template/category/[slug]/page.tsx
··· 1 + import { ContentCategory } from "@/app/(landing)/content-category"; 2 + import { ContentList } from "@/app/(landing)/content-list"; 3 + import { 4 + defaultMetadata, 5 + ogMetadata, 6 + twitterMetadata, 7 + } from "@/app/shared-metadata"; 8 + import { getReportTemplates } from "@/content/utils"; 9 + import type { Metadata } from "next"; 10 + 11 + const TITLE = "Report Template Category"; 12 + const DESCRIPTION = "All the latest templates from openstatus."; 13 + 14 + export const metadata: Metadata = { 15 + ...defaultMetadata, 16 + title: TITLE, 17 + description: DESCRIPTION, 18 + openGraph: { 19 + ...ogMetadata, 20 + title: TITLE, 21 + description: DESCRIPTION, 22 + }, 23 + twitter: { 24 + ...twitterMetadata, 25 + title: TITLE, 26 + description: DESCRIPTION, 27 + images: [`/api/og?title=${TITLE}&description=${DESCRIPTION}`], 28 + }, 29 + }; 30 + 31 + export const dynamicParams = false; 32 + 33 + export async function generateStaticParams() { 34 + const posts = getReportTemplates(); 35 + const categories = [...new Set(posts.map((post) => post.metadata.category))]; 36 + 37 + return categories.map((category) => ({ 38 + slug: category.toLowerCase(), 39 + })); 40 + } 41 + 42 + export default async function ReportTemplateCategoryPage({ 43 + params, 44 + }: { 45 + params: Promise<{ slug: string }>; 46 + }) { 47 + const { slug } = await params; 48 + const allReportTemplates = getReportTemplates(); 49 + const filteredReportTemplates = allReportTemplates.filter( 50 + (post) => post.metadata.category.toLowerCase() === slug.toLowerCase(), 51 + ); 52 + 53 + return ( 54 + <div className="prose dark:prose-invert max-w-none"> 55 + <h1 className="capitalize">Report Template | {slug}</h1> 56 + <ContentCategory data={allReportTemplates} prefix="/report-template" /> 57 + <ContentList data={filteredReportTemplates} prefix="/report-template" /> 58 + </div> 59 + ); 60 + }
+41
apps/web/src/app/(landing)/report-template/page.tsx
··· 1 + import { defaultMetadata, ogMetadata } from "@/app/shared-metadata"; 2 + import { twitterMetadata } from "@/app/shared-metadata"; 3 + import { getReportTemplates } from "@/content/utils"; 4 + import type { Metadata } from "next"; 5 + import { ContentCategory } from "../content-category"; 6 + import { ContentList } from "../content-list"; 7 + 8 + const TITLE = "Report Template"; 9 + const DESCRIPTION = "All the latest templates from openstatus."; 10 + 11 + export const metadata: Metadata = { 12 + ...defaultMetadata, 13 + title: TITLE, 14 + description: DESCRIPTION, 15 + openGraph: { 16 + ...ogMetadata, 17 + title: TITLE, 18 + description: DESCRIPTION, 19 + }, 20 + twitter: { 21 + ...twitterMetadata, 22 + title: TITLE, 23 + description: DESCRIPTION, 24 + images: [`/api/og?title=${TITLE}&description=${DESCRIPTION}`], 25 + }, 26 + }; 27 + 28 + export default function ReportTemplateListPage() { 29 + const allReportTemplates = getReportTemplates(); 30 + return ( 31 + <div className="prose dark:prose-invert max-w-none"> 32 + <h1>Report Templates</h1> 33 + <ContentCategory data={allReportTemplates} prefix="/report-template" /> 34 + <ContentList 35 + data={allReportTemplates} 36 + prefix="/report-template" 37 + withCategory 38 + /> 39 + </div> 40 + ); 41 + }
+8 -3
apps/web/src/app/shared-metadata.ts
··· 46 46 openGraph: ogMetadata, 47 47 }; 48 48 49 - export const getPageMetadata = (page: MDXData): Metadata => { 49 + export const getPageMetadata = (page: MDXData, basePath?: string): Metadata => { 50 50 const { slug, metadata } = page; 51 51 const { title, description, category, publishedAt } = metadata; 52 52 ··· 55 55 )}&description=${encodeURIComponent( 56 56 description, 57 57 )}&category=${encodeURIComponent(category)}`; 58 + 59 + const url = basePath 60 + ? `${BASE_URL}/${basePath}/${slug}` 61 + : `${BASE_URL}/${slug}`; 58 62 59 63 return { 60 64 title, ··· 64 68 description, 65 69 type: "article", 66 70 publishedTime: publishedAt.toISOString(), 67 - url: `${BASE_URL}/changelog/${slug}`, 71 + url, 68 72 images: [ 69 73 { 70 74 url: ogImage, ··· 95 99 96 100 export const getJsonLDBlogPosting = ( 97 101 post: MDXData, 102 + basePath: string, 98 103 ): WithContext<BlogPosting> => { 99 104 return { 100 105 "@context": "https://schema.org", ··· 110 115 )}&description=${encodeURIComponent( 111 116 post.metadata.description, 112 117 )}&category=${encodeURIComponent(post.metadata.category)}`, 113 - url: `${BASE_URL}/blog/${post.slug}`, 118 + url: `${BASE_URL}/${basePath}/${post.slug}`, 114 119 author: { 115 120 "@type": "Person", 116 121 name: post.metadata.author,
+8 -2
apps/web/src/content/copy-button.tsx
··· 7 7 export function CopyButton({ 8 8 className, 9 9 copyText, 10 + buttonText = "copy", 11 + copiedText = "copied", 10 12 ...props 11 - }: React.ComponentProps<typeof Button> & { copyText: string }) { 13 + }: React.ComponentProps<typeof Button> & { 14 + copyText: string; 15 + buttonText?: string; 16 + copiedText?: string; 17 + }) { 12 18 const { copy, isCopied } = useCopyToClipboard(); 13 19 14 20 return ( ··· 19 25 onClick={() => copy(copyText, { withToast: true })} 20 26 {...props} 21 27 > 22 - {isCopied ? "[link copied]" : "[copy link]"} 28 + {isCopied ? `[${copiedText}]` : `[${buttonText}]`} 23 29 </Button> 24 30 ); 25 31 }
+76
apps/web/src/content/pages/report-template/api-service-disruption.mdx
··· 1 + --- 2 + title: "API Service Disruption Template" 3 + description: "Professional template for communicating API outages and third-party service failures to your users." 4 + author: "OpenStatus" 5 + publishedAt: "2026-01-19" 6 + category: "infrastructure" 7 + --- 8 + 9 + Use this template when your API or third-party service provider is experiencing issues. Based on real-world examples from companies like Vercel, Stripe, and GitHub. 10 + 11 + ## When to Use This Template 12 + 13 + - Third-party API failures 14 + - Elevated API error rates 15 + - Service provider outages 16 + - Integration connectivity issues 17 + 18 + ## Template Messages 19 + 20 + ### Investigating 21 + 22 + We are currently experiencing issues with our third-party API provider. Our team is actively investigating and working with the provider to restore normal service. 23 + 24 + We apologize for the inconvenience and will provide updates as we learn more. 25 + 26 + ### Identified 27 + 28 + We have confirmed the issue is with our third-party provider's infrastructure. They are working on a fix and we are monitoring their progress. 29 + 30 + ### Monitoring 31 + 32 + A fix has been deployed. We are monitoring service health and will confirm full restoration shortly. 33 + 34 + ### Resolved 35 + 36 + The service has been fully restored. All API operations are back to normal. We apologize for the disruption. 37 + 38 + ## Real-World Examples 39 + 40 + ### Vercel: "Elevated error rates across new deployments and Vercel API" 41 + 42 + **Context**: Build failures and deployment issues affecting multiple systems 43 + **Duration**: ~32 minutes 44 + **Impact**: New deployments and API calls 45 + 46 + This incident title demonstrates clear scope communication - users immediately understood both the severity ("elevated error rates") and which systems were affected. 47 + 48 + ### GitHub: "Configuration error during a model update" 49 + 50 + **Context**: Copilot service degradation 51 + **Duration**: ~1.5 hours 52 + **Impact**: 18% average error rate, peaking at 100% 53 + 54 + GitHub's approach included specific metrics and root cause transparency, helping technical users understand the scope and nature of the issue. 55 + 56 + ### Stripe: Payment Method Maintenance 57 + 58 + **Context**: Scheduled maintenance for payment providers 59 + **Approach**: Proactive communication with disclaimers about third-party information 60 + 61 + Stripe consistently provides context about the source of information and sets clear expectations about accuracy. 62 + 63 + ## Tips for Using This Template 64 + 65 + 1. **Be specific about the provider** if you can share that information 66 + 2. **Include timeframes** when you have them (e.g., "Expected resolution: 30 minutes") 67 + 3. **Add metrics** if you're comfortable sharing them (e.g., "affecting 5% of requests") 68 + 4. **Acknowledge impact** - users appreciate transparency about what's affected 69 + 5. **Follow up after resolution** with any lessons learned or preventative measures 70 + 71 + ## Customization Ideas 72 + 73 + - Add your specific API names (e.g., "Payment API" instead of generic "API") 74 + - Include workaround instructions if available 75 + - Link to status dashboard or real-time monitoring 76 + - Add contact information for urgent support needs
+101
apps/web/src/content/pages/report-template/database-performance-degradation.mdx
··· 1 + --- 2 + title: "Database Performance Degradation Template" 3 + description: "Technical template for communicating database latency and performance issues to your engineering-focused audience." 4 + author: "OpenStatus" 5 + publishedAt: "2026-01-19" 6 + category: "performance" 7 + --- 8 + 9 + Use this template when experiencing database performance issues, elevated latency, or query slowdowns. Ideal for engineering teams and technical stakeholders. 10 + 11 + ## When to Use This Template 12 + 13 + - Elevated database latency 14 + - Slow query performance 15 + - Connection pool exhaustion 16 + - Database infrastructure issues 17 + 18 + ## Template Messages 19 + 20 + ### Investigating 21 + 22 + We are experiencing elevated database latency affecting some features. Users may experience slower response times. 23 + 24 + Our database team is actively investigating and working to restore normal performance levels. 25 + 26 + ### Identified 27 + 28 + We have identified the root cause. Our team is implementing a fix. 29 + 30 + ### Monitoring 31 + 32 + Database performance improvements have been deployed. Latency is returning to normal levels. We are continuing to monitor. 33 + 34 + ### Resolved 35 + 36 + Database performance has been fully restored. All queries are executing at normal speeds. 37 + 38 + ## Real-World Examples 39 + 40 + ### GitHub: "Infrastructure update to data stores" 41 + 42 + **Context**: Data store infrastructure changes 43 + **Duration**: ~1.5 hours 44 + **Impact**: 1.8% combined failure rate, peaking at 10% 45 + 46 + **What they did well**: 47 + - Quantified impact with specific percentages 48 + - Identified multiple affected services 49 + - Committed to post-incident RCA (Root Cause Analysis) 50 + - Provided precise UTC timestamps 51 + 52 + **Sample messaging**: "Infrastructure update to data stores caused 1.8% combined failure rate, peaking at 10% across multiple services Jan 15, 16:40-18:20 UTC." 53 + 54 + ### Fly.io: "Network instability in IAD region" 55 + 56 + **Context**: Regional infrastructure issue 57 + **Approach**: Geographic specificity 58 + 59 + **What they did well**: 60 + - Identified specific region (IAD = Ashburn, Virginia) 61 + - Focused on infrastructure layer 62 + - Technical but clear naming 63 + 64 + This demonstrates the value of being specific about location when database issues are region-specific. 65 + 66 + ## Tips for Technical Communication 67 + 68 + 1. **Include specific metrics** when you have them (p95 latency, error rates, query times) 69 + 2. **Name the layer** - application, database, network, storage 70 + 3. **Be technical if your audience is technical** - don't oversimplify for engineers 71 + 4. **Quantify impact** - "affecting 2% of queries" is better than "some users" 72 + 5. **Share root cause** when resolved - technical teams appreciate learning 73 + 74 + ## Customization Ideas 75 + 76 + For **developer audiences**: 77 + ``` 78 + We are experiencing elevated p95 latency (2.5s vs normal 150ms) 79 + on write operations to our primary PostgreSQL cluster. 80 + 81 + Root cause: Connection pool exhaustion due to long-running 82 + transactions from the reporting service. 83 + 84 + Mitigation: Killed long-running queries, increased pool size 85 + from 100 to 150 connections, added query timeouts. 86 + ``` 87 + 88 + For **general users**: 89 + ``` 90 + We are experiencing slower than normal response times for some 91 + features. Our team is working to resolve this quickly. 92 + ``` 93 + 94 + ## Warning Signs to Monitor 95 + 96 + Watch for these indicators that might trigger using this template: 97 + - P95 latency > 2x normal 98 + - Error rate > 1% 99 + - Connection timeouts 100 + - User reports of slowness 101 + - Database monitoring alerts
+137
apps/web/src/content/pages/report-template/deployment-rollback.mdx
··· 1 + --- 2 + title: "Deployment Rollback Template" 3 + description: "Template for communicating deployment failures and rollback procedures during service disruptions." 4 + author: "OpenStatus" 5 + publishedAt: "2026-01-19" 6 + category: "deployment" 7 + --- 8 + 9 + Use this template when a deployment causes issues and requires rolling back to a previous version. Communicates the issue, mitigation, and resolution clearly. 10 + 11 + ## When to Use This Template 12 + 13 + - Deployment causes service errors 14 + - New release breaking existing functionality 15 + - Configuration changes causing issues 16 + - Need to roll back to previous version 17 + 18 + ## Template Messages 19 + 20 + ### Investigating 21 + 22 + We encountered an issue during a scheduled deployment and have initiated a rollback to restore service stability. 23 + 24 + We apologize for the disruption and are working to complete the rollback as quickly as possible. 25 + 26 + ### Identified 27 + 28 + The deployment issue has been identified. We are completing the rollback to the previous stable version. 29 + 30 + ### Monitoring 31 + 32 + The rollback has been completed successfully. We are monitoring system stability to ensure all services are functioning normally. 33 + 34 + ### Resolved 35 + 36 + All services have been restored to normal operation. The deployment issue has been resolved and we will investigate the root cause. 37 + 38 + ## Real-World Examples 39 + 40 + ### Vercel: "Elevated error rates across new deployments" 41 + 42 + **Context**: Build system changes affecting deployments 43 + **Duration**: ~32 minutes 44 + **Impact**: New deployments and builds failing 45 + 46 + **Communication approach**: 47 + - Clear about what was affected ("new deployments") 48 + - Specific about the problem ("elevated error rates") 49 + - Quick resolution time communicated 50 + 51 + ### GitHub: "Configuration error during a model update" 52 + 53 + **Context**: Copilot model deployment issue 54 + **Duration**: ~1.5 hours 55 + **Impact**: 18% error rate on average, spiking to 100% 56 + 57 + **What worked**: 58 + - Transparent about the cause ("configuration error") 59 + - Quantified impact (error rates) 60 + - Showed progression: investigation → rollback → recovery monitoring 61 + - Committed to improvement 62 + 63 + **Sample update progression**: 64 + 1. "We're investigating reports of Copilot failures" 65 + 2. "Configuration error identified during model update. Rolling back." 66 + 3. "Rollback complete. Monitoring for full recovery." 67 + 4. "Fully resolved. Error rates back to normal. RCA in progress." 68 + 69 + ## Best Practices 70 + 71 + ### During Rollback 72 + 73 + **Do**: 74 + - ✅ Announce the rollback immediately 75 + - ✅ Set expectations on timeline if known 76 + - ✅ Acknowledge the user impact 77 + - ✅ Monitor closely during rollback 78 + 79 + **Don't**: 80 + - ❌ Wait until rollback is complete to communicate 81 + - ❌ Over-promise on fix timing 82 + - ❌ Skip the post-incident analysis 83 + 84 + ### After Resolution 85 + 86 + Always include: 87 + 1. Confirmation that rollback succeeded 88 + 2. Current system status 89 + 3. Next steps (investigation, new deployment plan) 90 + 4. Preventative measures (if ready to share) 91 + 92 + ## Communication Patterns 93 + 94 + ### For User-Facing Services 95 + 96 + ``` 97 + We've rolled back a deployment that was causing issues with [feature]. 98 + Service is now restored. We're investigating to prevent this in the future. 99 + ``` 100 + 101 + ### For API Services 102 + 103 + ``` 104 + A recent deployment caused elevated error rates in our API. 105 + We've rolled back to the previous version and error rates 106 + have returned to normal. All endpoints are functioning correctly. 107 + ``` 108 + 109 + ### For Internal Tools 110 + 111 + ``` 112 + Deployment to production caused issues with [system]. Rolled back 113 + to previous version. Services restored. Post-mortem scheduled for 114 + tomorrow to identify root cause and improve deployment process. 115 + ``` 116 + 117 + ## Preventative Context 118 + 119 + After resolution, consider adding context about prevention: 120 + 121 + > "We're improving our deployment process to catch issues like this 122 + > before they reach production. This includes enhanced pre-deployment 123 + > testing and gradual rollout procedures." 124 + 125 + ## Timing Guidance 126 + 127 + - **0-5 minutes**: Initial notification of issue and rollback decision 128 + - **5-20 minutes**: Rollback in progress updates 129 + - **20-30 minutes**: Rollback complete, monitoring 130 + - **30-60 minutes**: Confirmed resolution 131 + - **24 hours later**: Root cause analysis summary (optional) 132 + 133 + ## Related Templates 134 + 135 + - Use **API Service Disruption** if rollback affects external integrations 136 + - Use **Database Performance** if rollback impacts database operations 137 + - Use **Security Incident** if deployment exposed security issues
+357
apps/web/src/content/pages/report-template/feature-degradation.mdx
··· 1 + --- 2 + title: "Feature Degradation Template" 3 + description: "Template for communicating partial service degradation where some features are impacted but the service remains available." 4 + author: "OpenStatus" 5 + publishedAt: "2026-01-19" 6 + category: "performance" 7 + --- 8 + 9 + Use this template when specific features are degraded or unavailable, but the core service remains operational. Helps users understand what's working and what isn't. 10 + 11 + ## When to Use This Template 12 + 13 + - Specific feature experiencing errors 14 + - Elevated latency for particular operations 15 + - Partial functionality unavailable 16 + - Non-critical systems impaired 17 + 18 + ## Template Messages 19 + 20 + ### Investigating 21 + 22 + We are experiencing issues with [Feature Name]. The core service remains available, but this specific feature may not work as expected. 23 + 24 + Our team is actively investigating and working to restore full functionality. 25 + 26 + ### Identified 27 + 28 + We have identified the cause of the [Feature Name] degradation. Our team is implementing a fix. 29 + 30 + ### Monitoring 31 + 32 + [Feature Name] has been restored. We are monitoring to ensure stable operation. 33 + 34 + ### Resolved 35 + 36 + [Feature Name] is now fully operational. All features are working normally. 37 + 38 + ## Real-World Examples 39 + 40 + ### Notion: "Operations such as duplicate a page or move a block" 41 + 42 + **Context**: Specific operations failing while rest of service worked 43 + **Duration**: ~4 hours 44 + **Impact**: Users could read/edit but not duplicate or move content 45 + 46 + **What worked**: 47 + - Specific about which operations were affected 48 + - Clear that core functionality (reading, editing) still worked 49 + - Precise timestamps in user's timezone (PST) 50 + 51 + **Sample progression**: 52 + ``` 53 + 12:10pm PST - Investigating 54 + "We are experiencing an incident that affects operations such as 55 + duplicate a page or move a block." 56 + 57 + 2:30pm PST - Identified 58 + "We've identified the issue and are implementing a fix. Most 59 + operations continue to work normally." 60 + 61 + 4:09pm PST - Resolved 62 + "All operations have been restored. The issue has been fully resolved." 63 + ``` 64 + 65 + ### Notion: "Exporting pages remains in a loading state" 66 + 67 + **Context**: Export feature stuck, but rest of service worked 68 + **Approach**: Clear about single feature impact 69 + 70 + **Why it worked**: 71 + - Users knew exactly what was broken 72 + - Clear that it wasn't a full outage 73 + - No operational downtime reported for core features 74 + 75 + ### GitHub: "Some models missing in Copilot" 76 + 77 + **Context**: Specific AI models unavailable 78 + **Duration**: ~2.5 hours 79 + **Impact**: Claude Opus 4.5 and GPT-5.2 inaccessible; other models worked 80 + 81 + **Communication breakdown**: 82 + ``` 83 + Investigating: 84 + "Some users unable to access premium AI models in GitHub Copilot" 85 + 86 + Identified: 87 + "Misconfiguration marking Claude Opus 4.5 and GPT-5.2 as inaccessible. 88 + Other models functioning normally. Deploying configuration fix." 89 + 90 + Resolved: 91 + "All models now accessible. Configuration has been corrected and 92 + validated across all regions." 93 + ``` 94 + 95 + **Why it worked**: 96 + - Specific model names (users could check if they were affected) 97 + - Clear that other models still worked 98 + - Technical but not overly complex 99 + 100 + ## Clear Scope Communication 101 + 102 + ### ✅ Good Examples 103 + 104 + **Specific and clear**: 105 + ``` 106 + The file upload feature is currently unavailable. All other features, 107 + including viewing, editing, and sharing, are working normally. 108 + ``` 109 + 110 + **With workaround**: 111 + ``` 112 + Export functionality is temporarily degraded. Exports may take 2-3x 113 + longer than usual. Viewing and editing are unaffected. 114 + 115 + Workaround: For faster exports, try exporting smaller sections 116 + individually. 117 + ``` 118 + 119 + **With context**: 120 + ``` 121 + Search is experiencing elevated latency (5-10 seconds vs normal <1s). 122 + We're working on a fix. All other features operating normally. 123 + ``` 124 + 125 + ### ❌ Vague Examples 126 + 127 + ``` 128 + "Some features might not work" 129 + "Experiencing issues" 130 + "Partial service degradation" 131 + "Some users affected" 132 + ``` 133 + 134 + ## Feature Impact Matrix 135 + 136 + Help users quickly understand what works and what doesn't: 137 + 138 + ### Example 1: Export Feature Down 139 + ``` 140 + Current Status: 141 + 142 + Working: 143 + ✓ View documents 144 + ✓ Edit documents 145 + ✓ Share with team 146 + ✓ Comments and collaboration 147 + ✓ Search 148 + 149 + Not Working: 150 + ✗ PDF export 151 + ✗ CSV download 152 + ✗ Bulk export 153 + 154 + We're working to restore export functionality. 155 + ``` 156 + 157 + ### Example 2: Upload Feature Degraded 158 + ``` 159 + Current Status: 160 + 161 + Working Normally: 162 + ✓ View files 163 + ✓ Download files 164 + ✓ Share links 165 + ✓ Delete files 166 + 167 + Degraded: 168 + ⚠️ File uploads (50% success rate, retrying usually works) 169 + ⚠️ Drag-and-drop (use upload button instead) 170 + 171 + We're investigating the upload issues. 172 + ``` 173 + 174 + ## Communication by Feature Type 175 + 176 + ### Core Features Degraded 177 + 178 + When important features fail, be very clear about impact: 179 + 180 + ``` 181 + 🔴 Payment Processing Degraded 182 + 183 + Impact: High - payments may fail or experience delays 184 + 185 + Status: We're experiencing elevated error rates (10%) on payment 186 + processing. Most transactions are succeeding, but some may fail. 187 + 188 + Action: If your payment fails, please wait 5 minutes and retry. 189 + We're working on a fix. 190 + 191 + Other features: Account management, viewing history, and settings 192 + all working normally. 193 + ``` 194 + 195 + ### Secondary Features Down 196 + 197 + When nice-to-have features fail: 198 + 199 + ``` 200 + 🟡 Analytics Dashboard Unavailable 201 + 202 + Impact: Low - core product features unaffected 203 + 204 + Status: The analytics dashboard is temporarily unavailable due to 205 + a database issue. All product features continue working normally. 206 + 207 + Your data is safe and being collected. Analytics will be updated 208 + once the dashboard is restored. 209 + ``` 210 + 211 + ### Batch/Background Features 212 + 213 + When background processes are affected: 214 + 215 + ``` 216 + ⚠️ Report Generation Delayed 217 + 218 + Impact: Reports scheduled in the last hour will be delayed. 219 + 220 + Status: The background job processor is experiencing issues. Reports 221 + will still generate, but may take 2-4 hours instead of the usual 222 + 15 minutes. 223 + 224 + If you need a report urgently, please contact support@company.com 225 + and we can prioritize it. 226 + ``` 227 + 228 + ## User Action Guidance 229 + 230 + ### No Action Needed 231 + ``` 232 + The issue is on our end. No action is required from you. We'll 233 + update this status when resolved. 234 + ``` 235 + 236 + ### Retry Recommended 237 + ``` 238 + If you encounter an error, please wait 30 seconds and try again. 239 + Most operations succeed on the second attempt. 240 + ``` 241 + 242 + ### Workaround Available 243 + ``` 244 + While we work on a fix, you can use this workaround: 245 + 1. Go to Settings > Export 246 + 2. Select "Legacy Export Mode" 247 + 3. Your export should complete successfully 248 + 249 + We'll notify you when the standard export is restored. 250 + ``` 251 + 252 + ### Avoid Feature Temporarily 253 + ``` 254 + We recommend avoiding [feature] until this is resolved to prevent 255 + data sync issues. We'll send an all-clear when it's safe to use again. 256 + ``` 257 + 258 + ## Timing and SLA Context 259 + 260 + ### When degradation exceeds SLA: 261 + 262 + ``` 263 + Update: This degradation has exceeded our 99.9% uptime SLA for the 264 + month. Affected customers will receive automatic service credits as 265 + per our SLA terms. No action needed from you. 266 + ``` 267 + 268 + ### When approaching SLA: 269 + 270 + ``` 271 + We're aware this degradation is approaching our SLA threshold. We're 272 + treating this as high priority and have additional engineers engaged. 273 + ``` 274 + 275 + ## Progressive Updates 276 + 277 + ### Initial (Minute 0) 278 + ``` 279 + We're investigating reports of [feature] not working correctly. 280 + Some users may experience errors. Core functionality unaffected. 281 + ``` 282 + 283 + ### Update 1 (Minute 15) 284 + ``` 285 + We've confirmed [feature] is experiencing issues. Approximately 286 + 20% of requests are failing. We're investigating the cause. 287 + ``` 288 + 289 + ### Update 2 (Minute 30) 290 + ``` 291 + Root cause identified: database connection timeout on [specific service]. 292 + Implementing a fix now. Estimated resolution: 15 minutes. 293 + ``` 294 + 295 + ### Update 3 (Minute 45) 296 + ``` 297 + Fix deployed. [Feature] error rate has dropped from 20% to 2%. 298 + Monitoring for full recovery. 299 + ``` 300 + 301 + ### Final (Minute 60) 302 + ``` 303 + [Feature] is fully restored. Error rates back to normal (< 0.1%). 304 + No user action required. Thank you for your patience. 305 + ``` 306 + 307 + ## Partial vs. Complete Degradation 308 + 309 + ### Partial (50% working) 310 + ``` 311 + [Feature] is partially degraded. About half of requests are succeeding. 312 + If you receive an error, try again in a few seconds - you'll likely 313 + succeed on the second or third attempt. 314 + ``` 315 + 316 + ### Severe (90% failing) 317 + ``` 318 + [Feature] is severely degraded with most requests failing. We recommend 319 + waiting until this is resolved rather than retrying repeatedly. 320 + 321 + ETA for fix: 30 minutes 322 + ``` 323 + 324 + ### Complete (100% down) 325 + ``` 326 + [Feature] is currently unavailable. We've identified the issue and 327 + are working on a fix. 328 + 329 + Estimated restoration: 15 minutes 330 + We'll notify you as soon as it's back. 331 + ``` 332 + 333 + ## Post-Resolution Analysis 334 + 335 + After resolving, explain what happened: 336 + 337 + ``` 338 + [Feature] has been fully restored. 339 + 340 + What happened: A configuration change caused connection timeouts 341 + to the [service] backend. 342 + 343 + Resolution: We rolled back the configuration change and implemented 344 + additional connection monitoring. 345 + 346 + Prevention: We're adding pre-deployment validation for configuration 347 + changes to catch issues like this before they reach production. 348 + 349 + Thank you for your patience while we resolved this issue. 350 + ``` 351 + 352 + ## Related Templates 353 + 354 + - Use **API Service Disruption** if the degraded feature is API-related 355 + - Use **Database Performance** if degradation is caused by database issues 356 + - Use **Network Connectivity** if some regions can't access the feature 357 + - Use **Deployment Rollback** if a recent deployment caused the degradation
+260
apps/web/src/content/pages/report-template/network-connectivity-issues.mdx
··· 1 + --- 2 + title: "Network Connectivity Issues Template" 3 + description: "Template for communicating network outages, CDN problems, and regional connectivity issues to affected users." 4 + author: "OpenStatus" 5 + publishedAt: "2026-01-19" 6 + category: "infrastructure" 7 + --- 8 + 9 + Use this template when experiencing network-related issues affecting user connectivity, including CDN problems, regional outages, or ISP issues. 10 + 11 + ## When to Use This Template 12 + 13 + - Regional network outages 14 + - CDN degradation or failures 15 + - DNS resolution problems 16 + - ISP-specific connectivity issues 17 + - DDoS mitigation impacts 18 + 19 + ## Template Messages 20 + 21 + ### Investigating 22 + 23 + We are aware of connectivity issues affecting some users. The issue appears to be network-related and we are investigating the root cause. 24 + 25 + Our team is working to restore connectivity as quickly as possible. 26 + 27 + ### Identified 28 + 29 + We have identified the cause of the connectivity issues. Our team is working with our network provider to implement a fix. 30 + 31 + ### Monitoring 32 + 33 + Network connectivity has been restored. We are monitoring the situation to ensure stability across all regions. 34 + 35 + ### Resolved 36 + 37 + The connectivity issues have been fully resolved. All users should now have normal access to our services. 38 + 39 + ## Real-World Examples 40 + 41 + ### Fly.io: "Network instability in IAD region" 42 + 43 + **Context**: Regional infrastructure problem 44 + **Location**: IAD (Ashburn, Virginia) 45 + **Approach**: Geographic specificity 46 + 47 + **What they did well**: 48 + - Named the specific region affected 49 + - Used technical but clear naming ("network instability") 50 + - Focused on infrastructure layer vs vague "connectivity problems" 51 + 52 + **Why it worked**: Users in that region immediately knew they were affected, while users elsewhere knew they weren't experiencing issues. 53 + 54 + ### GitHub: Infrastructure with Specific Impact Areas 55 + 56 + **Context**: Multi-service infrastructure issues 57 + **Approach**: Service-by-service breakdown 58 + 59 + **Sample structure**: 60 + ``` 61 + We're experiencing connectivity issues affecting: 62 + - Issues and Pull Requests: 10% error rate 63 + - GitHub Actions: 5% job failures 64 + - API: Elevated latency 65 + 66 + Other services operating normally. 67 + ``` 68 + 69 + **Why it worked**: Users could quickly assess if their workflow was affected. 70 + 71 + ## Geographic Specificity Best Practices 72 + 73 + ### Be Specific About Location 74 + 75 + ✅ Good: 76 + - "Users in Europe experiencing connectivity issues" 77 + - "Network problems in AWS us-east-1 region" 78 + - "CDN degradation affecting Asia-Pacific" 79 + 80 + ❌ Vague: 81 + - "Some users having problems" 82 + - "Network issues" 83 + - "Connectivity degraded" 84 + 85 + ### Example: Regional Communication 86 + 87 + **For global outage**: 88 + ``` 89 + We're experiencing network connectivity issues affecting users globally. 90 + Our network provider is investigating. We'll provide updates every 30 minutes. 91 + ``` 92 + 93 + **For regional outage**: 94 + ``` 95 + We're aware of connectivity issues affecting users in the EU region. 96 + This appears to be related to our CDN provider. US and Asia-Pacific 97 + regions are operating normally. 98 + ``` 99 + 100 + **For ISP-specific**: 101 + ``` 102 + We're receiving reports of connectivity issues from users on [ISP Name]. 103 + We're working with the ISP to resolve. Users on other networks should 104 + not be affected. 105 + ``` 106 + 107 + ## CDN-Specific Communication 108 + 109 + When CDN issues affect your service: 110 + 111 + ### During Investigation 112 + ``` 113 + We're experiencing degraded performance due to issues with our CDN provider. 114 + Users may see slower load times or intermittent connectivity. We're working 115 + with [CDN Provider] to resolve this quickly. 116 + ``` 117 + 118 + ### When Switching to Backup 119 + ``` 120 + We've temporarily switched traffic to our backup CDN to restore performance. 121 + You may experience brief disruptions during this transition. 122 + ``` 123 + 124 + ### After Resolution 125 + ``` 126 + CDN performance has been fully restored. All traffic has been returned to 127 + our primary provider, and we're monitoring closely for any recurring issues. 128 + ``` 129 + 130 + ## DNS Issues Communication 131 + 132 + ### Initial Report 133 + ``` 134 + We're aware of DNS resolution failures affecting access to [service]. 135 + Some users may receive "site cannot be reached" errors. We're working 136 + with our DNS provider to resolve this immediately. 137 + 138 + Workaround: If you have our service's IP address cached, you can 139 + still access via direct IP. 140 + ``` 141 + 142 + ### Resolution 143 + ``` 144 + DNS resolution has been restored. Changes may take 5-15 minutes to 145 + propagate globally due to DNS caching. If you still can't access 146 + the service, try clearing your DNS cache or waiting a few minutes. 147 + ``` 148 + 149 + ## Providing Workarounds 150 + 151 + Always include workarounds when possible: 152 + 153 + ### Example 1: CDN Issues 154 + ``` 155 + While we work on the connectivity issue, you can access the service 156 + directly via: https://direct.yourservice.com (bypasses CDN) 157 + ``` 158 + 159 + ### Example 2: Regional Issues 160 + ``` 161 + Users in affected regions can temporarily use our US endpoint: 162 + https://us.yourservice.com 163 + ``` 164 + 165 + ### Example 3: API Connectivity 166 + ``` 167 + If experiencing timeouts, try reducing request rate or adding retry 168 + logic with exponential backoff. We'll send an all-clear when issues 169 + are fully resolved. 170 + ``` 171 + 172 + ## DDoS Mitigation Communication 173 + 174 + ### During Active Mitigation 175 + ``` 176 + We're currently mitigating a distributed denial-of-service (DDoS) attack. 177 + Some users may experience: 178 + - Slower response times 179 + - CAPTCHA challenges 180 + - Temporary access blocks 181 + 182 + These are protective measures. Your data and account remain secure. 183 + ``` 184 + 185 + ### Post-Mitigation 186 + ``` 187 + The DDoS attack has been successfully mitigated. All protective measures 188 + remain in place. Service performance has returned to normal. 189 + ``` 190 + 191 + ## Timing Expectations 192 + 193 + Set clear expectations about updates: 194 + 195 + ``` 196 + We're investigating network connectivity issues in the APAC region. 197 + We'll provide updates every 15 minutes until resolved. 198 + 199 + Next update: 10:15 UTC 200 + ``` 201 + 202 + Then honor that commitment: 203 + 204 + ``` 205 + [10:15 UTC Update] Still investigating. Network provider has identified 206 + the issue and is implementing a fix. We expect resolution within 30 minutes. 207 + 208 + Next update: 10:30 UTC or sooner if resolved. 209 + ``` 210 + 211 + ## Multi-Region Status Example 212 + 213 + For services with multiple regions: 214 + 215 + ``` 216 + Current Status: 217 + - 🔴 EU-West: Major connectivity issues 218 + - 🟡 US-East: Minor latency increases 219 + - 🟢 US-West: Operating normally 220 + - 🟢 Asia-Pacific: Operating normally 221 + 222 + We're prioritizing restoration of EU-West and monitoring other regions closely. 223 + ``` 224 + 225 + ## Third-Party Provider Communication 226 + 227 + When the issue is with a third-party: 228 + 229 + ✅ **Be transparent but professional**: 230 + ``` 231 + We're experiencing connectivity issues due to problems with our CDN 232 + provider, Cloudflare. They are working on a fix. We're monitoring 233 + their status page and will update you as we learn more. 234 + ``` 235 + 236 + ❌ **Don't blame or criticize**: 237 + ``` 238 + Cloudflare is down again! Not our fault! 🤷 239 + ``` 240 + 241 + ## Follow-Up After Resolution 242 + 243 + ### Short-Term (Same Day) 244 + ``` 245 + Connectivity has been fully restored across all regions. We're continuing 246 + to monitor for any recurring issues. 247 + ``` 248 + 249 + ### Medium-Term (Next Day) 250 + ``` 251 + Yesterday's connectivity issues were caused by [root cause]. We're working 252 + with our network provider to implement additional safeguards to prevent 253 + recurrence. 254 + ``` 255 + 256 + ## Related Templates 257 + 258 + - Use **API Service Disruption** if network issues primarily affect API calls 259 + - Use **Database Performance** if network latency affects database connections 260 + - Use **Security Incident** if connectivity issues are attack-related
+342
apps/web/src/content/pages/report-template/scheduled-maintenance.mdx
··· 1 + --- 2 + title: "Scheduled Maintenance Template" 3 + description: "Proactive template for communicating planned maintenance windows, upgrades, and scheduled downtime to users." 4 + author: "OpenStatus" 5 + publishedAt: "2026-01-19" 6 + category: "maintenance" 7 + --- 8 + 9 + Use this template for planned maintenance, infrastructure upgrades, or scheduled downtime. Proactive communication builds trust and reduces support burden. 10 + 11 + ## When to Use This Template 12 + 13 + - Database upgrades 14 + - Infrastructure migrations 15 + - Security patch deployments 16 + - Third-party provider maintenance 17 + - Performance optimization work 18 + 19 + ## Template Messages 20 + 21 + ### Scheduled (Advance Notice) 22 + 23 + We have scheduled maintenance for [System Name] on [Date] at [Time] [Timezone]. 24 + 25 + **Expected Duration**: [Duration] 26 + **Expected Impact**: [Impact Description] 27 + 28 + We will provide updates throughout the maintenance window. 29 + 30 + ### In Progress 31 + 32 + Scheduled maintenance is currently in progress. We expect to complete within the planned window. 33 + 34 + **Current Status**: [Brief status] 35 + **Expected Completion**: [Time] 36 + 37 + ### Completed 38 + 39 + The scheduled maintenance has been completed successfully. All systems are operating normally. 40 + 41 + Thank you for your patience during this maintenance window. 42 + 43 + ## Real-World Examples 44 + 45 + ### Stripe: Payment Method Maintenance 46 + 47 + **Context**: Scheduled maintenance for TWINT payment method 48 + **Approach**: Clear scheduling with transparency disclaimers 49 + 50 + **Sample messaging**: 51 + ``` 52 + TWINT has an upcoming scheduled maintenance. 53 + 54 + Note: Stripe retrieves payment method planned maintenance information 55 + from payment method partners and the information may not be complete, 56 + accurate, or up to date. 57 + ``` 58 + 59 + **What worked**: 60 + - Clear about the service affected (TWINT) 61 + - Set expectations about information accuracy 62 + - Consistent disclaimer across all maintenance notices 63 + 64 + **Multi-stage updates**: 65 + 1. **Scheduled**: "TWINT has upcoming scheduled maintenance on [date]" 66 + 2. **In Progress**: "Maintenance is currently in progress" 67 + 3. **Completed**: "The scheduled maintenance has been completed" 68 + 69 + ### Notion: Planned Maintenance Communication 70 + 71 + **Approach**: Clear timing with minimal service impact 72 + 73 + **Sample structure**: 74 + ``` 75 + Scheduled Maintenance 76 + Time: Jan 20, 2026 | 2:00 AM - 4:00 AM PST 77 + Impact: Brief connectivity interruptions expected 78 + Status: Scheduled 79 + 80 + We'll be performing database maintenance during this window. 81 + Most features will remain available, but you may experience 82 + brief disruptions. 83 + ``` 84 + 85 + ## Planning Your Maintenance Communication 86 + 87 + ### 1 Week Before 88 + ``` 89 + 📅 Scheduled Maintenance Notice 90 + 91 + We'll be performing infrastructure upgrades on [date] at [time]. 92 + 93 + What: Database migration to improve performance 94 + When: January 25, 2026 at 02:00 UTC 95 + Duration: Approximately 2 hours 96 + Impact: Read-only mode during migration 97 + 98 + Add to calendar: [iCal link] 99 + ``` 100 + 101 + ### 24 Hours Before 102 + ``` 103 + ⏰ Reminder: Maintenance Tomorrow 104 + 105 + This is a reminder that we'll be performing scheduled maintenance 106 + tomorrow, January 25 at 02:00 UTC (approximately 2 hours). 107 + 108 + During this time, the service will be in read-only mode. You'll be 109 + able to view data but won't be able to make changes. 110 + 111 + We recommend completing any urgent work before maintenance begins. 112 + ``` 113 + 114 + ### 1 Hour Before 115 + ``` 116 + 🔧 Maintenance Starting Soon 117 + 118 + Scheduled maintenance begins in 1 hour (02:00 UTC). 119 + 120 + Quick reminders: 121 + - Service will be in read-only mode 122 + - Expected duration: 2 hours 123 + - We'll provide hourly updates 124 + 125 + If you have any questions, please contact support before maintenance begins. 126 + ``` 127 + 128 + ### At Start 129 + ``` 130 + 🚧 Maintenance In Progress 131 + 132 + Scheduled maintenance has started. The service is now in read-only mode. 133 + 134 + Progress: Database backup completed ✓ 135 + Next: Begin migration 136 + Expected completion: 04:00 UTC 137 + ``` 138 + 139 + ### Hourly Updates 140 + ``` 141 + 📊 Maintenance Progress Update (Hour 1) 142 + 143 + Migration is progressing as planned. 144 + 145 + Completed: 146 + ✓ Database backup 147 + ✓ Schema updates 148 + ✓ Data migration (65%) 149 + 150 + In progress: 151 + ⏳ Data migration (ongoing) 152 + 153 + Still on track for 04:00 UTC completion. 154 + ``` 155 + 156 + ### At Completion 157 + ``` 158 + ✅ Maintenance Complete 159 + 160 + Scheduled maintenance has been completed successfully! 161 + 162 + The service is now fully operational and out of read-only mode. 163 + All features are available. 164 + 165 + Thank you for your patience. You should notice improved performance 166 + with our upgraded infrastructure. 167 + ``` 168 + 169 + ### If Extended 170 + ``` 171 + ⚠️ Maintenance Extended 172 + 173 + We're making excellent progress, but the maintenance will take longer 174 + than expected. 175 + 176 + New estimated completion: 05:00 UTC (1 hour extension) 177 + Reason: Data migration taking longer due to dataset size 178 + 179 + The service remains in read-only mode. We'll provide another update 180 + in 30 minutes. 181 + ``` 182 + 183 + ## Advance Notice Best Practices 184 + 185 + ### Minimum Notice Periods 186 + 187 + - **Minor maintenance** (< 30 min, no downtime): 48 hours notice 188 + - **Standard maintenance** (1-4 hours, read-only): 1 week notice 189 + - **Major maintenance** (> 4 hours, full downtime): 2+ weeks notice 190 + 191 + ### What to Include 192 + 193 + ✅ **Always include**: 194 + - Exact date and time (with timezone) 195 + - Expected duration 196 + - Impact description 197 + - What users can/can't do 198 + - Who to contact with questions 199 + 200 + ✅ **Nice to have**: 201 + - Reason for maintenance 202 + - Expected benefits 203 + - Calendar file (.ics) 204 + - Status page link 205 + - Estimated completion time 206 + 207 + ❌ **Avoid**: 208 + - Vague timing ("sometime next week") 209 + - Unclear impact ("may affect some users") 210 + - No duration estimate 211 + - Technical jargon without explanation 212 + 213 + ## Impact Level Communication 214 + 215 + ### No Downtime 216 + ``` 217 + Maintenance Window: January 25, 02:00-04:00 UTC 218 + Impact: None - We'll be performing rolling updates with no service interruption 219 + Action Required: None 220 + ``` 221 + 222 + ### Read-Only Mode 223 + ``` 224 + Maintenance Window: January 25, 02:00-04:00 UTC 225 + Impact: Service will be in read-only mode 226 + What you CAN do: View all data, run reports, access historical information 227 + What you CAN'T do: Create, update, or delete records 228 + Action Required: Complete any urgent changes before maintenance 229 + ``` 230 + 231 + ### Full Downtime 232 + ``` 233 + Maintenance Window: January 25, 02:00-04:00 UTC 234 + Impact: Service will be completely unavailable 235 + What to expect: You won't be able to access the service at all 236 + Action Required: Plan accordingly, download any needed data beforehand 237 + Alternative: [If you have a status page or alternative access method] 238 + ``` 239 + 240 + ### Partial Service Impact 241 + ``` 242 + Maintenance Window: January 25, 02:00-04:00 UTC 243 + Impact: Partial service degradation 244 + 245 + Available: 246 + ✓ Login and authentication 247 + ✓ Data viewing 248 + ✓ API read endpoints 249 + 250 + Unavailable: 251 + ✗ File uploads 252 + ✗ Report generation 253 + ✗ Data exports 254 + ✗ Webhook delivery 255 + ``` 256 + 257 + ## Timezone Considerations 258 + 259 + Always include multiple timezones for global audiences: 260 + 261 + ``` 262 + Maintenance scheduled for: 263 + - 02:00 UTC 264 + - 6:00 PM PST (Jan 24) 265 + - 9:00 PM EST (Jan 24) 266 + - 11:00 AM JST (Jan 25) 267 + 268 + Check your timezone: [worldtimebuddy.com link] 269 + ``` 270 + 271 + Or use relative time: 272 + ``` 273 + Maintenance begins in 24 hours. 274 + Check your local time: January 25, 02:00 UTC 275 + ``` 276 + 277 + ## Third-Party Maintenance 278 + 279 + When a provider schedules maintenance: 280 + 281 + ``` 282 + Our payment provider, Stripe, has scheduled maintenance for [date]. 283 + 284 + Impact: Payment processing may be temporarily unavailable 285 + Duration: Approximately 30 minutes 286 + Workaround: We'll queue any failed payments and automatically retry 287 + 288 + This maintenance is being performed by our payment provider. For more 289 + information, visit: [provider status page] 290 + ``` 291 + 292 + ## Emergency Maintenance 293 + 294 + Sometimes maintenance can't wait: 295 + 296 + ``` 297 + 🚨 Emergency Maintenance Required 298 + 299 + We've identified a critical issue that requires immediate maintenance. 300 + 301 + Starting: Now (15:00 UTC) 302 + Expected duration: 30 minutes 303 + Impact: Service will be unavailable 304 + 305 + We apologize for the short notice. This maintenance is necessary to 306 + prevent potential data issues. 307 + 308 + Updates every 10 minutes. 309 + ``` 310 + 311 + ## Benefits Communication 312 + 313 + Help users understand the "why": 314 + 315 + ``` 316 + This maintenance will deliver: 317 + ✓ 3x faster query performance 318 + ✓ 99.99% uptime SLA (up from 99.9%) 319 + ✓ Support for 10x more concurrent users 320 + ✓ Reduced latency for API calls 321 + 322 + We appreciate your patience as we improve the service. 323 + ``` 324 + 325 + ## FAQ to Include 326 + 327 + Consider adding to your maintenance notice: 328 + 329 + **Q: Can I use the service during maintenance?** 330 + A: The service will be in read-only mode. You can view data but not make changes. 331 + 332 + **Q: What if I'm in the middle of something?** 333 + A: We recommend saving your work before maintenance begins. Any unsaved changes may be lost. 334 + 335 + **Q: Will my data be safe?** 336 + A: Yes, we perform full backups before all maintenance. Your data is secure. 337 + 338 + **Q: What if maintenance takes longer?** 339 + A: We'll provide updates every hour and notify you of any time extensions. 340 + 341 + **Q: Can you reschedule?** 342 + A: This timing was chosen for minimal impact. Please contact support if you have urgent concerns.
+207
apps/web/src/content/pages/report-template/security-incident-response.mdx
··· 1 + --- 2 + title: "Security Incident Response Template" 3 + description: "Formal template for communicating security issues with professional, reassuring language that maintains user trust." 4 + author: "OpenStatus" 5 + publishedAt: "2026-01-19" 6 + category: "security" 7 + --- 8 + 9 + Use this template when investigating or responding to security-related incidents. Maintains professional tone while reassuring users about security measures. 10 + 11 + ## When to Use This Template 12 + 13 + - Potential security vulnerabilities discovered 14 + - Unauthorized access attempts detected 15 + - Data exposure concerns 16 + - Security patch deployments 17 + - Compliance-related issues 18 + 19 + ## Template Messages 20 + 21 + ### Investigating 22 + 23 + We are investigating a potential security issue. We take security very seriously and are working with our security team to assess the situation. 24 + 25 + We will provide updates as we learn more. For security questions, please contact security@yourcompany.com. 26 + 27 + ### Identified 28 + 29 + We have identified the nature of the security issue and are implementing remediation measures. 30 + 31 + ### Monitoring 32 + 33 + Security measures have been implemented. We are monitoring systems to ensure the issue is fully resolved. 34 + 35 + ### Resolved 36 + 37 + The security issue has been resolved. We have taken steps to prevent similar issues in the future. 38 + 39 + ## Key Principles for Security Communication 40 + 41 + ### 1. **Be Transparent, But Not Reckless** 42 + 43 + Share what you know, but don't provide details that could help attackers: 44 + 45 + ✅ Good: "We identified unauthorized access attempts to our admin panel" 46 + ❌ Avoid: "Attackers tried SQL injection on /admin/login using parameter X" 47 + 48 + ### 2. **Reassure Without Minimizing** 49 + 50 + ✅ Good: "No user data was accessed. We take security seriously and have implemented additional safeguards." 51 + ❌ Avoid: "It's not a big deal, don't worry about it." 52 + 53 + ### 3. **Provide Clear Next Steps** 54 + 55 + Tell users what (if anything) they should do: 56 + - Change passwords? 57 + - Review account activity? 58 + - Update client software? 59 + - No action needed? 60 + 61 + ### 4. **Show Competence** 62 + 63 + Demonstrate you're handling it professionally: 64 + - "Working with our security team" 65 + - "Engaged external security experts" 66 + - "Following our incident response procedures" 67 + 68 + ## Real-World Security Communication Examples 69 + 70 + ### Example 1: Data Access Concern 71 + 72 + **Investigating**: 73 + ``` 74 + We are investigating reports of unusual account activity. As a precaution, 75 + we've temporarily disabled affected accounts and are conducting a thorough 76 + security audit. 77 + 78 + If your account was affected, we will contact you directly via email. 79 + ``` 80 + 81 + **Resolved**: 82 + ``` 83 + Our investigation is complete. No user data was compromised. The unusual 84 + activity was caused by automated testing scripts that were misconfigured. 85 + 86 + We've implemented additional monitoring to prevent similar false positives 87 + and improved our alerting to distinguish between legitimate and suspicious 88 + activity. 89 + ``` 90 + 91 + ### Example 2: Vulnerability Patch 92 + 93 + **Investigating**: 94 + ``` 95 + We've been notified of a potential security vulnerability in a third-party 96 + library we use. We are investigating the impact and preparing a security 97 + patch. 98 + 99 + This appears to be a low-severity issue with no evidence of exploitation, 100 + but we're treating it with high priority. 101 + ``` 102 + 103 + **Resolved**: 104 + ``` 105 + We've deployed a security patch addressing the vulnerability. No user data 106 + was at risk, and we saw no signs of exploitation. All systems have been 107 + updated and are operating normally. 108 + ``` 109 + 110 + ## Tone Guidelines 111 + 112 + ### Professional & Calm 113 + Security incidents can be stressful. Your communication should be: 114 + - **Measured**: Not panicked or overly casual 115 + - **Clear**: No jargon or ambiguity 116 + - **Authoritative**: Demonstrates control and competence 117 + - **Empathetic**: Acknowledges user concerns 118 + 119 + ### Example Tone Comparisons 120 + 121 + ❌ **Too casual**: "Oops, we had a little security hiccup, but it's all good now!" 122 + 123 + ❌ **Too alarming**: "URGENT: Your data may be compromised! Immediate action required!" 124 + 125 + ✅ **Just right**: "We've identified and resolved a security issue. No user data was compromised. We've implemented additional safeguards to prevent similar issues." 126 + 127 + ## Legal & Compliance Considerations 128 + 129 + ### Include if Required 130 + 131 + - **GDPR**: Data breach notifications within 72 hours if personal data affected 132 + - **CCPA**: Notification if California residents' data compromised 133 + - **SOC 2**: Incident must be logged and reported per agreements 134 + - **Industry-specific**: HIPAA (healthcare), PCI DSS (payments), etc. 135 + 136 + ### Standard Disclaimers 137 + 138 + Consider adding: 139 + ``` 140 + This incident has been reported to relevant authorities as required by 141 + [regulation name]. Affected users will be notified directly via email 142 + as required by law. 143 + ``` 144 + 145 + ## Security Incident Checklist 146 + 147 + Before publishing updates: 148 + 149 + - [ ] Verified facts with security team 150 + - [ ] Removed any tactical details that could help attackers 151 + - [ ] Confirmed legal/compliance requirements met 152 + - [ ] Prepared answers to likely follow-up questions 153 + - [ ] Coordinated with PR/communications team if needed 154 + - [ ] Set up dedicated security@company.com contact 155 + - [ ] Drafted FAQ for support team 156 + 157 + ## Follow-Up Communication 158 + 159 + ### Within 24 Hours 160 + Initial resolution and immediate actions taken 161 + 162 + ### Within 7 Days 163 + Preliminary findings and preventative measures 164 + 165 + ### Within 30 Days (Optional) 166 + Full post-mortem with technical details (if appropriate) 167 + 168 + ## Example: Complete Incident Progression 169 + 170 + **00:00 - Detection** 171 + ``` 172 + We're investigating reports of unusual login activity. As a precaution, 173 + we've temporarily increased authentication requirements and are reviewing 174 + account access logs. 175 + ``` 176 + 177 + **00:45 - Identification** 178 + ``` 179 + We've identified the cause as compromised API keys from a third-party 180 + integration. We've revoked the affected keys and are auditing all 181 + access during the exposure window. No evidence of data access. 182 + ``` 183 + 184 + **02:00 - Monitoring** 185 + ``` 186 + All compromised keys have been revoked and replaced. We're monitoring 187 + for any related activity. Additional security measures have been 188 + deployed to prevent similar issues. 189 + ``` 190 + 191 + **04:00 - Resolution** 192 + ``` 193 + Incident resolved. Our investigation confirms no user data was accessed. 194 + We've strengthened our API key rotation procedures and added real-time 195 + monitoring for unusual API activity. 196 + 197 + Users with affected integrations will receive direct communication 198 + about key rotation requirements. 199 + ``` 200 + 201 + ## When NOT to Use This Template 202 + 203 + - System outages unrelated to security → Use appropriate infrastructure template 204 + - Planned security patches with no active threat → Use maintenance template 205 + - Minor configuration issues → Use general service disruption template 206 + 207 + Only use security incident language when there's an actual security concern to avoid alarm fatigue.
+3 -1
apps/web/src/content/sub-nav.tsx
··· 19 19 {segments.map((segment, index) => ( 20 20 <Fragment key={segment}> 21 21 <Link href={`/${segments.slice(0, index + 1).join("/")}`}> 22 - {segment} 22 + {segment.split("-").join(" ")} 23 23 </Link> 24 24 {index < segments.length - 1 ? ( 25 25 <span className="text-muted-foreground">{" | "}</span> ··· 29 29 </div> 30 30 <CopyButton 31 31 copyText={typeof window !== "undefined" ? window.location.href : ""} 32 + buttonText="copy link" 33 + copiedText="link copied" 32 34 /> 33 35 </div> 34 36 );
+7
apps/web/src/content/utils.ts
··· 91 91 ); 92 92 } 93 93 94 + export function getReportTemplates(): MDXData[] { 95 + return getMDXDataFromDir( 96 + path.join(process.cwd(), "src", "content", "pages", "report-template"), 97 + "/report-template", 98 + ); 99 + } 100 + 94 101 export function getUnrelatedPages(): MDXData[] { 95 102 return getMDXDataFromDir( 96 103 path.join(process.cwd(), "src", "content", "pages", "unrelated"),
+4
apps/web/src/data/content.ts
··· 31 31 href: "https://docs.openstatus.dev", 32 32 }, 33 33 { 34 + label: "Report Templates", 35 + href: "/report-template", 36 + }, 37 + { 34 38 label: "External Status", 35 39 href: "/status", 36 40 },