Apple AI in Mail and What Could Be

The emails I usually get at work are not super useful β€” I mainly conduct work via Slack β€” but we get lunch at work, and the menu is usually sent to us as an email at the start of the week. I have food allergies so I try to keep atop of these just to know if I need to organise lunch for myself one day.

I was a little careless this week, and missed a lunch that had satay sauce, resulting in an unpleasent allergic reaction (nothing too serious, but still not a good time). I resolved to prevent this happening again by adding a rule that highlighted emails containing “nut” or “satay.” Adding the rule is… fine. It kinda sorta works, but it’s not perfect: running the rule flagged a few false positives.

But upgrading to a version of MacOS that had Apple AI, it struck me that these emails are getting processed by an LLM already, in order to power Mail’s email summaries and priorities. Like many others I find these features pretty useless, mainly because what is considered important it’s usually not relevant to me (I’m on heaps of mailing lists).

But what if I could tell Mail what’s important to me, and how I want it to respond? One could imagine me clicking into one of these weekly menu emails, engaging the LLM, and typing in an instruction like this:

This email comes in on Monday and list the lunch menu for each day of the week. When you see an item that has nuts, or an ingredient that is derived from nut, such as “satay”, highlight the email in red and flag it using the red flag.

I have no idea whether this is even possible using current tech. Certaintly it’s possible for an LLM to ingest the body of an email and work out if there is any indication of ingredients containing nuts (I’ve tested this using OpenAI’s API) but it might be more difficult mixing both the condition and action in a single request like this. Might be that a more guided experience is warrented, maybe in the form of a “if email looks like this, then do this”:

Auto-generated description: An email received on Monday from yada-yada@example.com, resembling a lunch menu with a peanut-containing item like Satay, should be marked in red and flagged.

I don’t know. I’m not a designer. But I know such a feature would be more useful to me that what’s in Mail right now. And I think the seeds are there for this to work. Apple just needs to let us users take the reins a little more.

Lots of good things in Go 1.24, including weak pointers (finally) and a utility function for generating cryptographically secure random strings (good for IDs). This new os.Root, which acts a bit like chroot, looks interesting too.

πŸ”— Prefer Numbered Lists to Bullets

Good arguments for using numbered listed instead of bullets in chat communication. I don’t disagree with any of them. I will say that tend to preferred bulleted lists simply because the chat apps I use tend to make using numbered lists more difficult than it should be. Slack, for example, only starts a “real” numbered list when it detects you type 1.. And once you’ve started, there’s no way to skip ordinals within the same numbered list.

Auto-generated description: A chat message from Leon Mika lists items with different numbers and includes a section to jot something down.
Note that "1. This" the only "real" numbered list, and has a different appearance.

Even Obsidian’s implementation is not perfect. Despite making it easy to start a numbered list at an arbitrary ordinal, it’s still not possible to skip ordinals.

It’d be simpler if they didn’t try to automatically make “real” numbered lists at all.

Via: Jim Nielsen

The Rules dialog in MacOS’s Mail needs some serious love. Aside from the fact that it’s teeny tiny, it’s also buggy. I couldn’t get the “set background colour” action to work, and selecting the condition to choose mail based on content doesn’t allow me to enter a value. Not good.

Well, damn! I ate something with peanuts today. That’s going to knock me about for the next few hours.

Here’s today’s face egging: my boss asked me to check if a list of countries we have included Γ…land Islands. Assuming that this list was in sorted order, I took a quick look at the countries beginning with A β€” conveniently at the top of the list β€” and came to the conclusion that the country wasn’t listed. Only after I told my boss that did I actually try to search for Γ…land Islands to double check, and sure enough: there it was, at the bottom of the list, right below Zimbabwe. Turns out the countries were sorted in code-point order, where Γ… comes after Z.

Request for any open-source projects that want to put banner ads on their site: please consider hard-coding the height of your banner to prevent the ad from reflowing the page. Otherwise, it may have an impact on the experience of those reading your docs.

Oh, that’s nice. Looks like Obsidian allows you to set the starting ordinal for numbered lists.

This was something I wish vanilla Markdown had for a while, so it’s good to see at least one Markdown editor embracing this.

First Impressions of the Cursor Editor

Along with Image Playgrounds, I also gave the Cursor editor a try today. I needed a tool to take a Micro.blog export and effectively “move” it to another blog, complete with uploaded images. This is something that’s not hard to write myself, yet it’s quite tedious: there’s HTTP calls, parsing Markdown, dealing with front-matter, etc.

So I was quite impressed at how much Cursor manage to automate for me: a good 60% of the codebase was generated using the Claud 3.5 Sonnet model. And it was pretty decent code for what this tool is, which is more-or-less a throwaway script. It suffered a bit when I needed to interact with the Micropub API though: that I just used an existing library I’ve written. But it was enough to get something working in about 2 hours. I doubt I would’ve finished it this evening if I was writing it myself.

Auto-generated description: A dark-themed code editor window is displayed, featuring Go programming language code on the right and a file directory on the left.

I’m not sure if I would use this for anything long-term projects. The quality of the code is good, but not great, at least not yet. And I kinda wish there was an “I’ll drive” mode, where the tab completions and generation prompts took a backseat from me just wanting to cut the code myself.

And I don’t know about you, but I’m someone that needs to be involved in the writing of the code to understand it. I find it difficult to simply jump into a project I’ve not worked on myself, and be expected to make significant changes. That always takes a while for me. It’s a bit like writing: the act of producing it is where half the benefit is.

But it’s a very intriguing editor and well worth the try. We’ll see if I turn to it again in the future.

Playing Around With MacOS Image Playground

I know I’m late to the party, and that this has been reviewed already by those that write about Apple software and anyone with an iPhones. Nevertheless, I’ve upgraded my Mac to the version of MacOS that has Apple AI, and along with it came Image Playgrounds. I thought I’d give Image Playground a go.

Here’s my first attempt. May I present to you: generic white technologist in a bow tie using a computer with a confused expression on their face:

Auto-generated description: An AI generated image of a person with glasses and a red bow tie sits behind a laptop, looking intently at the screen.
Based on true events.

It took me a little while to understand how to compose the image. I knew that this was going to be a very on-rails experience, but I was still expecting that prompts that would work for DALL-E would work here too. But when I tried the prompt “a technologist using a computer with a confused expression on their face,” I just got back an error. Eventually, I figured out that I needed to build up the image by adding additional clarifiers, which would floating around a pulsating orb while the image was being generated. This was a little more on-rails than I was expecting but I guess it’s a way for Apple to make this approachable for those not use to using ChatGPT, along with controlling the suitability of the output.

As for the image itself, all I could say is that it’s… okay. A little bit on the cartoonish side, but I’m guessing Apple prefers that over something with a high degree of realism. The subject looks nothing like me but that’s by design: I dared not use myself as the subject, given how bad the preview photo I assume it was going to use was. I am a little disappointed by how expressionless the generated people are. I’m not sure how well the underlying model actually understands expression like “confused” given that most of the suggested images had a neutral expression, with one exhibiting something that I can only describe as “surprise and delight.” This is the best one I could find.

Finally, it seems the developers of this app has never heard of the file system. I could share the generated image to a bunch of Apple apps like Mail and Notes, but I couldn’t find a way to save it as an image file. If there is a way, it’s not obvious: I checked the toolbar, menu bar and context menu. Copy to clipboard was an option so I ended up copying it to Acorn and saving it as a JPEG there. This is definitely something that would get any technologist confused.

So yeah, I don’t see this being a regular part of my workflow. It’s better than I expected, but this is definitely something that Apple has built for people who have not used DALL-E or any of the other AI image generators out there (and, I suspect, to appease their shareholders). For myself, I’ll stick with what I’m using now.

I’ll close this with a gallery of a few other images I’ve tried:

Was a little concerned that I was running out of time to meet my “get out more” goal for February, until someone I used to work with pointed me towards a day-long dev conference. Bought a ticket then and there. So should be able to check off the goal for this month (if the fates allow).

Ok, I admit that I probably should’ve looked through the settings menu before writing a post, because it looks like my new cooler does has a shutoff after N hours feature. It also allows you to set the fan speed. Why it’s on page 2 of the settings menu is beyond me, but it’s there and it works.

Auto-generated description: A Seeley International MagIQTOUCH control panel displays options for adjusting settings like standby brightness, status information, and shutdown timer. Auto-generated description: A MagIQtouch thermostat displays a shutdown timer set for 2 hours on its touchscreen.

πŸ”— We are destroying software

We are destroying software telling new programmers: β€œDon’t reinvent the wheel!”. But, reinventing the wheel is how you learn how things work, and is the first step to make new, different wheels.

Wheels are not the same. If I need a wheel for a wheelbarrow, I don’t want to use a wheel for a tractor just because it exists. The same is true for software. If all I want to do is minify some JS without all the transpiling crap that comes from using React or Typescript, why not eschew Webpack for my own handwritten build scripts?

Via: Simon Willison

I thought the need to use these isolators β€” which, when opened, will shut off power in the overhead line flowing from north to south β€” was the reason why the train replacement busses are where they are. Turns out I was wrong, as these isolators are still closed. Must be some other reason.

Auto-generated description: Power lines and electrical structures with closed isolator switches are set against a backdrop of trees and a clear blue sky.

So many people on bikes today. Have not seen this many cyclists in the park for a while. Guess the cool weather has brought people outside. 🚲

Moving all my project posts onto a separate blog… again. I tried writing them here, but I still feel like they belong elsewhere, where I have a bit more control over the layout and the design. Spent the morning configuring the theme, which was going to be orange but I had to change it to red as the orange didn’t provide a nice contrast for reading (you had to darken it almost to brown). I’m not sure if I’ll move the old posts over to it yet. Maybe the one’s on UCL.

Enjoyed this week’s P&B with Lou Plummer. I enjoy reading linkage.lol and I know people I work with who also follow’s Lou’s work. His blog recommendations look interesting too.

Released a new plugin for Micro.blog: Sidebar for the Bayou theme (yes, another sidebar plugin). Thanks again to @Mtt for making changes to the theme to support adding the sidebar. Can be installed from the plugin directory (please ensure you have Bayou version 1.1.3 or later).

What a cruel irony it is that the instinctive response to an itchy eye is to rub it, which doesn’t provide relief and only prolongs the irritation. The only way out is to ignore instinct and practice self control. There’s a metaphor here somewhere I’m sure.

About My New Cooler's Programming Feature

There’s lots to like about my new cooler, but the programming feature is not one of them. My old unit had a very simple timer with two modes: turn cooler on after N hours, or turn cooler off after N hours. Anything else requires manual intervention.

Auto-generated description: A wall-mounted thermostat with buttons labeled for power, mode, and temperature adjustment options.
The old control panel (turns out I did have a photo, albeit an old one). Set the mode: cool/vent (fan), the power setting, then tap Timer Select to choose between turn on or off after N hours.

I really liked this simple setup. Many times in summer, when the days are warm but not hot, and the nights are cool, it was nice to turn the cooler’s fan on and set the timer to turn it off after 2 to 3 hours, maybe longer if the days were a bit warmer1. The cooler will simply pull cool air from outside and circulate it around the room. This was enough for me to get to sleep, at which point the cooler would shut itself off in the middle of the night.

With the new cooler comes a control panel that is effectively a cheap Android phone, so it’s capable of much more. You can now set a program that has four separate modes set to four separate times of the day. Each day of the week now has it’s own program too. A particular mode can either be a desired temperature setting, or “off”.

Auto-generated description: A digital control panel for a Seeley International air conditioning system displays a program schedule with times and statuses.
The new control panel, showing the four mode settings for a particular day of the week.

To recreate what I previously had, I would now have to choose a specific shutoff time for every day of the week. No longer am I able to set the running time based on how I feel: it has to be an actual timestamp, with several taps involve if you want to change it. This timestamp can only be set up to 11:59 PM so if you want the unit to shut off after midnight, you’ll have to remember to choose the program for the next day.

Oh, and mercy on you if you wanted a timestamp that didn’t land on the hour. The minutes can only be changed by 1, so you’ll be tapping 30 times if you want the unit to shut-off at the half hour.

Auto-generated description: A digital thermostat screen displays settings including start time, day selection, temperature, and status options.
Adjusting the settings of a particular mode, one minute at a time.

You also have no control over the fan speed. That was another nice thing about the old unit: you set the speed to what you want, and then you set the timer. The unit will stay in that mode until it shuts off. I don’t want the fan to be blowing a gale when I’m trying to get to sleep, so the fan was usually set to the lowest or second-lowest setting.

This new programming modes only have a temperature setting, so if the house is warm, the cooler will crank up the fan until it reaches half-speed or just above; speeds I usually use in the middle of a very hot day. This means noise that will change in intensity as the target temperature is reached. I’m not a great sleeper so any additional noise like that is disruptive.

Auto-generated description: A Seeley International MagiQtouch controller displays temperature settings and a schedule for cooling with the message PREWET IN PROGRESS.
The unit operating in program mode.

So I’m a little sad that I lost this simple timer-based approach to operating the cooler. I’m not even sure who this programming feature is built for. It sort of exists in that nether region where it’s too complicated for the simple things, yet useless for anything other than a set weekly routine. I set my cooler based on the weather conditions which, you may be surprised to know, does not fall into a nice weekly routine. Granted, it may make it possible to use this to recreate the simple timer approach I had before: I just preset everything and only activate the program when I want it. And yeah, it’ll probably be fine, but I do feel like I’ve lost something.

Update: Apparently the cooler does have a shutoff after N hours feature. It’s just buried in the settings menu. The post still stands, as it would’ve been nice that this was a feature of the Program mode, but at least there’s something I can use.


  1. If the days and nights are hot, I don’t bother with the timer and just leave it running all night long. ↩︎