chore(brand+demo): lowercase "anonmesh" + dev/demo affordances out of bundle#38
Merged
epicexcelsior merged 4 commits intoMay 10, 2026
Merged
Conversation
…ipts Lowercases all user-visible AnonMesh -> anonmesh (8 strings): - tutorial slide title, header fallback, final CTA - receive.tsx + solanaPayUri.ts Solana Pay label/message defaults - MeshMap empty-state copy - blePermissions internal comment Adds two npm scripts that deep-link the tutorial route: - replay:tutorial:android (adb am start) - replay:tutorial:ios (xcrun simctl openurl) Lets any teammate replay the first-run tour on a running device without pm clear or rebuilding. No app-code changes.
Slide 1 (identity): identity-chip -> user Slide 2 (evidence/radio): signal -> radio (matches statLabel "Radio") Drops two custom SVGs in favor of Feather glyphs that read cleaner at the 42px tutorial size and align with icon style used elsewhere in Settings. Slide 3 (send) already used Feather.
…link
Demo affordances must not ship in the production bundle even as inert
dead code. EXPO_PUBLIC_DEMO_MODE was env-driven and could be flipped on
for any release build, leaking demo-time behavior to anyone holding
that APK.
- Remove src/utils/demoMode.ts (DEMO_MODE + DEMO_RECIPIENT_ADDRESS)
- RecipientPicker: read recipient from ?to= query param via
useLocalSearchParams; drop hardcoded prefill, demo fill button,
and orphan styles; tighten QR-soon alert copy
- ReviewCard: drop "Demo mode: devnet SOL only" banner + orphan styles
- Add demo:prefill-send:{android,ios} npm scripts wrapping the
anonmesh://send/recipient?to=<addr> deep link with the same demo
address as the previous flag
No regression on tab navigation: /send/recipient with no params still
opens to an empty address field (identical to DEMO_MODE-off behavior).
Contributor
There was a problem hiding this comment.
Pull request overview
This PR aligns production builds with the rule that demo/dev affordances should not ship in the production bundle, while also standardizing user-visible brand casing to lowercase.
Changes:
- Removes env-driven
DEMO_MODEcode paths (and thedemoModeutility), replacing demo/tutorial entry points with deep-link-based npm scripts. - Updates Solana Pay defaults and multiple UI strings from
AnonMesh→anonmesh. - Polishes the tutorial slide icons to use Feather-standard glyphs.
Reviewed changes
Copilot reviewed 9 out of 9 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
| mobile_app/src/utils/demoMode.ts | Removes env-driven demo flags/constants from the bundle. |
| mobile_app/src/utils/blePermissions.ts | Updates internal comment brand casing to lowercase. |
| mobile_app/src/services/solanaPayUri.ts | Updates Solana Pay default label/message strings to lowercase brand. |
| mobile_app/package.json | Adds deep-link helper scripts for tutorial replay and send-recipient prefill. |
| mobile_app/components/send/ReviewCard.tsx | Removes demo-mode banner and related styles. |
| mobile_app/components/send/RecipientPicker.tsx | Removes demo-mode fill UI and adds query-param-based recipient prefill. |
| mobile_app/components/nodes/MeshMap.tsx | Updates empty-state copy to lowercase brand. |
| mobile_app/app/tutorial.tsx | Updates brand casing and swaps tutorial slide icons to Feather names. |
| mobile_app/app/receive.tsx | Updates Solana Pay QR label/message to lowercase brand. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Comment on lines
88
to
93
| export function RecipientPicker() { | ||
| const router = useRouter(); | ||
| const { colors } = useTheme(); | ||
| const [address, setAddress] = useState(DEMO_MODE ? DEMO_RECIPIENT_ADDRESS : ""); | ||
| const params = useLocalSearchParams<{ to?: string }>(); | ||
| const [address, setAddress] = useState(typeof params.to === "string" ? params.to : ""); | ||
| const [selectedSymbol, setSelectedSymbol] = useState<string>("SOL"); |
…lowercase # Conflicts: # mobile_app/components/send/RecipientPicker.tsx
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Aligns the app with the team rule that demo/dev affordances must not ship in the production bundle. Bundles three concerns:
AnonMesh→anonmesh. Solana Paylabel(visible in Phantom/Solflare prefill) included.npm run replay:tutorial:{android,ios}deep-links the/tutorialroute. No in-app surface, no flag in app code.EXPO_PUBLIC_DEMO_MODEwas env-driven and could leak into release APKs. Replaced with deep-link + npm script (demo:prefill-send:{android,ios}) usinganonmesh://send/recipient?to=<addr>.Why
EXPO_PUBLIC_DEMO_MODEcould flip on for any build (including a release APK handed to a judge). Even{DEMO_MODE && ...}ships as inert dead code in the bundle.anonmesh,magicred1.anonmesh.app).Files
Brand rename (PR #28 carryover):
app/tutorial.tsx— slide title, header fallback, final CTAapp/receive.tsx+src/services/solanaPayUri.ts— Solana Pay defaultscomponents/nodes/MeshMap.tsx— empty-state copysrc/utils/blePermissions.ts— internal commentTutorial polish:
app/tutorial.tsx— slide icons swapped to Feather standards:identity-chip→user,signal→radio(matchesstatLabel: "Radio"). Slide 3sendalready Feather. Cleaner glyphs at 42px.DEMO_MODE removal:
src/utils/demoMode.tscomponents/send/RecipientPicker.tsx— recipient now reads from?to=query param viauseLocalSearchParams. Demo fill button + orphan styles dropped. Stale "or use the devnet fill" hint in QR-soon alert tightened.components/send/ReviewCard.tsx— "Demo mode: devnet SOL only." banner + orphan styles dropped.Tooling:
package.json—replay:tutorial:{android,ios}+demo:prefill-send:{android,ios}. All four wrap deep links; no app-code conditionals.Backward compatibility
/send/recipientwith no params behaves identically to DEMO_MODE-off (empty address field). Tab navigation and in-approuter.push("/send/recipient")callsites unchanged./send/recipient?to=<addr>is the new prefill path (deep link only). Replaces the previous DEMO_MODE-on prefill 1:1, same address.Test plan
On any installed dev/release build:
npm run replay:tutorial:android→ tutorial mounts; slide 1usericon + lowercase brand; slide 2radioicon (concentric arcs); slide 3Open anonmeshCTA.npm run demo:prefill-send:android→ send recipient screen opens prefilled with the demo devnet address; Continue is enabled.labelreadsanonmesh.Out of scope
H_PADTS error inPendingCosigns.tsxonv3— already fixed onepic/send-qr-scanviad247729.