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.

Keychain

Encrypted per-script storage

Encrypted storage for API keys, scoped per script and readable from the widget. Put keys here rather than in a string literal: script source travels inside any exported .js file, so a key written into a script is shared with it.

Methods

Keychain.set(key, value)Boolean

Stores a value. Returns false if it could not be written.

  • key String required
  • value String required
Keychain.get(key)String

The stored value, or null.

  • key String required
Keychain.has(key)Boolean

Whether a value is stored under this key.

  • key String required
Keychain.delete(key)Boolean

Removes the value.

  • key String required

Examples

Using a stored key

// once, from a script you run in the app:
// Keychain.set("apiKey", "…");

var key = Keychain.get("apiKey");
if (!key) {
  Script.setWidget(new Widget({ child: Text("No API key set") }));
} else {
  var res = Http.get(url + "?appid=" + key);
}