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.
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.
Even though I'm able to define the calendar shortcut anywhere within the sentence, the team at Flexibits officially supports only two positions for it. You either use it at the beginning or at the end of the sentence. I personally prefer to use it at the end of the sentence.
The new Fantastical 2 updates the natural language syntax to allow you to define the alert time period for your new event, overriding the default settings for it:
[event name] at [location] [date/time] [alert] [URL] [calendar name]
Here are several examples that refine the events that I show previously:
Meet with Abraham at Lenmarc Mall on Mon 10.30-noon alert 45 min http://modernjamming.com /w
Internal Team Meeting at R714 on Wednesdays from 11-2p alert 3 hours /w
Family Dine Out on the 2nd Friday of every month at 6-9p alert 3 hours /h
Wash the Car every third Thursday at 8.45a alert 25 min /h
Pick up Noah at MSCS on Mondays, Wednesdays and Fridays at 10a from 11/13 to 11/25 alert 18 hours /h
The above examples show how I can adjust the alerts to trigger just-in-time before I leave for the events. I can fine-tune each alert based on my estimation of how long it will take me to drive or prepare for the event. Fantastical allows you to define the alert time period in minute, hour, day, or week precision.
2. Create Reminders with Natural Language
Fantastical 2 brings its great support for natural language from event creation to reminder creation. Using the built-in Reminders app as its underlying data storage, Fantastical 2 offers a faster, more expressive, and very powerful way to adding new reminders to your lists. Here's the syntax for defining new reminders in Fantastical 2:
(task/todo/reminder/remind me to) [reminder name] [due] [priority] [URL] [list name]
It uses the same parser as the event creation parser. All you need to do is add one of the prefix options: "task", "todo", "reminder", and "remind me to", to let the parser knows that you want to add a new reminder, instead of an event. Here are some of the examples that you can try:
Task Pay the Bills on the 2nd day of every month at 8.30p!!! http://klikbca.com /m
Todo Reply Wendy's Email by noon!! /ip
Reminder Call Peter to Arrange Meeting on Thursday! /ip
Remind me to Schedule US Visa Interview!! /m
Remind me to Wake up early on the 18th at 4a!!!
Remind me to Buy Mom's Favorite Tabloid every other Friday
Remind me to Buy Birthday Gifts for Philip's Friends due 11/13
Remind me to Buy JPCC Worship's upcoming album on Nov 16 /m
Remind me to Buy Milk for the Kids every third Friday at 5.15p until 2016/12/31!!
Remind me to Download Bank Statement every 4th until 2016/12/31 /m
The examples above show you a few other date/time natural language examples that Fantastical supports: "on the 2nd day of every month", "by noon", "on the 18th", "due 11/13", and "every [..] until 2016/12/13". The "due" and "by" are natural prefixes that you can use to indicate due dates for your reminders. You can use "until" to define the "repeat end" field for your events/reminders.
The list name works the same way as the calendar name for event creation does. I use /m for my Mac list, and /ip for my iPhone list. One thing that's unique to reminders is the priority field. Reminders allow you to define !, !!, !!! as priorities for your entries. I like to append them at the end of a sentence, because that's how I'd naturally speak them out loud.
3. TextExpander Integration
Fantastical 2 also comes with a TextExpander integration. This allows us to store common snippets such as the following examples I have on my TextExpander snippet group:
[ggift]: Remind me to Buy a Birthday Gift for %| due
[llunch]: Lunch Meeting with %| at 11-2p alert 2 hours /w
And, to make things even better, Fantastical 2 supports fill-in snippets from TextExpander. As Federico Viticci showed in his review, we can now setup our most-visited locations as a list of values in a TextExpander snippet and easily pick one of them when we create a new event.
I rarely put exact addresses in my events, but I can use this feature with a list of people's names who I have meeting with most frequently. Here's what my TextExpander looks like:
[mmeet]: Meet with %fillpopup:name=Person Name:Abraham:default=Andy:Camila:Ray% at %| alert 3 hours /w
4. Embed URL Schemes in Events and Reminders
Ever since Fantastical 1.x, you can embed URL Schemes in your events. Unless you created your events in Drafts, which has a great support for TextExpander snippets, it was unpractical to memorize the URLs, even for the most common ones. With the new TextExpander support in Fantastical 2, it's now easier to create snippets containing these URLs and trigger them without having to involve Drafts or Launch Center Pro. Here are some examples of the TextExpander snippets I created:
I use the first snippet whenever I add a new reminder to call someone. The URL will open up Launch Center Pro's search-and-dial window allowing me to immediately search for someone's phone number and call her.
I use the second snippet to send an email with "Meeting Agenda" as its subject, using Launch Center Pro's in-app Email URL. Upon sending the email, this URL will let me return to Fantastical.
Another example that I want to highlight here is related with my travel workflow. I have a TextExpander snippet containing all the common things I pack in my travel.
[ttravel]: Underwear, Socks, T-Shirts, Medication, Passport, Driver's License, Itinerary, Copies of Travel Docs, Copies of Passport, Medical Insurance Cards, House Keys, Travel Locks and Keys, Luggage Tags, Hospitality Gifts, Pens, Cash, Credit Cards, ATM Cards, iPhone and Charger,
With the availability of
[prompt-list] in Launch Center Pro which allows me to easily add new items as multiple lines, here's the new TextExpander snippet that you can use to embed this Launch Center Pro action into your events:
Open this link to download a copy of a TextExpander group containing all the TextExpander I use in these examples.
Note: If you're trying to install the snippet group directly from your iOS device, open the TextExpander app, switch to Groups tab, and tap the
+button on the bottom right corner. Choose the Add via URL option, and paste the download URL above.
5. Natural Language Support in Search
Again, ever since Fantastical 1.x, you can search for events by passing your search keyword in its
fantastical://search?query=&scope= URL. Because the new Fantastical 2 treats reminders as first-class citizens, you can apply similar techniques to search for reminders as well. Here are some examples that you can create as actions in Launch Center Pro:
You can use
all in the
scope parameter. And, here are some more examples where you can jump to a particular date in Fantastical 2:
Bonus: Sending Fantastical Events via iMessage
Sometimes I have the need to send reminders to someone else. As I will be traveling within the next six weeks, I'm starting to have the need to send events to someone else. Because I won't be a part of the events, it's not going to be in my Calendar to begin with. My solution is to define the new event in Launch Center Pro and send it as a Fantastical URL via iMessage.
Open this link if you want it installed on your iOS device automatically.
The above action will prompt the recipient's email address, and the natural language that you want to be parsed in the recipient's Fantastical. If you share the same need as mine, give it a try. It's kinda magical.
As Shawn Blanc puts it, Fantastical 2 is a great update to the best calendar app for the iPhone. Hopefully this post can help others in getting the most out of Fantastical 2. I'm just scratching the surface of what we can do with Fantastical 2 here. I'm looking forward to what others will create and share.
You should follow me on Twitter here.