Skip to content

Commit 0872895

Browse files
committed
merge: resolve conflicts with staging for improvement/ui
2 parents 48c654d + d013132 commit 0872895

File tree

95 files changed

+33882
-1030
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

95 files changed

+33882
-1030
lines changed

README.md

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,10 @@ docker compose -f docker-compose.prod.yml up -d
7474

7575
Open [http://localhost:3000](http://localhost:3000)
7676

77+
#### Background worker note
78+
79+
The Docker Compose stack starts a dedicated worker container by default. If `REDIS_URL` is not configured, the worker will start, log that it is idle, and do no queue processing. This is expected. Queue-backed API, webhook, and schedule execution requires Redis; installs without Redis continue to use the inline execution path.
80+
7781
Sim also supports local models via [Ollama](https://ollama.ai) and [vLLM](https://docs.vllm.ai/) — see the [Docker self-hosting docs](https://docs.sim.ai/self-hosting/docker) for setup details.
7882

7983
### Self-hosted: Manual Setup
@@ -113,10 +117,12 @@ cd packages/db && bunx drizzle-kit migrate --config=./drizzle.config.ts
113117
5. Start development servers:
114118

115119
```bash
116-
bun run dev:full # Starts both Next.js app and realtime socket server
120+
bun run dev:full # Starts Next.js app, realtime socket server, and the BullMQ worker
117121
```
118122

119-
Or run separately: `bun run dev` (Next.js) and `cd apps/sim && bun run dev:sockets` (realtime).
123+
If `REDIS_URL` is not configured, the worker will remain idle and execution continues inline.
124+
125+
Or run separately: `bun run dev` (Next.js), `cd apps/sim && bun run dev:sockets` (realtime), and `cd apps/sim && bun run worker` (BullMQ worker).
120126

121127
## Copilot API Keys
122128

apps/docs/app/layout.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ export const metadata = {
1818
metadataBase: new URL('https://docs.sim.ai'),
1919
title: {
2020
default: 'Sim Documentation — Build AI Agents & Run Your Agentic Workforce',
21-
template: '%s',
21+
template: '%s | Sim Docs',
2222
},
2323
description:
2424
'Documentation for Sim — the open-source platform to build AI agents and run your agentic workforce. Connect 1,000+ integrations and LLMs to deploy and orchestrate agentic workflows.',

apps/sim/app/(home)/components/footer/footer.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ const RESOURCES_LINKS: FooterItem[] = [
2626
{ label: 'Blog', href: '/blog' },
2727
// { label: 'Templates', href: '/templates' },
2828
{ label: 'Docs', href: 'https://docs.sim.ai', external: true },
29+
{ label: 'Academy', href: '/academy' },
30+
{ label: 'Partners', href: '/partners' },
2931
{ label: 'Careers', href: 'https://jobs.ashbyhq.com/sim', external: true },
3032
{ label: 'Changelog', href: '/changelog' },
3133
]
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
'use client'
2+
3+
import { useState } from 'react'
4+
import NextImage from 'next/image'
5+
import { cn } from '@/lib/core/utils/cn'
6+
import { Lightbox } from '@/app/(landing)/blog/components/lightbox'
7+
8+
interface BlogImageProps {
9+
src: string
10+
alt?: string
11+
width?: number
12+
height?: number
13+
className?: string
14+
}
15+
16+
export function BlogImage({ src, alt = '', width = 800, height = 450, className }: BlogImageProps) {
17+
const [isLightboxOpen, setIsLightboxOpen] = useState(false)
18+
19+
return (
20+
<>
21+
<NextImage
22+
src={src}
23+
alt={alt}
24+
width={width}
25+
height={height}
26+
className={cn(
27+
'h-auto w-full cursor-pointer rounded-lg transition-opacity hover:opacity-95',
28+
className
29+
)}
30+
sizes='(max-width: 768px) 100vw, 800px'
31+
loading='lazy'
32+
unoptimized
33+
onClick={() => setIsLightboxOpen(true)}
34+
/>
35+
<Lightbox
36+
isOpen={isLightboxOpen}
37+
onClose={() => setIsLightboxOpen(false)}
38+
src={src}
39+
alt={alt}
40+
/>
41+
</>
42+
)
43+
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
'use client'
2+
3+
import { useEffect, useRef } from 'react'
4+
5+
interface LightboxProps {
6+
isOpen: boolean
7+
onClose: () => void
8+
src: string
9+
alt: string
10+
}
11+
12+
export function Lightbox({ isOpen, onClose, src, alt }: LightboxProps) {
13+
const overlayRef = useRef<HTMLDivElement>(null)
14+
15+
useEffect(() => {
16+
if (!isOpen) return
17+
18+
const handleKeyDown = (event: KeyboardEvent) => {
19+
if (event.key === 'Escape') {
20+
onClose()
21+
}
22+
}
23+
24+
const handleClickOutside = (event: MouseEvent) => {
25+
if (overlayRef.current && event.target === overlayRef.current) {
26+
onClose()
27+
}
28+
}
29+
30+
document.addEventListener('keydown', handleKeyDown)
31+
document.addEventListener('click', handleClickOutside)
32+
document.body.style.overflow = 'hidden'
33+
34+
return () => {
35+
document.removeEventListener('keydown', handleKeyDown)
36+
document.removeEventListener('click', handleClickOutside)
37+
document.body.style.overflow = 'unset'
38+
}
39+
}, [isOpen, onClose])
40+
41+
if (!isOpen) return null
42+
43+
return (
44+
<div
45+
ref={overlayRef}
46+
className='fixed inset-0 z-50 flex items-center justify-center bg-black/80 p-12 backdrop-blur-sm'
47+
role='dialog'
48+
aria-modal='true'
49+
aria-label='Image viewer'
50+
>
51+
<div className='relative max-h-full max-w-full overflow-hidden rounded-xl shadow-2xl'>
52+
<img
53+
src={src}
54+
alt={alt}
55+
className='max-h-[75vh] max-w-[75vw] cursor-pointer rounded-xl object-contain'
56+
loading='lazy'
57+
onClick={onClose}
58+
/>
59+
</div>
60+
</div>
61+
)
62+
}

0 commit comments

Comments
 (0)