- Dart 84.9%
- Swift 12.3%
- HTML 2.5%
- Kotlin 0.2%
| android | ||
| assets | ||
| ios | ||
| lib | ||
| macos | ||
| test | ||
| web | ||
| .gitignore | ||
| .metadata | ||
| analysis_options.yaml | ||
| pubspec.lock | ||
| pubspec.yaml | ||
| README.md | ||
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 was1.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.jsonZIP 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.