The embed is blank / nothing renders
You opened the page via file:// instead of a local server
You opened the page via file:// instead of a local server
Browsers block cross-origin iframes on pages with an opaque origin, which
file:// always has. Serve the page over http:// or https:// instead — see Local Development.The container div has 0 height
The container div has 0 height
EpisBox fills
100% of its container. If the container’s height resolves to 0 — no explicit height, and no sized parent — the iframe is there but invisible. Set an explicit height (600px) or make sure every ancestor up to a sized element also has height.Your page's own Content-Security-Policy blocks the iframe
Your page's own Content-Security-Policy blocks the iframe
If your app sets its own
Content-Security-Policy header with a frame-src or child-src directive, it needs to include https://embed.pastpaperlm.com, or the browser will block the iframe from your side — separately from anything EpisBox does:EPIS.init() was never called, or was called before the SDK loaded
EPIS.init() was never called, or was called before the SDK loaded
If you’re loading the SDK with
<script src="..." defer> and calling EPIS.init() from a separate inline <script> in the <head>, the inline script may run before defer finishes. Wrap your init call in DOMContentLoaded (see the Quickstart), or move your script tag after the SDK tag and drop defer on your own script.EPIS.init() requires a clientId error in the console
clientId is a required, non-empty string — EPIS.init() throws synchronously if it’s missing. This is usually a leftover placeholder from an AI-agent integration ('your-client-id' is not special-cased). Any string works — see Security for why it doesn’t need to be “real.”
The auth popup opens, then immediately closes / never opens
- Popup blocked by the browser — this happens if
EPIS.init()/mount isn’t triggered directly by a user gesture (click, tap). If you auto-mount on page load and the user hasn’t interacted with the page yet, most browsers allow it; if you’re triggering re-auth programmatically after some delay (e.g. asetTimeout), the browser may treat it as an unrequested popup and block it. Trigger auth-requiring actions from direct click handlers where possible. - Ad blockers / strict tracking-protection extensions — some block third-party popups outright. Ask affected users to allowlist
pastpaperlm.com.
Theme changes aren’t taking effect
- Colors/fonts passed to
themeinEPIS.init()only apply at mount time. If your app’s own theme changes later (a dark-mode toggle, for example), you must callEPIS.updateTheme(...)—init()only runs once. See Theming: syncing theme changes. - Custom fonts must be a real Google Fonts family name, or
'system'. A typo’d font name silently falls back to the default rather than erroring.
Events (.on('message', ...), etc.) never fire
Make sure .on() is registered on the same EPIS/window.EPIS reference returned by .init(), and that it’s called after init(), not before the script has loaded. See Events for the full list and payload shapes.
Still stuck?
- Local Development — if this is specifically a local/dev-only issue
- Security — for anything auth- or token-related
- Email [email protected] with your
clientId, the domain you’re integrating on, and a browser console screenshot — that’s usually enough to diagnose in one reply.