{ "feed_url": "https://jbmorley.co.uk/feed/", "home_page_url": "https://jbmorley.co.uk", "items": [ { "content_html": "\n
\n \nJust a week after returning to my weeknotes, it's going to be a lighter one this week as Sarah and I managed to catch COVID. I spent a little time on Builds, but also took a some time off work-like projects to play around with ideas for my thermal printer and continue the Little Luggable Raspberry Pi 5 upgrade.
\nThe first half of the week was spent trying to get Builds ready for a first private TestFlight beta–I've had a few friends express interest and I'd like to let them try it out. (If you're also keen to test out an early beta, please get in touch.)
\nWhen I first started working on Builds, I was primarily interested in seeing if I could create something that improved my own daily development experience. As such, I put very little effort into the flow for adding GitHub Actions workflows to the app (a simple dropdown list was sufficient), instead focussing on the primary functionality of fetching and reporting statuses. Now that I'm planning to let others use the app, on-boarding becomes significantly more important.
\nBuilds reports on branch-specific runs of GitHub Actions workflows. This means that any on-boarding flow needs to make it easy for users to select, for each of their repositories, pairings of workflows and branches.
\n\n\n
My initial implementation for adding workflows presented users with a view containing three pickers allowing them to select a repository, workflow, and branch:
\n\n\n
This proved slow and cumbersome, offering no overall context and making it easy to forget workflows or unintentionally add duplicates. It also translated incredibly poorly to iOS which offers no way to quickly navigate big pickers.
\n\n\n
With these failures modes in mind, I set about designing something better:
\n\n\n
It's actually quite hard to break down the many thoughts and iterations that went into this but, while I'm sure there are still improvements to be had, I'm pretty pleased with how it's turned out. The main goal is to show users as much context as possible, making it quick to add and remove builds, and easy to see all available builds. Setting up the app from scratch multiple times during development has proven a great stress-test for this workflow and I'm happy with how it works.
\nOne challenge in designing the experience was figuring out what to do with the explosion of per-branch workflow runs. For example, if a repository has 3 workflows and 5 development branches, that's a possible of 15 workflow builds. After much experimentation, I've settled on showing workflow runs on only default branches by default and using a picker to allow users to add additional branches. This optimizes for the primary use-case where people are interested in understanding whether 'main' builds, but also accommodates projects with long running development or dedicated release branches.
\nHaving decided I want to support both iOS and macOS, I put some time into thinking about the sync story–it's incredibly jarring to have the same app on multiple devices but have to configure each individually and I want to avoid that.
\nI'd assumed my minimal needs would make this a perfect use-case for SwiftData but a lack of observer mechanisms outside of the SwiftUI lifecycle made it near-impossible to use for fetching statues in the background. I briefly explored using the CloudKit APIs directly but, in the end, settled on storing a simple array of workflow favorites in NSUbiquitousKeyValueStore
–it seems good enough for my current lightweight needs and I can switch it out if I start to see syncing issues. I've been living on this implementation for about a week and it's been rock solid.
Early on in the pandemic, when we were all encouraged to quarantine mail, I put together a Raspberry Pi powered receipt printer based on Adafruit's Internet of Things Printer. Press a button, and it would print out quarantine 'release' tickets to let us know when our mail could be opened. Since that time has passed, it's been sitting unused on the shelf and I've been dreaming up things to do with it.
\nSpurred on by Dan Catt's pen plotter art–especially his recent work focused on handwriting–I thought it might be nice to use the receipt printer as a way to help manifest digital things in the real world and try to bring back a little whimsy in the process. With that in mind, I created Writeme.
\n\n
\nWriteme allows anyone to send a little doodle to my receipt printer. It's quite possible I'll come to regret this (gone are those heady early days when putting something like this on the Internet seemed like an unquestionably great idea), but hopefully it brings a little entertainment while it lasts.
\nIt's been fun to see what people have sent so far and I'm looking forward to a few more doodles.
\nJust like last week, I spent a little time tweaking the Little Luggable.
\nWhen I originally built the Little Luggable, I picked up the Pimoroni Audio Amp Shim with a view to driving a built-in speaker but never quite managed to get it working. At the time I was using Manjaro on my Pi 4 so thought the issue might have been with the drivers, and eventually gave up. Since I'm now Raspberry Pi OS on my Pi 5 (for the moment at least), it seemed like a good time to try again. Just like my experience with Manjaro, the Pi would list the device but didn't seem to be able to talk to it, with alsamixer
complaining that it had 'no controls'. Having read around a little, it seemed like the issue might be with the shim's friction-fit connectors1 so I broke out the soldering iron. A few minutes later and I was enjoying the dulcet tones of a wilhelm scream at a loud 100% volume through MPlayer. Keen not to repeat that experience in a hurry, I broke out ScummVM and a few games instead.
\n
\n \nMuch to my surprise the Little Luggable's mono speaker sounds quite good–far better than most laptops and monitors.
\nEven the Pimoroni product page includes the comment, \"[t]o ensure a robust connection, we'd suggest soldering the SHIM to your Pi's GPIO pins (or a socket header) when you come to install it in your final project\". ↩
Life is starting to look a little calmer, and I thought I'd try a return to my weeknotes.
\nThis week has involved lots of software (Symbolic. Folders, and Builds), a little bit of hardware (Little Luggable), and some retro operating system fun (Haiku). There are also a few honorable mentions.
\n\n\n
I've spent the past couple of weeks trying to get Symbolic–my Apple developer-focused icon designer–ready for release. Things stagnated last year when I realized I couldn't legally sell the app through my UK company thanks to various US tax liabilities but, now I've finally got my US work authorization back again, I'd like to get it in the App Store.
\nAfter much thought, I've decided to make Symbolic subscription-based: $0.99 a month, or $9.99 a year (at least to start with). This will be the first app I've ever sold, so it's quite an adventure for me; asking for money really doesn't come naturally. My goals with this are three-fold:
\nencourage me to take my own projects more seriously
While I aspire to making a living from my own creations, it's all too easy for me to trivialize my projects. I'd like to test the theory that it'll be a lot easier to take them seriously if proves that people are willing to pay money for them.
start to cover some of my infrastructure costs
Building software is an expensive business, both in terms of software and hardware infrastructure costs. Mine are currently unsustainable, so something's got to give.
learn what others want from my software
I'd really like to get input on what people like (and don't like) about Symbolic and my other apps. I've got some ideas about where to take things, but ultimately I'd like that to be guided by my users, and my gut feeling is that I'll get a different quality of engagement from paying users.
Of course, part of my reticence in actually selling my software is the distinct possibility that no one's interested. I suspect Symbolic has a small target audience at best, but I'm hopeful I'll get a few users. If I don't, I've at least learned something. 🤞🏻
\nHaving decided to go with a subscription-based approach, this week has been focused on integrating StoreKit and testing all the edge-cases1. I'm currently planning on only requiring a subscription for exports, which should mean users can get a really good sense of what they're getting into before subscribing.
\n\n\n
Folders is an app I've been tinkering with for a few months now–it's one step in what feels like a long journey of experimentation around producing a better device-local experience for managing my files. With Folders, I'm inching ever closer to a Photos-like experience; one that's already working better for me for the many multimedia files I've collected over the years.
\nSo far, my focus has been on building a live-updating file browser app that performs well regardless of the number of files I throw at it. That means SwiftUI is out for all but the most structural elements of the UI, and AppKit is in.
\nLast week my work was primarily around the correctness of those live updates–Folders uses FSEventStream under the hood to watch for changes, and turning those events back into high-level file operations is nuanced. My goal is that Folders responds to on-disk changes as quickly as Finder and, after quite a bit of work, I think I'm finally there:
\n\n
\nIt's been challenging to stay focused on the more fundamental aspects of Folders–now the app's taking shape, I'm starting to get excited about all the extra features I can add. I plan to take a little more time to sure up the foundations after which I'll start building some search indexes and really having fun!
\n\n\n
Builds is a status board for GitHub Actions. Like Symbolic, it's an app I originally wrote to serve my own needs that has rapidly become a core part of my workflow, and is increasingly looking like something others might find useful. The premise is pretty simple–it shows tiles with the statuses of each of your GitHub Actions workflows.
\nThere's clearly a lot of room for feature creep with Builds, but right now I'm focused on reporting current build statuses concisely, and offering a consistent experience across iOS, macOS and iPadOS. With that in mind, this week's work has been on CloudKit sync which gave me a nice excuse to try out SwiftData for the first time.
\nI've got grand plans to add some little desktop toys for reporting overall build status (maybe I can resurrect the integration cats), but I imagine it'll take a while before I can get to them.
\n\n
\nI finally managed to snag an 8GB Raspberry Pi 5 so I took a cursory look at updating the Little Luggable. The increased power demands of the Pi 5 make for a great excuse to rethink the battery situation–I'm planning to try out the Geekworm X1202 UPS HAT which I think I can squeeze into the Pelican Case with a little care, and which I hope will prove significantly more reliable than the PiJuice I've been using so far.
\nSadly I've not yet managed to test the Pi with the Little Luggable's touchscreen as the display cable pitch has changed. I've got one on order so hopefully I can do that next week.
\nInspired by progress updates on the MNT Pocket Reform, I've also been wondering about laser etching legends onto the Rama Works GRID keycaps–they look wonderfully minimal without legends, but aren't entirely practical.
\n\n
\nSpurred on by Action Retro's enthusiasm for all things Haiku, I revisited my goal of daily-driving Haiku on my ThinkPad T460. Things are, unfortunately, still a little shaky on actual hardware–I had to pick up a TP-Link USB WiFi adapter as the built-in Intel chipset didn't work–but it's getting there slowly and I managed to do research for the Little Luggable using just Haiku last night.
\nHaiku is a charming operating system and after many years of macOS it's a pleasure to play around with different windowing and architectural approaches, even if they do come out of the 90s.
\nSince I've not written many updates lately, there are a few things that have slipped through the cracks:
\nRenewals are my current nemesis. ↩
I've recently been trying out the Hyprland on my Fedora-based ThinkPad. It's a breath of fresh air next to macOS, combining the fast functionality I've come to expect of a tiling window manager with good looks and elegant animations.
\nOne of the challenges I've found to be consistent across tiling window managers however, is how they handle apps like 1Password that offer more transient experiences. Since traditional window managers don't differentiate between tiled and more transient floating windows, you're left to add these annotations for yourself.
\nFortunately, Hyprland makes it easy to add window rules that instruct it to treat certain windows specially. For example, I use the following set of window rules:
\nwindowrulev2 = float, title:(1Password)\nwindowrulev2 = size 70% 70%, title:(1Password)\nwindowrulev2 = center, title:(1Password)\n
\n This ensures that the 1Password window (specifically any window titled '1Password') will open centered, 70% of my screen size, and floating above all other windows, making it minimally disruptive when I unlock 1Password to log into a website.
\n\n
\nTo round things out, I've also added a key-binding to let me quickly launch 1Password using Super+\\, replicating the workflow I'm familiar with from macOS:
\nbind = $mainMod, code:51, exec, 1password\n
\n \n",
"date_published": "2024-02-12T16:00:00-08:00",
"id": "https://jbmorley.co.uk/posts/2024-02-13-1password-and-hyprland/",
"title": "1Password and Hyprland",
"url": "https://jbmorley.co.uk/posts/2024-02-13-1password-and-hyprland/"
},
{
"content_html": "\n \n \n Living in Hawaii we share our lives with a wonderful collection of lizards, including this stealthy little guy.
\n \n", "date_published": "2024-01-23T12:39:36-08:00", "id": "https://jbmorley.co.uk/photos/snapshots/2024-01-23-12-39-36-camouflage/", "title": "Camouflage", "url": "https://jbmorley.co.uk/photos/snapshots/2024-01-23-12-39-36-camouflage/" }, { "content_html": "\n \n \nGoing through all my past projects, I discovered I'd never finished my acrylic MiSter case–I'd put everything together but didn't take the time to wire up the three case switches, leaving me without the crucial Reset and OSD buttons (I've still not found a use for the User button).
\nArmed with a new-found desire to finish up my projects and free myself up to do other things, I ordered the appropriate JST connectors from Mouser and set about soldering everything up.
\n\n
\nOverall, I'm pretty pleased with how the case turned out. It's been a pleasure to go back to it after all this time and get to enjoy some of the design choices I made–I love how it shows off the internals of the MiSTer. Of course, there's a bunch of things I'd change1, but it's nice to call it 'finished', at least for a little while.
\nNot least reducing the number of port cutouts. ↩
It's amazing how big things we think of as house plants in the UK grow out here.
\n \n", "date_published": "2023-11-12T15:47:25-08:00", "id": "https://jbmorley.co.uk/photos/2023/11/wahaiwa-botanical-garden/IMG_3003/", "title": "Monstera", "url": "https://jbmorley.co.uk/photos/2023/11/wahaiwa-botanical-garden/IMG_3003/" }, { "content_html": "\n \n \n", "date_published": "2023-11-12T15:38:32-08:00", "id": "https://jbmorley.co.uk/photos/2023/11/wahaiwa-botanical-garden/IMG_2999/", "title": "Uneven Surface", "url": "https://jbmorley.co.uk/photos/2023/11/wahaiwa-botanical-garden/IMG_2999/" }, { "content_html": "\n \n \nA large part of the garden is set down below the level of the road and you really feel like you're entering a different world as you descend the steps with the canopy far overhead.
\n \n", "date_published": "2023-11-12T15:27:54-08:00", "id": "https://jbmorley.co.uk/photos/2023/11/wahaiwa-botanical-garden/IMG_2994/", "title": "Umbrella", "url": "https://jbmorley.co.uk/photos/2023/11/wahaiwa-botanical-garden/IMG_2994/" }, { "content_html": "\n \n \nI've collected a large number of hardware and software projects over the past few years. These served as wonderful distractions during the pandemic but now feel like they're stopping me from completing anything–especially when the software components often require on-going effort to simply keep up with operating system and language updates.
\nWith that in mind, I've decided to very consciously stop working on a few projects and limit the scope of others, starting with Spherical Display and Locate.
\n\n
\nMy attempt at a spherical persistence-of-vision display, this now feels like a textbook sunk cost fallacy–I have invested a lot of time in designing and assembling the mechanics of the display yet I find myself a long way from even a working demo. The idea and approach feels sound and I've learned a lot on the way, but it's clear there remains a huge amount of work required to produce the kind of robust display I would need to be able to take it to festivals. With that in mind (and as cool as the idea might be), I'm putting it on indefinite hold and archiving the GitHub project to let me focus on other things.
\n\n\n
Locate is macOS app that lets you add URLs to a map and tries to automatically detect a suitable location for web pages wherever possible. While I built Locate to serve a need when we were apartment hunting, it was primarily intended as a proof of concept; a way to test out ideas that I hope to roll into Bookmarks in the future. Instead of investing effort keeping Locate building, I'm going to archive the project and focus my efforts on adding the location-based view I'd always planned into Bookmarks.
\n \n", "date_published": "2023-11-04T17:00:00-07:00", "id": "https://jbmorley.co.uk/posts/2023-11-05-letting-go-spherical-display-and-locate/", "title": "Letting Go", "url": "https://jbmorley.co.uk/posts/2023-11-05-letting-go-spherical-display-and-locate/" }, { "content_html": "\n \n \nIsland Boy, a store up in Honolulu, had a really creative approach to getting the pool for their two-year anniversary pool party.
\n \n", "date_published": "2023-10-28T12:09:01-07:00", "id": "https://jbmorley.co.uk/photos/snapshots/2023-10-28-12-09-01-pool-party/", "title": "Pool Party", "url": "https://jbmorley.co.uk/photos/snapshots/2023-10-28-12-09-01-pool-party/" }, { "content_html": "\n \n \nNow we're finally more settled again and have our things back, it's been nice to spend a little time with my Analogue consoles–they're the perfect match for this fabulous Sony Trinitron PVM-9L2 I chanced upon on Craigslist.
\n \n", "date_published": "2023-10-27T19:09:58-07:00", "id": "https://jbmorley.co.uk/photos/snapshots/2023-10-27-19-09-58-pvm/", "title": "PVM", "url": "https://jbmorley.co.uk/photos/snapshots/2023-10-27-19-09-58-pvm/" }, { "content_html": "\n \n \nThe sun ages everything out here in Hawaii, leading to some beautiful colours, textures, and patterns, just like this gate in Kaimuki, Honolulu.
\n \n", "date_published": "2023-09-23T11:24:55-07:00", "id": "https://jbmorley.co.uk/photos/snapshots/2023-09-23-11-24-55-wabi-sabi/", "title": "Wabi-Sabi", "url": "https://jbmorley.co.uk/photos/snapshots/2023-09-23-11-24-55-wabi-sabi/" }, { "content_html": "\n \n \nThe sunsets up here on the North Shore of O'ahu are truly amazing.
\n \n", "date_published": "2023-09-12T18:57:10-07:00", "id": "https://jbmorley.co.uk/photos/snapshots/2023-09-12-18-57-10-neon/", "title": "Neon", "url": "https://jbmorley.co.uk/photos/snapshots/2023-09-12-18-57-10-neon/" }, { "content_html": "\n \n \nOur local recycling center, Re-use Hawai'i, has an cockpit going spare. I'm thinking 'garden ornament'.
\n \n", "date_published": "2023-09-07T14:19:05-07:00", "id": "https://jbmorley.co.uk/photos/snapshots/2023-09-07-14-19-05-cockpit/", "title": "Cockpit", "url": "https://jbmorley.co.uk/photos/snapshots/2023-09-07-14-19-05-cockpit/" }, { "content_html": "\n \n \nI recently acquired a Toshiba Libretto 50CT--a beautiful tiny laptop I coveted in the 90s. When it turned up, it still had it's original Windows 95 install, complete with this cached version of msn.com.
\n \n", "date_published": "2023-09-06T21:48:39-07:00", "id": "https://jbmorley.co.uk/screenshots/windows/2023-09-06-msn/", "title": "MSN", "url": "https://jbmorley.co.uk/screenshots/windows/2023-09-06-msn/" }, { "content_html": "\n \n \nOn Saturday, Sarah and I visited the Waimea Botanical Gardens–a large and vibrant space in the Waimea Valley. I sent a few snapshots of our day to a close friend at the time and, over the past few days, I've realised I wanted to record them here and share them a little farther afield.
\nOne of the things that continues to blow my mind in Hawaii–and anywhere with a tropical climate–is just how large the plants get. Things we might keep as house plants back in the UK are absolutely huge here. I don't know what plant it's from, but this leaf is a great example of the scale of things:
\n\n
\nWhile the California Poppy has captured my heart more than any other, I continue to be a sucker for poppies in every form, and the gardens didn't disappoint:
\n\n
\nSadly we didn't make it as far through the botanical gardens as we'd like (they're quite sizeable), but we did get to enjoy their fabulous collection of hibiscus plants and trees. I'm sure other gardens must do this, but it's the first place where I've been aware of ancestor species being highlighted as distinct from the hybrids.
\n\n
\nBoth flowers pictured here are ancestor species, which amazes me, given the extreme difference between the two; without any expertise or experience in the the field of botany I'd have assumed something absurd as the Hibiscus Schizopetalus1 depicted below must be a hybrid. Apparently not.
\n\n
\nRetiring to the Waialua Sugar Mill to do a little paperwork and enjoy some air conditioning, we finally dropped into 'Back in the Day Hawaii', a curious antiques store which seems to focus on Hawaiian and Japanese bric-à-brac. The place didn't really speak to me, but I did enjoy seeing this maneki neko convalescing the garden.
\n\n
\nIsn't that a great name! ↩
Our local Mexican place has a whole Día de los Muertos thing going on.
\n \n", "date_published": "2023-08-25T12:06:33-07:00", "id": "https://jbmorley.co.uk/photos/snapshots/2023-08-25-12-06-33-cat/", "title": "Cat", "url": "https://jbmorley.co.uk/photos/snapshots/2023-08-25-12-06-33-cat/" }, { "content_html": "\n \n \nAnother snapshot from Fishcake (which seems to be perfectly tuned for the Instagram-style photo). This time, of a silkie chicken--one of a pair a retailer had brought in to hang out with during her work day.
\n \n", "date_published": "2023-08-12T12:34:33-07:00", "id": "https://jbmorley.co.uk/photos/snapshots/2023-08-12-12-34-33-silkie/", "title": "Silkie", "url": "https://jbmorley.co.uk/photos/snapshots/2023-08-12-12-34-33-silkie/" }, { "content_html": "\n \n \nFishcake--a kind of local design showcase--hosts a whole collection of home decor and curios, including this wonderful 90s-vibe chandelier. Inspiration for how to use up some of those AOL trial CDs. 💿
\n \n", "date_published": "2023-08-12T12:29:28-07:00", "id": "https://jbmorley.co.uk/photos/snapshots/2023-08-12-12-29-28-chandelier/", "title": "Chandelier", "url": "https://jbmorley.co.uk/photos/snapshots/2023-08-12-12-29-28-chandelier/" }, { "content_html": "\n \n \nOur co-working space on the North Shore of O'ahu is located in the old Waialua Sugar Mill. It's a fabulous time capsule of past industry, with buildings that seem virtually unchanged from when the mill was last active, a myriad ancient tools, dials and machines, and a fantastic array of old safety posters and notices. Unable to pass up the opportunity, I tried to capture a few of the highlights.
\n\n
\nThe stylised car illustration on this poster is spot-on; both beautifully stylish and deeply menacing at the same time. And, to me at least, very reminiscent of the Were-Car from Futurama.
\n\n
\nThese posters are located above the urinal (eagle-eyed amongst you might have noticed the scrawled note explaining how to 'flush' the toilet)--a wonderful opportunity to refresh your memory on health-and-safety as you empty your bladder. \n
\nI've so far managed to resist the urge to open this and check to see if it really does contain 2.5 kilos of promotional antenna toys.
\n\n
\nLooking at the settings on the various dials (and what I can make out from the badge), I'm pretty sure this is some kind of TIG welder. Doesn't look like it's been used for a while though.
\n\n
\nThere are real echoes of Myst in some of the equipment--I can't help but think I need to make use of it to get to the next Age. This appears to control one of the wonderful collection of hoists mounted to the ceiling of the room; I'll try to capture them for a future update.
\n\n
\nThere's so much going on in this scene, from the CCTV sign, centered on the hole in the glass, to 'HER SHOP' that's clearly been welded into the door at a later date, almost like an artist signing their work. I love it.
\n \n", "date_published": "2023-08-11T17:00:00-07:00", "id": "https://jbmorley.co.uk/posts/2023-08-12-waialua-sugar-mill/", "title": "Waialua Sugar Mill", "url": "https://jbmorley.co.uk/posts/2023-08-12-waialua-sugar-mill/" }, { "content_html": "\n \n \nThe original Web 2.0 startup.
\n \n", "date_published": "2023-08-10T18:23:54-07:00", "id": "https://jbmorley.co.uk/photos/snapshots/2023-08-10-18-23-54-towlmastr/", "title": "Towlmastr.", "url": "https://jbmorley.co.uk/photos/snapshots/2023-08-10-18-23-54-towlmastr/" }, { "content_html": "\n \n \nThe Hawaii State Route signs look like onigiri to me. State Route 99, in particular, looks like an incredibly perturbed onigiri. An onigiri has seen things it can never unsee.
\n \n", "date_published": "2023-07-29T11:52:45-07:00", "id": "https://jbmorley.co.uk/photos/snapshots/2023-07-29-11-52-45/", "title": "🍙", "url": "https://jbmorley.co.uk/photos/snapshots/2023-07-29-11-52-45/" }, { "content_html": "\n \n \nIt's been a while, so I thought I'd write a brief update with a view to breaking the drought and getting back into posting again.
\nSarah and I are currently pausing in Hawaii after a period of travelling around for work, conferences, and seeing friends and family. Our trip took us to Iceland, Colorado, New York, Massachusetts, Maine, California and now, Hawaii (we've become unintentional nomads). It's been an enjoyable few months, but it's good to slow down again for a little.
\n\n
\nEver since Junko did her PhD out here, Hawaii has always held a special place in my heart and it's been lovely to return--my first time back since the pandemic. It has such a wonderful combination of natural beauty, climate, and culture and I'm really grateful I had the opportunity to discover it nearly 15 years ago.
\nDuring our travels, I've spent time working on StatusPanel (a cute little eInk desk calendar and another collaboration with Tom that I've yet to write about here), Bookmarks (a Pinboard client for iOS and macOS), and an experimental Swift rewrite of my website builder. I even added hardware controller support to Game Play Color--my first update in years. Moving around has made it difficult to finish things, but they've all made good progress and I'm looking forward to spending the next few months shipping things. Working on my own projects in this way, I'm starting to get the vaguest sense of what the cycle must be like for authors and artists--far more turbulent than the uniformity of traditional employment, and hard to manage on occasion, but wonderfully creative.
\nHopefully time will permit me to write a few longer-form posts focusing on the details of our travel and my projects, but I wanted to post something to get me started.
\n \n", "date_published": "2023-07-24T17:00:00-07:00", "id": "https://jbmorley.co.uk/posts/2023-07-25-updates/", "title": "Updates", "url": "https://jbmorley.co.uk/posts/2023-07-25-updates/" }, { "content_html": "\n \n \nI adore this incredibly wabi-sabi sign outside Surfers Coffee in Wahiawa.
\n \n", "date_published": "2023-07-21T12:57:37-07:00", "id": "https://jbmorley.co.uk/photos/snapshots/2023-07-21-12-57-37-coffee/", "title": "COFFEE", "url": "https://jbmorley.co.uk/photos/snapshots/2023-07-21-12-57-37-coffee/" }, { "content_html": "\n \n \nSarah and I are staying on the O'ahu North Shore which is a curious mix of aloha, tourism, and everyday life. Just like these mailboxes.
\n \n", "date_published": "2023-07-18T15:51:48-07:00", "id": "https://jbmorley.co.uk/photos/2023/06/hawaii/IMG_2048/", "title": "Mailboxes", "url": "https://jbmorley.co.uk/photos/2023/06/hawaii/IMG_2048/" }, { "content_html": "\n \n \n", "date_published": "2023-07-18T09:47:06-07:00", "id": "https://jbmorley.co.uk/photos/patterns/IMG_2040/", "url": "https://jbmorley.co.uk/photos/patterns/IMG_2040/" }, { "content_html": "\n \n \nThis wonderful mural in Ala Moana makes for one of the most vibrant bits of government property I've seen in a while.
\n \n", "date_published": "2023-07-14T13:12:43-07:00", "id": "https://jbmorley.co.uk/photos/2023/06/hawaii/IMG_2015/", "title": "Aliens!", "url": "https://jbmorley.co.uk/photos/2023/06/hawaii/IMG_2015/" }, { "content_html": "\n \n \nI was lucky to catch this surfer pausing to contemplate the waves on an early morning walk along Waikiki.
\n \n", "date_published": "2023-07-10T07:25:45-07:00", "id": "https://jbmorley.co.uk/photos/2023/06/hawaii/IMG_1944/", "title": "Watching the Waves", "url": "https://jbmorley.co.uk/photos/2023/06/hawaii/IMG_1944/" }, { "content_html": "\n \n \nSea turtles--honu--are fairly common in Hawaii and this one was quietly enjoying its dinner beside the sea wall. Thankfully most of us carry waterproof cameras these days, so I was able to capture this little bit of footage.
\n \n", "date_published": "2023-07-05T19:15:23-07:00", "id": "https://jbmorley.co.uk/photos/2023/06/hawaii/IMG_1800/", "title": "Dinner Time", "url": "https://jbmorley.co.uk/photos/2023/06/hawaii/IMG_1800/" }, { "content_html": "\n \n \nLocated in Hilo Bay, and next to Liliuokalani Park, Coconut Island (Moku Ola) offers a refreshing escape from downtown Hilo. Its shores are full of half-submerged paths and constructions like this incredibly robust diving board, proving inviting to local kids and turtles alike.
\n \n", "date_published": "2023-07-05T16:11:50-07:00", "id": "https://jbmorley.co.uk/photos/2023/06/hawaii/IMG_1789/", "title": "Diving Board", "url": "https://jbmorley.co.uk/photos/2023/06/hawaii/IMG_1789/" }, { "content_html": "\n \n \nDuring our visit to the Media Archeaology Lab in Boulder I was thrilled to see the Little Luggable alongside one of its key design influences--the Apple Newton eMate--for the very first time.
\n \n", "date_published": "2023-04-26T14:54:32-07:00", "id": "https://jbmorley.co.uk/photos/snapshots/2023-04-26-14-54-32-family-resemblance/", "title": "Family Resemblance", "url": "https://jbmorley.co.uk/photos/snapshots/2023-04-26-14-54-32-family-resemblance/" }, { "content_html": "\n \n \n", "date_published": "2023-04-13T13:59:43-07:00", "id": "https://jbmorley.co.uk/photos/2023/04/reykjavik/IMG_0610/", "title": "Blue Lagoon", "url": "https://jbmorley.co.uk/photos/2023/04/reykjavik/IMG_0610/" }, { "content_html": "\n \n \n", "date_published": "2023-04-12T15:46:36-07:00", "id": "https://jbmorley.co.uk/photos/2023/04/reykjavik/IMG_0593/", "url": "https://jbmorley.co.uk/photos/2023/04/reykjavik/IMG_0593/" }, { "content_html": "\n \n \nHallgrímskirkja church is a quite spartan and austere inside, but I love how the stained glass--hidden behind the organ--still tints the walls.
\n \n", "date_published": "2023-04-12T11:13:53-07:00", "id": "https://jbmorley.co.uk/photos/2023/04/reykjavik/IMG_0583/", "title": "Pastels", "url": "https://jbmorley.co.uk/photos/2023/04/reykjavik/IMG_0583/" }, { "content_html": "\n \n \n", "date_published": "2023-04-12T11:08:27-07:00", "id": "https://jbmorley.co.uk/photos/2023/04/reykjavik/IMG_0581/", "title": "Hallgrímskirkja Church", "url": "https://jbmorley.co.uk/photos/2023/04/reykjavik/IMG_0581/" }, { "content_html": "\n \n \n", "date_published": "2023-04-11T09:26:01-07:00", "id": "https://jbmorley.co.uk/photos/2023/04/reykjavik/IMG_0554/", "url": "https://jbmorley.co.uk/photos/2023/04/reykjavik/IMG_0554/" }, { "content_html": "\n \n \nI love the depth and realism of this nostalgia-fuelled street art on the corner of Turville Street in Shoreditch.
\n \n", "date_published": "2023-04-09T16:30:36-07:00", "id": "https://jbmorley.co.uk/photos/snapshots/2023-04-09-16-30-36-turville-street/", "title": "Turville Street", "url": "https://jbmorley.co.uk/photos/snapshots/2023-04-09-16-30-36-turville-street/" }, { "content_html": "\n \n \nIt's the beginning of lambing season here in Cambridge and John, our host, took us to Chestnut Farm to see some newborns--a wonderful change from the stark world of software and computers.
\n\n
\nOf course, not long after the photo was taken, the lamb did what all young creatures are wont to do and pooped all over Sarah.
\n\n
\nI always forget how to enable word wrap by default in Emacs so, for my own future reference as much as anything else, here's how to do it.
\nAdd the following to ~/.emacs
:
(global-visual-line-mode)\n
\n \n",
"date_published": "2023-03-14T17:00:00-07:00",
"id": "https://jbmorley.co.uk/posts/2023-03-15-word-wrap/",
"title": "Word Wrap",
"url": "https://jbmorley.co.uk/posts/2023-03-15-word-wrap/"
},
{
"content_html": "\n \n \n I recently had cause to buy a new iPhone 14 Pro (thanks London pickpockets) and was fairly unimpressed with the camera improvements. Until I reviewed this photo, that is.
\nOur hosts here in Horningsea were burning some trash after a little spring cleaning and invited me to wander over and enjoy the fire. Needless to say, I couldn't resist taking a photo.
\n \n", "date_published": "2023-03-11T20:52:38-08:00", "id": "https://jbmorley.co.uk/photos/snapshots/2023-03-11-20-52-38-fire/", "title": "Fire", "url": "https://jbmorley.co.uk/photos/snapshots/2023-03-11-20-52-38-fire/" }, { "content_html": "\n \n \nSet behind glass and lit to highlight the various curios within, the attic space of the Trinitatis Church feels like it’s come straight out of a level of The Room.
\n \n", "date_published": "2023-03-06T12:08:29-08:00", "id": "https://jbmorley.co.uk/photos/2023/03/copenhagen/IMG_0220/", "title": "Puzzle Box", "url": "https://jbmorley.co.uk/photos/2023/03/copenhagen/IMG_0220/" }, { "content_html": "\n \n \n", "date_published": "2023-03-05T17:43:22-08:00", "id": "https://jbmorley.co.uk/photos/2023/03/copenhagen/IMG_0203/", "title": "Tekniskskole", "url": "https://jbmorley.co.uk/photos/2023/03/copenhagen/IMG_0203/" }, { "content_html": "\n \n \nI love the sense of calm, clean, modernist design that permeates Copenhagen.
\n \n", "date_published": "2023-03-05T17:39:17-08:00", "id": "https://jbmorley.co.uk/photos/2023/03/copenhagen/IMG_0201/", "title": "Metro", "url": "https://jbmorley.co.uk/photos/2023/03/copenhagen/IMG_0201/" }, { "content_html": "\n \n \nThe Copenhagen Design Museum has a huge collection of ‘tsuba’—Japanese sword guards. They seem incongruous alongside the stark Western aesthetic that comprises the rest of the museum, offering a window into a very different world of design.
\n \n", "date_published": "2023-03-05T16:20:44-08:00", "id": "https://jbmorley.co.uk/photos/2023/03/copenhagen/IMG_0132/", "title": "Tsuba", "url": "https://jbmorley.co.uk/photos/2023/03/copenhagen/IMG_0132/" }, { "content_html": "\n \n \nThis bird—one of a number carved into the top of a fence post—stands near a children’s playground and leaves me the sense that it is somehow watching and protecting.
\n \n", "date_published": "2023-03-04T13:53:30-08:00", "id": "https://jbmorley.co.uk/photos/2023/03/copenhagen/IMG_0064/", "title": "Ever Watchful", "url": "https://jbmorley.co.uk/photos/2023/03/copenhagen/IMG_0064/" }, { "content_html": "\n \n \nI photographed this building on my last visit to Copenhagen, so I decided to do something a little different this time.
\n \n", "date_published": "2023-03-03T15:50:39-08:00", "id": "https://jbmorley.co.uk/photos/2023/03/copenhagen/DSCF4758/", "title": "Self-Portrait", "url": "https://jbmorley.co.uk/photos/2023/03/copenhagen/DSCF4758/" }, { "content_html": "\n \n \n", "date_published": "2023-03-03T15:46:06-08:00", "id": "https://jbmorley.co.uk/photos/2023/03/copenhagen/DSCF4750/", "title": "Orange Ladder", "url": "https://jbmorley.co.uk/photos/2023/03/copenhagen/DSCF4750/" }, { "content_html": "\n \n \n", "date_published": "2023-03-03T15:44:18-08:00", "id": "https://jbmorley.co.uk/photos/2023/03/copenhagen/DSCF4745/", "title": "Red Ladder", "url": "https://jbmorley.co.uk/photos/2023/03/copenhagen/DSCF4745/" }, { "content_html": "\n \n \n", "date_published": "2023-03-03T15:41:37-08:00", "id": "https://jbmorley.co.uk/photos/2023/03/copenhagen/DSCF4743/", "title": "Rusted Ladder", "url": "https://jbmorley.co.uk/photos/2023/03/copenhagen/DSCF4743/" }, { "content_html": "\n \n \nThe flat open planes of The Fens allow for slow, sleepy sunsets and huge contrasts in light and color: dusk on one side; already night on the other.
\n \n", "date_published": "2023-02-19T17:49:49-08:00", "id": "https://jbmorley.co.uk/photos/2023/02/wicken/IMG_3068/", "title": "Silhouette", "url": "https://jbmorley.co.uk/photos/2023/02/wicken/IMG_3068/" }, { "content_html": "\n \n \nIt's been a little while since my last weeknotes--unfortunately I finally succumbed to the seasonal malaise causing me to miss a step or two. Thankfully I was able to continue to work on my various projects, but things slowed down quite a bit.
\nIn my Internet perusals this week, I enjoyed Mike's reflections on 'More, Smaller, Things', in which he talks about writing shorter, more timely pieces. That is, in part, what I'm trying to do with these revised-format weeknotes, though they often run longer than I might like.
\nWe're in a new Airbnb again; still based in Cambridgeshire but further away from Cambridge in a place called Wicken. The village itself isn't much to write home about, but it backs onto The Fens which are absolutely beautiful and we've been treated to some wonderful misty mornings and spectacular skies.
\n\n
\nIt was sad to leave Horningsea--it's the place we've paused longest in the last year-or-so and the village had a real sense of community that I've not experienced in a long while. Still, we ended on a high joining in the tradition of celebrating a local birthday on the Nene Valley Railway.
\n\n
\nSarah started her new job with Galileo this week. She'll be working on New York time so we'll still get to spend the mornings together which is a real treat--we've already been able to use that time to go on some local walks around Wicken Fen and along Devil's Dyke.
\nThe Little Luggable continues to consume much of my time, and the past week has been no exception. A couple of weeks ago I finalised the designs for the custom mechanical keyboard and ordered the PCB. Excitingly, it turned up at the beginning of the week and I spent a few days assembling everything and putting my design through its paces.
\n\n
\nMuch to my surprise, it seems I got the PCB right first time and I've able to write this post almost exclusively on the near-complete device--it's amazing what a difference it makes to the overall feel to have a nice keyboard and no more trailing wires making everything work. It's well on its way to becoming my coffee shop computer of choice.
\n\n
\nWith things near completion, I took some time to flesh out the details on GitHub and post it to Reddit where it had a pretty good reception. As I mention in the readme, I have a few spare PCBs and aluminium parts and I'd love to help people build their own, so please do reach out if you're interested.
\n\n
\nSince I've not written about it for a while, I feel Symbolic deserves an honourable mention: after a few tweaks, the software is now pretty much ready to go and the latest version is in the hands of my wonderful TestFlight beta users (sign up if you'd like to try it for yourself). Unfortunately, I'm still waiting on my accountants to work through the US-UK tax implications before I can put it on sale in the App Store but I'm still hopeful of a February release.
\n \n", "date_published": "2023-02-19T16:00:00-08:00", "id": "https://jbmorley.co.uk/posts/2023-02-20-week-7/", "title": "Week 7", "url": "https://jbmorley.co.uk/posts/2023-02-20-week-7/" }, { "content_html": "\n \n \nCambridge has a splendid collection of grand stone buildings, but it's some of the less assuming ones and details that draw me in, like this wonderful weathered brick wall, to be found along Malting Lane.
\n \n", "date_published": "2023-02-18T12:56:11-08:00", "id": "https://jbmorley.co.uk/photos/snapshots/2023-02-18-12-56-11-bricks/", "title": "Bricks", "url": "https://jbmorley.co.uk/photos/snapshots/2023-02-18-12-56-11-bricks/" }, { "content_html": "\n \n \n", "date_published": "2023-02-14T07:19:57-08:00", "id": "https://jbmorley.co.uk/photos/2023/02/wicken/IMG_2948/", "title": "Morning Mist", "url": "https://jbmorley.co.uk/photos/2023/02/wicken/IMG_2948/" }, { "content_html": "\n \n \nThere are many windmills to be found in and around Cambridge where they were used, amongst other things, to drain the Fenlands.
\n \n", "date_published": "2023-02-14T07:19:46-08:00", "id": "https://jbmorley.co.uk/photos/2023/02/wicken/IMG_2947/", "title": "Windmill", "url": "https://jbmorley.co.uk/photos/2023/02/wicken/IMG_2947/" }, { "content_html": "\n \n \nWhile working on the Little Luggable, I've tried out a number of different Linux distributions for the Raspberry Pi, including different flavours of Manjaro, an Arch Linux based distribution.
\nUnfortunately, the images available through the Raspberry Pi Imager aren't correctly configured to use the 'official' Touch Display. This results in some fun visual effects followed by static vertical lines on the screen when, presumably, the OS stops driving the display. They look something like this:
\n\n
\nFortunately, in the case of the Manjaro distributions, the solution seems to be a fairly simple addition to config.txt
:
display_auto_detect=1\n
\n While I was at it, I also updated cmdline.txt
to set console=tty1
to ensure I always get console output.
These weeknotes are a couple of weeks old, but they were drafted already, so thought I'd still publish.
\nDuring what felt like a low week for tech--one that started with Twitter killing all third-party clients, and ended with Google indiscriminately firing 12,000 of their workforce--I tried to stay optimistic. I continued the seemingly Sisyphean task of actually shipping Symbolic, remembered that tech can be fun and empowering with the Little Luggable, and kicked the tires on various other projects.
\n\n
\nSarah returned to California for a couple of weeks, leading a fairly disrupted start to the week. Given that, I spent much of my time in Makespace--it's nice to be around other creatives, especially when home is that much quieter. I also enjoyed the fresh round of winter that made for some amazing sunrises and sunsets.
\nAlmost all my time is going into Symbolic right now as I continue to work on 1.1.0. Counter-intuitively, this will now be the initial release as I discovered the SF Symbols licensing issues after 1.0.0 was approved for the App Store.
\n\n\n
Having added Google's Material Icons the previous week, I focused on the messaging around different symbol libraries--I still want to let users choose less permissive libraries like SF Symbols, so need to clearly communicate the license restrictions. I've settled on adding a popover with the license details of the currently selected symbol, and displaying a warning icon if the current symbol is from a 'non-permissive' library. As a belt-and-braces measure, I repeat the warning during the export flow. It would be great not to have to do this, but it feels like a good balance given the constraints.
\nThe less exiting part of the process has been finding someone to help me navigate the various legal and financial aspects of selling an app in the App Store. Symbolic is, in part, a way for me to practice selling an app--I've a few apps close to a release so it's time for me to better understand what's involved in shipping and selling them. I now have a couple of initial meetings set up so I'm hopeful that by the end of the week, I'll have a much clearer idea of what's involved. 🤞🏻
\nIf you're interested, Symbolic is still in TestFlight Public Beta and I'd love your feedback!
\nThe Little Luggable continues to be a fun distraction from the more gruelling aspects of shipping software. With the basic hardware design is complete and working, my time was been split fairly equally between the software--configuring Linux to my liking--and some small quality-of-life improvements to the hardware.
\n\n
\nI use a PiJuice HAT to power the the luggable, but found its built-in 1820 mAh battery insufficient when also powering the screen (I was getting less than 10 minutes on a full charge), so I installed a much larger 12000 mAh battery. This significantly improved battery life and means I can use the luggable as my coffee shop computer. Since installing the battery, I've noticed the occasional temperature warning--there's now significantly more thermal mass when the larger battery is charging--so I plan to fit a larger heat sink to the Pi and see if that improves things.
\n\n
\nWith the core of the luggable complete, I couldn't resist starting on the keyboard; the little cheap bluetooth keyboard I've been using so far is uncomfortable to type on and breaks my muscle memory as it's not a standard layout or size. With that in mind, I set about designing something as close to a regular layout as possible given my space constraints. After a number of iterations, I managed to get something down to a width of 11.25u, using just 1u and 2u keys.
\n\n
\nOnce I settled on the basic layout, I took the keycaps I plan to use (GRID by Rama Works) and laid them out to get a rough feel for the keyboard. It still needs some tweaks, but I'm fairly pleased with the outcome so far.
\n \n", "date_published": "2023-02-02T16:00:00-08:00", "id": "https://jbmorley.co.uk/posts/2023-02-03-week-3/", "title": "Week 3", "url": "https://jbmorley.co.uk/posts/2023-02-03-week-3/" }, { "content_html": "\n \n \nI found the exercise of writing up a summary of my projects in 2022 very valuable--it gave me a chance to step back, recognise that I actually achieved things, and let me reflect on the projects I want to continue pursuing. With that in mind, I thought it might be good to try returning to the practice of writing weeknotes. I plan to keep them a little shorter this time with a view to making it easier to keep going.
\n\n
\nSarah and I are moving again, from one Airbnb to another, as we continue our hunt for somewhere to settle in the near term. It looks a lot like that'll be Cambridge UK right now as we really enjoyed our Christmas in the little village of Horningsea, just outside Cambridge.
\nWe've signed the agreement on our third storage unit in an attempt to make things easier as we move around--our possessions are new spread across California, Cambridge, and London. Hopefully everything's still dry after the devastating torrential rain in California.
\nI planned to ship Symbolic. Things got off to a great start--by Tuesday version 1.0.0 had been submitted to the App Store and was quickly approved--but then everything went off-the-rails: during some last-minute due diligence (prompted by one of my wonderful beta testers), I took a more detailed look at the licensing around SF Symbols and discovered they're explicitly prohibited from use in icons. That came as a really big blow and left me questioning the sense in continuing with Symbolic. Still, it feels like it's really come together in the last couple of weeks, so I pushed on and started looking for alternative symbol sets.
\n\n\n
Once I'd accepted the situation, I quickly found a wealth of open source symbols variously licensed Creative Commons, Apache, and MIT, all of which would allow Symbolic icons to be used in shipping apps. As a start, I've integrated Google's Material Icons and I plan to add a few more sets before shipping. I will leave SF Symbols as an option as they feel like they could be great for internal apps.
\nIn the end, this feels like this is a great outcome for Symbolic--users will have far more choice when designing icons, both in terms of design and licensing, and I've already done the work to make adding new sets easier and greater user customization in the future.
\nMy little Raspberry Pi portable continues to be a pleasure to use and I'm finding it a great, playful, distraction-free device. Despite the terrible keyboard, it's proving a fantastic 'first draft' machine.
\nMost of my time has been spent exploring the software side of the device and bringing myself up-to-date with the state of modern Gnome apps. I've been enjoying using Xmonad on Ubuntu, Geary for email, Newsflash for RSS, Epiphany for browsing, and Tootle for Mastodon. I'm also having a lot of fun with the Uxn apps.
\n\n
\nOn the hardware side, my laser-cut aluminium internal mounting bracket turned up and I enjoyed taking a little time to fit it over the weekend. With this installed, the main physical design is complete and I can focus my efforts on the keyboard.
\nI made a small quality of life update to GitHub Status to let you use an environment variable to set the location of the configuration file. This allows me to store my configuration file in git and share it between my devices.
\n \n", "date_published": "2023-01-15T16:00:00-08:00", "id": "https://jbmorley.co.uk/posts/2023-01-16-week-2-moving-symbolic-and-github-status/", "title": "Week 2: Moving, Symbolic, and GitHub Status", "url": "https://jbmorley.co.uk/posts/2023-01-16-week-2-moving-symbolic-and-github-status/" }, { "content_html": "\n \n \nI've struggled to write about my projects over the past year (there's just too many of them). To help me focus, I thought it might be interesting to look at some metrics as a way to reflect on 2022.
\nThis analysis is based exclusively on what I can pull out of my local git repositories. That means it misses work on some of my more hardware-oriented projects. It also only includes 'finished' changes (those merged into main
).
Of the 60 repositories I have currently checked out on my Mac, I made 1466 commits across 41 repositories, changing a total of 244,528 lines. That's a lot of change.
\nRestricting our focus to repositories with over 1000 lines of change, we start to get to a more manageable list of 18 repositories:
\n\n
That still seems a lot to explore, so let's just focus on the top 81:
\n\n
This starts to feel a lot more like the year I remember. These top few projects divide fairly cleanly into different categories:
\nElsewhere and the Lunchbox Luggable are almost certainly in the list because the repositories include auto-generated DXF files that I'm not filtering out. Still, they're fun, so why not leave them there.
\nBefore we dig into the apps themselves, I'm curious how the time I spent on those apps was distributed over the year:
\n\n
It feels like this characterises the year pretty well: Sarah and I started the year with COVID, so I worked on Elsewhere (one of my more playful projects), while also working intensely on OpoLua with Tom. Then came a drought as we tried to relocate from San Francisco to the UK (with mixed success). Since then development has slowly picked back up as I've been working hard on shipping a few of my longer-running projects.
\n15515 insertions and 6178 deletions across 386 commits
\n\n\n
The year started with a flurry of activity on OpoLua--an iOS runtime for Psion OPL I worked on with my good friend Tom. It was pretty ambitious and, as it turns out, the only new app I shipped to the App Store in the whole of 2022. I wrote about it at the time, and there's still a lot to do (including reverse engineering the database format), so please reach out if you're interested in contributing.
\n11469 insertions and 11824 deletions across 236 commits
\n\n\n
Fileaway has perhaps the longest history of all the projects listed here. It started over ten years ago as a script to help me manage the various documents I receive and, in the time since then, has morphed into a comprehensive Mail-like document management and workflow app for Mac, iPhone and iPad. I had hoped to get it into the App Store in 2022 but the ever changing landscape of SwiftUI, and the app's storied past left it needing a lot of architectural improvements. Still, it's now in great shape and I use it daily--I'd love to ship it this year.
\n(If you look at the metrics closely, you'll see the codebase actually shrank by 355 lines during the year which, considering I added full iOS support, is a great advert for SwiftUI.)
\n8158 insertions and 6272 deletions across 130 commits
\n\n
\nAnytime remains a labour of love that I'm not sure I've ever written about on this site. It's an app for Mac, iPhone, iPad, and Apple Watch, that lets you share your current time with your close contacts. I wrote it as a way to feel more connected to friends and loved ones as I travel, and the Anytime widgets have held pride-of-place on my devices ever since. It has a small user-base that's never really grown--I'm convinced it offers real utility, but I've never quite figured out how to position it to users, especially in today's rightly privacy-conscious world, where the potential for leaking even something as coarse grained as your time zone is incredibly off-putting to users.
\n6456 insertions and 442 deletions across 42 commits
\n\n\n
Symbolic is the perfect example of a rabbit hole. Written because I write too many apps (all of which require icons), it's a simple app that lets you create iOS and macOS icons using SF Symbols. I'm actually pretty pleased with how it turned out--it's currently available as a TestFlight public beta, and I plan to ship it in the coming months.
\n5709 insertions and 2191 deletions across 111 commits
\n\n
\nTinyBoard is perhaps one of my most surprising projects of the year, and definitely the one that still feels most like magic when I use it. It's a combination of custom firmware for the Raytac MDBT50Q-RX USB and Bluetooth dongle that lets you use your Mac as a USB keyboard and mouse for another computer. I find it perfect for setting up and controlling devices like the MiSTer, or single board computers like the Raspberry Pi. I'm really interested to figure out how I can put TinyBoard out in the world in a way others can easily use it.
\n8039 insertions and 6859 deletions across 44 commits
\nInteract is a catch-all for all the small SwiftUI conveniences that I want to share amongst my various apps, but have nowhere else to go. It tends to grow alongside those apps, which makes sense for why it should turn up in this list.
\nAlso deserving an honourable mention is Diligence, my about screen library for macOS and iOS.
\n\n\n
Diligence is the first Swift package I've felt was polished and complete enough to publish2, so I added it to the Swift Package Index a few months ago.
\n93433 insertions and 2 deletions across 11 commits
\n\n
\nFinding myself back in Cambridge with a Makespace membership but with none of my projects around me, I decided it was finally time to build my own cyberdeck. The Lunchbox Luggable is meant to be less of a setpiece than most cyberdecks; a way to explore Linux and things outside the Apple ecosystem. It's been a lot of fun so far, and I've really enjoyed using it to discover modern Gnome apps, and dive into the world of Uxn.
\n23013 insertions and 34 deletions across 15 commits
\n\n
\n\n
\nMy year started with COVID and Elsewhere, a Raspberry Pi livestream picture frame. I first wrote about Elsewhere back in 2018 when it used a tiny 2.8\" Adafruit screen. It gives you a window onto somewhere else in the world and really came into its own during the pandemic when we were so starved for external input. It reached some form of completion in 2022 when I finished a aluminium and walnut version as a late Christmas gift for my folks. I'd still like to write up detailed instructions and maybe publish them to something like Hackaday but there's only so much time in the world.
\nIn 2023, I hope to bring a few more of these to a wider audience. Symbolic and Fileaway both feel like they're close to App Store releases, as is Bookmarks, my Pinboard client. I intend to keep all my software open source but, longer term, I need to work out how to make money from some of them if I am to continue this level of development.
\nIn the course of writing about my experiences and projects, I often find I need to present different forms of information--things like photos, videos, maps, 3-D models, and charts. Unfortunately, for all its power, modern HTML provides very little built-in support for 'multimedia' types, leaving users to rely on JavaScript libraries like Three.js, Chart.js, and Mapbox. These all require some amount of coding, making them hard to use and integrate, forcing content authors to lean on heavyweight publishing platforms.
\nDespite the code-heavy approach of most of these libraries, it's actually incredibly easy to define custom HTML elements and there's nothing to stop us writing tags that give authors a clean declarative way to express their content. That's how I approach things on this site, and it lets me easily add rich media as inline HTML to my Markdown posts.
\nFor example, with the inclusion of a single JavaScript file, I'm able to extend HTML to support maps,
\n<x-map>\n <x-location latitude=\"35.671336\"\n longitude=\"139.702941\">\n Harajuku Station\n </x-location>\n <x-location latitude=\"37.766655\"\n longitude=\"-122.418129\">\n 1515 15th St\n </x-location>\n</x-map>\n
\n \n
STL files,
\n<x-model src=\"model.stl\" />\n
\n and charts,
\n<x-chart type=\"pie\" legend=\"bottom\">\n <x-chart-labels\n data-values=\"January, February, March, April, May, June, July\">\n </x-chart-labels>\n <x-chart-dataset\n data-values=\"12,19,3,3,5,2,3\">\n </x-chart-dataset>\n</x-chart>\n
\n \n
all with relative ease.
\nNone of these represent perfection in their HTML tag design (they're very much a first-cut), but they allow me to author this website quickly and easily, and demonstrate that we don't need overly complex platforms or editing tools.
\nI would love to see library authors offer HTML extensions as part of their frameworks to really reduce the barrier-to-entry. It would also provide a wonderful oportunity to explore the possibility of future HTML tags--I don't closely follow the HTML standards bodies, so I don't know this to be true, but I have a sense that we've all-but given up on simple user-editable markup at a time when it is perhaps easiest to achieve.
\nIf you'd like to use the chart support in your own sites, you're welcome to check it out on GitHub. It's very much a first draft, so your mileage may vary, but I'd love input and help developing it.
\n \n", "date_published": "2022-12-26T16:00:00-08:00", "id": "https://jbmorley.co.uk/posts/2022-12-27-simple-markup/", "title": "Simple Markup", "url": "https://jbmorley.co.uk/posts/2022-12-27-simple-markup/" }, { "content_html": "\n \n \nAs the number of projects I work on has increased, I've found myself putting together various tools to help me keep on top of things.
\ngithub-status
is one such tool. It allows me to keep an eye on the daily and ever-growing number of GitHub Actions I have--unfortunately these fail with reasonable regularity when tools and dependencies are updated and it's important to address failures quickly to keep everything running smoothly.1
\n
\nI've been using github-status
for about a year, but I recently took the time to update it with additional information. It can now report on specific per-project workflows, show the age of builds (highlighting ones that are over a certain age and might be at increased risk of dependency changes), and surface direct links to build jobs to make it easy to quickly investigate build failures.
Quickly reporting on a collection of repositories is simply a matter of specifying them on the command-line (for more involved reporting, there's a configuration file). For example, I can report on OpoLua, Fileaway, and Symbolic as follows:
\ngithub-status \\\n inseven/opolua \\\n inseven/fileaway \\\n inseven/symbolic\n
\n I'm considering writing an iOS app for accessing similar information on-the-go and would love feedback on whether people would find that useful. In the meantime, you can get github-status
from GitHub.
I consciously avoid pinnning dependencies so I discover breaking changes quickly and can--hopefully--address them just as quickly. ↩
Today I learned Histon has a collection of jelly mould sculptures.
\n \n", "date_published": "2022-12-18T12:00:23-08:00", "id": "https://jbmorley.co.uk/photos/snapshots/2022-12-18-12-00-23-jelly-moulds/", "title": "Jelly Moulds", "url": "https://jbmorley.co.uk/photos/snapshots/2022-12-18-12-00-23-jelly-moulds/" }, { "content_html": "\n \n \nI build and maintain Diligence, a SwiftUI about screen library for macOS and iOS. While working on the macOS implementation, I looked at a lot of about screens. There's real variety out there and some truly creative designs, so I thought I'd showcase a few here.
\n💡 This page includes light and dark mode screenshots. Change your system settings if you're curious to see what the apps look like in both modes.
\nMany of Apple's apps use the standard macOS about view, as seen here in Mail and Books, but even Apple are not without variety--Music, Xcode, Simulator, and even Finder all do something a little different.
\n\n\n
\n\n
\n\n
\n\n
\n\n
\n\n
Long-time Mac developers Panic (and creators of the charming Playdate) have no shortage of personality in their about screens.
\nThe inclusion of the two-tone Panic logo really helps bring a consistency across the apps. Even Transmit--one of their oldest apps--makes room in a standard macOS about screen for this. (I'd love to see it in Playdate Simulator too.)
\n\n\n
\n\n
\n
\n\n\n
The Iconfactory's apps offer some pretty great and clean about screens, but I'd love to see a little more consistent identity across the apps. Twitterrific's about screen is perhaps one of my all time favourites--truly standout with a great balance of whimsy and function.
\n\n\n
\n\n
\n
\n \nTapbots have always had a beautiful, and consistent robot aesthetic. This manifests in their icons meaning that, with little else, their about screens feel incredibly uniform.
\n\n\n
\n
\n\n\n
\n
\n\n\n
\n
\n\n
\n \n \n", "date_published": "2022-12-02T16:00:00-08:00", "id": "https://jbmorley.co.uk/posts/2022-12-03-about-screens/", "title": "About Screens", "url": "https://jbmorley.co.uk/posts/2022-12-03-about-screens/" }, { "content_html": "\n \n \n", "date_published": "2022-09-26T11:58:15-07:00", "id": "https://jbmorley.co.uk/photos/patterns/IMG_1364/", "url": "https://jbmorley.co.uk/photos/patterns/IMG_1364/" }, { "content_html": "\n \n \nThis was not what I expected when I ordered a hot chocolate.
\n \n", "date_published": "2022-09-12T11:16:01-07:00", "id": "https://jbmorley.co.uk/photos/snapshots/2022-09-12-11-16-01-hot-chocolate/", "title": "Hot Chocolate", "url": "https://jbmorley.co.uk/photos/snapshots/2022-09-12-11-16-01-hot-chocolate/" }, { "content_html": "\n \n \n", "date_published": "2022-09-08T15:52:56-07:00", "id": "https://jbmorley.co.uk/photos/patterns/IMG_1251/", "url": "https://jbmorley.co.uk/photos/patterns/IMG_1251/" }, { "content_html": "\n \n \n", "date_published": "2022-09-04T16:02:52-07:00", "id": "https://jbmorley.co.uk/photos/patterns/IMG_1118/", "url": "https://jbmorley.co.uk/photos/patterns/IMG_1118/" }, { "content_html": "\n \n \n", "date_published": "2022-09-03T18:50:54-07:00", "id": "https://jbmorley.co.uk/photos/2022/08/thailand/IMG_1097/", "title": "Golden", "url": "https://jbmorley.co.uk/photos/2022/08/thailand/IMG_1097/" }, { "content_html": "\n \n \nThis photo was taken not long before I wiped out running some rapids on the Mae Taeng. If you zoom in, you can see just how intent I am upon staying upright.
\n \n", "date_published": "2022-09-03T14:22:55-07:00", "id": "https://jbmorley.co.uk/photos/2022/08/thailand/IMG_0243/", "title": "Rapids", "url": "https://jbmorley.co.uk/photos/2022/08/thailand/IMG_0243/" }, { "content_html": "\n \n \n", "date_published": "2022-09-02T12:42:47-07:00", "id": "https://jbmorley.co.uk/photos/2022/08/thailand/DSCF4319/", "title": "Corner Shop", "url": "https://jbmorley.co.uk/photos/2022/08/thailand/DSCF4319/" }, { "content_html": "\n \n \n", "date_published": "2022-09-02T12:40:17-07:00", "id": "https://jbmorley.co.uk/photos/2022/08/thailand/DSCF4313/", "title": "Satellite Dish", "url": "https://jbmorley.co.uk/photos/2022/08/thailand/DSCF4313/" }, { "content_html": "\n \n \n", "date_published": "2022-09-02T12:33:42-07:00", "id": "https://jbmorley.co.uk/photos/2022/08/thailand/DSCF4300/", "title": "Steve", "url": "https://jbmorley.co.uk/photos/2022/08/thailand/DSCF4300/" }, { "content_html": "\n \n \n", "date_published": "2022-09-02T12:28:40-07:00", "id": "https://jbmorley.co.uk/photos/2022/08/thailand/DSCF4291/", "title": "Rainbow", "url": "https://jbmorley.co.uk/photos/2022/08/thailand/DSCF4291/" }, { "content_html": "\n \n \nNot my usual kind of travel photo, but I couldn’t resist this poster for the 2022 Thailand AeroPress Championship. So much going on here.
\n \n", "date_published": "2022-09-02T10:06:17-07:00", "id": "https://jbmorley.co.uk/photos/2022/08/thailand/IMG_1040/", "title": "AeroPress", "url": "https://jbmorley.co.uk/photos/2022/08/thailand/IMG_1040/" }, { "content_html": "\n \n \n", "date_published": "2022-08-31T14:09:51-07:00", "id": "https://jbmorley.co.uk/photos/2022/08/thailand/DSCF4235/", "title": "Delicious Food", "url": "https://jbmorley.co.uk/photos/2022/08/thailand/DSCF4235/" }, { "content_html": "\n \n \nThailand’s architecture incorporates an irresistible variety of glazed ceramic tiles.
\n \n", "date_published": "2022-08-31T14:09:22-07:00", "id": "https://jbmorley.co.uk/photos/2022/08/thailand/DSCF4234/", "title": "Tiles", "url": "https://jbmorley.co.uk/photos/2022/08/thailand/DSCF4234/" }, { "content_html": "\n \n \nThailand’s architecture incorporates an irresistible variety of glazed ceramic tiles.
\n \n", "date_published": "2022-08-31T14:09:22-07:00", "id": "https://jbmorley.co.uk/photos/patterns/DSCF4234/", "title": "Tiles", "url": "https://jbmorley.co.uk/photos/patterns/DSCF4234/" }, { "content_html": "\n \n \n", "date_published": "2022-08-31T12:33:48-07:00", "id": "https://jbmorley.co.uk/photos/2022/08/thailand/DSCF4229/", "title": "Wabi-Sabi", "url": "https://jbmorley.co.uk/photos/2022/08/thailand/DSCF4229/" }, { "content_html": "\n \n \n", "date_published": "2022-08-31T12:15:28-07:00", "id": "https://jbmorley.co.uk/photos/2022/08/thailand/DSCF4215/", "title": "YAP!", "url": "https://jbmorley.co.uk/photos/2022/08/thailand/DSCF4215/" }, { "content_html": "\n \n \nI recently (about 6 months ago) had an interview with WeFunder during which they asked me to put together a map of their active campaigns. While I ultimately didn’t take the job, the interview gave me a chance to update myself on the current state of web based mapping solutions and, specifically, on GeoJSON which didn't exist the last time I looked at the space. Having long wanted to add a map to this site, this newfound knowledge seemed like a wonderful opportunity to do finally do exactly that.
\n\n\n
The process was incredibly simple: I added a new template to my website that generates a GeoJSON feed containing all posts and photos with a location in their metadata, and pointed MapBox at that feed. It's been fun to see my content in this new form and is definitely something I hope to make the most of as the world opens up and we can travel again. You can check out the results for yourself on the Places page.
\nThis website is published using my static site builder, InContext, which uses Jinja for templating. Since generating JSON is one of the least elegant aspects of Jinja, I thought I'd publish the GeoJSON template here for future reference:
\n{% set locations = [] %}\n{% for post in site.posts(include=page.include, ascending=False) | rejectattr(\"location\", \"none\") %}\n {% if post.location.latitude and post.location.longitude %}\n {% set details = {\n \"type\": \"Feature\",\n \"geometry\": {\n \"type\": \"Point\",\n \"coordinates\": [post.location.longitude, post.location.latitude]\n }\n } %}\n {% set properties = {} %}\n {% set _ = properties.__setitem__(\"url\", post.url) %}\n {% if post.title %}\n {% set _ = properties.__setitem__(\"title\", post.title) %}\n {% endif %}\n {% if post.thumbnail %}\n {% set _ = properties.__setitem__(\"icon\", post.thumbnail.url) %}\n {% endif %}\n {% set _ = details.__setitem__(\"properties\", properties) %}\n {% set _ = locations.append(details) %}\n {% endif %}\n{% endfor %}\n{% set collection = {\n \"type\": \"FeatureCollection\",\n \"features\": locations\n } %}\n{{ collection | json | safe }}\n\n
\n As you can see, this takes advantage of the side effects of the Jinja set
command to build up a dictionary containing the GeoJSON structure which I then serialize with a json
filter. Perhaps in the future I will add some extensions that enable direct dictionary manipulation. For example, I think the following might be clearer:
{% set details = {\n \"type\": \"Feature\",\n \"geometry\": {\n \"type\": \"Point\",\n \"coordinates\": [post.location.longitude, post.location.latitude]\n }\n } %}\n\n{% set properties = {} %}\n{% dictionary_set(properties, \"url\", post.url) %}\n{% dictionary_set_if(properties, \"title\", post.title) %}\n{% dictionary_set_if(properties, \"icon\", post.thumbnail) %}\n{% dictionary_set(details, \"properties\", properties) %}\n\n
\n The introduction of the conditional command, dictionary_set_if
seems somewhat messy, but would also significantly simplify the control flow when generating the kind of data structures you might typically want to serialize.
My good friend Michael kindly lent me his Fujifilm X100F for my travels and the first few days have been spent trying to learn how to use it. I very clearly didn’t have the settings right for this one but, quite liked how it turned out, so thought I’d keep it.
\n \n", "date_published": "2022-08-28T19:47:12-07:00", "id": "https://jbmorley.co.uk/photos/2022/08/thailand/DSCF4201/", "title": "Mistakes Were Made", "url": "https://jbmorley.co.uk/photos/2022/08/thailand/DSCF4201/" }, { "content_html": "\n \n \n", "date_published": "2022-08-28T18:25:09-07:00", "id": "https://jbmorley.co.uk/photos/2022/08/thailand/DSCF4191/", "title": "FILM SOLD HERE", "url": "https://jbmorley.co.uk/photos/2022/08/thailand/DSCF4191/" }, { "content_html": "\n \n \n", "date_published": "2022-08-28T18:23:15-07:00", "id": "https://jbmorley.co.uk/photos/2022/08/thailand/DSCF4188/", "url": "https://jbmorley.co.uk/photos/2022/08/thailand/DSCF4188/" }, { "content_html": "\n \n \n", "date_published": "2022-08-28T18:11:27-07:00", "id": "https://jbmorley.co.uk/photos/2022/08/thailand/DSCF4170/", "title": "Thailand Creative & Design Center", "url": "https://jbmorley.co.uk/photos/2022/08/thailand/DSCF4170/" }, { "content_html": "\n \n \n", "date_published": "2022-08-28T18:09:16-07:00", "id": "https://jbmorley.co.uk/photos/patterns/IMG_0896/", "url": "https://jbmorley.co.uk/photos/patterns/IMG_0896/" }, { "content_html": "\n \n \n", "date_published": "2022-08-27T19:32:55-07:00", "id": "https://jbmorley.co.uk/photos/2022/08/thailand/IMG_0838/", "url": "https://jbmorley.co.uk/photos/2022/08/thailand/IMG_0838/" }, { "content_html": "\n \n \n", "date_published": "2022-08-27T19:04:22-07:00", "id": "https://jbmorley.co.uk/photos/2022/08/thailand/IMG_0834/", "url": "https://jbmorley.co.uk/photos/2022/08/thailand/IMG_0834/" }, { "content_html": "\n \n \n", "date_published": "2022-08-27T17:56:51-07:00", "id": "https://jbmorley.co.uk/photos/2022/08/thailand/DSCF4147/", "url": "https://jbmorley.co.uk/photos/2022/08/thailand/DSCF4147/" }, { "content_html": "\n \n \n", "date_published": "2022-08-27T17:52:02-07:00", "id": "https://jbmorley.co.uk/photos/2022/08/thailand/DSCF4132/", "url": "https://jbmorley.co.uk/photos/2022/08/thailand/DSCF4132/" }, { "content_html": "\n \n \n", "date_published": "2022-08-27T17:10:37-07:00", "id": "https://jbmorley.co.uk/photos/2022/08/thailand/DSCF4095/", "url": "https://jbmorley.co.uk/photos/2022/08/thailand/DSCF4095/" }, { "content_html": "\n \n \n", "date_published": "2022-08-27T17:07:37-07:00", "id": "https://jbmorley.co.uk/photos/2022/08/thailand/DSCF4085/", "url": "https://jbmorley.co.uk/photos/2022/08/thailand/DSCF4085/" }, { "content_html": "\n \n \n", "date_published": "2022-08-27T17:00:49-07:00", "id": "https://jbmorley.co.uk/photos/2022/08/thailand/DSCF4074/", "url": "https://jbmorley.co.uk/photos/2022/08/thailand/DSCF4074/" }, { "content_html": "\n \n \n", "date_published": "2022-08-27T17:00:21-07:00", "id": "https://jbmorley.co.uk/photos/2022/08/thailand/DSCF4073/", "url": "https://jbmorley.co.uk/photos/2022/08/thailand/DSCF4073/" }, { "content_html": "\n \n \n", "date_published": "2022-08-27T16:16:04-07:00", "id": "https://jbmorley.co.uk/photos/2022/08/thailand/DSCF3967/", "url": "https://jbmorley.co.uk/photos/2022/08/thailand/DSCF3967/" }, { "content_html": "\n \n \nWorking on StatusPanel, I find myself highly tuned to noticing eInk displays in the wild, particularly when they're deployed as public infrastructure as with this bus stop in Cambridge--an elegant blend of the traditional and the modern.
\n \n", "date_published": "2022-08-21T11:56:52-07:00", "id": "https://jbmorley.co.uk/photos/snapshots/2022-08-21-11-56-52-eink/", "title": "eInk", "url": "https://jbmorley.co.uk/photos/snapshots/2022-08-21-11-56-52-eink/" }, { "content_html": "\n \n \nEnjoying a cocktail and a game of Chucky Egg at Bar -OH.
\n \n", "date_published": "2022-08-20T21:08:31-07:00", "id": "https://jbmorley.co.uk/photos/snapshots/2022-08-20-21-08-31-micro/", "title": "Micro", "url": "https://jbmorley.co.uk/photos/snapshots/2022-08-20-21-08-31-micro/" }, { "content_html": "\n \n \nThis ferris wheel now stands in Parker's Piece giving the place quite a different feel from when I used lived in Cambridge. While I don't know what it symbolises, I found myself instantly drawn to the single black car.
\n \n", "date_published": "2022-08-20T09:23:34-07:00", "id": "https://jbmorley.co.uk/photos/snapshots/2022-08-20-09-23-34-unique/", "title": "Unique", "url": "https://jbmorley.co.uk/photos/snapshots/2022-08-20-09-23-34-unique/" }, { "content_html": "\n \n \nWhile our Airbnb in Brixton wasn't really to our tastes, it had a lot of character and a collection of fantastic stained glass windows that cast light in fun and interesting ways.
\n \n", "date_published": "2022-08-05T16:30:36-07:00", "id": "https://jbmorley.co.uk/photos/snapshots/2022-08-05-16-30-36-light/", "title": "Light", "url": "https://jbmorley.co.uk/photos/snapshots/2022-08-05-16-30-36-light/" }, { "content_html": "\n \n \nWe don’t know his name, but this cat decided to visit us in current Airbnb and share some affection. We call him George.
\n \n", "date_published": "2022-07-27T12:48:40-07:00", "id": "https://jbmorley.co.uk/photos/snapshots/2022-07-27-meet-george/", "title": "Meet George", "url": "https://jbmorley.co.uk/photos/snapshots/2022-07-27-meet-george/" }, { "content_html": "\n \n \nWhile I find I've not taken to Brighton, it's not without its fun little details, like this wonderful view into a cocktail bar in Little Preston Street.
\n \n", "date_published": "2022-07-25T19:10:19-07:00", "id": "https://jbmorley.co.uk/photos/snapshots/2022-07-25-19-10-19-little-preston-street/", "title": "", "url": "https://jbmorley.co.uk/photos/snapshots/2022-07-25-19-10-19-little-preston-street/" } ], "title": "Jason Morley", "version": "https://jsonfeed.org/version/1" }