on:
  push: {}
  pull_request: {}
  workflow_dispatch: {}

name: Test

jobs:
  required:
    name: "Required Checks: Test"
    runs-on: namespace-profile-ghostty-xsm
    needs:
      - build-bench
      - build-dist
      - build-flatpak
      - build-linux
      - build-linux-libghostty
      - build-nix
      - build-snap
      - build-macos
      - build-macos-matrix
      - build-windows
      - flatpak-check-zig-cache
      - test
      - test-gtk
      - test-gtk-ng
      - test-sentry-linux
      - test-macos
      - pinact
      - prettier
      - alejandra
      - typos
      - shellcheck
      - translations
      - blueprint-compiler
      - test-pkg-linux
      - test-debian-13
      - valgrind
      - zig-fmt
      - flatpak
    steps:
      - id: status
        name: Determine status
        run: |
          results=$(tr -d '\n' <<< '${{ toJSON(needs.*.result) }}')
          if ! grep -q -v -E '(failure|cancelled)' <<< "$results"; then
            result="failed"
          else
            result="success"
          fi
          {
            echo "result=${result}"
            echo "results=${results}"
          } | tee -a "$GITHUB_OUTPUT"
      - if: always() && steps.status.outputs.result != 'success'
        name: Check for failed status
        run: |
          echo "One or more required build workflows failed: ${{ steps.status.outputs.results }}"
          exit 1

  build-bench:
    # We build benchmarks on large because it uses ReleaseFast
    runs-on: namespace-profile-ghostty-lg
    needs: test
    env:
      ZIG_LOCAL_CACHE_DIR: /zig/local-cache
      ZIG_GLOBAL_CACHE_DIR: /zig/global-cache
    steps:
      - name: Checkout code
        uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0

      - name: Setup Cache
        uses: namespacelabs/nscloud-cache-action@305bfa7ea980a858d511af4899414a84847c7991 # v1.2.16
        with:
          path: |
            /nix
            /zig

      # Install Nix and use that to run our tests so our environment matches exactly.
      - uses: cachix/install-nix-action@fc6e360bedc9ee72d75e701397f0bb30dce77568 # v31.5.2
        with:
          nix_path: nixpkgs=channel:nixos-unstable
      - uses: cachix/cachix-action@0fc020193b5a1fa3ac4575aa3a7d3aa6a35435ad # v16
        with:
          name: ghostty
          authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}"

      - name: Build Benchmarks
        run: nix develop -c zig build -Demit-bench

  build-flatpak:
    strategy:
      fail-fast: false
    runs-on: namespace-profile-ghostty-sm
    needs: test
    env:
      ZIG_LOCAL_CACHE_DIR: /zig/local-cache
      ZIG_GLOBAL_CACHE_DIR: /zig/global-cache
    steps:
      - name: Checkout code
        uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0

      - name: Setup Cache
        uses: namespacelabs/nscloud-cache-action@305bfa7ea980a858d511af4899414a84847c7991 # v1.2.16
        with:
          path: |
            /nix
            /zig

      # Install Nix and use that to run our tests so our environment matches exactly.
      - uses: cachix/install-nix-action@fc6e360bedc9ee72d75e701397f0bb30dce77568 # v31.5.2
        with:
          nix_path: nixpkgs=channel:nixos-unstable
      - uses: cachix/cachix-action@0fc020193b5a1fa3ac4575aa3a7d3aa6a35435ad # v16
        with:
          name: ghostty
          authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}"

      - name: Build with Flatpak
        run: |
          nix develop -c \
            zig build \
            -Dflatpak=true

  build-linux:
    strategy:
      fail-fast: false
      matrix:
        os: [namespace-profile-ghostty-md, namespace-profile-ghostty-md-arm64]
    runs-on: ${{ matrix.os }}
    needs: test
    env:
      ZIG_LOCAL_CACHE_DIR: /zig/local-cache
      ZIG_GLOBAL_CACHE_DIR: /zig/global-cache
    steps:
      - name: Checkout code
        uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0

      - name: Setup Cache
        uses: namespacelabs/nscloud-cache-action@305bfa7ea980a858d511af4899414a84847c7991 # v1.2.16
        with:
          path: |
            /nix
            /zig

      # Install Nix and use that to run our tests so our environment matches exactly.
      - uses: cachix/install-nix-action@fc6e360bedc9ee72d75e701397f0bb30dce77568 # v31.5.2
        with:
          nix_path: nixpkgs=channel:nixos-unstable
      - uses: cachix/cachix-action@0fc020193b5a1fa3ac4575aa3a7d3aa6a35435ad # v16
        with:
          name: ghostty
          authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}"

      - name: Test Build
        run: nix develop -c zig build

  build-linux-libghostty:
    runs-on: namespace-profile-ghostty-md
    needs: test
    env:
      ZIG_LOCAL_CACHE_DIR: /zig/local-cache
      ZIG_GLOBAL_CACHE_DIR: /zig/global-cache
    steps:
      - name: Checkout code
        uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0

      - name: Setup Cache
        uses: namespacelabs/nscloud-cache-action@305bfa7ea980a858d511af4899414a84847c7991 # v1.2.16
        with:
          path: |
            /nix
            /zig

      # Install Nix and use that to run our tests so our environment matches exactly.
      - uses: cachix/install-nix-action@fc6e360bedc9ee72d75e701397f0bb30dce77568 # v31.5.2
        with:
          nix_path: nixpkgs=channel:nixos-unstable
      - uses: cachix/cachix-action@0fc020193b5a1fa3ac4575aa3a7d3aa6a35435ad # v16
        with:
          name: ghostty
          authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}"

      - name: Build Libghostty
        run: nix develop -c zig build -Dapp-runtime=none

  build-nix:
    strategy:
      fail-fast: false
      matrix:
        os: [namespace-profile-ghostty-md, namespace-profile-ghostty-md-arm64]
    runs-on: ${{ matrix.os }}
    needs: test
    env:
      ZIG_LOCAL_CACHE_DIR: /zig/local-cache
      ZIG_GLOBAL_CACHE_DIR: /zig/global-cache
    steps:
      - name: Checkout code
        uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0

      - name: Setup Cache
        uses: namespacelabs/nscloud-cache-action@305bfa7ea980a858d511af4899414a84847c7991 # v1.2.16
        with:
          path: |
            /nix
            /zig

      # Install Nix and use that to run our tests so our environment matches exactly.
      - uses: cachix/install-nix-action@fc6e360bedc9ee72d75e701397f0bb30dce77568 # v31.5.2
        with:
          nix_path: nixpkgs=channel:nixos-unstable
      - uses: cachix/cachix-action@0fc020193b5a1fa3ac4575aa3a7d3aa6a35435ad # v16
        with:
          name: ghostty
          authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}"

      - name: Test release NixOS package build
        run: nix build .#ghostty-releasefast

      - name: Check version
        run: result/bin/ghostty +version | grep -q 'builtin.OptimizeMode.ReleaseFast'

      - name: Check to see if the binary has been stripped
        run: nm result/bin/.ghostty-wrapped 2>&1 | grep -q 'no symbols'

      - name: Test debug NixOS package build
        run: nix build .#ghostty-debug

      - name: Check version
        run: result/bin/ghostty +version | grep -q 'builtin.OptimizeMode.Debug'

      - name: Check to see if the binary has not been stripped
        run: nm result/bin/.ghostty-wrapped 2>&1 | grep -q 'main_ghostty.main'

  build-dist:
    runs-on: namespace-profile-ghostty-md
    needs: test
    env:
      ZIG_LOCAL_CACHE_DIR: /zig/local-cache
      ZIG_GLOBAL_CACHE_DIR: /zig/global-cache
    steps:
      - name: Checkout code
        uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0

      - name: Setup Cache
        uses: namespacelabs/nscloud-cache-action@305bfa7ea980a858d511af4899414a84847c7991 # v1.2.16
        with:
          path: |
            /nix
            /zig

      # Install Nix and use that to run our tests so our environment matches exactly.
      - uses: cachix/install-nix-action@fc6e360bedc9ee72d75e701397f0bb30dce77568 # v31.5.2
        with:
          nix_path: nixpkgs=channel:nixos-unstable
      - uses: cachix/cachix-action@0fc020193b5a1fa3ac4575aa3a7d3aa6a35435ad # v16
        with:
          name: ghostty
          authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}"

      - name: Build and Check Source Tarball
        run: |
          rm -rf zig-out/dist
          nix develop -c zig build distcheck
          cp zig-out/dist/*.tar.gz ghostty-source.tar.gz

      - name: Upload artifact
        uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
        with:
          name: source-tarball
          path: |-
            ghostty-source.tar.gz

  build-macos:
    runs-on: namespace-profile-ghostty-macos-tahoe
    needs: test
    steps:
      - name: Checkout code
        uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0

      # TODO(tahoe): https://github.com/NixOS/nix/issues/13342
      - uses: DeterminateSystems/nix-installer-action@main
        with:
          determinate: true
      - uses: cachix/cachix-action@0fc020193b5a1fa3ac4575aa3a7d3aa6a35435ad # v16
        with:
          name: ghostty
          authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}"

      - name: Xcode Select
        run: sudo xcode-select -s /Applications/Xcode_26.0.app

      - name: Xcode Version
        run: xcodebuild -version

      - name: get the Zig deps
        id: deps
        run: nix build -L .#deps && echo "deps=$(readlink ./result)" >> $GITHUB_OUTPUT

      # GhosttyKit is the framework that is built from Zig for our native
      # Mac app to access.
      - name: Build GhosttyKit
        run: |
          nix develop -c zig build \
            --system ${{ steps.deps.outputs.deps }} \
            -Doptimize=Debug \
            -Demit-macos-app=false

      # The native app is built with native Xcode tooling. This also does
      # codesigning. IMPORTANT: this must NOT run in a Nix environment.
      # Nix breaks xcodebuild so this has to be run outside.
      - name: Build Ghostty.app
        run: cd macos && xcodebuild -target Ghostty

      # Build the iOS target without code signing just to verify it works.
      - name: Build Ghostty iOS
        run: |
          cd macos
          xcodebuild -target Ghostty-iOS "CODE_SIGNING_ALLOWED=NO"

  build-macos-matrix:
    runs-on: namespace-profile-ghostty-macos-tahoe
    needs: test
    steps:
      - name: Checkout code
        uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0

      # TODO(tahoe): https://github.com/NixOS/nix/issues/13342
      - uses: DeterminateSystems/nix-installer-action@main
        with:
          determinate: true
      - uses: cachix/cachix-action@0fc020193b5a1fa3ac4575aa3a7d3aa6a35435ad # v16
        with:
          name: ghostty
          authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}"

      - name: Xcode Select
        run: sudo xcode-select -s /Applications/Xcode_26.0.app

      - name: Xcode Version
        run: xcodebuild -version

      - name: get the Zig deps
        id: deps
        run: nix build -L .#deps && echo "deps=$(readlink ./result)" >> $GITHUB_OUTPUT

      - name: Test All
        run: |
          nix develop -c zig build test --system ${{ steps.deps.outputs.deps }} -Drenderer=metal -Dfont-backend=freetype
          nix develop -c zig build test --system ${{ steps.deps.outputs.deps }} -Drenderer=metal -Dfont-backend=coretext
          nix develop -c zig build test --system ${{ steps.deps.outputs.deps }} -Drenderer=metal -Dfont-backend=coretext_freetype
          nix develop -c zig build test --system ${{ steps.deps.outputs.deps }} -Drenderer=metal -Dfont-backend=coretext_harfbuzz
          nix develop -c zig build test --system ${{ steps.deps.outputs.deps }} -Drenderer=metal -Dfont-backend=coretext_noshape

      - name: Build All
        run: |
          nix develop -c zig build --system ${{ steps.deps.outputs.deps }} -Demit-macos-app=false -Doptimize=Debug -Drenderer=metal -Dfont-backend=freetype
          nix develop -c zig build --system ${{ steps.deps.outputs.deps }} -Demit-macos-app=false -Doptimize=Debug -Drenderer=metal -Dfont-backend=coretext
          nix develop -c zig build --system ${{ steps.deps.outputs.deps }} -Demit-macos-app=false -Doptimize=Debug -Drenderer=metal -Dfont-backend=coretext_freetype
          nix develop -c zig build --system ${{ steps.deps.outputs.deps }} -Demit-macos-app=false -Doptimize=Debug -Drenderer=metal -Dfont-backend=coretext_harfbuzz
          nix develop -c zig build --system ${{ steps.deps.outputs.deps }} -Demit-macos-app=false -Doptimize=Debug -Drenderer=metal -Dfont-backend=coretext_noshape

  build-snap:
    strategy:
      fail-fast: false
      matrix:
        os:
          [namespace-profile-ghostty-snap, namespace-profile-ghostty-snap-arm64]
    runs-on: ${{ matrix.os }}
    timeout-minutes: 45
    needs: [test, build-dist]
    env:
      ZIG_LOCAL_CACHE_DIR: /zig/local-cache
      ZIG_GLOBAL_CACHE_DIR: /zig/global-cache
    steps:
      - name: Download Source Tarball Artifacts
        uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
        with:
          name: source-tarball
      - name: Extract tarball
        run: |
          mkdir dist
          tar --verbose --extract --strip-components 1 --directory dist --file ghostty-source.tar.gz
      - name: Setup Cache
        uses: namespacelabs/nscloud-cache-action@305bfa7ea980a858d511af4899414a84847c7991 # v1.2.16
        with:
          path: |
            /nix
            /zig
      - run: sudo apt install -y udev
      - run: sudo systemctl start systemd-udevd
      # Workaround until this is fixed: https://github.com/canonical/lxd-pkg-snap/pull/789
      - run: |
          _LXD_SNAP_DEVCGROUP_CONFIG="/var/lib/snapd/cgroup/snap.lxd.device"
          sudo mkdir -p /var/lib/snapd/cgroup
          echo 'self-managed=true' | sudo tee  "${_LXD_SNAP_DEVCGROUP_CONFIG}"
      - uses: snapcore/action-build@3bdaa03e1ba6bf59a65f84a751d943d549a54e79 # v1.3.0
        with:
          path: dist

  build-windows:
    runs-on: windows-2022
    # this will not stop other jobs from running
    continue-on-error: true
    timeout-minutes: 45
    needs: test
    steps:
      - name: Checkout code
        uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0

      # This could be from a script if we wanted to but inlining here for now
      # in one place.
      # Using powershell so that we do not need to install WSL components. Also,
      # WSLv1 is only installed on Github runners.
      - name: Install zig
        shell: pwsh
        run: |
          # Get the zig version from build.zig so that it only needs to be updated
          $fileContent = Get-Content -Path "build.zig" -Raw
          $pattern = 'buildpkg\.requireZig\("(.*?)"\);'
          $zigVersion = [regex]::Match($fileContent, $pattern).Groups[1].Value
          $version = "zig-windows-x86_64-$zigVersion"
          Write-Output $version
          $uri = "https://ziglang.org/download/$zigVersion/$version.zip"
          Invoke-WebRequest -Uri "$uri" -OutFile ".\zig-windows.zip"
          Expand-Archive -Path ".\zig-windows.zip" -DestinationPath ".\" -Force
          Remove-Item -Path ".\zig-windows.zip"
          Rename-Item -Path ".\$version" -NewName ".\zig"
          Write-Host "Zig installed."
          .\zig\zig.exe version

      - name: Generate build testing script
        shell: pwsh
        run: |
          # Generate a script so that we can swallow the errors
          $scriptContent = @"
          .\zig\zig.exe build test 2>&1 | Out-File -FilePath "build.log" -Append
          exit 0
          "@
          $scriptPath = "zigbuild.ps1"
          # Write the script content to a file
          $scriptContent | Set-Content -Path $scriptPath
          Write-Host "Script generated at: $scriptPath"

      - name: Test Windows
        shell: pwsh
        run: .\zigbuild.ps1 -ErrorAction SilentlyContinue

      - name: Generate build script
        shell: pwsh
        run: |
          # Generate a script so that we can swallow the errors
          $scriptContent = @"
          .\zig\zig.exe build 2>&1 | Out-File -FilePath "build.log" -Append
          exit 0
          "@
          $scriptPath = "zigbuild.ps1"
          # Write the script content to a file
          $scriptContent | Set-Content -Path $scriptPath
          Write-Host "Script generated at: $scriptPath"

      - name: Build Windows
        shell: pwsh
        run: .\zigbuild.ps1 -ErrorAction SilentlyContinue

      - name: Dump logs
        shell: pwsh
        run: Get-Content -Path ".\build.log"

  test:
    if: github.repository == 'ghostty-org/ghostty'
    runs-on: namespace-profile-ghostty-md
    env:
      ZIG_LOCAL_CACHE_DIR: /zig/local-cache
      ZIG_GLOBAL_CACHE_DIR: /zig/global-cache
    steps:
      - name: Checkout code
        uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0

      - name: Setup Cache
        uses: namespacelabs/nscloud-cache-action@305bfa7ea980a858d511af4899414a84847c7991 # v1.2.16
        with:
          path: |
            /nix
            /zig

      # Install Nix and use that to run our tests so our environment matches exactly.
      - uses: cachix/install-nix-action@fc6e360bedc9ee72d75e701397f0bb30dce77568 # v31.5.2
        with:
          nix_path: nixpkgs=channel:nixos-unstable
      - uses: cachix/cachix-action@0fc020193b5a1fa3ac4575aa3a7d3aa6a35435ad # v16
        with:
          name: ghostty
          authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}"

      - name: test
        run: nix develop -c zig build -Dapp-runtime=none test

      - name: Test GTK Build
        run: nix develop -c zig build -Dapp-runtime=gtk -Demit-docs -Demit-webdata

      - name: Test GTK-NG Build
        run: nix develop -c zig build -Dapp-runtime=gtk-ng -Demit-docs -Demit-webdata

      # This relies on the cache being populated by the commands above.
      - name: Test System Build
        run: |
          nix develop -c zig build \
            --system ${ZIG_GLOBAL_CACHE_DIR}/p \
            -Doptimize=Debug

  test-gtk:
    strategy:
      fail-fast: false
      matrix:
        x11: ["true", "false"]
        wayland: ["true", "false"]
    name: GTK x11=${{ matrix.x11 }} wayland=${{ matrix.wayland }}
    runs-on: namespace-profile-ghostty-sm
    needs: test
    env:
      ZIG_LOCAL_CACHE_DIR: /zig/local-cache
      ZIG_GLOBAL_CACHE_DIR: /zig/global-cache
    steps:
      - name: Checkout code
        uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0

      - name: Setup Cache
        uses: namespacelabs/nscloud-cache-action@305bfa7ea980a858d511af4899414a84847c7991 # v1.2.16
        with:
          path: |
            /nix
            /zig

      # Install Nix and use that to run our tests so our environment matches exactly.
      - uses: cachix/install-nix-action@fc6e360bedc9ee72d75e701397f0bb30dce77568 # v31.5.2
        with:
          nix_path: nixpkgs=channel:nixos-unstable
      - uses: cachix/cachix-action@0fc020193b5a1fa3ac4575aa3a7d3aa6a35435ad # v16
        with:
          name: ghostty
          authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}"

      - name: Test
        run: |
          nix develop -c \
            zig build \
            -Dapp-runtime=gtk \
            -Dgtk-x11=${{ matrix.x11 }} \
            -Dgtk-wayland=${{ matrix.wayland }} \
            test

      - name: Build
        run: |
          nix develop -c \
            zig build \
            -Dapp-runtime=gtk \
            -Dgtk-x11=${{ matrix.x11 }} \
            -Dgtk-wayland=${{ matrix.wayland }}

  test-gtk-ng:
    strategy:
      fail-fast: false
      matrix:
        x11: ["true", "false"]
        wayland: ["true", "false"]
    name: GTK x11=${{ matrix.x11 }} wayland=${{ matrix.wayland }}
    runs-on: namespace-profile-ghostty-sm
    needs: test
    env:
      ZIG_LOCAL_CACHE_DIR: /zig/local-cache
      ZIG_GLOBAL_CACHE_DIR: /zig/global-cache
    steps:
      - name: Checkout code
        uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0

      - name: Setup Cache
        uses: namespacelabs/nscloud-cache-action@305bfa7ea980a858d511af4899414a84847c7991 # v1.2.16
        with:
          path: |
            /nix
            /zig

      # Install Nix and use that to run our tests so our environment matches exactly.
      - uses: cachix/install-nix-action@fc6e360bedc9ee72d75e701397f0bb30dce77568 # v31.5.2
        with:
          nix_path: nixpkgs=channel:nixos-unstable
      - uses: cachix/cachix-action@0fc020193b5a1fa3ac4575aa3a7d3aa6a35435ad # v16
        with:
          name: ghostty
          authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}"

      - name: Test
        run: |
          nix develop -c \
            zig build \
            -Dapp-runtime=gtk-ng \
            -Dgtk-x11=${{ matrix.x11 }} \
            -Dgtk-wayland=${{ matrix.wayland }} \
            test

      - name: Build
        run: |
          nix develop -c \
            zig build \
            -Dapp-runtime=gtk-ng \
            -Dgtk-x11=${{ matrix.x11 }} \
            -Dgtk-wayland=${{ matrix.wayland }}

  test-sentry-linux:
    strategy:
      fail-fast: false
      matrix:
        sentry: ["true", "false"]
    name: Build -Dsentry=${{ matrix.sentry }}
    runs-on: namespace-profile-ghostty-sm
    needs: test
    env:
      ZIG_LOCAL_CACHE_DIR: /zig/local-cache
      ZIG_GLOBAL_CACHE_DIR: /zig/global-cache
    steps:
      - name: Checkout code
        uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0

      - name: Setup Cache
        uses: namespacelabs/nscloud-cache-action@305bfa7ea980a858d511af4899414a84847c7991 # v1.2.16
        with:
          path: |
            /nix
            /zig

      # Install Nix and use that to run our tests so our environment matches exactly.
      - uses: cachix/install-nix-action@fc6e360bedc9ee72d75e701397f0bb30dce77568 # v31.5.2
        with:
          nix_path: nixpkgs=channel:nixos-unstable
      - uses: cachix/cachix-action@0fc020193b5a1fa3ac4575aa3a7d3aa6a35435ad # v16
        with:
          name: ghostty
          authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}"

      - name: Test Sentry Build
        run: |
          nix develop -c zig build -Dsentry=${{ matrix.sentry }}

  test-macos:
    runs-on: namespace-profile-ghostty-macos-tahoe
    needs: test
    steps:
      - name: Checkout code
        uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0

      # TODO(tahoe): https://github.com/NixOS/nix/issues/13342
      - uses: DeterminateSystems/nix-installer-action@main
        with:
          determinate: true
      - uses: cachix/cachix-action@0fc020193b5a1fa3ac4575aa3a7d3aa6a35435ad # v16
        with:
          name: ghostty
          authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}"

      - name: Xcode Select
        run: sudo xcode-select -s /Applications/Xcode_26.0.app

      - name: Xcode Version
        run: xcodebuild -version

      - name: get the Zig deps
        id: deps
        run: nix build -L .#deps && echo "deps=$(readlink ./result)" >> $GITHUB_OUTPUT

      - name: test
        run: nix develop -c zig build test --system ${{ steps.deps.outputs.deps }}

  zig-fmt:
    if: github.repository == 'ghostty-org/ghostty'
    runs-on: namespace-profile-ghostty-xsm
    timeout-minutes: 60
    env:
      ZIG_LOCAL_CACHE_DIR: /zig/local-cache
      ZIG_GLOBAL_CACHE_DIR: /zig/global-cache
    steps:
      - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
      - name: Setup Cache
        uses: namespacelabs/nscloud-cache-action@305bfa7ea980a858d511af4899414a84847c7991 # v1.2.16
        with:
          path: |
            /nix
            /zig
      - uses: cachix/install-nix-action@fc6e360bedc9ee72d75e701397f0bb30dce77568 # v31.5.2
        with:
          nix_path: nixpkgs=channel:nixos-unstable
      - uses: cachix/cachix-action@0fc020193b5a1fa3ac4575aa3a7d3aa6a35435ad # v16
        with:
          name: ghostty
          authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}"
          skipPush: true
          useDaemon: false # sometimes fails on short jobs
      - name: zig fmt
        run: nix develop -c zig fmt --check .

  pinact:
    name: "GitHub Actions Pins"
    if: github.repository == 'ghostty-org/ghostty'
    runs-on: namespace-profile-ghostty-xsm
    timeout-minutes: 60
    env:
      ZIG_LOCAL_CACHE_DIR: /zig/local-cache
      ZIG_GLOBAL_CACHE_DIR: /zig/global-cache
    steps:
      - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
      - name: Setup Cache
        uses: namespacelabs/nscloud-cache-action@305bfa7ea980a858d511af4899414a84847c7991 # v1.2.16
        with:
          path: |
            /nix
            /zig
      - uses: cachix/install-nix-action@fc6e360bedc9ee72d75e701397f0bb30dce77568 # v31.5.2
        with:
          nix_path: nixpkgs=channel:nixos-unstable
      - uses: cachix/cachix-action@0fc020193b5a1fa3ac4575aa3a7d3aa6a35435ad # v16
        with:
          name: ghostty
          authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}"
          skipPush: true
          useDaemon: false # sometimes fails on short jobs
      - name: pinact check
        run: nix develop -c pinact run --check

  prettier:
    if: github.repository == 'ghostty-org/ghostty'
    runs-on: namespace-profile-ghostty-xsm
    timeout-minutes: 60
    env:
      ZIG_LOCAL_CACHE_DIR: /zig/local-cache
      ZIG_GLOBAL_CACHE_DIR: /zig/global-cache
    steps:
      - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
      - name: Setup Cache
        uses: namespacelabs/nscloud-cache-action@305bfa7ea980a858d511af4899414a84847c7991 # v1.2.16
        with:
          path: |
            /nix
            /zig
      - uses: cachix/install-nix-action@fc6e360bedc9ee72d75e701397f0bb30dce77568 # v31.5.2
        with:
          nix_path: nixpkgs=channel:nixos-unstable
      - uses: cachix/cachix-action@0fc020193b5a1fa3ac4575aa3a7d3aa6a35435ad # v16
        with:
          name: ghostty
          authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}"
          skipPush: true
          useDaemon: false # sometimes fails on short jobs
      - name: prettier check
        run: nix develop -c prettier --check .

  alejandra:
    if: github.repository == 'ghostty-org/ghostty'
    runs-on: namespace-profile-ghostty-xsm
    timeout-minutes: 60
    env:
      ZIG_LOCAL_CACHE_DIR: /zig/local-cache
      ZIG_GLOBAL_CACHE_DIR: /zig/global-cache
    steps:
      - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
      - name: Setup Cache
        uses: namespacelabs/nscloud-cache-action@305bfa7ea980a858d511af4899414a84847c7991 # v1.2.16
        with:
          path: |
            /nix
            /zig
      - uses: cachix/install-nix-action@fc6e360bedc9ee72d75e701397f0bb30dce77568 # v31.5.2
        with:
          nix_path: nixpkgs=channel:nixos-unstable
      - uses: cachix/cachix-action@0fc020193b5a1fa3ac4575aa3a7d3aa6a35435ad # v16
        with:
          name: ghostty
          authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}"
          skipPush: true
          useDaemon: false # sometimes fails on short jobs
      - name: alejandra check
        run: nix develop -c alejandra --check .

  typos:
    if: github.repository == 'ghostty-org/ghostty'
    runs-on: namespace-profile-ghostty-xsm
    timeout-minutes: 60
    env:
      ZIG_LOCAL_CACHE_DIR: /zig/local-cache
      ZIG_GLOBAL_CACHE_DIR: /zig/global-cache
    steps:
      - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
      - name: Setup Cache
        uses: namespacelabs/nscloud-cache-action@305bfa7ea980a858d511af4899414a84847c7991 # v1.2.16
        with:
          path: |
            /nix
            /zig
      - uses: cachix/install-nix-action@fc6e360bedc9ee72d75e701397f0bb30dce77568 # v31.5.2
        with:
          nix_path: nixpkgs=channel:nixos-unstable
      - uses: cachix/cachix-action@0fc020193b5a1fa3ac4575aa3a7d3aa6a35435ad # v16
        with:
          name: ghostty
          authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}"
          skipPush: true
          useDaemon: false # sometimes fails on short jobs
      - name: typos check
        run: nix develop -c typos

  shellcheck:
    if: github.repository == 'ghostty-org/ghostty'
    runs-on: namespace-profile-ghostty-xsm
    timeout-minutes: 60
    env:
      ZIG_LOCAL_CACHE_DIR: /zig/local-cache
      ZIG_GLOBAL_CACHE_DIR: /zig/global-cache
    steps:
      - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
      - name: Setup Cache
        uses: namespacelabs/nscloud-cache-action@305bfa7ea980a858d511af4899414a84847c7991 # v1.2.16
        with:
          path: |
            /nix
            /zig
      - uses: cachix/install-nix-action@fc6e360bedc9ee72d75e701397f0bb30dce77568 # v31.5.2
        with:
          nix_path: nixpkgs=channel:nixos-unstable
      - uses: cachix/cachix-action@0fc020193b5a1fa3ac4575aa3a7d3aa6a35435ad # v16
        with:
          name: ghostty
          authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}"
          skipPush: true
          useDaemon: false # sometimes fails on short jobs
      - name: shellcheck
        run: |
          nix develop -c shellcheck \
            --check-sourced \
            --color=always \
            --severity=warning \
            --shell=bash \
            --external-sources \
            $(find . \( -name "*.sh" -o -name "*.bash" \) -type f ! -path "./zig-out/*" ! -path "./macos/build/*" ! -path "./.git/*" | sort)

  translations:
    if: github.repository == 'ghostty-org/ghostty'
    runs-on: namespace-profile-ghostty-xsm
    timeout-minutes: 60
    env:
      ZIG_LOCAL_CACHE_DIR: /zig/local-cache
      ZIG_GLOBAL_CACHE_DIR: /zig/global-cache
    steps:
      - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
      - name: Setup Cache
        uses: namespacelabs/nscloud-cache-action@305bfa7ea980a858d511af4899414a84847c7991 # v1.2.16
        with:
          path: |
            /nix
            /zig
      - uses: cachix/install-nix-action@fc6e360bedc9ee72d75e701397f0bb30dce77568 # v31.5.2
        with:
          nix_path: nixpkgs=channel:nixos-unstable
      - uses: cachix/cachix-action@0fc020193b5a1fa3ac4575aa3a7d3aa6a35435ad # v16
        with:
          name: ghostty
          authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}"
          skipPush: true
          useDaemon: false # sometimes fails on short jobs
      - name: check translations
        run: nix develop -c .github/scripts/check-translations.sh

  blueprint-compiler:
    if: github.repository == 'ghostty-org/ghostty'
    runs-on: namespace-profile-ghostty-xsm
    timeout-minutes: 60
    env:
      ZIG_LOCAL_CACHE_DIR: /zig/local-cache
      ZIG_GLOBAL_CACHE_DIR: /zig/global-cache
    steps:
      - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
      - name: Setup Cache
        uses: namespacelabs/nscloud-cache-action@305bfa7ea980a858d511af4899414a84847c7991 # v1.2.16
        with:
          path: |
            /nix
            /zig
      - uses: cachix/install-nix-action@fc6e360bedc9ee72d75e701397f0bb30dce77568 # v31.5.2
        with:
          nix_path: nixpkgs=channel:nixos-unstable
      - uses: cachix/cachix-action@0fc020193b5a1fa3ac4575aa3a7d3aa6a35435ad # v16
        with:
          name: ghostty
          authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}"
          skipPush: true
          useDaemon: false # sometimes fails on short jobs
      - name: check blueprints
        run: nix develop -c ./nix/build-support/check-blueprints.sh
      - name: check unchanged
        run: git diff --exit-code

  test-pkg-linux:
    strategy:
      fail-fast: false
      matrix:
        pkg: ["wuffs"]
    name: Test pkg/${{ matrix.pkg }}
    runs-on: namespace-profile-ghostty-sm
    needs: test
    env:
      ZIG_LOCAL_CACHE_DIR: /zig/local-cache
      ZIG_GLOBAL_CACHE_DIR: /zig/global-cache
    steps:
      - name: Checkout code
        uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0

      - name: Setup Cache
        uses: namespacelabs/nscloud-cache-action@305bfa7ea980a858d511af4899414a84847c7991 # v1.2.16
        with:
          path: |
            /nix
            /zig

      # Install Nix and use that to run our tests so our environment matches exactly.
      - uses: cachix/install-nix-action@fc6e360bedc9ee72d75e701397f0bb30dce77568 # v31.5.2
        with:
          nix_path: nixpkgs=channel:nixos-unstable
      - uses: cachix/cachix-action@0fc020193b5a1fa3ac4575aa3a7d3aa6a35435ad # v16
        with:
          name: ghostty
          authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}"

      - name: Test ${{ matrix.pkg }} Build
        run: |
          nix develop -c sh -c "cd pkg/${{ matrix.pkg }} ; zig build test"

  test-debian-13:
    name: Test build on Debian 13
    runs-on: namespace-profile-ghostty-sm
    needs: [test, build-dist]
    steps:
      - name: Install and configure Namespace CLI
        uses: namespacelabs/nscloud-setup@d1c625762f7c926a54bd39252efff0705fd11c64 # v0.0.10

      - name: Configure Namespace powered Buildx
        uses: namespacelabs/nscloud-setup-buildx-action@01628ae51ea5d6b0c90109c7dccbf511953aff29 # v0.0.18

      - name: Download Source Tarball Artifacts
        uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
        with:
          name: source-tarball

      - name: Extract tarball
        run: |
          mkdir dist
          tar --verbose --extract --strip-components 1 --directory dist --file ghostty-source.tar.gz

      - name: Build and push
        uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0
        with:
          context: dist
          file: dist/src/build/docker/debian/Dockerfile
          build-args: |
            DISTRO_VERSION=13

  flatpak-check-zig-cache:
    if: github.repository == 'ghostty-org/ghostty'
    runs-on: namespace-profile-ghostty-xsm
    env:
      ZIG_LOCAL_CACHE_DIR: /zig/local-cache
      ZIG_GLOBAL_CACHE_DIR: /zig/global-cache
    steps:
      - name: Checkout code
        uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
      - name: Setup Cache
        uses: namespacelabs/nscloud-cache-action@305bfa7ea980a858d511af4899414a84847c7991 # v1.2.16
        with:
          path: |
            /nix
            /zig
      - name: Setup Nix
        uses: cachix/install-nix-action@fc6e360bedc9ee72d75e701397f0bb30dce77568 # v31.5.2
        with:
          nix_path: nixpkgs=channel:nixos-unstable
      - uses: cachix/cachix-action@0fc020193b5a1fa3ac4575aa3a7d3aa6a35435ad # v16
        with:
          name: ghostty
          authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}"
          useDaemon: false # sometimes fails on short jobs
      - name: Check Flatpak Zig Dependencies
        run: nix develop -c ./flatpak/build-support/check-zig-cache.sh

  flatpak:
    if: github.repository == 'ghostty-org/ghostty'
    name: "Flatpak"
    container:
      image: ghcr.io/flathub-infra/flatpak-github-actions:gnome-47
      options: --privileged
    strategy:
      fail-fast: false
      matrix:
        variant:
          - arch: x86_64
            runner: namespace-profile-ghostty-md
          - arch: aarch64
            runner: namespace-profile-ghostty-md-arm64
    runs-on: ${{ matrix.variant.runner }}
    needs: [flatpak-check-zig-cache, test]
    steps:
      - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
      - uses: flatpak/flatpak-github-actions/flatpak-builder@10a3c29f0162516f0f68006be14c92f34bd4fa6c # v6.5
        with:
          bundle: com.mitchellh.ghostty
          manifest-path: flatpak/com.mitchellh.ghostty.yml
          cache-key: flatpak-builder-${{ github.sha }}
          arch: ${{ matrix.variant.arch }}
          verbose: true

  valgrind:
    if: github.repository == 'ghostty-org/ghostty'
    runs-on: namespace-profile-ghostty-lg
    needs: test
    env:
      ZIG_LOCAL_CACHE_DIR: /zig/local-cache
      ZIG_GLOBAL_CACHE_DIR: /zig/global-cache
    steps:
      - name: Checkout code
        uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0

      - name: Setup Cache
        uses: namespacelabs/nscloud-cache-action@305bfa7ea980a858d511af4899414a84847c7991 # v1.2.16
        with:
          path: |
            /nix
            /zig

      # Install Nix and use that to run our tests so our environment matches exactly.
      - uses: cachix/install-nix-action@fc6e360bedc9ee72d75e701397f0bb30dce77568 # v31.5.2
        with:
          nix_path: nixpkgs=channel:nixos-unstable
      - uses: cachix/cachix-action@0fc020193b5a1fa3ac4575aa3a7d3aa6a35435ad # v16
        with:
          name: ghostty
          authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}"

      - name: valgrind deps
        run: |
          sudo apt update -y
          sudo apt install -y valgrind libc6-dbg

      - name: valgrind
        run: |
          nix develop -c zig build test-valgrind
