Prepared Linux packaging and Flatpak integration (#870)
Some checks are pending
Build and Release / Determine run mode (push) Waiting to run
Build and Release / Read metadata (push) Blocked by required conditions
Build and Release / Sync Flatpak repo (push) Blocked by required conditions
Build and Release / Collect Flatpak artifacts (push) Blocked by required conditions
Build and Release / Build app (${{ matrix.dotnet_runtime }}) (-aarch64-apple-darwin, osx-arm64, macos-latest, aarch64-apple-darwin, dmg,app,updater, dmg) (push) Blocked by required conditions
Build and Release / Build app (${{ matrix.dotnet_runtime }}) (-aarch64-pc-windows-msvc.exe, win-arm64, windows-latest, aarch64-pc-windows-msvc, nsis,updater, nsis) (push) Blocked by required conditions
Build and Release / Build app (${{ matrix.dotnet_runtime }}) (-aarch64-unknown-linux-gnu, linux-arm64, ubuntu-22.04-arm, aarch64-unknown-linux-gnu, appimage,updater, appimage) (push) Blocked by required conditions
Build and Release / Build app (${{ matrix.dotnet_runtime }}) (-x86_64-apple-darwin, osx-x64, macos-latest, x86_64-apple-darwin, dmg,app,updater, dmg) (push) Blocked by required conditions
Build and Release / Build app (${{ matrix.dotnet_runtime }}) (-x86_64-pc-windows-msvc.exe, win-x64, windows-latest, x86_64-pc-windows-msvc, nsis,updater, nsis) (push) Blocked by required conditions
Build and Release / Build app (${{ matrix.dotnet_runtime }}) (-x86_64-unknown-linux-gnu, linux-x64, ubuntu-22.04, x86_64-unknown-linux-gnu, appimage,updater, appimage) (push) Blocked by required conditions
Build and Release / Prepare & create release (push) Blocked by required conditions
Build and Release / Publish release (push) Blocked by required conditions

This commit is contained in:
Thorsten Sommer 2026-07-19 14:53:16 +02:00 committed by GitHub
parent eac5c63209
commit 58f87277ef
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 275 additions and 16 deletions

View File

@ -261,7 +261,10 @@ jobs:
with: with:
ref: ${{ env.AI_STUDIO_COMMIT }} ref: ${{ env.AI_STUDIO_COMMIT }}
path: ai-studio path: ai-studio
sparse-checkout: metadata.txt sparse-checkout: |
metadata.txt
runtime/packaging/linux/org.mindworkai.AIStudio.desktop
runtime/packaging/linux/org.mindworkai.AIStudio.metainfo.xml
sparse-checkout-cone-mode: false sparse-checkout-cone-mode: false
- name: Checkout Flatpak repository - name: Checkout Flatpak repository
@ -329,8 +332,12 @@ jobs:
test "$release_version" = "${AI_STUDIO_TAG#v}" test "$release_version" = "${AI_STUDIO_TAG#v}"
[[ "$release_timestamp" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}[[:space:]][0-9]{2}:[0-9]{2}:[0-9]{2}[[:space:]]UTC$ ]] [[ "$release_timestamp" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}[[:space:]][0-9]{2}:[0-9]{2}:[0-9]{2}[[:space:]]UTC$ ]]
python3 ./update-metainfo.py "$release_version" "$release_date" test -s ../ai-studio/runtime/packaging/linux/org.mindworkai.AIStudio.desktop
python3 ./update-metainfo.py --check "$release_version" "$release_date" python3 ./update-metainfo.py \
--check \
--metainfo ../ai-studio/runtime/packaging/linux/org.mindworkai.AIStudio.metainfo.xml \
"$release_version" \
"$release_date"
pdfium_base_url="https://github.com/bblanchon/pdfium-binaries/releases/download/chromium%2F${PDFIUM_CHROMIUM_REVISION}" pdfium_base_url="https://github.com/bblanchon/pdfium-binaries/releases/download/chromium%2F${PDFIUM_CHROMIUM_REVISION}"
pdfium_x64_url="${pdfium_base_url}/pdfium-linux-x64.tgz" pdfium_x64_url="${pdfium_base_url}/pdfium-linux-x64.tgz"
@ -353,16 +360,16 @@ jobs:
(.modules[] | select(.name == "mind-work-ai-studio").sources[] | select(.type == "archive" and .only-arches[0] == "x86_64").sha256) = strenv(PDFIUM_X64_SHA256) | (.modules[] | select(.name == "mind-work-ai-studio").sources[] | select(.type == "archive" and .only-arches[0] == "x86_64").sha256) = strenv(PDFIUM_X64_SHA256) |
(.modules[] | select(.name == "mind-work-ai-studio").sources[] | select(.type == "archive" and .only-arches[0] == "aarch64").url) = strenv(PDFIUM_ARM64_URL) | (.modules[] | select(.name == "mind-work-ai-studio").sources[] | select(.type == "archive" and .only-arches[0] == "aarch64").url) = strenv(PDFIUM_ARM64_URL) |
(.modules[] | select(.name == "mind-work-ai-studio").sources[] | select(.type == "archive" and .only-arches[0] == "aarch64").sha256) = strenv(PDFIUM_ARM64_SHA256) (.modules[] | select(.name == "mind-work-ai-studio").sources[] | select(.type == "archive" and .only-arches[0] == "aarch64").sha256) = strenv(PDFIUM_ARM64_SHA256)
' org.MindWorkAI.AIStudio.yml ' org.mindworkai.AIStudio.yml
./update-dependencies ./update-dependencies
test "$(yq -r '(.modules[] | select(.name == "mind-work-ai-studio")).sources[0].tag' org.MindWorkAI.AIStudio.yml)" = "$AI_STUDIO_TAG" test "$(yq -r '(.modules[] | select(.name == "mind-work-ai-studio")).sources[0].tag' org.mindworkai.AIStudio.yml)" = "$AI_STUDIO_TAG"
test "$(yq -r '(.modules[] | select(.name == "mind-work-ai-studio")).sources[0].commit' org.MindWorkAI.AIStudio.yml)" = "$AI_STUDIO_COMMIT" test "$(yq -r '(.modules[] | select(.name == "mind-work-ai-studio")).sources[0].commit' org.mindworkai.AIStudio.yml)" = "$AI_STUDIO_COMMIT"
test "$(yq -r '(.modules[] | select(.name == "mind-work-ai-studio")).sources[] | select(.type == "archive" and .only-arches[0] == "x86_64").url' org.MindWorkAI.AIStudio.yml)" = "$PDFIUM_X64_URL" test "$(yq -r '(.modules[] | select(.name == "mind-work-ai-studio")).sources[] | select(.type == "archive" and .only-arches[0] == "x86_64").url' org.mindworkai.AIStudio.yml)" = "$PDFIUM_X64_URL"
test "$(yq -r '(.modules[] | select(.name == "mind-work-ai-studio")).sources[] | select(.type == "archive" and .only-arches[0] == "x86_64").sha256' org.MindWorkAI.AIStudio.yml)" = "$PDFIUM_X64_SHA256" test "$(yq -r '(.modules[] | select(.name == "mind-work-ai-studio")).sources[] | select(.type == "archive" and .only-arches[0] == "x86_64").sha256' org.mindworkai.AIStudio.yml)" = "$PDFIUM_X64_SHA256"
test "$(yq -r '(.modules[] | select(.name == "mind-work-ai-studio")).sources[] | select(.type == "archive" and .only-arches[0] == "aarch64").url' org.MindWorkAI.AIStudio.yml)" = "$PDFIUM_ARM64_URL" test "$(yq -r '(.modules[] | select(.name == "mind-work-ai-studio")).sources[] | select(.type == "archive" and .only-arches[0] == "aarch64").url' org.mindworkai.AIStudio.yml)" = "$PDFIUM_ARM64_URL"
test "$(yq -r '(.modules[] | select(.name == "mind-work-ai-studio")).sources[] | select(.type == "archive" and .only-arches[0] == "aarch64").sha256' org.MindWorkAI.AIStudio.yml)" = "$PDFIUM_ARM64_SHA256" test "$(yq -r '(.modules[] | select(.name == "mind-work-ai-studio")).sources[] | select(.type == "archive" and .only-arches[0] == "aarch64").sha256' org.mindworkai.AIStudio.yml)" = "$PDFIUM_ARM64_SHA256"
for generated_source in cargo-sources.json dotnet-sources.json tauri-cli-sources.json; do for generated_source in cargo-sources.json dotnet-sources.json tauri-cli-sources.json; do
test -s "$generated_source" test -s "$generated_source"
@ -385,7 +392,7 @@ jobs:
branch="sync/ai-studio-${AI_STUDIO_TAG}" branch="sync/ai-studio-${AI_STUDIO_TAG}"
git checkout -B "$branch" git checkout -B "$branch"
git add org.MindWorkAI.AIStudio.yml org.MindWorkAI.AIStudio.metainfo.xml cargo-sources.json dotnet-sources.json tauri-cli-sources.json git add org.mindworkai.AIStudio.yml cargo-sources.json dotnet-sources.json tauri-cli-sources.json
if git diff --cached --quiet; then if git diff --cached --quiet; then
echo "Flatpak repository is already synced for ${AI_STUDIO_TAG}." echo "Flatpak repository is already synced for ${AI_STUDIO_TAG}."

132
runtime/Cargo.lock generated
View File

@ -242,6 +242,27 @@ version = "0.7.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50"
[[package]]
name = "ashpd"
version = "0.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d2f3f79755c74fd155000314eb349864caa787c6592eace6c6882dad873d9c39"
dependencies = [
"enumflags2",
"futures-channel",
"futures-util",
"rand 0.9.4",
"raw-window-handle",
"serde",
"serde_repr",
"tokio",
"url",
"wayland-backend",
"wayland-client",
"wayland-protocols",
"zbus",
]
[[package]] [[package]]
name = "ashpd" name = "ashpd"
version = "0.13.12" version = "0.13.12"
@ -1890,6 +1911,15 @@ dependencies = [
"syn 2.0.117", "syn 2.0.117",
] ]
[[package]]
name = "dlib"
version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412"
dependencies = [
"libloading 0.7.4",
]
[[package]] [[package]]
name = "dlopen2" name = "dlopen2"
version = "0.8.2" version = "0.8.2"
@ -1940,6 +1970,12 @@ dependencies = [
"tendril", "tendril",
] ]
[[package]]
name = "downcast-rs"
version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2"
[[package]] [[package]]
name = "dpi" name = "dpi"
version = "0.1.2" version = "0.1.2"
@ -4129,7 +4165,7 @@ dependencies = [
"aes 0.9.1", "aes 0.9.1",
"apple-native-keyring-store", "apple-native-keyring-store",
"arboard", "arboard",
"ashpd", "ashpd 0.13.12",
"async-stream", "async-stream",
"axum", "axum",
"axum-server", "axum-server",
@ -5194,6 +5230,12 @@ dependencies = [
"windows-sys 0.61.2", "windows-sys 0.61.2",
] ]
[[package]]
name = "pollster"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2f3a9f18d041e6d0e102a0a46750538147e5e8992d3b4873aaafee2520b00ce3"
[[package]] [[package]]
name = "portable-atomic" name = "portable-atomic"
version = "1.13.1" version = "1.13.1"
@ -5459,6 +5501,15 @@ dependencies = [
"memchr", "memchr",
] ]
[[package]]
name = "quick-xml"
version = "0.38.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b66c2058c55a409d601666cffe35f04333cf1013010882cec174a7467cd4e21c"
dependencies = [
"memchr",
]
[[package]] [[package]]
name = "quick-xml" name = "quick-xml"
version = "0.41.0" version = "0.41.0"
@ -5846,18 +5897,18 @@ version = "0.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a15ad77d9e70a92437d8f74c35d99b4e4691128df018833e99f90bcd36152672" checksum = "a15ad77d9e70a92437d8f74c35d99b4e4691128df018833e99f90bcd36152672"
dependencies = [ dependencies = [
"ashpd 0.11.1",
"block2 0.6.2", "block2 0.6.2",
"dispatch2", "dispatch2",
"glib-sys",
"gobject-sys",
"gtk-sys",
"js-sys", "js-sys",
"log", "log",
"objc2 0.6.4", "objc2 0.6.4",
"objc2-app-kit", "objc2-app-kit",
"objc2-core-foundation", "objc2-core-foundation",
"objc2-foundation 0.3.2", "objc2-foundation 0.3.2",
"pollster",
"raw-window-handle", "raw-window-handle",
"urlencoding",
"wasm-bindgen", "wasm-bindgen",
"wasm-bindgen-futures", "wasm-bindgen-futures",
"web-sys", "web-sys",
@ -6201,6 +6252,12 @@ dependencies = [
"syn 2.0.117", "syn 2.0.117",
] ]
[[package]]
name = "scoped-tls"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294"
[[package]] [[package]]
name = "scopeguard" name = "scopeguard"
version = "1.2.0" version = "1.2.0"
@ -8229,6 +8286,12 @@ dependencies = [
"serde_derive", "serde_derive",
] ]
[[package]]
name = "urlencoding"
version = "2.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da"
[[package]] [[package]]
name = "urlpattern" name = "urlpattern"
version = "0.3.0" version = "0.3.0"
@ -8567,6 +8630,66 @@ dependencies = [
"semver", "semver",
] ]
[[package]]
name = "wayland-backend"
version = "0.3.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fee64194ccd96bf648f42a65a7e589547096dfa702f7cadef84347b66ad164f9"
dependencies = [
"cc",
"downcast-rs",
"rustix 1.1.4",
"scoped-tls",
"smallvec",
"wayland-sys",
]
[[package]]
name = "wayland-client"
version = "0.31.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b8e6faa537fbb6c186cb9f1d41f2f811a4120d1b57ec61f50da451a0c5122bec"
dependencies = [
"bitflags 2.11.1",
"rustix 1.1.4",
"wayland-backend",
"wayland-scanner",
]
[[package]]
name = "wayland-protocols"
version = "0.32.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baeda9ffbcfc8cd6ddaade385eaf2393bd2115a69523c735f12242353c3df4f3"
dependencies = [
"bitflags 2.11.1",
"wayland-backend",
"wayland-client",
"wayland-scanner",
]
[[package]]
name = "wayland-scanner"
version = "0.31.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5423e94b6a63e68e439803a3e153a9252d5ead12fd853334e2ad33997e3889e3"
dependencies = [
"proc-macro2",
"quick-xml 0.38.4",
"quote",
]
[[package]]
name = "wayland-sys"
version = "0.31.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e6dbfc3ac5ef974c92a2235805cc0114033018ae1290a72e474aa8b28cbbdfd"
dependencies = [
"dlib",
"log",
"pkg-config",
]
[[package]] [[package]]
name = "web-sys" name = "web-sys"
version = "0.3.97" version = "0.3.97"
@ -9931,6 +10054,7 @@ dependencies = [
"endi", "endi",
"enumflags2", "enumflags2",
"serde", "serde",
"url",
"winnow 1.0.2", "winnow 1.0.2",
"zvariant_derive", "zvariant_derive",
"zvariant_utils", "zvariant_utils",

View File

@ -12,7 +12,7 @@ tauri-build = { version = "2.6.3", features = [] }
tauri = { version = "2.11.5", features = [] } tauri = { version = "2.11.5", features = [] }
tauri-plugin-window-state = { version = "2.4.1" } tauri-plugin-window-state = { version = "2.4.1" }
tauri-plugin-shell = "2.3.5" tauri-plugin-shell = "2.3.5"
tauri-plugin-dialog = "2.7.1" tauri-plugin-dialog = { version = "2.7.1", default-features = false, features = ["xdg-portal"] }
tauri-plugin-opener = "2.5.4" tauri-plugin-opener = "2.5.4"
tauri-plugin-single-instance = "2" tauri-plugin-single-instance = "2"
serde = { version = "1.0.228", features = ["derive"] } serde = { version = "1.0.228", features = ["derive"] }

View File

@ -0,0 +1,14 @@
[Desktop Entry]
Type=Application
Version=1.5
Name=MindWork AI Studio
GenericName=AI Studio
Comment=MindWork AI Studio is a free, independent cross-platform desktop app for local and cloud LLMs across providers, built to democratize AI access.
Keywords=AI;LLM;Assistant;
Exec=mind-work-ai-studio
TryExec=mind-work-ai-studio
Icon=org.mindworkai.AIStudio
Categories=Science;Utility;Office;
SingleMainWindow=true
DBusActivatable=false
StartupWMClass=org.mindworkai.AIStudio

View File

@ -0,0 +1,111 @@
<?xml version="1.0" encoding="UTF-8"?>
<component type="desktop-application">
<id>org.mindworkai.AIStudio</id>
<name>MindWork AI Studio</name>
<project_license>FSL-1.1-MIT</project_license>
<metadata_license>MIT</metadata_license>
<summary>MindWork AI Studio is a free, independent cross-platform desktop app for local and cloud LLMs across providers, built to democratize AI access.</summary>
<developer id="org.mindworkai">
<name>MindWork AI Community</name>
</developer>
<content_rating type="oars-1.1" />
<description>
<p>
MindWork AI Studio is a free desktop app for macOS, Windows, and Linux. It provides a unified user interface
for interaction with Large Language Models (LLM). AI Studio also offers so-called assistants, where prompting
is not necessary. You can think of AI Studio like an email program: you bring your own API key for the LLM of
your choice and can then use these AI systems with AI Studio.
</p>
<p>Key advantages:</p>
<ul>
<li>
Free of charge: The app is free to use, both for personal and commercial purposes.
</li>
<li>
Democratization of AI: MindWork AI Studio runs even on low-cost hardware, including
computers such as Raspberry Pi. This makes the app and its full feature set accessible
to people and families with limited budgets. You can start with local LLMs or use
affordable cloud models.
</li>
<li>
Independence: You are not tied to any single provider. Choose the providers that best
suit your needs, including OpenAI, Perplexity, Mistral, Anthropic, Google Gemini, xAI,
DeepSeek, Alibaba Cloud, OpenRouter, Hugging Face, Groq, Fireworks, Helmholtz, GWDG,
and self-hosted models.
</li>
<li>
Assistants: Use ready-made assistants for common business and other tasks without writing prompts yourself.
</li>
<li>
Unrestricted usage: Unlike services that impose limits after intensive use, MindWork
AI Studio lets you use provider APIs without restrictions imposed by the app.
</li>
<li>
Cost-effective: You only pay providers for what you use, which can be cheaper than a
monthly subscription when used infrequently. For intensive usage, API costs may be
higher, so you should monitor your provider accounts and use prepaid credit or cost
limits when available.
</li>
<li>
Privacy: Control which providers receive your data using provider confidence settings
and assign different protection levels to different tasks.
</li>
<li>
Flexibility: Choose the provider and model best suited to your current task.
</li>
<li>
No bloatware: The app requires little storage and memory and has minimal impact on
system resources and battery life.
</li>
</ul>
</description>
<launchable type="desktop-id">org.mindworkai.AIStudio.desktop</launchable>
<categories>
<category>Utility</category>
<category>Office</category>
<category>Science</category>
</categories>
<keywords>
<keyword>AI</keyword>
<keyword>Assistant</keyword>
<keyword>Privacy</keyword>
</keywords>
<url type="homepage">https://mindworkai.org</url>
<url type="bugtracker">https://github.com/MindWorkAI/AI-Studio/issues</url>
<url type="contact">https://github.com/MindWorkAI</url>
<url type="contribute">https://github.com/MindWorkAI/AI-Studio#contributing-ov-file</url>
<url type="vcs-browser">https://github.com/MindWorkAI/AI-Studio</url>
<provides>
<binary>mind-work-ai-studio</binary>
</provides>
<branding>
<color type="primary" scheme_preference="light">#b4bed5</color>
<color type="primary" scheme_preference="dark">#707e99</color>
</branding>
<screenshots>
<screenshot type="default">
<image>https://github.com/MindWorkAI/AI-Studio/blob/main/documentation/AI%20Studio%20Home.png?raw=true</image>
<caption>Getting started</caption>
</screenshot>
<screenshot>
<image>https://raw.githubusercontent.com/MindWorkAI/AI-Studio/refs/heads/main/documentation/AI%20Studio%20Assistants.png</image>
<caption>Assistants</caption>
</screenshot>
</screenshots>
<releases>
<release type="stable" version="26.7.3" date="2026-07-19">
<description>
<p>Update</p>
</description>
</release>
</releases>
</component>

View File

@ -0,0 +1,3 @@
{
"identifier": "org.mindworkai.AIStudio"
}