Dock Tile Background

Dock Tile

2026
HomeLabsDock Tile

macOS

SwiftUI

AppKit

Dock Tile began as a simple idea: bring iOS-style app folders to the macOS Dock. It ended up being a deeper technical project than I anticipated, and my first time building a macOS application end-to-end with Claude Code, which made the unfamiliar terrain more navigable. Here's how it came together.

Dock Tile app showing tile configuration with selected applications

Dock Tile is completely free and open source. Download it, use it, and contribute to the project onGitHub.

View App

Problem

I've been designing iOS apps for the better part of a decade, but macOS has always remained an unexplored frontier. Since I dip my toes in design & coding every now and then, the workflow of apps differed based on what I was doing, so that meant at any given time I end up with a heap of apps to deal with and often get lost in the sea of open windows. That's when the idea occurred: why not build a simple utility that lets you create multiple custom dock tiles, each acting as its own app launcher with independent apps & folders. Think of it as our iOS home screen folders for your macOS Dock, but with more customization.

What made this project interesting wasn't just the final app but it was the journey of building a macOS app along with Claude Code. I leaned heavily into AI-assisted development, following principles from Addy Osmani's AI Coding guide.

The Challenge

The macOS dock is a closed system from Apple, which I realised after starting to validate the idea with a quick prototype. macOS doesn't provide out-of-the-box APIs for creating multiple dock entries from a single app. To make the dock tile helpful, each tile needs to be its own application bundle, which means runtime code generation, code signing, and dock integration without breaking the user's existing setup.

The Architecture

Helper Bundle System

The core insight was treating each dock tile as a separate "helper" application. When you create a tile in Dock Tile, the app:

  1. Generates a new application bundle from a template
  2. Injects custom configuration (icon, name, app list)
  3. Code signs it for macOS to trust
  4. Registers it with the Dock

Each helper is a fully independent macOS app that reads from a shared configuration file. This means the tiles all survive reboots, work offline, and behave exactly like native apps.

~/Library/Application Support/Dock Tile/
├── My Dev Tools.app     → Helper for development apps
├── Creative Suite.app   → Helper for design apps
└── Quick Launch.app     → Helper for frequently used apps

~/Library/Preferences/com.docktile.configs.json
└── Shared configuration for all tiles

Ghost Mode vs App Mode

One of the trickiest problems was Cmd+Tab behavior. If users want the tiles in the dock but not in the app switcher, we had to make the launchers invisible. But macOS ties these together: hiding from Cmd+Tab meant that we lost the right-click context menu. The solution was a dual-mode architecture:

ModeCmd+TabContext MenuUse Case
Ghost ModeHiddenDisabledMinimal footprint
App ModeVisibleFull accessPower user features

This trade-off does not compromise the core function. The default is Ghost Mode, tiles appear in the Dock, respond to clicks, but stay out of the way.

Dock Tile icon customiser with colour, size and symbol options

The AI Collaboration

This project was my first deep experiment with AI-assisted native app development. Not "AI writes the code while I watch", but genuine collaboration.

What worked

Architecture discussions: Describing the helper bundle concept and having Claude identify edge cases I hadn't considered
API research: Understanding CFPreferences vs direct plist manipulation, with real code examples
Test writing: Generating comprehensive test cases, especially for encoding/decoding and backward compatibility
Documentation: Maintaining a living CLAUDE.md file that served as both context and knowledge base

What didn't

Complex UI layouts still required hands-on iteration in Xcode
Debugging runtime behavior (why is that icon not showing?) needed traditional investigation
Design decisions remained firmly human, AI could execute, but not originate aesthetic choices

The CLAUDE.md file became the project's brain. At 2,000+ lines, it contains architecture decisions, code patterns, debugging tips, and the full changelog. When context resets, this file rebuilds understanding almost instantly.

Once I was able to put together everything around customisation, configuration and a working prototype fairly quickly, then we had to spend the rest of the of the time building the testing the app, release pipeline and test automations. True to the Pareto principle, the final 20% of polish: code signing, notarisation, automated builds, took as much effort as the initial 80% of core functionality. Once that was established, the release build was set off and the final app is ready for use now.

Dock Tile's source code is available on GitHub for anyone interested in how it works under the hood, or to contribute to future features.

What I Learnt

macOS is different.

Coming from iOS, I expected similar patterns. Instead, I found AppKit, NSPopover, Launch Services, and a Dock that predates most modern APIs. The hybrid SwiftUI + AppKit approach was necessary, not a compromise.

AI changes the learning curve.

Topics that would have taken days of documentation study on CFPreferences, code signing entitlements, and icon generation at multiple scales became a quick, practical study. The AI didn't replace learning; it made it interesting.