diff --git a/.github/workflows/Xcode-build-analyze.yml b/.github/workflows/Xcode-build-analyze.yml
index c0e0fef..bbdcb2d 100644
--- a/.github/workflows/Xcode-build-analyze.yml
+++ b/.github/workflows/Xcode-build-analyze.yml
@@ -22,20 +22,20 @@ jobs:
xcodebuild -version
- name: Resolve packages
- run: xcodebuild -resolvePackageDependencies -project hellbender.xcodeproj -scheme hellbender
+ run: xcodebuild -resolvePackageDependencies -project birch.xcodeproj -scheme birch
- name: Validate Package.resolved
run: |
- if ! git diff --quiet hellbender.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved; then
+ if ! git diff --quiet birch.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved; then
echo "::error::Package.resolved has uncommitted changes after resolution. Commit the updated Package.resolved."
- git diff hellbender.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
+ git diff birch.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
exit 1
fi
- name: Build
env:
- scheme: hellbender
- file_to_build: hellbender.xcodeproj
+ scheme: birch
+ file_to_build: birch.xcodeproj
filetype_parameter: project
run: |
xcodebuild clean build analyze -scheme "$scheme" -"$filetype_parameter" "$file_to_build" CODE_SIGNING_ALLOWED=NO | xcpretty && exit ${PIPESTATUS[0]}
diff --git a/.github/workflows/Xcode-unit-tests.yml b/.github/workflows/Xcode-unit-tests.yml
index 30fad91..fd876fd 100644
--- a/.github/workflows/Xcode-unit-tests.yml
+++ b/.github/workflows/Xcode-unit-tests.yml
@@ -17,4 +17,4 @@ jobs:
- name: Run Unit Tests
run: |
- xcodebuild test -project hellbender.xcodeproj -scheme hellbender -destination 'platform=iOS Simulator,name=iPhone 17 Pro' -only-testing:hellbenderTests -parallel-testing-enabled NO CODE_SIGNING_ALLOWED=NO | xcpretty && exit ${PIPESTATUS[0]}
+ xcodebuild test -project birch.xcodeproj -scheme birch -destination 'platform=iOS Simulator,name=iPhone 17 Pro' -only-testing:birchTests -parallel-testing-enabled NO CODE_SIGNING_ALLOWED=NO | xcpretty && exit ${PIPESTATUS[0]}
diff --git a/.github/workflows/reproducible-build-check.yml b/.github/workflows/reproducible-build-check.yml
index 4c20664..1fdb687 100644
--- a/.github/workflows/reproducible-build-check.yml
+++ b/.github/workflows/reproducible-build-check.yml
@@ -23,12 +23,12 @@ jobs:
- name: Build 1
run: |
- DERIVED_DATA="/tmp/hellbender-build-1"
+ DERIVED_DATA="/tmp/birch-build-1"
rm -rf "$DERIVED_DATA"
xcodebuild archive \
- -scheme hellbender \
- -project hellbender.xcodeproj \
- -archivePath "$DERIVED_DATA/hellbender.xcarchive" \
+ -scheme birch \
+ -project birch.xcodeproj \
+ -archivePath "$DERIVED_DATA/birch.xcarchive" \
-derivedDataPath "$DERIVED_DATA" \
-configuration Release \
CODE_SIGNING_ALLOWED=NO \
@@ -37,12 +37,12 @@ jobs:
- name: Build 2
run: |
- DERIVED_DATA="/tmp/hellbender-build-2"
+ DERIVED_DATA="/tmp/birch-build-2"
rm -rf "$DERIVED_DATA"
xcodebuild archive \
- -scheme hellbender \
- -project hellbender.xcodeproj \
- -archivePath "$DERIVED_DATA/hellbender.xcarchive" \
+ -scheme birch \
+ -project birch.xcodeproj \
+ -archivePath "$DERIVED_DATA/birch.xcarchive" \
-derivedDataPath "$DERIVED_DATA" \
-configuration Release \
CODE_SIGNING_ALLOWED=NO \
@@ -51,13 +51,13 @@ jobs:
- name: Normalize both builds
run: |
- APP1="/tmp/hellbender-build-1/hellbender.xcarchive/Products/Applications/hellbender.app"
- APP2="/tmp/hellbender-build-2/hellbender.xcarchive/Products/Applications/hellbender.app"
+ APP1="/tmp/birch-build-1/birch.xcarchive/Products/Applications/birch.app"
+ APP2="/tmp/birch-build-2/birch.xcarchive/Products/Applications/birch.app"
./scripts/normalize-app.sh "$APP1"
./scripts/normalize-app.sh "$APP2"
- name: Compare builds
run: |
- APP1="/tmp/hellbender-build-1/hellbender.xcarchive/Products/Applications/hellbender.app"
- APP2="/tmp/hellbender-build-2/hellbender.xcarchive/Products/Applications/hellbender.app"
+ APP1="/tmp/birch-build-1/birch.xcarchive/Products/Applications/birch.app"
+ APP2="/tmp/birch-build-2/birch.xcarchive/Products/Applications/birch.app"
./scripts/compare-builds.sh "$APP1" "$APP2"
diff --git a/Config/Hellbender.xcconfig b/Config/Birch.xcconfig
similarity index 64%
rename from Config/Hellbender.xcconfig
rename to Config/Birch.xcconfig
index 4925970..64a68f2 100644
--- a/Config/Hellbender.xcconfig
+++ b/Config/Birch.xcconfig
@@ -1,12 +1,14 @@
-// Hellbender.xcconfig — Target-level settings for the hellbender app target
+// Birch.xcconfig — Target-level settings for the birch app target
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon
+ASSETCATALOG_COMPILER_ALTERNATE_APPICON_NAMES = AppIcon-Dark
+ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor
CODE_SIGN_STYLE = Automatic
CURRENT_PROJECT_VERSION = 23
-DEVELOPMENT_ASSET_PATHS = "hellbender/Preview Content"
+DEVELOPMENT_ASSET_PATHS = "birch/Preview Content"
GENERATE_INFOPLIST_FILE = NO
-INFOPLIST_FILE = hellbender/Info.plist
+INFOPLIST_FILE = birch/Info.plist
IPHONEOS_DEPLOYMENT_TARGET = 18.6
LD_RUNPATH_SEARCH_PATHS = $(inherited) @executable_path/Frameworks
MARKETING_VERSION = 0.1.2
diff --git a/README.md b/README.md
index 462a75e..a2c893b 100644
--- a/README.md
+++ b/README.md
@@ -1,29 +1,29 @@
-
+
-Hellbender
+Birch
Travel to your private keys and leave your laptop at home.
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
---
-Hellbender is an iOS Bitcoin multisig coordinator written in Swift. It operates as a **watch-only wallet** — private keys never touch your phone. Coordinate signing across air-gapped hardware wallets using animated QR codes, bringing cold storage security with mobile convenience.
+Birch is an iOS Bitcoin multisig coordinator written in Swift. It operates as a **watch-only wallet** — private keys never touch your phone. Coordinate signing across air-gapped hardware wallets using animated QR codes, bringing cold storage security with mobile convenience.
## Features
@@ -65,7 +65,7 @@ All dependencies are managed via Swift Package Manager and resolve automatically
git clone https://github.com/newtonick/hellbender-wallet.git
cd hellbender-wallet
```
-2. Open `hellbender.xcodeproj` in Xcode
+2. Open `birch.xcodeproj` in Xcode
3. SPM dependencies resolve automatically on first open
4. Build and run on a simulator or device
@@ -77,7 +77,7 @@ GitHub Actions runs `xcodebuild clean build analyze` on every push and pull requ
### Reproducible Builds
-Hellbender supports **functionally equivalent** reproducible builds. Given the same source code and Xcode version, two independent builds will produce the same compiled logic after normalization. Certain metadata bytes (Mach-O UUIDs, timestamps, build-machine identifiers) are expected to differ and are zeroed by the normalization step.
+Birch supports **functionally equivalent** reproducible builds. Given the same source code and Xcode version, two independent builds will produce the same compiled logic after normalization. Certain metadata bytes (Mach-O UUIDs, timestamps, build-machine identifiers) are expected to differ and are zeroed by the normalization step.
**What IS reproducible** (after normalization): all code-bearing sections, resources, and application logic.
@@ -94,7 +94,7 @@ Hellbender supports **functionally equivalent** reproducible builds. Given the s
./scripts/build-release.sh
```
-This creates an unsigned archive at `/tmp/hellbender-build/hellbender.xcarchive`.
+This creates an unsigned archive at `/tmp/birch-build/birch.xcarchive`.
#### Verifying two builds
@@ -111,7 +111,7 @@ The comparison exits 0 if the builds are functionally equivalent, 1 if code diff
## Generating Screenshots
-Hellbender uses [`fastlane snapshot`](https://docs.fastlane.tools/actions/snapshot/) to generate marketing and App Store screenshots. A single UI test walks the app from Welcome through the main tabs, capturing every major screen on each configured device in both dark and light mode.
+Birch uses [`fastlane snapshot`](https://docs.fastlane.tools/actions/snapshot/) to generate marketing and App Store screenshots. A single UI test walks the app from Welcome through the main tabs, capturing every major screen on each configured device in both dark and light mode.
### One-time setup
@@ -188,7 +188,7 @@ fastlane/screenshots/
### How it works
-- [`hellbenderUITests/ScreenshotTests.swift`](hellbenderUITests/ScreenshotTests.swift) is a dedicated XCUITest that walks the app. It reuses the existing `-UITesting` launch argument (defined in `hellbender/hellbenderApp.swift`), which wipes `UserDefaults`/keychain and uses an in-memory SwiftData store so every run starts from a deterministic Welcome screen.
+- [`birchUITests/ScreenshotTests.swift`](birchUITests/ScreenshotTests.swift) is a dedicated XCUITest that walks the app. It reuses the existing `-UITesting` launch argument (defined in `birch/birchApp.swift`), which wipes `UserDefaults`/keychain and uses an in-memory SwiftData store so every run starts from a deterministic Welcome screen.
- The test imports a real testnet4 1-of-2 `wsh(sortedmulti(...))` descriptor with live history, waits for Electrum sync, then visits each screen.
- Dark/light mode is driven by the simulator's OS appearance (`xcrun simctl ui ... appearance`). The app's `RootView` follows the OS when the theme is set to `.system`, which it is by default after the `-UITesting` wipe, so no app-side toggle is required.
- The device matrix, scheme, status bar override, and other `snapshot` options live in [`fastlane/Snapfile`](fastlane/Snapfile). Device destinations (simulator OS version), the frameit pass, and the custom 13 mini ImageMagick composite all live in [`fastlane/Fastfile`](fastlane/Fastfile).
@@ -196,14 +196,14 @@ fastlane/screenshots/
### Customizing
- **Add/remove devices:** edit both the `devices([...])` array in `fastlane/Snapfile` and the `DEVICES` hash in `fastlane/Fastfile`.
-- **Change which screens are captured:** edit `testScreenshotTour` in `hellbenderUITests/ScreenshotTests.swift` and add or remove `snapshot("NN-Name")` calls.
+- **Change which screens are captured:** edit `testScreenshotTour` in `birchUITests/ScreenshotTests.swift` and add or remove `snapshot("NN-Name")` calls.
- **Skip framing:** remove the `frameit(...)` lines and the ImageMagick composite block (steps 4–7) from `fastlane/Fastfile` if you only need the bare PNGs.
> **Known workaround** (contained in `fastlane/Fastfile`): `frameit` gem 2.232.2's bundled iPhone 13 Mini frame PNG has a ~3-pixel placement-offset bug that leaves a visible edge gap, so 13 mini is composited directly with ImageMagick instead. iPhone 16/17 device support is patched in via `scripts/patch-frameit.rb` (see setup step 4 above).
## Links
-- **Website**: [hellbenderwallet.com](https://hellbenderwallet.com)
+- **Website**: [birchwallet.app](https://birchwallet.app)
- **TestFlight Beta**: [Join the beta](https://testflight.apple.com/join/PuHVwJDJ)
- **Author**: [newtonick](https://github.com/newtonick/hellbender-wallet/)
@@ -211,5 +211,5 @@ fastlane/screenshots/
MIT License — see [LICENSE](LICENSE) for details.
-Hellbender's dependencies use permissive licenses compatible with MIT:
+Birch's dependencies use permissive licenses compatible with MIT:
bdk-swift (MIT/Apache-2.0), URKit (BSD-2-Clause-Patent), URUI (BSD-2-Clause-Patent), Bbqr (Apache-2.0).
diff --git a/hellbender.xcodeproj/project.pbxproj b/birch.xcodeproj/project.pbxproj
similarity index 81%
rename from hellbender.xcodeproj/project.pbxproj
rename to birch.xcodeproj/project.pbxproj
index d8aa5d2..2abe21f 100644
--- a/hellbender.xcodeproj/project.pbxproj
+++ b/birch.xcodeproj/project.pbxproj
@@ -20,54 +20,54 @@
containerPortal = 3C9ACE1C2F5DED94009B00D0 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 3C9ACE232F5DED94009B00D0;
- remoteInfo = hellbender;
+ remoteInfo = birch;
};
3C9ACE3F2F5DED95009B00D0 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 3C9ACE1C2F5DED94009B00D0 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 3C9ACE232F5DED94009B00D0;
- remoteInfo = hellbender;
+ remoteInfo = birch;
};
/* End PBXContainerItemProxy section */
/* Begin PBXFileReference section */
- 3C9ACE242F5DED94009B00D0 /* hellbender.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = hellbender.app; sourceTree = BUILT_PRODUCTS_DIR; };
- 3C9ACE342F5DED95009B00D0 /* hellbenderTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = hellbenderTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
- 3C9ACE3E2F5DED95009B00D0 /* hellbenderUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = hellbenderUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
+ 3C9ACE242F5DED94009B00D0 /* birch.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = birch.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ 3C9ACE342F5DED95009B00D0 /* birchTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = birchTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
+ 3C9ACE3E2F5DED95009B00D0 /* birchUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = birchUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
CC0000010000000000000001 /* Base.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Base.xcconfig; sourceTree = ""; };
CC0000010000000000000002 /* Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; };
CC0000010000000000000003 /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; };
- CC0000010000000000000004 /* Hellbender.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Hellbender.xcconfig; sourceTree = ""; };
+ CC0000010000000000000004 /* Birch.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Birch.xcconfig; sourceTree = ""; };
/* End PBXFileReference section */
/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */
- CC0000010000000000000006 /* Exceptions for "hellbender" folder in "hellbender" target */ = {
+ CC0000010000000000000006 /* Exceptions for "birch" folder in "birch" target */ = {
isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
membershipExceptions = (
Info.plist,
);
- target = 3C9ACE232F5DED94009B00D0 /* hellbender */;
+ target = 3C9ACE232F5DED94009B00D0 /* birch */;
};
/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */
/* Begin PBXFileSystemSynchronizedRootGroup section */
- 3C9ACE262F5DED94009B00D0 /* hellbender */ = {
+ 3C9ACE262F5DED94009B00D0 /* birch */ = {
isa = PBXFileSystemSynchronizedRootGroup;
exceptions = (
- CC0000010000000000000006 /* Exceptions for "hellbender" folder in "hellbender" target */,
+ CC0000010000000000000006 /* Exceptions for "birch" folder in "birch" target */,
);
- path = hellbender;
+ path = birch;
sourceTree = "";
};
- 3C9ACE372F5DED95009B00D0 /* hellbenderTests */ = {
+ 3C9ACE372F5DED95009B00D0 /* birchTests */ = {
isa = PBXFileSystemSynchronizedRootGroup;
- path = hellbenderTests;
+ path = birchTests;
sourceTree = "";
};
- 3C9ACE412F5DED95009B00D0 /* hellbenderUITests */ = {
+ 3C9ACE412F5DED95009B00D0 /* birchUITests */ = {
isa = PBXFileSystemSynchronizedRootGroup;
- path = hellbenderUITests;
+ path = birchUITests;
sourceTree = "";
};
/* End PBXFileSystemSynchronizedRootGroup section */
@@ -106,9 +106,9 @@
isa = PBXGroup;
children = (
CC0000010000000000000005 /* Config */,
- 3C9ACE262F5DED94009B00D0 /* hellbender */,
- 3C9ACE372F5DED95009B00D0 /* hellbenderTests */,
- 3C9ACE412F5DED95009B00D0 /* hellbenderUITests */,
+ 3C9ACE262F5DED94009B00D0 /* birch */,
+ 3C9ACE372F5DED95009B00D0 /* birchTests */,
+ 3C9ACE412F5DED95009B00D0 /* birchUITests */,
3C9ACE252F5DED94009B00D0 /* Products */,
);
sourceTree = "";
@@ -116,9 +116,9 @@
3C9ACE252F5DED94009B00D0 /* Products */ = {
isa = PBXGroup;
children = (
- 3C9ACE242F5DED94009B00D0 /* hellbender.app */,
- 3C9ACE342F5DED95009B00D0 /* hellbenderTests.xctest */,
- 3C9ACE3E2F5DED95009B00D0 /* hellbenderUITests.xctest */,
+ 3C9ACE242F5DED94009B00D0 /* birch.app */,
+ 3C9ACE342F5DED95009B00D0 /* birchTests.xctest */,
+ 3C9ACE3E2F5DED95009B00D0 /* birchUITests.xctest */,
);
name = Products;
sourceTree = "";
@@ -128,7 +128,7 @@
children = (
CC0000010000000000000001 /* Base.xcconfig */,
CC0000010000000000000002 /* Debug.xcconfig */,
- CC0000010000000000000004 /* Hellbender.xcconfig */,
+ CC0000010000000000000004 /* Birch.xcconfig */,
CC0000010000000000000003 /* Release.xcconfig */,
);
path = Config;
@@ -137,9 +137,9 @@
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
- 3C9ACE232F5DED94009B00D0 /* hellbender */ = {
+ 3C9ACE232F5DED94009B00D0 /* birch */ = {
isa = PBXNativeTarget;
- buildConfigurationList = 3C9ACE482F5DED95009B00D0 /* Build configuration list for PBXNativeTarget "hellbender" */;
+ buildConfigurationList = 3C9ACE482F5DED95009B00D0 /* Build configuration list for PBXNativeTarget "birch" */;
buildPhases = (
3C9ACE202F5DED94009B00D0 /* Sources */,
3C9ACE212F5DED94009B00D0 /* Frameworks */,
@@ -150,9 +150,9 @@
dependencies = (
);
fileSystemSynchronizedGroups = (
- 3C9ACE262F5DED94009B00D0 /* hellbender */,
+ 3C9ACE262F5DED94009B00D0 /* birch */,
);
- name = hellbender;
+ name = birch;
packageProductDependencies = (
AA00000500000000000000D0 /* URKit */,
AA00000800000000000000D0 /* URUI */,
@@ -160,13 +160,13 @@
3C1E1C452F7B0D99002FDAE2 /* BitcoinDevKit */,
3C1E1FA42F7B5F63002FDAE2 /* BitcoinDevKit */,
);
- productName = hellbender;
- productReference = 3C9ACE242F5DED94009B00D0 /* hellbender.app */;
+ productName = birch;
+ productReference = 3C9ACE242F5DED94009B00D0 /* birch.app */;
productType = "com.apple.product-type.application";
};
- 3C9ACE332F5DED95009B00D0 /* hellbenderTests */ = {
+ 3C9ACE332F5DED95009B00D0 /* birchTests */ = {
isa = PBXNativeTarget;
- buildConfigurationList = 3C9ACE4B2F5DED95009B00D0 /* Build configuration list for PBXNativeTarget "hellbenderTests" */;
+ buildConfigurationList = 3C9ACE4B2F5DED95009B00D0 /* Build configuration list for PBXNativeTarget "birchTests" */;
buildPhases = (
3C9ACE302F5DED95009B00D0 /* Sources */,
3C9ACE312F5DED95009B00D0 /* Frameworks */,
@@ -178,18 +178,18 @@
3C9ACE362F5DED95009B00D0 /* PBXTargetDependency */,
);
fileSystemSynchronizedGroups = (
- 3C9ACE372F5DED95009B00D0 /* hellbenderTests */,
+ 3C9ACE372F5DED95009B00D0 /* birchTests */,
);
- name = hellbenderTests;
+ name = birchTests;
packageProductDependencies = (
);
- productName = hellbenderTests;
- productReference = 3C9ACE342F5DED95009B00D0 /* hellbenderTests.xctest */;
+ productName = birchTests;
+ productReference = 3C9ACE342F5DED95009B00D0 /* birchTests.xctest */;
productType = "com.apple.product-type.bundle.unit-test";
};
- 3C9ACE3D2F5DED95009B00D0 /* hellbenderUITests */ = {
+ 3C9ACE3D2F5DED95009B00D0 /* birchUITests */ = {
isa = PBXNativeTarget;
- buildConfigurationList = 3C9ACE4E2F5DED95009B00D0 /* Build configuration list for PBXNativeTarget "hellbenderUITests" */;
+ buildConfigurationList = 3C9ACE4E2F5DED95009B00D0 /* Build configuration list for PBXNativeTarget "birchUITests" */;
buildPhases = (
3C9ACE3A2F5DED95009B00D0 /* Sources */,
3C9ACE3B2F5DED95009B00D0 /* Frameworks */,
@@ -201,13 +201,13 @@
3C9ACE402F5DED95009B00D0 /* PBXTargetDependency */,
);
fileSystemSynchronizedGroups = (
- 3C9ACE412F5DED95009B00D0 /* hellbenderUITests */,
+ 3C9ACE412F5DED95009B00D0 /* birchUITests */,
);
- name = hellbenderUITests;
+ name = birchUITests;
packageProductDependencies = (
);
- productName = hellbenderUITests;
- productReference = 3C9ACE3E2F5DED95009B00D0 /* hellbenderUITests.xctest */;
+ productName = birchUITests;
+ productReference = 3C9ACE3E2F5DED95009B00D0 /* birchUITests.xctest */;
productType = "com.apple.product-type.bundle.ui-testing";
};
/* End PBXNativeTarget section */
@@ -233,7 +233,7 @@
};
};
};
- buildConfigurationList = 3C9ACE1F2F5DED94009B00D0 /* Build configuration list for PBXProject "hellbender" */;
+ buildConfigurationList = 3C9ACE1F2F5DED94009B00D0 /* Build configuration list for PBXProject "birch" */;
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
@@ -253,9 +253,9 @@
projectDirPath = "";
projectRoot = "";
targets = (
- 3C9ACE232F5DED94009B00D0 /* hellbender */,
- 3C9ACE332F5DED95009B00D0 /* hellbenderTests */,
- 3C9ACE3D2F5DED95009B00D0 /* hellbenderUITests */,
+ 3C9ACE232F5DED94009B00D0 /* birch */,
+ 3C9ACE332F5DED95009B00D0 /* birchTests */,
+ 3C9ACE3D2F5DED95009B00D0 /* birchUITests */,
);
};
/* End PBXProject section */
@@ -311,12 +311,12 @@
/* Begin PBXTargetDependency section */
3C9ACE362F5DED95009B00D0 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
- target = 3C9ACE232F5DED94009B00D0 /* hellbender */;
+ target = 3C9ACE232F5DED94009B00D0 /* birch */;
targetProxy = 3C9ACE352F5DED95009B00D0 /* PBXContainerItemProxy */;
};
3C9ACE402F5DED95009B00D0 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
- target = 3C9ACE232F5DED94009B00D0 /* hellbender */;
+ target = 3C9ACE232F5DED94009B00D0 /* birch */;
targetProxy = 3C9ACE3F2F5DED95009B00D0 /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
@@ -326,6 +326,7 @@
isa = XCBuildConfiguration;
baseConfigurationReference = CC0000010000000000000002 /* Debug.xcconfig */;
buildSettings = {
+ DEVELOPMENT_TEAM = ZW85AH743B;
};
name = Debug;
};
@@ -333,22 +334,25 @@
isa = XCBuildConfiguration;
baseConfigurationReference = CC0000010000000000000003 /* Release.xcconfig */;
buildSettings = {
+ DEVELOPMENT_TEAM = ZW85AH743B;
};
name = Release;
};
3C9ACE492F5DED95009B00D0 /* Debug */ = {
isa = XCBuildConfiguration;
- baseConfigurationReference = CC0000010000000000000004 /* Hellbender.xcconfig */;
+ baseConfigurationReference = CC0000010000000000000004 /* Birch.xcconfig */;
buildSettings = {
- CURRENT_PROJECT_VERSION = 24;
+ CURRENT_PROJECT_VERSION = 25;
+ MARKETING_VERSION = 0.2.0;
};
name = Debug;
};
3C9ACE4A2F5DED95009B00D0 /* Release */ = {
isa = XCBuildConfiguration;
- baseConfigurationReference = CC0000010000000000000004 /* Hellbender.xcconfig */;
+ baseConfigurationReference = CC0000010000000000000004 /* Birch.xcconfig */;
buildSettings = {
- CURRENT_PROJECT_VERSION = 24;
+ CURRENT_PROJECT_VERSION = 25;
+ MARKETING_VERSION = 0.2.0;
};
name = Release;
};
@@ -366,7 +370,7 @@
SWIFT_EMIT_LOC_STRINGS = NO;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
- TEST_HOST = "$(BUILT_PRODUCTS_DIR)/hellbender.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/hellbender";
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/birch.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/birch";
};
name = Debug;
};
@@ -384,7 +388,7 @@
SWIFT_EMIT_LOC_STRINGS = NO;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
- TEST_HOST = "$(BUILT_PRODUCTS_DIR)/hellbender.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/hellbender";
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/birch.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/birch";
};
name = Release;
};
@@ -400,7 +404,7 @@
SWIFT_EMIT_LOC_STRINGS = NO;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
- TEST_TARGET_NAME = hellbender;
+ TEST_TARGET_NAME = birch;
};
name = Debug;
};
@@ -416,14 +420,14 @@
SWIFT_EMIT_LOC_STRINGS = NO;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
- TEST_TARGET_NAME = hellbender;
+ TEST_TARGET_NAME = birch;
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
- 3C9ACE1F2F5DED94009B00D0 /* Build configuration list for PBXProject "hellbender" */ = {
+ 3C9ACE1F2F5DED94009B00D0 /* Build configuration list for PBXProject "birch" */ = {
isa = XCConfigurationList;
buildConfigurations = (
3C9ACE462F5DED95009B00D0 /* Debug */,
@@ -432,7 +436,7 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
- 3C9ACE482F5DED95009B00D0 /* Build configuration list for PBXNativeTarget "hellbender" */ = {
+ 3C9ACE482F5DED95009B00D0 /* Build configuration list for PBXNativeTarget "birch" */ = {
isa = XCConfigurationList;
buildConfigurations = (
3C9ACE492F5DED95009B00D0 /* Debug */,
@@ -441,7 +445,7 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
- 3C9ACE4B2F5DED95009B00D0 /* Build configuration list for PBXNativeTarget "hellbenderTests" */ = {
+ 3C9ACE4B2F5DED95009B00D0 /* Build configuration list for PBXNativeTarget "birchTests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
3C9ACE4C2F5DED95009B00D0 /* Debug */,
@@ -450,7 +454,7 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
- 3C9ACE4E2F5DED95009B00D0 /* Build configuration list for PBXNativeTarget "hellbenderUITests" */ = {
+ 3C9ACE4E2F5DED95009B00D0 /* Build configuration list for PBXNativeTarget "birchUITests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
3C9ACE4F2F5DED95009B00D0 /* Debug */,
diff --git a/hellbender.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/birch.xcodeproj/project.xcworkspace/contents.xcworkspacedata
similarity index 100%
rename from hellbender.xcodeproj/project.xcworkspace/contents.xcworkspacedata
rename to birch.xcodeproj/project.xcworkspace/contents.xcworkspacedata
diff --git a/hellbender.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/birch.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
similarity index 100%
rename from hellbender.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
rename to birch.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
diff --git a/hellbender.xcodeproj/xcshareddata/xcschemes/hellbender.xcscheme b/birch.xcodeproj/xcshareddata/xcschemes/birch.xcscheme
similarity index 78%
rename from hellbender.xcodeproj/xcshareddata/xcschemes/hellbender.xcscheme
rename to birch.xcodeproj/xcshareddata/xcschemes/birch.xcscheme
index 492bf5b..aab8f75 100644
--- a/hellbender.xcodeproj/xcshareddata/xcschemes/hellbender.xcscheme
+++ b/birch.xcodeproj/xcshareddata/xcschemes/birch.xcscheme
@@ -16,9 +16,9 @@
+ BuildableName = "birch.app"
+ BlueprintName = "birch"
+ ReferencedContainer = "container:birch.xcodeproj">
@@ -36,9 +36,9 @@
+ BuildableName = "birchTests.xctest"
+ BlueprintName = "birchTests"
+ ReferencedContainer = "container:birch.xcodeproj">
+ BuildableName = "birchUITests.xctest"
+ BlueprintName = "birchUITests"
+ ReferencedContainer = "container:birch.xcodeproj">
@@ -69,9 +69,9 @@
+ BuildableName = "birch.app"
+ BlueprintName = "birch"
+ ReferencedContainer = "container:birch.xcodeproj">
@@ -86,9 +86,9 @@
+ BuildableName = "birch.app"
+ BlueprintName = "birch"
+ ReferencedContainer = "container:birch.xcodeproj">
diff --git a/hellbender/Assets.xcassets/AccentColor.colorset/Contents.json b/birch/Assets.xcassets/AccentColor.colorset/Contents.json
similarity index 100%
rename from hellbender/Assets.xcassets/AccentColor.colorset/Contents.json
rename to birch/Assets.xcassets/AccentColor.colorset/Contents.json
diff --git a/birch/Assets.xcassets/AppIcon-Dark.appiconset/AppIcon.png b/birch/Assets.xcassets/AppIcon-Dark.appiconset/AppIcon.png
new file mode 100644
index 0000000..7275064
Binary files /dev/null and b/birch/Assets.xcassets/AppIcon-Dark.appiconset/AppIcon.png differ
diff --git a/birch/Assets.xcassets/AppIcon-Dark.appiconset/Contents.json b/birch/Assets.xcassets/AppIcon-Dark.appiconset/Contents.json
new file mode 100644
index 0000000..cefcc87
--- /dev/null
+++ b/birch/Assets.xcassets/AppIcon-Dark.appiconset/Contents.json
@@ -0,0 +1,14 @@
+{
+ "images" : [
+ {
+ "filename" : "AppIcon.png",
+ "idiom" : "universal",
+ "platform" : "ios",
+ "size" : "1024x1024"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/birch/Assets.xcassets/AppIcon.appiconset/AppIcon.png b/birch/Assets.xcassets/AppIcon.appiconset/AppIcon.png
new file mode 100644
index 0000000..256e989
Binary files /dev/null and b/birch/Assets.xcassets/AppIcon.appiconset/AppIcon.png differ
diff --git a/birch/Assets.xcassets/AppIcon.appiconset/Contents.json b/birch/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 0000000..cefcc87
--- /dev/null
+++ b/birch/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,14 @@
+{
+ "images" : [
+ {
+ "filename" : "AppIcon.png",
+ "idiom" : "universal",
+ "platform" : "ios",
+ "size" : "1024x1024"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/birch/Assets.xcassets/AppIconPreviewDark.imageset/AppIcon.png b/birch/Assets.xcassets/AppIconPreviewDark.imageset/AppIcon.png
new file mode 100644
index 0000000..7275064
Binary files /dev/null and b/birch/Assets.xcassets/AppIconPreviewDark.imageset/AppIcon.png differ
diff --git a/hellbender/Assets.xcassets/WelcomeIcon.imageset/Contents.json b/birch/Assets.xcassets/AppIconPreviewDark.imageset/Contents.json
similarity index 81%
rename from hellbender/Assets.xcassets/WelcomeIcon.imageset/Contents.json
rename to birch/Assets.xcassets/AppIconPreviewDark.imageset/Contents.json
index 862e3d4..df110f9 100644
--- a/hellbender/Assets.xcassets/WelcomeIcon.imageset/Contents.json
+++ b/birch/Assets.xcassets/AppIconPreviewDark.imageset/Contents.json
@@ -6,12 +6,10 @@
"scale" : "1x"
},
{
- "filename" : "AppIcon.png",
"idiom" : "universal",
"scale" : "2x"
},
{
- "filename" : "AppIcon.png",
"idiom" : "universal",
"scale" : "3x"
}
@@ -20,4 +18,4 @@
"author" : "xcode",
"version" : 1
}
-}
\ No newline at end of file
+}
diff --git a/birch/Assets.xcassets/AppIconPreviewLight.imageset/AppIcon.png b/birch/Assets.xcassets/AppIconPreviewLight.imageset/AppIcon.png
new file mode 100644
index 0000000..256e989
Binary files /dev/null and b/birch/Assets.xcassets/AppIconPreviewLight.imageset/AppIcon.png differ
diff --git a/birch/Assets.xcassets/AppIconPreviewLight.imageset/Contents.json b/birch/Assets.xcassets/AppIconPreviewLight.imageset/Contents.json
new file mode 100644
index 0000000..df110f9
--- /dev/null
+++ b/birch/Assets.xcassets/AppIconPreviewLight.imageset/Contents.json
@@ -0,0 +1,21 @@
+{
+ "images" : [
+ {
+ "filename" : "AppIcon.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/hellbender/Assets.xcassets/Contents.json b/birch/Assets.xcassets/Contents.json
similarity index 100%
rename from hellbender/Assets.xcassets/Contents.json
rename to birch/Assets.xcassets/Contents.json
diff --git a/hellbender/ContentView.swift b/birch/ContentView.swift
similarity index 89%
rename from hellbender/ContentView.swift
rename to birch/ContentView.swift
index 1f97626..a067e67 100644
--- a/hellbender/ContentView.swift
+++ b/birch/ContentView.swift
@@ -3,7 +3,7 @@ import OSLog
import SwiftData
import SwiftUI
-private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "hellbender", category: "AppLifecycle")
+private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "birch", category: "AppLifecycle")
struct ContentView: View {
@Query private var wallets: [WalletProfile]
@@ -100,21 +100,26 @@ private struct PrivacyOverlayView: View {
Color.hbBackground
.ignoresSafeArea()
- Image("WelcomeIcon")
- .resizable()
- .aspectRatio(contentMode: .fit)
- .frame(width: 120, height: 120)
- .clipShape(RoundedRectangle(cornerRadius: 28, style: .continuous))
- .overlay(
- RoundedRectangle(cornerRadius: 28, style: .continuous)
- .stroke(Color.hbBackground, lineWidth: 24)
- .blur(radius: 12)
- .clipShape(RoundedRectangle(cornerRadius: 28, style: .continuous))
- )
- .overlay(
- RoundedRectangle(cornerRadius: 28, style: .continuous)
- .strokeBorder(Color.hbBorder.opacity(0.5), lineWidth: 1)
- )
+ VStack(spacing: 32) {
+ Spacer()
+
+ ThemedAppIcon()
+ .aspectRatio(contentMode: .fit)
+ .frame(width: 120, height: 120)
+ .clipShape(RoundedRectangle(cornerRadius: 28, style: .continuous))
+ .overlay(
+ RoundedRectangle(cornerRadius: 28, style: .continuous)
+ .stroke(Color.hbBackground, lineWidth: 24)
+ .blur(radius: 12)
+ .clipShape(RoundedRectangle(cornerRadius: 28, style: .continuous))
+ )
+
+ Text("Birch Wallet")
+ .font(.hbDisplay(34))
+ .foregroundStyle(Color.hbTextPrimary)
+
+ Spacer()
+ }
}
}
}
diff --git a/hellbender/Extensions/BDK+Extensions.swift b/birch/Extensions/BDK+Extensions.swift
similarity index 100%
rename from hellbender/Extensions/BDK+Extensions.swift
rename to birch/Extensions/BDK+Extensions.swift
diff --git a/hellbender/Info.plist b/birch/Info.plist
similarity index 61%
rename from hellbender/Info.plist
rename to birch/Info.plist
index fa87107..dd468a2 100644
--- a/hellbender/Info.plist
+++ b/birch/Info.plist
@@ -5,9 +5,49 @@
CFBundleDevelopmentRegion
$(DEVELOPMENT_LANGUAGE)
CFBundleDisplayName
- Hellbender
+ Birch Wallet
CFBundleExecutable
$(EXECUTABLE_NAME)
+ CFBundleIcons
+
+ CFBundlePrimaryIcon
+
+ CFBundleIconName
+ AppIcon
+
+ CFBundleAlternateIcons
+
+ AppIcon-Dark
+
+ CFBundleIconFiles
+
+ AppIcon-Dark
+
+ UIPrerenderedIcon
+
+
+
+
+ CFBundleIcons~ipad
+
+ CFBundlePrimaryIcon
+
+ CFBundleIconName
+ AppIcon
+
+ CFBundleAlternateIcons
+
+ AppIcon-Dark
+
+ CFBundleIconFiles
+
+ AppIcon-Dark
+
+ UIPrerenderedIcon
+
+
+
+
CFBundleIdentifier
$(PRODUCT_BUNDLE_IDENTIFIER)
CFBundleInfoDictionaryVersion
@@ -23,9 +63,9 @@
LSApplicationCategoryType
public.app-category.finance
NSCameraUsageDescription
- Hellbender needs camera access to scan QR codes for importing cosigner keys and signed PSBTs from hardware wallets.
+ Birch needs camera access to scan QR codes for importing cosigner keys and signed PSBTs from hardware wallets.
NSFaceIDUsageDescription
- Hellbender uses Face ID to securely unlock your wallet.
+ Birch uses Face ID to securely unlock your wallet.
UIApplicationSceneManifest
UIApplicationSupportsMultipleScenes
diff --git a/hellbender/Models/AddressItem.swift b/birch/Models/AddressItem.swift
similarity index 100%
rename from hellbender/Models/AddressItem.swift
rename to birch/Models/AddressItem.swift
diff --git a/hellbender/Models/BIP329Record.swift b/birch/Models/BIP329Record.swift
similarity index 100%
rename from hellbender/Models/BIP329Record.swift
rename to birch/Models/BIP329Record.swift
diff --git a/hellbender/Models/BitcoinNetwork.swift b/birch/Models/BitcoinNetwork.swift
similarity index 100%
rename from hellbender/Models/BitcoinNetwork.swift
rename to birch/Models/BitcoinNetwork.swift
diff --git a/hellbender/Models/CosignerInfo.swift b/birch/Models/CosignerInfo.swift
similarity index 100%
rename from hellbender/Models/CosignerInfo.swift
rename to birch/Models/CosignerInfo.swift
diff --git a/hellbender/Models/FeePreset.swift b/birch/Models/FeePreset.swift
similarity index 100%
rename from hellbender/Models/FeePreset.swift
rename to birch/Models/FeePreset.swift
diff --git a/hellbender/Models/FrozenUTXO.swift b/birch/Models/FrozenUTXO.swift
similarity index 100%
rename from hellbender/Models/FrozenUTXO.swift
rename to birch/Models/FrozenUTXO.swift
diff --git a/hellbender/Models/PSBTFileDocument.swift b/birch/Models/PSBTFileDocument.swift
similarity index 100%
rename from hellbender/Models/PSBTFileDocument.swift
rename to birch/Models/PSBTFileDocument.swift
diff --git a/hellbender/Models/Recipient.swift b/birch/Models/Recipient.swift
similarity index 100%
rename from hellbender/Models/Recipient.swift
rename to birch/Models/Recipient.swift
diff --git a/hellbender/Models/SavedPSBT.swift b/birch/Models/SavedPSBT.swift
similarity index 100%
rename from hellbender/Models/SavedPSBT.swift
rename to birch/Models/SavedPSBT.swift
diff --git a/hellbender/Models/TransactionItem.swift b/birch/Models/TransactionItem.swift
similarity index 100%
rename from hellbender/Models/TransactionItem.swift
rename to birch/Models/TransactionItem.swift
diff --git a/hellbender/Models/UTXOItem.swift b/birch/Models/UTXOItem.swift
similarity index 100%
rename from hellbender/Models/UTXOItem.swift
rename to birch/Models/UTXOItem.swift
diff --git a/hellbender/Models/WalletLabel.swift b/birch/Models/WalletLabel.swift
similarity index 100%
rename from hellbender/Models/WalletLabel.swift
rename to birch/Models/WalletLabel.swift
diff --git a/hellbender/Models/WalletProfile.swift b/birch/Models/WalletProfile.swift
similarity index 100%
rename from hellbender/Models/WalletProfile.swift
rename to birch/Models/WalletProfile.swift
diff --git a/hellbender/Models/WalletSyncState.swift b/birch/Models/WalletSyncState.swift
similarity index 100%
rename from hellbender/Models/WalletSyncState.swift
rename to birch/Models/WalletSyncState.swift
diff --git a/hellbender/Preview Content/Preview Assets.xcassets/Contents.json b/birch/Preview Content/Preview Assets.xcassets/Contents.json
similarity index 100%
rename from hellbender/Preview Content/Preview Assets.xcassets/Contents.json
rename to birch/Preview Content/Preview Assets.xcassets/Contents.json
diff --git a/hellbender/Services/BitcoinService.swift b/birch/Services/BitcoinService.swift
similarity index 99%
rename from hellbender/Services/BitcoinService.swift
rename to birch/Services/BitcoinService.swift
index c2b4d02..fba8504 100644
--- a/hellbender/Services/BitcoinService.swift
+++ b/birch/Services/BitcoinService.swift
@@ -21,7 +21,7 @@ enum FeeSource: String, CaseIterable {
}
}
-private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "hellbender", category: "BitcoinService")
+private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "birch", category: "BitcoinService")
@Observable
@MainActor
diff --git a/hellbender/Services/BitcoinServiceProtocol.swift b/birch/Services/BitcoinServiceProtocol.swift
similarity index 100%
rename from hellbender/Services/BitcoinServiceProtocol.swift
rename to birch/Services/BitcoinServiceProtocol.swift
diff --git a/hellbender/Services/DescriptorPDFGenerator.swift b/birch/Services/DescriptorPDFGenerator.swift
similarity index 100%
rename from hellbender/Services/DescriptorPDFGenerator.swift
rename to birch/Services/DescriptorPDFGenerator.swift
diff --git a/hellbender/Services/ElectrumConfig.swift b/birch/Services/ElectrumConfig.swift
similarity index 100%
rename from hellbender/Services/ElectrumConfig.swift
rename to birch/Services/ElectrumConfig.swift
diff --git a/hellbender/Services/FiatPriceService.swift b/birch/Services/FiatPriceService.swift
similarity index 99%
rename from hellbender/Services/FiatPriceService.swift
rename to birch/Services/FiatPriceService.swift
index bec1db6..0dad479 100644
--- a/hellbender/Services/FiatPriceService.swift
+++ b/birch/Services/FiatPriceService.swift
@@ -2,7 +2,7 @@ import Foundation
import Observation
import OSLog
-private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "hellbender", category: "FiatPriceService")
+private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "birch", category: "FiatPriceService")
enum FiatSource: String, CaseIterable {
case zeus
diff --git a/hellbender/Services/LabelService.swift b/birch/Services/LabelService.swift
similarity index 99%
rename from hellbender/Services/LabelService.swift
rename to birch/Services/LabelService.swift
index 0171cee..6568b1e 100644
--- a/hellbender/Services/LabelService.swift
+++ b/birch/Services/LabelService.swift
@@ -2,7 +2,7 @@ import Foundation
import OSLog
import SwiftData
-private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "hellbender", category: "LabelService")
+private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "birch", category: "LabelService")
/// Handles label propagation between transactions, UTXOs, and addresses.
enum LabelService {
diff --git a/hellbender/Services/QRVideoExporter.swift b/birch/Services/QRVideoExporter.swift
similarity index 100%
rename from hellbender/Services/QRVideoExporter.swift
rename to birch/Services/QRVideoExporter.swift
diff --git a/hellbender/Services/URService.swift b/birch/Services/URService.swift
similarity index 100%
rename from hellbender/Services/URService.swift
rename to birch/Services/URService.swift
diff --git a/hellbender/Utilities/AppError.swift b/birch/Utilities/AppError.swift
similarity index 100%
rename from hellbender/Utilities/AppError.swift
rename to birch/Utilities/AppError.swift
diff --git a/hellbender/Utilities/Constants.swift b/birch/Utilities/Constants.swift
similarity index 98%
rename from hellbender/Utilities/Constants.swift
rename to birch/Utilities/Constants.swift
index 047227e..48a6cf5 100644
--- a/hellbender/Utilities/Constants.swift
+++ b/birch/Utilities/Constants.swift
@@ -3,7 +3,7 @@ import Foundation
enum Constants {
// MARK: - App
- static let appName = "Hellbender"
+ static let appName = "Birch"
static let defaultNetwork: BitcoinNetwork = .testnet4
// MARK: - BIP48 P2WSH
diff --git a/hellbender/Utilities/KeychainHelper.swift b/birch/Utilities/KeychainHelper.swift
similarity index 100%
rename from hellbender/Utilities/KeychainHelper.swift
rename to birch/Utilities/KeychainHelper.swift
diff --git a/hellbender/Utilities/LogExporter.swift b/birch/Utilities/LogExporter.swift
similarity index 91%
rename from hellbender/Utilities/LogExporter.swift
rename to birch/Utilities/LogExporter.swift
index e417d32..bcb1985 100644
--- a/hellbender/Utilities/LogExporter.swift
+++ b/birch/Utilities/LogExporter.swift
@@ -8,7 +8,7 @@ enum LogExporter {
static func collectLogs(hours: Double = 1) throws -> String {
let store = try OSLogStore(scope: .currentProcessIdentifier)
let cutoff = store.position(date: Date().addingTimeInterval(-hours * 3600))
- let subsystem = Bundle.main.bundleIdentifier ?? "hellbender"
+ let subsystem = Bundle.main.bundleIdentifier ?? "birch"
let entries = try store.getEntries(at: cutoff, matching: NSPredicate(format: "subsystem == %@", subsystem))
@@ -27,7 +27,7 @@ enum LogExporter {
return "No log entries found in the last \(Int(hours)) hour(s)."
}
- let header = "Hellbender Logs — Exported \(formatter.string(from: Date()))\n"
+ let header = "Birch Logs — Exported \(formatter.string(from: Date()))\n"
+ "Entries: \(lines.count) (last \(Int(hours))h)\n"
+ String(repeating: "─", count: 60) + "\n"
diff --git a/hellbender/ViewModels/AddressListViewModel.swift b/birch/ViewModels/AddressListViewModel.swift
similarity index 100%
rename from hellbender/ViewModels/AddressListViewModel.swift
rename to birch/ViewModels/AddressListViewModel.swift
diff --git a/hellbender/ViewModels/AppLockViewModel.swift b/birch/ViewModels/AppLockViewModel.swift
similarity index 99%
rename from hellbender/ViewModels/AppLockViewModel.swift
rename to birch/ViewModels/AppLockViewModel.swift
index 7c56edc..bedf837 100644
--- a/hellbender/ViewModels/AppLockViewModel.swift
+++ b/birch/ViewModels/AppLockViewModel.swift
@@ -4,7 +4,7 @@ import LocalAuthentication
import OSLog
import SwiftData
-private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "hellbender", category: "AppLock")
+private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "birch", category: "AppLock")
@Observable
@MainActor
diff --git a/hellbender/ViewModels/BumpFeeViewModel.swift b/birch/ViewModels/BumpFeeViewModel.swift
similarity index 99%
rename from hellbender/ViewModels/BumpFeeViewModel.swift
rename to birch/ViewModels/BumpFeeViewModel.swift
index 4fdb2f8..99953d7 100644
--- a/hellbender/ViewModels/BumpFeeViewModel.swift
+++ b/birch/ViewModels/BumpFeeViewModel.swift
@@ -3,7 +3,7 @@ import Observation
import OSLog
import SwiftData
-private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "hellbender", category: "BumpFeeViewModel")
+private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "birch", category: "BumpFeeViewModel")
@Observable
@MainActor
diff --git a/hellbender/ViewModels/PSBTFlowManaging.swift b/birch/ViewModels/PSBTFlowManaging.swift
similarity index 100%
rename from hellbender/ViewModels/PSBTFlowManaging.swift
rename to birch/ViewModels/PSBTFlowManaging.swift
diff --git a/hellbender/ViewModels/ReceiveViewModel.swift b/birch/ViewModels/ReceiveViewModel.swift
similarity index 100%
rename from hellbender/ViewModels/ReceiveViewModel.swift
rename to birch/ViewModels/ReceiveViewModel.swift
diff --git a/hellbender/ViewModels/SendViewModel.swift b/birch/ViewModels/SendViewModel.swift
similarity index 99%
rename from hellbender/ViewModels/SendViewModel.swift
rename to birch/ViewModels/SendViewModel.swift
index f4b8c74..5b2eb22 100644
--- a/hellbender/ViewModels/SendViewModel.swift
+++ b/birch/ViewModels/SendViewModel.swift
@@ -3,7 +3,7 @@ import Observation
import OSLog
import SwiftData
-private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "hellbender", category: "SendViewModel")
+private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "birch", category: "SendViewModel")
@Observable
@MainActor
diff --git a/hellbender/ViewModels/SetupWizardViewModel.swift b/birch/ViewModels/SetupWizardViewModel.swift
similarity index 100%
rename from hellbender/ViewModels/SetupWizardViewModel.swift
rename to birch/ViewModels/SetupWizardViewModel.swift
diff --git a/hellbender/ViewModels/TransactionListViewModel.swift b/birch/ViewModels/TransactionListViewModel.swift
similarity index 100%
rename from hellbender/ViewModels/TransactionListViewModel.swift
rename to birch/ViewModels/TransactionListViewModel.swift
diff --git a/hellbender/ViewModels/UTXOListViewModel.swift b/birch/ViewModels/UTXOListViewModel.swift
similarity index 100%
rename from hellbender/ViewModels/UTXOListViewModel.swift
rename to birch/ViewModels/UTXOListViewModel.swift
diff --git a/hellbender/ViewModels/WalletManagerViewModel.swift b/birch/ViewModels/WalletManagerViewModel.swift
similarity index 98%
rename from hellbender/ViewModels/WalletManagerViewModel.swift
rename to birch/ViewModels/WalletManagerViewModel.swift
index d0c6830..6009e08 100644
--- a/hellbender/ViewModels/WalletManagerViewModel.swift
+++ b/birch/ViewModels/WalletManagerViewModel.swift
@@ -3,7 +3,7 @@ import Observation
import OSLog
import SwiftData
-private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "hellbender", category: "WalletManager")
+private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "birch", category: "WalletManager")
@Observable
@MainActor
diff --git a/hellbender/Views/Components/BBQRDisplayView.swift b/birch/Views/Components/BBQRDisplayView.swift
similarity index 98%
rename from hellbender/Views/Components/BBQRDisplayView.swift
rename to birch/Views/Components/BBQRDisplayView.swift
index 226f73a..3f2dfe0 100644
--- a/hellbender/Views/Components/BBQRDisplayView.swift
+++ b/birch/Views/Components/BBQRDisplayView.swift
@@ -3,7 +3,7 @@ import CoreImage.CIFilterBuiltins
import OSLog
import SwiftUI
-private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "hellbender", category: "BBQRDisplayView")
+private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "birch", category: "BBQRDisplayView")
struct BBQRDisplayView: View {
let data: Data
diff --git a/hellbender/Views/Components/CharWrapText.swift b/birch/Views/Components/CharWrapText.swift
similarity index 100%
rename from hellbender/Views/Components/CharWrapText.swift
rename to birch/Views/Components/CharWrapText.swift
diff --git a/hellbender/Views/Components/CosignerCardView.swift b/birch/Views/Components/CosignerCardView.swift
similarity index 100%
rename from hellbender/Views/Components/CosignerCardView.swift
rename to birch/Views/Components/CosignerCardView.swift
diff --git a/hellbender/Views/Components/PINPadView.swift b/birch/Views/Components/PINPadView.swift
similarity index 100%
rename from hellbender/Views/Components/PINPadView.swift
rename to birch/Views/Components/PINPadView.swift
diff --git a/hellbender/Views/Components/QRCodeView.swift b/birch/Views/Components/QRCodeView.swift
similarity index 100%
rename from hellbender/Views/Components/QRCodeView.swift
rename to birch/Views/Components/QRCodeView.swift
diff --git a/hellbender/Views/Components/Theme.swift b/birch/Views/Components/Theme.swift
similarity index 88%
rename from hellbender/Views/Components/Theme.swift
rename to birch/Views/Components/Theme.swift
index cbdbf57..cd6f1cb 100644
--- a/hellbender/Views/Components/Theme.swift
+++ b/birch/Views/Components/Theme.swift
@@ -78,17 +78,17 @@ struct HBTheme {
)
static let birchLight = HBTheme(
- background: Color(red: 0.929, green: 0.910, blue: 0.875),
- surface: Color(red: 0.851, green: 0.824, blue: 0.773),
- surfaceElevated: Color(red: 0.929, green: 0.910, blue: 0.875),
- border: Color(red: 0.769, green: 0.741, blue: 0.690),
- textPrimary: Color(red: 0.165, green: 0.145, blue: 0.125),
- textSecondary: Color(red: 0.420, green: 0.380, blue: 0.345),
- accent: Color(red: 0.769, green: 0.584, blue: 0.165),
- heroBackground: Color(red: 0.851, green: 0.824, blue: 0.773),
- success: Color(red: 0.353, green: 0.400, blue: 0.259),
- error: Color(red: 0.549, green: 0.188, blue: 0.125),
- secondaryAccent: Color(red: 0.353, green: 0.400, blue: 0.259),
+ background: Color(red: 0.949, green: 0.933, blue: 0.902),
+ surface: Color(red: 0.890, green: 0.867, blue: 0.827),
+ surfaceElevated: Color(red: 0.949, green: 0.933, blue: 0.902),
+ border: Color(red: 0.690, green: 0.663, blue: 0.616),
+ textPrimary: Color(red: 0.137, green: 0.122, blue: 0.106),
+ textSecondary: Color(red: 0.310, green: 0.282, blue: 0.251),
+ accent: Color(red: 0.698, green: 0.525, blue: 0.133),
+ heroBackground: Color(red: 0.890, green: 0.867, blue: 0.827),
+ success: Color(red: 0.278, green: 0.373, blue: 0.224),
+ error: Color(red: 0.600, green: 0.180, blue: 0.120),
+ secondaryAccent: Color(red: 0.278, green: 0.373, blue: 0.224),
colorScheme: .light
)
}
@@ -105,8 +105,8 @@ enum AppTheme: String, CaseIterable {
var displayName: String {
switch self {
case .system: "System"
- case .dark: "Dark"
- case .light: "Light"
+ case .dark: "Hellbender Dark"
+ case .light: "Hellbender Light"
case .birchDark: "Birch Dark"
case .birchLight: "Birch Light"
}
@@ -128,7 +128,7 @@ enum AppTheme: String, CaseIterable {
@Observable
final class ThemeManager {
static let shared = ThemeManager()
- private(set) var theme: HBTheme = .dark
+ private(set) var theme: HBTheme = .birchDark
private init() {
let saved = UserDefaults.standard.string(forKey: Constants.themeKey) ?? AppTheme.system.rawValue
@@ -143,7 +143,7 @@ final class ThemeManager {
/// Sets the displayed theme to the appropriate custom palette for the given OS color scheme.
/// Only used when the System theme is selected — does not save to UserDefaults.
func applySystemColorScheme(_ colorScheme: ColorScheme) {
- theme = colorScheme == .dark ? .dark : .light
+ theme = colorScheme == .dark ? .birchDark : .birchLight
}
}
@@ -288,6 +288,21 @@ extension View {
}
}
+// MARK: - Themed App Icon
+
+/// Renders the app-icon artwork that matches the current theme's light/dark appearance.
+/// Uses `AppIconPreviewLight` on light color schemes, `AppIconPreviewDark` on dark.
+/// The theme is applied via `.preferredColorScheme` at the root, so this works for
+/// all AppTheme cases (system, birch light/dark).
+struct ThemedAppIcon: View {
+ @Environment(\.colorScheme) private var colorScheme
+
+ var body: some View {
+ Image(colorScheme == .dark ? "AppIconPreviewDark" : "AppIconPreviewLight")
+ .resizable()
+ }
+}
+
// MARK: - Network Badge
struct NetworkBadge: View {
diff --git a/hellbender/Views/Components/URDisplaySheet.swift b/birch/Views/Components/URDisplaySheet.swift
similarity index 100%
rename from hellbender/Views/Components/URDisplaySheet.swift
rename to birch/Views/Components/URDisplaySheet.swift
diff --git a/hellbender/Views/Components/URScannerSheet.swift b/birch/Views/Components/URScannerSheet.swift
similarity index 99%
rename from hellbender/Views/Components/URScannerSheet.swift
rename to birch/Views/Components/URScannerSheet.swift
index 96003bf..cea5125 100644
--- a/hellbender/Views/Components/URScannerSheet.swift
+++ b/birch/Views/Components/URScannerSheet.swift
@@ -6,7 +6,7 @@ import SwiftUI
import URKit
import URUI
-private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "hellbender", category: "URScannerSheet")
+private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "birch", category: "URScannerSheet")
struct URScannerSheet: View {
let onResult: (AppURResult) -> Void
diff --git a/hellbender/Views/Main/Dashboard/ConnectionStatusView.swift b/birch/Views/Main/Dashboard/ConnectionStatusView.swift
similarity index 99%
rename from hellbender/Views/Main/Dashboard/ConnectionStatusView.swift
rename to birch/Views/Main/Dashboard/ConnectionStatusView.swift
index bbd24b2..5098fec 100644
--- a/hellbender/Views/Main/Dashboard/ConnectionStatusView.swift
+++ b/birch/Views/Main/Dashboard/ConnectionStatusView.swift
@@ -265,7 +265,7 @@ struct ConnectionStatusView: View {
}
private func copyDebugInfo() {
- var lines = ["=== Hellbender Debug Info ==="]
+ var lines = ["=== Birch Debug Info ==="]
lines.append("Timestamp: \(ISO8601DateFormatter().string(from: Date()))")
// SwiftData wallet info
diff --git a/hellbender/Views/Main/MainTabView.swift b/birch/Views/Main/MainTabView.swift
similarity index 96%
rename from hellbender/Views/Main/MainTabView.swift
rename to birch/Views/Main/MainTabView.swift
index 36162a9..a3ddcf4 100644
--- a/hellbender/Views/Main/MainTabView.swift
+++ b/birch/Views/Main/MainTabView.swift
@@ -2,7 +2,7 @@ import OSLog
import SwiftData
import SwiftUI
-private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "hellbender", category: "Navigation")
+private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "birch", category: "Navigation")
struct MainTabView: View {
@State private var selectedTab = 0
diff --git a/hellbender/Views/Main/Receive/AddressDetailView.swift b/birch/Views/Main/Receive/AddressDetailView.swift
similarity index 100%
rename from hellbender/Views/Main/Receive/AddressDetailView.swift
rename to birch/Views/Main/Receive/AddressDetailView.swift
diff --git a/hellbender/Views/Main/Receive/AddressListView.swift b/birch/Views/Main/Receive/AddressListView.swift
similarity index 100%
rename from hellbender/Views/Main/Receive/AddressListView.swift
rename to birch/Views/Main/Receive/AddressListView.swift
diff --git a/hellbender/Views/Main/Receive/ReceiveView.swift b/birch/Views/Main/Receive/ReceiveView.swift
similarity index 100%
rename from hellbender/Views/Main/Receive/ReceiveView.swift
rename to birch/Views/Main/Receive/ReceiveView.swift
diff --git a/hellbender/Views/Main/Send/BroadcastResultView.swift b/birch/Views/Main/Send/BroadcastResultView.swift
similarity index 98%
rename from hellbender/Views/Main/Send/BroadcastResultView.swift
rename to birch/Views/Main/Send/BroadcastResultView.swift
index e2430ec..fb1eacd 100644
--- a/hellbender/Views/Main/Send/BroadcastResultView.swift
+++ b/birch/Views/Main/Send/BroadcastResultView.swift
@@ -243,7 +243,7 @@ struct BroadcastResultView: View {
walletID: walletID
)
} catch {
- Logger(subsystem: Bundle.main.bundleIdentifier ?? "hellbender", category: "LabelService")
+ Logger(subsystem: Bundle.main.bundleIdentifier ?? "birch", category: "LabelService")
.error("Failed to propagate change label: \(error.localizedDescription)")
}
}
diff --git a/hellbender/Views/Main/Send/PSBTDisplayView.swift b/birch/Views/Main/Send/PSBTDisplayView.swift
similarity index 100%
rename from hellbender/Views/Main/Send/PSBTDisplayView.swift
rename to birch/Views/Main/Send/PSBTDisplayView.swift
diff --git a/hellbender/Views/Main/Send/PSBTScanView.swift b/birch/Views/Main/Send/PSBTScanView.swift
similarity index 100%
rename from hellbender/Views/Main/Send/PSBTScanView.swift
rename to birch/Views/Main/Send/PSBTScanView.swift
diff --git a/hellbender/Views/Main/Send/SavedPSBTListView.swift b/birch/Views/Main/Send/SavedPSBTListView.swift
similarity index 100%
rename from hellbender/Views/Main/Send/SavedPSBTListView.swift
rename to birch/Views/Main/Send/SavedPSBTListView.swift
diff --git a/hellbender/Views/Main/Send/SendAmountView.swift b/birch/Views/Main/Send/SendAmountView.swift
similarity index 100%
rename from hellbender/Views/Main/Send/SendAmountView.swift
rename to birch/Views/Main/Send/SendAmountView.swift
diff --git a/hellbender/Views/Main/Send/SendFlowView.swift b/birch/Views/Main/Send/SendFlowView.swift
similarity index 100%
rename from hellbender/Views/Main/Send/SendFlowView.swift
rename to birch/Views/Main/Send/SendFlowView.swift
diff --git a/hellbender/Views/Main/Send/SendReviewView.swift b/birch/Views/Main/Send/SendReviewView.swift
similarity index 100%
rename from hellbender/Views/Main/Send/SendReviewView.swift
rename to birch/Views/Main/Send/SendReviewView.swift
diff --git a/hellbender/Views/Main/Settings/DescriptorPDFView.swift b/birch/Views/Main/Settings/DescriptorPDFView.swift
similarity index 100%
rename from hellbender/Views/Main/Settings/DescriptorPDFView.swift
rename to birch/Views/Main/Settings/DescriptorPDFView.swift
diff --git a/hellbender/Views/Main/Settings/SettingsView.swift b/birch/Views/Main/Settings/SettingsView.swift
similarity index 85%
rename from hellbender/Views/Main/Settings/SettingsView.swift
rename to birch/Views/Main/Settings/SettingsView.swift
index 609727c..95162d9 100644
--- a/hellbender/Views/Main/Settings/SettingsView.swift
+++ b/birch/Views/Main/Settings/SettingsView.swift
@@ -3,7 +3,7 @@ import OSLog
import SwiftData
import SwiftUI
-private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "hellbender", category: "Settings")
+private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "birch", category: "Settings")
struct SettingsView: View {
@Environment(\.modelContext) private var modelContext
@@ -24,11 +24,6 @@ struct SettingsView: View {
// Security
AppLockSettingsSection()
- // Appearance
- Section("Appearance") {
- AppearanceSettingsRow()
- }
-
// Fee Estimation
Section("Fee Estimation") {
FeeSettingsRow()
@@ -39,6 +34,16 @@ struct SettingsView: View {
FiatSettingsRow()
}
+ // Appearance
+ Section("Appearance") {
+ AppearanceSettingsRow()
+ }
+
+ // App Icon
+ Section("App Icon") {
+ AppIconSettingsRow()
+ }
+
// About
Section("About") {
HStack {
@@ -92,6 +97,108 @@ private struct AppearanceSettingsRow: View {
}
}
+// MARK: - App Icon Settings
+
+private enum AppIconOption: String, CaseIterable, Identifiable {
+ case light
+ case dark
+
+ var id: String {
+ rawValue
+ }
+
+ /// Name passed to `UIApplication.setAlternateIconName`; `nil` selects the primary icon.
+ var alternateIconName: String? {
+ switch self {
+ case .light: nil
+ case .dark: "AppIcon-Dark"
+ }
+ }
+
+ var displayName: String {
+ switch self {
+ case .light: "Light"
+ case .dark: "Dark"
+ }
+ }
+
+ var previewAssetName: String {
+ switch self {
+ case .light: "AppIconPreviewLight"
+ case .dark: "AppIconPreviewDark"
+ }
+ }
+
+ static var current: AppIconOption {
+ UIApplication.shared.alternateIconName == "AppIcon-Dark" ? .dark : .light
+ }
+}
+
+private struct AppIconSettingsRow: View {
+ @State private var selected: AppIconOption = .current
+
+ var body: some View {
+ HStack(spacing: 12) {
+ ForEach(AppIconOption.allCases) { option in
+ AppIconTile(option: option, isSelected: selected == option) {
+ select(option)
+ }
+ }
+ }
+ .listRowBackground(Color.hbSurface)
+ }
+
+ private func select(_ option: AppIconOption) {
+ guard selected != option else { return }
+ UIApplication.shared.setAlternateIconName(option.alternateIconName) { error in
+ Task { @MainActor in
+ if let error {
+ logger.error("Failed to set app icon: \(error.localizedDescription, privacy: .public)")
+ } else {
+ logger.info("App icon changed to \(option.displayName, privacy: .public)")
+ selected = option
+ }
+ }
+ }
+ }
+}
+
+private struct AppIconTile: View {
+ let option: AppIconOption
+ let isSelected: Bool
+ let onTap: () -> Void
+
+ var body: some View {
+ Button(action: onTap) {
+ VStack(spacing: 8) {
+ Image(option.previewAssetName)
+ .resizable()
+ .aspectRatio(contentMode: .fit)
+ .frame(width: 72, height: 72)
+ .clipShape(RoundedRectangle(cornerRadius: 16, style: .continuous))
+ .overlay(
+ RoundedRectangle(cornerRadius: 16, style: .continuous)
+ .stroke(isSelected ? Color.hbBitcoinOrange : Color.hbBorder, lineWidth: isSelected ? 3 : 1)
+ )
+
+ HStack(spacing: 4) {
+ if isSelected {
+ Image(systemName: "checkmark.circle.fill")
+ .font(.system(size: 12))
+ .foregroundStyle(Color.hbBitcoinOrange)
+ }
+ Text(option.displayName)
+ .font(.hbBody(13))
+ .foregroundStyle(Color.hbTextPrimary)
+ }
+ }
+ .frame(maxWidth: .infinity)
+ .padding(.vertical, 8)
+ }
+ .buttonStyle(.plain)
+ }
+}
+
// MARK: - Denomination Settings
private struct DenominationSettingsRow: View {
diff --git a/hellbender/Views/Main/Settings/UTXODetailView.swift b/birch/Views/Main/Settings/UTXODetailView.swift
similarity index 99%
rename from hellbender/Views/Main/Settings/UTXODetailView.swift
rename to birch/Views/Main/Settings/UTXODetailView.swift
index 6f841b0..a4f0f0d 100644
--- a/hellbender/Views/Main/Settings/UTXODetailView.swift
+++ b/birch/Views/Main/Settings/UTXODetailView.swift
@@ -2,7 +2,7 @@ import OSLog
import SwiftData
import SwiftUI
-private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "hellbender", category: "UTXODetail")
+private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "birch", category: "UTXODetail")
struct UTXODetailView: View {
let utxo: UTXOItem
diff --git a/hellbender/Views/Main/Settings/UTXOListView.swift b/birch/Views/Main/Settings/UTXOListView.swift
similarity index 100%
rename from hellbender/Views/Main/Settings/UTXOListView.swift
rename to birch/Views/Main/Settings/UTXOListView.swift
diff --git a/hellbender/Views/Main/Settings/WalletInfoView.swift b/birch/Views/Main/Settings/WalletInfoView.swift
similarity index 99%
rename from hellbender/Views/Main/Settings/WalletInfoView.swift
rename to birch/Views/Main/Settings/WalletInfoView.swift
index 501374b..322e28a 100644
--- a/hellbender/Views/Main/Settings/WalletInfoView.swift
+++ b/birch/Views/Main/Settings/WalletInfoView.swift
@@ -3,7 +3,7 @@ import SwiftData
import SwiftUI
import URKit
-private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "hellbender", category: "WalletInfo")
+private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "birch", category: "WalletInfo")
struct WalletInfoView: View {
@Environment(\.modelContext) private var modelContext
diff --git a/hellbender/Views/Main/Transactions/BumpFeeView.swift b/birch/Views/Main/Transactions/BumpFeeView.swift
similarity index 100%
rename from hellbender/Views/Main/Transactions/BumpFeeView.swift
rename to birch/Views/Main/Transactions/BumpFeeView.swift
diff --git a/hellbender/Views/Main/Transactions/TransactionDetailView.swift b/birch/Views/Main/Transactions/TransactionDetailView.swift
similarity index 99%
rename from hellbender/Views/Main/Transactions/TransactionDetailView.swift
rename to birch/Views/Main/Transactions/TransactionDetailView.swift
index 1bb926f..6189a00 100644
--- a/hellbender/Views/Main/Transactions/TransactionDetailView.swift
+++ b/birch/Views/Main/Transactions/TransactionDetailView.swift
@@ -2,7 +2,7 @@ import OSLog
import SwiftData
import SwiftUI
-private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "hellbender", category: "TransactionDetailView")
+private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "birch", category: "TransactionDetailView")
struct TransactionDetailView: View {
let transaction: TransactionItem
diff --git a/hellbender/Views/Main/Transactions/TransactionListView.swift b/birch/Views/Main/Transactions/TransactionListView.swift
similarity index 99%
rename from hellbender/Views/Main/Transactions/TransactionListView.swift
rename to birch/Views/Main/Transactions/TransactionListView.swift
index 6aa0f25..a78e7d2 100644
--- a/hellbender/Views/Main/Transactions/TransactionListView.swift
+++ b/birch/Views/Main/Transactions/TransactionListView.swift
@@ -3,7 +3,7 @@ import SwiftData
import SwiftUI
import UniformTypeIdentifiers
-private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "hellbender", category: "TransactionListView")
+private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "birch", category: "TransactionListView")
struct TransactionListView: View {
@Query private var wallets: [WalletProfile]
diff --git a/hellbender/Views/Main/Transactions/TransactionRowView.swift b/birch/Views/Main/Transactions/TransactionRowView.swift
similarity index 100%
rename from hellbender/Views/Main/Transactions/TransactionRowView.swift
rename to birch/Views/Main/Transactions/TransactionRowView.swift
diff --git a/hellbender/Views/Main/Transactions/WalletDashboardView.swift b/birch/Views/Main/Transactions/WalletDashboardView.swift
similarity index 100%
rename from hellbender/Views/Main/Transactions/WalletDashboardView.swift
rename to birch/Views/Main/Transactions/WalletDashboardView.swift
diff --git a/hellbender/Views/Setup/CosignerImportView.swift b/birch/Views/Setup/CosignerImportView.swift
similarity index 100%
rename from hellbender/Views/Setup/CosignerImportView.swift
rename to birch/Views/Setup/CosignerImportView.swift
diff --git a/hellbender/Views/Setup/DescriptorImportView.swift b/birch/Views/Setup/DescriptorImportView.swift
similarity index 100%
rename from hellbender/Views/Setup/DescriptorImportView.swift
rename to birch/Views/Setup/DescriptorImportView.swift
diff --git a/hellbender/Views/Setup/ElectrumServerSetupSection.swift b/birch/Views/Setup/ElectrumServerSetupSection.swift
similarity index 100%
rename from hellbender/Views/Setup/ElectrumServerSetupSection.swift
rename to birch/Views/Setup/ElectrumServerSetupSection.swift
diff --git a/hellbender/Views/Setup/MultisigConfigView.swift b/birch/Views/Setup/MultisigConfigView.swift
similarity index 100%
rename from hellbender/Views/Setup/MultisigConfigView.swift
rename to birch/Views/Setup/MultisigConfigView.swift
diff --git a/hellbender/Views/Setup/NumberPickerSheet.swift b/birch/Views/Setup/NumberPickerSheet.swift
similarity index 100%
rename from hellbender/Views/Setup/NumberPickerSheet.swift
rename to birch/Views/Setup/NumberPickerSheet.swift
diff --git a/hellbender/Views/Setup/SetupWizardView.swift b/birch/Views/Setup/SetupWizardView.swift
similarity index 100%
rename from hellbender/Views/Setup/SetupWizardView.swift
rename to birch/Views/Setup/SetupWizardView.swift
diff --git a/hellbender/Views/Setup/WalletCreationChoiceView.swift b/birch/Views/Setup/WalletCreationChoiceView.swift
similarity index 100%
rename from hellbender/Views/Setup/WalletCreationChoiceView.swift
rename to birch/Views/Setup/WalletCreationChoiceView.swift
diff --git a/hellbender/Views/Setup/WalletNameView.swift b/birch/Views/Setup/WalletNameView.swift
similarity index 100%
rename from hellbender/Views/Setup/WalletNameView.swift
rename to birch/Views/Setup/WalletNameView.swift
diff --git a/hellbender/Views/Setup/WalletReviewView.swift b/birch/Views/Setup/WalletReviewView.swift
similarity index 100%
rename from hellbender/Views/Setup/WalletReviewView.swift
rename to birch/Views/Setup/WalletReviewView.swift
diff --git a/hellbender/Views/Setup/WalletVerifyView.swift b/birch/Views/Setup/WalletVerifyView.swift
similarity index 95%
rename from hellbender/Views/Setup/WalletVerifyView.swift
rename to birch/Views/Setup/WalletVerifyView.swift
index 6e46a10..4f000ac 100644
--- a/hellbender/Views/Setup/WalletVerifyView.swift
+++ b/birch/Views/Setup/WalletVerifyView.swift
@@ -75,7 +75,7 @@ struct WalletVerifyView: View {
.foregroundStyle(Color.hbTextPrimary)
}
- Text("The output descriptor is your **only** recovery path. If you lose Hellbender (phone dies, app deleted, data corrupted), the descriptor is the only thing needed to rebuild the wallet in any compatible coordinator (Sparrow, Nunchuk, etc.). Without it, you'd need to re-gather all cosigner xpubs and reconstruct the exact same configuration — which may not be possible.")
+ Text("The output descriptor is your **only** recovery path. If you lose Birch (phone dies, app deleted, data corrupted), the descriptor is the only thing needed to rebuild the wallet in any compatible coordinator (Sparrow, Nunchuk, etc.). Without it, you'd need to re-gather all cosigner xpubs and reconstruct the exact same configuration — which may not be possible.")
.font(.hbBody(13))
.foregroundStyle(Color.hbTextSecondary)
@@ -140,7 +140,7 @@ struct WalletVerifyView: View {
.font(.hbHeadline)
.foregroundStyle(Color.hbTextPrimary)
- Text("Verifying your first receive address confirms that Hellbender built the correct output descriptor and will generate the same addresses as your cosigner devices. If the addresses don't match, funds sent to this wallet could be unspendable.")
+ Text("Verifying your first receive address confirms that Birch built the correct output descriptor and will generate the same addresses as your cosigner devices. If the addresses don't match, funds sent to this wallet could be unspendable.")
.font(.hbBody(13))
.foregroundStyle(Color.hbTextSecondary)
diff --git a/hellbender/Views/Setup/WelcomeStepView.swift b/birch/Views/Setup/WelcomeStepView.swift
similarity index 88%
rename from hellbender/Views/Setup/WelcomeStepView.swift
rename to birch/Views/Setup/WelcomeStepView.swift
index c68b763..557676f 100644
--- a/hellbender/Views/Setup/WelcomeStepView.swift
+++ b/birch/Views/Setup/WelcomeStepView.swift
@@ -8,8 +8,7 @@ struct WelcomeStepView: View {
Spacer()
// Icon
- Image("WelcomeIcon")
- .resizable()
+ ThemedAppIcon()
.aspectRatio(contentMode: .fit)
.frame(width: 120, height: 120)
.clipShape(RoundedRectangle(cornerRadius: 28, style: .continuous))
@@ -19,13 +18,9 @@ struct WelcomeStepView: View {
.blur(radius: 12)
.clipShape(RoundedRectangle(cornerRadius: 28, style: .continuous))
)
- .overlay(
- RoundedRectangle(cornerRadius: 28, style: .continuous)
- .strokeBorder(Color.hbBorder.opacity(0.5), lineWidth: 1)
- )
VStack(spacing: 12) {
- Text("Hellbender Wallet")
+ Text("Birch Wallet")
.font(.hbDisplay(34))
.foregroundStyle(Color.hbTextPrimary)
diff --git a/hellbender/hellbenderApp.swift b/birch/birchApp.swift
similarity index 98%
rename from hellbender/hellbenderApp.swift
rename to birch/birchApp.swift
index afbe952..ca9d18f 100644
--- a/hellbender/hellbenderApp.swift
+++ b/birch/birchApp.swift
@@ -2,7 +2,7 @@ import SwiftData
import SwiftUI
@main
-struct hellbenderApp: App {
+struct birchApp: App {
let modelContainer: ModelContainer
init() {
diff --git a/hellbenderTests/AddressDerivationTests.swift b/birchTests/AddressDerivationTests.swift
similarity index 98%
rename from hellbenderTests/AddressDerivationTests.swift
rename to birchTests/AddressDerivationTests.swift
index 2f84683..6eb08f2 100644
--- a/hellbenderTests/AddressDerivationTests.swift
+++ b/birchTests/AddressDerivationTests.swift
@@ -1,5 +1,5 @@
+@testable import birch
import Foundation
-@testable import hellbender
import Testing
@MainActor
diff --git a/hellbenderTests/BumpFeeViewModelTests.swift b/birchTests/BumpFeeViewModelTests.swift
similarity index 99%
rename from hellbenderTests/BumpFeeViewModelTests.swift
rename to birchTests/BumpFeeViewModelTests.swift
index 011a751..5a1ae73 100644
--- a/hellbenderTests/BumpFeeViewModelTests.swift
+++ b/birchTests/BumpFeeViewModelTests.swift
@@ -1,5 +1,5 @@
+@testable import birch
import Foundation
-@testable import hellbender
import Testing
@MainActor
diff --git a/hellbenderTests/CosignerValidationTests.swift b/birchTests/CosignerValidationTests.swift
similarity index 99%
rename from hellbenderTests/CosignerValidationTests.swift
rename to birchTests/CosignerValidationTests.swift
index bf07a47..d2298e8 100644
--- a/hellbenderTests/CosignerValidationTests.swift
+++ b/birchTests/CosignerValidationTests.swift
@@ -1,5 +1,5 @@
+@testable import birch
import Foundation
-@testable import hellbender
import Testing
@MainActor
diff --git a/hellbenderTests/DescriptorTests.swift b/birchTests/DescriptorTests.swift
similarity index 99%
rename from hellbenderTests/DescriptorTests.swift
rename to birchTests/DescriptorTests.swift
index a9274af..0cdf228 100644
--- a/hellbenderTests/DescriptorTests.swift
+++ b/birchTests/DescriptorTests.swift
@@ -1,5 +1,5 @@
+@testable import birch
import Foundation
-@testable import hellbender
import Testing
import URKit
diff --git a/hellbenderTests/ElectrumConfigTests.swift b/birchTests/ElectrumConfigTests.swift
similarity index 98%
rename from hellbenderTests/ElectrumConfigTests.swift
rename to birchTests/ElectrumConfigTests.swift
index ec33e73..0bcc3fd 100644
--- a/hellbenderTests/ElectrumConfigTests.swift
+++ b/birchTests/ElectrumConfigTests.swift
@@ -1,6 +1,6 @@
+@testable import birch
import BitcoinDevKit
import Foundation
-@testable import hellbender
import Testing
struct ElectrumConfigTests {
diff --git a/hellbenderTests/Fixtures/test_addresses.json b/birchTests/Fixtures/test_addresses.json
similarity index 100%
rename from hellbenderTests/Fixtures/test_addresses.json
rename to birchTests/Fixtures/test_addresses.json
diff --git a/hellbenderTests/Fixtures/test_descriptors.json b/birchTests/Fixtures/test_descriptors.json
similarity index 100%
rename from hellbenderTests/Fixtures/test_descriptors.json
rename to birchTests/Fixtures/test_descriptors.json
diff --git a/hellbenderTests/Fixtures/test_psbt_partial.txt b/birchTests/Fixtures/test_psbt_partial.txt
similarity index 100%
rename from hellbenderTests/Fixtures/test_psbt_partial.txt
rename to birchTests/Fixtures/test_psbt_partial.txt
diff --git a/hellbenderTests/Fixtures/test_psbt_unsigned.txt b/birchTests/Fixtures/test_psbt_unsigned.txt
similarity index 100%
rename from hellbenderTests/Fixtures/test_psbt_unsigned.txt
rename to birchTests/Fixtures/test_psbt_unsigned.txt
diff --git a/hellbenderTests/Fixtures/test_xpubs.json b/birchTests/Fixtures/test_xpubs.json
similarity index 100%
rename from hellbenderTests/Fixtures/test_xpubs.json
rename to birchTests/Fixtures/test_xpubs.json
diff --git a/hellbenderTests/LabelServiceExportTests.swift b/birchTests/LabelServiceExportTests.swift
similarity index 98%
rename from hellbenderTests/LabelServiceExportTests.swift
rename to birchTests/LabelServiceExportTests.swift
index 3c610ca..18f43ce 100644
--- a/hellbenderTests/LabelServiceExportTests.swift
+++ b/birchTests/LabelServiceExportTests.swift
@@ -1,5 +1,5 @@
+@testable import birch
import Foundation
-@testable import hellbender
import Testing
import URKit
@@ -483,7 +483,7 @@ struct LabelServiceExportTests {
{"fee":18,"height":126660,"label":"Testing 123","origin":"wsh(sortedmulti(1,[7a13a7b1/48h/1h/0h/2h],[30a36b52/48h/1h/0h/2h]))","ref":"9ffb2b905fd9974d76d8682d12eee200fd910da18322670a2525a307a83e5b1c","time":"2026-03-20T04:23:45Z","type":"tx","value":-5702}
{"fee":18,"height":126626,"label":"Testing 2","origin":"wsh(sortedmulti(1,[7a13a7b1/48h/1h/0h/2h],[30a36b52/48h/1h/0h/2h]))","ref":"c59897e7fe50ce35fb8ef2b58ecc7c0180a762a4e0e841240d9fa37c2244bb74","time":"2026-03-19T19:44:53Z","type":"tx","value":-6863}
{"fee":456,"height":126624,"label":"Another New Label from Sparrow","origin":"wsh(sortedmulti(1,[7a13a7b1/48h/1h/0h/2h],[30a36b52/48h/1h/0h/2h]))","ref":"bf05617c5dd16c26ca7dbc1daa13d4b1e8ffd8d1f50d770988dfaf1dd938adda","time":"2026-03-19T18:19:46Z","type":"tx","value":-5456}
- {"fee":241,"height":126137,"label":"Hellbender Label!","origin":"wsh(sortedmulti(1,[7a13a7b1/48h/1h/0h/2h],[30a36b52/48h/1h/0h/2h]))","ref":"f9b837f77390e2c69d8a33c73501f32ec1a61fe29b2b77365da86025e8a20db3","time":"2026-03-16T02:18:41Z","type":"tx","value":-35923}
+ {"fee":241,"height":126137,"label":"Birch Label!","origin":"wsh(sortedmulti(1,[7a13a7b1/48h/1h/0h/2h],[30a36b52/48h/1h/0h/2h]))","ref":"f9b837f77390e2c69d8a33c73501f32ec1a61fe29b2b77365da86025e8a20db3","time":"2026-03-16T02:18:41Z","type":"tx","value":-35923}
{"fee":331,"height":126043,"origin":"wsh(sortedmulti(1,[7a13a7b1/48h/1h/0h/2h],[30a36b52/48h/1h/0h/2h]))","ref":"d5135c176580a669b6080cc9c646520ba9dfd76494165d32cef66a1b4b710dcc","time":"2026-03-15T12:21:53Z","type":"tx","value":-25819}
{"fee":325,"height":125745,"label":"a, a, a, a, a","origin":"wsh(sortedmulti(1,[7a13a7b1/48h/1h/0h/2h],[30a36b52/48h/1h/0h/2h]))","ref":"9ff56ff21d6ba4dc288e5bd70ac4b71a392b78ab5867e8459981f9fc9ffcba74","time":"2026-03-12T20:07:14Z","type":"tx","value":141265}
{"fee":872,"height":125673,"origin":"wsh(sortedmulti(1,[7a13a7b1/48h/1h/0h/2h],[30a36b52/48h/1h/0h/2h]))","ref":"f7dc3c574a4f53060b244fa59708f0c30dbeb0a70192f846d9cd74ef278f19b9","time":"2026-03-12T06:05:01Z","type":"tx","value":-3217}
diff --git a/hellbenderTests/Mocks/MockBitcoinService.swift b/birchTests/Mocks/MockBitcoinService.swift
similarity index 99%
rename from hellbenderTests/Mocks/MockBitcoinService.swift
rename to birchTests/Mocks/MockBitcoinService.swift
index 84be8f3..494ecfd 100644
--- a/hellbenderTests/Mocks/MockBitcoinService.swift
+++ b/birchTests/Mocks/MockBitcoinService.swift
@@ -1,5 +1,5 @@
+@testable import birch
import Foundation
-@testable import hellbender
/// Configurable mock for testing ViewModels without BDK dependencies
@MainActor
diff --git a/hellbenderTests/PSBTTests.swift b/birchTests/PSBTTests.swift
similarity index 99%
rename from hellbenderTests/PSBTTests.swift
rename to birchTests/PSBTTests.swift
index f3411d7..e125862 100644
--- a/hellbenderTests/PSBTTests.swift
+++ b/birchTests/PSBTTests.swift
@@ -1,5 +1,5 @@
+@testable import birch
import Foundation
-@testable import hellbender
import Testing
@MainActor
diff --git a/hellbenderTests/SendViewModelTests.swift b/birchTests/SendViewModelTests.swift
similarity index 99%
rename from hellbenderTests/SendViewModelTests.swift
rename to birchTests/SendViewModelTests.swift
index 442cdb1..6e89e15 100644
--- a/hellbenderTests/SendViewModelTests.swift
+++ b/birchTests/SendViewModelTests.swift
@@ -1,5 +1,5 @@
+@testable import birch
import Foundation
-@testable import hellbender
import Testing
@MainActor
diff --git a/hellbenderTests/SigningFlowTests.swift b/birchTests/SigningFlowTests.swift
similarity index 99%
rename from hellbenderTests/SigningFlowTests.swift
rename to birchTests/SigningFlowTests.swift
index e499b40..5f4b694 100644
--- a/hellbenderTests/SigningFlowTests.swift
+++ b/birchTests/SigningFlowTests.swift
@@ -1,5 +1,5 @@
+@testable import birch
import Foundation
-@testable import hellbender
import Testing
@MainActor
diff --git a/hellbenderTests/URServiceTests.swift b/birchTests/URServiceTests.swift
similarity index 99%
rename from hellbenderTests/URServiceTests.swift
rename to birchTests/URServiceTests.swift
index 15bb137..48d5059 100644
--- a/hellbenderTests/URServiceTests.swift
+++ b/birchTests/URServiceTests.swift
@@ -1,5 +1,5 @@
+@testable import birch
import Foundation
-@testable import hellbender
import Testing
struct URServiceTests {
diff --git a/hellbenderTests/WalletProfileTests.swift b/birchTests/WalletProfileTests.swift
similarity index 99%
rename from hellbenderTests/WalletProfileTests.swift
rename to birchTests/WalletProfileTests.swift
index 939a98f..35b3a5f 100644
--- a/hellbenderTests/WalletProfileTests.swift
+++ b/birchTests/WalletProfileTests.swift
@@ -1,5 +1,5 @@
+@testable import birch
import Foundation
-@testable import hellbender
import SwiftData
import Testing
diff --git a/hellbenderUITests/ScreenshotTests.swift b/birchUITests/ScreenshotTests.swift
similarity index 99%
rename from hellbenderUITests/ScreenshotTests.swift
rename to birchUITests/ScreenshotTests.swift
index acb3863..f92ff33 100644
--- a/hellbenderUITests/ScreenshotTests.swift
+++ b/birchUITests/ScreenshotTests.swift
@@ -1,12 +1,12 @@
//
// ScreenshotTests.swift
-// hellbenderUITests
+// birchUITests
//
// Fastlane `snapshot` walker. Invoked by `bundle exec fastlane screenshots`
// (see fastlane/Fastfile). Walks the app from Welcome through the main tabs,
// calling `snapshot(...)` at each marketing stop.
//
-// Kept separate from hellbenderUITests.swift on purpose: the assertion-heavy
+// Kept separate from birchUITests.swift on purpose: the assertion-heavy
// setup test validates that the flow still works, and this test is purely for
// capturing images. The descriptor-import sequence is duplicated (not shared)
// so each test fails in isolation.
@@ -48,7 +48,7 @@ final class ScreenshotTests: XCTestCase {
// MARK: Walk the descriptor-import flow to reach a loaded wallet.
- // (Mirrors hellbenderUITests.swift `testSetupWalletViaDescriptorImport`.)
+ // (Mirrors birchUITests.swift `testSetupWalletViaDescriptorImport`.)
let importCard = app.staticTexts["Import Descriptor"]
XCTAssertTrue(importCard.waitForExistence(timeout: 3), "Creation choice should show 'Import Descriptor' option")
@@ -101,7 +101,7 @@ final class ScreenshotTests: XCTestCase {
let nameField = app.textFields["My Wallet"]
XCTAssertTrue(nameField.waitForExistence(timeout: 3), "Wallet name text field should exist")
nameField.tap()
- nameField.typeText("Hellbender")
+ nameField.typeText("Birch")
// In descriptor-import mode the button reads "Create Wallet" (not "Next")
// and skips the Review screen, going straight to the loaded wallet.
diff --git a/hellbenderUITests/SnapshotHelper.swift b/birchUITests/SnapshotHelper.swift
similarity index 100%
rename from hellbenderUITests/SnapshotHelper.swift
rename to birchUITests/SnapshotHelper.swift
diff --git a/hellbenderUITests/hellbenderUITests.swift b/birchUITests/birchUITests.swift
similarity index 97%
rename from hellbenderUITests/hellbenderUITests.swift
rename to birchUITests/birchUITests.swift
index 13f1003..a9844b3 100644
--- a/hellbenderUITests/hellbenderUITests.swift
+++ b/birchUITests/birchUITests.swift
@@ -1,13 +1,13 @@
//
-// hellbenderUITests.swift
-// hellbenderUITests
+// birchUITests.swift
+// birchUITests
//
// Created by Nick Klockenga on 3/8/26.
//
import XCTest
-final class hellbenderUITests: XCTestCase {
+final class birchUITests: XCTestCase {
var app: XCUIApplication!
override func setUpWithError() throws {
diff --git a/fastlane/Fastfile b/fastlane/Fastfile
index b3a99ea..f0f2fe8 100644
--- a/fastlane/Fastfile
+++ b/fastlane/Fastfile
@@ -27,11 +27,11 @@ platform :ios do
FileUtils.rm_rf(File.expand_path("screenshots/light", __dir__))
# ── 1. Build for testing once ────────────────────────────────────────
- # Produces hellbender.app, hellbenderUITests-Runner.app, and the
+ # Produces birch.app, birchUITests-Runner.app, and the
# .xctestrun manifest that tells xcodebuild which apps to install.
sh("xcodebuild build-for-testing " \
- "-scheme hellbender " \
- "-project ../hellbender.xcodeproj " \
+ "-scheme birch " \
+ "-project ../birch.xcodeproj " \
"-destination 'generic/platform=iOS Simulator' " \
"-derivedDataPath '#{DERIVED_DATA}' " \
"-parallel-testing-enabled NO " \
@@ -133,14 +133,14 @@ platform :ios do
FileUtils.mkdir_p(SCREENSHOT_SRC)
# Run the test with the explicit xctestrun manifest.
- # This installs all DependentProductPaths (including hellbender.app)
+ # This installs all DependentProductPaths (including birch.app)
# automatically — works around the Xcode 26 bug where
# `xcodebuild build test` / `test-without-building -scheme` fail to
# install the host app.
sh("xcodebuild test-without-building " \
"-xctestrun '#{xctestrun_path}' " \
"-destination '#{destination}' " \
- "-only-testing:hellbenderUITests/ScreenshotTests/testScreenshotTour " \
+ "-only-testing:birchUITests/ScreenshotTests/testScreenshotTour " \
"-parallel-testing-enabled NO") do |status|
UI.error("Test failed on #{name} (#{mode} mode)") unless status.success?
end
diff --git a/fastlane/Snapfile b/fastlane/Snapfile
index 734b16c..f06bba1 100644
--- a/fastlane/Snapfile
+++ b/fastlane/Snapfile
@@ -10,11 +10,11 @@ devices([
languages(["en-US"])
# Xcode scheme that contains the UI test target.
-scheme("hellbender")
+scheme("birch")
# Only run the screenshot walker, not the assertion-heavy setup test.
-test_target_name("hellbenderUITests")
-only_testing(["hellbenderUITests/ScreenshotTests/testScreenshotTour"])
+test_target_name("birchUITests")
+only_testing(["birchUITests/ScreenshotTests/testScreenshotTour"])
# Output directory is overridden per invocation in the Fastfile so we can split
# dark and light into sibling directories. This value is the default.
@@ -37,12 +37,12 @@ concurrent_simulators(false)
# Fail fast — if one device fails, don't burn time on the rest.
stop_after_first_error(true)
-# Launch arg read by hellbenderApp.swift to wipe UserDefaults/keychain and
+# Launch arg read by birchApp.swift to wipe UserDefaults/keychain and
# use an in-memory SwiftData store. Every run starts at the Welcome screen.
launch_arguments(["-UITesting"])
# Use project-local derived data instead of fastlane's default /tmp path.
-# The temp path causes xcodebuild to skip installing hellbender.app on the
+# The temp path causes xcodebuild to skip installing birch.app on the
# simulator (only the test runner gets installed), triggering
# "FBSApplicationLibrary returned nil" failures.
derived_data_path("./build/DerivedData")
diff --git a/hellbender/Assets.xcassets/AppIcon.appiconset/AppIcon.png b/hellbender/Assets.xcassets/AppIcon.appiconset/AppIcon.png
deleted file mode 100644
index 9a2408a..0000000
Binary files a/hellbender/Assets.xcassets/AppIcon.appiconset/AppIcon.png and /dev/null differ
diff --git a/hellbender/Assets.xcassets/AppIcon.appiconset/Contents.json b/hellbender/Assets.xcassets/AppIcon.appiconset/Contents.json
deleted file mode 100644
index 87d4015..0000000
--- a/hellbender/Assets.xcassets/AppIcon.appiconset/Contents.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
- "images" : [
- {
- "filename" : "AppIcon.png",
- "idiom" : "universal",
- "platform" : "ios",
- "size" : "1024x1024"
- },
- {
- "appearances" : [
- {
- "appearance" : "luminosity",
- "value" : "dark"
- }
- ],
- "filename" : "AppIcon.png",
- "idiom" : "universal",
- "platform" : "ios",
- "size" : "1024x1024"
- },
- {
- "appearances" : [
- {
- "appearance" : "luminosity",
- "value" : "tinted"
- }
- ],
- "filename" : "AppIcon.png",
- "idiom" : "universal",
- "platform" : "ios",
- "size" : "1024x1024"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/hellbender/Assets.xcassets/WelcomeIcon.imageset/AppIcon.png b/hellbender/Assets.xcassets/WelcomeIcon.imageset/AppIcon.png
deleted file mode 100644
index 9a2408a..0000000
Binary files a/hellbender/Assets.xcassets/WelcomeIcon.imageset/AppIcon.png and /dev/null differ
diff --git a/scripts/build-release.sh b/scripts/build-release.sh
index 910c13e..e8b4da0 100755
--- a/scripts/build-release.sh
+++ b/scripts/build-release.sh
@@ -4,22 +4,22 @@ set -euo pipefail
# build-release.sh — Produce a verifiable unsigned release archive.
# Usage: ./scripts/build-release.sh
#
-# Output: /tmp/hellbender-build/hellbender.xcarchive
+# Output: /tmp/birch-build/birch.xcarchive
-DERIVED_DATA="/tmp/hellbender-build"
+DERIVED_DATA="/tmp/birch-build"
echo "==> Cleaning previous build artifacts..."
rm -rf "$DERIVED_DATA"
echo "==> Archiving (unsigned, Release configuration)..."
xcodebuild archive \
- -scheme hellbender \
- -project hellbender.xcodeproj \
- -archivePath "$DERIVED_DATA/hellbender.xcarchive" \
+ -scheme birch \
+ -project birch.xcodeproj \
+ -archivePath "$DERIVED_DATA/birch.xcarchive" \
-derivedDataPath "$DERIVED_DATA" \
-configuration Release \
CODE_SIGNING_ALLOWED=NO \
CODE_SIGN_IDENTITY="" \
| xcpretty && exit ${PIPESTATUS[0]}
-echo "==> Archive complete: $DERIVED_DATA/hellbender.xcarchive"
+echo "==> Archive complete: $DERIVED_DATA/birch.xcarchive"
diff --git a/scripts/normalize-app.sh b/scripts/normalize-app.sh
index 2ae4cc0..f27775a 100755
--- a/scripts/normalize-app.sh
+++ b/scripts/normalize-app.sh
@@ -6,11 +6,11 @@ set -euo pipefail
# signatures, temp paths) so that two builds from the same source produce identical
# normalized output.
#
-# Usage: ./scripts/normalize-app.sh
+# Usage: ./scripts/normalize-app.sh
#
# Operates in-place on the .app bundle. Make a copy first if you need the original.
-APP_PATH="${1:?Usage: normalize-app.sh }"
+APP_PATH="${1:?Usage: normalize-app.sh }"
if [ ! -d "$APP_PATH" ]; then
echo "Error: $APP_PATH is not a directory" >&2
diff --git a/scripts/patch-frameit.rb b/scripts/patch-frameit.rb
index 5da12b0..4c651d1 100644
--- a/scripts/patch-frameit.rb
+++ b/scripts/patch-frameit.rb
@@ -21,7 +21,7 @@
# Usage:
# bundle exec ruby scripts/patch-frameit.rb
-SENTINEL = "# PATCH: hellbender iPhone 17 frameit support"
+SENTINEL = "# PATCH: birch iPhone 17 frameit support"
EXPECTED_FASTLANE_VERSION = "2.232.2"
# ── Locate gem files ──────────────────────────────────────────────────────────