3 Commits
Author SHA1 Message Date
TZGyn 30d5aff906 Notarize releases so macOS opens the app without a warning
Gatekeeper blocked the app on other machines because it was signed but
not notarized. Sign with a secure timestamp and submit to Apple during
release, so a stapled ticket ships in the zip.

💘 Generated with Crush

Assisted-by: Crush:deepseek-v4.1-flash
2026-09-28 12:19:39 +08:00
TZGyn 6f55861be7 Keep the keyboard input-source icon visible
The hiding boundary sat right of the input-source indicator, so the
hamburger took the slot where the language icon had been. Move the
boundary left of it so the language icon stays, with the hamburger still
at the left edge.

💘 Generated with Crush

Assisted-by: Crush:deepseek-v4.1-flash
2026-09-27 10:44:39 +08:00
TZGyn ccc172d218 Correct the note on keeping the input-source icon
The override pair that keeps it visible also shifts the hamburger one
slot right; document the exact values.

💘 Generated with Crush

Assisted-by: Crush:deepseek-v4.1-flash
2026-09-27 10:41:02 +08:00
5 changed files with 23 additions and 18 deletions
+7
View File
@@ -103,6 +103,13 @@ wants it in the final answer every time. Keep it to the cask upgrade commands
(see the README release section for the exact block), because the app is
installed through the tap.
Notarization: `release.sh` submits to Apple when the `SIMPLETOPBAR_NOTARY_*`
env vars are set (provider, `.p8` path, key id, issuer id). The credentials are
the same App Store Connect key used by Kapture (`~/.config/kapture/AuthKey_*.p8`,
team `RX6767S6BW`); the issuer id is a non-secret UUID from App Store Connect.
Verify with `spctl -a -vv SimpleTopBar.app` → `source=Notarized Developer ID`.
Without the vars it still builds, zips and prints the sha, just unnotarized.
## Status item placement (why not MenuBarExtra)
On a full menu bar, a newly created status item is placed leftmost, which on a
+7 -10
View File
@@ -35,15 +35,11 @@ automatically.
What it can and cannot hide:
- It hides **other third-party apps' icons** (cmux, Kapture, moomoo, WireGuard).
- It **keeps Wi-Fi, Now Playing, Spotlight, Clock, Battery and Control Center**
visible, with the **hamburger at the left edge of that group**. The spacer's
boundary (preferred position 300) falls just left of Now Playing. macOS
reserves the far-right area, so an item can never be placed to the right of
the system icons.
- The input-source indicator is the one system icon that ends up hidden (it sits
immediately left of where the hamburger can go). To keep it, set
`defaults write dev.tzgyn.simpletopbar debug.spacerPos -float 350` (and
`debug.hamburgerPos -float 100`), which moves the hamburger one slot right.
- It **keeps Wi-Fi, Now Playing, the input-source indicator, Spotlight, Clock,
Battery and Control Center** visible, with the **hamburger at the left edge of
that group**. The spacer's boundary (preferred position 330) falls just left
of the input-source indicator. macOS reserves the far-right area, so an item
can never be placed to the right of the system icons.
- Newly launched apps are placed to the left of the spacer, so they are hidden
automatically.
- Advanced: set `defaults write dev.tzgyn.simpletopbar debug.spacerPos -float <n>`
@@ -59,7 +55,8 @@ brew install --cask simpletopbar
```
The tap is hosted on Gitea, so the full URL is required. Homebrew may print an
"Unsupported tap" warning — it's harmless.
"Unsupported tap" warning — it's harmless. Releases from 0.4.8 on are notarized,
so the app opens without a Gatekeeper warning.
## Upgrade
+1 -1
View File
@@ -109,7 +109,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate {
if let override = UserDefaults.standard.object(forKey: "debug.hamburgerPos") as? Double {
UserDefaults.standard.set(override, forKey: positionKey)
} else if UserDefaults.standard.object(forKey: positionKey) == nil {
UserDefaults.standard.set(290.0, forKey: positionKey)
UserDefaults.standard.set(320.0, forKey: positionKey)
}
let item = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength)
+6 -5
View File
@@ -313,14 +313,15 @@ final class MenuBarHider: ObservableObject {
// The boundary between "hidden" and "kept" falls just left of Wi-Fi at
// ~250, so the other apps hide while Apple's Wi-Fi/Clock/Battery/Control
// Center/Spotlight stay visible. `debug.spacerPos` overrides the seed.
// The boundary sits just left of Now Playing, so every Control Center
// item stays visible while the apps hide. It must stay *above* the
// hamburger's preferred position (see AppDelegate) for the hamburger to
// remain on the visible side. `debug.spacerPos` overrides the seed.
// The boundary sits just left of the input-source indicator, so every
// system item (input source, Now Playing, Wi-Fi, …) stays visible while
// the apps hide. It must stay *above* the hamburger's preferred position
// (see AppDelegate) for the hamburger to remain on the visible side.
// `debug.spacerPos` overrides the seed.
if let override = UserDefaults.standard.object(forKey: "debug.spacerPos") as? Double {
UserDefaults.standard.set(override, forKey: key)
} else if UserDefaults.standard.object(forKey: key) == nil {
UserDefaults.standard.set(300.0, forKey: key)
UserDefaults.standard.set(330.0, forKey: key)
}
let item = NSStatusBar.system.statusItem(withLength: 0)
item.autosaveName = name
+2 -2
View File
@@ -2,7 +2,7 @@
set -euo pipefail
cd "$(dirname "$0")"
VERSION="${1:-0.4.6}"
VERSION="${1:-0.4.8}"
swift build -c release
@@ -58,7 +58,7 @@ chmod +x scripts/make-icon.sh
if [ -n "$IDENT" ]; then
security unlock-keychain "$HOME/Library/Keychains/login.keychain-db" 2>/dev/null || true
codesign --force --options runtime --sign "$IDENT" "$APP"
codesign --force --options runtime --timestamp --sign "$IDENT" "$APP"
echo "Built $APP ${VERSION} (signed with Developer ID '$IDENT') — open $APP"
else
codesign --force --sign - "$APP"