Keep full quizzes for 1984 and Spalovač mrtvol; other titles get catalog metadata stubs across Swift, GTK, and content.json.
Co-authored-by: Cursor <cursoragent@cursor.com>
Maturita.xcworkspace points at ios/Maturita.xcodeproj; opening the
project from the repository root otherwise resolves Maturita/ to the
compiled desktop binary on a case-insensitive disk.
Co-authored-by: Cursor <cursoragent@cursor.com>
CI stopped publishing when the iOS job outgrew the macos-14 Xcode, so
the builds branch froze; the iOS job now runs on macos-26 and publish
keeps the previous package for any platform that failed, with
VERSION-<platform> markers naming the commit each package came from.
APKs are signed with a committed sideload key instead of the runner's
random debug key, so Android accepts them as updates, and the version
code grows with every CI run. The updater explains the unknown-sources
step, keeps the Update button after errors and checks the download is
this app.
Co-authored-by: Cursor <cursoragent@cursor.com>
The build script now extracts content.json into derived data and copies
it into the app bundle, so no generated file is referenced from the
project or written into the repository. Signing is explicit: ad hoc for
the simulator, automatic with your own team for a device.
Co-authored-by: Cursor <cursoragent@cursor.com>
Android moves to Material 3 (navigation bar, app bars, list items,
bottom sheets, pager) with a real back stack. iOS hides the tab bar in
exercises so the bottom action is reachable, aligns content, and uses
system colours so themes and dark mode work. Both pick a readable
accent tint. Desktop keeps the VLSM table inside the window and gives
statistics the same header rhythm as other pages.
Co-authored-by: Cursor <cursoragent@cursor.com>
The swap helper now detaches from the app, downloads start when a newer VERSION appears, and checks keep running so a just-published build is not missed.
Co-authored-by: Cursor <cursoragent@cursor.com>
Lesson and exercise targets were built in a temporary buffer, so choosing one sometimes opened nothing.
Co-authored-by: Cursor <cursoragent@cursor.com>
raw.githubusercontent.com caches branch-named files, so the installer was serving a stale zip after CI rewrote builds.
Co-authored-by: Cursor <cursoragent@cursor.com>
Releases and version numbers are gone. CI now rebuilds all three platforms
on every change to main and commits the packages to the `builds` branch,
so what anyone downloads is the current state of the repository. The
branch is rewritten from scratch each time rather than added to, so the
repository keeps one copy of the packages instead of a ~70 MB set per
commit.
Without tags there is no version to compare, so a build carries the
commit it was made from and the branch carries a VERSION file naming the
same commit. The updater fetches those few bytes and treats any
difference as being behind; commits are not ordered, and the branch only
ever holds the current build.
The installers fetch from the branch over raw.githubusercontent.com for
the same reason.
Co-authored-by: Cursor <cursoragent@cursor.com>
Every unlocked unit carried the "current" class, so three nodes lit up
identically and none of them pointed anywhere. Mark only the first
unlocked unit that is not finished; the rest stay open but quiet.
The finish node filled its whole circle with chequers, which read as the
placeholder pattern for a missing image rather than as a flag, most of
all in light mode. Give it the plain face the other locked nodes have and
put the chequers in a small badge where they show a padlock.
Co-authored-by: Cursor <cursoragent@cursor.com>
Each installer carries no application of its own and resolves
/releases/latest/download/ at the moment it runs, so the file never goes
stale and the same download keeps working across future releases.
macOS installs into /Applications, falling back to the user's own folder
when that is not writable, and clears the quarantine flag the unsigned
build would otherwise trip over. Windows extracts over any existing
install rather than replacing the folder, so the progress files kept
inside it survive, and adds a Start menu entry. Linux drops the AppImage
in ~/Applications with a desktop entry and its icon.
Publish the macOS one zipped, because a release asset loses its
executable bit and a .command needs one to be double-clicked.
The .cmd also had to be excluded from the *.cmd ignore rule, which comes
from the kernel section of the template and targets build artifacts.
Co-authored-by: Cursor <cursoragent@cursor.com>