Please be kind. This project follows the Contributor Covenant. Security reports go to sysrootix@gmail.com — see SECURITY.md, not a public issue.
Architecture (App / Providers / parsers / credentials / UI) is in docs/ARCHITECTURE.md.
Use a short prefix and a kebab-case topic:
fix/cursor-reset-datefeat/provider-namedocs/architecturetest/codex-fixtures
Fork, push the branch, and open a pull request against main.
Makefile targets are the source of truth (local and CI):
make test # regenerate the Xcode project, run unit tests
make app # Release .app in dist/
make zip # dist/CheckUsage.app.zip (used by the release workflow)Requires macOS 14+, Xcode 16+ / Swift 6, and XcodeGen (brew install xcodegen).
-
make testpasses on your Mac -
make appif you touched UI, resources, or the bundle - No secrets (see below)
- Parser or copy changes have fixtures / unit tests
- New strings are added to every language table in
L10n.swift/ExtraL10n.swift(English is the runtime fallback, not an excuse to skip tables) - User-facing changes listed under Unreleased in CHANGELOG.md
Use the GitHub PR template. Keep commits short and in English; say why, not just what.
Do not add tokens, cookies, Keychain dumps, .env, auth.json, .credentials.json, hosts.yml, state.vscdb, or crash logs that show a live credential. Test payloads must be synthetic. CheckUsage must never log tokens.
If you paste a secret by mistake, rotate it at the provider and tell the maintainer privately (SECURITY.md).
- Add a case to
ProviderID. - Parse the JSON in
UsageParsers— keep network out of the parser. - Fetch in
UsageServiceusing credentials the official app already stored. Do not invent a new login flow unless the provider only has API keys. - Add a Simple Icons SVG in
Resources/Logosand a fallback mark inProviderMark. - Add a fixture test with a real-looking payload.
- Never log tokens, cookies, or Keychain blobs.
New providers that need reverse-engineering a live unofficial API should be discussed in an issue first. Do not attach credentials.
Strings live in L10n.swift and ExtraL10n.swift. Add the same key to every language table. If you skip a language, English is the fallback.
- Move Unreleased notes in CHANGELOG.md into a new
## [X.Y.Z] - YYYY-MM-DDsection and add compare links. - Bump
CFBundleShortVersionString/MARKETING_VERSIONandCFBundleVersion/CURRENT_PROJECT_VERSIONinResources/Info.plistandproject.yml. - Merge to
main. - Tag and push:
git tag v1.x.x
git push origin v1.x.x(git push origin main --tags also works.)
.github/workflows/release.ymlruns onv*tags:make zip, then creates the GitHub Release if it is missing and attachesCheckUsage.app.zip.
The public build is ad-hoc signed. Notarization / Developer ID is out of scope until an Apple Developer account is configured for this repo.