Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 0 additions & 43 deletions .github/workflows/pr-agent.yml

This file was deleted.

3 changes: 3 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,5 +24,8 @@ jobs:
echo "BUILD_NUMBER=$GITHUB_RUN_NUMBER" >> version.env
cat version.env

- name: Run tests
run: swift test

- name: Verify build
run: swift build -c release
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ DerivedData/
.swiftpm/
/tmp/
unifbar-debug.log
.env
.envrc

# Debug scripts with credential access
Scripts/api_debug.swift
Expand Down
20 changes: 0 additions & 20 deletions .pr_agent.toml

This file was deleted.

24 changes: 24 additions & 0 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
{
"configurations": [
{
"type": "swift",
"request": "launch",
"args": [],
"cwd": "${workspaceFolder:UniFiBar}",
"name": "Debug UniFiBar",
"target": "UniFiBar",
"configuration": "debug",
"preLaunchTask": "swift: Build Debug UniFiBar"
},
{
"type": "swift",
"request": "launch",
"args": [],
"cwd": "${workspaceFolder:UniFiBar}",
"name": "Release UniFiBar",
"target": "UniFiBar",
"configuration": "release",
"preLaunchTask": "swift: Build Release UniFiBar"
}
]
}
27 changes: 27 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# Changelog

## [1.0.0] — 2026-05-09

### Added
- WiFi Experience Score with satisfaction percentage and trend indicators
- Signal monitoring (RSSI, noise floor, signal quality trends)
- Access point details (current AP, channel, WiFi standard, MIMO configuration)
- Link speeds (Rx/Tx rates, session data transfer totals)
- Roaming detection with alerts when switching between access points
- Internet health (WAN status, ISP name, latency, availability, packet drops)
- Gateway monitoring (CPU, memory, uptime, throughput)
- WAN throughput (real-time upload/download speeds)
- VPN tunnel status (site-to-site tunnels)
- Network overview (total clients, devices online/offline, firmware updates)
- Session history with daily roaming breakdown by access point
- Optional monitoring sections: Dynamic DNS, port forwards, nearby APs
- Launch at login via macOS login items
- Self-signed certificate support with trust-on-first-use pinning
- Wired Ethernet connection support
- Compact mode for reduced menu bar footprint
- Configurable poll interval (10s–300s)
- Section visibility toggles (show/hide feature sections)
- Diagnostics log with export support
- Update checker (GitHub releases)
- Preferences window (edit credentials, reset all)
- Setup flow for first-launch configuration
2 changes: 0 additions & 2 deletions CODEOWNERS

This file was deleted.

5 changes: 5 additions & 0 deletions Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,11 @@ let package = Package(
resources: [
.copy("../../Resources/Assets.xcassets")
]
),
.testTarget(
name: "UniFiBarTests",
dependencies: ["UniFiBar"],
path: "Tests/UniFiBarTests"
)
]
)
87 changes: 87 additions & 0 deletions Scripts/build_common.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
#!/bin/bash
# Shared bundle assembly functions for UniFiBar build scripts.
# Source this file: source "$(dirname "$0")/build_common.sh"

assemble_app_bundle() {
local APP_BUNDLE="$1"
local BINARY="$2"
local PROJECT_DIR="$3"
local BUILD_DIR="$4"

echo "==> Assembling $(basename "$APP_BUNDLE") bundle..."
rm -rf "$APP_BUNDLE"
mkdir -p "$APP_BUNDLE/Contents/MacOS"
mkdir -p "$APP_BUNDLE/Contents/Resources"

cp "$BINARY" "$APP_BUNDLE/Contents/MacOS/$APP_NAME"

# Generate Info.plist
cat > "$APP_BUNDLE/Contents/Info.plist" << PLIST
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleExecutable</key>
<string>$APP_NAME</string>
<key>CFBundleIdentifier</key>
<string>com.unifbar.app</string>
<key>CFBundleName</key>
<string>$APP_NAME</string>
<key>CFBundleVersion</key>
<string>$BUILD_NUMBER</string>
<key>CFBundleShortVersionString</key>
<string>$APP_VERSION</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>LSMinimumSystemVersion</key>
<string>26.0</string>
<key>CFBundleIconFile</key>
<string>AppIcon</string>
<key>LSUIElement</key>
<true/>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsLocalNetworking</key>
<true/>
</dict>
<key>NSLocalNetworkUsageDescription</key>
<string>UniFiBar needs access to your local network to connect to your UniFi controller.</string>
</dict>
</plist>
PLIST

# Copy entitlements
if [ -f "$PROJECT_DIR/UniFiBar.entitlements" ]; then
cp "$PROJECT_DIR/UniFiBar.entitlements" "$APP_BUNDLE/Contents/Resources/"
fi

# Generate .icns from app icon PNGs (if available)
local ICON_SRC="$PROJECT_DIR/Resources/Assets.xcassets/AppIcon.appiconset"
if [ -d "$ICON_SRC" ]; then
local ICONSET_DIR="$BUILD_DIR/AppIcon.iconset"
rm -rf "$ICONSET_DIR"
mkdir -p "$ICONSET_DIR"
cp "$ICON_SRC/icon_16x16.png" "$ICONSET_DIR/icon_16x16.png" 2>/dev/null || true
cp "$ICON_SRC/icon_16x16@2x.png" "$ICONSET_DIR/icon_16x16@2x.png" 2>/dev/null || true
cp "$ICON_SRC/icon_32x32.png" "$ICONSET_DIR/icon_32x32.png" 2>/dev/null || true
cp "$ICON_SRC/icon_32x32@2x.png" "$ICONSET_DIR/icon_32x32@2x.png" 2>/dev/null || true
cp "$ICON_SRC/icon_128x128.png" "$ICONSET_DIR/icon_128x128.png" 2>/dev/null || true
cp "$ICON_SRC/icon_128x128@2x.png" "$ICONSET_DIR/icon_128x128@2x.png" 2>/dev/null || true
cp "$ICON_SRC/icon_256x256.png" "$ICONSET_DIR/icon_256x256.png" 2>/dev/null || true
cp "$ICON_SRC/icon_256x256@2x.png" "$ICONSET_DIR/icon_256x256@2x.png" 2>/dev/null || true
cp "$ICON_SRC/icon_512x512.png" "$ICONSET_DIR/icon_512x512.png" 2>/dev/null || true
cp "$ICON_SRC/icon_512x512@2x.png" "$ICONSET_DIR/icon_512x512@2x.png" 2>/dev/null || true
iconutil -c icns "$ICONSET_DIR" -o "$APP_BUNDLE/Contents/Resources/AppIcon.icns" 2>/dev/null || true
else
echo "WARNING: App icon assets not found at $ICON_SRC, skipping icon generation"
fi

# Copy status bar icon (if available)
local STATUSBAR_SRC="$PROJECT_DIR/Resources/Assets.xcassets/StatusBarIcon.imageset"
if [ -d "$STATUSBAR_SRC" ]; then
cp "$STATUSBAR_SRC/icon@1x.png" "$APP_BUNDLE/Contents/Resources/" 2>/dev/null || true
cp "$STATUSBAR_SRC/icon@2x.png" "$APP_BUNDLE/Contents/Resources/" 2>/dev/null || true
else
echo "WARNING: Status bar icon assets not found, skipping"
fi
}
79 changes: 11 additions & 68 deletions Scripts/compile_and_run.sh
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,15 @@ APP_NAME="UniFiBar"
BUILD_DIR="$PROJECT_DIR/.build"
APP_BUNDLE="$BUILD_DIR/$APP_NAME.app"

# Source version info
source "$PROJECT_DIR/version.env"
# Source version info (with defaults)
APP_VERSION="0.0.0"
BUILD_NUMBER="0"
if [ -f "$PROJECT_DIR/version.env" ]; then
source "$PROJECT_DIR/version.env"
fi

# Source shared bundle assembly
source "$SCRIPT_DIR/build_common.sh"

echo "==> Killing existing $APP_NAME..."
pkill -x "$APP_NAME" 2>/dev/null || true
Expand All @@ -24,76 +31,12 @@ if [ ! -f "$BINARY" ]; then
exit 1
fi

echo "==> Assembling $APP_NAME.app bundle..."
rm -rf "$APP_BUNDLE"
mkdir -p "$APP_BUNDLE/Contents/MacOS"
mkdir -p "$APP_BUNDLE/Contents/Resources"

cp "$BINARY" "$APP_BUNDLE/Contents/MacOS/$APP_NAME"

# Generate Info.plist
cat > "$APP_BUNDLE/Contents/Info.plist" << PLIST
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleExecutable</key>
<string>$APP_NAME</string>
<key>CFBundleIdentifier</key>
<string>com.unifbar.app</string>
<key>CFBundleName</key>
<string>$APP_NAME</string>
<key>CFBundleVersion</key>
<string>$BUILD_NUMBER</string>
<key>CFBundleShortVersionString</key>
<string>$APP_VERSION</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>LSMinimumSystemVersion</key>
<string>26.0</string>
<key>CFBundleIconFile</key>
<string>AppIcon</string>
<key>LSUIElement</key>
<true/>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsLocalNetworking</key>
<true/>
</dict>
</dict>
</plist>
PLIST

# Copy entitlements
if [ -f "$PROJECT_DIR/UniFiBar.entitlements" ]; then
cp "$PROJECT_DIR/UniFiBar.entitlements" "$APP_BUNDLE/Contents/Resources/"
fi

# Generate .icns from app icon PNGs
ICONSET_DIR="$BUILD_DIR/AppIcon.iconset"
rm -rf "$ICONSET_DIR"
mkdir -p "$ICONSET_DIR"
ICON_SRC="$PROJECT_DIR/Resources/Assets.xcassets/AppIcon.appiconset"
cp "$ICON_SRC/icon_16x16.png" "$ICONSET_DIR/icon_16x16.png"
cp "$ICON_SRC/icon_16x16@2x.png" "$ICONSET_DIR/icon_16x16@2x.png"
cp "$ICON_SRC/icon_32x32.png" "$ICONSET_DIR/icon_32x32.png"
cp "$ICON_SRC/icon_32x32@2x.png" "$ICONSET_DIR/icon_32x32@2x.png"
cp "$ICON_SRC/icon_128x128.png" "$ICONSET_DIR/icon_128x128.png"
cp "$ICON_SRC/icon_128x128@2x.png" "$ICONSET_DIR/icon_128x128@2x.png"
cp "$ICON_SRC/icon_256x256.png" "$ICONSET_DIR/icon_256x256.png"
cp "$ICON_SRC/icon_256x256@2x.png" "$ICONSET_DIR/icon_256x256@2x.png"
cp "$ICON_SRC/icon_512x512.png" "$ICONSET_DIR/icon_512x512.png"
cp "$ICON_SRC/icon_512x512@2x.png" "$ICONSET_DIR/icon_512x512@2x.png"
iconutil -c icns "$ICONSET_DIR" -o "$APP_BUNDLE/Contents/Resources/AppIcon.icns" 2>/dev/null || true

# Copy status bar icon
cp "$PROJECT_DIR/Resources/Assets.xcassets/StatusBarIcon.imageset/icon@1x.png" "$APP_BUNDLE/Contents/Resources/"
cp "$PROJECT_DIR/Resources/Assets.xcassets/StatusBarIcon.imageset/icon@2x.png" "$APP_BUNDLE/Contents/Resources/"
assemble_app_bundle "$APP_BUNDLE" "$BINARY" "$PROJECT_DIR" "$BUILD_DIR"

echo "==> Signing (ad-hoc)..."
codesign --force --sign - "$APP_BUNDLE" 2>/dev/null || true

echo "==> Launching $APP_NAME..."
open "$APP_BUNDLE"

echo "==> Done! $APP_NAME is running."
echo "==> Done! $APP_NAME is running."
Loading