openjutsu
One-click character swap for videos: an open-source, local Higgsfield Genjutsu alternative built on ComfyUI and MiniMax H3, with FLUX.3 Klein relighting.
Plan church services, present lyrics, Scripture, slides and media, manage stage and NDI screens, and create sermon recaps with Kairo Presenter.
MediaGitHub @CodeLawdOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Repository information has not been collected yet.
No updates detected yet. GitHub releases will appear here.
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Electron desktop app for church presentation: live transcription, scripture detection and lookup, lyrics, documents and backgrounds — drawn full screen on a projector connected to the computer, no other software required.
Kairo runs connected screens and video devices directly and can send its rendered slides as independent NDI feeds for livestreaming and recording.
The next release retires the ProPresenter integration. Saved ProPresenter library, message and stage destinations are removed during startup; existing Kairo screen, video-device and NDI configurations remain. Previously imported songs remain in your library. If ProPresenter was your only destination, configure a Kairo screen, device or NDI feed before running your next service. Kairo does not automatically choose a display.
bun install # install deps (Bun 1.4.2)
bun run dev # dev mode with hot reload
bun run build # production build → out/
bun run lint # ESLint on .ts/.tsx
bun run typecheck # tsc check (node + web)
bun run test # renderer/shared tests (plain Node)
bun run test:main # main-process tests (run under Electron's Node ABI)
bun run test:main runs through the Electron binary because better-sqlite3 is
rebuilt for Electron's ABI; the same files fail to load under plain node.
Bundled public-domain translations (KJV, WEB, ASV, …) ship in resources/bible.db
and never expire. Copyrighted translations (NKJV, NIV, NLT, …) come from API.Bible.
The key is stored by the main process and is never exposed to the renderer.
safeStorage; if the OS offers no encryption, nothing is cached and the app
stays online-only.userData directory, separate
from the bundled bible.db. Its path, key, and ciphertext never reach the
renderer, and there is no export, bulk copy, or print path for licensed text.API.Bible requires cached content to be refreshed at least every 30 days. Cached verses at or past that age are not displayed; the app asks for a refresh instead of showing expired text. Refreshing replaces a chapter only after the new response parses successfully — a failed refresh never extends the expiry.
Settings → Scripture → Offline Bibles lists every API translation the cache knows about, with its status (not downloaded, partial, downloading, paused, downloaded, refresh required, no longer licensed, failed), chapter and verse counts, expiry date, and the publisher's copyright statement.
Whole-translation download stays disabled until the translation's API.Bible plan and publisher licence are confirmed to permit offline storage in this app. Until then the panel explains that the licence is unconfirmed and offers no download button. Passage-level caching (30 days) still applies either way.
There is deliberately no in-app toggle — an operator cannot grant the app a right the publisher has not. Approved Bible ids are provisioned one of two ways:
scripture.offlineDownloadBibleIds array in the
electron-store settings file (its path is logged at startup as
electron-store initialized). Add the API.Bible ids and restart.KAIRO_OFFLINE_BIBLE_IDS to a
comma-separated list of API.Bible ids before launching the app. Use this when
a build ships with rights already confirmed.Both sources are merged. Public-domain translations need no approval: any translation whose API.Bible copyright statement says "public domain" can be downloaded without being listed.
Refresh is gated on the same confirmed licence as download, since it re-fetches the whole cached translation.
Whenever cached text is served, the app re-checks once per app session that the key still grants that translation. If API.Bible refuses (401/403), the translation is marked no longer licensed, its cached text is deleted immediately, and it can no longer be searched. A network failure never revokes anything, so a fully offline service keeps working.
| OS | Arch | Minimum | Artifacts | Status |
|---|---|---|---|---|
| macOS | arm64 | macOS 11 | DMG + ZIP (ZIP feeds auto-update) | Existing target; final NDI 6 acceptance pending |
| macOS | x64 | macOS 11 | DMG + ZIP | Experimental; native acceptance pending |
| Windows | x64 | Windows 10 | signed NSIS installer | Experimental; native acceptance pending |
| Ubuntu | x64 | 22.04 | AppImage + deb | Experimental; native acceptance pending |
Windows ARM64, Linux ARM64, Flatpak/Snap, and a universal macOS build are not supported. The planned Linux support contract means Ubuntu 22.04/24.04 x64; AppImage may work elsewhere but that is best-effort and untested.
KAIRO_ENABLE_DECKLINK=1 bun run dev after building the
helper; see native/decklink/README.md). Physical picture and release packaging
qualification remain pending in Plan 007..desktop launcher. Without a supported app, PowerPoint import
reports “unavailable” — export the deck to PDF and import that instead.electron-store initialized lives in the same directory). Never paste API keys or tokens
from logs when reporting issues.Cloudflare website and API deployment: see CLOUDFLARE.md.