Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
166 changes: 151 additions & 15 deletions .github/workflows/build-and-push.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,20 @@ on:
tags:
- 'v*.*.*'
workflow_dispatch:
inputs:
tag:
description: 'Existing tag to upload assets to (e.g. v1.0.22)'
required: true
type: string
build:
description: 'Which targets to build'
required: true
default: hosted
type: choice
options:
- hosted
- arm64
- all

permissions:
contents: write
Expand Down Expand Up @@ -42,11 +56,13 @@ jobs:
src-tauri/tauri.conf.json > tmp.json && \
mv tmp.json src-tauri/tauri.conf.json

- name: Bump npm version & lockfile
- name: Bump package.json version
shell: bash
run: |
npm install --no-save
npm version "${{ steps.extract_version.outputs.version }}" --no-git-tag-version
jq --arg v "${{ steps.extract_version.outputs.version }}" \
'.version = $v' \
package.json > tmp.json && \
mv tmp.json package.json

- name: Commit version updates
uses: stefanzweifel/git-auto-commit-action@v4
Expand All @@ -56,18 +72,27 @@ jobs:

publish-tauri:
needs: sync-version
runs-on: ${{ matrix.platform }}
if: ${{ always() && (needs.sync-version.result == 'success' || needs.sync-version.result == 'skipped') && (github.event_name != 'workflow_dispatch' || inputs.build != 'arm64') }}
Copy link

Copilot AI Jan 14, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The workflow condition checks for needs.sync-version.result == 'skipped' but the sync-version job has no conditions that would cause it to be skipped. This condition may never be true, making the logic more complex than necessary.

Copilot uses AI. Check for mistakes.
runs-on: ${{ matrix.runsOn }}
strategy:
fail-fast: false
matrix:
include:
- platform: macos-latest
- name: macos-aarch64
os: macos
runsOn: macos-latest
args: --target aarch64-apple-darwin
- platform: macos-latest
- name: macos-x64
os: macos
runsOn: macos-latest
args: --target x86_64-apple-darwin
- platform: ubuntu-24.04
- name: linux-x64
os: ubuntu
runsOn: ubuntu-24.04
args: ""
- platform: windows-latest
- name: windows
os: windows
runsOn: windows-latest
args: ""
steps:
- name: Checkout updated main
Expand All @@ -80,14 +105,34 @@ jobs:
with:
node-version: '18'

- name: Setup Rust toolchain en targets
- name: Enable Yarn (Corepack)
shell: bash
run: |
set -euxo pipefail
mkdir -p "$HOME/.local/bin"
corepack enable --install-directory "$HOME/.local/bin"
echo "$HOME/.local/bin" >> "$GITHUB_PATH"
corepack prepare yarn@1.22.22 --activate

- name: Verify Yarn
shell: bash
run: |
set -euxo pipefail
yarn --version

- name: Setup Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
toolchain: stable
targets: aarch64-apple-darwin,x86_64-apple-darwin

- name: Add Rust targets (macOS)
if: matrix.os == 'macos'
shell: bash
run: |
rustup target add aarch64-apple-darwin x86_64-apple-darwin

- name: Linux dependencies installeren
if: matrix.platform == 'ubuntu-24.04'
if: matrix.os == 'ubuntu'
run: |
sudo apt-get update
sudo apt-get install -y \
Expand All @@ -104,15 +149,21 @@ jobs:
cpio

- name: Frontend dependencies installeren
run: yarn install
run: yarn install --frozen-lockfile

- name: Verify Tauri CLI
shell: bash
run: |
set -euxo pipefail
yarn tauri --version

- name: Build en release via tauri-action
uses: tauri-apps/tauri-action@v0.5.22
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tagName: ${{ github.ref_name }}
releaseName: "App ${{ github.ref_name }}"
tagName: ${{ inputs.tag || github.ref_name }}
releaseName: "App ${{ inputs.tag || github.ref_name }}"
releaseBody: "Download de installatie via de assets."
releaseDraft: false
prerelease: false
Expand All @@ -121,4 +172,89 @@ jobs:
includeDebug: false
includeRelease: true
includeUpdaterJson: true
updaterJsonKeepUniversal: false
updaterJsonKeepUniversal: false

publish-tauri-linux-arm64:
name: publish-tauri (linux-arm64, self-hosted)
needs: sync-version
if: ${{ always() && github.event_name == 'workflow_dispatch' && (inputs.build == 'arm64' || inputs.build == 'all') && (needs.sync-version.result == 'success' || needs.sync-version.result == 'skipped') }}
runs-on: [self-hosted, linux, arm64]
env:
CARGO_BUILD_JOBS: '1'
timeout-minutes: 180
steps:
- name: Checkout updated main
uses: actions/checkout@v4
with:
ref: main

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '18'

- name: Enable Yarn (Corepack)
shell: bash
run: |
set -euxo pipefail
mkdir -p "$HOME/.local/bin"
corepack enable --install-directory "$HOME/.local/bin"
echo "$HOME/.local/bin" >> "$GITHUB_PATH"
corepack prepare yarn@1.22.22 --activate

- name: Verify Yarn
shell: bash
run: |
set -euxo pipefail
yarn --version

- name: Setup Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
toolchain: stable

- name: Linux dependencies installeren
run: |
sudo apt-get update
sudo apt-get install -y \
libjavascriptcoregtk-4.1-dev \
pkg-config \
libsoup-3.0-dev \
libwebkit2gtk-4.1-dev \
libayatana-appindicator3-dev \
librsvg2-dev \
dpkg \
fakeroot

# NOTE: On low-memory ARM boards (e.g. 2GB), this build may OOM.
# Recommendation: configure swap locally on the self-hosted runner (swapfile or zram).
# Keeping `CARGO_BUILD_JOBS=1` (set above) also helps reduce peak memory.

- name: Frontend dependencies installeren
run: yarn install --frozen-lockfile

- name: Verify Tauri CLI
shell: bash
run: |
set -euxo pipefail
yarn tauri --version

- name: Build (deb)
shell: bash
run: |
set -euxo pipefail
yarn tauri build --target aarch64-unknown-linux-gnu --bundles deb

- name: Upload deb to GitHub Release
uses: softprops/action-gh-release@v2
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: ${{ inputs.tag }}
name: "App ${{ inputs.tag }}"
body: "Download de installatie via de assets."
draft: false
prerelease: false
fail_on_unmatched_files: true
files: |
src-tauri/target/aarch64-unknown-linux-gnu/release/bundle/deb/*.deb
44 changes: 44 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,50 @@
<p>
</div>


## Autostart (Linux)

If you want ImmichFrame to start automatically after login, create an autostart desktop entry:

- Create `~/.config/autostart/immich.desktop`
- Example:

```ini
[Desktop Entry]
Type=Application
Name=ImmichFrame
Terminal=false

# Notes:
# - On some ARM/Mali Wayland setups, forcing GLES helps GTK/WebKit enable acceleration.
# - Optional watchdog/diagnostics env vars (off by default):
# - IMMICHFRAME_DEBUG_OVERLAY=1 Shows a small on-screen memory overlay (click to hide)
# - IMMICHFRAME_AUTO_RELOAD_MINUTES=60 Periodically hard-reloads the webview
# - IMMICHFRAME_AUTO_RESTART_MINUTES=180 Restarts the app after N minutes (most effective on low-RAM boards)
Exec=sh -lc 'sleep 5; cd "$HOME/ImmichFrame"; export GDK_BACKEND=wayland; export GDK_GL=gles; export IMMICHFRAME_DEBUG_OVERLAY=1; export IMMICHFRAME_AUTO_RELOAD_MINUTES=60; exec immichframe >>"$HOME/.cache/immichframe.log" 2>&1'

# Alternative (stronger workaround): replace AUTO_RELOAD with AUTO_RESTART, e.g.
# Exec=sh -lc 'sleep 5; cd "$HOME/ImmichFrame"; export GDK_BACKEND=wayland; export GDK_GL=gles; export IMMICHFRAME_DEBUG_OVERLAY=1; export IMMICHFRAME_AUTO_RESTART_MINUTES=180; exec immichframe >>"$HOME/.cache/immichframe.log" 2>&1'
```

ImmichFrame stores the configured URL in `~/.config/immichFrame/Settings.txt` on Linux.
If ImmichFrame Docker is running on the same machine with port 8080, the URL should be `http://localhost:8080`.

## ARM64 (aarch64) builds via self-hosted runner

GitHub-hosted ARM64 runners are not available, so this repo supports building the Linux ARM64 `.deb` on a self-hosted runner.

High level steps:

1. Provision an Ubuntu aarch64 machine (e.g. Khadas VIM3) and install the GitHub Actions runner.
2. Register the runner for your fork/repo with labels: `self-hosted`, `linux`, `arm64`.
3. Run the workflow `.github/workflows/build-and-push.yml` manually via `workflow_dispatch` and pick `build=arm64`.
- Provide an existing tag (e.g. `v1.0.2`) so the workflow can upload the `.deb` to that release.

Runner notes:

- On low-memory boards, consider configuring swap/zram locally on the runner to avoid OOM during Rust compilation.

## 📄 Documentation
You can find the documentation [here](https://immichframe.online/docs/getting-started/apps#desktop-windows-macos-linux).

Expand Down
Loading