No description
  • Dart 84.9%
  • Swift 12.3%
  • HTML 2.5%
  • Kotlin 0.2%
Find a file
2026-11-06 19:52:32 -06:00
android Rewrite in Flutter/Dart, export additional platforms. 2026-11-06 19:52:32 -06:00
assets Rewrite in Flutter/Dart, export additional platforms. 2026-11-06 19:52:32 -06:00
ios Rewrite in Flutter/Dart, export additional platforms. 2026-11-06 19:52:32 -06:00
lib Rewrite in Flutter/Dart, export additional platforms. 2026-11-06 19:52:32 -06:00
macos Rewrite in Flutter/Dart, export additional platforms. 2026-11-06 19:52:32 -06:00
test Rewrite in Flutter/Dart, export additional platforms. 2026-11-06 19:52:32 -06:00
web Rewrite in Flutter/Dart, export additional platforms. 2026-11-06 19:52:32 -06:00
.gitignore Rewrite in Flutter/Dart, export additional platforms. 2026-11-06 19:52:32 -06:00
.metadata Rewrite in Flutter/Dart, export additional platforms. 2026-11-06 19:52:32 -06:00
analysis_options.yaml Rewrite in Flutter/Dart, export additional platforms. 2026-11-06 19:52:32 -06:00
pubspec.lock Rewrite in Flutter/Dart, export additional platforms. 2026-11-06 19:52:32 -06:00
pubspec.yaml Rewrite in Flutter/Dart, export additional platforms. 2026-11-06 19:52:32 -06:00
README.md Rewrite in Flutter/Dart, export additional platforms. 2026-11-06 19:52:32 -06:00

PayGrade — Flutter

Flutter/Dart rewrite of the sibling Swift PayGrade project. The original project is unchanged.

Run

flutter pub get
flutter run -d macos
# Or select an iOS simulator, Android device, or Chrome.
flutter analyze
flutter test

Apple identity

  • Bundle identifier: ltd.lazywolf.pg (iOS and macOS).
  • Apple developer team: F768TWVS3H (original application target; the old project's project-level team differs).
  • iOS Debug: automatic development signing.
  • iOS Release/Profile: manual distribution signing with PayGrade Distribution.
  • Version: 2.0.0+10005; original version was 1.0.2+10003. Check the latest App Store build before uploading.
  • Original iOS icon catalog is retained, including its appearance variants.

Signing certificates and private keys are not repository resources. Export certificate + private key from Runewalker's login keychain as a password-protected .p12, import into Kaelsforge's login keychain, sign into the matching Apple developer account in Xcode, and download the provisioning profile. Verify with security find-identity -v -p codesigning. Do not commit .p12 files, passwords, or provisioning profiles.

The original repository contains an iOS application target, not a separate macOS signing configuration. macOS uses the same bundle ID/team here but requires a provisioning/signing setup appropriate to its distribution channel; an iOS distribution profile cannot sign macOS apps. Flutter does not supply watchOS or tvOS runners in this project.

Features and data

  • All six branches and rank names are extracted from the original Swift resources.
  • Service profile, existing pay-chart endpoint, manual base pay, allowances and deductions.
  • Current/projected balance, semi-monthly deposits, and paid bill occurrences.
  • Seven recurring bill frequencies with calendar-day recurrence and short-month clamping.
  • Budgets, transaction entry, automatic period archives, and receipt attachments.
  • Original data.json ZIP backup format, nested record merging by ID/modification date, and receipt files.
  • Light/dark themes and responsive shared screens.

On Apple platforms a read-only native bridge reads the original pg_* UserDefaults and receipt directory on first launch. Swift's reference-date timestamps are converted to ISO dates. The old keys/files are retained. Flutter then saves separately under pg_flutter_v1. Test this using an actual in-place app upgrade before release; uninstalling the original app removes its sandbox. Android/web use new local data or imported backups.

Receipt bytes are stored with local application data and included as receipts/ ZIP entries. Shared preferences/local web storage is not encrypted and is intended for a personal local dataset; large receipt collections will need file/database storage before production use at scale. Keep external backups. Web API access also depends on the existing server's CORS configuration.

Validation and remaining release work

Verified: clean Dart analysis; six passing unit/widget tests; macOS debug build; iOS simulator debug build from a clean local copy outside ProtonDrive. Tests cover month boundaries, recurring bills, archive rollover, persistence, record merging, Swift-compatible backup dates, and first-run navigation.

Building iOS directly inside ProtonDrive failed during ad-hoc framework signing with “resource fork, Finder information, or similar detritus not allowed.” Use a local working/build copy outside the synced folder for Apple builds; copying source without extended attributes resolved the simulator build. Device migration, actual certificate/profile signing, receipt camera permissions, and App Store distribution require testing with the user's Apple setup. Android release signing is not configured; the generated runner currently uses a debug signing key.

The Flutter interface follows the original functions and amber palette but is not a pixel-for-pixel SwiftUI recreation. The first pass simplifies setup into a single screen. Bill expiration and archive retention have editing controls. Archive transactions can be viewed and edited, including moving them between periods by date.