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
111 changes: 111 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
# Changelog

All notable changes to Container Manager will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [1.1.0] - 2026-02-08

### Added
- **Container Creation Wizard**: 7-step guided process for creating new containers
- Image selection with search and custom image support
- Basic configuration (name, command)
- Port mapping configuration
- Volume mount setup
- Environment variable management
- Network configuration
- Configuration review and confirmation
- **Batch Operations**: Multi-select containers for bulk operations
- Select multiple containers with checkboxes
- Bulk start, stop, restart, or remove
- Batch actions toolbar with operation buttons
- **Enhanced Statistics Dashboard**: Real-time monitoring with live charts
- CPU usage tracking with delta calculations
- Memory usage visualization
- Network I/O monitoring (sent/received)
- Disk I/O tracking (read/write)
- Time range selection (1 minute to 1 hour)
- Historical data collection (up to 6 hours)
- **Code Signing and Release Infrastructure**
- Developer ID Application signing
- Hardened runtime support
- DMG signing with timestamps
- Notarization workflow with Apple
- Automated verification scripts
- Complete signing documentation
- **Animation Preferences**: Accessibility-aware animation controls
- Master animation toggle
- Reduce motion support (app and system)
- Configurable loading indicators
- Compact mode for reduced spacing
- Automatic macOS accessibility integration

### Changed
- Improved stats collection efficiency with background processing
- Enhanced container list with better multi-select UX
- Updated build system with signed and unsigned build targets
- Simplified CI/CD to build validation only

### Fixed
- Stats collection no longer blocks UI thread
- Container creation properly handles custom image names
- Removed unsupported options for Apple's container tool
- Better error messages for container operations
- UI tests no longer require code signing in CI

### Documentation
- Added `SIGNED_RELEASE_GUIDE.md` - Complete signing and notarization guide
- Added `docs/CODE_SIGNING_GUIDE.md` - Technical reference for code signing
- Updated `README.md` with new features and version 1.1.0
- Enhanced Makefile with comprehensive help and new targets
- Created `CHANGELOG.md` for version history tracking

## [1.0.0] - 2026-01-XX

### Added
- Initial release with full desktop application
- Menu bar mode for lightweight monitoring
- Desktop app mode for comprehensive management
- Real-time container monitoring
- Container operations (start, stop, restart, remove)
- Service control (start/stop container service)
- Multi-section sidebar navigation
- Containers view with list/grid modes
- Images management
- Volumes management
- Networks management
- Statistics dashboard
- Settings interface
- Inspector panel for detailed container information
- Auto-refresh with smart update detection
- Keyboard shortcuts for common operations
- Settings and preferences
- Support for Apple's container tool

### Technical Features
- Built with Swift and SwiftUI
- Native macOS 14.0+ support
- Dual-mode operation (menu bar + desktop)
- Efficient polling with change detection
- Thread-safe stats collection
- Flexible command parsing
- Multi-command fallback for compatibility

---

## Release Notes Format

Each release includes:
- **Added**: New features
- **Changed**: Changes to existing functionality
- **Deprecated**: Soon-to-be removed features
- **Removed**: Removed features
- **Fixed**: Bug fixes
- **Security**: Security improvements
- **Documentation**: Documentation updates

---

[1.1.0]: https://github.com/yourusername/container-manager/compare/v1.0.0...v1.1.0
[1.0.0]: https://github.com/yourusername/container-manager/releases/tag/v1.0.0
104 changes: 96 additions & 8 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
.PHONY: help build clean test dmg release install upload-release release-workflow
.PHONY: help build clean test dmg release release-signed dmg-signed install upload-release release-workflow check-signing notarize

# Default target
help:
Expand All @@ -8,19 +8,25 @@ help:
@echo ""
@echo "Targets:"
@echo " build Build the app (debug)"
@echo " release Build the app (release)"
@echo " release Build the app (release, unsigned)"
@echo " release-signed Build the app (release, signed with Developer ID)"
@echo " test Run tests"
@echo " dmg Create DMG package"
@echo " dmg Create DMG package (unsigned)"
@echo " dmg-signed Create signed DMG package"
@echo " clean Clean build artifacts"
@echo " install Install to /Applications"
@echo " run Build and run the app"
@echo " tag Create a git tag"
@echo " upload-release Upload DMG to GitHub (requires VERSION=v1.0.0)"
@echo " release-workflow Complete release: build + package + upload"
@echo " check-signing Check code signing status of DMG"
@echo " notarize Submit DMG for notarization (requires APPLE_ID and TEAM_ID)"
@echo ""
@echo "Environment Variables:"
@echo " VERSION Version tag for release (e.g., v1.0.0)"
@echo " SIGNING_IDENTITY Code signing identity (optional)"
@echo " SIGNING_IDENTITY Code signing identity (default: Developer ID Application: Andrew Bold)"
@echo " APPLE_ID Apple ID email for notarization"
@echo " TEAM_ID Team ID for notarization (default: 6Y922224CW)"
@echo ""

# Build in debug mode
Expand All @@ -31,9 +37,9 @@ build:
-configuration Debug \
-derivedDataPath ./build

# Build in release mode
# Build in release mode (unsigned)
release:
@echo "🔨 Building Container Manager (Release)..."
@echo "🔨 Building Container Manager (Release - Unsigned)..."
xcodebuild clean build \
-scheme container-manager \
-configuration Release \
Expand All @@ -42,23 +48,70 @@ release:
CODE_SIGNING_REQUIRED=NO \
CODE_SIGNING_ALLOWED=NO

# Build in release mode (signed with Developer ID)
release-signed:
@echo "🔨 Building Container Manager (Release - Signed)..."
@SIGNING_ID="$${SIGNING_IDENTITY:-Developer ID Application: Andrew Bold (6Y922224CW)}"; \
echo "📝 Using signing identity: $$SIGNING_ID"; \
xcodebuild clean build \
-scheme container-manager \
-configuration Release \
-derivedDataPath ./build \
CODE_SIGN_IDENTITY="$$SIGNING_ID" \
CODE_SIGN_STYLE=Manual \
DEVELOPMENT_TEAM=6Y922224CW \
OTHER_CODE_SIGN_FLAGS="--timestamp --options runtime"
@echo "✅ Signed build complete"

# Run tests
test:
@echo "🧪 Running tests..."
xcodebuild test \
-scheme container-manager \
-destination 'platform=macOS'

# Create DMG
# Create DMG (unsigned)
dmg: release
@echo "📦 Creating DMG..."
@echo "📦 Creating DMG (unsigned)..."
@chmod +x scripts/create-dmg.sh
@./scripts/create-dmg.sh
@echo "🔗 Creating container-manager.dmg symlink for upload..."
@rm -f container-manager.dmg
@ln -s $$(ls -t container-manager-*.dmg | head -n1) container-manager.dmg
@echo "✅ DMG ready: container-manager.dmg -> $$(readlink container-manager.dmg)"

# Create signed DMG (for distribution)
dmg-signed: release-signed
@echo "📦 Creating signed DMG..."
@APP_PATH=$$(find ./build -name "container-manager.app" -type d | head -n 1); \
if [ -z "$$APP_PATH" ]; then \
echo "❌ Signed app not found. Run 'make release-signed' first"; \
exit 1; \
fi; \
VERSION="signed-$$(date +%Y%m%d-%H%M)"; \
DMG_NAME="container-manager-$$VERSION.dmg"; \
echo "📦 Packaging signed app into DMG..."; \
rm -rf dmg_contents/; \
mkdir -p dmg_contents/; \
cp -R "$$APP_PATH" dmg_contents/; \
hdiutil create -volname "Container Manager" -srcfolder dmg_contents -ov -format UDZO "$$DMG_NAME"; \
rm -rf dmg_contents/; \
echo "🔐 Signing DMG..."; \
SIGNING_ID="$${SIGNING_IDENTITY:-Developer ID Application: Andrew Bold (6Y922224CW)}"; \
codesign --sign "$$SIGNING_ID" \
--timestamp \
--options runtime \
"$$DMG_NAME"; \
echo "🔗 Creating container-manager.dmg symlink..."; \
rm -f container-manager.dmg; \
ln -s "$$DMG_NAME" container-manager.dmg; \
echo "✅ Signed DMG ready: container-manager.dmg -> $$DMG_NAME"
@echo ""
@echo "Next steps:"
@echo " 1. Verify signing: make check-signing"
@echo " 2. Notarize: make notarize APPLE_ID=your-email@example.com"
@echo " 3. Upload: make upload-release VERSION=v1.0.0"

# Clean build artifacts
clean:
@echo "🧹 Cleaning build artifacts..."
Expand Down Expand Up @@ -142,3 +195,38 @@ release-workflow:
echo ""; \
echo "✅ Release workflow complete!"; \
echo "🔗 Go to GitHub to review and publish the draft release"

# Check code signing status
check-signing:
@if [ ! -f "container-manager.dmg" ]; then \
echo "❌ DMG not found. Run 'make dmg' first"; \
exit 1; \
fi
@chmod +x scripts/check-signing.sh
@./scripts/check-signing.sh container-manager.dmg

# Notarize DMG with Apple
notarize:
@if [ -z "$(APPLE_ID)" ]; then \
echo "❌ APPLE_ID not set. Usage: make notarize APPLE_ID=your-email@example.com"; \
exit 1; \
fi
@if [ ! -f "container-manager.dmg" ]; then \
echo "❌ DMG not found. Run 'make dmg-signed' first"; \
exit 1; \
fi
@echo "🍎 Submitting DMG for notarization..."
@echo " This will use the notarytool keychain profile if configured"
@echo " Or prompt for app-specific password if not configured"
@echo ""
@TEAM=$${TEAM_ID:-6Y922224CW}; \
xcrun notarytool submit container-manager.dmg \
--apple-id "$(APPLE_ID)" \
--team-id "$$TEAM" \
--wait
@echo ""
@echo "🎫 Stapling notarization ticket to DMG..."
@xcrun stapler staple container-manager.dmg
@echo ""
@echo "✅ Notarization complete!"
@echo " Run 'make check-signing' to verify"
Loading