{"id":50139312,"url":"https://github.com/verse-mate/verse-mate-visuals","last_synced_at":"2026-05-24T00:05:34.539Z","repository":{"id":358906369,"uuid":"1243627176","full_name":"verse-mate/verse-mate-visuals","owner":"verse-mate","description":"VerseMate per-book visual aids registry — BibleProject posters + videos, Precept Austin charts, Insight for Living Swindoll charts, VerseMate originals. Generated; consumed by verse-mate-web and verse-mate-mobile.","archived":false,"fork":false,"pushed_at":"2026-05-19T15:43:01.000Z","size":43,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-19T17:22:05.928Z","etag":null,"topics":["bible","bible-study","data-package","expo","react-native","typescript","versemate","vite"],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/verse-mate.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-19T14:10:45.000Z","updated_at":"2026-05-19T15:52:48.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/verse-mate/verse-mate-visuals","commit_stats":null,"previous_names":["verse-mate/verse-mate-visuals"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/verse-mate/verse-mate-visuals","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/verse-mate%2Fverse-mate-visuals","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/verse-mate%2Fverse-mate-visuals/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/verse-mate%2Fverse-mate-visuals/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/verse-mate%2Fverse-mate-visuals/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/verse-mate","download_url":"https://codeload.github.com/verse-mate/verse-mate-visuals/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/verse-mate%2Fverse-mate-visuals/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33416317,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-23T22:14:44.296Z","status":"ssl_error","status_checked_at":"2026-05-23T22:14:43.778Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bible","bible-study","data-package","expo","react-native","typescript","versemate","vite"],"created_at":"2026-05-24T00:05:33.161Z","updated_at":"2026-05-24T00:05:34.524Z","avatar_url":"https://github.com/verse-mate.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# @versemate/visuals\n\nPer-book visual aids for the VerseMate Bible reading apps — BibleProject _Read Scripture_ posters, BibleProject animated overview videos (chapter-aware), Precept Austin commentary charts (book- and chapter-scoped), Insight for Living's Swindoll structural charts, and VerseMate originals.\n\nSingle source of truth, shared by **[verse-mate-web](https://github.com/verse-mate/verse-mate-web)** (Vite SPA) and **[verse-mate-mobile](https://github.com/verse-mate/verse-mate-mobile)** (Expo React Native).\n\n\u003e ⚠️ **Generated package — do not edit `src/registry.ts` by hand.** The registry is produced by [`scripts/visuals-ingest/build_manifests.py`](https://github.com/verse-mate/verse-mate-web/blob/main/scripts/visuals-ingest/build_manifests.py) in verse-mate-web. See [CONTRIBUTING.md](./CONTRIBUTING.md) for the regeneration workflow.\n\n## Coverage\n\n- **66 books** (all canonical OT + NT)\n- **~2,000 curated images** after audit + cross-book MD5 dedup\n- All Precept Austin charts attributed CC BY-SA 4.0 (BibleProject) / \"Insight for Living Ministries\" (Swindoll)\n\n## Exports\n\n| Export | Type | What it does |\n|---|---|---|\n| `VISUALS_REGISTRY` | `Record\u003cstring, VisualsManifest\u003e` | Full per-book manifest, keyed by URL slug (`'genesis'`, `'song-of-solomon'`) |\n| `BOOKS_WITH_VISUALS` | `ReadonlySet\u003cstring\u003e` | Slug set for tab-visibility gating — importable without pulling in the full registry |\n| `getVisualsForBook(slug)` | `(slug: string) =\u003e VisualsManifest \\| null` | Lookup helper, case-insensitive slug |\n| `getCardsForChapter(manifest, chapter)` | `(m, c) =\u003e VisualCard[]` | Filters cards to a specific chapter (book-level cards always pass; chapter-scoped Precept charts only show on their chapters) |\n| `getVideoForChapter(manifest, chapter)` | `(m, c) =\u003e VideoEntry \\| null` | Picks the BibleProject overview whose `chapterStart`/`chapterEnd` covers the current chapter (e.g. Genesis 5 → Part 1, Genesis 25 → Part 2) |\n| `absolutizeVisualUrl(path, origin?)` | `(string, string?) =\u003e string` | Turns a root-relative registry path into a fully-qualified URL. Idempotent. Mobile uses this; web doesn't need to. |\n| `VISUALS_ORIGIN` | `string` | Default origin (`https://app.versemate.org`) used by `absolutizeVisualUrl` when no override is passed |\n\nTypes: `VisualCard`, `VideoEntry`, `VisualsManifest` (also re-exported from `./types`).\n\n## Tech stack\n\n| Tool | Why |\n|---|---|\n| TypeScript (ES2022, Bundler module resolution) | Single-file TS module, tree-shaken by both Vite and Metro |\n| No runtime dependencies | Pure data + helpers; consumers bring their own image/video infra |\n| No build step | TS source is the published artifact (matches `@versemate/studies`) |\n\n## Project structure\n\n```\n.\n├── src/\n│   ├── types.ts         # VisualCard / VideoEntry / VisualsManifest\n│   ├── index.ts         # Public API + lookup helpers + URL absolutizer\n│   └── registry.ts      # GENERATED — 66 books × ~2,000 cards (~514 KB)\n├── package.json         # @versemate/visuals@0.1.0, private, TS-source main\n├── tsconfig.json        # strict, ES2022, Bundler resolution\n├── README.md\n├── CONTRIBUTING.md      # Regeneration workflow\n└── CHANGELOG.md\n```\n\n## Getting started\n\n### Consuming the package\n\n```sh\n# Web (already wired)\n# Web reads its own local src/data/visuals/registry.ts — no install needed.\n\n# Mobile\ncd verse-mate-mobile\nbun install   # picks up \"@versemate/visuals\": \"github:verse-mate/verse-mate-visuals#\u003csha\u003e\"\n```\n\n### Using the API\n\n```ts\nimport {\n  getVisualsForBook,\n  getCardsForChapter,\n  getVideoForChapter,\n  absolutizeVisualUrl,\n  BOOKS_WITH_VISUALS,\n} from '@versemate/visuals';\n\n// Tab-visibility gate — keeps the registry off the critical render path.\nif (BOOKS_WITH_VISUALS.has(slug)) {\n  // show Visuals tab\n}\n\nconst manifest = getVisualsForBook('genesis');   // null if no entry\nconst cards   = getCardsForChapter(manifest, 1); // book-level + ch.1-scoped\nconst video   = getVideoForChapter(manifest, 1); // BibleProject overview for ch.1\n\n// React Native: prefix root-relative paths before \u003cImage source={{ uri }} /\u003e\nconst uri = absolutizeVisualUrl(cards[0].thumb);\n// → https://app.versemate.org/visuals/genesis/precept_chapter_1.png\n\n// Override origin for staging\nconst stagingUri = absolutizeVisualUrl(cards[0].thumb, 'https://staging.versemate.org');\n```\n\n## Path convention\n\nImage URLs in the registry are **root-relative** (`/visuals/\u003cslug\u003e/\u003cfile\u003e`). The web app serves them directly from its `public/` directory. Mobile prefixes them with `VISUALS_ORIGIN` via `absolutizeVisualUrl()` at render time.\n\nThis keeps a single source of truth and lets the web app's CDN remain canonical for both clients.\n\n## How updates flow\n\n```\nverse-mate-web/public/visuals/\u003cslug\u003e/*\n                │\n                │ probe + curate + ingest + dedup\n                ▼\nverse-mate-web/scripts/visuals-ingest/build_manifests.py\n                │\n                ├──→ verse-mate-web/src/data/visuals/registry.ts        (web's local copy)\n                ├──→ verse-mate-web/src/data/visuals/booksWithVisuals.ts (light slug-set)\n                └──→ verse-mate-visuals/src/registry.ts                  (this package)\n                          │\n                          │ commit + push, bump SHA in mobile package.json\n                          ▼\n                  verse-mate-mobile (consumes via Metro)\n```\n\nSee [CONTRIBUTING.md](./CONTRIBUTING.md) for the full regeneration workflow.\n\n## Why a separate package?\n\nMirrors `@versemate/studies`: shared TypeScript data, two clients (web + mobile), tree-shaken by both bundlers, pinned by GitHub SHA so changes are explicit and reviewable. The registry is ~514 KB — small enough to ship as a single file with no per-chapter dynamic splitting (unlike Studies, which has to split per-chapter to stay under Cloudflare Workers' 25 MiB per-file limit at full coverage).\n\nIf the registry grows past a few MB, the natural next step is JSON + API-served fetches; the package's shape stays canonical regardless of transport.\n\n## Related repos\n\n- [verse-mate-web](https://github.com/verse-mate/verse-mate-web) — Vite SPA, owns the ingest pipeline\n- [verse-mate-mobile](https://github.com/verse-mate/verse-mate-mobile) — Expo React Native app, consumes via Metro\n- [verse-mate-studies](https://github.com/verse-mate/verse-mate-studies) — sibling pattern: same convention, different data (inductive Bible studies)\n\n## License\n\nPrivate — see consuming repos' license terms. Curated content credits:\n\n- BibleProject Read Scripture posters + overview videos — CC BY-SA 4.0\n- Precept Austin commentary charts — Bruce Hurt / Precept Ministries\n- Swindoll structural charts — Insight for Living Ministries\n- VerseMate originals — © VerseMate\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fverse-mate%2Fverse-mate-visuals","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fverse-mate%2Fverse-mate-visuals","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fverse-mate%2Fverse-mate-visuals/lists"}