# \[ANN\] AppBundler v1.0: Native Installers for Julia Applications

**URL:** https://discourse.julialang.org/t/ann-appbundler-v1-0-native-installers-for-julia-applications/136438
**Category:** Package Announcements
**Tags:** announcement, release, compilation, gui, juliac
**Created:** [March 28, 2026, 11:01pm UTC](https://discourse.julialang.org/t/ann-appbundler-v1-0-native-installers-for-julia-applications/136438 "2026-03-28T23:01:55Z")
**Posts on this page:** 9
**Page:** 1

<div class="post-metadata">

### Author: ![Janis\_Erdmanis](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/janis_erdmanis/32/10869_2.png) [@Janis\_Erdmanis](https://discourse.julialang.org/u/Janis_Erdmanis)
#### Post date: [March 28, 2026, 11:01pm UTC](https://discourse.julialang.org/t/ann-appbundler-v1-0-native-installers-for-julia-applications/136438/1 "2026-03-28T23:01:55Z")

</div>

Packaging a Julia application into a native installer has traditionally meant wrestling with platform-specific tooling on each target system. I am pleased to announce [AppBundler v1.0](https://github.com/PeaceFounder/AppBundler.jl) changes that. Turn any Julia application into a Snap (Linux), MSIX (Windows), or DMG (macOS) installer without leaving the Julia ecosystem, using cross-compiled utilities from Yggdrasil instead.

For those following along from [earlier announcements](https://discourse.julialang.org/t/ann-appbundler-jl-bundle-your-julia-gui-application/106971), this release marks the first stable version with a [substantial API redesign](https://github.com/PeaceFounder/AppBundler.jl/releases/tag/v1.0.0).

## Getting started

If you can launch your application with `julia --project=. -m MyApp`, it’s ready to bundle. Install AppBundler as an app with `]app add AppBundler`, make sure `~/.julia/bin` is in your `PATH`, then build:

```julia-auto
appbundler build . --build-dir=build --selfsign

```

This creates a platform-local bundle in the `build` directory.

[![](https://global.discourse-cdn.com/julialang/original/3X/b/3/b3487daed50351cb45f0447674ad1d8483627964.jpeg "AppBundler v1.0") ](https://www.youtube.com/watch?v=x-3RUXw15tc)

This makes it easy to distribute your Julia app to non-technical users via a self-contained installer, avoid setting up packaging tools on every platform, and maintain a simple CI workflow for cross-platform bundling (e.g. [Jumbo CI](https://github.com/JanisErdmanis/Jumbo/blob/main/.github/workflows/Release.yml)).

## Compilation options

| Mode | Best for | Trade-off |
| --- | --- | --- |
| None | Fastest builds, cross-platform bundling | Compilation on the user’s machine |
| Pkgimages | Fast builds, fast startup | Loading overhead, larger binaries |
| Sysimage | Fastest startup | Longer build time |
| JuliaC | Smallest binaries, fastest startup | Requires explicit asset declarations |

Sysimage and pkgimage strategies can be combined for applications that load some packages on demand. In all cases, non-Julia assets referenced with `pkgdir(@ __MODULE__ )` remain accessible.

## Configuration

The resulting bundle can be configured via command line, `LocalPreferences.toml`, or by overriding configuration file templates within the project’s meta directory. All major `LocalPreferences.toml` use cases have been manually tested across all three platforms.

See [Jumbo](https://discourse.julialang.org/t/ann-jumbo-a-scientific-julia-distribution/133856), [PeaceFounderClient](https://github.com/PeaceFounder/PeaceFounderClient), [BonitoBook](https://github.com/SimonDanisch/BonitoBook.jl/pull/34), and [KomaMRI](https://github.com/JuliaHealth/KomaMRI.jl/pull/640) for real-world use cases, and start experimenting with the [listed examples](https://github.com/PeaceFounder/AppBundler.jl/tree/main/examples). For detailed configuration and deployment options, see the [documentation](https://peacefounder.github.io/AppBundler.jl/dev/).

## What’s next

With v1.0 shipped, the project enters maintenance mode. A second phase of NLNET funding is lined up, which, if approved, would support further development. Near-term plans include trimming indirect dependencies to speed up installation. If funding comes through, priorities include making code signing robust for Apple notarization, integrating MSIX code signing with a hardware token, and adding Flatpak support. Bundling non-Julia projects (Rust, Go) via cross-compilation is another interesting direction. If any of this aligns with your needs, I’m open to consulting and collaboration — feel free to reach out.

---

<div class="post-metadata">

### Author: ![ufechner7](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/ufechner7/32/51363_2.png) [@ufechner7](https://discourse.julialang.org/u/ufechner7)
#### Post date: [March 29, 2026, 12:16pm UTC](https://discourse.julialang.org/t/ann-appbundler-v1-0-native-installers-for-julia-applications/136438/2 "2026-03-29T12:16:26Z")

</div>

Thanks for the good work!

Question: As far as I know, `PyPlot.jl` is not supported. Which plotting libraries work well with AppBundler? Does Makie work? My experience is that even `Plots.jl` often fails to plot when put into a system image because the display stack is frozen at compile time.

---

<div class="post-metadata">

### Author: ![Janis\_Erdmanis](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/janis_erdmanis/32/10869_2.png) [@Janis\_Erdmanis](https://discourse.julialang.org/u/Janis_Erdmanis)
#### Post date: [March 29, 2026, 5:45pm UTC](https://discourse.julialang.org/t/ann-appbundler-v1-0-native-installers-for-julia-applications/136438/3 "2026-03-29T17:45:50Z")

</div>

Makie works just fine, which I had tested for bundling via [ImageColorThresholderApp](https://github.com/rakeshksr/ImageColorThresholderApp.jl/pull/4). I did hit an issue on Windows there, but it turned out to be a problem with my virtual machine setup that has issues with Makie itself. Pretty much every other plotting library should work out of the box except PyPlot.jl, as it depends on Python, which AppBundler does not bother bundling. For instance, bundling GR works just fine, which you can try with:

```julia-auto
module SinPlotter

using GR

function (@main)(args)
    x = range(0, 2π, length=200) |> collect
    y = sin.(x)

    GR.plot(x, y,
        title = "Plot of sin(x)",
        xlabel = "x",
        ylabel = "y",
        linewidth = 2
    )

    println("Displaying plot. Press Enter to exit.")
    readline()

    return 0
end

export main

end # module SinPlotter

```

And build it the same way via `appbundler build . --build-dir=build --selfsign`.

---

<div class="post-metadata">

### Author: ![GeorgeGkountouras](https://avatars.discourse-cdn.com/v4/letter/g/77aa72/32.png) [@GeorgeGkountouras](https://discourse.julialang.org/u/GeorgeGkountouras)
#### Post date: [March 29, 2026, 7:42pm UTC](https://discourse.julialang.org/t/ann-appbundler-v1-0-native-installers-for-julia-applications/136438/4 "2026-03-29T19:42:18Z")

</div>

Thanks for this, it really pushes the ecosystem forward!

Just confirming the status of a couple specific cases:

1. A compiled CUDAApp would not download or compile on the user’s machine.
2. Windows libraries made with JuliaC are still waiting for upstream support in JuliaC itself.

---

<div class="post-metadata">

### Author: ![langestefan](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/langestefan/32/207923_2.png) [@langestefan](https://discourse.julialang.org/u/langestefan)
#### Post date: [March 29, 2026, 7:46pm UTC](https://discourse.julialang.org/t/ann-appbundler-v1-0-native-installers-for-julia-applications/136438/5 "2026-03-29T19:46:28Z")

</div>

> [@Janis\_Erdmanis](#):
>
> and adding Flatpak support

I would be very interested in this! I’ve had a lot of problems with snap on fedora so I have kind of given up on it. Could you estimate how much work it would be to add flatpak support? I might pick this up if you have no time

---

<div class="post-metadata">

### Author: ![Janis\_Erdmanis](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/janis_erdmanis/32/10869_2.png) [@Janis\_Erdmanis](https://discourse.julialang.org/u/Janis_Erdmanis)
#### Post date: [March 29, 2026, 9:13pm UTC](https://discourse.julialang.org/t/ann-appbundler-v1-0-native-installers-for-julia-applications/136438/6 "2026-03-29T21:13:32Z")

</div>

Same questions 😉 I don’t have a CUDA system, so I can’t test the built applications, but I do expect CUDA-enabled applications to run just fine as the relevant artefacts are bundled in. Regarding bundling libraries on Windows with MSIX, it may be possible using VFS — you would need to find the appropriate AppxManifest.xml configuration and bundle the libraries manually via the API ([Reference · AppBundler.jl](https://peacefounder.org/AppBundler.jl/dev/reference/)). This is a fairly sophisticated use case, so for more hands-on support I’m available for consulting to hammer out the details.

---

<div class="post-metadata">

### Author: ![Janis\_Erdmanis](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/janis_erdmanis/32/10869_2.png) [@Janis\_Erdmanis](https://discourse.julialang.org/u/Janis_Erdmanis)
#### Post date: [March 29, 2026, 9:19pm UTC](https://discourse.julialang.org/t/ann-appbundler-v1-0-native-installers-for-julia-applications/136438/7 "2026-03-29T21:19:46Z")

</div>

It’s a moderate level of work with some manual testing if one relies on `flatpak-builder` being installed on the host system. AppBundler so far distributes all tooling via Yggdrasil, and putting `flatpak-builder` there is a hard problem — it appears that `flatpak-builder` and the Flatpak runtime are interleaved, which couples it to the Linux kernel and makes the tooling very difficult to bundle independently.

That said, it seems feasible to build a Flatpak package using OSTree alone, which reduces the question to whether OSTree can be cross-compiled with a Yggdrasil recipe. I don’t have an answer to that yet, but it’s the first thing to figure out.

---

<div class="post-metadata">

### Author: ![langestefan](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/langestefan/32/207923_2.png) [@langestefan](https://discourse.julialang.org/u/langestefan)
#### Post date: [March 29, 2026, 9:21pm UTC](https://discourse.julialang.org/t/ann-appbundler-v1-0-native-installers-for-julia-applications/136438/8 "2026-03-29T21:21:28Z")

</div>

Thanks! Would be great to have this information in a github issue to track progress, if it isn’t already

---

<div class="post-metadata">

### Author: ![Janis\_Erdmanis](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/janis_erdmanis/32/10869_2.png) [@Janis\_Erdmanis](https://discourse.julialang.org/u/Janis_Erdmanis)
#### Post date: [March 29, 2026, 9:21pm UTC](https://discourse.julialang.org/t/ann-appbundler-v1-0-native-installers-for-julia-applications/136438/9 "2026-03-29T21:21:59Z")

</div>

Sure! Open an issue
