Skip to content

build: installers for Windows and Linux, and a release built, tested and published on all three systems - #7

Merged
triggeredcode merged 11 commits into
mainfrom
packaging
Oct 11, 2026
Merged

triggeredcode merged 11 commits into
mainfrom
packaging

Conversation

@triggeredcode

@triggeredcode triggeredcode commented Oct 11, 2026 •

Copy link
Copy Markdown
Owner

Part 2 of Windows and Linux support (part 1, the app's own platform code, is merged).

What

  • Installers. Windows: a per-user installer (no administrator) and a portable .zip. Linux: an .AppImage and a .deb. The Mac files keep their kind and get the system in the name: Lucid-<version>-mac-arm64.dmg. All assets are Lucid-<version>-<os>-<arch>.<ext>.
  • Tectonic for every system. scripts/fetch-tectonic.mjs knows the release files for macOS (Apple Silicon and Intel), Linux (x64, arm64: static builds, nothing to install) and Windows (x64), each with its pinned SHA-256 (the digests GitHub lists), and fetches the one for the system it runs on.
  • The build guard now runs on every system: the build refuses an app that lacks a file it must carry.
  • Packaged-app tests on every system: the same five tests (the app carries what it needs; it opens, with the version from package.json, and makes a PDF with a diagram with nothing installed; the Help menu; a second launch; the agent bridge over the named pipe on Windows) run against the unpacked app, and then against what a person installs: the disk image on a Mac, the Windows installer run silently, the .deb installed with apt.
  • Release workflow: a matrix of macOS, Windows and Linux runners builds and tests; one job gathers the files, writes SHA256SUMS and creates the release. A pull request that touches packaging runs the same builds and tests without publishing (also runnable by hand).

Found by running it on all three systems (fixed here)

  • Windows showed the whole path in the note after saving ("Saved C:\Users\…\page.pdf"): the name was cut out of the path at /. It is now taken at either separator (baseName, tested). This is what made the first Windows PDF test look like a failure: the PDF was saved.
  • The missing-engine hint named Homebrew on every system; it is now Mac-only (elsewhere it points to Tectonic's page).
  • The first PDF of a packaged app gets ten minutes (it fetches about 430 typesetting files; on a Mac it took 78 s of the old 90 s allowance, and Linux was at file 426 when time ran out).
  • Failed packaged tests now print what the app and its window printed, and a PDF that was not saved leaves a screenshot.

Result of the last run: macOS, Windows and Linux all build, pass the packaged tests on the unpacked app, and pass them again on what a person installs (disk image, Windows installer run silently, .deb installed with apt).

Not done by this pull request

Signing: there is no Apple or Windows certificate, so macOS (Open Anyway) and Windows (SmartScreen: More info, Run anyway) ask once; the release notes say so. The README and the website are updated in the next pull request.

🤖 Generated with Claude Code

triggeredcode and others added 11 commits October 12, 2026 03:27
The fetch script knows the release files for macOS (Apple Silicon and Intel), Linux (x64 and arm64,
static builds) and Windows (x64), each with its SHA-256, and fetches the one for the system it runs on.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Windows gets an installer (per user, no administrator needed) and a portable .zip; Linux an AppImage
and a .deb; the Mac files keep their names with the system added (Lucid-<version>-mac-arm64.dmg).
pnpm dist builds the ones for the system it runs on, and the build still refuses an app that lacks a
file it must carry, on every system.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
They find the app by system (or by LUCID_APP, for an installed copy), use a minimal PATH of each
system's own folders, and on a Linux machine without a desktop take flags from LUCID_E2E_ARGS.
The version is read from package.json instead of being written in the test.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…and Linux

Each system builds on its own runner and tests the unpacked app and then what a person installs (the
disk image, the Windows installer run silently, the .deb installed with apt). One job gathers the files,
writes SHA256SUMS and creates the release. Run from a branch by hand, it builds and tests without publishing.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…runs keep their test results

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…akes to fetch the typesetting files

On a Mac it took 78 s of a 90 s allowance; the Windows and Linux runners need longer. A packaged app
that never made a PDF is exactly this case.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…, and a PDF that was not saved leaves a screenshot

A temporary workflow runs only the Windows PDF test, to find why it does not finish there.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…too, and the missing-engine hint fits the system

The notes 'Saved page.pdf' cut the name out of the path by splitting at '/', which Windows paths do not
use, so there they showed the whole path (the PDF was saved; a packaged-app test on Windows could not find
the note). The name is now taken at either separator. The hint for a missing PDF engine named Homebrew,
which is Mac-only; elsewhere it points to Tectonic's page. The temporary debugging workflow is removed.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…of a hook

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…p where it went

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@triggeredcode
triggeredcode merged commit 3c59bb3 into main Oct 11, 2026
8 checks passed
@triggeredcode
triggeredcode deleted the packaging branch October 12, 2026 15:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant