Skip to content

Release history and developer statement

An earlier production target retained an internal screenshot/test workflow capable of inserting sample records, forcing local storage, bypassing locks, or simulating iCloud and App Group status. We acknowledge that this was inappropriate. Our prior response records describe removing this workflow and submitting the corrected iOS version before the September 2 notice. The developer reported that the corrected version was In Review on September 4 while the app was removed from the storefront.

Status clarification · September 13, 2026

Before the September 2 Pending Termination Notice, EasyTallys was In Review. The other six listings — VPN XX, VPN XX PRO, SpellVPN Tool, SpellVPN Ultra, ArtCut and ArtCut Pro — were shown as Distributable.

The developer now reports that all seven apps have been removed from the public App Store, while their status records remain visible in App Store Connect. Storefront removal does not mean that the app records or platform/version statuses have disappeared. A visible status is not evidence of restored distribution or membership.

This clarification was supplied by the developer on September 13. It is not an independent live check of App Store Connect, an Apple receipt, or a change to the preserved September 12 source evidence.

Download status clarification (TXT)

What the inspected material supports

The source excerpts show that the remaining language and initial-route launch overrides are inside DEBUG conditions, and that the inspected storage/account checks call Apple system APIs. The local response document is a developer-authored record, not an Apple approval or upload receipt. These excerpts alone do not certify the historical uploaded binary.

Next steps / not yet verified as complete

We ask Apple to evaluate the corrected submission and identify the exact build, test conditions, and behavior if the issue is still observed. We will match the submitted archive, production entitlements, metadata, and real-device behavior before further releases. We do not claim the pending correction has been approved.

Supporting evidence

E01

EasyTallys: earlier developer response and submission record

These are preserved local developer statements. Assertions about a submitted Release binary or App Store metadata in this record have not been independently matched to an uploaded archive or Apple receipt.

Selected excerpt

Source: AppleLedger/AppStoreAssets/submission/GUIDELINE_5_6_RESPONSE_EN.md · 1–17

Numbered source excerpt; selected lines preserved.

    1 | # Guideline 5.6 Resolution Center Response
    2 | 
    3 | Thank you for identifying this issue. We reviewed the rejected build and found that the production app target incorrectly retained an internal screenshot workflow. That workflow included launch arguments and environment variables that could inject sample records, force a local data store, bypass the privacy lock, and simulate iCloud or App Group availability. We understand that retaining this behavior in a production build was inappropriate and could appear intentionally hidden.
    4 | 
    5 | The new build removes that workflow completely:
    6 | 
    7 | - All screenshot-only data creation, deletion, and injection code has been removed.
    8 | - All forced-local-store launch arguments and environment variables have been removed.
    9 | - All privacy-lock and automatic-lock bypasses have been removed.
   10 | - All simulated iCloud and App Group status results have been removed.
   11 | - All language- or region-based app-icon switching, the English alternate icon, and the related system-switch prompt have been removed. Every user now receives the same primary "好记" icon.
   12 | - Ledger, account, transaction, collaborator, and cold-wallet screens now display only data actually created and stored by the user.
   13 | - The submitted Release binary contains no screenshot route, language override, demo-data, forced-local-store parameter, or alternate app icon.
   14 | 
   15 | The app does not hide or reveal features based on reviewer identity, date, region, device, build source, or server configuration. App Review and all users now execute the same Release code path. All features are accessible through the normal user interface, and the App Store description and screenshots explicitly disclose shared ledgers and the on-device cold wallet vault.
   16 | 
   17 | No backend account is required. iCloud and shared-ledger features can be tested on a device signed in to an Apple ID.
Original whole-file SHA-256
04dfa389f217c2659f02d6cf1af820d647e7fb1c4a7a0ef228bb83cfd1126120
Numbered excerpt SHA-256
b16507111ff0949a1c6012b2071b718c574ecc1bab03f7d6c62fab5dada50c57

Source: AppleLedger/README.md · 143–164

Numbered source excerpt; selected lines preserved.

  143 | Hello App Review Team,
  144 | Thank you for reviewing our app.
  145 | As explained in our response dated August 11, we investigated the previous rejection and identified an internal screenshot-production workflow that had been mistakenly retained in the production target. We understand why the presence of that workflow could have appeared to be hidden behavior.
  146 | We have now submitted a corrected iOS binary:
  147 | Version 1.0.2 (Build 1.0.1)
  148 | This build supersedes the previously rejected binary and includes the following remediation:
  149 | - All screenshot-only sample-data creation, deletion, and injection code has been removed.
  150 | - The Release binary contains no screenshot route, demo-data parameter, forced-local-store parameter, language override, privacy-lock bypass, or automatic-lock bypass.
  151 | - All simulated iCloud and App Group results have been removed. The app now displays only the actual status reported by Apple system services.
  152 | - No alternate app-icon switching is available in the Release build. Every user receives the same primary “好记” icon.
  153 | - Ledger, account, transaction, collaborator, and cold-wallet screens display only information created and stored by the user.
  154 | - The app does not change, hide, or reveal functionality based on reviewer identity, date, region, device, build source, network response, or server configuration.
  155 | - App Review and all users execute the same Release code path.
  156 | EasyTallys (“好记”) is a local-first personal and family bookkeeping app. It has no developer-hosted account or backend, no advertising, no third-party analytics, no remote feature configuration, no in-app purchases or paywall, and does not download executable code or configuration that changes its functionality.
  157 | Ledger data is stored on the user’s device. If the user enables iCloud, ledger data is synchronized only through Apple CloudKit under the user’s own Apple ID. No developer-provided login credentials are required.
  158 | All features are accessible through the normal user interface:
  159 | - Bookkeeping features are available from Overview, Transactions, Accounts, Budgets, Reports, and Library.
  160 | - CloudKit shared-ledger features are available under Library > Sharing. Testing requires a device signed in to an Apple ID.
  161 | - The on-device Keychain vault is available under Library > Cold Wallets. It only stores information manually entered by the user in the current device’s ThisDeviceOnly Keychain. It does not create cryptocurrency wallets, connect to blockchain services, perform transfers or trading, or upload vault information to any server.
  162 | These features are also disclosed in the App Store description, screenshots, and Notes for Review.
  163 | We respectfully request that App Review evaluate Version 1.0.2 (Build 1.0.1).
  164 | If App Review still observes behavior associated with Guideline 5.6 in this corrected build, could you please identify the specific feature, navigation path, review steps, device conditions, or provide a screenshot of the observed behavior? This information would allow us to reproduce and address the concern immediately.
Original whole-file SHA-256
b6e872e127759a760d75f34c142123d3215189c9f8418d289fffb924189c9318
Numbered excerpt SHA-256
d5e772387b59a78bad0f0fe71ccc3123f1e631c7495cd5666b731b6e6cfb4f6b

E02

EasyTallys: language launch overrides

The selected override path is inside a DEBUG condition. This is not a full Release binary audit.

Selected excerpt

Source: AppleLedger/AppleLedgerShared/Services/AppLanguage.swift · 127–141

Numbered source excerpt; selected lines preserved.

  127 |     static var selected: AppLanguage {
  128 |         #if DEBUG
  129 |         let processInfo = ProcessInfo.processInfo
  130 |         if let value = processInfo.environment[environmentKey], let language = AppLanguage(value) {
  131 |             return language
  132 |         }
  133 |         if let index = processInfo.arguments.firstIndex(of: launchArgument),
  134 |            processInfo.arguments.indices.contains(index + 1),
  135 |            let language = AppLanguage(processInfo.arguments[index + 1]) {
  136 |             return language
  137 |         }
  138 |         #endif
  139 |         let rawValue = AppSettingsStore.defaults.string(forKey: storageKey) ?? AppLanguage.system.rawValue
  140 |         return AppLanguage(rawValue: rawValue) ?? .system
  141 |     }
Original whole-file SHA-256
e55240c882da8632bce65b040fab307aa4e07fba12294ed488447ad1b0caa370
Numbered excerpt SHA-256
0c4537f83e79b2f38e9f5e966bdbe2746f9a5df5a876b79306cc19d123f70ad3

E03

EasyTallys: initial-route launch argument

The selected initial-route override is DEBUG-only, followed by a normal dashboard default.

Selected excerpt

Source: AppleLedger/AppleLedgerShared/Views/RootView.swift · 115–129

Numbered source excerpt; selected lines preserved.

  115 | private struct AppInitialRoute {
  116 |     var section: AppSection
  117 |     var libraryTab: LibraryTab
  118 |     var quickEntryKind: TransactionKind?
  119 | 
  120 |     static var current: AppInitialRoute {
  121 |         #if DEBUG
  122 |         let arguments = ProcessInfo.processInfo.arguments
  123 |         if let routeArgumentIndex = arguments.firstIndex(of: "-AppleLedgerInitialRoute"),
  124 |            arguments.indices.contains(routeArgumentIndex + 1) {
  125 |             return AppInitialRoute(rawValue: arguments[routeArgumentIndex + 1])
  126 |         }
  127 |         #endif
  128 |         return AppInitialRoute(section: .dashboard, libraryTab: .ledgers, quickEntryKind: nil)
  129 |     }
Original whole-file SHA-256
f0bb697266d3b82c98dfb214e0a91e071bbbdfe8bd83e1f908864c21dca2a9b6
Numbered excerpt SHA-256
b95510fab3811e7afca1a0c19bbfc8fbb7166d64eb07108fddb8721ee810c934

E04

EasyTallys: Apple storage and account checks

These paths use FileManager and CKContainer. They do not prove production entitlements, successful synchronization, or historical binary contents.

Selected excerpt

Source: AppleLedger/AppleLedgerShared/Services/AppModelContainer.swift · 341–345

Numbered source excerpt; selected lines preserved.

  341 |     private static var appGroupStoreDirectory: URL? {
  342 |         FileManager.default
  343 |             .containerURL(forSecurityApplicationGroupIdentifier: appGroupIdentifier)?
  344 |             .appending(path: "AppleLedger", directoryHint: .isDirectory)
  345 |     }
Original whole-file SHA-256
5446c56d0591b286adb91933164f3d57ba18ebaf3eca6c6e0d127c4cdec81f26
Numbered excerpt SHA-256
c15b66dab90d09d02b80d9bd3205fe99abfd6dc139804dad96cfe5d1df194225

Source: AppleLedger/AppleLedgerShared/Services/ImportExportService.swift · 436–441

Numbered source excerpt; selected lines preserved.

  436 |     static func saveLatestBackup(_ archiveData: Data, createdAt: Date = .now) async throws -> ManualICloudBackupMetadata {
  437 |         #if canImport(CloudKit)
  438 |         let container = CKContainer(identifier: AppModelContainer.cloudKitContainerIdentifier)
  439 |         guard try await container.accountStatus() == .available else {
  440 |             throw ManualICloudBackupError.accountUnavailable
  441 |         }
Original whole-file SHA-256
dcadccf109343eb36c509f40027ba929a99b8c54cb2329ce6c65b013d8c65eb5
Numbered excerpt SHA-256
6ab26ec700b69059464470a8d49d50be5a8d94545d4d8075bf74cfac87d88fa2

How to read this evidence

The record combines developer-confirmed release history, current local source excerpts, local metadata drafts, and two original developer-supplied form screenshots. These are different evidence types. No exact historical upload archives, Apple upload receipts, production service authorization documents, or new App Store approvals are included. A SHA-256 digest identifies the captured bytes; it does not certify that Apple reviewed or received them. Selected excerpts are not an exhaustive code or binary audit.

This is a public, sanitized record with identical content for all readers. It omits personal account identifiers, private correspondence, node credentials and working public subscription URLs. It is not password protected. Original materials can be provided privately to Apple through an appropriate channel if requested. Search-engine noindex is a preference, not access control.

Explanatory pages are available in English, Chinese and Russian. Source excerpts and original screenshots remain unchanged in their original languages; translations are not original evidence.

All evidence items →