4774 Commits
Author SHA1 Message Date
zeekayandHanzo Dev 5fa0830cf0 fix(balances): don't hide unknown-price tokens as dust (renders Lux treasury)
The dust filter hid any token with fiatBalance < $0.01. On chains with no
fiat price oracle the Client Gateway returns fiatConversion "0" (and thus
fiatBalance "0") for every token — Lux/Zoo/Pars C-Chains — so the filter
wrongly hid the entire native balance. safe.lux.network showed the Lux
Foundation treasury (0xE54cAf7E, ~994.7B LUX) as an empty "1 small balance"
instead of its real holdings.

A token is only dust if we can price it. Keep tokens whose price is unknown
(fiatConversion <= 0) and the native token; only hide genuinely-priced dust.

Decomplected: the two duplicate filterDustTokens copies (useVisibleBalances,
useHiddenTokenCounts) are now one price-aware helper in utils/balances.ts, so
the assets table and the "N small balances" indicator can never disagree.

Co-authored-by: Hanzo Dev <dev@hanzo.ai>
lux-v2.2.6
2026-07-21 16:58:02 -07:00
hanzo-dev 54a4e86232 fix(theme): last greens — sidebar-accent #f0fdf4 + teal/success tints -> grey
Pixel-sampling the rendered dashboard showed the only visible green left was the
active-nav bg (--sidebar-accent #f0fdf4). Neutralize it plus the remaining
non-dashboard green/teal tints (#008c73, #dcfce7, #1c5538, etc.) so no green can
surface in any state. Zero green remains except Google's OAuth logo.

Co-authored-by: Hanzo Dev <dev@hanzo.ai>
lux-v2.2.5
2026-07-19 19:03:57 -07:00
hanzo-dev 0b13444393 fix(theme): neutralize beamer widget teal -> grey 2026-07-18 23:58:20 -07:00
hanzo-dev 134cf46551 fix(theme): complete monochrome — neutralize ALL accent/success greens
Remaining green was in the sidebar active-nav accent (#22c55e), success/synced
tokens (#00b460/#16a34a and palette variants), and green fills baked into
public SVG illustrations + the MUI palettes — not the tokens already fixed.
Neutralize every green (brand accent, success, illustration) to grey across
apps/web/src, apps/web/public/images, and packages/theme (palettes + vars.css
regenerated). Keep only Google's brand green in the OAuth sign-in logo.
Verified: zero green remains except google.svg.

Co-authored-by: Hanzo Dev <dev@hanzo.ai>
lux-v2.2.4
2026-07-18 23:57:30 -07:00
hanzo-dev 5bbe2d082f fix(brand): Lux monochrome favicon + PWA icons (replace Safe favicon.ico)
Browsers auto-request /favicon.ico (was the 15406B Safe icon). Replace it +
all brand/*/favicon.ico + android-chrome PNGs with a Lux monochrome mark.

Co-authored-by: Hanzo Dev <dev@hanzo.ai>
lux-v2.2.3
2026-07-18 23:38:11 -07:00
hanzo-dev c44f58b4a8 fix(brand): replace Safe logo ASSETS with Lux monochrome (kill rendered logo)
The rendered Safe{Wallet}/Safe-Labs mark lived in SVG assets imported as
components (SidebarTopBar chrome, welcome/NewSafe wordmark, onboarding/WC/
first-tx icons) — not gated by isOfficialHost, so an HTML grep was clean but
the page visually showed it. Swap the assets themselves:
- logo-no-text.svg  -> Lux mono rounded square (chrome icon)
- logo-safe-labs.svg-> Lux Safe wordmark (welcome/header)
- logo.svg          -> Lux Safe wordmark (large)
- logo-round.svg    -> Lux mono circle (was #12FF80 green)
All self-adapting (black in light / white in dark). Zero Safe mark, zero green.

Co-authored-by: Hanzo Dev <dev@hanzo.ai>
lux-v2.2.2
2026-07-18 23:34:09 -07:00
hanzo-dev c6dfcff7ca fix(theme): kill residual Safe green -> grey (static brand accent + badges)
v2.2.0 left green in the sidebar-active accent, brand icons, and 4 Tailwind
notification badges because they read palette static.textBrand (#12FF80) and
hardcoded rgba(18,255,128,.1) — not the secondary token. Neutralize:
- static.ts textBrand -> #636669 (constant grey, reads on light+dark)
- regenerate vars.css from palettes
- badge bg rgba(18,255,128,.1) -> rgba(99,102,105,.15)
Zero green remains in shipped source.

Co-authored-by: Hanzo Dev <dev@hanzo.ai>
lux-v2.2.1
2026-07-18 18:49:56 -07:00
hanzo-dev 4b1cf0b212 feat(brand): domain-driven white-label + Lux monochrome default
Strip build-time Safe branding; resolve brand from the request HOST at runtime
(safe.lux.network->Lux, .zoo.network->Zoo, .pars.network->Pars, .hanzo.ai->Hanzo;
unknown host -> Lux monochrome). No brand token is baked.

- @safe-global/brand: hostname registry + resolveBrand() + live Proxy; Lux default
- constants: BRAND_NAME/BRAND_LOGO read runtime brand (drop 'Wallet fork')
- theme: neutralize Safe green -> true black/white/grey (light.ts/dark.ts/vars.css
  + 17 feature/dashboard CSS modules); semantic info/error/success kept
- brand assets: monochrome self-adapting wordmarks for lux/zoo/pars/hanzo
- header: show brand logo on mobile too
- .env.lux: build config only (no brand tokens)

Co-authored-by: Hanzo Dev <dev@hanzo.ai>
lux-v2.2.0
2026-07-18 13:25:19 -07:00
hanzo-dev e303325962 ci(lux): push lux-safe image with org GHCR_PAT (package unlinked to repo)
Co-authored-by: Hanzo Dev <dev@hanzo.ai>
lux-v2.1.0
2026-07-18 11:11:06 -07:00
hanzo-dev 283cd8fad7 fix(lux): workspace-scope after-install; build amd64-only
- yarn after-install lives in apps/web -> run it workspace-scoped (root has
  no such script; typechain generate-types is required by the build)
- drop arm64 (QEMU-emulated Node build, no arm64 runner); lux-k8s is amd64

Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-07-18 10:56:13 -07:00
hanzo-devandzeekay a730f9cd47 feat(lux): deploy real Safe app to safe.lux.network via Lux CGW
The safe.lux.network host was serving a separate marketing landing
(lux-apps/safe, @luxfi/safe) as ghcr.io/luxfi/lux-safe:v2.0.0 — the real
@safe-global/web app was never deployed. Point the lux brand at the new Lux
Client Gateway (safe-cgw.lux.network) so chains 96369/200200/494949 and their
Safes load, and add a build-time-correct multi-arch image + CI.

Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-07-18 10:49:03 -07:00
z cbd18ca9a5 docs(brand): add hero banner 2026-06-28 20:55:39 -07:00
z dd72226ecc chore(brand): dynamic hero banner 2026-06-28 20:55:38 -07:00
9e8dcde5ac chore(deps): bump expo/expo-github-action from 8.2.1 to 9.0.0 (#15)
Bumps [expo/expo-github-action](https://github.com/expo/expo-github-action) from 8.2.1 to 9.0.0.
- [Release notes](https://github.com/expo/expo-github-action/releases)
- [Changelog](https://github.com/expo/expo-github-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/expo/expo-github-action/compare/c7b66a9c327a43a8fa7c0158e7f30d6040d2481e...eab7a230208c952974db8c3245cfd78402c7b385)

---
updated-dependencies:
- dependency-name: expo/expo-github-action
  dependency-version: 9.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-06-17 00:25:13 -07:00
80b84b8aca chore(deps): bump docker/setup-buildx-action from 4.0.0 to 4.1.0 (#12)
Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 4.0.0 to 4.1.0.
- [Release notes](https://github.com/docker/setup-buildx-action/releases)
- [Commits](https://github.com/docker/setup-buildx-action/compare/4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd...d7f5e7f509e45cec5c76c4d5afdd7de93d0b3df5)

---
updated-dependencies:
- dependency-name: docker/setup-buildx-action
  dependency-version: 4.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-06-16 22:19:31 -07:00
ab1fbd5115 chore(deps): bump actions/checkout from 6.0.2 to 6.0.3 (#13)
Bumps [actions/checkout](https://github.com/actions/checkout) from 6.0.2 to 6.0.3.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/de0fac2e4500dabe0009e67214ff5f5447ce83dd...df4cb1c069e1874edd31b4311f1884172cec0e10)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: 6.0.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-06-16 22:19:28 -07:00
902cfab9bc chore(deps): bump aws-actions/configure-aws-credentials (#14)
Bumps [aws-actions/configure-aws-credentials](https://github.com/aws-actions/configure-aws-credentials) from 6.1.1 to 6.2.0.
- [Release notes](https://github.com/aws-actions/configure-aws-credentials/releases)
- [Changelog](https://github.com/aws-actions/configure-aws-credentials/blob/main/CHANGELOG.md)
- [Commits](https://github.com/aws-actions/configure-aws-credentials/compare/d979d5b3a71173a29b74b5b88418bfda9437d885...e7f100cf4c008499ea8adda475de1042d6975c7b)

---
updated-dependencies:
- dependency-name: aws-actions/configure-aws-credentials
  dependency-version: 6.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-06-16 22:19:24 -07:00
00be6f74f5 chore(deps): bump chromaui/action from 17.0.0 to 17.3.0 (#16)
Bumps [chromaui/action](https://github.com/chromaui/action) from 17.0.0 to 17.3.0.
- [Release notes](https://github.com/chromaui/action/releases)
- [Changelog](https://github.com/chromaui/action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/chromaui/action/compare/7aca53e7aa87489020a97f633c1e7e82c12e5973...05812acac141ce7d317a3f787be88122bca27cf4)

---
updated-dependencies:
- dependency-name: chromaui/action
  dependency-version: 17.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-06-16 22:19:21 -07:00
Hanzo DevandGitHub 6963478144 Merge pull request #7 from luxfi/dependabot/github_actions/docker/login-action-4.2.0
chore(deps): bump docker/login-action from 4.1.0 to 4.2.0
2026-06-04 01:35:58 -07:00
dependabot[bot]andGitHub 33c0f28727 chore(deps): bump docker/login-action from 4.1.0 to 4.2.0
Bumps [docker/login-action](https://github.com/docker/login-action) from 4.1.0 to 4.2.0.
- [Release notes](https://github.com/docker/login-action/releases)
- [Commits](https://github.com/docker/login-action/compare/4907a6ddec9925e35a0a9e82d7399ccc52663121...650006c6eb7dba73a995cc03b0b2d7f5ca915bee)

---
updated-dependencies:
- dependency-name: docker/login-action
  dependency-version: 4.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-04 08:03:58 +00:00
Hanzo DevandGitHub ff10c370a2 Merge pull request #8 from luxfi/dependabot/github_actions/chromaui/action-17.0.0
chore(deps): bump chromaui/action from 16.10.1 to 17.0.0
2026-06-03 13:24:14 -07:00
Hanzo DevandGitHub 5cf9633fcd Merge pull request #9 from luxfi/dependabot/github_actions/anthropics/agent-action-1.0.131
chore(deps): bump anthropics/agent-action from 1.0.123 to 1.0.131
2026-06-03 13:24:10 -07:00
Hanzo DevandGitHub fb69ef232b Merge pull request #10 from luxfi/dependabot/github_actions/docker/build-push-action-7.2.0
chore(deps): bump docker/build-push-action from 7.1.0 to 7.2.0
2026-06-03 13:24:07 -07:00
Hanzo DevandGitHub dc84a457c6 Merge pull request #11 from luxfi/dependabot/github_actions/codecov/codecov-action-6.0.1
chore(deps): bump codecov/codecov-action from 6.0.0 to 6.0.1
2026-06-03 13:24:03 -07:00
dependabot[bot]andGitHub 0b749baded chore(deps): bump codecov/codecov-action from 6.0.0 to 6.0.1
Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 6.0.0 to 6.0.1.
- [Release notes](https://github.com/codecov/codecov-action/releases)
- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/codecov/codecov-action/compare/57e3a136b779b570ffcdbf80b3bdc90e7fab3de2...e79a6962e0d4c0c17b229090214935d2e33f8354)

---
updated-dependencies:
- dependency-name: codecov/codecov-action
  dependency-version: 6.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-22 17:59:28 +00:00
dependabot[bot]andGitHub 0508fa693e chore(deps): bump docker/build-push-action from 7.1.0 to 7.2.0
Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 7.1.0 to 7.2.0.
- [Release notes](https://github.com/docker/build-push-action/releases)
- [Commits](https://github.com/docker/build-push-action/compare/bcafcacb16a39f128d818304e6c9c0c18556b85f...f9f3042f7e2789586610d6e8b85c8f03e5195baf)

---
updated-dependencies:
- dependency-name: docker/build-push-action
  dependency-version: 7.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-22 17:59:22 +00:00
dependabot[bot]andGitHub e08634a6d0 chore(deps): bump anthropics/agent-action from 1.0.123 to 1.0.131
Bumps [anthropics/agent-action](https://github.com/anthropics/agent-action) from 1.0.123 to 1.0.131.
- [Release notes](https://github.com/anthropics/agent-action/releases)
- [Commits](https://github.com/anthropics/agent-action/compare/51ea8ea73a139f2a74ff649e3092c25a904aed7e...4481e6d3c7bbb88db2a928ca3444c536f589c7c1)

---
updated-dependencies:
- dependency-name: anthropics/agent-action
  dependency-version: 1.0.131
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-22 17:59:13 +00:00
dependabot[bot]andGitHub cfdb2431aa chore(deps): bump chromaui/action from 16.10.1 to 17.0.0
Bumps [chromaui/action](https://github.com/chromaui/action) from 16.10.1 to 17.0.0.
- [Release notes](https://github.com/chromaui/action/releases)
- [Changelog](https://github.com/chromaui/action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/chromaui/action/compare/1bbb5819252d9782cb7d77122d9becae467def18...7aca53e7aa87489020a97f633c1e7e82c12e5973)

---
updated-dependencies:
- dependency-name: chromaui/action
  dependency-version: 17.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-22 17:59:07 +00:00
f1821ad0e1 chore(deps): bump chromaui/action from 16.8.0 to 16.10.1 (#5)
Bumps [chromaui/action](https://github.com/chromaui/action) from 16.8.0 to 16.10.1.
- [Release notes](https://github.com/chromaui/action/releases)
- [Changelog](https://github.com/chromaui/action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/chromaui/action/compare/a200f3ba3ff81232c47ac7942347fb212b1a67dc...1bbb5819252d9782cb7d77122d9becae467def18)

---
updated-dependencies:
- dependency-name: chromaui/action
  dependency-version: 16.10.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-05-16 16:15:19 -07:00
c7cd30291a chore(deps): bump marocchino/sticky-pull-request-comment (#4)
Bumps [marocchino/sticky-pull-request-comment](https://github.com/marocchino/sticky-pull-request-comment) from 3.0.3 to 3.0.4.
- [Release notes](https://github.com/marocchino/sticky-pull-request-comment/releases)
- [Commits](https://github.com/marocchino/sticky-pull-request-comment/compare/d4d6b0936434b21bc8345ad45a440c5f7d2c40ff...0ea0beb66eb9baf113663a64ec522f60e49231c0)

---
updated-dependencies:
- dependency-name: marocchino/sticky-pull-request-comment
  dependency-version: 3.0.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-05-16 16:15:16 -07:00
556c5e32ba chore(deps): bump anthropics/agent-action from 1.0.99 to 1.0.123 (#2)
Bumps [anthropics/agent-action](https://github.com/anthropics/agent-action) from 1.0.99 to 1.0.123.
- [Release notes](https://github.com/anthropics/agent-action/releases)
- [Commits](https://github.com/anthropics/agent-action/compare/c3d45e8e941e1b2ad7b278c57482d9c5bf1f35b3...51ea8ea73a139f2a74ff649e3092c25a904aed7e)

---
updated-dependencies:
- dependency-name: anthropics/agent-action
  dependency-version: 1.0.123
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-05-16 16:15:13 -07:00
627b3a36f7 chore(deps): bump actions/upload-artifact from 6.0.0 to 7.0.1 (#1)
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 6.0.0 to 7.0.1.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/b7c566a772e6b6bfb58ed0dc250532a479d7789f...043fb46d1a93c77aae656e7c1c64a875d1fc6a0a)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-version: 7.0.1
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-05-16 16:15:10 -07:00
Hanzo AI 9f7ac53116 chore(brand): placeholder assets for lux/hanzo + sync safe manifest
Each per-brand manifest references brand/active/{logo.svg,favicon.ico,
android-chrome-{192,512}x{192,512}.png}. Without those files the runtime
manifest fetch 404s after select-brand. Stamps a 1x1 transparent PNG
placeholder per slot plus a text-only SVG logo so non-Safe builds resolve;
real artwork tracked in HANZO_WHITELABEL.md "manual review queue".

Also re-aligns brand/safe/manifest.json with the committed upstream
public/safe.webmanifest so build:safe leaves the working tree clean
(no spurious diff on the canonical wallet build).
2026-05-15 03:57:39 -07:00
Hanzo AI 4019c205a4 refactor(brand): route missed help.safe.global hrefs through brand.helpUrl
Pass-1's URL codemod missed seven JSX/template-string call sites that
hardcoded https://help.safe.global directly. Route each through
${brand.helpUrl}/articles/... so non-Safe branded builds point at their
own help center (docs.lux.network/safe, docs.hanzo.ai/vault, etc).

No protocol identifiers changed; no test fixtures changed; no behavior
diff on a build:safe build.
2026-05-15 03:57:26 -07:00
Hanzo AI fb9b95d50c feat(brand): per-brand build configs and asset pipeline
apps/web/package.json gains build:safe / build:lux / build:hanzo
scripts. Each runs scripts/select-brand.sh <slug> (which copies
.env.<slug> -> .env.local, brand/<slug>/ -> brand/active/, and the
per-brand manifest.json over safe.webmanifest) then `yarn build`.

scripts/codemod-brand-urls.mjs is the Pass 1 driver kept in-tree so
future merges with upstream can re-run it. .gitignore covers the
brand/active output dir.

HANZO_WHITELABEL.md updated with the per-brand invocation, the
canonical pattern table, the protocol-vs-brand boundary, and how
to add a new brand (env + asset dir + one package.json script — no
source edits).
2026-05-15 02:59:47 -07:00
Hanzo AI 28eb4c904e refactor(brand): pass 3 — manifests and metadata
apps/web/public/brand/{safe,lux,hanzo}/manifest.json hold per-brand web
app manifests; scripts/select-brand.sh copies the chosen one over
apps/web/public/safe.webmanifest at build time. MetaTags og/twitter
image and twitter:site read brand.appUrl / brand.twitterUrl. The
default webmanifest description is now brand-neutral.

apps/mobile/app.config.ts derives the product name from
EXPO_PUBLIC_BRAND_NAME (default 'Safe{Mobile}') and threads it into
the dev variant prefix and the camera-permission rationale string,
removing the only hard-coded brand strings in mobile config.
2026-05-15 02:58:14 -07:00
Hanzo AI 3be4599ea0 refactor(brand): pass 2 — product name in JSX, copy, and SDK metadata
User-facing 'Safe{Wallet}' / 'Safe{Mobile}' / 'Safe Wallet' literals now
read brand.name. Covered: outreach popup, safe-labs terms, earn info,
tx receipt help link, support chat user identity, trezor manifest,
WalletConnect appKit metadata, CoW swap appCode, SIWE statement (web +
mobile), safe-shield bridge/contract description strings, test-utils
getAppName.

Untouched: protocol-identifier symbols (SafeInfo, useSafeInfo,
SafeAppsTag enum, etc.) and SDK package names (@safe-global/protocol-kit).
Those are protocol terms, not brand strings.
2026-05-15 02:55:38 -07:00
Hanzo AI fb8d6d0ed3 refactor(brand): pass 1 — URLs, emails, and asset paths route through brand
Mechanical sweep of safe.global / support@safe.global / app.safe.global /
help.safe.global / status.safe.global / developer.safe.global /
twitter.com/safe / chat.safe.global / anon.safe.global / /images/safe-logo*
literals in apps/ and packages/. Each becomes a property read off
@safe-global/brand. Untouched: protocol/CDN hosts (safe-client.*,
safe-transaction-*, safe-transaction-assets.*), tests, stories, fixtures.

Driven by scripts/codemod-brand-urls.mjs. 17 files, 26 replacements,
typecheck clean across all 5 workspaces.
2026-05-15 02:51:22 -07:00
Hanzo AI 2c46473905 feat(brand): create @safe-global/brand workspace
Exposes a Brand type and a default brand object whose values match
upstream Safe strings. Per-brand builds override via NEXT_PUBLIC_BRAND_*
(web) or EXPO_PUBLIC_BRAND_* (mobile) env vars.

Single source of truth for product name, URLs, support contacts, and
asset paths. No 'Safe' / 'safe.global' literal lives in apps/ or
packages/*/src/ once the codemod passes land.
2026-05-15 02:46:09 -07:00
Hanzo AI b3f6ff8a2c docs: HANZO_WHITELABEL.md — single-source brand-token strategy
White-label plan for this fork: every hardcoded "Safe" / "safe.global"
reference in app code gets replaced with a read from a single Brand
config object sourced from env at build time. ~1,759 source files
carry one or more brand references; HANZO_WHITELABEL.md inventories
the patterns + phases the rewrite.

The same fork can then ship as Lux Safe, Hanzo Vault, partner builds,
etc. without forking the source per brand.
2026-05-14 16:59:17 -07:00
9e98cbb14d chore(deps): bump @protobufjs/utf8 from 1.1.0 to 1.1.1 (#7854)
Bumps [@protobufjs/utf8](https://github.com/dcodeIO/protobuf.js) from 1.1.0 to 1.1.1.
- [Release notes](https://github.com/dcodeIO/protobuf.js/releases)
- [Changelog](https://github.com/protobufjs/protobuf.js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/dcodeIO/protobuf.js/compare/protobufjs-cli-v1.1.0...protobufjs-cli-v1.1.1)

---
updated-dependencies:
- dependency-name: "@protobufjs/utf8"
  dependency-version: 1.1.1
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-05-13 09:03:14 +02:00
a2ee41b45c chore(deps): bump protobufjs from 6.11.5 to 6.11.6 (#7855)
Bumps [protobufjs](https://github.com/protobufjs/protobuf.js) from 6.11.5 to 6.11.6.
- [Release notes](https://github.com/protobufjs/protobuf.js/releases)
- [Changelog](https://github.com/protobufjs/protobuf.js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/protobufjs/protobuf.js/compare/v6.11.5...v6.11.6)

---
updated-dependencies:
- dependency-name: protobufjs
  dependency-version: 6.11.6
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-05-13 09:03:03 +02:00
f1b14b1afd chore(deps): bump hono from 4.12.14 to 4.12.18 (#7827)
Bumps [hono](https://github.com/honojs/hono) from 4.12.14 to 4.12.18.
- [Release notes](https://github.com/honojs/hono/releases)
- [Commits](https://github.com/honojs/hono/compare/v4.12.14...v4.12.18)

---
updated-dependencies:
- dependency-name: hono
  dependency-version: 4.12.18
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-05-13 09:02:27 +02:00
Daniel DimitrovandGitHub cb08d011ce chore: pin GitHub Actions to commit SHAs (#7838)
* chore: pin GitHub Actions to commit SHAs

Pin every third-party action under .github/workflows and .github/actions
to a 40-char commit SHA with a trailing version comment, per GitHub's
security hardening guidance.

anthropics/agent-action is bumped from the (long-stale) @beta tag
to v1.0.99, which also requires renaming the `direct_prompt` input to
`prompt`. chromaui/action is moved off the floating @latest tag onto
v16.9.1.

Resolves: WA-2301

* chore: bump npmMinumalAgeGate to 7 days

* chore: set chromaui/action to v 16.8.0
2026-05-11 11:32:13 +02:00
19282fec1b chore(deps): bump axios from 1.15.2 to 1.16.0 (#7805)
Bumps [axios](https://github.com/axios/axios) from 1.15.2 to 1.16.0.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.15.2...v1.16.0)

---
updated-dependencies:
- dependency-name: axios
  dependency-version: 1.16.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-05-08 12:05:17 +02:00
ecda9273a2 chore(deps): bump basic-ftp from 5.3.0 to 5.3.1 (#7825)
Bumps [basic-ftp](https://github.com/patrickjuchli/basic-ftp) from 5.3.0 to 5.3.1.
- [Release notes](https://github.com/patrickjuchli/basic-ftp/releases)
- [Changelog](https://github.com/patrickjuchli/basic-ftp/blob/master/CHANGELOG.md)
- [Commits](https://github.com/patrickjuchli/basic-ftp/compare/v5.3.0...v5.3.1)

---
updated-dependencies:
- dependency-name: basic-ftp
  dependency-version: 5.3.1
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-05-08 12:04:50 +02:00
4f027239b4 chore: regenerate CGW schema (#7824)
Schema regen brings new optional fields (UserSession.email, MemberUser.email)
and required createdByUserId/lastUpdatedByUserId on SpaceAddressBookItemDto.
Address book consumers that build entries from local data now pass 0 for the
new ID fields.

Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-05-07 16:39:57 +02:00
480aff23a7 fix: drop console- and report-sourced errors from Datadog RUM (#7815)
* fix: drop console-sourced errors from Datadog RUM

The RUM SDK auto-instruments console.error via trackConsoleError with no
init flag to disable it, so every catch-block console.error in the app
(clipboard denial, RPC retries, third-party widget init, observability
self-recovery, etc.) lands as a RUM error and burns the Error-Free Views
SLO. PR #7674 only redirected logError() to warn level; the dozens of
direct console.error sites still slipped through.

Filter events with error.source === 'console' in beforeSend. Genuine
user-impacting failures continue to flow through trackError /
captureException (source: 'custom' / 'source'), which the filter keeps.

Co-authored-by: Hanzo Dev <dev@hanzo.ai>

* fix: also drop Browser Reporting API events (source=report) from RUM

Production data over a 7h window (2026-05-06 01:14-08:36 UTC, 5000
events) shows source=report dominates RUM error volume at 4095/5000
(82%), nearly all "csp_violation: 'eval' blocked by 'script-src'
directive" emitted by ReportingObserver from third-party scripts on
the welcome page. Console-source noise is 11%, unhandled exceptions
6%, real trackError 1%.

CSP/Reporting-API events are a security/policy signal, not a
user-impacting failure - they belong on a report-uri/report-to
endpoint, not the Error-Free Views SLO. Drop them with the same filter
mechanism as console-source. Combined with the previous commit, this
removes ~93% of current RUM error volume while preserving genuine
unhandled exceptions, network errors, and trackError signals.

Co-authored-by: Hanzo Dev <dev@hanzo.ai>

---------

Co-authored-by: Hanzo Dev <dev@hanzo.ai>
2026-05-06 11:45:35 +02:00
Daniel DimitrovandGitHub eb6c3c45f4 fix(mobile): never auto-redirect to Settings on biometrics toggle (WA-2239) (#7811)
* fix(mobile): never auto-redirect to Settings on biometrics toggle (WA-2239)

Mirrors the camera permission fix (WA-2229 / #7810). enableBiometrics no
longer calls openBiometricSettings as a side effect. The hook now returns
a discriminated outcome (enabled | os-not-configured | cancelled | error)
and each surface — the Settings switch and the biometrics opt-in screen —
renders an in-app alert with an explicit "Open Settings" button. Linking
is reachable only from a user-tapped button.

* refactor(mobile): handle biometrics errors + dedup setup prompt (WA-2239)

Addresses code review on PR #7811:
- Hook exposes promptBiometricsSetup() so the os-not-configured alert
  lives once next to openBiometricSettings, with both consumers shrinking
  to a single-line invocation.
- enableBiometrics no longer swallows unexpected errors silently: both the
  Settings switch and the biometrics-opt-in screen now surface a toast or
  Alert and Logger.error the underlying cause.
- disableBiometrics returns { status: 'error', error } when keychain
  reset fails so callers can react; Redux still flips to disabled to match
  user intent.
- Cancellation path now awaits Keychain.resetGenericPassword inside a
  try/catch instead of fire-and-forget; useLayoutEffect awaits
  disableBiometrics and catches rejections.
- Tests: assert exact error payload on the unexpected-error and verify
  paths; new disable-failure test; promptBiometricsSetup wires the
  Open Settings button to Linking.openURL only on tap.

* chore(mobile): remove stale hasInteracted comment in useBiometrics

The comment described a ref that was never added (introduced in #6059,
no corresponding code). It has misled readers into looking for state
that does not exist.
2026-05-05 18:01:39 +02:00
Daniel DimitrovandGitHub 83217f48b0 fix(mobile): never auto-redirect to Settings on notification permission denial (#7812)
* fix(mobile): never auto-redirect to Settings on notification permission denial

Mirror the camera-permission fix (#7810). Apple guideline 5.1.1(iv) forbids
auto-redirecting to Settings as a side effect of a permission denial.

- NotificationService.openDeviceSettings: drop the internal notifee.requestPermission
  so it can never chain a prompt denial into a Settings open. Pure side-effect now.
- NotificationService.getAllPermissions: drop the shouldOpenSettings parameter and
  the auto-redirect branch. Returns status only; opening Settings is the caller's job.
- useNotificationManager: drop openSettingsOnDenied from requestAndRegister; on denial,
  route both toggleNotificationState and enableNotification (threshold path) through
  the existing asyncAlert (requestPushNotificationsPermission), where the user must
  tap "Turn on" explicitly to open Settings.
- Add compliance unit tests asserting the core invariant: requestPermission -> denied
  never calls Linking.openURL / Linking.openSettings, and openDeviceSettings does not
  re-request permission.

WA-2238

* fix(mobile): only show Settings explainer on actual permission denial

Codex review on #7812: requestAndRegister returned false in two cases — permission
denied AND permission granted with a registration failure (network/backend). The
previous commit treated both as denial and pushed the user to Settings, which is
misleading when permission is already granted and leaves pendingPermissionRequestRef
stuck true.

Return a discriminated { success, permission } from requestAndRegister so
toggleNotificationState can gate the explainer Alert on permission === 'denied'.
Apple 5.1.1(iv) compliance is unchanged: Settings is still only opened from an
explicit "Turn on" tap inside the Alert.

Add a regression test covering the granted-permission registration-failure case.
2026-05-05 17:50:47 +02:00