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.

Calendar

Event calendar access and manipulation

The user's calendars. Fetch, create, edit and delete events, including recurrence rules. Needs calendar access.

Properties

identifierString

Calendar identifier

titleString

Calendar title

isSubscribedBoolean

Whether this is a subscribed calendar

allowsContentModificationsBoolean

Whether this calendar allows modifications

Calendar color

Methods

.getEvents(query?)[Event] ›

Fetch events from this calendar.

.supportsAvailability(availability)Boolean

Check if this calendar supports a given availability type.

  • availability String required
.save()

Save changes to this calendar.

.remove()

Delete this calendar.

Calendar.fetch(options?)Calendar ›

Fetch calendars.

  • options Any

    Left out entirely, every calendar comes back.

    • default Boolean

      The calendar new events go into.

    • title String

      Match by name.

    • identifier String

      Match by identifier.

returns Every calendar with no options, one calendar when matching, null when nothing matches.

Calendar.presentPicker(allowMultiple?)[Calendar] ›

Present the system calendar picker.

  • allowMultiple Boolean

Examples

Fetch today's events

const events = Event.fetch({
  timeframe: "today"
});
for (const e of events) {
  console.log(e.title, e.startDate.format("HH:mm"));
}

Create recurring event

const event = new Event({
  title: "Standup",
  startDate: DateTime.from({hour: 9, minute: 30}),
  endDate: DateTime.from({hour: 9, minute: 45})
});
event.setRecurrence({
  frequency: "weekly", interval: 1
});
event.save();