Important Things Are Never Just Done

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


@christiantietze.de | 15 hours ago

Leverage (to Influence Apple)

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


@christiantietze.de | 1 day ago

Atkinson Hyperlegible Font Next and Mono

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


@christiantietze.de | 5 days ago

Guilt-Free for the First Time. Burkeman’s “Meditations for Mortals”

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


@christiantietze.de | 7 days ago

Staring In My Face, But I Ain’t Looking: Simplifying RxSwift Subscriptions

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


@christiantietze.de | 17 days ago

Sins of Carthage: RxSwift Re-Entrancy, Undetected

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


@christiantietze.de | 21 days ago

Using 2 Editors Because Xcode Is Dumb

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


@christiantietze.de | 26 days ago

Responsive, Scalable Hamburger Menu in Accessible CSS

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


@christiantietze.de | 1 month ago

Free SwiftUI University Course from-Boston College Professor

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


@christiantietze.de | 1 month ago

Open Office Hours: Tuesdays, 17:30 CET

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


@christiantietze.de | 1 month ago

RxOmnibar

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


@christiantietze.de | 1 month ago

“Find My” Python and Swift Libraries

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


@christiantietze.de | 1 month ago

Apple Music App: Android APK Direct Download

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


@christiantietze.de | 2 months ago

Gus Continues to Work on Acorn

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


@christiantietze.de | 2 months ago

Org-Mode Emphasis Keymap with Mnemonics

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


@christiantietze.de | 2 months ago

Swift Concurrency Provides Compile-Time Feedback for Runtime Behavior

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


@christiantietze.de | 2 months ago

Iterating Through Realities

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


@christiantietze.de | 2 months ago

Pi-hole on Unraid (as Local DNS to Access NAS Services Without a Roundtrip to Cloudflare)

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


@christiantietze.de | 2 months ago

TableFlip v1.7.0 Releases with Modern Icons

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


@christiantietze.de | 2 months ago

Percent-Encode HTML Form Values so That Spaces Become ‘%20’ Instead of ‘+’

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


@christiantietze.de | 3 months ago

Global Day of Code Retreat 2024 Retrospective

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


@christiantietze.de | 3 months ago

Running Unsigned Applications on macOS Sequoia

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


@christiantietze.de | 3 months ago

Composition Over Inheritance in NSViews

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


@christiantietze.de | 3 months ago

Alex Ozun: Type-Driven Design with Swift (SwiftCraft 2024)

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


@christiantietze.de | 3 months ago

Checklists Appreciated Under Stress

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


@christiantietze.de | 5 months ago

Typed Filters and callAsFunction

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


@christiantietze.de | 6 months ago

Fairphone Fairbuds Are a Great Idea

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


@christiantietze.de | 6 months ago

Expecting a Child

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


@christiantietze.de | 6 months ago

Pretty-Printing Variables, Objects, and Functions in JavaScriptCore

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


@christiantietze.de | 7 months ago

PSA: SwiftUI Button Click-Through Fixed in macOS 15

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


@christiantietze.de | 7 months ago

It’s Never Just a Something

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


@christiantietze.de | 7 months ago

Logical Ranges and Character Ranges

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


@christiantietze.de | 7 months ago

Embark: Display Buffer in Dedicated Side Window

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


@christiantietze.de | 7 months ago

Create Journal Note For a Previous Day in denote.el

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


@christiantietze.de | 7 months ago

MacMenuBar – Directory of Hundreds of Menu Bar Apps

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


@christiantietze.de | 7 months ago

The Rake and Its Prongs

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


@christiantietze.de | 7 months ago

The Communication Tradeoff

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


@christiantietze.de | 8 months ago

If You Use KOMA-Script, Really Do Use KOMA-Script

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


@christiantietze.de | 8 months ago

Fold Search Results Away in rg.el

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


@christiantietze.de | 8 months ago

Declarative Text Kit: Word Ranges

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


@christiantietze.de | 8 months ago

Hide macOS Menu Bar Icons (Bartender Alternatives)

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


@christiantietze.de | 8 months ago

Declarative Text Kit: Token-Based Adapters

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


@christiantietze.de | 8 months ago

Declarative Text Kit: Reduction in Ugly Code Size

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


@christiantietze.de | 8 months ago

Declarative Text Kit: Expression and Evaluation

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


@christiantietze.de | 8 months ago

Swift Package: FastSpring In-App Purchase

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


@christiantietze.de | 8 months ago

Declarative Text Kit: Inserting Strings and Lines With a Result Builder

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


@christiantietze.de | 9 months ago

It's Easier With Meaning

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


@christiantietze.de | 9 months ago

Declarative Text Kit: Sketch of an API

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


@christiantietze.de | 9 months ago