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.

Transition

How a view enters and exits

Only fires on a node that also carries a stable id. Without one the system treats the view as new and crossfades it.

Methods

Transition.opacity()Any

Fades in and out.

Transition.slide()Any

Slides in from the leading edge and out to the trailing one.

Transition.scale()Any

Grows in and shrinks out.

Transition.blurReplace()Any

Blurs one out while the other sharpens in.

Transition.identity()Any

No transition: the view is simply there or not.

Transition.move(edge?)Any

Moves in and out through the given edge.

  • edge Edge

    Which side. Default bottom.

Transition.push(edge?)Any

Pushes in from the given edge while the old view leaves through the opposite one.

  • edge Edge

    Which side. Default bottom.

Transition.asymmetric(insertion, removal)Any

Different transitions for arriving and leaving.

  • insertion Any required

    Used when the view appears.

  • removal Any required

    Used when it goes away.

Transition.combined(first, second)Any

Runs two transitions together.

  • first Any required

    One transition.

  • second Any required

    The other.

Examples

Transitions

Transition.push(Edge.bottom)
Transition.move(Edge.leading)
Transition.asymmetric(Transition.push(Edge.bottom), Transition.opacity())