Playbook
Wallet Brand Landing vs Real Extension Scope (Wallet Brand Landing Vs Real Extension Scope)
The Bare Wallet app is honestly a marketing SPA / download funnel — not a Chrome MV3 extension. A CRA PWA manifest must not be mistaken for extension…
Generative Avatar & Wallet Product Surface
Part 2 of 2
URL-synced trait generator (PNG/SVG download) feeding mint metadata, and an honest read of the Bare Wallet app as a marketing SPA/funnel — not a Chrome MV3 extension — contrasted with real extension architecture.
A download button is not a signing engine
The wallet-app sells the Bare Wallet brand via Home plus Download tabs (Chrome, Firefox, Opera, Brave, Edge). public/manifest.json is Create React App's default PWA skeleton (short_name: React App, display: standalone) — there is no manifest_version, background service worker, chrome.runtime, or content script. This case study narrows scope on purpose: the product surface is a funnel; a real browser wallet is a different architecture universe.
What shipped (Bare Wallet app)
CRA React SPA
Home (brand)
Download tabs (install CTAs)
public/manifest.json ← PWA sample, NOT MV3
What a real extension needs
MV3 manifest_version: 3
background service worker
contentscripts / injected provider
permissioned RPC + keyring
popup UI ≠ marketing landing
This part writes the ADR for not confusing a brand landing with real extension scope.
Concepts, defined where they first appear
📦 Marketing SPA
Single-page app that sells trust and download CTAs before any wallet is installed.
📦 PWA Manifest
Installable-web hints; not the browser extension API surface.
📦 MV3 Extension
Manifest V3 add-on with service worker, permissions, and an injected page provider.
📦 Scope Honesty
Separating what the repo contains from what marketing copy implies.
Saying 'Install for Chrome' in the UI does not mean the repo contains chrome.scripting.
What is actually there?
Routes: Home and Download. DownloadPage shows tabbed CTAs; even some labels look swapped (iOS copy on a Brave tab) — a funnel prototype trace, not extension quality. No Web3 signing, keyring, or chain switching.
PWA ≠ Extension
CRA manifest.json carries icons, start_url, display: standalone. A Chrome extension needs manifest_version, background.service_worker, host_permissions, content_scripts. Drawing both as one system misleads readers.
ADR: Wallet product surface
Decision: ship brand landing + download funnel only
Non-goal: Chrome MV3 keyring / injected ethereum provider
Why: marketing speed; wallet core is a different product
Risk: users confuse CTA with installed extension
Mitigation: honest copy + separate extension repo when real
Real extension architecture (contrast)
A production wallet needs a locked keyring, confirmation popup, window.ethereum / provider injection, network management, phishing warnings, update channel. The landing SPA carries none of that; claiming it does is a security debt.
Same honesty as the generator
The previous part keeps trait vocabulary explicit. This part keeps the product boundary explicit: Bare Wallet brand is a funnel. The case study does not inflate; readers who want MV3 need a separate architecture series — not a lie in this repo.
The mappings that get confused most often
❌ CRA manifest = Chrome extension
✓ PWA hints ≠ MV3 extension contract
❌ Download CTAs prove an extension exists
✓ CTAs are marketing; runtime APIs are proof
❌ Naming the landing 'wallet' means keyring
✓ The name is brand; scope is bounded by ADR
❌ Inflating scope to grow the portfolio
✓ Honest narrow scope is a trustworthy case study
A checklist for auditing your own system
- Does the repo mention
manifest_versionorchrome.runtime? - Do download buttons hit real store URLs or dead CTAs?
- Which user promise do PWA manifest fields actually meet?
- What security misunderstanding arises if a user thinks they 'installed' it?
- Is a separate repo/ADR drawn for a real extension?
What to take away from this part
- The Bare Wallet app is a brand landing / download funnel.
- A CRA PWA manifest is not MV3 extension evidence.
- Honest scope beats an inflated wallet claim.
Writing 'wallet' and being a wallet are not the same commit.
FAQ
Frequently asked questions
What is Marketing SPA?
Single-page app that sells trust and download CTAs before any wallet is installed.
What is PWA Manifest?
Installable-web hints; not the browser extension API surface.
Is it true that "CRA manifest = Chrome extension"?
PWA hints ≠ MV3 extension contract
What does this part lock in?
This part writes the ADR for not confusing a brand landing with real extension scope. The wallet-app sells the Bare Wallet brand via Home plus Download tabs (Chrome, Firefox, Opera, Brave, Edge). `public/manifest.json` is Create React App's default PWA skeleton (`short_name: React App`, `display: standalone`) — there is no `manifest_version`, background service worker, `chrome.runtime`, or content script. This case study narrows scope on purpose: the product surface is a funnel; a real browser wallet is a different architecture universe.
Engineering Principles Learned
- Product-surface claims must align with runtime in the repo.
- PWA and MV3 are different architecture universes — do not merge them on one diagram.
- Case studies do not exaggerate; they write boundaries.
Continue reading
Continue reading
Next in series
Trait Generator: URL State to Mint Metadata
Avatar/trait generator options sync to URL query params; PNG/SVG download feeds mint metadata and shareable looks.
Related articles
Rinkeby Testnet vs Mainnet Client Split
The marketplace SPA locks to Rinkeby Infura while collection mint clients harden on mainnet.…
Related articles
OpenSea-like Information Architecture
The Bare Crypto marketplace SPA deliberately mirrors OpenSea's mental model: Home, Marketplace, Viewer, Profile, and a mint form.