Blog and Article Index
- Structured Overview: Commented table of contents of what I think are my most important articles.
- TextKit: I deal with text, and here's a collection of everything I figured out so far.
- Ultimate FastSpring Guide for Selling macOS Apps: I sell my macOS apps in my own store. Resources and tips to get you started.
- Tag Index
- Posts by year: 2024 · 2023 · 2022 · 2021 · 2020 · 2019 · 2018 · 2017 · 2016 · 2015 · 2014 · 2013 · 2012 · 2011 · 2010
2024
November 2024
Percent-Encode HTML Form Values so That Spaces Become ‘%20’ Instead of ‘+’
You can use HTML forms to dispatch actions to custom macOS app URL schemes, but you need to encode the form data yourself to avoid surprises.
Global Day of Code Retreat 2024 Retrospective
Nov 9th, 2024 was Global Day of Code Retreat. I found that people are the actually hard thing in programming.
Running Unsigned Applications on macOS Sequoia
“Open Anyway” for unsigned apps is now located in settings.
October 2024
Composition Over Inheritance in NSViews
I noticed that I’m writing some AppKit/UIKit view components in a composable way that reminds me of the opaque nature of SwiftUI.View-conforming types: hiding away the actual 1st party APIs, providing very little surface area.
Alex Ozun: Type-Driven Design with Swift (SwiftCraft 2024)
The talk “Type-Driven Design with Swift” by Alex Ozun covers interesting topics and presents type-based solutions to software development problems in an easy-to-grasp way.
September 2024
Checklists Appreciated Under Stress
Giving birth to a child includes managing stressed-out hospital staff, too. Checklists would’ve helped along the way at every turn. And they still help me to get stuff done in an otherwise unorganized daily routine.
August 2024
Typed Filters and callAsFunction
Combining three Swift features for the sake of expressivitiy: sum types aka enums, callAsFunction to introduce “callable” semantics, and type extensions to beautify call sites.
Fairphone Fairbuds Are a Great Idea (Only)
I tried to get the Fairphone Fairbuds to work, but failed. I still like the idea. But the UX and execution is terrible.
July 2024
A formal request for tips and tricks.
Pretty-Printing Variables, Objects, and Functions in JavaScriptCore
A JavaScript function for debugging that stringifies an object including its functions so you can evaluate the result again.
PSA: SwiftUI Button Click-Through Fixed in macOS 15
SwiftUI non-bordered button styles don't support click-through up to macOS 15, but are fixed with the upcoming macOS release.
Find yourself dealing with primitive value types a lot? There’s a term for that.
Logical Ranges and Character Ranges
Text editing is different from text inspection, and I believe I'm on the path towards a more expressive domain.
June 2024
Embark: Display Buffer in Dedicated Side Window
Show any buffer in a side-window (aka a sidebar, but also potentially at the bottom) of an Emacs frame. Includes Embark key bindings to do this from a buffer list.
Create Journal Note For a Previous Day in denote.el
TLDR: Customize denote-prompts. The longer version shows you how to discover this based on the code on your own if you're in a similar situation.
MacMenuBar – Directory of Hundreds of Menu Bar Apps
Invaluable resource to see trends in menu bar app UIs and to discover cool tools: macmenubar.com lists 950+ menu bar apps (as of June 2024)
We don’t think about this as we write: the blinking cursor tells a useful lie about what the text looks like, so we can work on an abstraction that is about the space between characters, and especially the space after the last character.
As a software developer, I want to understand the code, so that I can implement changes for our users. How do we get there?
If You Use KOMA-Script, Really Do Use KOMA-Script
The KOMA-Script LaTeX package bundle may be typical German over-engineering, but when it works, it really works.
Fold Search Results Away in rg.el
Whenever you want to fold away content in an Emacs mode that doesn't support this out of the box, consider using outline-minor-mode
. Here’s how I did that to make rg.el
Declarative Text Kit: Word Ranges
Writing a somewhat language-agnostic detector of word boundaries is no small feat.
Hide macOS Menu Bar Icons (Bartender Alternatives)
macOS app Bartender changed owners without any notice, and users are abandoning ship for lack of trust. Here are some alternatives.
Declarative Text Kit: Token-Based Adapters
With a semantic FencedCodeBlock
type added to my app, performing changes on existing code blocks is not procedural anymore. It is now a one-liner.
Declarative Text Kit: Reduction in Ugly Code Size
Great news: This week’s v0.3 release of the Package is good enough to implement the feature I wanted to build!
May 2024
Declarative Text Kit: Expression and Evaluation
To declare changes in the DSL, we need a vocabulary of expressions and sort of a grammar. With Result Builders, this is surprisingly simple.
Swift Package: FastSpring In-App Purchase
I published a Swift Package to embed a FastSpring-powered store within my apps.
Declarative Text Kit: Inserting Strings and Lines With a Result Builder
Swift Result Builders make the declarative Text Kit API quite nice to work with once you know what you want to do. Here’s how I got over the initial humps.
Some habits are hard to break. It is easier if you have meaningful alternatives.
Declarative Text Kit: Sketch of an API
I was fed up with writing long procedures to perform markup changes on the fly. This post contains an API that looks like something I would like to use.
Use and Then Reduce Open Source Dependencies
Dependencies make you quick. Dependencies also slow you down.
As the saying goes, if the title of a post is a question, the answer is “no”. So, do you, or don’t you need a Zettelkasten in your life?
April 2024
Table View Cells from Nib: How to Change the Blueprint Data to Affect New Cells
Deep dive into where the little cells come from, the old school way: Inspecting call stacks, probing default objects. The goal is to change how cells spawn from Nibs.
Dynamic Actor Isolation Can Help During the Transitional Phase
On your way to static actor isolation, adopt dynamic isolation practices to ease into the change.
Niki Tonsky: Hardest Problem in Computer Science: Centering Things
Vertical centering, baseline alignment, visual horizontal centering. Nothing is easy.
Always Be Changing Existing Code
Ever thought that your good idea from today will be the worst nightmare of your future self? The future not realized may actually be worse.
SwiftUI Kata: Recreating DebugInfo Viewer
Recreating the “DebugTest Info” app from the Mac OS X era from Technical Note TN2124 in SwiftUI with macOS Sonoma default styling.
Enable SwiftUI Button Click-Through for Inactive Windows on macOS
Buttons in macOS windows both activate a background window and perform the button action with one click. That so-called click-through behavior breaks with almost all SwiftUI button styles, including custom ones. Here is a fix.
Soulslike games are characterized by their high difficulty level, where success depends on learning from failures and mastering the mechanics. You know what else shares this?
Masterclass of Decoupling: Diablo II Resurrected
Diablo II Resurrected has 3D graphics, but it’s actually the same game, as far as you can take the meaning of “same” without running from the original discs.
March 2024
Negate KeyPath<T, Bool> Values with not()
Here is a simple free function to invert boolean values for all you Swift KeyPath fans out there.
Disable XeLaTeX Character Sequence Mappings for Inverted Question Mark and Inverted Exclamation Mark
Some simple ASCII character sequences in TeX files become fancy Unicode characters like curly quotes or em-dashes. Disabling some of these so-called mappings can be a pain. Easy with pdfLaTex/LuaLaTeX, hard with XeLaTeX.
You Absolutely (Do Not) Need to Comment Your Code
Comments in code are useless. And commented code is the best.
Ship Custom Fonts within a Swift Package
You can treat font files like any other resource, but you need to use Core Text API to load them in your app. That isn’t as complicated as I feared. Here’s how.
Easing Into a Language and Environment: Week 3 with PHP
A short retrospective of learning a new-ish language and the programming environment.
Oh, You're Making Apps, So You Are Working for Apple/Google/...?
The ultimate litmus test: Can your mother tell apart “creating apps for iPhone” from “working for Apple”?
SwiftUI Challenge: Can You Port this from Auto Layout to SwiftUI?
“Der Teilweise” proposed an interesting benchmark to see whether SwiftUI is production ready. Takes 10 minutes to do in Auto Layout. How long do you need for SwiftUI?
3 Types of FastSpring Storefronts
For app developers, there are three basic FastSpring storefronts you can use to sell your apps quickly.
How to Disallow GPTBot Crawling in robots.txt
You need to tell GPTBot to stop crawl your website if you don’t want it to. Here is how.
Developer Voices on Property-Based Testing Made Me Realize PBT’s Value
Maybe Kris Jenkins and Oskar Wickström made Property-Based Testing click for me. Here are my personal insights to maybe color you intrigued as well.
TableFlip v1.6.0: JSON Support and Font Resizing
TalbeFlip v1.6.0 is released, a free update for direct customers and Mac App Store users. It finally brings resizable fonts, and a first glimpse towards JSON support.
February 2024
Portable Every-Day-Carry Paper Kanban
You don’t need a computer or smartphone to use a Kanban board: here’s an approach to do it all with simple, affordable, and fun paper tools.
Splitting Large Tasks is not a Mathematical Process
You’re in a team meeting. You estimate a task to be worth 13 story points, which is a lot in your team, so you break it up into two tasks. The first one is estimated to be worth 8 story points. What’s the second one worth?
Chris Eidhof released an interactive, animated resource to understand SwiftUI.
Looking for Testers: Typers of Japanese, Chinese, and Korean Characters
Do you routinely work with text typeset in Japanese, Chinese, or Korean characters? Do you type these yourself? I'm looking for testers!
Example of Object Tag vs Topic Tag in Programming Zettelkasten
A (hopefully instructive) example of topic vs object tags in a Zettel about programming topics.
Turns out that even when the overflow menu items look clickable, not all of them actually fire an event. You need to tell the NSMenuItem
about its action.
January 2024
Life Hack: Label Your Trash Bins
This 1 weird hack will annoy the hell out of all the trash bin bag producers!
32-Bit Cafe: Personal Website Ideas
Inspiration for personal websites: topics, design tweaks, and playfulness.
Low App Prices are Preemptive Excuses
Developers see how their product falls short from the ideal, and so they instinctively charge a lower price than they could (and maybe should).
Have You Ever Sent an Email with a File Attachment that is Located on a Server?
This is a tale of convergence of Embark, TRAMP, and email to brainlessly just send a file from somewhere to someone.
Transformative Reading ... 2017 Edition?!
A new year, so let us talk about favorite books (or at least those I wrote down to mention), but from 7 years ago.
ChatGPT Shell: Confirm Before Closing and Split Compose Buffer
Tweaks to my chatgpt-shell
configuration.
Emacs sqlite-mode to Open .sqlite Files Automatically
.sqlite
files render “graphically” in Emacs, but only if you open them manually with the equivalent of a file picker dialog; that is unacceptable, and I propose a solution that opens the graphical view for SQLite database files when you visit the files automatically.
Cold-Blooded vs Warm-Blooded Software
You cannot run cold-blooded projects as warm-blooded ones. There is not enough activity “to keep the temperature up”. But cold-blooded projects are great to keep around for years and years.
You Can Choose When You Live in Surplus
You decide what constitutes “enough”, and when you reach that point.
I found ISO dates to be lacking in context in notes that represent timelines. So I am trying out something a tad different, like [2024-01-01 Mon]
.
2023
December 2023
Show Organic Traffic in TelemetryDeck the Simple Way with a Values Breakdown Insight
Find out how to effectively set up and use TelemetryDeck to filter website views by referrer, focusing on organic traffic sources. This is a much simpler way than the geeky query language approach from last time, no weird coding required.
Using Type Markers for 'is' Type Predicates to Cover Generic Types
Wrestling with generics and is
type checks in Swift? Consider using (empty) protocols as type markers instead.
Dependency Injection via Protocol Composition
Declaring dependencies as protocols, then combine via '&'.
Update for modus-themes v4 and mlscroll.el Colors
The mlscroll Emacs package got an update that makes styling it even simpler.
Ignore Generated Xcode .xcworkspace Files in Git Except Package.resolved
To tell your teammates’ Xcode that packages need to be updated after a pull, check in the resolved packages file from within the Xcode project bundle. Here are git ignore rules to help you with that.
Show Referrers in TelemetryDeck for Web with a TopN TQL Query
TelemetryDeck can act as a lightweight and GDPR-compliant website analytics tool. But you need to create some things yourself, like computing a list of top referrers. Here’s how you do that with a TQL query.
TableFlip v1.5.1 comes with many HTML and exporting tweaks!
Transforming JSON to Tables: the Impedance Problem
There’s a mismatch between the nested object structure of JSON and tabular data. But there's hope.
How Long Does a Disk Preclear in Unraid Take for 12TB of Data?
Spoilers: it takes 3 whole days.
November 2023
After starting the day with a pro-SwiftUI rant, to my surprise I end it with an embrace of traditional, tested and true AppKit patterns.
Not Quite 100% SwiftUI – Time Makes Perfect
Marin Todorov's “A 100% SwiftUI App” talk from this year's Swift Heroes went life (and it's really worth the half hour!)
This update brings HTML export, more LaTeX export options, and much improved performance!
September 2023
Sparkle v2.5 Adds Relevant Version Highlighting to Release Notes
With Sparkle v2.5, you can ship release notes for multiple versions, and then use CSS to hide outdated information from the user.
Portable Painter Micro Palette
As a birthday gift, I got the Portable Painter Micro watercolor palette with some new colors. Here’s my first sketch with it.
UserDefaults.register(defaults:) Is a Bit Like Nil-Coalescing
Mental model: registering fallback values for UserDefaults is like Optional coalescing in Swift.
Some bullet points (and stats) about my previous year in life.
Kill Unsaved Emacs Buffers UX: Replacing Yes/No/Save with Meaningful Options
Since Emacs 29, I'm being asked if I want to save or discard an unsent mail in a very confusing way. I found a fix.
The Missing Array.appending(contentsOf:)
There is no immutable append variant to concatenate two Arrays, or Strings, or other collections in the Swift standard library. Here is one.
August 2023
Making Your App Extensible with JavaScriptCore: Annotated Presentation with Full Transcript
Last year's presentation slides with the full talk transcript for my JavaScriptCore plugin approach.
SwiftData: Store Image Data, but Actually Outside the Database
Use the @Attribute(.externalStorage) option to save binary data with SwiftData but outside the database.
Async XCTest Assertion Helpers
The missing XCTAssert helpers that support async calls: AsyncAssertTrue(try await shouldSucceed())
Summary of how the responder chain is traversed on macOS to have events bubble up.
SwiftUI.View Is Your ViewModel
Hypothesis: You already have a View Model when you work with SwiftUI, which is the View type itself.
Decoupling SwiftUI.View Configuration from Layout and Action Handling
Decoupling introduces independence, which means the de-coupled pieces can change independently. Even in the smallest view component, this can bring tangible real-world improvements.
July 2023
I sometimes receive email where people (accidentally?) quote themselves, not my original text, and I can't figure out why.
June 2023
Super Saturday Sharefest: Matt Massicotte's XPC Work
Shout-out to Matt Massicotte for sharing yet another XPC and Concurrency related open source package!
A maintenance update with minor visual changes.
macOS Sonoma Menu Section Headers Look a Bit Off
The new NSMenu section headers feel like they violate the principle of proximity in visual design.
Swift Package Import in Objective-C Might Just Work
Unbeknownst to me, you can @import Swift Packages in Objective-C files just fine!
SwiftUI.List with Menu with Plain Button Style Breaks Event Loop
Super weird edge case: the plain button style makes interacting with the menu all but freeze the app. (FB12285575)
How to Inspect SwiftUI.TextField.onSubmit and Figure Out You Can't Programmatically Use It
I looked for a way to trigger the onSubmit block in my own code, but none of my approaches bore fruit.
Swift Pattern Matching with Extra Conditions, and the Value of Syntax Summaries
Natalia Panferova of nilcoalescing.com posted “Swift enum pattern matching with extra conditions”: I believe there’s value in reviewing summaries like these for advanced Swift programmers!
May 2023
11 or so Android Ebook Reader Apps for Academic Writing Workflows: Annotations are Hard
I tested a bunch of Android EPUB reader apps to see if annotations would work with my Zettelkasten workflow. The result: it’s not easy to improve the workflow.
BOOX Vector PDFs Are Already Colored
Ok, no need to investigate further: PDFs are colored if you use color pens, so I'm now just using that instead of replacing colors in the PDF source.
Colorize Onyx BOOX Notes Vector PDFs (Really Rough Edition)
I wanted to colorize greyscale vector notes. This led me down a rabbit hole of replacing color definitions in the PDF’s source code.
Boox NeoReader Annotation Export Is Meh
The Onyx Boox e-reader is equipped with a good e-book reader app, but its export is almost useless to parse and use in an academic context.
Safari URL Scheme for macOS and iOS
Replace https: with x-safari-https:, and you can open a link in Safari, no matter the user's default browser.
Wrap HTML Tables in Figures using Nanoc and Kramdown
On mobile phones, wide tables didn’t scroll horizontally – instead, they broke out of the content container and everything looked a bit wonky. So I wrap them in <figure>
elements now.
April 2023
Fetch Personalized Command Explanations with 'um' from Your Terminal
March 2023
February 2023
January 2023
Display a Random Inspiring Quote for Journaling or Shell Prompts
2022
December 2022
How to Use SF Symbols in Emacs (for Tab Numbers)
Early 2022, I shared how I used circled digit unicode in tabs; here's how to use SF Symbols on macOS to get even better-looking results.
Making Your App Extensible with JavaScriptCore (CocoaHeads Presentation)
ChatGPT: Publish NSTextView Changes to ReSwift, but Also Use a Lamport Clock
Conversation log with ChatGPT.
Use System File Open Dialog for File Actions in Emacs (Just Once!)
November 2022
Mutating Struct and State Observers: How the Latter Will Be Notified Even for 'No-Ops'
Gitea Ltd. Takes Over Gitea Open Source Project, Community Pushes Back
CocoaHeads Talk about JavaScriptCore Plugins on Thursday 2022-11-24, 7 p.m.
NSTableView Variable Row Heights Broken on macOS Ventura 13.0
October 2022
Sketch Layoff of 80 Employees — Does It Really Send an Alarming Signal?
September 2022
NSTextView (Plain Text) and the Pasteboard: PasteboardType.string Is Not Handled
Example of High Cohesion and Low Coupling with Presenter, View, and View Model
How to Fix When Some Text Changes Don't Come with Automatic Undo?
Replacing zoom-window with winner-mode to Temporarily Change Window Splits in Emacs
August 2022
SwiftUI Isn't Easy to Get Into: My Road From Headache Towards Mastery
Rely on @Published Property Wrapper Events, Not the Observed Object
Output Port Adapter for Single Point of Configuration in Complex UI
July 2022
Shift-Click in Emacs to Select – A Simple Change With a Complex History
June 2022
May 2022
Magit's Killer Feature #1: Commit Text Completion Based on the Diff
April 2022
How to Upgrade Sendy from Version 5 to 6 from the Shell via SSH
Aergrind by Knock Coffee Grinder, and Their Amazing Customs Duty Service
March 2022
The Playdate's Docs Are Made with More Love Than Most End Products
February 2022
Split Window in Emacs and Resize and Recenter Frame to Make Room
Add Numbers to Emacs tab-bar-mode Tab Titles for Quick Access
I'm adding CIRCLED DIGIT unicode characters to my tabs in Emacs to select them by number.
January 2022
2021
December 2021
November 2021
SwiftUI Requires Platform Knowledge On Top. Case Study: Fonts
What Do You Get When You Drag and Drop a PNG File From Finder Into an NSTextView?
Use macOS System Selection Colors in LIN for Emacs Line-Selection UIs
October 2021
Swift Pattern Matching Operator: Compiler Error when Specifying Enum Type and Case Name?
September 2021
NSTextView Performance May Degrade for Large Plain Text Documents When usesFontPanel Is Active
August 2021
July 2021
How to Fix Mach-O Header Code 0x72613c21 When You Try to Export Your App in Xcode
Two Improvements to Open macOS Finder Window in Emacs Dired + Automator Quick Action Downloads
June 2021
How to Print on macOS With An NSTableView and Customize the Result
Multi-Monitor Compatible Code to Center Emacs Frames on Screen
Automatically Center New Emacs Windows (Aka Frames) on Screen
May 2021
April 2021
March 2021
The Beauty of Hacking Swift: Make Union of Set Algebra Types More Obvious
Change Case of Word at Point in Emacs, But for Real This Time
February 2021
Emacs Org-Mode: Automatic Item TODO/DOING/DONE State Transitions for Checkbox Changes
IPv6NAT in Unraid's Docker Containers Behind a Reverse Proxy to Make Outgoing IPv6 Requests Work
When Code Signing of Frameworks Fails During macOS App Distribution, Make Sure ENABLE_BITCODE=NO
SOLVED! Looking for Docker Reverse Proxy & IPv6 Setup Help (Paid)
Disable NSTextAttachment Action and Sharing Services Menu Drop-Down
Create Custom Org-Mode Links to Open My External Zettelkasten App
A Short Note on Voice Assistants and Very Old People Who Don't Hear Well
Looks like you cannot train a 91-y.o. woman to pick up voice assistants that rely on the recipient to understand the assistant's audio output.
Atkinson Hyperlegible Font May Be Pretty Good If Your Granny Can't See Well
My grandmother approves of Atkinson Hyperlegible free font for her phone book printout
January 2021
XCTestExpectation via NSPredicate Is On a Slow Interval, Use This Instead
NSSavePanel Crashes on Big Sur for public.csv UTI When You Don't Have a CSV Editor
2020
December 2020
Indie Support Weeks: Working Copy - Fully Featured iOS git Client
How to Profile Slow Scrolling (And Other Performance Bottlenecks) in Emacs
Apple's App Store Small Business Program Enrollment Is Super Simple
November 2020
Upgrading to Sparkle 2.x Branch
The Sparkle 2.x release branch is working fine for production when you switch from the ui-separation-and-xpc branch and enable DSA signing of updates.
October 2020
Hide Traffic Light Buttons in NSWindow Without Removing Resize Functionality
Export Day One (macOS) Journals to Emacs org-mode Diary Entries
Fix Your Damaged Mac App Store App by Parsing the App Store Receipt Dates Correctly
September 2020
NSRemindersUsageDescription Info.plist Key is Misspelled in the Documentation
August 2020
Indie Support Weeks: Use DropDMG to Create Your App Downloads
July 2020
Demonstrate Swift's Lazy Initialization of Static Attributes Even when Using a Property Wrapper
Adopting the Linktree Convention to Redirect People to My Projects
June 2020
Implement Pixel-by-Tile Movement in Godot
Move a character on a tile-based grid and animate the steps in between in Godot, limiting its engine to distinct steps.
Comparing 2D Collision Detection and Hit-Testing Approaches in Godot 3
How to Decode Human-Readable JSON Strings to Integer-Based Swift.OptionSet
FSCheckoutSheet: In-App Purchase Sheet for Your FastSpring Store
Structure and Interpretation of Classic Mechanics – A Physics Book with Code
May 2020
Proposing the h-now Microformat to Mark-Up All Our /now Pages
Digital Gardening: A Renaissance of Open Thinking and Curated Writing on the Web
Blog Series: TableFlip's NSDocument File Type Issues and Fixes
How to Create a NSSavePanel accessoryView in Swift to Pick File Formats
Programmatically Select a NSSavePanel File Format to Fix Empty Selections
Observations of the Curious Problem of NSDocument-Based App Changing the File Extension
Delete the Next Word or the Current Selection in Emacs with the Same Shortcut
April 2020
February 2020
Getting Rid of kCGImageSourceTypeIdentifierHint Error when Loading NSImage from a File
January 2020
Thread Safe Property and Resource Access with the Transaction Wrapper
Swift API Docs for String.index(_:offsetBy:limitedBy:) Is Still Misleading
Lock App Features Behind a Paywall and Enforce the Lock in Code
Maybe Call Your UI Configurion Objects ViewData Instead of ViewModel
Getting out of the MVVM mindset helps see the connection between UI and UI-specific state that you derive from your model.
AppMover Swift Library to Move Your macOS App to the Applications Folder
2019
December 2019
UserDefaults Access via Property Wrappers Is Worse Than You Might Think
Guilherme Rambo Was Temporarily Locked Out of His Apple Developer Account
Native macOS Notifications for Emacs Org Tasks and Appointments
November 2019
That Weird Obstable of Interface Builder When You Get Started With iOS Development
October 2019
Model-View-Presenter, Form Validation, and a Unidirectional State Machine
Prevent Emacs Compilation Window From Displaying Other Content
Quit and Close Emacs Special Windows Like Help and Compilation Results
Starting PHP Development in 2019: Project Setup and Dependencies
"Make Money Outside the Mac App Store" Second Edition Ebook Available
Comparison of E-Commerce Platform Alternatives to the Mac App Store
September 2019
What to Do When You Want to Affect the Order of Subscription Callbacks in ReSwift
Always Ask for MailChimp Newsletter Reconfirmation Outside of MailChimp
Don't Wait. Show Up. Or It Might Be Too Late Again
When someone close to the family dies, a lot of dust is stirred up, offering an opportunity for reflection.
With DevMate Closing Shop, Here's What You Can Do
Don't panic. DevMate's components can be replaced, one by one. Here's a breakdown of it all.
Prying Open the Vanilla Forum Control Flow to Create Discussions in Embedded Forms
August 2019
NiftyMenu -- Automatically Recreate a macOS App Menu Bar in HTML
July 2019
Paid Up Front: Two Perspectives to Make this Business Model Work to Your Advantage
Implement NSWindow Tabbing with Multiple NSWindowControllers
June 2019
Slides for the "More Money, More Control" Webinar on Selling Outside the Mac App Store
Xcode Project Setup to Build, Embed, Codesign, Notarize, and Use the Sparkle XPC Services
Use Shared NSUserDefaults for XPC and Interface Builder Nibs
embetty Embeds Tweets and YouTube Videos Without the Tracking Code
May 2019
Mac App Store Proceeds for TableFlip Without Marketing Campaigns
April 2019
March 2019
Do Not Apply Code Heuristics When You Need a Broader Perspective
February 2019
January 2019
NSAppearance Change Notifications for Dark Mode and RxSwift Subscriptions
2018
December 2018
November 2018
Fix NSSegmentedControl Action Forwarding from Your NSToolbar
September 2018
Fixing Ruby ncurses Unicode Character Display on Linux Terminals
How to Fix fileReferenceURL() to Work with NSURL in Swift 3 and Swift 4
August 2018
July 2018
June 2018
NSTextField usesSingleLineMode Stops Working When You Implement NSTextViewDelegate Methods
Use RxSwift Observable Instead of Result for Failure Handling
May 2018
Add Blog Post Text Template Expansion to Emacs with Org Babel
April 2018
Put Test Files Next to Production Code for Better Discoverability?
March 2018
NSTextView's Default Insertion Point and Selected Text Colors
February 2018
Behind the Scenes of Programming 'The Archive': How Much Coffee Did I Consume?
From Timing with Love: Valentine's Day Productivity App Discounts
2017
December 2017
Exposing the MultiMarkdown 6 Library to Swift, Part 1: Swifty Enums
November 2017
October 2017
Dependency Injection via the Recent "Cake Pattern in Swift" Pattern is Useless in Practice
September 2017
Inject ReSwift Middlewares from Different Project Targets During Runtime
August 2017
July 2017
Scroll NSScrollView Programmatically Without Showing the Scroller Knobs
June 2017
macOS Storyboard Outlet-Like Connections Between View Controllers
NSSplitViewItem Vibrancy Is Not Added with Every Initializer
Fixing NSTableView Cell Backgrounds by Deactivating NSSplitViewItem's Visual Effects
May 2017
Do You Need to Use Action Creators in ReSwift to Conditional Action Dispatching? (No)
Drawing Custom Alternating Row Backgrounds in NSTableViews with Swift
April 2017
March 2017
February 2017
How to Unit Test Dispatching ReSwift Actions from RxSwift Observables
Core Data is Invasive. You Can Hide It, Or You Can Embrace It
January 2017
A Look at the ReSwift Event Log During Launch of My Latest Project
2016
December 2016
Lifting Into a New Type: My first "Idiomatic" RxSwift Unit Test
It's the Worst Time to Go Open Source Because So Many Stupid People Will See It
November 2016
"Exploring Mac App Development Strategies" 4th Extended Edition Now Available
October 2016
Resolving NSTreeController's "Ambiguous use of 'children'" in Swift 3
My Declarative Breakthrough: Wherein I Stop Thinking in Terms of Object Collaboration
Developer Documentation App Dash Removed from App Store – and No-One Can Do a Thing
September 2016
Swift 2.3 NSLocale UIKit API Changes Break iOS 8 Compatibility
August 2016
When You Code, You Design Both Structure and Information Flow
July 2016
Ownership of the Apps You Use: Ulysses App Pricing, Subscription Models, and the Death of Licenses?
What Projects Do You Identify With? Maybe They Drag You Down
I'll Split Up the Monolithic View Model in TableFlip. Here's What I Expect to Happen
How PlanGrid uses a Flux-Inspired Architecture to Simplify State Management
Iteratively Improving Your App: Decoupling Components at Module Seams and Adding Facades
First Contact with AppKit for iOS Developers (Under the Radar #26)
June 2016
May 2016
What I Did When I Found Emojis in Strings Always Lost the Last Byte
April 2016
March 2016
5 Heuristics for "I have a complicated nested view controller setup. How do I handle passing data?"
Extend View Controllers with Behavior Objects Right from Within Interface Builder
Creating a Cheap Protocol-Oriented Copy of SequenceType (with a Twist!)
Creating a Lens for an Object to Provide a New Public Interface
February 2016
How do You Really Mock Objects You Don't Own? You Replace Them with Adapters
Publish and Subscribe — Decoupling Deep View Hierarchies from Event Handlers
1 Criterion to Determine if You Should Write Unit or UI Automation Tests
Always Write Functions to Cope with all Possible Parameter Values
January 2016
Make Money Outside the Mac App Store now Available on Amazon
Extending Types with a Conversion Factory: Where Should You Put It?
I'll be writing a Word Counter Swift module fully East-Oriented
How Closures are a Better Event Handler Protocol Alternative
2015
December 2015
Encapsulate a Process in a Single Line Using Bind and Good OO Design
Separate Read Model from Write Model to Support Complex Forms
November 2015
Configuration Objects: Delegate Initialization to a Parameter
How to Handle Errors When You're Not Interested in the Details
Switching iOS App Login Methods by Creating Your Own Simple Login Module
Modeling: From Structured Data Representation to Problem Domain
Ideas to Solve Background Fetching and Saving Race Conditions with Core Data
October 2015
Don't Build on El Capitan Without Checking App Transport Security
How I Solve the Unexpected Error Handling User Experience Problem
Make Custom Debug Build Configurations Play Nicely With CocoaPods
Optional Protocol Methods in Swift using Closures and No Protocol, Actually
Transactions and Rolling Back Changes in Core Data with UnitOfWork
Put Usage of a CoreDataFetchRequest out of Your Code and Into ... Where Exactly?
How I Now Deal with Collapsible Split View Controllers on the iPhone 6
September 2015
Universal Deep Linking on iOS: Design Each Scene to Be Remarkable
Swift Protocol Extensions as Mixins – And How Do You Test That?
Testing Shorthand: Use a Subclass of the Real Object Under Test
Make Money with Mac Apps Outside the MAS: E-Book Prerelease, Need Feedback
Save Yourself Casting Headaches with a Generic Fetch Request Object
How to Change the Detail of a UISplitViewController in the Background
Dismissing a Modally Presented Scene on Both iPad and iPhones Using Unwind Segues
How to Create Flexible Components with Two Levels of Service Objects
Where Instead of Using Functional Bind, I Create an Expressive Model
August 2015
July 2015
Refactoring Legacy Code: Replace Free Function in Tests, Even Swift's Own Functions
“Exploring Mac App Development” Updated for Swift 2.0 + Coupon to Save 50%
How Coursera Uses VIPER to Architect Transitions Between App Features
Clean Coding is a Programming Misnomer for a Software Engineering Principle
June 2015
Protocol Madness: Comparing Apples to Oranges from the Vantage Point of Fruit
How to Write Unit Tests for Storyboard-based Buttons in Swift
Test doubles for Core Data managed objects might not work as expected
May 2015
Combining Collection-Like Repositories and East-Oriented Code
April 2015
March 2015
Painless Event Delivery With a Custom Publish-Subscribe Infrastructure
Split Commands and Informational Return Values Apart Using Events
February 2015
Use Double-Dispatch and Polymorphism to Get Rid of Conditionals
Thinking in Terms of Functional Programming Encourages Clean Factoring of Code
January 2015
2014
December 2014
Making Good Use of Singletons in Refactoring the iOS App Calendar Paste
I'm About to Release a Little E-book on Domain-Driven Design and Mac Application Development
November 2014
October 2014
How I Edited my Last Zettelkasten Post and Came up With Something Even Shorter Than the Post Itself
September 2014
August 2014
July 2014
Challenge: Apply the Knowledge Cycle to Reading a Single Book
June 2014
Include Images in nvALT for a Multi-Media Zettelkasten Experience
May 2014
April 2014
March 2014
February 2014
January 2014
2013
December 2013
November 2013
October 2013
September 2013
Solve database mapping problems and the impedance problem of ActiveRecord
August 2013
June 2013
Create a Zettelkasten for your Notes to Improve Thinking and Writing
May 2013
April 2013
March 2013
February 2013
January 2013
2012
December 2012
November 2012
Remove Objective-C method declaration fluff with Keyboard Maestro
September 2012
2011
April 2011
February 2011
2010
December 2010
November 2010
Bringing Notational Velocity to a new level of massive text editing
October 2010
Notational Velocity fork with fullscreen mode, menubar app, and more