Mingle Lets You Launch Actions From Your Contacts List

By now, I'm sure you're already familiar with Launch Center Pro and Drafts. These apps make a lot of iOS automations possible through their custom actions. Yesterday, Samir Ghobril released Mingle, an app that allows you to create custom actions and launch them based on your Contacts list.

Mingle lets you launch actions from your Contacts list.

How It Works

Mingle uses a custom Contacts list view that lets you to drag a contact's avatar to the right to switch the focus to any of the four actions. It allows you to setup exactly four contact-based actions that you can trigger by dragging the contact's avatar. As you drag to the right, Mingle will reveal the first action's icon. Then, as you hold and drag farther, you can see all the other icons too (one at a time).

If you arrive on the action that you want to launch, simply release your finger. Mingle will execute the URL schemes stored for that action.

Mingle supports the standard iOS URL schemes that you may already comfortable with. For example, you can attach a Tweetbot URL that lets you send a quick DM based on the contact's Twitter username.

What makes Mingle special is its ability to pull contact information into tags and allows you to craft your own actions using them. For example, you can use [phoneNumber] and [email] tags to extract the first phone number and email address for the selected contact. Other tags include [displayName], [twitter], and [url].

Mingle also includes many built-in actions that can give you hints on how you can create your own actions. For example, the WhatsApp message action looks like this:

whatsapp://send?text=[prompt:Message]&abid=[ABID]

As shown on that action, Mingle also supports [prompt:Title] tag - similar to Launch Center Pro's [prompt] tag. And, you can even work with more specific contact-based tags such as [ABID] (used by WhatsApp to uniquely identify its users), [social:], and [IM:].

Mingle has three custom URL schemes of its own, mingle-message://?recipient=, mingle-email://?recipient=, and mingle-tweet://?username=. Because these are contact-based URL schemes, they're useful only for in-app usages.

After beta-testing the app for a couple of weeks, here are a few custom actions that I use.

Read More

5 Awesome Things from Fantastical 2 that Can Improve Your Workflows

Last week we witnessed the release of Fantastical 2. After using it for a few days, I noticed many improvements over the previous version that can make my daily workflows easier. In this post, I'd like to highlight five of them.

The new Fantastical 2 allows you to define alert time period to override the default settings.

1. Improvements in Natural Language Support for Event Creation

Fantastical has always been famous for its natural language parser. It allows you to add new events easily (and gracefully) without having to enter the fields manually. Fantastical 1.x allows you to write new events with the following syntax:

[event name] at [location] [date/time] [URL] [calendar name]

By setting up the default duration and alert time period for your events, you can even write your events faster. For example, I setup my default event duration as one hour, and my default alert time period as two hours prior the event. Here are some of the sample sentences that you can enter in Fantastical 1.x:

  • Meet with Abraham at Lenmarc Mall on Mon 10.30-noon http://modernjamming.com /w
  • Mission Trip at Jakarta on Nov 13-17 calendar Church
  • Family Vacation at Singapore from 12/4 for six days /h
  • Internal Team Meeting at R714 on Wednesdays from 11-2p /w
  • Board Meeting at R215 every other Thursday from 11 AM to 2 PM /w
  • Family Dine Out on the 2nd Friday of every month at 6-9p /h
  • Wash the Car every third Thursday at 8.45a /h
  • Pick up Noah at MSCS on Mondays, Wednesdays and Fridays at 10a from 11/13 to 11/25 /h

Fantastical has a great way of parsing date/time languages. The above examples show that it can understand the basic short/long day formats (Mon/Monday), noon/midnight, and AM/PM/a/p. Fantastical also understands date ranges, such as "Nov 13-17" or "from 12/4 for six days", and date repetition formats, such as "on Wednesdays", "every other Thursday", "the 2nd Friday of every month", "every third Thursday", and even complex ones such as "on Mondays, Wednesdays and Fridays".

Fantastical allows you to define which calendar you want your new event to be created. You can define it using a clear sentence, such as "calendar Church", or using a shorthand version, such as /w for Work and /h for Home. The rule for calendar shorthand is quite straightforward. Fantastical will use the characters following the slash and match them with the first characters of your Calendar names. For example, if I have two calendars named iPhone and IFTTT, I can use /ip to refer to the iPhone calendar, and /if to refer to the IFTTT calendar.

Read More

Fixing Recursive Workflows with the New allowEmpty Parameter in Drafts 3.5.4

A couple of days ago, Greg Pierce released a new update to Drafts. The 3.5.4 update has a quick fix for text encoding bug found in the previous update. What makes the previous 3.5.3 update a noteworthy one is the new allowEmpty=[YES/NO] parameter for executing incoming URLs.

Incoming URL is a way for Drafts and other apps to create a new draft, execute a named action, or import a new custom action in Drafts. I've been using it to perform recursive invocations on custom URL actions. My earliest example was adding multiple events in Fantastical, which dated back in April.

Unfortunately, the September's 3.5 update included a feature that conflicts with the recursive hacks I've been using. The new feature allows you to run actions on an empty draft, regardless whether it's manually triggered or triggered by an incoming URL. This forced me to come up with a workaround that removed the x-cancel parameter as the only way to stop the infinite loop when the other app doesn't prompt you whether you want to continue or not.

I've also come up with another workaround that uses a runtime value, instead of a predefined value, for the action parameter. This allows recursive actions that only involve Drafts to stop when it encounters a blank action name. It's great for triggering multiple built-in Drafts actions with a single draft, or for importing a batch of URL actions recursively.

The new allowEmpty=[YES/NO] parameter solves this recursive problem. Because most recursive invocations are incoming URLs, we can set the allowEmpty parameter to NO. This stops the recursive invocation whenever it encounters an empty draft. It also frees us to use x-cancel parameter the way we want to, whether we want to cancel and return, or cancel and continue.

The perfect example for this update is the first example that started this recursive hack in the first place: adding multiple events in Fantastical. It was Fantastical's 1.1.1 update with x-callback-url that started it all. And with the new Fantastical 2 released yesterday, it's only appropriate if I update it with the new fantastical2:// URL Scheme.

Read More

Troubleshooting Tips for Recursive Actions in Drafts 3.5

Prior to last week, I have extensively used recursive technique to invoke custom URL actions in Drafts processing each line into an event in Fantastical, a reminder in Due, or a Pomodoro task in Due. With the latest Drafts 3.5 update, this technique can cause an infinite loop because Drafts allows actions to run on an empty draft.

For actions that involve Due, I'd suggest you to stop returning to Drafts on your last reminder or task. But for the "Add Events to Fantastical" action, this trick doesn't work. Unlike Due, Fantastical doesn't prompt you before returning to Drafts.

Until I come up with a better solution, or until Greg Pierce decides to add a new feature that can avoid this problem, I will remove the x-cancel parameter of the "Add Events to Fantastical" action. At least, now you can stop the infinite loop by tapping the Cancel button on Fantastical parsing window.

Read More

Workflow: Using Timers in Due to Remind Yourself to End an Activity

As a part of my day job, I need to attend meetings every once in a while. Regardless of the meeting's goals, my personal goal is to limit the amount of time I spent on meetings. If I'm the one who arrange them, I'd set the duration to no more than an hour. Otherwise, I'd notify the other attendees that I can only attend the first hour of the meeting.

That's why most of my meetings are entered as "Meet someone for an hour" in Fantastical. While this seems to let me achieve my goal, it's only the first half of the battle. The second half is how to be reminded that I should end or leave the meeting when the 60 minutes has passed.

To do this, I could create a Due reminder that's set to trigger exactly an hour after the event. This can be done easily as a single chain action because Fantastical supports x-callback-url. But, if the event is rescheduled at a later time, I'd have to move the reminder manually.

Using a Timer instead of a Reminder

To solve this problem, I decided to use a Due timer instead. The idea is to trigger the timer when the meeting is scheduled to start. To do this, I need to set the Fantastical alarm to trigger at the time of the event. This way, I'd get a push notification when the event is supposed to start, and I could trigger the Due timer at just the right time.

Read More