Daily Edition Sources +11

How Saracroche carries nearly 17 million phone entries through one narrow iOS doorway

Saracroche turns 1,548 compact French call-list patterns into 16.956 million represented numbers, then hands them to CallKit 10,000 at a time. The source explains the design; it does not prove every entry succeeds on a phone.

Diagram Punk poster mapping an API list through Core Data, a nearly 17-million-number expansion, 10,000-entry stacks, and an App Group doorway into CallKit, with a separate arrow to SMS and a warning that device success is not proven.
Diagram Punknearly 17 million numbers through one narrow doorway.
repo cbouvat/saracroche-ios evidence
11 source signals 1 repo 2 linked commits
Evidence: 2 linked commits / July 12, 2026 / Daily Edition
Open Edition Evidence below

Why should installing a phone-prefix list need a battery warning? In issue #172, contributor Pierre-Yves Lapersonne called Saracroche’s list update costly and proposed asking before continuing in Low Power Mode. The merged pull request added that choice. It is a public clue that this is not merely a list download: it is a synchronization job across an iOS extension boundary.

The live list endpoint returned version 2026-07-12T01:00:59+00:00 with 1,548 wildcard patterns: 615 for blocking and 933 for identification. Applying the project’s wildcard rule produces 14,736,000 represented blocking numbers plus 2,220,000 identification numbers. That 16,956,000 total is a description of the list’s mathematical reach, not an installation count.

The payload itself complicates its ARCEP-flavoured name. Its description separates canvassing prefixes from additional operator ranges and “potential spam” ranges. The client stores the supplied name, action, and pattern, but this repository does not show how those additional ranges are selected, disputed, or retired. The source supports a mixed-origin list, not a claim that every entry is official policy.

The narrow doorway is a separate process

At fixed commit d9fc924, ListService reconciles a fresh payload against API-origin Core Data records. Missing patterns become explicit removal work rather than silently disappearing. The database lives in an App Group container shared by the app and its extensions.

The call path then has to materialize the compact rules. PhoneNumberHelpers expands a # into a numeric range; BlockerService slices those values into batches of at most 10,000. Each handoff writes one action and one number array to shared UserDefaults, reloads the extension, and waits for the next piece.

In the other process, CallDirectoryHandler reads and clears that handoff before issuing CallKit block, identify, or removal operations. A downloaded list and the system state are therefore separate truths the app has to reconcile.

SMS gets to keep the wildcard

Saracroche’s SMS extension takes a different route. MessageFilterService reads the same shared store and compares a sender to the compact pattern character by character. It does not need to expand a million-number prefix before answering one matching question. The interesting engineering is the translation forced by the call-extension interface, not the wildcard alone.

Freshness is a policy, not a result

The project’s reset trail shows why that translation stays alive. PR #175 added daily reprocessing for a fraction of expired patterns; a later commit switched to a full reset after 20 days and retry eligibility after two hours. That is a design for eventual reconstruction, not a benchmark of speed or battery use.

The README’s “every 6 hours” background-update wording needs the same care. The code asks iOS for work no earlier than six hours later, with network and external power required. Apple says earliestBeginDate is not an appointment.

Maintainer Camille Bouvat’s one-year retrospective is the useful final context: he names chunking, extension communication, memory/time limits, and background work as the difficult part of version 4. The next decisive public receipts would be reconciliation tests, a device-level installation benchmark, and provenance for non-ARCEP ranges. Until then, the source makes a narrow doorway visible; it does not prove that all 16.956 million represented entries pass through it.

Evidence Trail

Receipts below the story

The article above is the public narrative. This section keeps the source trail and limits on the same page.

Edition
DateJuly 12, 2026
LaneDaily Edition
Confidence91%
Sources11
Reposcbouvat/saracroche-ios

Dynamic list figures were refreshed against the live July 12 endpoint before staging this late-recovery article.

Primary Evidence

Evidence Limits

  • The endpoint is dynamic. Before publication on July 12, refresh its version, pattern/action counts, and wildcard-derived represented totals; reconsider the headline if the scale changes materially.
  • The 16,956,000 figure describes numbers represented by the July 11 payload and source algorithm. It does not show that all entries were installed successfully, fit within a device's operating limits, or remained current in production.
  • The fixed public tree exposes no automated test target, XCTest import, test directory, or CI workflow. No public device benchmark establishes update time, memory use, battery cost, or success rate. Private or manual testing may exist.
  • Six hours is the earliest background time requested, not a guaranteed cadence. The code requires external power and network, while list download freshness is checked at 24 hours.
  • The payload names mixed origins, but the iOS repository does not expose the selection and verification process for additional operator or "potential spam" ranges.
  • Source inspection does not establish that the App Store binary matches the fixed commit. Local matching is visible in source, but the project also has network surfaces for downloading lists, reports, and SMS deferral; the article therefore avoids a blanket offline or privacy guarantee.
Letters & Corrections

Send a note to the desk

Corrections, missing context, or a follow-up lead.