Rootless

Automate iOS, iPadOS, and macOS using plain JavaScript. Build custom widgets and interact directly with native APIs.

Download on the App Store
Rootless app interface

Plain JavaScript

Supports ES6. Scripts are stored as plain .js files on your disk.

Native APIs & Documentation

Integrate directly with iOS native APIs. Fully documented, available offline.

Siri Shortcuts

Trigger scripts via Siri. Present tables, websites, and custom HTML natively.

System Integration

Run from the Share Sheet, process inputs, and manage local files via Files.app.

x-callback-url

Communicate seamlessly and trigger workflows with other apps on your device.

Customizable & Ready

Tailor the code editor to your liking. Includes several example scripts to start immediately.

Documentation

Also inside the app, or as rootless.json.

Button

Tappable button

A tappable element. Pass child to draw it yourself, or text for a plain label. action is a name your script recognises: the tap re-runs the script with that action in Script.actions, in the widget and in the preview.

Methods

Button(options?)WidgetNode

A tappable button.

  • options Any
    • text String

      A plain label. Ignored when child is given.

    • color Color

      Label colour.

    • padding EdgeInsets

      Space around the label.

    • child WidgetNode

      Draw the button yourself. Wins over text.

    • action String

      A name your script recognises. The tap re-runs the script with it in Script.actions.

    • payload Any

      Any JSON value, delivered alongside the action.

Examples

Counter button

var count = Storage.get("count") || 0;

Script.onAction(function (a) {
  if (a.name === "increment") count += a.payload.by;
});
Storage.set("count", count);

Script.setWidget(new Widget({
  child: Row({ children: [
    Text(String(count)),
    Button({ text: "+1", action: "increment", payload: { by: 1 } }),
  ]}),
}));