Skip to content

Add juliaupgui: graphical interface for juliaup#1439

Draft
IanButterworth wants to merge 10 commits intomainfrom
ib/gui
Draft

Add juliaupgui: graphical interface for juliaup#1439
IanButterworth wants to merge 10 commits intomainfrom
ib/gui

Conversation

@IanButterworth
Copy link
Member

@IanButterworth IanButterworth commented Mar 1, 2026

Closes #54
Some discussion in JuliaLang/www.julialang.org#2430

Developed with Claude.

New juliaupgui workspace crate (eframe/egui 0.29) providing a native GUI
for managing Julia installations, accessible via `juliaup gui`.

Installed tab:

  • Tile and list views with launch, update, set-default, remove actions
  • Whole-tile click to launch; hover highlights and pointer cursor
  • Custom launch popup with project directory, extra args, and env vars
  • Per-session persistence of project dir, args, and env vars

Available tab:

  • Filterable channel list with install buttons and PR-number prompts
  • Nested channel tree with expand/collapse; popular channels highlighted
  • Link existing Julia binaries to custom channel names

Configuration tab:

  • All juliaup settings: DB update interval, auto-install, manifest detect,
    channel symlinks
  • Directory overrides management (add/remove/prune non-existent)
  • Terminal application preference with file browser (rfd)
  • Self-update, refresh DB, and garbage collect actions

Platform integration:

  • macOS: .app bundle in /Applications with generated .icns icon
  • Linux: .desktop file and PNG icon in XDG directories
  • Shortcuts created on install, refreshed on self-update, removed on uninstall
  • Launch opens new terminal window (Terminal.app, iTerm2, or configured app)
  • Julia three-dot logo (SVG-accurate) as window icon and app icon

Infrastructure:

  • Background worker thread for non-blocking operations
  • Subprocess streaming with ANSI stripping for output-producing ops
  • Activity log panel with collapsible history

Fresh install

Screenshot 2026-03-02 at 9 48 18 PM
Screenshot 2026-03-02 at 8 47 59 PM Screenshot 2026-03-02 at 8 48 07 PM Screenshot 2026-03-02 at 8 48 14 PM Screenshot 2026-03-02 at 9 17 18 PM Screenshot 2026-03-02 at 8 48 26 PM

@ViralBShah
Copy link
Member

Would it make sense for the UI to present a multi-level view? Show the top level releases - 1.10, 1.11, nightly etc. And then click on that to get in to see all the different RCs, patch versions, etc.

I think it would be valuable for the first screen to be newbie friendly that basically just installs/updates the latest stable version and maybe also offers the LTS version. You then click on something called "Channels" to go into all the other options.

@ViralBShah
Copy link
Member

The JuliaUp version number next to the title (1.19.9) has the risk of being confused with the Julia version number. Perhaps you should only get it through an About section.

@ViralBShah
Copy link
Member

ViralBShah commented Mar 1, 2026

Completely random and off-topic here - but it would be great to have the same UI manage packages and environments as well. So that you have one UI for installing and managing everything.

Would it make sense for this to be a separate repo?

@davidanthoff
Copy link
Collaborator

This is very cool!!

Completely random and off-topic here - but it would be great to have the same UI manage packages and environments as well. So that you have one UI for installing and managing everything.

Agreed! And apps. I generally think we should integrate apps more into the Juliaup story. I'm thinking of apps as something global per system installed, and I think centralizing those kind of things under Juliaup would make sense.

Random other note: it would also be nice to have a UI like this in the VS Code extension. So maybe another idea would be to try to implement the UI in some kind of web framework, then expose it as a native client via tauri, and in the VS Code extension. Juliaup itself could just expose a JON-RCP interface that the UI code call into to do actual data operations. Main drawback of this though is that it is a heck of a lot more indirections and complicated... So I could also see an argument to just go with a simple version initially a la this PR, and then later make it more sophisticated...

@StefanKarpinski
Copy link
Member

This looks great. Vibe coding is amazing...

@IanButterworth
Copy link
Member Author

I think the first tab should default to a big friendly tile view, then this view be the "list" view alternative. That should work better for more basic usage.

@IanButterworth
Copy link
Member Author

IanButterworth commented Mar 2, 2026

Added a more basic default tile view and nesting in the channel list. Updated the screenshots up top

@IanButterworth IanButterworth force-pushed the ib/gui branch 5 times, most recently from 94541b4 to f1e2ecc Compare March 4, 2026 16:09
New juliaupgui workspace crate (eframe/egui 0.29) providing a native GUI
for managing Julia installations, accessible via \`juliaup gui\`.

Installed tab:
  - Tile and list views with launch, update, set-default, remove actions
  - Whole-tile click to launch; hover highlights and pointer cursor
  - Custom launch popup with project directory, extra args, and env vars
  - Per-session persistence of project dir, args, and env vars

Available tab:
  - Filterable channel list with install buttons and PR-number prompts
  - Nested channel tree with expand/collapse; popular channels highlighted
  - Link existing Julia binaries to custom channel names

Configuration tab:
  - All juliaup settings: DB update interval, auto-install, manifest detect,
    channel symlinks
  - Directory overrides management (add/remove/prune non-existent)
  - Terminal application preference with file browser (rfd)
  - Self-update, refresh DB, and garbage collect actions

Platform integration:
  - macOS: .app bundle in /Applications with generated .icns icon
  - Linux: .desktop file and PNG icon in XDG directories
  - Shortcuts created on install, refreshed on self-update, removed on uninstall
  - Launch opens new terminal window (Terminal.app, iTerm2, or configured app)

Infrastructure: - Julia three-dot logo (SVG-accurate) as window icon and app icon
  - Background worker thread for non-blocking operations
  - Subprocess streaming with ANSI stripping for output-producing ops
  - Activity log panel with collapsible history
Co-Authored-By: Claude <claude@anthropic.com>
@IanButterworth
Copy link
Member Author

Can I request a few people try this out here. If it's looking good I'll focus on code polish before asking for review. (Claude thinks its code is good at least, with only minor findings...).

Note I updated the top post with a description of all the changes.

IanButterworth and others added 4 commits March 5, 2026 10:53
Co-Authored-By: Claude <claude@anthropic.com>
Co-Authored-By: Claude <claude@anthropic.com>
Co-Authored-By: Claude <claude@anthropic.com>
@IanButterworth IanButterworth marked this pull request as ready for review March 5, 2026 18:52
- Append EXE_SUFFIX to juliaupgui binary name in juliaup.rs,
  juliainstaller.rs, and command_selfupdate.rs (Windows .exe fix)
- Platform-specific shell quoting: POSIX single-quotes on Unix,
  double-quote escaping on Windows for cmd.exe
- Escape paths with spaces in Linux .desktop Exec= field per
  Desktop Entry spec
- Add #[cfg(test)] module with 21 unit tests covering clean_line,
  shell_quote, build_launch_cmd, julia_logo_icon, and JULIA_DOTS
- Add test-juliaupgui CI job (ubuntu, macOS, Windows) to test.yml
@IanButterworth
Copy link
Member Author

I've addressed review findings from Claude Opus 4.6 and Codex 5.3.

I'm planning to go ahead and merge this and put it out on releasepreview for people to try out.

@davidanthoff
Copy link
Collaborator

Ok, just took a very quick look at the code structure. Why are we introducing this whole app_shortcut stuff? Isn't this just a new binary, and we should handle it exactly like all the other binaries, i.e. julia and juliaup?

@IanButterworth
Copy link
Member Author

IanButterworth commented Mar 5, 2026

This installs juliaupgui as an application on the system i.e. on macOS it creates an .app and installs it into /Applications so that the user can double-click on that to run it. I've thought less about how that works on linux/windows, but it should be done if claude is to be believed.

@davidanthoff
Copy link
Collaborator

Hm, so at least for Windows we definitely want to handle this differently.

I'll take another look at MacOS.

On Linux, I have no idea whether there is something like "shortcuts" for programs that show up in some launch menu? But for invocation from the command line, it seems it should be handled exactly like juliaup etc, right?

And then in general we'll need to change Github workflow that builds everything, I don't think it will be bundled at all otherwise.

@davidanthoff
Copy link
Collaborator

Just started to run it on Windows. The default screen I get is:

image

That color scheme is not ideal, hard to read things.

@IanButterworth
Copy link
Member Author

Can you try on darkmode. I'll fix light mode (I hadn't tested that)

@IanButterworth
Copy link
Member Author

Also I'll make it default to list view when there are many channels installed.

@davidanthoff
Copy link
Collaborator

Dark mode looks good:

image

@davidanthoff
Copy link
Collaborator

Might also make sense to add a config for that? Right now it picks up the Windows system setting, which seems the right thing as a default, but might be nice to have an override option.

IanButterworth and others added 4 commits March 6, 2026 09:14
- Add dark/light/system theme with macOS dark mode detection
- Persist installed view mode (tile/list) and theme preference
- Add show-once list tip bubble anchored to view selector
- Replace hardcoded dark-mode colors with theme-aware helpers
- Remove favorites-first sorting from available tab
- Add juliaupgui to workspace default-members
- Add juliaupgui to release workflow, WiX MSI, and MSIX packaging
- Fix light mode contrast: selection.stroke and active.fg_stroke adapt to theme
- List view remove button now says 'Remove' instead of 'x'

Co-authored-by: Claude <noreply@anthropic.com>
@davidanthoff davidanthoff added the DO NOT MERGE Do not merge this PR! label Mar 6, 2026
@davidanthoff
Copy link
Collaborator

I added the DO NOT MERGE label, not because I don't like this PR, but because @IanButterworth and I discussed a sequencing for this PR that will have it wait a bit until we have the Windows Store submission working again. So this is just informational for everyone else to please not merge at this point :)

@IanButterworth IanButterworth marked this pull request as draft March 6, 2026 19:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

DO NOT MERGE Do not merge this PR!

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add a GUI application for Julia version management

4 participants