This guide is for contributors and maintainers working on the Liney codebase.
- macOS 14+
- Xcode 16+ with command line tools
ghis optional and only needed for GitHub features and release publishing
Release builds also require the Metal toolchain component used by Ghostty:
xcodebuild -downloadComponent MetalToolchainxcodebuild \
-project Liney.xcodeproj \
-scheme Liney \
-configuration Debug \
-destination 'platform=macOS' \
buildxcodebuild \
-project Liney.xcodeproj \
-scheme Liney \
-destination 'platform=macOS' \
testopen ~/Library/Developer/Xcode/DerivedData/Liney-*/Build/Products/Debug/Liney.appLiney/
├─ App/
├─ Domain/
├─ Persistence/
├─ Services/
│ ├─ Git/
│ ├─ Process/
│ └─ Terminal/
│ └─ Ghostty/
├─ Support/
├─ UI/
└─ Vendor/
- Testing guide:
docs/testing.md - Terminal architecture:
docs/terminal-architecture.md - Ghostty vendor rebuild:
docs/build_ghostty.md - Feature backlog:
docs/feature-backlog.md - Release process:
RELEASING.md - Contributing guide:
CONTRIBUTING.md - Security policy:
SECURITY.md
Liney stores workspace state and app settings in ~/.liney/, and still reads legacy state from ~/Library/Application Support/Liney/ when present.
scripts/build_macos_app.sh
open dist/Liney.appOptional variables:
SIGNING_IDENTITY="Developer ID Application: Your Name (TEAMID)"to sign the.appOUTPUT_DIR=/custom/output/pathto change the output folderRELEASE_ARCHS="arm64 x86_64"to override the default universal macOS artifact
The committed GhosttyKit.xcframework now includes both macOS arm64 and x86_64 slices, so the default release build emits a universal app bundle and DMG.
If you need to rebuild the vendored Ghostty xcframework, see docs/build_ghostty.md.
The build script emits:
dist/Liney.appdist/Liney-<version>.dmg
Liney uses Sparkle for signed app updates.
To prepare the signing key on a release machine:
scripts/setup_sparkle_keys.shThis exports the private key to ~/.liney_release/sparkle_private_key and prints the public key that must stay in the app target's SUPublicEDKey.
Because Liney is open source, keep the private key outside this repository. A private release-infra repo, CI secret store, or dedicated release machine is the right place for it.
The root release entrypoint is:
./deploy.shBy default it:
- bumps the patch version
- increments the build number by 1
- signs and notarizes universal release artifacts
- updates GitHub releases, Sparkle appcast metadata, and the Homebrew tap
scripts/deploy.sh still exists as a compatibility wrapper.
- The main supported local development path is the Xcode project
- Ghostty is required for the terminal stack
- Worktree switching restarts active panes after confirmation so their cwd always matches the newly selected worktree
- Session persistence restores per-worktree layout, zoom state, and pane cwd, but relaunch still recreates fresh shell processes
- Some GitHub workflow features expect
ghto be installed and authenticated