One of the last remaining features Android phones have which has no iOS equivalent is scheduled text messages. Samsung phones have this feature built into the stock texting app. While iOS 13 brings capabilities for scheduled automation, the Messages app remains secluded in the walled garden.

I would like to use this feature on my iPhone, so I looked to the open source community for solutions to build upon. I found the wonderful osa-imessage library for Node.js. Combining programatic iMessage in Node.js with the fantastic scheduler library node-schedule was a no brainer.

For the first part of this tutorial, we will setup the bare bones Javascript ES6 logic for handling a self-hosted iMessage Scheduler using data stored locally on the device. In the next part, I will cover how to connect our microservice to a MongoDB database & React front end so you can schedule iMessages directly from your phone.

My source code is available here.

"The full Safari engine is inside of iPhone. And so, you can write amazing Web apps that look exactly and behave exactly like apps on the iPhone. And these apps can integrate perfectly with iPhone services." - Steve Jobs 2007

๐Ÿงฐ Hardware Requirements

  • Always on Mac running macOS 10.10+
My old Macbook Air 2011 running iMessage scheduler

๐Ÿ” Tech Stack

  • Node.js
  • Yarn
  • ES6

๐Ÿ’ก Getting Started

Start by cloning this Github repository to your Mac

  • Edit contacts.txt with one contact per line using the following csv format
full name,phone number,birthday eg. MM-DD,time zone eg. America/New_York,group name eg. associate

An example value would look like this

chad brad,12345678901,01-15,America/New_York,associate

๐ŸŽ‚ Scheduling birthday texts

By default birthday texts are handled by index.js, including adjusting for the time zone difference.

Edit events.txt with one event per line using the following csv format.

event date eg. MM-DD,message,timeOfDay (see types in Events.js),target group name

An example value would look like this

12-25,Merry Christmas! ๐ŸŽ„,morning,associate

๐Ÿƒโ€โ™‚๏ธ Running

  • Upload the folder imessage_scheduler to your Always on Mac using Airdrop or USB drive.

If your Mac uses SIP, introduced in macOS 10.11 El Capitan, you will need to disable it before the program can send iMessages.

๐Ÿ’ป How to turn off System Integrity Protection in macOS

  1. Click the Apple symbol in the Menu bar.
  2. Click Restartโ€ฆ
  3. Hold down Command-R to reboot into Recovery Mode.
  4. Click Utilities.
  5. Select Terminal.
  6. Type csrutil disable.
  7. Press Return or Enter on your keyboard.
  8. Click the Apple symbol in the Menu bar.
  9. Click Restartโ€ฆ

To re-enable, follow these steps again, except this time you'll enter csrutil enable in Terminal instead.

Open a terminal on the Always on Mac and execute the following commands

yarn dev

๐Ÿšง Roadmap

  • This scheduler currently supports recurring dates only. This does not support holidays like Thanksgiving, Easter, Memorial Day (last day in May), Mother's Day or Father's Day.
  • React frontend for scheduling messages from a web browser.

๐Ÿ‘ Special Thanks

โš–๏ธ Disclaimer

This open source project is an independent project and has not been authorized, sponsored, or otherwise approved by Apple Inc.

iMessage, iOS, Mac, El Capitan, and Apple are registered trademarks of Apple Inc.