<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: muhamm-ad</title>
    <description>The latest articles on DEV Community by muhamm-ad (@muhamm-ad).</description>
    <link>https://dev.to/muhamm-ad</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3780369%2Fc5719551-3183-4cd8-b5a1-fd9a89c77efb.jpeg</url>
      <title>DEV Community: muhamm-ad</title>
      <link>https://dev.to/muhamm-ad</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/muhamm-ad"/>
    <language>en</language>
    <item>
      <title>🌙 Never miss Suhoor again - let your iPhone do the math and set the alarm automatically every night</title>
      <dc:creator>muhamm-ad</dc:creator>
      <pubDate>Fri, 20 Feb 2026 08:45:39 +0000</pubDate>
      <link>https://dev.to/muhamm-ad/never-miss-suhoor-again-let-your-iphone-do-the-math-and-set-the-alarm-automatically-every-night-akk</link>
      <guid>https://dev.to/muhamm-ad/never-miss-suhoor-again-let-your-iphone-do-the-math-and-set-the-alarm-automatically-every-night-akk</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Your iPhone fetches today's Fajr time, calculates your two alarms automatically, and sets them every night, no manual updates needed.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;During Ramadan, waking up for Suhoor means you need to be up &lt;em&gt;before&lt;/em&gt; Fajr, and since prayer times shift by a minute or two every day, manually updating your alarm each night gets old fast.&lt;/p&gt;

&lt;p&gt;In this guide, I'll show you how to build a fully automated system on your iPhone that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Fetches today's Fajr prayer time&lt;/strong&gt; from a live API based on your GPS coordinates&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Calculates your wake-up time&lt;/strong&gt; (30 minutes before Fajr Adhan)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatically sets or updates your alarm&lt;/strong&gt; every night while you sleep.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We'll use two free apps ( &lt;strong&gt;Scriptable&lt;/strong&gt; and &lt;strong&gt;Apple Shortcuts&lt;/strong&gt; ) and zero paid services.&lt;/p&gt;




&lt;h2&gt;
  
  
  What You'll Need
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;iPhone running iOS 15 or later&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://apps.apple.com/app/scriptable/id1405459188" rel="noopener noreferrer"&gt;&lt;strong&gt;Scriptable&lt;/strong&gt;&lt;/a&gt; - free on the App Store&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apple Shortcuts&lt;/strong&gt; - pre-installed on your iPhone&lt;/li&gt;
&lt;li&gt;An internet connection (to fetch prayer times)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  How It Works - Big Picture
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Shortcuts Automation triggers at 1:00 AM every night]
                    ↓
        [Runs your Scriptable script]
                    ↓
  [Script fetches today's Fajr time from AlAdhan API]
                    ↓
      [Script calculates and returns 3 timestamps:
        • Suhoor     → Fajr − 30 min  (wake up &amp;amp; eat)
        • Fajr-adhan → Fajr − 10 min  (prayer heads-up)
        • Fajr       → exact Fajr time (for reference)]
                    ↓
  [Shortcuts sets Alarm: 🍽️ Suhoor (30 min before Fajr)]
  [Shortcuts sets Alarm: 🕌 Fajr-adhan (10 min before Fajr)]
  [Shortcuts sets Alarm: 🕌 Fajr]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 1 - Install Scriptable
&lt;/h2&gt;

&lt;p&gt;Open the App Store and search for &lt;strong&gt;Scriptable&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;It's completely free. Scriptable lets you write and run JavaScript on your iPhone - perfect for calling APIs and passing data to Apple Shortcuts.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl0b6q794ylyf9skrx7cd.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl0b6q794ylyf9skrx7cd.PNG" alt="Install Scriptable" width="800" height="1652"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 2 - Add the Script in Scriptable
&lt;/h2&gt;

&lt;p&gt;Open Scriptable, tap the &lt;strong&gt;+&lt;/strong&gt; button in the top-right corner to create a new script.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fllkc0i05oh146f081qsq.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fllkc0i05oh146f081qsq.PNG" alt="Tap Scriptable plus button" width="800" height="1655"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tap on the new script, then &lt;strong&gt;clear any placeholder text&lt;/strong&gt; and paste the following script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ============================================================&lt;/span&gt;
&lt;span class="c1"&gt;// CONFIG - update these values for your location&lt;/span&gt;
&lt;span class="c1"&gt;// ============================================================&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;latitude&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;45.57&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;              &lt;span class="c1"&gt;// Your latitude (Montreal)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;longitude&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;73.54&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;            &lt;span class="c1"&gt;// Your longitude (montreal)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;timezone&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;America/Toronto&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Your timezone (tz database format)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;method&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;                 &lt;span class="c1"&gt;// Calculation method (see table in article)&lt;/span&gt;

&lt;span class="c1"&gt;// Minutes before Fajr for each alarm&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;SUHOOR_OFFSET&lt;/span&gt;     &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// minutes - 🍽️  Wake up &amp;amp; eat - adjust to taste (e.g. 45 or 60)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;FAJR_ADHAN_OFFSET&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// minutes - 🕌  Fajr adhan heads-up&lt;/span&gt;

&lt;span class="c1"&gt;// ============================================================&lt;/span&gt;
&lt;span class="c1"&gt;// DATE  (DD-MM-YYYY for the API)&lt;/span&gt;
&lt;span class="c1"&gt;// ============================================================&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;now&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dd&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;now&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getDate&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nf"&gt;padStart&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mm&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;now&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getMonth&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;padStart&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;yyyy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;now&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getFullYear&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dateStr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;dd&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;-&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;mm&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;-&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;yyyy&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// ============================================================&lt;/span&gt;
&lt;span class="c1"&gt;// FETCH FAJR TIME FROM ALADHAN API&lt;/span&gt;
&lt;span class="c1"&gt;// ============================================================&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="s2"&gt;`https://api.aladhan.com/v1/timings/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;dateStr&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
  &lt;span class="s2"&gt;`?latitude=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;latitude&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
  &lt;span class="s2"&gt;`&amp;amp;longitude=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;longitude&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
  &lt;span class="s2"&gt;`&amp;amp;timezone=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;timezone&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
  &lt;span class="s2"&gt;`&amp;amp;method=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;method&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// console.log("Fetching: " + url);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loadJSON&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fajrTimeStr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;timings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Fajr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// console.log("Fajr time today: " + fajrTimeStr);&lt;/span&gt;

&lt;span class="c1"&gt;// ============================================================&lt;/span&gt;
&lt;span class="c1"&gt;// HELPERS&lt;/span&gt;
&lt;span class="c1"&gt;// ============================================================&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;timeToDate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;timeStr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;timeStr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;d&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setHours&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;subtractMinutes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;minutes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getTime&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;minutes&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;60000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Local ISO string - no UTC shift, so Shortcuts reads the correct local time&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;toLocalISO&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pad&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;padStart&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getFullYear&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;-&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
    &lt;span class="nf"&gt;pad&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getMonth&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;-&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
    &lt;span class="nf"&gt;pad&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getDate&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;T&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
    &lt;span class="nf"&gt;pad&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getHours&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
    &lt;span class="nf"&gt;pad&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getMinutes&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;:00&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// ============================================================&lt;/span&gt;
&lt;span class="c1"&gt;// BUILD OUTPUT - 3 keys only&lt;/span&gt;
&lt;span class="c1"&gt;// ============================================================&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fajr&lt;/span&gt;      &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;timeToDate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fajrTimeStr&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fajrAdhan&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;subtractMinutes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fajr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;FAJR_ADHAN_OFFSET&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;suhoor&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;subtractMinutes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fajr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;SUHOOR_OFFSET&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Suhoor&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;     &lt;span class="nf"&gt;toLocalISO&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;suhoor&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;    &lt;span class="c1"&gt;// 🍽️  30 min before Fajr&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Fajr-adhan&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;toLocalISO&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fajrAdhan&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="c1"&gt;// 🕌  10 min before Fajr&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Fajr&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;       &lt;span class="nf"&gt;toLocalISO&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fajr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;       &lt;span class="c1"&gt;// exact Fajr time (reference)&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;output&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="c1"&gt;// ============================================================&lt;/span&gt;
&lt;span class="c1"&gt;// RETURN TO SHORTCUTS&lt;/span&gt;
&lt;span class="c1"&gt;// ============================================================&lt;/span&gt;
&lt;span class="nx"&gt;Script&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setShortcutOutput&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;output&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;Script&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;complete&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ⚙️ Customize Your Config
&lt;/h3&gt;

&lt;p&gt;At the top of the script, update these four values:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Variable&lt;/th&gt;
&lt;th&gt;What to change&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;latitude&lt;/code&gt; / &lt;code&gt;longitude&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Your home coordinates (find them in Maps → long press → copy coordinates)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;timezone&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Your local timezone string (e.g. &lt;code&gt;"Europe/Paris"&lt;/code&gt;, &lt;code&gt;"Asia/Riyadh"&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;method&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Calculation method - see table below&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Common calculation methods:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method #&lt;/th&gt;
&lt;th&gt;Authority&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;University of Islamic Sciences, Karachi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Islamic Society of North America (ISNA)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Muslim World League&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Umm Al-Qura University, Makkah&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Egyptian General Authority of Survey&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;You can also tweak the two offset values. If 30 minutes isn't enough time for Suhoor, bump &lt;code&gt;SUHOOR_OFFSET&lt;/code&gt; to &lt;code&gt;45&lt;/code&gt; or &lt;code&gt;60&lt;/code&gt;. If you want the Adhan reminder a little earlier, change &lt;code&gt;FAJR_ADHAN_OFFSET&lt;/code&gt; to &lt;code&gt;15&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Name Your Script
&lt;/h3&gt;

&lt;p&gt;Tap the script title at the top and rename it to &lt;strong&gt;&lt;code&gt;RamadanAlarms&lt;/code&gt;&lt;/strong&gt; - you'll reference this exact name in Shortcuts later.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcw0r0h401ecvgqsdemxo.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcw0r0h401ecvgqsdemxo.PNG" alt="Renaming the script" width="800" height="1647"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Test It
&lt;/h3&gt;

&lt;p&gt;Tap the &lt;strong&gt;▶ Run&lt;/strong&gt; button at the bottom. You should see JSON output in the console at the bottom of the screen with three timestamps like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw15z4h4ungh3d9yezooz.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw15z4h4ungh3d9yezooz.PNG" alt="Scriptable output" width="800" height="1645"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you see an error, double-check your latitude/longitude and that your phone has internet access. If the times look wrong, verify your &lt;code&gt;timezone&lt;/code&gt; string.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3 - Prepare Your Clock App
&lt;/h2&gt;

&lt;p&gt;Before the automation runs for the first time, create the placeholder alarms in your &lt;strong&gt;Clock&lt;/strong&gt; app. The automation loop finds each alarm by its label, deletes it, then recreates it with the correct time, so the labels must exist and must match exactly what the loop produces.&lt;/p&gt;

&lt;p&gt;Create all three alarms in &lt;strong&gt;Clock → Alarm&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;strong&gt;Clock&lt;/strong&gt; → &lt;strong&gt;Alarm&lt;/strong&gt; tab → tap &lt;strong&gt;+&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Create alarm, label it &lt;code&gt;Suhoor&lt;/code&gt; - time doesn't matter, it will be overwritten&lt;/li&gt;
&lt;li&gt;Repeat for &lt;code&gt;Fajr-adhan&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Repeat for &lt;code&gt;Fajr&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi1bhc6cd8fgotzvlwkq4.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi1bhc6cd8fgotzvlwkq4.PNG" alt="Clock app Alarm tab showing all three placeholder alarms" width="800" height="1645"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ Spelling and capitalization must match exactly - no emoji needed, just the plain text labels as shown above.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Step 4 - Build the Shortcuts Automation
&lt;/h2&gt;

&lt;p&gt;Now we'll wire everything together in Apple Shortcuts. Open the &lt;strong&gt;Shortcuts&lt;/strong&gt; app and go to the &lt;strong&gt;Automation&lt;/strong&gt; tab at the bottom.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;&lt;tr&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frrvvt0iwmjr3o916aa4u.PNG" width="800" height="1652"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9odrssq38swwmyr1z22b.PNG" width="800" height="1639"&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Create a New Automation
&lt;/h3&gt;

&lt;p&gt;Tap the &lt;strong&gt;+&lt;/strong&gt; button in the top-right to create a new automation.&lt;/p&gt;

&lt;p&gt;Choose &lt;strong&gt;Time of Day&lt;/strong&gt; as your trigger.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdotzrg9b7bpcgvegv0fh.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdotzrg9b7bpcgvegv0fh.PNG" alt="New Automation menu with Time of Day option" width="800" height="1646"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Set the time to something like &lt;strong&gt;1:00 AM&lt;/strong&gt; - early enough that it runs before Suhoor, but after midnight so the date is correct when the API is called. Set it to repeat &lt;strong&gt;Daily&lt;/strong&gt;, and make sure &lt;strong&gt;Run Immediately&lt;/strong&gt; (or "Run After Confirmation" if you prefer) is selected.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faoxwuexahb2am2ubzod5.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faoxwuexahb2am2ubzod5.PNG" alt="Time of Day trigger config" width="800" height="1646"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tap &lt;strong&gt;Next&lt;/strong&gt; and start adding actions.&lt;/p&gt;




&lt;h3&gt;
  
  
  Build the Action Flow
&lt;/h3&gt;

&lt;p&gt;You'll now add a series of actions. Here's the complete flow:&lt;/p&gt;

&lt;h4&gt;
  
  
  Action 1 - Create New Shortcut &amp;amp; Run the Script
&lt;/h4&gt;

&lt;p&gt;Tap &lt;strong&gt;Create New Shortcut&lt;/strong&gt; and search for &lt;strong&gt;"Scriptable"&lt;/strong&gt;. Select &lt;strong&gt;Run Script&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;&lt;tr&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5qw50mzr72zstxz4ki0h.PNG" width="800" height="1667"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F43ho9u9beu402zypxdkd.PNG" width="800" height="1621"&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In the action block:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set &lt;strong&gt;Script&lt;/strong&gt; → &lt;code&gt;RamadanAlarms&lt;/code&gt; (the name you gave your script)&lt;/li&gt;
&lt;li&gt;Leave &lt;strong&gt;Input&lt;/strong&gt; empty&lt;/li&gt;
&lt;li&gt;Run it to see the resulting output&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fad456or2wo79wlpo3szf.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fad456or2wo79wlpo3szf.PNG" alt="Run Script action block with RamadanAlarms selected" width="800" height="1634"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Action 2 - Get All Keys from the Script Output
&lt;/h3&gt;

&lt;p&gt;Add a &lt;strong&gt;Get Dictionary Value&lt;/strong&gt; action.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Get:&lt;/strong&gt; &lt;code&gt;All Keys&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dictionary:&lt;/strong&gt; tap the &lt;code&gt;Output&lt;/code&gt; magic variable from Action 1&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This produces a list of all three keys from your script: &lt;code&gt;Suhoor&lt;/code&gt;, &lt;code&gt;Fajr-adhan&lt;/code&gt;, and &lt;code&gt;Fajr&lt;/code&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;&lt;tr&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3qwd62znb5rvnu0wt5qp.PNG" width="800" height="1658"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7kcf3mtcw7gavfmqvp65.PNG" width="800" height="1730"&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  Action 3 - Repeat with Each Key
&lt;/h3&gt;

&lt;p&gt;Add a &lt;strong&gt;Repeat with each item in&lt;/strong&gt; action.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Input:&lt;/strong&gt; the &lt;code&gt;Keys&lt;/code&gt; variable from Action 2&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything inside this loop (Actions 4–8) will run once for &lt;code&gt;Suhoor&lt;/code&gt;, once for &lt;code&gt;Fajr-adhan&lt;/code&gt;, and once for &lt;code&gt;Fajr&lt;/code&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;&lt;tr&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwnnh0rml2fiehqszut6x.PNG" width="800" height="1730"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwd43tlbfd2wvpuunh9r6.PNG" width="800" height="1730"&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  Action 4 - Get the Time Value for the Current Key (inside loop)
&lt;/h3&gt;

&lt;p&gt;Add a &lt;strong&gt;Get Dictionary Value&lt;/strong&gt; action inside the loop.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Get:&lt;/strong&gt; &lt;code&gt;Value&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Key:&lt;/strong&gt; &lt;code&gt;Repeat Item&lt;/code&gt; (the magic variable - this is the current key name on each pass)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dictionary:&lt;/strong&gt; &lt;code&gt;Output&lt;/code&gt; from Action 1&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This retrieves the ISO timestamp string for whichever key is currently being processed.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;&lt;tr&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhll1tu149l6mg4hokgcu.PNG" width="800" height="1730"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3114dv9ktnk8mwqtmkib.jpg" width="800" height="1641"&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  Action 5 — Find the Existing Alarm by Label (inside loop)
&lt;/h3&gt;

&lt;p&gt;Add a &lt;strong&gt;Find Alarms&lt;/strong&gt; action:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Filter:&lt;/strong&gt; Label &lt;strong&gt;is&lt;/strong&gt; &lt;code&gt;Repeat Item&lt;/code&gt; (the magic variable - this is the current key name on each pass). The script keys are already formatted as proper labels, so &lt;code&gt;Repeat Item&lt;/code&gt; directly matches the Clock alarm name.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sort by:&lt;/strong&gt; Label&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Order:&lt;/strong&gt; A to Z&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Limit:&lt;/strong&gt; ON → &lt;strong&gt;Get 1 Item&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This finds the existing alarm in your Clock app that matches the current label.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;&lt;tr&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7u061lvyukdd06yk9l2n.jpg" width="800" height="1631"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpto0y5hdaifn7tz95dch.jpg" width="800" height="1624"&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  Action 6 — Delete the Old Alarm (inside loop)
&lt;/h3&gt;

&lt;p&gt;Add a &lt;strong&gt;Delete Alarms&lt;/strong&gt; action:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Alarms:&lt;/strong&gt; the &lt;code&gt;Alarms&lt;/code&gt; result from Action 5&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This removes the old alarm so it can be recreated with today's correct time.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;&lt;tr&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flvte9iwkqwudeqz50nhq.jpg" width="800" height="1631"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw92p260q0c2uq6ku9new.jpg" width="800" height="1616"&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  Action 7 — Create the New Alarm (inside loop)
&lt;/h3&gt;

&lt;p&gt;Add a &lt;strong&gt;Create Alarm&lt;/strong&gt; action:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Time:&lt;/strong&gt; &lt;code&gt;aTime&lt;/code&gt; → set this to the &lt;code&gt;Dictionary Value&lt;/code&gt; from Action 4 (the ISO timestamp)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Label:&lt;/strong&gt; &lt;code&gt;Repeat Item&lt;/code&gt; (the magic variable - this is the current key name on each pass)&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;&lt;tr&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fglyuusrx5ltqdclaal9c.jpg" width="800" height="1642"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6im06kfawd27jq0r5857.jpg" width="800" height="1651"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvkp1togkhacex4mva9a2.jpg" width="800" height="1652"&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  Action 8 — Show a Notification (inside loop)
&lt;/h3&gt;

&lt;p&gt;Add a &lt;strong&gt;Show Notification&lt;/strong&gt; action:&lt;/p&gt;

&lt;p&gt;This fires a confirmation notification for each alarm as it's set.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;&lt;tr&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjhjh2a3qpx9d6zgyci7y.jpg" width="800" height="1624"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyfiyyowud8rg8a0fwmuj.jpg" width="800" height="1642"&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  Full Automation at a Glance
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;&lt;tr&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fae8d6ptwd2r9osbthb8f.jpg" width="800" height="1626"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fecahxeeomxro74ggwmvr.jpg" width="800" height="1642"&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Tap &lt;strong&gt;Done&lt;/strong&gt; to save.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 5 — Test the Full Flow
&lt;/h2&gt;

&lt;p&gt;Before relying on this for Ramadan, run the automation manually now:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to your automation in the &lt;strong&gt;Automation&lt;/strong&gt; tab&lt;/li&gt;
&lt;li&gt;Tap on it to open it&lt;/li&gt;
&lt;li&gt;Tap &lt;strong&gt;Run&lt;/strong&gt; (or use the play button if available)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F66mznis3x5o5c9y0bys1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F66mznis3x5o5c9y0bys1.jpg" alt="Tapping Run on the automation to test it manually" width="800" height="1655"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then open &lt;strong&gt;Clock → Alarm&lt;/strong&gt; and confirm all three alarms were updated — &lt;code&gt;Suhoor&lt;/code&gt;, &lt;code&gt;Fajr-adhan&lt;/code&gt;, and &lt;code&gt;Fajr&lt;/code&gt; — showing the correct times for tonight.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7b0wk3uqsaclycjvnmmv.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7b0wk3uqsaclycjvnmmv.jpg" alt="Clock app showing all three alarms updated to the correct times" width="800" height="1642"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  How the Prayer Time API Works
&lt;/h2&gt;

&lt;p&gt;The script uses the free &lt;a href="https://aladhan.com/prayer-times-api" rel="noopener noreferrer"&gt;&lt;strong&gt;AlAdhan API&lt;/strong&gt;&lt;/a&gt; - no account or API key needed. A sample request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://api.aladhan.com/v1/timings/19-03-2025
  ?latitude=45.57
  &amp;amp;longitude=-73.54
  &amp;amp;timezone=America/Toronto
  &amp;amp;method=2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The response contains all five prayer times in your local timezone. The script pulls only &lt;code&gt;Fajr&lt;/code&gt;, then subtracts the two offsets to produce three clean ISO timestamps — for example &lt;code&gt;2025-03-19T04:17:00&lt;/code&gt; — which Shortcuts parses directly into Date objects to set your alarms.&lt;/p&gt;




&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Both alarms are wrong by the same amount&lt;/strong&gt; → Your offset values (&lt;code&gt;SUHOOR_OFFSET&lt;/code&gt;, &lt;code&gt;FAJR_ADHAN_OFFSET&lt;/code&gt;) are fine — the Fajr time itself is wrong. Double-check your &lt;code&gt;latitude&lt;/code&gt;, &lt;code&gt;longitude&lt;/code&gt;, and &lt;code&gt;timezone&lt;/code&gt; in the script. Run it manually in Scriptable and verify the console output.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Times are off by exactly one hour&lt;/strong&gt; → Daylight saving time issue. Use a full tz database timezone string like &lt;code&gt;"America/Montreal"&lt;/code&gt; instead of &lt;code&gt;"EST"&lt;/code&gt;. The API handles DST automatically when given the proper timezone name.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Script not found" error in Shortcuts&lt;/strong&gt; → The script name is case-sensitive. Make sure it says &lt;code&gt;RamadanAlarms&lt;/code&gt; exactly, matching what you named it in Scriptable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;An alarm isn't being found or updated&lt;/strong&gt; → The loop matches alarms by their label. Make sure your Clock app has alarms named exactly &lt;code&gt;Suhoor&lt;/code&gt;, &lt;code&gt;Fajr-adhan&lt;/code&gt;, and &lt;code&gt;Fajr&lt;/code&gt; — note the hyphen in &lt;code&gt;Fajr-adhan&lt;/code&gt;, not a space. The Clock labels must match the script keys exactly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The automation doesn't run automatically overnight&lt;/strong&gt; → Go to &lt;strong&gt;Settings → Shortcuts&lt;/strong&gt; and allow automations to run without confirmation. Also make sure Low Power Mode is off, as it can delay or skip background tasks.&lt;/p&gt;




&lt;h2&gt;
  
  
  Wrapping Up
&lt;/h2&gt;

&lt;p&gt;Once this is running, your phone handles everything silently — every night at 1 AM:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fetches today's Fajr time for your exact location&lt;/li&gt;
&lt;li&gt;Calculates all three alarm times (Suhoor, Fajr Adhan, Fajr)&lt;/li&gt;
&lt;li&gt;Loops through each one — deletes the old alarm, creates a fresh one with today's time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Wake up rested, eat a good Suhoor, and focus on what matters. Ramadan Kareem! 🌙&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Found this useful? Share it with someone doing Ramadan!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Have questions or improvements? Drop them in the comments&lt;/em&gt;&lt;/p&gt;

</description>
      <category>automation</category>
      <category>ios</category>
      <category>javascript</category>
      <category>ramadan</category>
    </item>
  </channel>
</rss>
