appstore-automation 2bbf6f9 · autopull stalled (164s)

Dashboard

Аккаунтов
43
BOOTSTRAPPED: 41IN_PROGRESS: 2
Приложений
45
Fingerprint coverage
97.7%
42 / 43 аккаунтов
Прокси
46
(unset): 46

Аккаунты

Аккаунт App Proxy Статус Last action Comment
luma-garden
Melle Vrogop · BOOTSTRAPPED
🟢 session 0.0d
Luma Garden
com.mellevrogop.lumagarden
NL
Waiting for Review v1.0 submit 06-18 07:54
poll: 39 min ago
2026-06-18 07:54
Meadow Idle
com.meadowidle.app
TR
🚨 Removed from App Store flagged 2026-06-18 13:45 UTC
Waiting for Review v1.1 submit 06-18 01:11
Ready for Sale v1.0 submit 06-10 18:02 → live 06-15 20:21 (122.3h)
poll: 6 min ago
2026-06-18 01:11
Compost Idle
com.compostidle.app
FI
🚨 Removed from App Store flagged 2026-06-18 23:02 UTC
Waiting for Review v1.1 submit 06-18 10:41
Ready for Sale v1.0 submit 06-11 21:55 → live 06-16 10:35 (108.7h)
poll: 4s ago
2026-06-18 10:41

Recent jobs (auto-refresh каждые 10s)

KindStateAccount / AppCreatedError
RELOGIN_VM NEEDS_OPERATOR railway-district 2026-06-21 18:25 relogin agent failed: RuntimeError: proxy preflight failed for socks5://178.93.44.120:54044 → https://appstoreconnect.ap
RELOGIN_VM NEEDS_OPERATOR railway-district 2026-06-21 18:25 relogin agent failed: RuntimeError: proxy preflight failed for socks5://178.93.44.120:54044 → https://appstoreconnect.ap
RELOGIN_VM NEEDS_OPERATOR railway-district 2026-06-21 18:25 relogin agent failed: RuntimeError: proxy preflight failed for socks5://178.93.44.120:54044 → https://appstoreconnect.ap
CHECK_RC_THREADS NEEDS_OPERATOR railway-district 2026-06-21 18:24 session expired (ASC redirected to /login). Re-bootstrap or use the relogin button to refresh cookies. [transient retrie
CHECK_RC_THREADS COMPLETED noveris 2026-06-21 18:17
CHECK_RC_THREADS COMPLETED luma-garden 2026-06-21 18:14
CHECK_RC_THREADS COMPLETED velmora-pets 2026-06-21 18:06
CHECK_RC_THREADS COMPLETED elunari 2026-06-21 17:44
CHECK_RC_THREADS COMPLETED skate-district 2026-06-21 16:51
CHECK_RC_THREADS COMPLETED noveris 2026-06-21 16:21
CHECK_RC_THREADS COMPLETED railway-district 2026-06-21 16:17
RELOGIN_VM COMPLETED luma-garden 2026-06-21 15:59
CHECK_RC_THREADS COMPLETED luma-garden 2026-06-21 15:58
CHECK_RC_THREADS COMPLETED velmora-pets 2026-06-21 15:53
CHECK_REMOVED_FROM_SALE COMPLETED railway-district 2026-06-21 15:41

📐 Как работает система

Архитектура

  • Rental Mac на Apple Silicon — единая физическая машина, на ней крутится orchestrator (FastAPI + SQLite + Alembic) и набор VM через Tart.
  • Один Apple Developer аккаунт = одна VM = одно приложение (модель 1:1:1:1). Это изоляция identity на железо-близком уровне: каждая VM имеет свой serial, MAC, IOPlatformUUID (рандомизирует Tart) и свой residential proxy с sticky session.
  • Orchestrator — управляет всем флоу: создание аккаунтов, bootstrap VM, регистрация приложений в ASC, build/upload/submit. Хранит state в SQLite (WAL).
  • VM-агент — крутится внутри каждой публишер-VM, выполняет ASC web flows через Patchright (login, генерация API key, screenshots, set privacy, validate for review) и обмен с Apple через ASC REST API.
  • Resolution Center опрашивается периодически на предмет реджектов; если приложение получило DEVELOPER_REJECTED / METADATA_REJECTED — orchestrator парсит ответ Apple и кладёт в БД.

Workflow одного приложения (от 0 до App Store)

  1. POST /accounts — оператор создаёт аккаунт. Orchestrator: генерит fingerprint profile (детерминировано из account.id), шифрует Apple ID password через sops+age, создаёт DB-row.
  2. BOOTSTRAP_VM — клонирует Tart VM из base image, ставит ssh known_hosts pin, шлёт SOPS-блоб с identity, заходит в ASC через Patchright, проходит 2FA по SMS, создаёт ASC API key, выгружает .p8 обратно на хост зашифрованным через age.
  3. POST /apps — оператор регистрирует приложение (slug, bundle_id, repo URL, и т.д.). Orchestrator запускает PROVISION_APP — создаёт bundle_id и app row в ASC через REST API.
  4. BUILD_IPA — git clone репо на rental, fetch_signing_files (codemagic-cli-tools достаёт signing assets из ASC), use_profiles, xcodebuild → .ipa. Логи + sha256 сохраняются.
  5. UPLOAD_BUILD — Transporter app загружает .ipa в ASC, ждёт processing, привязывает к версии через REST.
  6. PUSH_METADATA — описание, keywords, скриншоты (per-locale per-device-set), age rating, pricing ($0), availability (175 территорий минус 6: CHN, HKG, KOR, LBY, OMN, YEM), review contact info.
  7. SET_APP_PRIVACY — VM-агент через Patchright проходит privacy questionnaire в ASC web (нет API), отвечает "No data collected".
  8. SUBMIT_FOR_REVIEW — UI probe в VM проверяет readiness, потом REST: создать reviewSubmission, прикрепить version, PATCH submitted=true.
  9. POLL_REVIEW_STATE — периодически опрашивает Apple; при изменении state обновляет DB, при rejected — запускает FETCH_REJECTION (парсит resolution center messages).

Что хранится в БД

  • accounts — Apple ID + first_name/last_name + country + phone + proxy + vm_name + bootstrap_state + asc_key_id/issuer_id + fingerprint_profile_json (детерминирован из id, immutable).
  • apps — slug + bundle_id + repo + scheme + project_path + privacy/support URL + categories + age rating + review contact + excluded_territories + deploy proxy + asc_app_id (после PROVISION).
  • versions, localizations, screenshots — per-version-locale данные, версия → локализации → скриншоты.
  • builds — сырые .ipa: путь, sha256, версия из CFBundleShortVersionString/CFBundleVersion, asc_build_id (после upload).
  • jobs — очередь работ, state machine: PENDING → RUNNING → COMPLETED / NEEDS_OPERATOR / CANCELLED. Поддерживает depends_on_job_id для цепочек.
  • proxies — endpoint + name + country (для fingerprint coherence) + notes.
  • resolution_center_threads/messages — переписка с Apple review team при реджектах.

Секреты

  • sops + age для всего: Apple ID passwords (per-account), .p8 ASC API keys (зашифрованы внутри VM, выгружаются на rental), bootstrap-blob с identity на VM.
  • Plaintext-секрет НИКОГДА не пишется на диск (sub-project B "secret hygiene").

🛡️ Уникализация (anti-correlation)

Цель: вести 10–50+ Apple Developer аккаунтов так, чтобы Apple's correlation engine не смог объединить их в один кластер по shared device-fingerprint / network / behavioral сигналам. Failure mode, который защищаем: один реджект по контенту → каскадный бан всей фермы потому что correlation engine видит общие сигналы у виновного аккаунта и его соседей.

Что Tart рандомизирует автоматически

  • Mac serial number (per VM)
  • MAC адреса
  • IOPlatformUUID
  • Hostname (мы ставим publisher-{slug})

Чего у Tart НЕ хватает (наш слой добавляет)

Sub-project A — Browser fingerprint per-VM ✅ ВНЕДРЕНО

Реализована полная hybrid-схема:

  • Persona pick — детерминировано из sha256(account.id)[:8] mod 31. 31 hand-curated Mac конфигурация: M1/M1 Pro/M1 Max, M2/M2 Pro/M2 Max, M3/M3 Pro/M3 Max, macOS 14.4–15.2, Chrome 122–125, экраны от MBA 13" до Studio Display.
  • Per-account jitter — детерминирован из sha256(account.id)[8:24] через random.Random. Сиды для:
    • Canvas noise — ~3% pixels nudge ±1 LSB
    • AudioContext noise — 1e-7 magnitude perturbation на FloatFrequencyData
    • WebGL precision jitter ±1 LSB
    • WebRTC ICE candidate seed
    • Battery level (15-95%) + charging
    • Шрифты — random subset optional fonts (drop 0-3)
  • Coherence — TZ + locale + accept-language + ui_languages выводятся из proxy.country. ~50 стран замаплены в COUNTRY_TZ + COUNTRY_LOCALE.
  • Покрыто 24 dimensions: navigator.userAgent / userAgentData / Sec-CH-UA / platform / languages / hardwareConcurrency / deviceMemory / plugins / mimeTypes / connection / getBattery, screen.{width/height/availWidth/availHeight/colorDepth/pixelDepth}, window.{devicePixelRatio/outerWidth/outerHeight}, Intl.DateTimeFormat timezone, Date.getTimezoneOffset, Canvas getImageData/toDataURL/toBlob, WebGL UNMASKED_VENDOR/RENDERER/getShaderPrecisionFormat/getExtension/getSupportedExtensions, AudioContext AnalyserNode + OfflineAudioContext, document.fonts API, WebRTC ICE.
  • Защита от tamperingObject.defineProperty(... {configurable: false}) + поддельный toString = "[native code]" на каждом override.
  • StorageAccount.fingerprint_profile_json immutable после создания, /var/appstore-automation/fingerprint.json в VM. stealth.launch_persistent читает файл и применяет на каждом launch Patchright.

Sub-project B — OS-level identifier scrub 🟡 ПЛАНИРУЕТСЯ

На уровне macOS внутри VM при bootstrap нужно перегенерить:

  • /var/db/SystemPolicyConfiguration token
  • Имя + UUID локального юзера (сейчас все admin)
  • Spotlight metadata, SystemConfiguration history
  • persistent com.apple.uuid launchd

Это закрывает leaks вне браузера — Transporter, devicecheck token, ASC web в Safari (если когда-нибудь понадобится).

Sub-project C — Proxy + ASN diversification 🟡 ПЛАНИРУЕТСЯ

Сейчас все аккаунты на одном провайдере residential proxies, один диапазон IP. Server-side кластеризация по ASN — один SQL join. Решение:

  • Multi-vendor: 3+ провайдеров, разные ASN
  • Города распределены (US East/West/Central, не один)
  • GeoIP probe (через сам proxy → ipapi.co) для авто-заполнения Proxy.country
  • Per-proxy validation: latency + last-checked + IP-country mismatch detection

Sub-project D — TLS/JA3 variation ⚪ ОТЛОЖЕНО (низкий ROI)

Все VM используют один Patchright/Chromium build → identical TLS ClientHello → один JA3 hash. Решение — разные Chromium версии на разных VM. Maintenance-нагрузка высокая, marginal ROI ниже A/B/C/E. Сделаем последним если станет нужно.

Sub-project E — Behavioral + metadata diversification 🟡 ПЛАНИРУЕТСЯ

Apple видит не только статические fingerprint, но и behavioral signals:

  • Тайминги между шагами bootstrap (один и тот же паттерн на всех VM = подозрительно)
  • Структура metadata (одинаковые формы review contact, одинаковые copyright templates)
  • Скриншоты (одинаковый encoder, одинаковые dimensions)
  • Workflow timing (всегда submit через X минут после upload)

Решение: jitter helper, рандомные delays (gauss-distributed), варьируем review contact format, рандомизируем порядок действий где Apple API позволяет.

Что НЕ покрыто (бизнес-уровень, не код)

  • Разные платежи / юр.лица / DUNS на каждый Apple Developer аккаунт
  • Разные SMS-провайдеры (сейчас все esimplus.me)
  • Разные Apple ID email домены (gmail vs proton vs custom)

Realistic risk profile

С полным A+B+C+E уровень "пройти Apple's passive correlation engine при ферме до 50 аккаунтов" — реалистично. Targeted investigation with humans + identity diversification — за пределами кода, бизнес-решение.