The online home of Brave Location Services Ltd.

Introducing Quick Add

The fastest way to add reminders (maybe šŸ˜€)

So I’ve just released a new app - for both iOS/iPadOS and as a Mac Menu Bar app - called Quick Add, which is a fast way of adding Apple Reminders

Why another Reminders app?

I’ve been using Todoist for many, many years, but I’ve often dabbled in using Apple Reminders on and off during that time

I’ve always wanted to have the better native integration of Apple Reminders, but what always drew me back to Todoist was the quick way you could add a reminder, priorities, project etc. with just text input.

Apple Reminders has got better over the years, but I realised if I have that quick way of adding a new reminder with Apple Reminders, I’d probably make the switch full time.

Hence me making Quick Add!

Using AI to help

To be honest another driver was GitHub Copilot moving to a PAYG model, and I had a month’s worth of tokens to use up!

To be clear this not a ā€œvibe-codedā€ app - I had a clear vision of what I wanted to build, and how I wanted it to look. I’ve built many apps the now old-fashioned way, but like most developers now I use the AI coding tools we have at our disposal to save a lot of time

In particular, writing the parsing engine to turn the text input into structured reminders would have been a bit of a chore. Doing this in my spare time before would have taken a lot longer, and to be honest is a bit boring to do, which is why I hadn’t built this before

Now with AI coding help, it was easier to define exactly what the parsing rules should be, and then get the helper to generate the majority of the code - and most importantly lots of great unit tests - to help build it much quicker and probably more accurately than I could have done myself

Limitations of EventKit

I wanted to ship the apps in the App Store, which meant I had to work within the limitations of using EventKit, Apple’s SDK for adding reminders.

Reminders has added several really useful new properties on reminders over the last few years e.g. support for hashtags and URLs, but haven’t updated EventKit for years to keep up

I’ve done the best I can to support using this, by adding the appropriate data in the added reminder’s notes, but it is super frustrating that Apple can’t be bothered to expose these new fields to 3rd party developers

Built for me (but feel free to use it too!)

This is very much built exactly to solve a problem I had, so it may not be for you

With AI coding tools making writing projects like this so much easier, I think there will be more and more highly personalised app like this

However, I reckon I’m not the only person in the world who’s looking for a simple app like this - if that’s you feel free to give it a go

Download on the App Store


Quick Add is ā€œCharitywareā€

Like Quick Add? Here’s how to say thanks …

Quick Add is free to use, but if you are enjoying the app and want to say thanks, please consider donating a small amount to a charity of your choice

If you’re looking for some ideas, here’s a few charities I’m happy to support:

If you do donate, please drop me a note at @johnp@bravelocation.com so I can say thanks to you!

WWDC 2026 Wishlist

My hopes for the coming year in the world of iOS development

This is my sometimes annual post on WWDC Eve, on what I’d like to see this year from Apple’s developer conference

I’m usually disappointed, and it was interesting to look at my prediction for WWDC 2024. Lots of hope for AI features, and lots of stuff still not delivered.

1. AI (Again, Again)

Apple really are massively behind in AI right now, but supposedly this is the year they finally get it right, and we will get an actually functional Siri and useful integrations.

Apple have signed a deal with Google to use Gemini, so it will be very interesting to see what they’ve actually done

My particular wishes are …

Much improved on-device LLM developer functionality

Earlier in the year I used Apple Intelligence to add daily summaries in my Sideboard app, which was a pretty underwhelming experience - the summaries are actually pretty useless ā˜¹ļø

However this is a perfect case for seeing if the new Gemini-backed, on-device tools have improved in iOS 27. They really need to!

MCP support in Siri

I’m sure this won’t happen, but I don’t just want App integration in Siri, I want external MCP server support too. Not everything is an app, and the other main AI providers allow you to do this

2. Full support for reminders in EKEventKit

I’m in the middle of making a new app to make it easy to quickly add reminders

I’m back replacing Todoist with Apple Reminders as my task list, but miss Todoist’s fast way of adding tasks - so I’m making my own app to do this

Not sure this will ever ship (but I’m using it every day!), but the creaking EkEventKit - the official API for dealing with reminders - is missing support for lots of the newer reminder properties (tags etc.)

There really is no excuse for not updating this API, again really hoping this is the year

3. Improved SwiftUI on Mac

I actually really like SwiftUI, and it’s great you can (mostly) share UI code across Apple’s different platforms with it (mostly) working

That’s a lot of ā€œmostlyā€s though, and Apple needs to make the code just look better on the Mac, and not have some truly ugly implementations on their core OS.

Conclusion

Realised the general tone this year is one of frustration with Apple, a general lack of quality in what they have shipped (or not) in the last few years

Not hopeful about most of my hopes, but maybe I’ll be pleasantly surprised this year?


Post-WWDC scorecard

Not great, but not as bad as I expected:

  • āœ… Much improved on-device LLM developer functionality (first reports seems like they’ve finally done it)
  • āŒ MCP support in Siri (didn’t really expect this)
  • āŒ Full support for reminders in EKEventKit (not going to happen)
  • ā“ Improved SwiftUI on Mac (definitely some UI improvements)

Writing an MCP

Using AI to generate code for AI Agents

The whole world is transitioning over to using AI for more and more things, so obviously we need Yeltzland to be on the cutting edge and make sure users can get Halesowen Town results in this new, exciting future 😁

Reusing existing Alexa code

A while back - when this was all the rage - I wrote an Alexa skill

You can ask it about the latest score, who do we play next etc. by basically fetching the fixtures/results data I maintain for the mobile apps, and then parsing it into a response suitable for a voice assistant.

Clearly in theory I should just be able to port this logic into a MCP service - the emerging standard for integrating with API assistants.

Using AI to write the code

This also seemed an ideal task for an AI coding agent to do the actual work of getting it ported to an AI-friendly format.

I’ve been using GitHub Copilot Pro for a while, it fits well into my workflow at a reasonable cost (currently $10 per month)

I set it the task to port the existing Alexa skill code into an MCP service I could run on AWS Lambda, and after a few iterations it did a pretty good job.

The service logic itself is almost completely reused, but the new code is around specific MCP support - which isn’t super-obvious how to do when running as a Lambda function.

Interestingly the first iterations worked, but were quite verbose as they weren’t using the latest MCP packages - which meant the coding agent wrote some of those new features itself.

A common occurrence out of the box as they can never be completely up to date out of the box without some help.

I pointed the agent to the latest documentation specifically, and instructed it to use the latest package, and it then did a nice job of refactoring the code to make it much more understandable and readable to this puny human.

Product Engineering

I think this is a perfect example of how the job of being a software engineer is changing right under our feet. We not really ā€œcodersā€ any more- although I’d strongly argue that was never what we were

Tim Checkley from Loomery - who I worked with recently - summarised this perfectly in a great post recently, that the role is being transitioned to being a ā€œProduct Engineerā€.

An understanding of user needs, as well of what is possible rather than just how to code them, will be far more important going forward than it is now I strongly urge everyone to give this a read

Installation Instructions

If you want to give this MCP a go, there are full instructions on how to set it up at https://bravelocation.com/mcp-instructions - AI generated of course

Programming note

The text written here is the only thing not AI generated, so any nonsense, spelling mistakes or gramattical errors are all down to me. The terrible summary image was made by Chat GPT based on the post (has that glorious ā€œMade for LinkedInā€ look 🤣)

Apple Intelligence Daily Summaries In Sideboard

Sounded like a good idea, but turned out less useful than I hoped

I decided to add daily summaries in my Sideboard app using Apple Intelligence, but it didn’t turn out as well as I’d hoped

A quick recap - the app basically shows you all your upcoming calendar events for today and tomorrow, and shows a countdown both during and before your meetings

I wanted to test out using Apple Intelligence to see if it could generate a nice text summary of your day, and also learn about using Apple’s Foundation Models on device

You can see from the screenshot from the iOS app below how it turned out:

Screenshot of the Daily Summary on Sideboard

The code part

Apple’s actually done a nice job of making it easy to integrate their local Foundation models into your app

You can write a Custom Tool that can expose your model data in an LLM friendly way, and then get an text summary back in a few lines of code

Below is a truncated example of my code …

let session = LanguageModelSession(
    tools: [MeetingsSummaryTool(meetings: upcomingMeetings)],
    instructions: "You are a professional productivity app. Provide a concise, business-appropriate summary for the upcoming day in a formal tone. Focus on the most important and timely information. Keep summaries to a single sentence, and don't just restate the information about the meetings, the user can see that already in the app. Don't restate the meeting details as a list. Don't add any formatting or markdown."
)

do {
    let response = try await session.respond(
        to: "Provide a concise professional summary of today's upcoming or in-progress meetings.",
        options: GenerationOptions(sampling: .greedy, temperature: 0.0) // Try to keep the results the same
    )
    
    return response.content
} catch {
    self.logger.error("Summarise error: \(error)")
    
    return ""
}

Obviously the real skill is in the prompt engineering, and the above prompts are the result of a lot of trial and error trying to get the best results

Also note the GenerationsOptions() line, where I set the temperature to 0.0. This basically tries to keeps the same results given the same input, which I wanted to do as the summary is regenerated every minutes as the upcoming meetings may change

The result

I tried all sorts of prompts to try to improve the outcome, but I was pretty disappointed in the results. Now it could be that with better prompting you would get better results, but to be honest the summaries don’t add a great deal to the app

It’ll be very interesting when Apple release their new Gemini-backed Foundation Models later this year, to see if they can do a better job. I really hope so!

If you want to try the summaries yourself, they are available via an optional setting (on an Apple Intelligence supported device of course!) in the latest version of Sideboard

P.S. The hero image at the top is obviously an AI generated image (via ChatGPT not from Apple Intelligence of course!)

Adding CarPlay Support to Yeltzland

I'm ridiculously excited about doing this šŸ˜†

I’m pleased to announce my Yeltzland iOS app now has support for CarPlay

Supporting Radio Halesowen Town

The team from Radio Halesowen Town has done a great job of providing radio commentaries for both home and away matches over the last few years

With their permission, and after a daft amount of back and forth with Apple, I added support for streaming the station in the app a couple of months ago

This meant I could apply for the ā€œAudioā€ CarPlay entitlement from Apple to let me add CarPlay support, and surprisingly that went through without a hitch (although unsurprisingly it took ages to be approved)

Code for adding CarPlay support

It was pretty simple to get this working

Basically you add a CarPlayDelegate class to your main app that implements CPTemplateApplicationSceneDelegate, and setup CarPlay support by making a few changes to the app’s Info.plist

CarPlay allows you to configure various UI template classes with your specific details, and then it will handle the drawing of screens on the myriad of different devices and screen dimensions

I basically setup the ā€œnow playingā€ template with the Radio Halesowen Town stream details, and then everything works fine

iOS 18+ also supports settings ā€œsports scoreā€ information, with the teams playing, latest score etc. and obviously I already have that information available in the app, so supporting that was a breeze

You can see from the screenshot below it came out pretty nicely, even though I say so myself!

Screenshot of the CarPlay Screen

One more step along the road of getting Yeltzland on every possible screen 🤣

P.S. Yes, before you ask I am thinking about supporting Android Auto as well