Your beliefs mean nothing, and everything. The thing about a large undertaking like, say, “fixing the government”, is that in true Getting Things Done fashion, this is not a Next Action. It cannot be ‘done’. It’s also not a Project, being comprised of 2 or more actionable tasks. … | Continue reading
Matt Massicotte, looking for leverage to make Apple feel that their course of action is not okay: To put it mildly, I have been struggling with this. I have been trying to find ways to respond. Something that could give me some kind of leverage. | Continue reading
The Braille Institute released an update to their Atkinson Hyperlegible font. My late grandmother approved of its shapes, so check it out if you want to maximize legibility of all letters and numbers in your life. (And when do you not want to be able to read what you type?) | Continue reading
Burkeman challenges the common notion of productivity, like striving for ever-empty inboxes and ticking of all the tasks on our to-do lists. He does that by offering paradoxical irritations (or interventions) – so that you, the reader, as a system of beliefs, have to react someho … | Continue reading
When I addressed the second-to-last RxSwift reentrancy warning this week, I already cut my teeth on very simple state updates and refactored a them in a way that like much better now. I left the gnarly text editing component, the most involved piece of UI in a text editor, for la … | Continue reading
When I started developing Mac apps eons ago, I only had a crappy Intel Mac Mini that took forever to compile my apps. To make this manageable, I adopted library-based development and prepared UI components as dependencies I could compile once, then link as .frameworks into the ap … | Continue reading
So I am working on auto-completion in NSTextView in a package called TextKitAutoCompletion. This is the first new Swift Package project I started with Xcode 16, I believe; the previous one was still Xcode 15. And with 16, they changed how you can reference local packages from exa … | Continue reading
I avoided hamburger menus for the better part of the past decade. This time, I had no better idea. The result is the new mobile navigaton for zettelkasten.de. Also, it seems like the UI component sticks with people, and is not just a weird fad anymore. It’s too old for being tren … | Continue reading
Professor John Gallaugher of Boston College has a free course on making apps with SwiftUI, to be updated in 2025: https://www.youtube.com/playlist?list=PL9VJ9OpT-IPSM6dFSwQCIl409gNBsqKTe On his website, there’s a previous iteration of the course using UIKit (which I believe is st … | Continue reading
Starting Tuesday, 2025-01-14, 17:30 CET (in your timezone), I’ll be hosting an AMA Open Office Hour here. It’s free. Join on Jitsi on Tuesday. | Continue reading
I split off the Reactive Extensions (Rx) of my own Omnibar package so that you (and I!) can use it without having to download and build RxSwift. Omnibar: https://github.com/CleanCocoa/Omnibar RxOmnibar: https://github.com/CleanCocoa/RxOmnibar | Continue reading
I would like to add devices to the Apple “Find My” network, so that my wife can see my location based on the location of an Android phone. FindMy.py at least allows you to query the network. https://github.com/malmeloo/FindMy.py | Continue reading
Long story short, music.apple.com will look very good in a web browser on Android, but (with German location anyway) it will only ever play song previews, never full songs, no matter how hard I log out and back in again. The only download advertised on the website is the Play Sto … | Continue reading
Flying Meat’s Gus Mueller on the life of an independent developer in reaction to Apple acquiring Pixelmator: But today I woke up, and got to work on Acorn. And I’ll do the same tomorrow and the day after that. I enjoy what I work on and I plan on doing it for many years to come. … | Continue reading
In Emacs Org-Mode, the default key binding to “highlight” or “format” the selection is C-c C-x C-f. This will then ask for the org-mode syntax thingie to use, i.e. */_~=+. Literally, that’s the prompt. So you have to know which character to use to embolden text. That’s *. But whi … | Continue reading
If you struggle with Swift 6 and Swift Concurrency (and who doesn’t), this may brighten your mood a bit: Matt Massicotte published a proper introduction. My personal highlight is this: [W]e can just play around with our types, their APIs and structure, and the compiler will give … | Continue reading
Refactoring is reality-bending. Over and over, you change the status quo to align with a vision. It’s about “making the change easy”, one iteration at a time. But here’s the catch: each step creates a new reality. And that reality can trap you, just like the last one did. You los … | Continue reading
I’m accessing my Nextcloud, Linkding, Calibre e-book server, and other “cloud” services hosted on the NAS in the other room via their online domain and a Cloudflare tunnel. That means traffic essentially needs to be routed from my Mac, through Cloudflares servers online, and then … | Continue reading
As of today, TableFlip v1.7 is available as a free update for all customers, and available to download on the website. It’s a maintenance release to update everything for modern macOS, but it packs something delightful: a user interface overhaul with new icons and a modern macOS … | Continue reading
I had this great idea, using URL Schemes on macOS apps, assembled by very simple HTML files that contain a only and produce a GET request so that the data is part of the URL: To my dismay, I discovered that all browsers encode spaces in input and textarea elements as plusses: +. … | Continue reading
Whenever I can, I participate in our local software craftspeople’s Global Day of Code Retreat (GDCR) in November. Yesterday was this year’s event. It was the first time I remember where I haven’t taken away something new for myself as a programmer. I learned much more about peopl … | Continue reading
Sarah Reichelt (@troz@mastodon.social) published a short guide on how app permissions on macOS Sequoia work with unsigned apps, and how you can run them anyway. The context menu trick doesn’t seem to work anymore, and you need to go to System Settings, it seems. (I’m not yet on S … | Continue reading
I find myself looking at an NSView subclass that actually doesn’t do much. It’s an opaque container for a text field that sets a label text. “Opaque” inasmuch as its outward appearance is being view, hiding the actual component’s complexity inside. This is just one example of an … | Continue reading
Type-Driven Design with Swift by Alex Ozun from this year’s SwiftCraft is a recommended watch. Alex covers concepts like replacing the notion of validation user input (with true/false results to represent its validity) with the notion of parsing – transforming unprocessed values … | Continue reading
Recently, our family grew by +1, and we got our lovely daughter back home for a couple of days. The experience in the hospital or clinic surrounding the birthing process before, during, and after made me realize that If you read life hacks and productivity tips including checklis … | Continue reading
Swift is full of syntactic sugar. One particular taste of sweet is the callAsFunction feature. If a type has a method of that name, you can call an instance or value of that type like a function. That’s used in SwiftUI to pass actions around in the environment, for example. Quick … | Continue reading
I wanted to write something positive about the Fairphone Fairbuds. Here it is: They are a great idea. That’s it. Please move on. Continue reading for gory details, but this really sums it up: Replaceable batteries at the cost of a larger form factor is a tradeoff I am absolutely … | Continue reading
In the not-too-distant future of late summer 2024, we’ll be expecting our first child. This is your opportunity to share with someone willing to listen what you usually have to bash into other people’s heads: What heartfelt wisdom do you have to share? Is there anything you wish … | Continue reading
By default, the string output of JSValue in JavaScriptCore printing (e.g. via my console.log) will produce a mere [object Object]. That’s not very helpful. It’s simple to pretty-print objects (if they are merely data-containers) via JSON: | Continue reading
If your macOS app is a SwiftUI app with custom button styles that targets macOS 15+, you don’t need my click-through fix anymore. Reported via Feedback Assistant on 2024-04-11, FB13720950 is now closed because macOS 15 Beta 2 solved the issue. | Continue reading
Primitive Obsession is not called “Primitive Preference” for a reason: we can find ourselves clinging to primitives like addicts, even when every aspect of our project nudges us, hints, and screams that we should be doing something different. It’s never just “a string”. It’s neve … | Continue reading
In my recent post titled “The Rake and Its Prongs” I introduced a function towards the end, called NSRange.isValidInsertionPointLocation(at:). It’s used to consider the after-end location as part of the range. | Continue reading
I wanted to show, just this once for this project, the *compilation* buffer in a bottom split. I also wanted the split to be dedicated, so no other buffers would occupy it by accident, and not be deleted (aka closed) when using delete-other-windows. That should be reserved for co … | Continue reading
Some days I forget to run Denote to create a new journal file for the day, and then the appropriately named note file is missing when I want to write down things later. That’s not how you use a daily journal, I know, but I use Emacs and denote.el to write down things like exercis … | Continue reading
Giles Turnbull shared a link today to a site I didn’t know: https://macmenubar.com It’s a directory of 950+ menu bar apps for macOS. I browsed it a bit, and while each page is a bit short (5 items per page), it’s great to discover new tools – and also check out UI design trends i … | Continue reading
When you type in a text editor, you always type out of some range. When your insertion point or cursor is blinking at the end of a word you just typed, you expect to still be “in touch” with the word, and that the next key you press will for example add a character to that word. … | Continue reading
Documentation-writing is not a goal in itself. Code, tests, documentation – all of these are tools to communicate in writing with other programmers. That includes your future selves as it includes teammates and project collaborators. Kent Beck, “The Documentation Tradeoff”: | Continue reading
KOMA-Script is Omakase. If you trust the package, you’re in good hands to get consistent output from compiling LaTeX documents. I’ve been using Markus Kohm’s KOMA-Script for most of my life with LaTeX in some way or another because the package’s document classes really nail typic … | Continue reading
With the power of outline-minor-mode in Emacs, you can turn any text buffer into an outline – with the killer feature of “cycling”, i.e. folding and unfolding outline elements. This includes rg.el-managed buffers, search results powered by ripgrep: | Continue reading
I figured out a way to consistently change a NSRange, e.g. of a selection of text or the insertion point in a text view, to select surrounding words in DeclarativeTextKit. But first off: Dear heavens! This wasn’t easy. I’m still not happy with the solution. While there are three … | Continue reading
Marco (@esamecar@social.lol) posted a list of alternatives. From that list, I filtered out MAS-only and Chinese-subtitled apps: I’m running Ice at the moment. You can organize menu bar icons into “always hidden” and just “hidden”. The latter will reveal itself when you e.g. click … | Continue reading
I’ve now finished adding an example adapter to get a structural representation of a Markdown code block to my app. It bridges the abstract syntax tree (or “token tree”) of libMultiMarkdown to NSTextStorage-compatible UTF-16 substring ranges – which DeclarativeTextKit works with, … | Continue reading
I started working on DeclarativeTextKit mostly out of desperation, because the naive approach wouldn’t do the trick any longer. I complained about this on Mastodon in the beginning, but until now, I haven’t actually shown the code that made me want to change things. | Continue reading
In DeclarativeTextKit, I found the abstraction of an “expression” in my vocabulary to represent the Domain-Specific Language’s instructions useful. Here is an example of a valid block of changes: This uses two kinds of Swift Result Builder to define the DSL’s grammar: The rules o … | Continue reading
The recent release of TableFlip v1.6 is the first one that includes a new in-app purchase (IAP) component I assembled for my projects. It’s used in TableFlip to purchase a lifetime license within the app. With future releases, the package will support in-app purchases of consumab … | Continue reading
There’s been progress on the Declarative Text Kit API idea, and today I want to share an insight into building a DSL with Swift Result Builders. A detail that I didn’t grok until I built it. {{TOC}} Inserting text into a string, text view, or other kind of text buffer is simple e … | Continue reading
It is easier to close Threads if you have a great book waiting for you. It is easier to press pause on Spotify if you can play the piano. It is easier to avoid Uber Eats if you know how to cook. It can be hard, but it’s easier if you have something meaningful to do. This is almos … | Continue reading
I invested the past two weeks into making the Markdown highlighting component of my app The Archive better overall. More secure C token pointer handling, more performant token tree mutations, so faster highlighting and fewer pitfalls to worry about. | Continue reading