Widget Installation Guide

Learn how to add Today's Bible Reading or Sunday Readings to your website in just a few minutes.

Try it

Live demo

See exactly what the widget looks like before you install. Change the tradition, language, theme, and size — the preview updates instantly.

Catholic
Light

Catholic · Daily reading · Light

Protestant
Dark

Protestant · Sunday readings · Dark

Orthodox
Light

Orthodox · Daily reading · Light

Want to try every option?

The interactive builder lets you mix tradition, language, theme, size, and toggles — then copies the embed code for you.

Open the builder

Quick start

The five-minute install

The fastest path: paste the snippet, save, done. Pick your platform below for a step-by-step guide.

Recommended — script embed

Auto-resizing iframe. Works on every modern site.

<script src="https://sundaybiblereadings.com/widgets/embed.js" async></script>
<div data-sbr-widget="daily-reading"
     data-locale="auto"
     data-tradition="catholic"
     data-theme="light"
     data-size="medium"></div>

Alternative — iframe embed

Use this when third-party scripts aren't allowed.

<iframe
  src="https://sundaybiblereadings.com/widgets/embed/daily-reading?locale=auto&tradition=catholic&theme=light&size=medium"
  width="100%"
  height="320"
  loading="lazy"
  style="border:0;overflow:hidden;width:100%;"
  title="Sunday Bible Readings"></iframe>

Installation guides

Step-by-step for every platform

Pick your CMS or framework. Every guide includes copyable code, common mistakes, and a success checklist.

WordPress

Easy
2 min

Works on every WordPress plan that allows custom HTML — Gutenberg, Elementor, and the Classic Editor are all supported.

Steps

  1. Edit the post, page, or widget area where you want the reading to appear.
  2. In the block editor click the "+" and choose "Custom HTML". In Elementor, drag in an "HTML" widget. In the Classic Editor switch to the "Text" tab.
  3. Paste the snippet below.
  4. Save / publish. The widget appears immediately on the front-end.

For sidebars and footers, use Appearance → Widgets → Custom HTML.

If your theme requires footer scripts, place the <script> in your theme's "Footer scripts" field and the <div data-sbr-widget="..."> wherever you want the widget to appear.

Example code

<script src="https://sundaybiblereadings.com/widgets/embed.js" async></script>
<div data-sbr-widget="daily-reading"
     data-locale="auto"
     data-tradition="catholic"
     data-theme="light"
     data-size="medium"></div>

Common mistakes

  • Pasting into a regular paragraph block — WordPress will escape the HTML.
  • Caching plugins (WP Rocket, W3 Total Cache) serving an older page — purge the cache after publishing.
  • Security plugins stripping <script> tags — allow scripts from sundaybiblereadings.com.

Success checklist

  • Custom HTML / Code block used (not paragraph).
  • Cache purged.
  • Widget visible on the front-end (not just the editor).

Squarespace

Easy
2 min

Squarespace 7.1 supports widgets through the "Code" block. Paid plans can also inject the script site-wide.

Steps

  1. Edit the page where you want the widget.
  2. Click "+" and insert a "Code" block.
  3. Make sure "Display Source" is OFF and the block type is HTML.
  4. Paste the snippet and save.

To use the widget on every page, go to Settings → Advanced → Code Injection → Footer and paste only the <script> tag once. Then drop the <div data-sbr-widget="..."> on individual pages.

Example code

<script src="https://sundaybiblereadings.com/widgets/embed.js" async></script>
<div data-sbr-widget="daily-reading"
     data-locale="auto"
     data-tradition="catholic"
     data-theme="light"
     data-size="medium"></div>

Common mistakes

  • Using the free plan, which disables Code blocks.
  • Leaving "Display Source" enabled — that prints the HTML as text.
  • Wrapping the snippet inside a Markdown block.

Success checklist

  • Page saved and published.
  • Code block contains HTML, not plain text.
  • Mobile preview still shows the widget.

Wix

Easy
3 min

Use the iframe embed for the most consistent result. The Wix Editor sandboxes third-party scripts.

Steps

  1. In the Wix Editor click Add (+) → Embed Code → Embed HTML.
  2. Choose "Code" and paste the iframe snippet below.
  3. Resize the placeholder to roughly the size you want.
  4. Publish.

On Wix Business / VIP you can use the script embed via Settings → Custom Code → Add Custom Code → Body end.

Example code

<iframe
  src="https://sundaybiblereadings.com/widgets/embed/daily-reading?locale=auto&tradition=catholic&theme=light&size=medium"
  width="100%"
  height="320"
  loading="lazy"
  style="border:0;overflow:hidden;width:100%;"
  title="Sunday Bible Readings"></iframe>

Common mistakes

  • Choosing "Website Address" instead of "Code".
  • Leaving the iframe too short — set its height to 320px or larger.
  • Forgetting to publish (Save is not enough).

Success checklist

  • Embed HTML element added, not just Save.
  • Iframe height >= 320px on desktop.
  • Site published.

Joomla

Medium
4 min

Use a Custom HTML module or an article in HTML mode. Make sure the editor and text filter don't strip scripts.

Steps

  1. Go to Extensions → Modules → New → Custom.
  2. In the text editor click the "Toggle Editor" button to enter raw HTML mode.
  3. Paste the snippet, assign the module to a position, and save.
  4. Check System → Global Configuration → Text Filters and set the user group that posts the widget to Filter Type: No Filtering.

Example code

<script src="https://sundaybiblereadings.com/widgets/embed.js" async></script>
<div data-sbr-widget="daily-reading"
     data-locale="auto"
     data-tradition="catholic"
     data-theme="light"
     data-size="medium"></div>

Common mistakes

  • TinyMCE stripping <script> tags — toggle the editor off before pasting.
  • Default text filter blacklisting iframe / script — adjust per user group.
  • Module assigned to the wrong template position.

Success checklist

  • Module published and assigned to a visible position.
  • Text filter does not strip scripts for the user group.
  • Widget visible on the configured pages.

Drupal

Medium
5 min

Use a Custom Block with the Full HTML text format. The Full HTML format must be enabled for the user role placing the widget.

Steps

  1. Go to Structure → Block layout → Custom block library → Add custom block.
  2. Set Text format to "Full HTML".
  3. Paste the snippet into the body and save.
  4. Place the block in any region you want.

Example code

<script src="https://sundaybiblereadings.com/widgets/embed.js" async></script>
<div data-sbr-widget="daily-reading"
     data-locale="auto"
     data-tradition="catholic"
     data-theme="light"
     data-size="medium"></div>

Common mistakes

  • Using Basic HTML — it strips iframe and script tags.
  • Forgetting to place the block after creating it.
  • Aggressive CSP modules blocking sundaybiblereadings.com.

Success checklist

  • Full HTML format used.
  • Block placed in a visible region.
  • Cache rebuilt (admin/config/development/performance).

Static HTML

Easy
1 min

Drop the snippet anywhere inside <body>. Works with plain HTML, GitHub Pages, Netlify, Cloudflare Pages, Vercel static exports, anything.

Steps

  1. Open your HTML file in any editor.
  2. Paste the snippet anywhere inside <body>.
  3. Save and upload.

Example code

<!doctype html>
<html lang="en">
  <body>
    <script src="https://sundaybiblereadings.com/widgets/embed.js" async></script>
    <div data-sbr-widget="daily-reading"
         data-locale="auto"
         data-tradition="catholic"
         data-theme="light"
         data-size="medium"></div>
  </body>
</html>

Common mistakes

  • Pasting inside <head> — the script needs the DOM to exist.
  • Hosting over plain HTTP — mixed-content rules block the widget.

Success checklist

  • Snippet inside <body>.
  • Site served over HTTPS.
  • Page reloaded after upload.

React

Easy
3 min

Render the marker <div> in any component and load the embed script once via useEffect so it doesn't run during SSR.

Steps

  1. Create a BibleWidget component (snippet below).
  2. Import it anywhere in your app.
  3. Make sure the script is added only once, even if the component mounts multiple times.

Example code

import { useEffect } from "react";

export function BibleWidget() {
  useEffect(() => {
    const id = "sbr-widget-loader";
    if (document.getElementById(id)) return;
    const s = document.createElement("script");
    s.id = id;
    s.src = "https://sundaybiblereadings.com/widgets/embed.js";
    s.async = true;
    document.body.appendChild(s);
  }, []);

  return (
    <div
      data-sbr-widget="daily-reading"
      data-locale="auto"
      data-tradition="catholic"
      data-theme="auto"
      data-size="medium"
    />
  );
}

Common mistakes

  • Calling document.createElement during SSR — wrap in useEffect.
  • Adding the script multiple times — check for an existing id first.
  • Strict CSP missing https://sundaybiblereadings.com in frame-src/script-src.

Success checklist

  • Script appended exactly once.
  • Component renders the marker div.
  • No hydration warnings in the console.

Next.js

Easy
3 min

Use the built-in next/script component with strategy="afterInteractive". Works in both the App Router (mark the component "use client") and the Pages Router.

Steps

  1. Create a Client Component (App Router) or any component (Pages Router) that wraps next/script.
  2. Render the marker div alongside the Script tag.
  3. Import and place the component wherever you want the widget.

Example code

// app/components/BibleWidget.tsx — App Router (Client Component)
"use client";
import Script from "next/script";

export default function BibleWidget() {
  return (
    <>
      <Script
        src="https://sundaybiblereadings.com/widgets/embed.js"
        strategy="afterInteractive"
      />
      <div
        data-sbr-widget="sunday-readings"
        data-locale="auto"
        data-tradition="catholic"
        data-theme="auto"
        data-size="medium"
      />
    </>
  );
}

Common mistakes

  • Forgetting the "use client" directive in the App Router.
  • Using strategy="beforeInteractive" — the widget needs the DOM to mount.
  • Importing the file at the page level without marking it client.

Success checklist

  • Component marked as client (App Router).
  • Script renders only once per page.
  • Production build still mounts the widget.

Vue / Nuxt

Easy
3 min

Same pattern as React: append the script tag inside onMounted (or mounted() in Options API) and render the marker template.

Steps

  1. Create a single-file component (snippet below).
  2. Import it anywhere in your app.
  3. In Nuxt, use a <ClientOnly> wrapper to skip SSR if you prefer.

Example code

<!-- BibleWidget.vue -->
<template>
  <div
    data-sbr-widget="daily-reading"
    data-locale="auto"
    data-tradition="catholic"
    data-theme="auto"
    data-size="medium"
  />
</template>

<script setup>
import { onMounted } from "vue";
onMounted(() => {
  if (document.getElementById("sbr-widget-loader")) return;
  const s = document.createElement("script");
  s.id = "sbr-widget-loader";
  s.src = "https://sundaybiblereadings.com/widgets/embed.js";
  s.async = true;
  document.body.appendChild(s);
});
</script>

Common mistakes

  • Loading the script in SSR context — use onMounted.
  • Mounting multiple copies of the script tag.

Success checklist

  • Script id check prevents duplicates.
  • Widget renders on a hard refresh.
  • Works with Nuxt's universal mode.

Customize

Every option, explained

All customization happens via data-* attributes on the marker div (or query parameters in the iframe src).

AttributeValuesNotes
data-sbr-widget
daily-readingsunday-readings
Required. Picks which widget to render.
data-locale
autoenesptfritdepl
"auto" detects the visitor's browser language with English fallback.
data-tradition
catholicprotestantorthodox
Controls scripture references and link destinations.
data-theme
lightdarkauto
"auto" matches the visitor's system color scheme.
data-size
smallmediumlarge
Affects typography scale and initial iframe height.
data-logo
10
Show the book icon header.
data-desc
10
Show the short reflection / description.

Embed examples

Script embed vs iframe embed

Both are free. Pick whichever fits your CMS.

Script embed (recommended)

Tiny loader script discovers every data-sbr-widget on the page, injects a responsive iframe, and auto-resizes it so there is zero layout shift.

Recommended for: WordPress, Squarespace (paid), static HTML, React, Next.js, Vue.

Iframe embed

A single <iframe> with a fixed initial height. No JavaScript required on your side.

Recommended for: Wix, locked-down Joomla / Drupal, strict CSP environments, emails (where iframes are stripped, link to the canonical page instead).

Compatibility

Browser support

All evergreen browsers from the last two major versions.

Chrome
Firefox
Safari
Edge
Brave

IE 11 is not supported. Mobile Safari, Chrome Android, and Firefox Android are all supported.

Troubleshooting

Fix common issues

Search by symptom. If something isn't here, contact us — we'll add it.

Best practices

Where to place the widget

    Place Today's Reading on the homepage, near the top.
    Place Sunday Readings near worship information or service times.
    Leave generous spacing around the widget so it doesn't crowd other content.
    Avoid hidden tabs and collapsed accordions — the widget can't measure its height there.
    Use one widget above the fold and one below when both are relevant.
    Test on desktop and mobile before announcing it.

Accessibility

  • Keyboard-navigable links and CTA buttons.
  • Semantic HTML (article, header, footer).
  • Color contrast tested for WCAG AA in both themes.
  • Works with screen readers — title and meta are announced.

Performance

  • Loader script is small and async.
  • Iframe is lazy-loaded (loading="lazy").
  • Auto-resizes via postMessage — no layout shift.
  • Responsive by default; no extra CSS required.

Attribution

  • Widgets are completely free.
  • The "Powered by Sunday Bible Readings" footer must stay visible.
  • The link goes to the appropriate canonical page.
  • Removing or hiding the attribution is not permitted.

Updates

Set it and forget it

Widgets always display the latest readings. You don't need to redeploy your site, refresh anything, or update the snippet. Every day the widget pulls the current day's reading; every week it pulls the nearest Sunday's readings.

FAQ

Frequently asked questions

Support

Need help?