Skip to content
Merged
Show file tree
Hide file tree
Changes from 10 commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
7d1c927
fix(models): correct model catalog data and Gemini thinking-config wi…
waleedlatif1 Jul 10, 2026
2986362
feat(providers): add NVIDIA NIM and Z.ai providers (#5560)
waleedlatif1 Jul 10, 2026
8bf9424
feat(models): add latest Groq and Cerebras models (#5561)
waleedlatif1 Jul 10, 2026
08320d5
fix(sidebar): fix rename input losing its selection on open (#5563)
waleedlatif1 Jul 10, 2026
4952ddb
feat(landing): add HubSpot tracking script for hosted marketing site …
waleedlatif1 Jul 10, 2026
f0d85cb
fix(mcp): fix caret misalignment and tool schema contract validation …
waleedlatif1 Jul 10, 2026
97bb727
fix(pii): install CUDA torch on amd64 so GLiNER can run on GPU (#5552)
TheodoreSpeaks Jul 10, 2026
ea4f269
fix(providers): correct max-tokens param and add schema guidance for …
waleedlatif1 Jul 10, 2026
bbff34a
fix(mcp): route object params to JSON editor, keep invalid drafts out…
waleedlatif1 Jul 10, 2026
5d3809a
feat(tiktok): add tiktok trigger, block (#5504)
BillLeoutsakosvl346 Jul 10, 2026
43e61a1
fix(enrichments): remove Icypeas providers and show Running on in-fli…
TheodoreSpeaks Jul 10, 2026
fac8ec0
fix(workflow-edges): enforce edge/block validation server-side, not j…
waleedlatif1 Jul 10, 2026
5de66db
fix(rich-markdown-editor): stop image dupe-uploads on drag/paste; fix…
waleedlatif1 Jul 10, 2026
65b1ca1
feat(context-dev): add Context.dev to hosted key rotation pool (#5576)
waleedlatif1 Jul 10, 2026
f60d41a
feat(landing): enterprise page redesign with platform-loop hero and f…
waleedlatif1 Jul 10, 2026
f4d47ed
feat(slack): reusable custom bot credentials, slack_v2 block (preview…
TheodoreSpeaks Jul 10, 2026
8e7e2db
feat(docs): update favicon, fix icon contrast, add integration intros…
waleedlatif1 Jul 11, 2026
7962236
improvement(custom-blocks): hardened delete with usage count + per-in…
TheodoreSpeaks Jul 11, 2026
8525ba5
feat(landing): add Share chip to integration and model pages (#5582)
waleedlatif1 Jul 11, 2026
da2371a
fix(models): restore Anthropic models in landing page compare chart (…
waleedlatif1 Jul 11, 2026
1c60415
fix(landing): contain sr-only logos heading to stop phantom root scro…
waleedlatif1 Jul 11, 2026
f3582ed
feat(branding): sim wordmark favicon/OG, docs footer parity, footer p…
waleedlatif1 Jul 11, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions apps/docs/components/icons.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -1274,6 +1274,31 @@ export function xAIIcon(props: SVGProps<SVGSVGElement>) {
)
}

export function TikTokIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg
xmlns='http://www.w3.org/2000/svg'
viewBox='0 0 520.48 520.48'
width='1em'
height='1em'
{...props}
>
<path
fill='#ff004f'
d='m392.19,206.7v49.13c-8.6-.84-19.74-2.78-32.09-7.31-16.13-5.91-28.13-13.99-35.98-20.25v99.32l-.19-.31c.14,1.96.19,3.97.19,5.99,0,49.33-40.13,89.48-89.48,89.48s-89.48-40.15-89.48-89.48,40.13-89.5,89.48-89.5c4.82,0,9.57.39,14.2,1.13v48.43c-4.45-1.6-9.22-2.45-14.2-2.45-23.36,0-42.38,19-42.38,42.38s19.02,42.38,42.38,42.38,42.38-19.02,42.38-42.38c0-.88-.02-1.75-.08-2.63v-193.01h49.11c.18,4.16.35,8.34.53,12.51.33,8.19,3.25,16.05,8.32,22.49,5.97,7.57,14.76,16.36,27.13,23.38,11.57,6.56,22.45,9.38,30.15,10.7Z'
/>
<path
fill='#00f7ef'
d='m375.32,166.81v49.13c-8.6-.84-19.74-2.78-32.09-7.31-16.13-5.91-28.13-13.99-35.98-20.25v99.32l-.19-.31c.14,1.96.19,3.97.19,5.99,0,49.33-40.13,89.48-89.48,89.48s-89.48-40.15-89.48-89.48,40.13-89.5,89.48-89.5c4.82,0,9.57.39,14.2,1.13v48.43c-4.45-1.6-9.22-2.45-14.2-2.45-23.36,0-42.38,19-42.38,42.38s19.02,42.38,42.38,42.38,42.38-19.02,42.38-42.38c0-.88-.02-1.75-.08-2.63V97.74h49.11c.18,4.16.35,8.34.53,12.51.33,8.19,3.25,16.05,8.33,22.49,5.97,7.57,14.76,16.36,27.13,23.38,11.57,6.56,22.45,9.38,30.15,10.7Z'
/>
<path
fill='#fff'
d='m386.06,188.29v49.13c-8.6-.84-19.74-2.78-32.09-7.31-16.13-5.91-28.13-13.99-35.98-20.25v99.32l-.19-.31c.14,1.96.19,3.97.19,5.99,0,49.33-40.13,89.48-89.48,89.48s-89.48-40.15-89.48-89.48,40.13-89.5,89.48-89.5c4.82,0,9.57.39,14.2,1.13v48.43c-4.45-1.6-9.22-2.45-14.2-2.45-23.36,0-42.38,19-42.38,42.38s19.02,42.38,42.38,42.38,42.38-19.02,42.38-42.38c0-.88-.02-1.75-.08-2.63V119.22h49.11c.18,4.16.35,8.34.53,12.51.33,8.19,3.25,16.05,8.32,22.49,5.97,7.57,14.76,16.36,27.13,23.38,11.57,6.56,22.45,9.38,30.15,10.7Z'
/>
</svg>
)
}

export function xIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 50 50' width='1em' height='1em' {...props}>
Expand Down
38 changes: 38 additions & 0 deletions apps/sim/app/(landing)/hubspot-page-view-tracker.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
'use client'

import { useEffect } from 'react'
import { usePathname, useSearchParams } from 'next/navigation'

declare global {
interface Window {
_hsq?: unknown[][]
}
}

// next/script dedupes by id and never reloads on remount, so this must be
// module-scope (not a ref) to survive LandingLayout unmounting/remounting.
let hasTrackedInitialPageView = false

/**
* The HubSpot loader only auto-tracks the first page load; LandingLayout
* persists across client-side navigations, so HubSpot never sees the rest.
* Pushes a manual pageview through `_hsq` on every navigation after the first.
*/
export function HubspotPageViewTracker() {
const pathname = usePathname()
const searchParams = useSearchParams()
const query = searchParams.toString()

useEffect(() => {
if (!hasTrackedInitialPageView) {
hasTrackedInitialPageView = true
return
}

window._hsq = window._hsq || []
window._hsq.push(['setPath', query ? `${pathname}?${query}` : pathname])
Comment thread
waleedlatif1 marked this conversation as resolved.
window._hsq.push(['trackPageView'])
}, [pathname, query])

return null
}
21 changes: 20 additions & 1 deletion apps/sim/app/(landing)/layout.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,13 @@
import type { ReactNode } from 'react'
import { Suspense } from 'react'
import type { Metadata } from 'next'
import Script from 'next/script'
import { isHosted } from '@/lib/core/config/env-flags'
import { SITE_URL } from '@/lib/core/utils/urls'
import { LandingShell } from '@/app/(landing)/components'
import { HubspotPageViewTracker } from '@/app/(landing)/hubspot-page-view-tracker'

const HUBSPOT_SCRIPT_SRC = 'https://js-na2.hs-scripts.com/246720681.js' as const

/**
* Route-group layout for the entire landing family - the home page, platform and
Expand All @@ -24,5 +30,18 @@ export const metadata: Metadata = {
}

export default function LandingLayout({ children }: { children: ReactNode }) {
return <LandingShell>{children}</LandingShell>
return (
<LandingShell>
{children}
{/* HubSpot tracking — hosted only */}
{isHosted && (
<>
<Script id='hs-script-loader' src={HUBSPOT_SCRIPT_SRC} strategy='afterInteractive' />
<Suspense fallback={null}>
<HubspotPageViewTracker />
</Suspense>
</>
)}
</LandingShell>
)
}
25 changes: 19 additions & 6 deletions apps/sim/app/api/tools/jupyter/upload/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import {
buildJupyterAuthHeaders,
encodeJupyterPath,
normalizeJupyterServerUrl,
parseJupyterContentModel,
UnsafeJupyterPathError,
} from '@/tools/jupyter/utils'

Expand Down Expand Up @@ -128,17 +129,29 @@ export const POST = withRouteHandler(async (request: NextRequest) => {
)
}

const uploaded = await response.json()
const uploaded = parseJupyterContentModel(await response.json())
if (!uploaded) {
logger.error(`[${requestId}] Jupyter returned an invalid upload response`)
return NextResponse.json(
{ success: false, error: 'Jupyter returned an invalid upload response' },
{ status: 502 }
)
}

const uploadedName = uploaded.name ?? fileName
const uploadedPath = uploaded.path ?? destinationPath
const uploadedSize = uploaded.size ?? fileBuffer.length
const lastModified = uploaded.lastModified ?? null

logger.info(`[${requestId}] File uploaded to Jupyter: ${uploaded.path}`)
logger.info(`[${requestId}] File uploaded to Jupyter: ${uploadedPath}`)

return NextResponse.json({
success: true,
output: {
name: uploaded.name ?? fileName,
path: uploaded.path ?? destinationPath,
size: uploaded.size ?? fileBuffer.length,
lastModified: uploaded.last_modified ?? null,
name: uploadedName,
path: uploadedPath,
size: uploadedSize,
lastModified,
},
})
} catch (error) {
Expand Down
Loading
Loading