Your first build
With the toolchain in place, you are four commands away from a native app. This walks through each one.
1. Set up your app
every install writes config/everywhere.yml, drops a boot stub, and pins the
@rubyeverywhere/bridge JavaScript package in your importmap.
every install # remote mode: a shell around your deployed site
every install --local # local mode: compile and ship the app itself
Then describe your app in the generated config. The full reference is in everywhere.yml. The minimum is a name, a bundle id, and the route your window opens on:
app:
name: Notes
bundle_id: com.example.notes # set once, never change it
mode: local # local or remote
entry_path: /notes
Pick your
bundle_idcarefully. It names the app-data directory on every platform. Changing it later strands your users' data in the old location.
2. Develop in a native window
every dev boots your dev server and opens native shells on top of it, with
live reload.
every dev --desktop # the desktop window
every dev --ios # the iOS Simulator
every dev --android # an emulator, or a plugged-in phone
Inside the shell, and in any browser tab, the bridge is a global, so platform-specific behavior stays out of your app code:
import { Controller } from "@hotwired/stimulus"
export default class extends Controller {
async destroy() {
// native dialog in the app, window.confirm in a browser
if (await Everywhere.confirm("Delete this note?")) {
this.element.requestSubmit()
}
}
saved() {
Everywhere.notify({ title: "Saved", body: "Your note is safe." })
}
}
The same call resolves to a Tauri dialog on desktop, a native component on iOS
and Android, and web APIs in a browser. Never reference __TAURI__ directly.
3. Build and ship
One command presses your app, Ruby runtime included, into a single binary and wraps it in a native bundle:
every build
# → dist/Notes.app (double-clickable, nothing to install)
# → dist/notes (the raw pressed binary)
That .app runs on your machine straight away. To hand it to other people
without "unidentified developer" warnings, sign and notarize it: see
macOS and
signing and notarization.
For a phone, every build --ios and every build --android stamp and compile
the mobile shells instead. Those pages cover each in full.