Door43 spelled 32 major languages with two letters, so 2.87bn people saw none of it

The Door43 fetcher kept only 3-letter codes and dropped 2-letter ones on the grounds
that turning one into ISO 639-3 would be a guess. The caution was right and the
conclusion was wrong: ISO 639-3 publishes the correspondence itself, in the Part1
column of iso-639-3.tab. The file is now fetched rather than transcribed, so it cannot
go stale, and the run aborts if it comes back with fewer than 150 pairs.

Measured cost of the old behaviour: 32 languages spoken by 2,576 pins - Bengali,
Hindi, Spanish, Amharic, Hausa, English and more - carried Scripture and film but no
Door43 resource at all, purely over a spelling. Door43 reach goes from 169 codes and
1,051 pins to 208 codes and 3,627 pins, 3.58bn people. Table rows 226 -> 391.

ONE EXCLUSION, AND IT IS LOAD-BEARING: a tag with an '-x-' private-use subtag is
skipped on this path. Door43 publishes el-x-koine, Koine Greek, whose base 'el' maps
to 'ell' - Modern Greek, which 13 people groups on this map speak. Folding it in would
have handed those 13 groups a Koine Greek text as though it were their own language.
Region and script subtags (es-419, pt-br, sr-latn, ur-deva, zh-hant) are not private
use and are the same language, so they still fold to the base. Verified: ell is absent
from the index.

Fixed a self-erasing bug in the previous change. Dropping a dead link removed it from
the corpus, so the next verification run never saw it, so the next build put it back -
measured, both links came straight back and REAL URL returned to 8,922. The
verification table is now a RECORD, not a snapshot: it carries forward every URL a
previous run proved broken and keeps re-testing them, which is also what lets a link
the publisher later repairs come back on its own. Proven by dropping them and
re-running: "re-testing 2 URL(s) a previous run recorded broken", still broken, build
now stable across two full cycles.

Clause K's 95% coverage floor is gone, because that floor is exactly how this hid: two
missing URLs out of 3,768 is 99.9%. Every shipped URL must now appear in the record.
Poison self-test 11/11.

All 3,768 links re-verified: 3,761 live, 5 uncheckable, 2 broken and dropped.

Also fixed the chip overflow this change caused - a Door43 entry can be "Aligned Bible
(translationCore-Create-BCS) - Door43 - Portions of both Testaments", which ran off the
edge of a 330px sheet unreadable. Long chips wrap now. Screenshot read: Hindi shows
seven verified Door43 resources, all inside the panel, where it read "none found".
This commit is contained in:
doxa-maps-88655c70 2026-09-24 10:27:16 +00:00
parent 101653e3fd
commit 2bf4001d7e
24 changed files with 19648 additions and 13533 deletions

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -190,10 +190,14 @@ if (verif && verif.links) {
if (v.za && v.za.u) shipped.add(v.za.u)
for (const d of v.d || []) if (d.u) shipped.add(d.u)
}
const known = [...shipped].filter((u) => V[u])
const cover = shipped.size ? known.length / shipped.size : 0
if (cover < 0.95) {
add('K', `only ${known.length}/${shipped.size} shipped URL(s) (${(100 * cover).toFixed(1)}%) appear in the verification table — below the 95% floor`)
// EVERY shipped URL must be in the record, not 95% of them. The floor was set at 95%
// and that is exactly how two known-dead links got back in: dropping them removed them
// from the corpus, the next verification run never saw them, and 2 missing out of 3,768
// is 99.9% — comfortably above a 95% floor and completely wrong. "Verify before you
// ship it" does not have a tolerance.
const unknownToRecord = [...shipped].filter((u) => !V[u])
if (unknownToRecord.length) {
add('K', `${unknownToRecord.length} shipped URL(s) appear in no verification record (e.g. ${unknownToRecord[0]}) — run scripts/verify-gospel-links.mjs`)
}
const dead = [...shipped].filter((u) => V[u] && V[u].state === 'broken')
if (dead.length) add('K', `${dead.length} shipped URL(s) are recorded BROKEN and must not ship (e.g. ${dead[0]})`)
@ -229,4 +233,4 @@ console.log(' C reach recounted off the pins D every resourced code is
console.log(' E no table URL the pins do not hold F pin tiers match their code\'s URLs')
console.log(' G no plain-http URL H no story set typed as Scripture')
console.log(' I row type agrees with its host J approximate never reads as confirmed')
console.log(' K links are verified, and none known-broken ships')
console.log(' K every shipped link is verified, and none known-broken ships')

View file

@ -775,8 +775,13 @@ useShadowStyles(
'padding:1px 5px;border-radius:4px;background:rgba(0,0,0,.09);margin-left:5px;vertical-align:1px}' +
'.is-dark .gm-code{background:rgba(255,255,255,.12)}' +
'.gm-chips{display:flex;flex-wrap:wrap;gap:5px;margin-top:5px}' +
'.gm-chip{font-size:10px;padding:2px 7px;border-radius:999px;white-space:nowrap;' +
// nowrap keeps the short status chips ("Film - link checked") on one line, but a Door43
// entry can be "Aligned Bible (translationCore-Create-BCS) - Door43 - Portions of both",
// which simply ran off the edge of a 330px sheet and could not be read at all. Long chips
// wrap instead; max-width keeps them inside the panel either way.
'.gm-chip{font-size:10px;padding:2px 7px;border-radius:999px;white-space:nowrap;max-width:100%;' +
'background:rgba(0,0,0,.06);text-decoration:none;color:inherit;border:1px solid transparent}' +
'.gm-chip.wrap{white-space:normal;overflow-wrap:anywhere;line-height:1.35}' +
'.is-dark .gm-chip{background:rgba(255,255,255,.08)}' +
'.gm-chip.ok{background:rgba(16,185,129,.16);border-color:rgba(16,185,129,.35)}' +
'.gm-chip.bad{background:rgba(180,35,24,.16);border-color:rgba(180,35,24,.38)}' +
@ -976,7 +981,7 @@ useShadowStyles(
<!-- Door43 entries are real published repos, so they ship as real links. The
SUBJECT is shown verbatim: "Open Bible Stories" is 50 illustrated narratives,
not a Bible, and calling it Scripture would be the one lie that matters here. -->
<a v-for="d in selectedGroup.door43" :key="d.u" class="gm-chip ok"
<a v-for="d in selectedGroup.door43" :key="d.u" class="gm-chip ok wrap"
:href="d.u" target="_blank" rel="noopener noreferrer"
:title="d.s + ' — published on Door43 (unfoldingWord), open licence'">
{{ /^Open Bible Stories/.test(d.s) ? d.s.replace('Open Bible Stories', 'Bible Stories') : d.s }} · Door43<template v-if="d.sc"> · {{ d.sc }}</template>

View file

@ -19,10 +19,27 @@
* telling a reader they have Scripture when they have a story set is the dishonesty that
* matters most on this map.
*
* CODES: only 3-letter ISO 639-3 is kept. Door43 also emits 2-letter (639-1) and
* region-suffixed tags ('ar-xzn'); the suffix is stripped, and a 2-letter tag is DROPPED
* rather than guessed into a 3-letter code. A wrong language match ships a real link to the
* wrong people — worse than no link.
* CODES: 3-letter ISO 639-3 is kept as-is, and region/script suffixes are stripped
* ('ar-xzn' -> 'ara'). Door43 ALSO labels its biggest languages with 2-letter 639-1 tags,
* and those used to be dropped here on the grounds that turning one into a 3-letter code
* would be a guess. The caution was right and the conclusion was wrong: ISO 639-3 itself
* publishes the correspondence, in the Part1 column of iso-639-3.tab, so this is a
* standards-defined mapping and not an inference. That file is fetched below rather than
* transcribed, so it cannot quietly go stale.
*
* MEASURED COST OF THE OLD BEHAVIOUR: 32 languages spoken by 2,576 people-group pins —
* 2.87bn people, including Bengali, Hindi, Spanish, Amharic, Hausa and English — carried
* Scripture and film but NO Door43 resource, purely because Door43 spelled their code with
* two letters instead of three.
*
* ONE EXCLUSION, AND IT IS LOAD-BEARING: a tag carrying an '-x-' PRIVATE-USE subtag is
* skipped on this path. Private use is where a publisher marks something the standard does
* not cover, and that is exactly where the base code stops being the right language.
* Door43 publishes 'el-x-koine' — Koine Greek. Its base 'el' maps to 'ell', Modern Greek,
* which 13 people groups on this map speak. Folding it in would have shipped a Koine Greek
* text to 13 groups as though it were their own language. Region and script subtags
* ('es-419', 'pt-br', 'sr-latn', 'ur-deva', 'zh-hant') are NOT private use and are the same
* language, so they still fold to the base.
*/
import { writeFileSync } from 'node:fs'
import { resolve, dirname } from 'node:path'
@ -33,6 +50,39 @@ const OUT = resolve(HERE, '../../..', 'data/tables/door43-index.json')
const UA = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Safari/537.36'
const SUBJECTS = ['Open Bible Stories', 'Bible', 'Aligned Bible']
const API = 'https://git.door43.org/api/v1/catalog/search'
const ISO_TAB = 'https://iso639-3.sil.org/sites/iso639-3/files/downloads/iso-639-3.tab'
// ISO 639-1 -> ISO 639-3, straight from SIL's own table. Macrolanguage rows are kept: the
// resource genuinely IS in that macrolanguage, and a macro code no pin speaks simply joins
// to nothing rather than to the wrong people.
const isoRes = await fetch(ISO_TAB, { headers: { 'User-Agent': UA } })
if (!isoRes.ok) throw new Error(`iso-639-3.tab: HTTP ${isoRes.status}`)
const P1 = {}
for (const line of (await isoRes.text()).trim().split('\n').slice(1)) {
const f = line.split('\t')
const id = (f[0] || '').trim()
const part1 = (f[3] || '').trim()
if (id.length === 3 && part1.length === 2) P1[part1] = id
}
if (Object.keys(P1).length < 150) {
throw new Error(`iso-639-3.tab gave only ${Object.keys(P1).length} Part1 pairs — refusing to run on a truncated table`)
}
console.log(`iso-639-3.tab: ${Object.keys(P1).length} ISO 639-1 -> 639-3 pairs`)
let viaPart1 = 0
let skippedPrivate = 0
/** Resolve a Door43 language tag to an ISO 639-3 code, or '' if it must not be used. */
const toIso3 = (tag) => {
const t = String(tag || '')
const base = t.split('-')[0]
if (base.length === 3) return base
if (base.length !== 2) return ''
// '-x-' is private use: the base code is not reliably the same language. See the header.
if (/-x-/i.test(t)) { skippedPrivate++; return '' }
const m = P1[base]
if (m) viaPart1++
return m || ''
}
// ISO 639-3 RESERVES these: und = undetermined, mul = multiple, mis = uncoded, zxx =
// no linguistic content, and qaa-qtz are private-use. They are not languages, so a
@ -74,8 +124,8 @@ for (const subject of SUBJECTS) {
const { data } = await res.json()
sources.push({ subject, url, entries: data.length })
for (const r of data) {
const code = String(r.language || '').split('-')[0]
if (code.length !== 3 || isSpecialCode(code)) continue
const code = toIso3(r.language)
if (!code || isSpecialCode(code)) continue
const href = r.repo?.html_url
if (!href) continue
const cur = index[code] || (index[code] = { title: r.language_title || '', items: [] })
@ -100,3 +150,4 @@ const out = {
}
writeFileSync(OUT, JSON.stringify(out, null, 1))
console.log(`\n${Object.keys(index).length} ISO 639-3 codes -> ${OUT}`)
console.log(`${viaPart1} entr(ies) joined through an ISO 639-1 tag; ${skippedPrivate} private-use tag(s) skipped`)

View file

@ -54,6 +54,17 @@
* green; a positive control that starts failing is how a network fault gets written down as
* "every link is broken".
*
* ═══ THE TABLE IS A RECORD, NOT A SNAPSHOT ══════════════════════════════════════════════
* A dead link is dropped from the index by the builder, which removes it from the corpus —
* so a verifier that only ever checks "what is shipped today" forgets it, and the NEXT build
* finds nothing recorded against it and puts it straight back. Measured: both links this
* pass killed were restored by the very next build. The drop was self-erasing, and the
* coverage floor could not see it because two unrecorded URLs out of 3,768 is 99.9%.
*
* So the corpus checked here is the shipped URLs PLUS every URL a previous run recorded
* broken. Those keep being re-tested, which is also what lets a link the publisher later
* fixes come back on its own rather than staying condemned forever.
*
* WHAT `verified` MEANS HERE, EXACTLY: the URL answered 200 to a HEAD that followed
* redirects. It does NOT mean anyone read the page, and it does not re-check that the link
* points at the right LANGUAGE — that join is established when the index is built, from the
@ -141,6 +152,17 @@ for (const v of Object.values(pins.codes)) {
if (v.za && v.za.u) urls.add(v.za.u)
for (const d of v.d || []) if (d.u) urls.add(d.u)
}
// Carry forward everything a previous run proved dead, so dropping a link cannot erase the
// evidence that it is dead. See the header.
let carried = 0
try {
const prev = JSON.parse(readFileSync(OUT, 'utf8'))
for (const [u, r] of Object.entries(prev.links || {})) {
if (r && r.state === 'broken' && !urls.has(u)) { urls.add(u); carried++ }
}
} catch { /* no previous table: nothing to carry */ }
if (carried) console.log(`VERIFY-LINKS: re-testing ${carried} URL(s) a previous run recorded broken, though nothing ships them now.`)
let list = [...urls]
if (LIMIT) list = list.slice(0, LIMIT)
if (!list.length) {
@ -187,7 +209,7 @@ writeFileSync(
unknown: 'could not be checked — never read as either working or broken',
},
controls,
summary: { checked: list.length, ...byState },
summary: { checked: list.length, carriedForward: carried, ...byState },
byHost,
},
links,

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -26,7 +26,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <gospel-resources-map> custom element. -->
<script src="../gospel-resources.js" integrity="sha384-O7KDP8HK7zJKDP03y1dsCWmSYuz+f4VI3ucefjjz5pYQGuHP/Q3Et4lwBAVrOmxx" crossorigin="anonymous"></script>
<script src="../gospel-resources.js" integrity="sha384-PUYDrkuiWM04qmZPfVvPZMFL+G5e7jGKiX6c08iNbf1kLc6vRkyGLhmzw90CRBX8" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -26,7 +26,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <gospel-resources-map> custom element. -->
<script src="../gospel-resources.js" integrity="sha384-O7KDP8HK7zJKDP03y1dsCWmSYuz+f4VI3ucefjjz5pYQGuHP/Q3Et4lwBAVrOmxx" crossorigin="anonymous"></script>
<script src="../gospel-resources.js" integrity="sha384-PUYDrkuiWM04qmZPfVvPZMFL+G5e7jGKiX6c08iNbf1kLc6vRkyGLhmzw90CRBX8" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -40,7 +40,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <gospel-resources-map> custom element. -->
<script src="../gospel-resources.js" integrity="sha384-O7KDP8HK7zJKDP03y1dsCWmSYuz+f4VI3ucefjjz5pYQGuHP/Q3Et4lwBAVrOmxx" crossorigin="anonymous"></script>
<script src="../gospel-resources.js" integrity="sha384-PUYDrkuiWM04qmZPfVvPZMFL+G5e7jGKiX6c08iNbf1kLc6vRkyGLhmzw90CRBX8" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

File diff suppressed because one or more lines are too long

View file

@ -26,7 +26,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <gospel-resources-map> custom element. -->
<script src="../gospel-resources.js" integrity="sha384-O7KDP8HK7zJKDP03y1dsCWmSYuz+f4VI3ucefjjz5pYQGuHP/Q3Et4lwBAVrOmxx" crossorigin="anonymous"></script>
<script src="../gospel-resources.js" integrity="sha384-PUYDrkuiWM04qmZPfVvPZMFL+G5e7jGKiX6c08iNbf1kLc6vRkyGLhmzw90CRBX8" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

View file

@ -29,7 +29,7 @@
<script>window.MAP_APP_API_URL = "https://pray.doxa.life";</script>
<!-- Bundle IIFE — registers the <gospel-resources-map> custom element. -->
<script src="../gospel-resources.js" integrity="sha384-O7KDP8HK7zJKDP03y1dsCWmSYuz+f4VI3ucefjjz5pYQGuHP/Q3Et4lwBAVrOmxx" crossorigin="anonymous"></script>
<script src="../gospel-resources.js" integrity="sha384-PUYDrkuiWM04qmZPfVvPZMFL+G5e7jGKiX6c08iNbf1kLc6vRkyGLhmzw90CRBX8" crossorigin="anonymous"></script>
<script>
// Mapbox token resolution — the A3 ladder, in precedence order:

File diff suppressed because one or more lines are too long

View file

@ -556,7 +556,7 @@
"bundle": "gospel-resources",
"scriptUrl": "./gospel-resources/gospel-resources.js",
"output": "doxa-maps/gospel-resources/gospel-resources.js",
"integrity": "sha384-O7KDP8HK7zJKDP03y1dsCWmSYuz+f4VI3ucefjjz5pYQGuHP/Q3Et4lwBAVrOmxx",
"integrity": "sha384-PUYDrkuiWM04qmZPfVvPZMFL+G5e7jGKiX6c08iNbf1kLc6vRkyGLhmzw90CRBX8",
"elements": [
"gospel-resources-map"
],
@ -576,7 +576,7 @@
"scriptUrl": "./gospel-resources/gospel-resources.js",
"embed": {
"iframe": "<iframe src=\"./gospel-resources/charts/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-O7KDP8HK7zJKDP03y1dsCWmSYuz+f4VI3ucefjjz5pYQGuHP/Q3Et4lwBAVrOmxx\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"charts\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-PUYDrkuiWM04qmZPfVvPZMFL+G5e7jGKiX6c08iNbf1kLc6vRkyGLhmzw90CRBX8\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"charts\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
}
},
{
@ -590,7 +590,7 @@
"scriptUrl": "./gospel-resources/gospel-resources.js",
"embed": {
"iframe": "<iframe src=\"./gospel-resources/data-tables/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-O7KDP8HK7zJKDP03y1dsCWmSYuz+f4VI3ucefjjz5pYQGuHP/Q3Et4lwBAVrOmxx\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"data-tables\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-PUYDrkuiWM04qmZPfVvPZMFL+G5e7jGKiX6c08iNbf1kLc6vRkyGLhmzw90CRBX8\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"data-tables\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
}
},
{
@ -604,7 +604,7 @@
"scriptUrl": "./gospel-resources/gospel-resources.js",
"embed": {
"iframe": "<iframe src=\"./gospel-resources/gospel-dashboard/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-O7KDP8HK7zJKDP03y1dsCWmSYuz+f4VI3ucefjjz5pYQGuHP/Q3Et4lwBAVrOmxx\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"gospel-dashboard\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-PUYDrkuiWM04qmZPfVvPZMFL+G5e7jGKiX6c08iNbf1kLc6vRkyGLhmzw90CRBX8\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"gospel-dashboard\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
}
},
{
@ -618,7 +618,7 @@
"scriptUrl": "./gospel-resources/gospel-resources.js",
"embed": {
"iframe": "<iframe src=\"./gospel-resources/resources-list/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-O7KDP8HK7zJKDP03y1dsCWmSYuz+f4VI3ucefjjz5pYQGuHP/Q3Et4lwBAVrOmxx\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"resources-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-PUYDrkuiWM04qmZPfVvPZMFL+G5e7jGKiX6c08iNbf1kLc6vRkyGLhmzw90CRBX8\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"resources-list\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
}
},
{
@ -632,7 +632,7 @@
"scriptUrl": "./gospel-resources/gospel-resources.js",
"embed": {
"iframe": "<iframe src=\"./gospel-resources/resources-map/index.html?utm_source=YOUR_SOURCE\" width=\"100%\" height=\"600\" style=\"border:none;border-radius:12px;\" allowfullscreen></iframe>",
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-O7KDP8HK7zJKDP03y1dsCWmSYuz+f4VI3ucefjjz5pYQGuHP/Q3Et4lwBAVrOmxx\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"resources-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
"script": "<script>window.MAP_APP_API_URL=\"https://pray.doxa.life\";</script>\n<script src=\"./gospel-resources/gospel-resources.js\" integrity=\"sha384-PUYDrkuiWM04qmZPfVvPZMFL+G5e7jGKiX6c08iNbf1kLc6vRkyGLhmzw90CRBX8\" crossorigin=\"anonymous\"></script>\n<gospel-resources-map profile-config='{\"profile\":\"resources-map\",\"tk\":\"YOUR_MAPBOX_TOKEN\",\"utmSource\":\"YOUR_SOURCE\",\"assetsBase\":\"YOUR_TREE_URL/assets\"}'></gospel-resources-map>"
}
}
]