Docs

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.

Terminal bash
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:

config/everywhere.yml yaml
app:
  name: Notes
  bundle_id: com.example.notes   # set once, never change it
  mode: local                    # local or remote
  entry_path: /notes

Pick your bundle_id carefully. 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.

Terminal bash
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:

app/javascript/controllers/notes_controller.js js
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:

Terminal bash
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.

Rails · Hanami · Sinatra — built with Ruby