···11+# ZipMerge
22+33+A macOS app that helps students merge changes from teacher-provided zip files when version control isn't available.
44+55+## The Problem
66+77+You're working on a programming assignment. Your professor gives you a starter zip file. You make changes. Then the professor releases an updated zip with fixes or new requirements. Now you need to figure out what changed and merge those updates into your modified code - without losing your work.
88+99+**ZipMerge solves this.**
1010+1111+## What It Does
1212+1313+ZipMerge compares your local project directory with a teacher's zip file and shows you:
1414+1515+- 🟢 **New files** from the teacher
1616+- 🟠 **Modified files** with side-by-side diffs
1717+- 🔴 **Deleted files** that are in your version but not theirs
1818+- ⚪ **Unchanged files** (shown but ignored)
1919+2020+For each file, you choose:
2121+- **Keep Mine** - Ignore the teacher's version
2222+- **Take Theirs** - Replace with the teacher's version
2323+2424+After reviewing all changes, apply them with one click. If your project is a git repo, ZipMerge can automatically create a commit for you.
2525+2626+## Installation
2727+2828+### Via Homebrew (Recommended)
2929+3030+```bash
3131+brew tap jaspermayone/tap
3232+brew install --cask zipmerge
3333+```
3434+3535+### Manual Installation
3636+3737+1. Download `ZipMerge.zip` from the [latest release](https://github.com/jaspermayone/ZipMerge/releases/latest)
3838+2. Unzip and move `ZipMerge.app` to `/Applications`
3939+3. Open the app (right-click → Open on first launch)
4040+4141+## Usage
4242+4343+1. **Select your project directory** - Click "Choose Directory" or drag it in
4444+2. **Drop the teacher's zip file** - Drag the `.zip` file onto the drop zone
4545+3. **Review changes** - Click through each modified file and see the diffs
4646+4. **Make decisions** - For each file, choose "Keep Mine" or "Take Theirs"
4747+5. **Apply changes** - Click "Apply Changes" to merge
4848+6. **Commit (optional)** - If it's a git repo, create a commit with the changes
4949+5050+## Features
5151+5252+- **Side-by-side diff viewer** for modified files
5353+- **File-by-file merge decisions** - no forced overwrites
5454+- **Git integration** - auto-detect repos and offer to commit
5555+- **Smart zip handling** - handles zips with wrapper folders
5656+- **Automatic cleanup** - removes temp files after merge
5757+5858+## Development
5959+6060+### Building from Source
6161+6262+```bash
6363+# Clone the repository
6464+git clone https://github.com/jaspermayone/ZipMerge.git
6565+cd ZipMerge
6666+6767+# Open in Xcode
6868+open ZipMerge.xcodeproj
6969+7070+# Or build from command line
7171+xcodebuild -project ZipMerge.xcodeproj -scheme ZipMerge -configuration Release build
7272+```
7373+7474+### Project Structure
7575+7676+- `ZipMerge/Models.swift` - Data models for file comparisons
7777+- `ZipMerge/FileComparer.swift` - Core comparison and merge logic
7878+- `ZipMerge/ContentView.swift` - Main UI
7979+- `ZipMerge/DiffView.swift` - Diff visualization
8080+8181+See [CLAUDE.md](CLAUDE.md) for detailed architecture documentation.
8282+8383+### Creating a Release
8484+8585+See [RELEASING.md](RELEASING.md) for the release process.
8686+8787+## Known Limitations
8888+8989+- Currently supports whole-file merge decisions only (no line-by-line merging)
9090+- Binary files show as "(binary or unreadable)" in diff view
9191+- Requires macOS with SwiftUI support
9292+9393+## Contributing
9494+9595+Contributions are welcome! Please feel free to submit a Pull Request.
9696+9797+## License
9898+9999+Licensed under the [O'Saasy License Agreement](LICENSE.md) - essentially MIT with a non-compete clause for SaaS offerings.
100100+101101+## Author
102102+103103+Built by [Jasper Mayone](https://jaspermayone.com) to survive COMP1050 with a professor who won't use version control.
104104+105105+## Acknowledgments
106106+107107+Sometimes the best tools come from personal frustration. This is one of those times.