Releases: RobyRew/TopPresenter
TopPresenter 0.1.0-alpha.14
⚡ Automatic Alpha Build
Version: 0.1.0-alpha.14
Tag: v0.1.0-alpha.14
Commit: e8fd5657572353852d6f4969b0b84b87da7a6168
Branch: main
Built: 2026-06-25T23:05:23+02:00
⚠️ This is an unsigned build. To open on macOS:
Right-click the app → Open → Open (bypass Gatekeeper).
Or run:xattr -cr TopPresenter.app
Commit message: Add chords/transpose, history sidebar, verified songs & editor revamp
Songs & chords: Acorduri casetá (chord-over-lyric chart with independent chord font, live transpose + capo + recommended keys, display-only), combinable repeat markers (bracket + count, all paths), verified flag (GOAT round-trip + badge/filter/search), sort header chips, editor change-log + Renunță revert + section-tap preview, slide PREVIEW/delete, Edit button + song facts + import source.
App: presentation history moved into the sidebar; pinned bottom utility group (History/Settings/Account) + local Profile/Preferences; Bible tab title shows version + reference; fix duplicate presentation output windows (dedupe + restoration disabled).
128 unit tests pass.
Full Changelog: v0.1.0-alpha.13...v0.1.0-alpha.14
TopPresenter 0.1.0-alpha.9
⚡ Automatic Alpha Build
Version: 0.1.0-alpha.9
Tag: v0.1.0-alpha.9
Commit: 62114829108c7f1ebfd55bec0a90ecb44b62a982
Branch: main
Built: 2026-06-22T04:21:18+02:00
⚠️ This is an unsigned build. To open on macOS:
Right-click the app → Open → Open (bypass Gatekeeper).
Or run:xattr -cr TopPresenter.app
Commit message: Add cantaricrestine.ro + resursecrestine acorduri song scrapers
- cantaricrestine-scraper.mjs: JSON-API crawl of all ~9.5k "Cântări Creștine în
PowerPoint" songs into TopPresenter Song JSON, organized by book, downloading
each .ppt/.pptx, with a _completeness.json (lyrics vs PowerPoint-only). The
token is a random anti-bot value; disk-full-resilient (JSON always written). - cantaricrestine-scraper.user.js: in-page book/all bundle export via the API.
- resursecrestine-acorduri-scraper.mjs: scrapes the /acorduri chords section
(~4.2k songs) into complete songs-with-chords — chord-over-lyric parsed into
positional {sym,pos}, chorus detection, author, inferred key, plus a matchKey
to dedupe against the lyrics-only /cantece songs. - Tests: ScrapedSongsImportTests imports both sources through the TopPresenter
importer and asserts chords/key/author/songbook/_extensions survive + re-export. - README: documents both scrapers and the per-source change-detection table.
Scraped corpora stay git-ignored (kept local, distributed separately).
Full Changelog: v0.1.0-alpha.8...v0.1.0-alpha.9
TopPresenter 0.1.0-alpha.13
⚡ Automatic Alpha Build
Version: 0.1.0-alpha.13
Tag: v0.1.0-alpha.13
Commit: 0733423745458a9070a1023ac6689e395943999b
Branch: main
Built: 2026-06-23T00:27:04+02:00
⚠️ This is an unsigned build. To open on macOS:
Right-click the app → Open → Open (bypass Gatekeeper).
Or run:xattr -cr TopPresenter.app
Commit message: CI: bump deprecated GitHub Actions off Node 20
actions/checkout@v4 → v5, actions/upload-artifact@v4 → v5,
actions/download-artifact@v4 → v5 (run on Node 24; clears the Node 20
deprecation warning). softprops/action-gh-release@v2 is already current.
Full Changelog: v0.1.0-alpha.12...v0.1.0-alpha.13
TopPresenter 0.1.0-alpha.12
⚡ Automatic Alpha Build
Version: 0.1.0-alpha.12
Tag: v0.1.0-alpha.12
Commit: 2579c3b5b0d9c34787293e43bcb563ef34e4c0ba
Branch: main
Built: 2026-06-22T22:05:33+02:00
⚠️ This is an unsigned build. To open on macOS:
Right-click the app → Open → Open (bypass Gatekeeper).
Or run:xattr -cr TopPresenter.app
Commit message: Fix CI build (HistoryStore mainContext) + move scrapers into scrapers/
- HistoryStore read
container.mainContext, which is @MainActor-isolated in
Xcode 16's SwiftData — a hard build error on CI (local Xcode 26 allowed it).
Use our ownModelContext(container)instead; valid in every SwiftData version
and never main-actor-bound. - Move all scraper scripts into scrapers/ (eBiblia, melodia, resursecrestine +
acorduri, cantaricrestine, worshiptogether — .mjs + .user.js); update README
links accordingly.
Full Changelog: v0.1.0-alpha.11...v0.1.0-alpha.12
TopPresenter 0.1.0-alpha.11
⚡ Automatic Alpha Build
Version: 0.1.0-alpha.11
Tag: v0.1.0-alpha.11
Commit: 18bcbd38604768a39ea7f79a2fc6dfc3b99b3086
Branch: main
Built: 2026-06-22T15:00:25+02:00
⚠️ This is an unsigned build. To open on macOS:
Right-click the app → Open → Open (bypass Gatekeeper).
Or run:xattr -cr TopPresenter.app
Commit message: Add worshiptogether.com song scraper (EN/ES/PT)
- worshiptogether-scraper.mjs: enumerates the per-language sitemaps
(sitemap-{en,es,pt}.xml, ~4.5k songs) and parses each song's ChordPro markup
into positional chords {sym,pos} with multilingual section detection
(verse/verso, chorus/coro, bridge/ponte, pre-chorus/pre-coro) and play-order
arrangement (REPEAT/REPETIR → section reuse, honoring the number). Captures the
richest metadata of any source: CCLI #, original + recommended keys, BPM,
tempo, themes, scripture references, writers/copyright — under
_extensions.worshipTogether. Organized into en/ es/ pt/ folders. Resumable. - worshiptogether-scraper.user.js: exports the current song from a logged-in
session by reading the rendered ChordPro DOM. - Tests: ScrapedSongsImportTests/importsWorshipTogetherSong verifies the output
imports into TopPresenter with chords/key/CCLI/themes/arrangement intact. - README: documents the scraper + adds it to the change-detection table
(sitemap → both new + edited detection).
For personal/congregational use; projecting lyrics still needs a CCLI license.
Scraped corpora stay git-ignored.
Full Changelog: v0.1.0-alpha.10...v0.1.0-alpha.11
TopPresenter 0.1.0-alpha.10
⚡ Automatic Alpha Build
Version: 0.1.0-alpha.10
Tag: v0.1.0-alpha.10
Commit: 0d3a933f909499e4cb872001e41d013569170287
Branch: main
Built: 2026-06-22T07:33:04+02:00
⚠️ This is an unsigned build. To open on macOS:
Right-click the app → Open → Open (bypass Gatekeeper).
Or run:xattr -cr TopPresenter.app
Commit message: melodia scraper: decode XML entities in sitemap slugs
Sitemap slugs encode & as & (e.g. "…-Keith-&-Kristyn-Getty"). The
literal & 404s — the real URL uses a bare & — so ~29 songs were silently
dropped on the full crawl. Decode entities when enumerating; recovered them.
Full Changelog: v0.1.0-alpha.9...v0.1.0-alpha.10
TopPresenter 0.1.0-alpha.8
⚡ Automatic Alpha Build
Version: 0.1.0-alpha.8
Tag: v0.1.0-alpha.8
Commit: 52976460ea5ef825a66c4a95ce809a79282d5954
Branch: main
Built: 2026-06-21T23:28:19+02:00
⚠️ This is an unsigned build. To open on macOS:
Right-click the app → Open → Open (bypass Gatekeeper).
Or run:xattr -cr TopPresenter.app
Commit message: Add melodia.ro song scrapers, interlinear display, import & language fixes
Scrapers
- melodia-scraper.mjs: sitemap-enumerated, resumable export of melodia.ro songs
to TopPresenter Song JSON — inline chords at exact positions, key, tempo (BPM),
time signature, authors (Muzica/Versuri), copyright, composed year, keyword
tags, de-duplicated sections + play-order arrangement, Anatomia Evangheliei,
available keys and a computed per-instrument capo, under song._extensions.melodia. - melodia-scraper.user.js: same output plus melodia's exact React-rendered
guitar/ukulele capo charts (shape, capo, frets, fingers, barre).
Song schema
- Round-trip song _extensions through importer -> DB -> exporter so source-specific
extras survive losslessly.
Bible
- Interlinear display: original word + gloss + Strong's + morphology, theme-styled,
with a live quick-toggle (InterlinearText + ContentOptions + output/preview). - Import-time language auto-correction: a module whose declared language
contradicts its verse-text script (Greek/Hebrew/Cyrillic) is filed under the
correct language group. - eBiblia-Scraper.mjs: detect the real language (metadata name + verse script)
instead of hardcoding "ro"; fix interlinear gloss extraction.
Import UX
- Folder import no longer freezes: only TopPresenter-supported file types are
scanned and the recursive walk runs off the main thread; open panels restrict
to supported types.
UI
- Tabs default to "Type - Name" titles (Bible/Songs/Media).
- Bible shows a single "select a module" splash when none is selected, instead of
empty Books/Chapters/Verses columns.
Tests: melodia round-trip, language detection, interlinear runs/columns/options.
Scraped corpora (Bibles, songs) kept local via .gitignore.
Full Changelog: v0.1.0-alpha.7...v0.1.0-alpha.8
TopPresenter 0.1.0-alpha.7
⚡ Automatic Alpha Build
Version: 0.1.0-alpha.7
Tag: v0.1.0-alpha.7
Commit: 7052a38865a46acde81106a4eabe64e68d5711d9
Branch: main
Built: 2026-06-19T15:10:11+02:00
⚠️ This is an unsigned build. To open on macOS:
Right-click the app → Open → Open (bypass Gatekeeper).
Or run:xattr -cr TopPresenter.app
Commit message: Add ResurseCrestine song scrapers + Node eBiblia exporter
Tooling that exports to the GOAT TopPresenter JSON formats:
- resursecrestine-scraper.mjs — Node CLI that crawls resursecrestine.ro/cantece
(~28k songs) into one TopPresenter Song JSON per song; resumable, rate-limited.
Parses .strofa sections + an older plain-text (resized-text) fallback layout,
/: :/ repeat markers, author/themes/album/bible-ref. - resursecrestine-scraper.user.js — Tampermonkey port with the same parse logic
(verified byte-identical); on-site panel, emits per-letter bundles. - eBiblia-Scraper.mjs — dependency-free Node port of the eBiblia userscript using
the public API (verse data + metadata), regex HTML helpers, red-letter / Strong's
/ interlinear / footnotes / cross-refs / headings; one Bible JSON per translation.
Full Changelog: v0.1.0-alpha.6...v0.1.0-alpha.7
TopPresenter 0.1.0-alpha.6
⚡ Automatic Alpha Build
Version: 0.1.0-alpha.6
Tag: v0.1.0-alpha.6
Commit: a8664aeaaf87eca8558da0f620e142f512294e48
Branch: main
Built: 2026-06-18T10:08:20+02:00
⚠️ This is an unsigned build. To open on macOS:
Right-click the app → Open → Open (bypass Gatekeeper).
Or run:xattr -cr TopPresenter.app
Commit message: Make lean Bible + song importers full GOAT supersets
Every importer now maps its format's complete feature set into the rich
GOAT model, so bibles and songs from any source export feature-rich —
not just the eBiblia/TopPresenter-native path.
Bible importers:
- OSIS: <title>→headings, →cross-refs, other
→footnotes,→words-of-Christ runs,
→Strong's + morph, →added words, ;
rights/identifier/language→module metadata. - USFM: \f/\fe→footnotes, \x→cross-refs, \w …|strong="…" x-morph="…"→
Strong's + morphology (on top of existing \wj/\add/\nd runs and \s headings). - MySword (GBF): full rich parser — →headings, →footnotes,
→cross-refs, →red-letter, →added words, /→Strong's
(attached to the preceding word), →morphology, + module rights.
Song importers:
- OpenLyrics: →songbook name/number, →
arrangement, →notes, typed →words/music/translation. - OpenSong: , →aliases, <time_sig>, <user1..3>→notes.
- ChordPro: {time}→time signature, {album}/{year}→notes.
Adds round-trip extraction tests for every enriched path.
Full Changelog: v0.1.0-alpha.5...v0.1.0-alpha.6
TopPresenter 0.1.0-alpha.5
⚡ Automatic Alpha Build
Version: 0.1.0-alpha.5
Tag: v0.1.0-alpha.5
Commit: 886e7489cec7ce637fdf0d94cb3b87c80dcf9750
Branch: main
Built: 2026-06-18T00:10:19+02:00
⚠️ This is an unsigned build. To open on macOS:
Right-click the app → Open → Open (bypass Gatekeeper).
Or run:xattr -cr TopPresenter.app
Commit message: GOAT Bible export pass: Zefania enrichment + 1.0.0 versions + book round-trip
- Song + Bible JSON now emit schemaVersion AND exporterVersion "1.0.0"
(importers still accept older 2.0.0 files). - Zefania importer rewritten to extract its full feature set into the GOAT model: -> headings, -> footnotes, -> cross-references, red <STYLE> -> words-of-Christ runs, -> Strong's numbers, -> module copyright/year/language (was plain-text only).
- Round-trip two dropped book fields: BibleBook.abbreviationEnglish + expectedChapters
(model + import protocol + TopPresenter importer + exporter).
Full Changelog: v0.1.0-alpha.4...v0.1.0-alpha.5