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.

Reminder

Read and write reminders

A reminder, shaped like Event: a constructor, a fetch, and save()/remove() on what you get back. Due dates are DateTimes; EventKit stores date components and this converts both ways. Priority is 0 for none, 1 to 4 high, 5 medium, 6 to 9 low, matching EventKit. Needs reminders access.

Properties

identifierString

Stable id. Empty until the reminder has been saved.

titleString

What it says.

notesString

Longer text, or null.

isCompletedBoolean

Whether it is done.

completionDateDateTime ›

When it was completed, or null.

priorityNumber

0 none, 1-4 high, 5 medium, 6-9 low.

When it is due, or null.

listAny

The list it belongs to.

urlString

An associated URL, or null.

Methods

.save()RootlessReminder

Writes changes, creating the reminder if it is new. Returns itself with the stored values filled in.

.remove()

Deletes it.

.complete(done?)RootlessReminder

Marks it done, or pass false to un-complete it. Saves immediately.

  • done Boolean
Reminder(config?)RootlessReminder

Creates a reminder. Call save() on it to write it.

  • config Any
    • title String required

      What it is called.

    • notes String

      Free text.

    • dueDate DateTime

      When it is due.

    • priority Number

      0 none, 1 to 4 high, 5 medium, 6 to 9 low.

    • list String

      Which list, by title or identifier. The default one when left out.

    • isCompleted Boolean

      Create it already done.

    • url String

      A link to attach.

Reminder.fetch(query?)[RootlessReminder]

Reminders matching a query.

  • query Any
    • completed Boolean

      Only done, or only not. Left out, both.

    • list String

      A list title or identifier.

    • from DateTime

      Due no earlier than this.

    • to DateTime

      Due no later than this.

Reminder.lists()[Any]

Every reminder list.

returns One { identifier, title, color, isEditable } per list.

Examples

Today's list

var todo = Reminder.fetch({ completed: false, list: "Personal" });

Column({ children: todo.slice(0, 4).map(function (r) {
  return Toggle({
    value: r.isCompleted,
    label: r.title,
    style: ToggleStyle.checkbox,
    action: "done",
    payload: { id: r.identifier },
  });
}) })

Adding one

var r = new Reminder({
  title: "Water the plants",
  dueDate: DateTime.now().add(Duration.hours(3)),
  priority: 5,
  list: "Personal",
});
r.save();