My colleague and I are currently doing our Master’s internship, and we are working on a synaptic plasticity model built with the SciML ecosystem.
Our main goal right now is to build a user-friendly interface so that biologists can easily run simulations, tweak parameters (like temperature,ions concentration, etc.), and visualize the results without having to write a single line of Julia code.
We are currently at a crossroads regarding the architecture of this interface, and we would love to get your feedback and advice. We are hesitating between two approaches: 1. A Local GUI using Makie.jl (with Observables)
The idea: Building a standalone local app.
Pros: Extremely fast and responsive once loaded; great for heavy, complex interactive plotting; very useful for our own day-to-day research.
Cons: Requires the end-user (biologists) to install Julia locally and deal with the “Time To First Plot” / precompilation times (which can be a bit scary for non-coders).
2. A Web Application using Genie.jl (GenieBuilder )
The idea: Deploying the model on a server so users access it via their browser.
Pros: Zero installation required for the end-user; extremely accessible and easy to share.
Cons: Might be harder to maintain for a small team; potentially less interactive/responsive for heavy real-time plot updates compared to Makie.
Our questions for the community:
As a potential user (or a scientist sharing tools with non-coders), what would you prefer? Installing a local Julia environment to get a highly responsive Makie GUI, or having a ready-to-use web app, even if it has some limitations?
For those of you who have built interfaces for differential equation models, which path did you choose and why ? Which one did you find more maintainable in the long run ?
Is there a way to achieve both without rewriting everything? For example, is there a recommended workflow or framework that allows sharing the core UI logic to deploy both a local app and a web dashboard ?
Any insights, feedback, or shared experiences would be incredibly helpful for us to make the right decision.
I think the most flexible approach would be to deploy a Genie.jl application, then inside that application, you can use Bonito.jl to generate an interactive dashboard and write it to HTML as suggested by @asinghvi17.
For install convenience, you can consider creating a Pkg app: 6. Apps · Pkg.jl. Users can simply install the Pkg app you created from github, and then run it directly from any commandline.
From my experience the lowest entrance barrier is to provide it as a web service.
Eventually, that will run into limitations in terms of number of concurrent users or amount of data people can process, etc.
So I’d treat it as a way to give people a way to try it out and then you could distribute a standalone version to people who have high usage demands. You could still let them run it in the browser, just locally.
I’m not really sure why one would use Genie with Bonito, since Bonito should offer most Genie features. So I’d use either Genie or Bonito, but I’m obviously biased there
Bonito has the best Makie integration, if that’s important, since WGLMakie is implemented using Bonito.
Lots of people also prototype in GLMakie, and then you can just switch out the backend and have the same dashboard work on the web, which gives the best of both worlds. We’ve been fixing most incompatibilities, so I dont know of any functionality at this point which is missing in WGLMakie compared to GLMakie.
But WGLMakie has quite some latency compared to GLMakie and the WGLMakie widgets are also slower compared to HTML native widgets via Bonito.
Also there’s much more room for styling in Bonito, so people then usually start using more Bonito around the WGLMakie dashboard.
Although, if looks dont matter as much, we just recently implemented WGLMakie.activate!(use_html_widgets=true) which replaces the Makie native widgets with much faster HTML widgets, so that problem at least can be worked around.
This is precisely the hurdle that AppBundler.jl addresses — it makes it straightforward to create application installers for Windows, Linux, and macOS. I’m currently drafting new documentation for the 1.0 release, which I hope to publish this weekend. The revised API using LocalPreferences.toml also makes the workflow considerably easier than before. I’d recommend checking it out.
If you’re up for a slightly different UI paradigm, I can recommend CImGui.jl and ImPlot.jl for this kind of thing. The TTFX is very low and in my experience it’s much easier to build interactive UIs with an immediate mode library.
(disclaimer: I’m a maintainer of both those libraries)