Sinatra backend serving a basic Leaflet map, wrapped in a Tauri desktop shell that starts the same server in a native window.
2.4 KiB
Architecture
Overview
MapTool is a Sinatra web application. The desktop build does not
reimplement anything natively — it wraps the same Sinatra app in a
Tauri window, which is the standard way to ship a
non-JavaScript backend as a desktop app with Tauri: the Rust shell owns
the native window and starts the web server as a local process; the
window then simply loads http://127.0.0.1:4567 as if it were a
regular page.
+----------------------------+
| Tauri window (WebView) |
| loads http://127.0.0.1:PORT
+--------------+-------------+
|
v
+----------------------------+
| Sinatra app (Puma) |
| app.rb / config.ru |
+----------------------------+
Directory layout
| Path | Purpose |
|---|---|
|
Sinatra application and Rack entry point. |
|
Puma server configuration (binds to |
|
Frontend assets and Sinatra templates. The map view uses Leaflet. |
|
The Tauri (Rust) desktop shell. |
|
Project documentation, in AsciiDoc. |
Desktop shell (Tauri)
In development, src-tauri/tauri.conf.json sets beforeDevCommand
to start Puma, and devUrl points the window at it. Running the dev
build (see docs/development.adoc) starts both together.
In a packaged build there is no beforeDevCommand hook, so
src-tauri/src/lib.rs starts the server itself (bundle exec puma)
next to the bundled resources when the app launches, and stops it when
the window closes.
Known limitation: production packaging
The packaged-build server spawn currently assumes a Ruby + Bundler installation already present on the machine running the app. That is fine for internal or developer builds, but not for a distributable, self-contained desktop app.
Shipping a real self-contained build would mean embedding a Ruby runtime as a Tauri sidecar binary (for example, produced with tebako), instead of relying on the system Ruby. That decision — and the resulting sidecar build step — is not implemented yet and should be revisited before any real distribution build.
Networking
The Sinatra server only binds to 127.0.0.1. It is not meant to be
reachable from other machines; the Tauri window talks to it over
loopback only.