Skip to content
GitHub
Get started →

Install on Framer

Framer sites ship with a Custom Code panel under Site Settings. Paste the snippet, publish, done.

Steps

  1. Open Site Settings

    Framer project → Site Settings (top left) → General → scroll to Custom Code.

  2. Paste in End of <body> tag

    <script src="https://spelo.ai/spelo.js" data-site-id="YOUR_SITE_ID" async></script>
  3. Publish

    Click Publish in the top right → Publish update.

  4. Verify

    Open the live site URL (your-site.framer.app or your custom domain). Orb appears at the bottom.

Framer-specific notes

  • Free plan — custom code is available on the free plan for framer.app subdomains.
  • Custom domain — requires at least the Mini paid plan.
  • Framer Canvas vs. Sites — this is for Framer Sites. Framer Canvas (collaborative design canvases) does not run custom code.
  • Code overrides — you can also install Spelo via a custom Code Override component if you want React-level control, but the Custom Code panel is simpler and recommended.

Using a React Code Component (advanced)

If you want to tie the widget’s lifecycle to Framer’s React tree (e.g. only mount on specific breakpoints), you can create a Code Component:

SpeloWidget.tsx
import { useEffect } from 'react'
export default function SpeloWidget() {
useEffect(() => {
if (document.querySelector('[data-spelo]')) return
const s = document.createElement('script')
s.src = 'https://spelo.ai/spelo.js'
s.setAttribute('data-site-id', 'YOUR_SITE_ID')
s.setAttribute('data-spelo', 'true')
s.async = true
document.body.appendChild(s)
}, [])
return null
}

Drop the component on a shared layout frame. Framer’s Fast Refresh works fine with it.

Verify

DevTools → Network on the published site → filter for spelo.js. 200 from spelo.ai means you’re good.

Troubleshooting

  • Orb appears in Framer preview but not live → you didn’t publish after saving Custom Code. Publish → Publish update.
  • Orb appears but clicking does nothing → check that the domain configured in the Spelo dashboard matches your Framer URL. See CORS errors.