[
  {
    "url": "https://capacitor-integration--paxum-preview.netlify.app",
    "branch": "capacitor-integration",
    "site": "paxum-preview",
    "title": "fix(auth): set dark icon color for native SSO buttons\n\nOverride the white icon color with #1d2939 inside ._native so Apple\nicon stays dark on the light mobile login background.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>\n, SHA: e7a1c997, Branch: capacitor-integration",
    "updated_at": "2026-04-15T17:37:57.230Z",
    "kind": "preview",
    "has_ota": true
  },
  {
    "url": "https://spa-5421--paxum-preview.netlify.app",
    "branch": "spa-5421",
    "site": "paxum-preview",
    "title": "chore: remove eslint plugin and enable ncu filter for centrifuge\n\nRemove vite-plugin-eslint2 import\n, SHA: 320e8a16, Branch: spa-5421",
    "updated_at": "2026-04-15T16:32:38.796Z",
    "kind": "preview",
    "has_ota": false
  },
  {
    "url": "https://spa-5202--paxum-preview.netlify.app",
    "branch": "spa-5202",
    "site": "paxum-preview",
    "title": "Merge branch 'master' into spa-5202\n\n# Conflicts:\n#\tsrc/core/helpers/checkLoggedIn.ts\n, SHA: 1d41542f, Branch: spa-5202",
    "updated_at": "2026-04-15T14:35:19.841Z",
    "kind": "preview",
    "has_ota": false
  },
  {
    "url": "https://merchant-application--paxum-preview.netlify.app",
    "branch": "merchant-application",
    "site": "paxum-preview",
    "title": "feat(merchant): add document api store and query methods\n, SHA: 074fedde, Branch: merchant-application",
    "updated_at": "2026-04-15T14:14:56.684Z",
    "kind": "preview",
    "has_ota": false
  },
  {
    "url": "https://spa-5394--paxum-preview.netlify.app",
    "branch": "spa-5394",
    "site": "paxum-preview",
    "title": "[SPA-5394] reset skipActivationAnimation when new actionable step appears\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>\n, SHA: 5e15ac20, Branch: spa-5394",
    "updated_at": "2026-04-15T13:18:27.972Z",
    "kind": "preview",
    "has_ota": false
  },
  {
    "url": "https://spa-5256-api--paxum-preview.netlify.app",
    "branch": "spa-5256-api",
    "site": "paxum-preview",
    "title": "[SPA-5256] remove state filter by 00\n, SHA: 85767ade, Branch: SPA-5256-api",
    "updated_at": "2026-04-15T12:48:30.651Z",
    "kind": "preview",
    "has_ota": false
  },
  {
    "url": "https://spei--paxum-preview.netlify.app",
    "branch": "spei",
    "site": "paxum-preview",
    "title": "[SPA-5412] approve fix\n, SHA: b7ab1f38, Branch: spei",
    "updated_at": "2026-04-15T12:11:10.714Z",
    "kind": "preview",
    "has_ota": false
  },
  {
    "url": "https://spa-5400--paxum-preview.netlify.app",
    "branch": "spa-5400",
    "site": "paxum-preview",
    "title": "[SPA-5400] fix race condition on Flutter app restart via TanStack Query\n\nRoot cause: when user kills and reopens the Flutter app, sessionStorage\nis cleared but Flutter injects tokens via SET_FLUTTER_TOKEN, setting\nisAuthed=true before user data loads. The navigation guard skipped the\nverification redirect because email was empty, letting the user reach\nthe home page where API calls failed with \"Invalid account ID\".\n\nFix:\n- Make checkLoggedIn guard async: when isAuthed but email is empty\n  (app restart scenario), await getUserData() before routing decision\n- Migrate requestCustomerInfo to TanStack Query (ensureQueryData):\n  both the guard and onRouterReady call getUserData(), but TQ\n  deduplicates — only one actual network request is made\n- Add clearQueryCache() to clearUserData on logout\n- Create useCustomerInfoQuery hook (first step of TQ migration for\n  user data, queryKey: customer.info)\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>\n, SHA: b28af835, Branch: spa-5400",
    "updated_at": "2026-04-14T16:37:48.989Z",
    "kind": "preview",
    "has_ota": false
  },
  {
    "url": "https://spa-5417--paxum-preview.netlify.app",
    "branch": "spa-5417",
    "site": "paxum-preview",
    "title": "[SPA-5417] Replace photo tip with scan/PDF upload on address failure page\n\nPhotos are no longer accepted for address verification. Updated i18n key\ntipAddressClearPhoto → tipAddressUploadScan and all 6 translations.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>\n, SHA: ee041f2d, Branch: spa-5417",
    "updated_at": "2026-04-14T14:35:11.229Z",
    "kind": "preview",
    "has_ota": false
  },
  {
    "url": "https://spa-5413--paxum-preview.netlify.app",
    "branch": "spa-5413",
    "site": "paxum-preview",
    "title": "SPA-5413 fix(docs): update document verification address validation messages\n\nSimplify address validation error messages across all languages to clearly\nstate that document address must match profile address. Remove confusing\n\\\"could not be found\\\" language that implied technical issues rather than\nvalidation requirements.\n\nUpdate verification store logic to handle new address rejection reason\nmapping and reorganize case statements for better readability.\n, SHA: 177b80f9, Branch: spa-5413",
    "updated_at": "2026-04-14T14:03:52.947Z",
    "kind": "preview",
    "has_ota": false
  },
  {
    "url": "https://spa-5414--paxum-preview.netlify.app",
    "branch": "spa-5414",
    "site": "paxum-preview",
    "title": "[SPA-5414] Fix typo in relatedExplanation English translation\n\nRemove extra period before comma: \"with you.,\" → \"with you,\"\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>\n, SHA: 47cbcb95, Branch: spa-5414",
    "updated_at": "2026-04-14T12:28:52.654Z",
    "kind": "preview",
    "has_ota": false
  },
  {
    "url": "https://spa-5222--paxum-preview.netlify.app",
    "branch": "spa-5222",
    "site": "paxum-preview",
    "title": "SPA-5222 fix: prevent partial locale init from blocking retries\n\nSeparate message cache (loadedLocales) from initialization flag\n(localeInitialized) so that a failed changeLocale does not prevent\nsubsequent retries in initLocale. Also move loadedLocales check\nbefore loadLocaleMessage to avoid unnecessary fetches.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>\n, SHA: 6dcb8118, Branch: SPA-5222",
    "updated_at": "2026-04-14T11:12:54.213Z",
    "kind": "preview",
    "has_ota": false
  },
  {
    "url": "https://capacitor-integration-ci2--paxum-preview.netlify.app",
    "branch": "capacitor-integration-ci2",
    "site": "paxum-preview",
    "title": "publish script update, SHA: 8a354d59, Branch: capacitor-integration-ci2",
    "updated_at": "2026-04-13T18:50:03.387Z",
    "kind": "preview",
    "has_ota": true
  },
  {
    "url": "https://registration-migrate--paxum-preview.netlify.app",
    "branch": "registration-migrate",
    "site": "paxum-preview",
    "title": "refactor: extract composables from 9 components to resolve CI warnings\n\nMove script logic into composables for components exceeding complexity\nthresholds (120 meaningful lines / 12 logic units):\n\n- editNodePopup.vue → useEditNodePopup.ts\n- nodeFormCompany.vue → useNodeFormCompany.ts\n- RegistrationAddressForm.vue → useRegistrationAddressForm.ts\n- FieldSelect.vue → useFieldSelect.ts\n- FieldSuggestion.vue → useFieldSuggestion.ts\n- _GeneralStep.vue → useGeneralStep.ts\n- LegalStep.vue → useLegalStep.ts\n- ShareholdersStep.vue → useShareholdersStep.ts\n- UsersStep.vue → useUsersStep.ts\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>\n, SHA: 876884fe, Branch: registration-migrate",
    "updated_at": "2026-04-13T13:05:57.141Z",
    "kind": "preview",
    "has_ota": false
  },
  {
    "url": "https://master-2025--paxum-preview.netlify.app",
    "branch": "master-2025",
    "site": "paxum-preview",
    "title": "Merge branch 'branch-deploy' into 'master'\n\nbranch deploy\n\nSee merge request dev/new.paxum.com!2084, SHA: c5da812d, Branch: master-2025",
    "updated_at": "2026-04-10T15:31:29.377Z",
    "kind": "preview",
    "has_ota": false
  },
  {
    "url": "https://iban--paxum-preview.netlify.app",
    "branch": "iban",
    "site": "paxum-preview",
    "title": "Merge remote-tracking branch 'origin/master' into iban\n, SHA: a8884333, Branch: iban",
    "updated_at": "2026-04-10T15:16:29.613Z",
    "kind": "preview",
    "has_ota": false
  },
  {
    "url": "https://spa-5075--paxum-preview.netlify.app",
    "branch": "spa-5075",
    "site": "paxum-preview",
    "title": "Merge remote-tracking branch 'origin/master' into SPA-5075\n, SHA: 0bc1183d, Branch: SPA-5075",
    "updated_at": "2026-04-10T15:16:07.159Z",
    "kind": "preview",
    "has_ota": false
  },
  {
    "url": "https://spa-5183--paxum-preview.netlify.app",
    "branch": "spa-5183",
    "site": "paxum-preview",
    "title": "Merge remote-tracking branch 'origin/master' into SPA-5183\n, SHA: d7bc42c4, Branch: SPA-5183",
    "updated_at": "2026-04-10T15:14:47.469Z",
    "kind": "preview",
    "has_ota": false
  },
  {
    "url": "https://spa-5214--paxum-preview.netlify.app",
    "branch": "spa-5214",
    "site": "paxum-preview",
    "title": "Merge remote-tracking branch 'origin/master' into SPA-5214\n, SHA: 85c0fe3f, Branch: SPA-5214",
    "updated_at": "2026-04-10T15:14:24.470Z",
    "kind": "preview",
    "has_ota": false
  },
  {
    "url": "https://spa-5256--paxum-preview.netlify.app",
    "branch": "spa-5256",
    "site": "paxum-preview",
    "title": "Merge remote-tracking branch 'origin/master' into SPA-5256\n, SHA: ad445559, Branch: SPA-5256",
    "updated_at": "2026-04-10T15:11:15.006Z",
    "kind": "preview",
    "has_ota": false
  },
  {
    "url": "https://spa-5398-2--paxum-preview.netlify.app",
    "branch": "spa-5398-2",
    "site": "paxum-preview",
    "title": "Merge remote-tracking branch 'origin/master' into SPA-5398-2\n, SHA: 1a27c002, Branch: SPA-5398-2",
    "updated_at": "2026-04-10T15:07:33.450Z",
    "kind": "preview",
    "has_ota": false
  },
  {
    "url": "https://instant-2--paxum-preview.netlify.app",
    "branch": "instant-2",
    "site": "paxum-preview",
    "title": "[INSTANT] rename extra param title\n, SHA: 94ee285b, Branch: instant-2",
    "updated_at": "2026-04-10T13:56:47.893Z",
    "kind": "preview",
    "has_ota": false
  },
  {
    "url": "https://spa-5408--paxum-preview.netlify.app",
    "branch": "spa-5408",
    "site": "paxum-preview",
    "title": "[SPA-5408] fix: clear stale extra params on reset and fetch failure in useExtraParams\n\nresetExtraRequested now clears extraList and formData.extraParams so\nInstantStepBank does not render/submit stale beneficiary fields after\nisOwn/customerType changes. Early-exit and catch paths in fetchExtra\nalso clear state to prevent stale data from persisting.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>\n, SHA: ffc06b25, Branch: spa-5408",
    "updated_at": "2026-04-10T12:17:41.101Z",
    "kind": "preview",
    "has_ota": false
  },
  {
    "url": "https://spa-5409--paxum-preview.netlify.app",
    "branch": "spa-5409",
    "site": "paxum-preview",
    "title": "SPA-5409: Fix TypeError in account select filter by casting label/name to String\n, SHA: 5f2e360c, Branch: SPA-5409",
    "updated_at": "2026-04-10T11:52:02.482Z",
    "kind": "preview",
    "has_ota": false
  },
  {
    "url": "https://ci-test-complexity-check--paxum-preview.netlify.app",
    "branch": "ci-test-complexity-check",
    "site": "paxum-preview",
    "title": "feat: include complexity warnings in Telegram pipeline notification\n\n- Bash script saves warnings to complexity_report.txt artifact\n- notify_pipeline.sh downloads the artifact via GitLab API\n- Adds \"Script complexity\" section to Telegram message\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>\n, SHA: 6329f827, Branch: ci-test-complexity-check",
    "updated_at": "2026-04-10T08:52:07.252Z",
    "kind": "preview",
    "has_ota": false
  },
  {
    "url": "https://paxum-12091--paxumbank-preview.netlify.app",
    "branch": "paxum-12091",
    "site": "paxumbank-preview",
    "title": "Fix phone code submission after resend error and cleanup lint warnings\n\n- Move clearTimer() after successful verifyPhoneRequest to preserve verifyRouterId on failure\n- Replace deprecated CoreButton with UiButton in ConfirmPhoneForm\n- Remove unused watch import in PhoneVerificationStep\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>\n, SHA: d6699e1c, Branch: paxum-12091",
    "updated_at": "2026-04-06T12:54:14.161Z",
    "kind": "preview",
    "has_ota": false
  },
  {
    "url": "https://spa-5352--aplus-preview.netlify.app",
    "branch": "spa-5352",
    "site": "aplus-preview",
    "title": "[SPA-5352] fix: deploy notifications only after notify-result, fix preview URLs\n\n- Only send individual deploy notification if notify-result has already\n  completed (prevents duplicates for automatic deploys)\n- Compute preview URL in after_script since before_script exports are\n  not available in after_script (separate shell session)\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>\n, SHA: 58262880, Branch: spa-5352",
    "updated_at": "2026-03-24T19:12:22.467Z",
    "kind": "preview",
    "has_ota": false
  },
  {
    "url": "https://spa-5352--paxumbank-preview.netlify.app",
    "branch": "spa-5352",
    "site": "paxumbank-preview",
    "title": "[SPA-5352] fix: add allow_failure to manual deploy jobs so they don't block notify stage\n\nManual jobs (prod deploys, release-candidate on non-auth branches)\nwithout allow_failure block the pipeline from advancing to the\nnotify stage. They already send their own Telegram notifications.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>\n, SHA: ea6ad126, Branch: spa-5352",
    "updated_at": "2026-03-24T18:51:12.625Z",
    "kind": "preview",
    "has_ota": false
  },
  {
    "url": "https://capacitor-integration--paxumbank-preview.netlify.app",
    "branch": "capacitor-integration",
    "site": "paxumbank-preview",
    "title": "Apply eslint + prettier auto-fixes\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>\n, SHA: 6ac60937, Branch: capacitor-integration",
    "updated_at": "2026-03-02T18:23:43.516Z",
    "kind": "preview",
    "has_ota": true
  },
  {
    "url": "https://capacitor-integration--aplus-preview.netlify.app",
    "branch": "capacitor-integration",
    "site": "aplus-preview",
    "title": "Apply eslint + prettier auto-fixes\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>\n, SHA: 6ac60937, Branch: capacitor-integration",
    "updated_at": "2026-03-02T18:23:36.062Z",
    "kind": "preview",
    "has_ota": true
  },
  {
    "url": "https://auth--aplus-preview.netlify.app",
    "branch": "auth",
    "site": "aplus-preview",
    "title": "delegate SSO and Passkey auth to Flutter when running in WebView\n\nWhen flutterIsEnabled, Google/Apple sign-in and Passkey authentication\nsend flutterRequest events instead of using browser popups/SDK/WebAuthn API.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>\n, SHA: 846cc647, Branch: auth",
    "updated_at": "2026-02-12T13:41:29.107Z",
    "kind": "preview",
    "has_ota": false
  },
  {
    "url": "https://auth--paxumbank-preview.netlify.app",
    "branch": "auth",
    "site": "paxumbank-preview",
    "title": "delegate SSO and Passkey auth to Flutter when running in WebView\n\nWhen flutterIsEnabled, Google/Apple sign-in and Passkey authentication\nsend flutterRequest events instead of using browser popups/SDK/WebAuthn API.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>\n, SHA: 846cc647, Branch: auth",
    "updated_at": "2026-02-12T13:41:26.607Z",
    "kind": "preview",
    "has_ota": false
  },
  {
    "url": "https://spa-5234--paxumbank-preview.netlify.app",
    "branch": "spa-5234",
    "site": "paxumbank-preview",
    "title": "Merge branch 'SPA-5173' into 'master'\n\n[SPA-5173] error handler update\n\nSee merge request dev/new.paxum.com!2150, SHA: 02004d87, Branch: SPA-5234",
    "updated_at": "2026-01-30T11:35:08.155Z",
    "kind": "preview",
    "has_ota": false
  },
  {
    "url": "https://release-candidate.paxum.com",
    "branch": "master",
    "site": "paxum-release-candidate",
    "title": "paxum-release-candidate",
    "updated_at": "",
    "kind": "release-candidate",
    "has_ota": false
  },
  {
    "url": "https://release-candidate.paxumbank.com",
    "branch": "master",
    "site": "paxumbank-release-candidate",
    "title": "paxumbank-release-candidate",
    "updated_at": "",
    "kind": "release-candidate",
    "has_ota": false
  },
  {
    "url": "https://release-candidate.aplus-payments.com",
    "branch": "master",
    "site": "aplus-release-candidate",
    "title": "aplus-release-candidate",
    "updated_at": "",
    "kind": "release-candidate",
    "has_ota": false
  },
  {
    "url": "https://master-dev-preview.paxum.com",
    "branch": "master",
    "site": "paxum-master-dev",
    "title": "paxum-master-dev",
    "updated_at": "",
    "kind": "master-dev",
    "has_ota": false
  },
  {
    "url": "https://master-dev-preview.paxumbank.com",
    "branch": "master",
    "site": "paxumbank-master-dev",
    "title": "paxumbank-master-dev",
    "updated_at": "",
    "kind": "master-dev",
    "has_ota": false
  },
  {
    "url": "https://master-dev-preview.aplus-payments.com",
    "branch": "master",
    "site": "aplus-master-dev",
    "title": "aplus-master-dev",
    "updated_at": "",
    "kind": "master-dev",
    "has_ota": false
  },
  {
    "url": "https://general-preview.paxum.com",
    "branch": "master",
    "site": "paxum-portal-general",
    "title": "paxum-portal-general",
    "updated_at": "",
    "kind": "general",
    "has_ota": false
  },
  {
    "url": "https://general-preview.paxumbank.com",
    "branch": "master",
    "site": "paxumbank-portal-general",
    "title": "paxumbank-portal-general",
    "updated_at": "",
    "kind": "general",
    "has_ota": false
  },
  {
    "url": "https://general-preview.aplus-payments.com",
    "branch": "master",
    "site": "aplus-portal-general",
    "title": "aplus-portal-general",
    "updated_at": "",
    "kind": "general",
    "has_ota": false
  }
]
