Skip to content

Releases: RobyRew/TopPresenter

TopPresenter 0.1.0-alpha.14

25 Jun 21:11

Choose a tag to compare

Pre-release

⚡ 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

22 Jun 02:26

Choose a tag to compare

Pre-release

⚡ 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

22 Jun 22:31

Choose a tag to compare

Pre-release

⚡ 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

22 Jun 20:12

Choose a tag to compare

Pre-release

⚡ 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 own ModelContext(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

22 Jun 13:05

Choose a tag to compare

Pre-release

⚡ 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

22 Jun 05:37

Choose a tag to compare

Pre-release

⚡ 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

21 Jun 21:33

Choose a tag to compare

Pre-release

⚡ 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

19 Jun 13:13

Choose a tag to compare

Pre-release

⚡ 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

18 Jun 08:12

Choose a tag to compare

Pre-release

⚡ 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

17 Jun 22:13

Choose a tag to compare

Pre-release

⚡ 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