Aptabase hashes its user_id from IP + user agent with a salt that rotates daily, so events can never be linked across days and no retention or MAU figure can come out of the export. In 19 days of data not one of 82 user_ids appears on two dates, which is the artefact, not the behaviour. Instead of an identity, every event now carries this install's own counters, kept in UserDefaults/DataStore: tenure_days, launch_no, active_days and dormant_days. Only derived day counts leave the device, so the privacy position is unchanged. They make the curve countable in the export: launch_no == 1 marks exactly one launch per install, dormant_days >= 1 exactly one launch per calendar day, so D_k is the share of installs seen again with tenure_days == k. Event date minus tenure_days is the install date, which gives full cohort tables. Installs predating the counters have no install date and report tenure_days == -1 forever, so they can be excluded instead of inflating the new-install cohort. The Kotlin counter arithmetic sits in a pure advance() so it can be tested without a Context; this adds the app module's first JVM test source set.
Cable
Cable is a SwiftUI app for laying out low voltage electrical systems. It helps you size conductors, manage saved loads, and browse the VoltPlan component library so you can assemble accurate bills of materials for off-grid or mobile installs.
Requirements
- macOS with Xcode 15 or newer
- iOS 17 simulator (iPhone 15 target used in CI)
- SwiftData and SwiftUI are bundled with the Xcode toolchain; no additional dependencies are required
Getting Started
open Cable.xcodeprojlaunches the project with the correct scheme configuration- Alternatively run
xed Cable.xcodeprojfrom Terminal to open the project in Xcode - Select the Cable scheme and the iPhone 15 simulator, then press Run
Build & Test from the Command Line
- Build:
xcodebuild -scheme Cable -destination 'platform=iOS Simulator,name=iPhone 15' build - Test (unit + UI bundles):
xcodebuild -scheme Cable -destination 'platform=iOS Simulator,name=iPhone 15' test - Clean derived data if Xcode caches cause issues:
xcodebuild -scheme Cable clean
Project Layout
Cable/– SwiftUI source, models, and assets (CableApp.swift,CalculatorView,SystemEditorView,ComponentLibraryView, etc.)CableTests/– Focused XCTest coverage for calculator logic, unit conversions, and persistence helpersCableUITests/– UI automation flows that exercise onboarding, load editing, and the component browserfastlane/– Automation scripts for screenshots and releasesCable.xcodeproj– Project configuration targeting iOS 17
Core Features
- Interactive cable sizing calculator with support for metric and imperial unit systems
- SwiftData-backed storage for electrical systems and saved loads
- Remote VoltPlan component library with searchable affiliate links
- Onboarding flows that guide new users through system setup and load entry
Development Tips
- Stick to idiomatic Swift style: four-space indentation, trailing commas on multiline collections, and
UpperCamelCase/lowerCamelCasenaming - Keep SwiftUI view files focused on a single primary view; extract helpers when logic grows
- Run the test targets before opening a pull request to maintain coverage
- Commit messages should be short, imperative phrases (e.g.,
Update library paging)
Description
Languages
Swift
59.6%
Kotlin
31.4%
PureBasic
3.8%
Shell
2.7%
HTML
1.1%
Other
1.4%