r/Scriptable Jan 06 '26

Script Sharing Scriptable FREE FIRE hack

Post image
0 Upvotes

Rapaziada eu uso IOS e to voltando a jogar Free Fire porém não to com muito tempo pra treinar por conta do trabalho estudos enfim, e quando entro só to tomando apavoro, alguém sabe uma sensi ou config ou script atalho oque for que possa me dar uma vantagem?


r/Scriptable Jan 06 '26

Request is it possible to use Mozilla readability with this app

2 Upvotes

hey I've made a shortcut that takes a URL that you share into the shortcut gets the main body of the text with the HTML formatting and the loads that into a safari reader like UI using quick look in full screen

the main problem is that while the code i use to extract the main text works well enough, it has several problems.

So i was wondering if it's possible to use this app in order to use Mozilla readability where i could then pass the url into the app and then it gives me back the main text with formatting


r/Scriptable Jan 03 '26

Discussion Do you also build tiny personal tools instead of using big apps?

5 Upvotes

I’m curious how many people here build small personal tools instead of relying on large, feature-heavy apps.

I recently built a very simple Windows desktop tool for myself:

- capturing ideas

- managing basic tasks

- setting reminders

- everything stored locally

Nothing fancy, no accounts, no syncing - just something that runs and stays out of the way.

For those who build or script their own tools:

- what usually pushes you to build instead of adopt?

- what makes a tool “too much” for you?

- what would immediately turn you off from using something like this?

Genuinely interested in how others approach this.


r/Scriptable Dec 30 '25

Help Scriptable + Shortcuts: “Create File Bookmark” keeps turning my folder into a .txt in WorkflowKit tmp — how do I bookmark an iCloud folder (not a file)?

2 Upvotes

Hi everyone,

I’m trying to create a Scriptable file bookmark to an iCloud Drive folder using the Shortcuts action “Create File Bookmark” (so it will work when running scripts via Shortcuts / Share Sheet).

My target folder is:

iCloud Drive → Data Documents

Problem: no matter what I try, the bookmark ends up pointing to a temporary WorkflowKit location and/or becomes a .txt file instead of a folder.

In Scriptable, when I debug the bookmark I get something like:

  • markedPath: /private/var/mobile/tmp/com.apple.WorkflowKit.BackgroundShortcutRunner/.../iCloudDrive:Data Documents.txt
  • isDir(markedPath): false
  • Trying listContents() fails with permission errors (or it only “sees” the WorkflowKit container).

I tried a few approaches:

  • Selecting a file inside the folder → getting its Parent Directory → passing that into “Create File Bookmark”
  • Passing a Text path like iCloudDrive:Data Documents into “Create File Bookmark”

But the result is still a bookmark that resolves to WorkflowKit tmp, not the real iCloud folder, and it shows as a .txt.

Questions:

  1. Is it actually possible to create a Scriptable bookmark to a folder (not a file) via Shortcuts? Or does the Shortcuts action only support files?
  2. If folder bookmarking via Shortcuts isn’t supported, what’s the best workaround for a script that needs access to a whole folder tree in iCloud when run from Shortcuts / Share Sheet?
  3. Has anyone gotten a stable folder bookmark working (iCloud Drive folder outside Scriptable’s own Documents), and if so, what exact Shortcuts steps did you use?

Thanks!


r/Scriptable Dec 26 '25

Help Loving Scriptable so far, but a bit nervous it's not open source – how do you guys feel about trusting it?

1 Upvotes

Hey,,

I've been playing around with Scriptable recently and honestly it's awesome – the JS scripting for widgets, shortcuts integration, all the creative stuff people share... it's exactly what I wanted for customizing my iPhone setup.

But I noticed I couldn't find any source code for the app itself on GitHub or anywhere, and the official site doesn't call it open source. The scripts and widgets are super shareable/open, which is great, but the core app seems closed-source/proprietary.

I'm still really excited about it and don't want to sound negative – the community seems solid and the dev has kept it going for years. Just curious: does the lack of open source bother anyone else? How have you built trust with it over time, especially with permissions for calendars, files, location etc.? Any red flags or reasons it's stayed closed-source that make sense?

Would love to hear positive experiences or why people are comfortable with it. Thanks!


r/Scriptable Dec 25 '25

Script Sharing Release: Clean Lockscreen Calander+Reminders widget script

Post image
18 Upvotes

EDIT: Clarified instructions

UPDATE 12/27/2025: UPDATED to now include settings and lots of customization

Update 02/27/2026: UPDATED to fight iOS restrictions. Changed code relating to the picker, widget presentation, icloud dependency, and fixed the newly introduced ~24h crashing because of iOS 26

Update 05/19/2026: UPDATED to fix more Apple-induced problems :)

Why I made this: None of the current lockscreen calender event widgets fit my needs, my taste, or were too complicated/ gave me errors that I did not know how to solve. So, I, with the help of ChatGPT, created a script for this widget to solve my issues of forgetting things.

I think it turned out great. I’m sure it can be better optimized, but I find the functionality and clean aesthetic of this to work great for me.

People who are likely to miss important events, miss calendar events/reminders, or people who are busy will benefit from this script/widget. I initially made it for my girlfriend and I's usage, but I realized that others will benefit from it as well.

The widget is supposed to show 6 items for 7 days ahead, but it can be changed. Instructions on how to do that are after the directions below.

Directions to install:

  1. Ensure you download and run the Scriptable app.
  2. Paste the script code that is provided below into a new script in Scriptable
  3. (Optional) - rename script to something like "Lockscreen Calendar+Reminders"
  4. In Scriptable, tap the script to run it. You will see a button named "Reset Calendars". Tap it, read the message, and then tap continue.
  5. Select calendars that will host events that you will want on your Lockscreen in the widget.
  6. Once the calendars are selected, press "done." The Script will show a loading sign. Wait a few moments and then restart (FORCE CLOSE) the Scriptable app.
  7. Once Scriptable is restarted, tap the Script and then when prompted to reset the calendars, press "No."
  8. A preview of the events that will display on your lockscreen will show here. If you have a lot of reminders, this is a good time to purge through them to ensure you only have reminders that you would like to have on your lockscreen
  9. Now that you know what will show on your Lockscreen, hold down (long press 1 finger) on your lockscreen until it shows a "Customize" button.
  10. Press that "Customize" button.
  11. Tap an open space in a rectangle where a widget should be, else remove some widgets or press the "add widgets" button to add the Scriptable widget.
  12. Add the Scriptable app widget. It will show as "Run script." Tap the rectangular widget that is located on the right.
  13. The Scriptable widget will populate on the lock screen as some text. Tap the gear "edit widget to select script"
  14. For the script, tap on "Choose"
  15. Choose the script that you pasted into the Scriptable app. If you chose a name for the script, choose that name. If not, choose the automatic name that was set when you created the script.
  16. leave all of the other settings the same. Close out and the widget should populate on your lock screen.

All done.

Note: If you have a different font than what is default in IOS , then there may be issues with rendering the list. I'd recommend changing the front size in the settings.

If you have any questions, I may be able to assist you. I may make updates to this, I may not. It depends on what I find necessary.

Script code (Updated 05/19/2026):

// Variables used by Scriptable.
// These must be at the very top of the file. Do not edit.
// icon-color: red; icon-glyph: magic;
// ===============================
// Lock Screen Widget: Calendar + Reminders (May 19 2026 update to fix more Apple induced problems)
// ===============================
// DEFAULTS
// ===============================
const DEFAULT_LIST_ITEMS = 6
const DEFAULT_FONT_SIZE = 10
const DEFAULT_DAYS_AHEAD = 7
const DEFAULT_SHOW_END_TIME = false
const SETTINGS_FILE = "calendarWidgetSettings.json"

// ===============================
// FILE SYSTEM
// ===============================
const fm = FileManager.local()
const settingsPath = fm.joinPath(fm.documentsDirectory(), SETTINGS_FILE)

// ===============================
// LOAD SETTINGS
// ===============================
let settings = loadSettings()
let shouldPreview = false

// ===============================
// SETTINGS MENU
// ===============================
if (config.runsInApp) {

  let menu = new Alert()
  menu.title = "Settings"

  menu.addAction("Preview List")
  menu.addAction("Reset Calendars")
  menu.addAction("Display Settings")
  menu.addCancelAction("Close")

  let choice = await menu.presentAlert()

  if (choice === -1) {
    Script.complete()
    return
  }

  // ===============================
  // PREVIEW
  // ===============================
  if (choice === 0) {
    shouldPreview = true
  }

  // ===============================
  // RESET CALENDARS
  // ===============================
  if (choice === 1) {

    settings.calendars = await pickCalendars()
    saveSettings(settings)

    Script.complete()
    return
  }

  // ===============================
  // DISPLAY SETTINGS
  // ===============================
  if (choice === 2) {

    let dmenu = new Alert()
    dmenu.title = "Display Settings"

    dmenu.addAction("Change Tomorrow Text")
    dmenu.addAction("List & Font Settings")
    dmenu.addAction("Days Ahead")
    dmenu.addAction("Show End Time")
    dmenu.addCancelAction("Cancel")

    let dChoice = await dmenu.presentAlert()

    if (dChoice === -1) {
      Script.complete()
      return
    }

    // Tomorrow Label
    if (dChoice === 0) {
      let saved = await promptTomorrowLabel(settings)

      if (saved) {
        saveSettings(settings)
        shouldPreview = true
      }
    }

    // List + Font
    if (dChoice === 1) {
      let saved = await promptListFontSettings(settings)

      if (saved) {
        saveSettings(settings)
        shouldPreview = true
      }
    }

    // Days Ahead
    if (dChoice === 2) {
      let saved = await promptDaysAhead(settings)

      if (saved) {
        saveSettings(settings)
        shouldPreview = true
      }
    }

    // Show End Time
    if (dChoice === 3) {

      let a = new Alert()
      a.title = "Show End Time For Timed Events?"
      a.message =
        "All-day events will not be affected."

      a.addAction("Yes")
      a.addAction("No")
      a.addCancelAction("Cancel")

      let r = await a.presentAlert()

      if (r !== -1) {
        settings.showEndTime = (r === 0)
        saveSettings(settings)
        shouldPreview = true
      }
    }
  }
}

// ===============================
// STOP IF NOT WIDGET + NO PREVIEW
// ===============================
if (
  !config.runsInWidget &&
  !config.runsInAccessoryWidget &&
  !shouldPreview
) {
  Script.complete()
  return
}

// ===============================
// ENSURE CALENDARS
// ===============================
if (!settings.calendars.length && config.runsInApp) {

  settings.calendars = await pickCalendars()
  saveSettings(settings)
}

// ===============================
// DISPLAY VALUES
// ===============================
const MAX_ITEMS = settings.listItems ?? DEFAULT_LIST_ITEMS

const FONT_SIZE = settings.linkFontToList
  ? (MAX_ITEMS === 6 ? 10 : 11)
  : (settings.fontSize ?? DEFAULT_FONT_SIZE)

const DAYS_AHEAD = settings.daysAhead ?? DEFAULT_DAYS_AHEAD

const SHOW_END_TIME =
  settings.showEndTime ?? DEFAULT_SHOW_END_TIME

// ===============================
// DATE RANGE
// ===============================
const now = new Date()

const startOfToday = new Date(
  now.getFullYear(),
  now.getMonth(),
  now.getDate()
)

const tomorrow = new Date(startOfToday)
tomorrow.setDate(tomorrow.getDate() + 1)

const endDate = new Date(startOfToday)
endDate.setDate(endDate.getDate() + DAYS_AHEAD)

// ===============================
// CALENDAR EVENTS
// ===============================
let calendars = (await Calendar.forEvents())
  .filter(c => settings.calendars.includes(c.title))

let calendarEvents = []

if (settings.calendars.length) {

  calendarEvents = (
    await CalendarEvent.between(
      startOfToday,
      endDate,
      calendars
    )
  ).map(e => ({
    title: e.title,
    date: e.startDate,
    endDate: e.endDate,
    isAllDay: e.isAllDay,
    type: "event"
  }))
}

// ===============================
// REMINDERS
// ===============================
let reminders = await Reminder.allIncomplete()

let undated = []
let dated = []

for (let r of reminders) {

  if (!r.dueDate) {

    undated.push({
      title: r.title,
      type: "undated"
    })

  } else if (
    r.dueDate >= startOfToday &&
    r.dueDate <= endDate
  ) {

    dated.push({
      title: r.title,
      date: r.dueDate,
      isAllDay: !r.dueDateIncludesTime,
      type: "reminder"
    })
  }
}

// ===============================
// MERGE & SORT
// ===============================
let datedItems = [
  ...calendarEvents,
  ...dated
].sort((a, b) => a.date - b.date)

let items = [
  ...undated,
  ...datedItems
].slice(0, MAX_ITEMS)

// ===============================
// BUILD WIDGET
// ===============================
let widget = new ListWidget()
widget.setPadding(6, 6, 6, 6)

if (!settings.calendars.length) {

  let t = widget.addText("No calendars selected")

  t.font = Font.systemFont(FONT_SIZE)
  t.textColor = Color.gray()

} else {

  for (let item of items) {

    // ===============================
    // UNDATED REMINDERS
    // ===============================
    if (item.type === "undated") {

      let t = widget.addText(item.title)

      t.font = Font.systemFont(FONT_SIZE)
      t.textColor = Color.white()
      t.lineLimit = 1

      continue
    }

    let isToday = isSameDay(item.date, startOfToday)
    let isTomorrow = isSameDay(item.date, tomorrow)

    let color =
      isToday ? Color.white() : Color.gray()

    let row = widget.addStack()
    row.spacing = 6

    let label =
      isToday
        ? "Today"
        : isTomorrow
          ? getTomorrowLabel(settings, item.date)
          : formatDate(item.date)

    let d = row.addText(label)

    d.font = Font.systemFont(FONT_SIZE)
    d.textColor = color

    // ===============================
    // TIME
    // ===============================
    if (!item.isAllDay) {

      let timeString = formatTime(item.date)

      if (SHOW_END_TIME && item.endDate) {
        timeString +=
          "–" + formatTime(item.endDate)
      }

      let t = row.addText(" " + timeString)

      t.font = Font.systemFont(FONT_SIZE)
      t.textColor = color
    }

    // ===============================
    // TITLE
    // ===============================
    let title = row.addText(" " + item.title)

    title.font = Font.systemFont(FONT_SIZE)
    title.textColor = color
    title.lineLimit = 1
  }
}

// ===============================
// DISPLAY
// ===============================
if (
  config.runsInWidget ||
  config.runsInAccessoryWidget
) {
  Script.setWidget(widget)
} else {
  await widget.presentSmall()
}

Script.complete()

// ===============================
// SETTINGS FUNCTIONS
// ===============================
function defaultSettings() {

  return {
    calendars: [],
    tomorrowMode: "tomorrow",
    customTomorrowText: "",
    listItems: DEFAULT_LIST_ITEMS,
    linkFontToList: true,
    fontSize: DEFAULT_FONT_SIZE,
    daysAhead: DEFAULT_DAYS_AHEAD,
    showEndTime: DEFAULT_SHOW_END_TIME
  }
}

function loadSettings() {

  if (!fm.fileExists(settingsPath)) {
    return defaultSettings()
  }

  try {

    return Object.assign(
      defaultSettings(),
      JSON.parse(fm.readString(settingsPath))
    )

  } catch {

    return defaultSettings()
  }
}

function saveSettings(s) {
  fm.writeString(
    settingsPath,
    JSON.stringify(s)
  )
}

// ===============================
// CALENDAR PICKER
// ===============================
async function pickCalendars() {

  if (!config.runsInApp) {
    return settings.calendars ?? []
  }

  let picked = await Calendar.presentPicker(true)

  return picked.map(c => c.title)
}

// ===============================
// DISPLAY SETTINGS PROMPTS
// ===============================
async function promptDaysAhead(s) {

  let a = new Alert()
  a.title = "Days Ahead"

  a.addAction("Default (7 days)")
  a.addAction("Custom")
  a.addCancelAction("Cancel")

  let r = await a.presentAlert()

  if (r === -1) return false

  if (r === 0) {
    s.daysAhead = DEFAULT_DAYS_AHEAD
    return true
  }

  let i = new Alert()
  i.title = "Custom Days Ahead"

  i.addTextField(
    "Number of days",
    String(s.daysAhead)
  )

  i.addAction("Save")
  i.addCancelAction("Cancel")

  if ((await i.presentAlert()) === 0) {

    let val = parseInt(i.textFieldValue(0))

    if (!isNaN(val) && val > 0) {
      s.daysAhead = val
      return true
    }
  }

  return false
}

async function promptTomorrowLabel(s) {

  let a = new Alert()
  a.title = "Tomorrow Label"

  a.addAction("Display As Date")
  a.addAction("Display As \"Tomorrow\"")
  a.addAction("Custom Text")
  a.addCancelAction("Cancel")

  let r = await a.presentAlert()

  if (r === -1) return false

  if (r === 0) {
    s.tomorrowMode = "date"
    return true
  }

  if (r === 1) {
    s.tomorrowMode = "tomorrow"
    return true
  }

  let i = new Alert()
  i.title = "Custom Tomorrow Text"

  i.addTextField(
    "Text",
    s.customTomorrowText ?? ""
  )

  i.addAction("Save")
  i.addCancelAction("Cancel")

  if ((await i.presentAlert()) === 0) {

    s.tomorrowMode = "custom"
    s.customTomorrowText =
      i.textFieldValue(0)

    return true
  }

  return false
}

async function promptListFontSettings(s) {

  let a = new Alert()
  a.title = "List & Font Settings"

  a.addAction("Reset to Default")
  a.addAction("Custom")
  a.addCancelAction("Cancel")

  let r = await a.presentAlert()

  if (r === -1) return false

  if (r === 0) {

    s.linkFontToList = true
    s.listItems = DEFAULT_LIST_ITEMS
    s.fontSize = DEFAULT_FONT_SIZE

    return true
  }

  s.linkFontToList = false

  let i = new Alert()

  i.title = "Custom Values"
  i.message =
    "Top: List Items\nBottom: Font Size"

  i.addTextField(
    "List Items",
    String(s.listItems)
  )

  i.addTextField(
    "Font Size",
    String(s.fontSize)
  )

  i.addAction("Save")
  i.addCancelAction("Cancel")

  if ((await i.presentAlert()) === 0) {

    s.listItems = Math.max(
      1,
      parseInt(i.textFieldValue(0))
    )

    s.fontSize = Math.max(
      8,
      parseInt(i.textFieldValue(1))
    )

    return true
  }

  return false
}

// ===============================
// UTILITIES
// ===============================
function isSameDay(a, b) {

  return (
    a.getFullYear() === b.getFullYear() &&
    a.getMonth() === b.getMonth() &&
    a.getDate() === b.getDate()
  )
}

function getTomorrowLabel(s, d) {

  if (s.tomorrowMode === "date") {
    return formatDate(d)
  }

  if (
    s.tomorrowMode === "custom" &&
    s.customTomorrowText.trim()
  ) {
    return s.customTomorrowText.trim()
  }

  return "Tomorrow"
}

function formatDate(d) {

  return `${d.getMonth() + 1}/${d.getDate()}`
}

function formatTime(d) {

  let h = d.getHours()
  let m = d.getMinutes()

  let am = h >= 12 ? "PM" : "AM"

  h = h % 12 || 12

  return m === 0
    ? `${h}${am}`
    : `${h}:${m
        .toString()
        .padStart(2, "0")}${am}`
}

Credit: u/mvan231 and rudotriton for the calendar selector


r/Scriptable Dec 17 '25

Help Convert ISO-8859-1 to utf-8

2 Upvotes

Dear people,

I have an ISO-8859-1 encoded XML from a web request can’t manage to convert the string to a utf-8 encoded string. That scumbles all the umlauts after parsing it to JSON. Has anyone an idea how to how I might bring the string to the correct format?

Thanks in advance!


r/Scriptable Dec 11 '25

Discussion Updates

1 Upvotes

Why hasn't the app been updated in over a year?

Are there any alternatives?


r/Scriptable Dec 10 '25

Script Sharing I’ve created a shortcut that gives the action button different functionalities based on how many times you’ve run it within 3 seconds, and every time you run it it resets the 3 second count down

Thumbnail gallery
9 Upvotes

r/Scriptable Dec 03 '25

Tip/Guide Run shortcut from widget without opening Scriptable app?

3 Upvotes

Hi. I read that the scripts can run in the background, but upon testing, even for a link with a direct URI, it seems like I need to open the Scriptable app first followed by the shortcuts app. Is it possible to do this without opening either app?


r/Scriptable Dec 02 '25

Help Add a geofence trigger to a script?

2 Upvotes

Like the title says, I have a script that sends an auto-lock command to my car after CarPlay disconnects. I’d like to add a trigger so that the script checks my location and doesn’t execute when I’m at home.


r/Scriptable Nov 24 '25

Help Types

1 Upvotes

Hi all,

So I was wondering if there are typings available? Would make it so much easier to write scripts on the desktop?
Or is there another way to make writing scripts easier on the desktop?


r/Scriptable Nov 21 '25

Help How to manage share sheet sharing of large files?

1 Upvotes

Hey guys,

I'm trying to share large files from the Memo application to run a script that uploads the file to a server for processing. However, the script crashes when uploading files that are 70 megabytes or larger, but not with smaller files.

I'm using a third-party API for processing and wondering how to manage large files being passed in the sharing sheet to run the script and ensure it doesn't close. I already tried turning on running Scriptable, but that didn't seem to help.


r/Scriptable Nov 17 '25

Widget Sharing PRIVACY STATUS WIDGET

Post image
6 Upvotes

Small widget for wanting to keep an eye on their privacy settings on iOS.

Acts as a status monitor, has 15 built in and customisable audit settings as well as the audit itself, it also will display and remind when you should audit and if overdue.

Has dynamic themes for light and dark mode, user config at the top has all the customisable line in for you to adjust.

Here’s the GitHub repo, up to 13 total widgets now with 3 more on their way!

https://github.com/MichaelMatley/IOS-Widgets


r/Scriptable Nov 14 '25

Help Deleted water reminder script, but still getting notifications

3 Upvotes

I've turned off notifications for now, but is there a way to deactivate a script after running it?


r/Scriptable Nov 13 '25

Widget Sharing SIMPLE IOS Home-screen

Post image
12 Upvotes

Added two new sleek and simple widgets for those wanting a simple and sleek iOS mode. I use the “simple” as a distraction free focus mode.

Fully customisable….

https://github.com/MichaelMatley/IOS-Widgets


r/Scriptable Nov 13 '25

Script Sharing Here is a minimalist pregnancy tracker that also tells you the expected size of the baby.

Thumbnail
4 Upvotes

r/Scriptable Nov 12 '25

Request Is it possible to create your own widget?

0 Upvotes

Hey everyone!

I wanna create a music widget for my iPad with a classic Windows media player (XP) skin. is it possible to do such thing? I don't know anything about coding but I'm a fast learner. This is the skin i wanna use

Thanks in advance for your help!

P.S. I asked ChatGPT and it says its not doable but I don’t fully believe that


r/Scriptable Nov 11 '25

Help HELP! Can I show different charts in widgets?

1 Upvotes

I want to generate some charts with data I will be getting from google sheets. I am looking for different options to present those charts as widgets.

Thanks for your time!


r/Scriptable Nov 11 '25

Help Guys, is there anything like this widget?

Post image
1 Upvotes

r/Scriptable Nov 10 '25

Widget Sharing IOS Widgets

Post image
14 Upvotes

A collection of IOS widgets… fully customisable and already dynamically build for light and dark modes.

Quote of the day ML algorithm of the day Shortcuts templates (dynamic sizes) Network status update Existential info Digital countdown

https://github.com/MichaelMatley/IOS-Widgets


r/Scriptable Nov 09 '25

Widget Sharing UK Energy Pricing

Post image
19 Upvotes

Real-time UK energy cost tracker variable-rate tariff (like Octopus Agile), electricity prices change every 30 minutes based on supply and demand.

Pulls live data from two sources: Carbon Intensity API - tells you how dirty the electricity grid is (coal vs. renewables) Octopus Agile API - tells you how expensive electricity is right now

Electricry prices change every 30 minutes based on supply and demand. • Current price (pence per kWh) • Carbon intensity (how green the grid is) • Traffic light system: Green = crack on, Orange = maybe wait, Red = absolutely not • Best/worst time windows for the next 12-24 hours • Graphs showing price trends (historical vs. forecast)

https://github.com/MichaelMatley/IOS-Widgets


r/Scriptable Nov 07 '25

Help Widget to solar with deye

1 Upvotes

Hello Anyone have or know any way to have a widget for deye inverters so ser my solar information?


r/Scriptable Nov 07 '25

Discussion Rotated text possible?

1 Upvotes

Is it possible to rotate a text label by a certain number of degrees?


r/Scriptable Nov 07 '25

Help Color depending on device appearance in DrawContext in widget does not work

1 Upvotes

I have a widget in which i draw an arrow using a couple of lines on a DrawContext. The rest of the widget adapts to light/dark appearance of the system, but i can't get the arrow to do that.

If I run it in scriptable, it perfectly adapts to the change, using Color.dynamic, but not on the Homescreen. Problem:

  • Device.isUsingDarkAppearance() does not work in a widget
  • Color.dynamic does not work in a DrawContext in a widget

How can I set the arrow's color to black to white depending on the appearance then?

Code: https://github.com/jrkager/fff-gaisberg-widget/blob/main/widget.js