Install on Framer
Framer sites ship with a Custom Code panel under Site Settings. Paste the snippet, publish, done.
Steps
-
Open Site Settings
Framer project → Site Settings (top left) → General → scroll to Custom Code.
-
Paste in End of
<body>tag<script src="https://spelo.ai/spelo.js" data-site-id="YOUR_SITE_ID" async></script> -
Publish
Click Publish in the top right → Publish update.
-
Verify
Open the live site URL (
your-site.framer.appor your custom domain). Orb appears at the bottom.
Framer-specific notes
- Free plan — custom code is available on the free plan for
framer.appsubdomains. - 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:
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.