Skip to main content

The embed is blank / nothing renders

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.
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.
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:
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. a setTimeout), 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 theme in EPIS.init() only apply at mount time. If your app’s own theme changes later (a dark-mode toggle, for example), you must call EPIS.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.