Skip to content

Commit 7b0aaec

Browse files
committed
feat(statuspage): added statuspage, updated list of tools in footer, renamed routes
1 parent 08d57b4 commit 7b0aaec

File tree

17 files changed

+508
-225
lines changed

17 files changed

+508
-225
lines changed

apps/sim/app/(landing)/actions/github.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import { createLogger } from '@/lib/logs/console/logger'
22

3-
const DEFAULT_STARS = '15.4k'
3+
const DEFAULT_STARS = '18.6k'
44

55
const logger = createLogger('GitHubStars')
66

77
export async function getFormattedGitHubStars(): Promise<string> {
88
try {
9-
const response = await fetch('/api/github-stars', {
9+
const response = await fetch('/api/stars', {
1010
headers: {
1111
'Cache-Control': 'max-age=3600', // Cache for 1 hour
1212
},
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import Image from 'next/image'
2+
import Link from 'next/link'
3+
import { HIPAABadgeIcon } from '@/components/icons'
4+
5+
export default function ComplianceBadges() {
6+
return (
7+
<div className='mt-[6px] flex items-center gap-[12px]'>
8+
{/* SOC2 badge */}
9+
<Link href='https://trust.delve.co/sim-studio' target='_blank' rel='noopener noreferrer'>
10+
<Image
11+
src='/footer/soc2.png'
12+
alt='SOC2 Compliant'
13+
width={54}
14+
height={54}
15+
className='object-contain'
16+
loading='lazy'
17+
quality={75}
18+
/>
19+
</Link>
20+
{/* HIPAA badge */}
21+
<Link href='https://trust.delve.co/sim-studio' target='_blank' rel='noopener noreferrer'>
22+
<HIPAABadgeIcon className='h-[54px] w-[54px]' />
23+
</Link>
24+
</div>
25+
)
26+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import ComplianceBadges from './compliance-badges'
2+
import Logo from './logo'
3+
import SocialLinks from './social-links'
4+
import StatusIndicator from './status-indicator'
5+
6+
export { ComplianceBadges, Logo, SocialLinks, StatusIndicator }
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import Image from 'next/image'
2+
import Link from 'next/link'
3+
4+
export default function Logo() {
5+
return (
6+
<Link href='/' aria-label='Sim home'>
7+
<Image
8+
src='/logo/b&w/text/b&w.svg'
9+
alt='Sim - Workflows for LLMs'
10+
width={49.78314}
11+
height={24.276}
12+
priority
13+
quality={90}
14+
/>
15+
</Link>
16+
)
17+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import { DiscordIcon, GithubIcon, LinkedInIcon, xIcon as XIcon } from '@/components/icons'
2+
3+
export default function SocialLinks() {
4+
return (
5+
<div className='flex items-center gap-[12px]'>
6+
<a
7+
href='https://discord.gg/Hr4UWYEcTT'
8+
target='_blank'
9+
rel='noopener noreferrer'
10+
className='flex items-center text-[16px] text-muted-foreground transition-colors hover:text-foreground'
11+
aria-label='Discord'
12+
>
13+
<DiscordIcon className='h-[20px] w-[20px]' aria-hidden='true' />
14+
</a>
15+
<a
16+
href='https://x.com/simdotai'
17+
target='_blank'
18+
rel='noopener noreferrer'
19+
className='flex items-center text-[16px] text-muted-foreground transition-colors hover:text-foreground'
20+
aria-label='X (Twitter)'
21+
>
22+
<XIcon className='h-[18px] w-[18px]' aria-hidden='true' />
23+
</a>
24+
<a
25+
href='https://www.linkedin.com/company/simstudioai/'
26+
target='_blank'
27+
rel='noopener noreferrer'
28+
className='flex items-center text-[16px] text-muted-foreground transition-colors hover:text-foreground'
29+
aria-label='LinkedIn'
30+
>
31+
<LinkedInIcon className='h-[18px] w-[18px]' aria-hidden='true' />
32+
</a>
33+
<a
34+
href='https://github.com/simstudioai/sim'
35+
target='_blank'
36+
rel='noopener noreferrer'
37+
className='flex items-center text-[16px] text-muted-foreground transition-colors hover:text-foreground'
38+
aria-label='GitHub'
39+
>
40+
<GithubIcon className='h-[20px] w-[20px]' aria-hidden='true' />
41+
</a>
42+
</div>
43+
)
44+
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
'use client'
2+
3+
import { useCallback, useEffect, useState } from 'react'
4+
import Link from 'next/link'
5+
import { StatusDotIcon } from '@/components/icons'
6+
import type { StatusResponse, StatusType } from '@/app/api/status/types'
7+
8+
const POLLING_INTERVAL = 60000
9+
10+
const STATUS_COLORS: Record<StatusType, string> = {
11+
operational: 'text-[#10B981] hover:text-[#059669]',
12+
degraded: 'text-[#F59E0B] hover:text-[#D97706]',
13+
outage: 'text-[#EF4444] hover:text-[#DC2626]',
14+
maintenance: 'text-[#3B82F6] hover:text-[#2563EB]',
15+
loading: 'text-muted-foreground hover:text-foreground',
16+
error: 'text-muted-foreground hover:text-foreground',
17+
}
18+
19+
export default function StatusIndicator() {
20+
const [status, setStatus] = useState<StatusType>('loading')
21+
const [message, setMessage] = useState<string>('Checking Status...')
22+
const [statusUrl, setStatusUrl] = useState<string>('https://status.sim.ai')
23+
24+
const fetchStatus = useCallback(async () => {
25+
try {
26+
const response = await fetch('/api/status')
27+
28+
if (!response.ok) {
29+
throw new Error('Failed to fetch status')
30+
}
31+
32+
const data: StatusResponse = await response.json()
33+
34+
setStatus(data.status)
35+
setMessage(data.message)
36+
setStatusUrl(data.url)
37+
} catch (error) {
38+
console.error('Error fetching status:', error)
39+
setStatus('error')
40+
setMessage('Status Unknown')
41+
}
42+
}, [])
43+
44+
useEffect(() => {
45+
fetchStatus()
46+
47+
const poll = () => {
48+
fetchStatus().finally(() => {
49+
setTimeout(poll, POLLING_INTERVAL)
50+
})
51+
}
52+
53+
const timeoutId = setTimeout(poll, POLLING_INTERVAL)
54+
55+
return () => {
56+
clearTimeout(timeoutId)
57+
}
58+
}, [fetchStatus])
59+
60+
return (
61+
<Link
62+
href={statusUrl}
63+
target='_blank'
64+
rel='noopener noreferrer'
65+
className={`flex items-center gap-[6px] whitespace-nowrap text-[12px] transition-colors ${STATUS_COLORS[status]}`}
66+
aria-label={`System status: ${message}`}
67+
>
68+
<StatusDotIcon status={status} className='h-[6px] w-[6px]' aria-hidden='true' />
69+
<span>{message}</span>
70+
</Link>
71+
)
72+
}
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
export const FOOTER_BLOCKS = [
2+
'Agent',
3+
'API',
4+
'Condition',
5+
'Evaluator',
6+
'Function',
7+
'Human In The Loop',
8+
'Loop',
9+
'Parallel',
10+
'Response',
11+
'Router',
12+
'Starter',
13+
'Webhook',
14+
'Workflow',
15+
]
16+
17+
export const FOOTER_TOOLS = [
18+
'Airtable',
19+
'Apify',
20+
'Apollo',
21+
'ArXiv',
22+
'Browser Use',
23+
'Calendly',
24+
'Clay',
25+
'Confluence',
26+
'Discord',
27+
'ElevenLabs',
28+
'Exa',
29+
'Firecrawl',
30+
'GitHub',
31+
'Gmail',
32+
'Google Drive',
33+
'Guardrails',
34+
'HubSpot',
35+
'HuggingFace',
36+
'Hunter',
37+
'Incidentio',
38+
'Intercom',
39+
'Jina',
40+
'Jira',
41+
'Knowledge',
42+
'Linear',
43+
'LinkUp',
44+
'LinkedIn',
45+
'Mailchimp',
46+
'Mailgun',
47+
'MCP',
48+
'Mem0',
49+
'Microsoft Excel',
50+
'Microsoft Planner',
51+
'Microsoft Teams',
52+
'Mistral Parse',
53+
'MongoDB',
54+
'MySQL',
55+
'Neo4j',
56+
'Notion',
57+
'OneDrive',
58+
'OpenAI',
59+
'Outlook',
60+
'Parallel AI',
61+
'Perplexity',
62+
'Pinecone',
63+
'Pipedrive',
64+
'PostHog',
65+
'PostgreSQL',
66+
'Pylon',
67+
'Qdrant',
68+
'Reddit',
69+
'Resend',
70+
'S3',
71+
'Salesforce',
72+
'SendGrid',
73+
'Serper',
74+
'SharePoint',
75+
'Slack',
76+
'Smtp',
77+
'Stagehand',
78+
'Stripe',
79+
'Supabase',
80+
'Tavily',
81+
'Telegram',
82+
'Translate',
83+
'Trello',
84+
'Twilio',
85+
'Typeform',
86+
'Vision',
87+
'Wait',
88+
'Wealthbox',
89+
'Webflow',
90+
'WhatsApp',
91+
'Wikipedia',
92+
'X',
93+
'YouTube',
94+
'Zendesk',
95+
'Zep',
96+
]

0 commit comments

Comments
 (0)