A tally counter for iOS and watchOS. Tap to count up, swipe to count down, swipe across to reset. Comes in 10 flat colors. No analytics, no accounts, no dependencies.
Originally Objective-C / UIKit. Fully rewritten in Swift / SwiftUI / SwiftData in January 2026.
- Tap a row to increment the counter
- Swipe left to decrement
- Swipe right to reset to zero
- Long-press for the context menu (rename, change color, delete)
Haptic feedback on every interaction; warning haptic on destructive actions.
| Component | Tech |
|---|---|
| UI | SwiftUI |
| Persistence | SwiftData (@Model, @Query) |
| Architecture | Lightweight MVVM; views own their state |
| Watch app | watchOS 10+, WatchConnectivity |
| Language | Swift 5+ |
| Minimum iOS / watchOS | 17.0 / 10.0 |
| Dependencies | None — pure Apple frameworks |
See ARCHITECTURE.md for a deeper walkthrough of the
project layout, data model, and patterns.
You need: macOS with Xcode 15+ and an Apple Developer account (for device testing).
# 1. Clone
git clone https://github.com/BalloonInc/trivit.git
cd trivit
# 2. Open in Xcode
open trivit.xcodeproj # or trivit.xcworkspace if you see oneIn Xcode:
- Pick the trivit scheme and a simulator (iPhone 17 Pro works fine).
- Hit ⌘R. It should build and launch the app — no extra config needed for the simulator.
- To run on a real device:
- Open Signing & Capabilities for the
trivittarget. - Set your own Team (this repo's Team ID is for the original maintainers; you'll need to replace it).
- Change the bundle identifier to something unique under your team,
e.g.
com.yourname.trivit. - Plug in your iPhone, select it as the run destination, ⌘R.
- Open Signing & Capabilities for the
Useful command-line build / run:
# Build for a simulator
xcodebuild -scheme trivit \
-destination 'platform=iOS Simulator,name=iPhone 17 Pro' build
# Install on a connected device (replace the device UDID)
xcrun devicectl device install app --device <UDID> \
~/Library/Developer/Xcode/DerivedData/trivit-*/Build/Products/Debug-iphoneos/trivit.appThe watchOS companion is in trivit Watch App/. It mirrors the iPhone's list
and lets you increment from the wrist. Cross-device sync is via
WatchConnectivity, with App Groups configured for shared SwiftData storage
(group: group.com.wouterdevriendt.trivit).
If you fork, you'll need to either:
- create your own App Group identifier on the Apple Developer Portal and swap it into the entitlements, or
- run iPhone-only and skip the watch target.
The fastlane/ directory has the release automation. There are GitHub
Actions workflows for TestFlight internal, TestFlight external, and App
Store. See fastlane/README.md and CLAUDE.md for details.
- Wouter Devriendt — wouter@ballooninc.be
- Pieterjan Criel — crielpieterjan@gmail.com
- Balloon Inc support — support@ballooninc.be
See LICENSE — Polyform Noncommercial 1.0.0. Free for personal
and non-commercial use.