A native Mac app for Claude Code.
Kiln runs Claude Code as a proper desktop app instead of another terminal tab. Sessions live in a sidebar, approvals pop up as real dialogs, and the whole thing feels like the rest of your Mac. Built in SwiftUI. macOS 14 or later, Apple Silicon or Intel.
I wanted the feel of a native editor — command palette, keyboard shortcuts, a sidebar — without giving up Claude Code's terminal-native workflow underneath. So Kiln wraps the CLI, keeps a session per project, and adds the stuff that's awkward to do in a terminal: per-session tunnels, remote control from another device, real video/image previews, clean export.
It's still early. I use it every day; you might want to wait.
Clone and build:
git clone https://github.com/raya-ac/kiln
cd kiln
swift build -c release
open .build/release/KilnThat gets you the raw binary. To produce a real Kiln.app bundle (the kind Finder recognises, with auto-updates wired up):
./scripts/make-app-bundle.sh 0.1.0 arm64 # Apple Silicon
./scripts/make-app-bundle.sh 0.1.0 x86_64 # Intel
open dist/arm64/Kiln.appEither works fine for trying it out.
Push a tag like v0.1.0 and GitHub Actions will:
- Build separate Apple Silicon and Intel
.appbundles. - Code-sign and notarise them (if you've added the Apple secrets).
- Sign both zips with Sparkle's EdDSA key.
- Regenerate
appcast.xml— Sparkle reads the binary of each zip and stamps the correct architecture on the feed item, so each Mac pulls the build that matches it. - Commit the new
appcast.xmlback tomainand publish a GitHub release with both zips attached.
Inside the app, Kiln → Check for Updates… hits that appcast. Scheduled checks run once a day.
If you're forking this, you'll need a few secrets on your repo at Settings → Secrets and variables → Actions.
For Sparkle (required for auto-updates to actually verify):
| Secret | Why |
|---|---|
SPARKLE_ED_PRIVATE_KEY |
Signs the update zips. Keep it safe. |
SPARKLE_ED_PUBLIC_KEY |
Embedded in the app so it can verify updates came from you. |
Generate the pair once:
curl -LO https://github.com/sparkle-project/Sparkle/releases/download/2.6.4/Sparkle-2.6.4.tar.xz
tar -xJf Sparkle-2.6.4.tar.xz
./bin/generate_keys # adds private key to your Keychain; prints the public half
./bin/generate_keys -x # prints the private key — base64 it for the GH secretFor Apple code-signing and notarisation (optional — leave blank and the workflow skips these steps, but users will see a Gatekeeper warning on first launch):
| Secret | Why |
|---|---|
APPLE_CERT_P12 |
Your Developer ID Application cert exported as a .p12, base64-encoded. |
APPLE_CERT_P12_PASSWORD |
Password you set on the .p12. |
APPLE_CODESIGN_IDENTITY |
e.g. Developer ID Application: Your Name (TEAMID). |
APPLE_API_KEY_P8 |
App Store Connect API key for notarytool, base64-encoded. |
APPLE_API_KEY_ID |
The 10-char key ID. |
APPLE_API_ISSUER_ID |
Issuer UUID from App Store Connect. |
Sources/
App/ entry point, AppDelegate
Views/ SwiftUI views — sidebar, chat, settings
Services/ AppStore, Claude subprocess, remote control, tunnels, updater
Models/ domain types
scripts/ make-app-bundle.sh + entitlements
.github/ CI + release workflows
Common commands are wrapped in a Makefile:
make # lists everything
make run # debug build + open the binary
make bundle VERSION=0.2.0 ARCH=arm64
make lint # swift-format --lint
make format # swift-format --in-place
make logo # re-render the brand mark
make ci-local # run everything CI runs, locallyIt's a personal project but PRs are welcome. Build with swift build, run with open .build/debug/Kiln (or the release variant), and the CI workflow will catch the obvious stuff. See CONTRIBUTING.md for the shape of a good patch and CODE_OF_CONDUCT.md for how we behave in issues and PRs.
Security issues: please don't file them as public issues — see SECURITY.md.
MIT.
