🚧 Glyx is pre-release software. APIs may change before v1.0. Get started →
Documentation
Guides
Packaging

Packaging

glyx package produces a platform-specific distributable from your app.

Quick start

# Package for the current platform
npx glyx-cli package
 
# Output is in dist/
# macOS:   dist/My App.dmg
# Windows: dist/My App Setup.exe
# Linux:   dist/my-app.AppImage

Build first, then package

package runs build automatically, but you can separate them:

npx glyx-cli build     # produces dist/bundle/
npx glyx-cli package   # wraps dist/bundle/ into an installer

Cross-compilation

Package for a different platform from your current OS:

npx glyx-cli package --target windows
npx glyx-cli package --target macos
npx glyx-cli package --target linux
⚠️

Cross-compilation requires Docker on non-macOS hosts for the macOS target (due to code signing requirements). Windows and Linux cross-compile without Docker.

Output formats

macOS

FormatFlagNotes
.dmg--format dmgDefault. Drag-to-Applications installer.
.app--format appBare app bundle.
.pkg--format pkgmacOS package installer.

Windows

FormatFlagNotes
NSIS installer (.exe)--format nsisDefault. Start menu + uninstaller.
MSI--format msiEnterprise-friendly.
Portable (.exe)--format portableNo installer, single executable.

Linux

FormatFlagNotes
AppImage--format appimageDefault. Runs on any distro.
.deb--format debDebian/Ubuntu.
.rpm--format rpmFedora/RHEL.

Code signing

macOS

# Requires Apple Developer account and Xcode Command Line Tools
npx glyx-cli package --sign --identity "Developer ID Application: Your Name (TEAMID)"
 
# Notarize after signing (required for distribution outside App Store)
npx glyx-cli notarize \
  --apple-id you@example.com \
  --team-id YOURTEAMID \
  --password "@keychain:AC_PASSWORD"

Windows

npx glyx-cli package --sign --cert path/to/cert.pfx --cert-password yourpassword

App icon

Glyx generates all required icon sizes from a single source image. Place a 1024×1024 PNG at:

assets/icon.png

Glyx generates:

  • icon.icns (macOS — all sizes 16px–1024px)
  • icon.ico (Windows — 16px, 32px, 48px, 256px)
  • AppImage icon (Linux — 512px)

Configure package output

In glyx.config.ts:

import { defineConfig } from '@glyx-dev/config';
 
export default defineConfig({
  app: {
    version:     '1.0.0',
    publisher:   'Your Name',
    description: 'A great app',
  },
  window: {
    title:  'My Notes',
    width:  1280,
    height: 800,
  },
});

The CLI runs bun run glyx.config.ts at build time and reads the JSON output. If you prefer plain JSON, glyx.config.json also works and has the same shape.

CI/CD example (GitHub Actions)

name: Release
 
on:
  push:
    tags: ['v*']
 
jobs:
  package:
    strategy:
      matrix:
        os: [macos-14, windows-latest, ubuntu-22.04]
    runs-on: ${{ matrix.os }}
 
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with: { node-version: '20' }
      - run: npm ci
      - run: npx glyx-cli package
        env:
          SIGN_CERT: ${{ secrets.SIGN_CERT }}
          SIGN_PASSWORD: ${{ secrets.SIGN_PASSWORD }}
      - uses: actions/upload-artifact@v4
        with:
          name: dist-${{ matrix.os }}
          path: dist/