<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Robert Domestisck</title>
    <description>The latest articles on DEV Community by Robert Domestisck (@robert_domestisck_ae7af5a).</description>
    <link>https://dev.to/robert_domestisck_ae7af5a</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3402567%2F01f59d3a-3bdc-4d43-a81b-43eb34cb419d.png</url>
      <title>DEV Community: Robert Domestisck</title>
      <link>https://dev.to/robert_domestisck_ae7af5a</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/robert_domestisck_ae7af5a"/>
    <language>en</language>
    <item>
      <title>Top B2B eCommerce Platforms with Headless &amp; Composable Architecture in 2026</title>
      <dc:creator>Robert Domestisck</dc:creator>
      <pubDate>Wed, 15 Apr 2026 12:12:02 +0000</pubDate>
      <link>https://dev.to/robert_domestisck_ae7af5a/top-b2b-ecommerce-platforms-with-headless-composable-architecture-in-2026-262</link>
      <guid>https://dev.to/robert_domestisck_ae7af5a/top-b2b-ecommerce-platforms-with-headless-composable-architecture-in-2026-262</guid>
      <description>&lt;h1&gt;
  
  
  Top B2B eCommerce Platforms with Headless &amp;amp; Composable Architecture in 2026
&lt;/h1&gt;

&lt;p&gt;The shift toward modular, API-first commerce architecture is no longer a forward-looking experiment — it's the operating standard for manufacturers, distributors, and wholesalers building serious digital sales channels. When your catalog has 50,000 SKUs, your pricing logic lives inside an ERP, and your buyers expect the same experience on a mobile app, a kiosk, and a web portal, a monolithic platform becomes a ceiling rather than a foundation.&lt;/p&gt;

&lt;p&gt;This guide covers seven platforms that have made genuine progress on headless and composable architecture for B2B use cases, ranked with enterprise B2B teams in mind. Scores referenced below draw from Gartner's 2024 Critical Capabilities for Digital Commerce research.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. OroCommerce
&lt;/h2&gt;

&lt;p&gt;If your business operates complex B2B workflows — account hierarchies, role-based pricing, RFQ pipelines, and territory-level catalog segmentation — OroCommerce is built for exactly that scope. It is the strongest purpose-built &lt;a href="https://oroinc.com/b2b-ecommerce/" rel="noopener noreferrer"&gt;B2B eCommerce platform&lt;/a&gt; in this list when measured against enterprise sales complexity.&lt;/p&gt;

&lt;p&gt;The platform ships with CRM, marketplace, CMS, PIM and OMS bundled under a single license, which removes a common integration burden that other vendors push onto customers through third-party ISV partnerships. Its GraphQL and REST APIs support headless implementations with third-party DXP or front-end-as-a-service layers, while the modular monolith architecture keeps operational overhead lower than fully decomposed microservices stacks.&lt;/p&gt;

&lt;p&gt;Gartner scores OroCommerce at 4.02 out of 5.0 for B2B Digital Commerce — second only to Spryker in that category — and highlights strong capabilities across B2B workflows, RFQs, CRM integration, and globalization via multisite inheritance. Recent additions include AI SmartAgent for B2B buying assistance, OroPay for check-out and invoicing, and AI-generated real-time reporting.&lt;/p&gt;

&lt;p&gt;For manufacturing, distribution, and wholesale organizations that want deep B2B functionality without stitching together five separate vendor contracts, OroCommerce sits at the top of this list.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Spryker
&lt;/h2&gt;

&lt;p&gt;Spryker earns its position as the highest-scoring platform in Gartner's B2B Digital Commerce use case at 4.32 out of 5.0, and its composable commerce score of 4.46 places it second overall in that category. The architecture — over 40 packaged business capabilities deployed on PaaS — gives development teams genuine modularity at the component level.&lt;/p&gt;

&lt;p&gt;The platform's state machine and workflow BPM tooling are a particular differentiator for B2B. Complex purchase approval flows, multi-step quoting, and channel-specific rules can be configured without custom development. Its recent additions include a native auction capability, a customer self-service portal, and an MCP server that allows buyers to place orders through external LLMs including Anthropic Claude.&lt;/p&gt;

&lt;p&gt;Spryker is well-suited for manufacturers, particularly in automotive and industrial sectors, where the commerce layer needs to connect tightly with IoT data, CPQ, and aftersales service workflows. Its main trade-off is operational overhead: as a PaaS offering, it requires a full-stack engineering team managing the full development and deployment cycle. Since Spryker mainly operates in Germany, its smaller North American footprint limits the pool of available integration partners.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Commercetools
&lt;/h2&gt;

&lt;p&gt;Commercetools holds the highest composable commerce score in Gartner's Critical Capabilities research at 4.59 out of 5.0, which reflects a genuine architectural commitment rather than a marketing position. Every API is independently consumable, every service can be deployed in isolation, and the platform is natively available on AWS, GCP, and Azure — including a dedicated SaaS deployment in China, which few competitors offer.&lt;/p&gt;

&lt;p&gt;The platform's target customer is a large global enterprise with more than $100 million in annual GMV and operations across multiple regions. Its Foundry precomposed solution for retail and manufacturing cuts initial deployment time, though implementation complexity remains high for teams without significant platform experience.&lt;/p&gt;

&lt;p&gt;For B2B specifically, commercetools added buyer approval workflow automation, business-unit-specific pricing and promotions, and MCP-based agentic commerce frameworks that let merchants connect AI agents to the commerce stack.&lt;/p&gt;

&lt;p&gt;However, despite these additions, the platform continues to rank notably lower than OroCommerce and Spryker in B2B-specific capabilities, which typically translates into a need for more extensive customization to meet complex B2B requirements. Its native CMS is lightweight, so organizations that need sophisticated content management will need a third-party integration — a known gap the vendor acknowledges.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. BigCommerce
&lt;/h2&gt;

&lt;p&gt;BigCommerce lands in Gartner's Challenger quadrant with a composable commerce score of 4.24, driven by its modular architecture of over 100 independently deployable microservices and a well-regarded partner ecosystem. The Catalyst headless storefront framework, built on Next.js and Vercel, gives front-end teams a modern development experience without rebuilding API connectivity from scratch.&lt;/p&gt;

&lt;p&gt;The B2B Edition — a fully integrated module within the core platform — handles contract pricing, net payment terms, shared shopping lists, and company account management. Its acquisition of Feedonomics adds channel syndication across retail media and marketplace networks.&lt;/p&gt;

&lt;p&gt;Where BigCommerce shows limits is in native functionality for complex B2B models: subscription commerce and marketplace operations both require third-party ISV integrations. Organizations running B2B2X models or multi-seller marketplaces will need to evaluate the partner ecosystem carefully before committing. That said, for mid-market B2B merchants who want a modern, composable foundation with a strong ecosystem, BigCommerce offers a credible path.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Elastic Path
&lt;/h2&gt;

&lt;p&gt;Elastic Path takes an unusual position in this market: it sells its commerce modules independently, which means organizations can deploy only the capabilities they actually need — catalog management, subscriptions, cart and checkout, or the full composable stack. This a-la-carte model is genuinely differentiated and appeals to teams that are augmenting an existing platform rather than replacing everything at once.&lt;/p&gt;

&lt;p&gt;The platform earns a composable commerce score of 4.15 from Gartner, with particular recognition for its Composer iPaaS layer that connects third-party services without custom middleware development. Its catalog architecture supports unlimited catalogs, price books, and hierarchies, which makes it well-suited for manufacturers and telcos managing complex product structures.&lt;/p&gt;

&lt;p&gt;The consistent limitation noted by Gartner is B2B feature depth: Elastic Path lacks native RFQ management, B2B approval workflows, and role-based buyer configuration. Teams with heavy B2B workflow requirements will need to build or integrate those capabilities, which adds to implementation scope. For composable front-end projects where catalog flexibility is the primary driver, it's a strong candidate.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Shopware
&lt;/h2&gt;

&lt;p&gt;Shopware holds a Visionary position in Gartner's 2025 Magic Quadrant, recognized for differentiated capabilities including 3D and AR product visualization, a native digital sales room, and AI-generated content tooling. It is among the fastest-growing vendors in the research by both revenue and customer additions, and its extension marketplace grew from 4,000 to 6,000 apps between 2024 and 2025.&lt;/p&gt;

&lt;p&gt;The platform is available as open-source community edition, self-hosted, PaaS, or single- and multi-tenant SaaS — a deployment flexibility that midmarket European manufacturers tend to value. Its Composable Frontends framework supports JavaScript-based headless storefronts, while its native Symfony storefront handles teams that prefer a managed approach.&lt;/p&gt;

&lt;p&gt;For B2B, Shopware offers a rule builder for pricing and promotions and a digital sales room capability that few platforms in this research match natively. The main gap is unified retail commerce — BOPIS, curbside, and store associate apps require third-party integrations — and its core remains largely monolithic despite modular service components.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Optimizely Configured Commerce
&lt;/h2&gt;

&lt;p&gt;Optimizely Configured Commerce targets manufacturing, wholesale, and distribution customers in the mid-market, and it does that job with genuine depth. Its B2B capabilities cover visual product configurators, contract pricing, product entitlements, and CPQ workflows — all within a single-tenant SaaS environment bundled with DXP, PIM, DAM, and personalization.&lt;/p&gt;

&lt;p&gt;Gartner highlights its AI-assisted search, via Google Vertex AI, generated product descriptions, and automated translations as meaningful B2B productivity tools. The platform's preconfigured headless storefront, built on React and pre-integrated with its native CMS Spire, gives customers a faster path to headless without rebuilding the API layer.&lt;/p&gt;

&lt;p&gt;Two limitations worth noting: Optimizely's commerce offerings are rarely deployed independently of the broader DXP, which creates bundle dependency for customers who only need commerce functionality. Its native marketplace and subscription capabilities are also limited compared to other platforms in this list. For manufacturers and distributors already using or evaluating Optimizely One, the commerce module integrates tightly with the rest of the experience stack.&lt;/p&gt;

&lt;h2&gt;
  
  
  Choosing the Right Architecture for Your B2B Context
&lt;/h2&gt;

&lt;p&gt;The platforms above reflect a wide range of trade-offs between composability, operational complexity, B2B feature depth, and total cost of ownership. A few questions worth working through before shortlisting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;How complex is your B2B buying process?&lt;/strong&gt; If approval workflows, RFQ management, and account-based pricing are core to your sales motion, OroCommerce and Spryker offer the deepest native support. commercetools and BigCommerce cover the basics but require more ISV integration for advanced workflows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What is your team's infrastructure capacity?&lt;/strong&gt; Fully decomposed composable platforms like commercetools and Spryker require experienced platform engineering. BigCommerce and Optimizely are more accessible to smaller technical teams.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Do you need B2C and B2B from one platform?&lt;/strong&gt; If your organization sells to both consumers and businesses, commercetools, OroCommerce, and BigCommerce all support this from a unified architecture without requiring separate platform instances.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What deployment model fits your compliance requirements?&lt;/strong&gt; HIPAA, GDPR, and data residency requirements vary significantly by vendor. OroCommerce and Spryker support on-premises and private cloud deployments — a requirement in regulated industries that rules out several SaaS-only platforms.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Gartner Critical Capabilities research referenced throughout this article evaluates these platforms across nine capability dimensions and five use cases. It remains one of the most structured tools available for comparing vendors against your specific deployment requirements.&lt;/p&gt;

</description>
      <category>b2b</category>
    </item>
    <item>
      <title>Stop Storing Secrets in localStorage: Patterns for a Secure Digital ID Wallet</title>
      <dc:creator>Robert Domestisck</dc:creator>
      <pubDate>Sun, 26 Oct 2025 19:48:45 +0000</pubDate>
      <link>https://dev.to/robert_domestisck_ae7af5a/stop-storing-secrets-in-localstorage-patterns-for-a-secure-digital-id-wallet-nkf</link>
      <guid>https://dev.to/robert_domestisck_ae7af5a/stop-storing-secrets-in-localstorage-patterns-for-a-secure-digital-id-wallet-nkf</guid>
      <description>&lt;p&gt;TL;DR: localStorage is convenient, but it’s a glass box. If you’re building a digital &lt;a href="https://folio.id/id-wallet-app/" rel="noopener noreferrer"&gt;ID wallet app&lt;/a&gt; (cards, IDs, passes), move secrets out of JS-readable storage. Use passkeys/WebAuthn for auth, httpOnly cookies or a BFF for sessions, and E2EE with non-extractable keys + IndexedDB for encrypted payloads. Sprinkle in CSP, Trusted Types, and a service worker for defense-in-depth.&lt;/p&gt;

&lt;p&gt;Why localStorage is the wrong place for secrets&lt;/p&gt;

&lt;p&gt;XSS exfiltration: Any script that runs in your origin can read localStorage. That means one missed output-escape, compromised NPM dependency, or misconfigured third-party and your tokens are gone.&lt;/p&gt;

&lt;p&gt;Long-lived &amp;amp; persistent: Secrets survive tabs, reloads, and crashes. Great for convenience, terrible for incident response.&lt;/p&gt;

&lt;p&gt;No flags: Unlike cookies, you can’t mark localStorage as HttpOnly, Secure, or SameSite.&lt;/p&gt;

&lt;p&gt;Copyable at rest: DevTools, extensions, or shared machines can yank it.&lt;/p&gt;

&lt;p&gt;What counts as a “secret”?&lt;br&gt;
Access/refresh tokens, private keys, recovery seeds, raw PII, and unencrypted ID documents (images, PDFs, MRZ text). If losing it lets an attacker impersonate a user or decrypt their vault, it’s a secret.&lt;/p&gt;

&lt;p&gt;Threat model for a Digital ID Wallet&lt;/p&gt;

&lt;p&gt;Goal: store user cards/IDs encrypted at rest, unlock with the user’s device auth, and sync safely.&lt;/p&gt;

&lt;p&gt;Trust boundaries: the server must never see plaintext vault data; the browser must not keep extractable keys in JS land.&lt;/p&gt;

&lt;p&gt;Reality: XSS, supply-chain JS, malicious extensions, shoulder-surfing, stolen laptops.&lt;/p&gt;

&lt;p&gt;So we need patterns that degrade gracefully even when XSS happens.&lt;/p&gt;

&lt;p&gt;Pattern 1 — Authenticate with Passkeys (WebAuthn), not bearer tokens in JS&lt;/p&gt;

&lt;p&gt;Use WebAuthn to create a device-bound credential. No tokens to hoard in localStorage.&lt;/p&gt;

&lt;p&gt;// Register (create) a passkey&lt;br&gt;
const publicKey: PublicKeyCredentialCreationOptions = {&lt;br&gt;
  challenge: await fetch('/webauthn/challenge').then(r =&amp;gt; r.arrayBuffer()),&lt;br&gt;
  rp: { name: 'Your App', id: location.hostname },&lt;br&gt;
  user: {&lt;br&gt;
    id: new TextEncoder().encode(currentUserId),&lt;br&gt;
    name: currentUserEmail,&lt;br&gt;
    displayName: currentUserName,&lt;br&gt;
  },&lt;br&gt;
  pubKeyCredParams: [{ alg: -7, type: 'public-key' }, { alg: -257, type: 'public-key' }],&lt;br&gt;
  authenticatorSelection: { userVerification: 'required' },&lt;br&gt;
};&lt;br&gt;
const cred = await navigator.credentials.create({ publicKey });&lt;br&gt;
await fetch('/webauthn/register', {&lt;br&gt;
  method: 'POST',&lt;br&gt;
  body: JSON.stringify(cred),&lt;br&gt;
  headers: { 'Content-Type': 'application/json' }&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;At sign-in, assert instead of exchanging passwords for bearer tokens:&lt;/p&gt;

&lt;p&gt;const assertion = await navigator.credentials.get({&lt;br&gt;
  publicKey: {&lt;br&gt;
    challenge: await fetch('/webauthn/challenge').then(r =&amp;gt; r.arrayBuffer()),&lt;br&gt;
    userVerification: 'required',&lt;br&gt;
    allowCredentials: [ /* your credential IDs */ ]&lt;br&gt;
  }&lt;br&gt;
});&lt;br&gt;
await fetch('/webauthn/verify', { method: 'POST', body: JSON.stringify(assertion) });&lt;/p&gt;

&lt;p&gt;Session handling: Prefer an opaque, short-lived session issued server-side, returned as Set-Cookie with HttpOnly; Secure; SameSite=Strict. No token lands in JS.&lt;/p&gt;

&lt;p&gt;Pattern 2 — Use a BFF (Backend-for-Frontend) instead of storing tokens client-side&lt;/p&gt;

&lt;p&gt;If you must talk to third-party APIs, don’t hand access tokens to the browser. Let a thin BFF attach tokens server-side.&lt;/p&gt;

&lt;p&gt;Browser -&amp;gt; BFF (/api/*) -&amp;gt; Upstream APIs&lt;br&gt;
           ^ keeps only HttpOnly session cookie, no access tokens in JS&lt;/p&gt;

&lt;p&gt;This removes the incentive to stash OAuth tokens in localStorage. When XSS fires, there’s nothing reusable to steal.&lt;/p&gt;

&lt;p&gt;Bonus: If you need proof-of-possession, add DPoP at the BFF or mutual TLS upstream.&lt;/p&gt;

&lt;p&gt;Pattern 3 — Encrypted vault in IndexedDB using non-extractable keys&lt;/p&gt;

&lt;p&gt;Store encrypted cards/IDs in IndexedDB. The encryption key is a non-extractable CryptoKey wrapped by a passkey-protected key. Even if XSS lists your DB, it sees only ciphertext.&lt;/p&gt;

&lt;p&gt;Step A: Create a content-encryption key (CEK)&lt;br&gt;
// Non-extractable symmetric key&lt;br&gt;
const cek = await crypto.subtle.generateKey(&lt;br&gt;
  { name: 'AES-GCM', length: 256 },&lt;br&gt;
  false, // not exportable&lt;br&gt;
  ['encrypt', 'decrypt']&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;Step B: Wrap CEK with a user-bound key&lt;/p&gt;

&lt;p&gt;Use a wrapping key tied to the device (via WebAuthn + platform keystore) or derive from a user secret combined with device signals. Here’s the Web Crypto wrap flow (assuming you obtained/imported wrappingKey securely):&lt;/p&gt;

&lt;p&gt;const wrapped = await crypto.subtle.wrapKey(&lt;br&gt;
  'raw',&lt;br&gt;
  cek,&lt;br&gt;
  wrappingKey,                // e.g., RSA-OAEP/WebAuthn-backed&lt;br&gt;
  { name: 'RSA-OAEP' }&lt;br&gt;
);&lt;br&gt;
// Save &lt;code&gt;wrapped&lt;/code&gt; in IndexedDB; unwrap it after user verification&lt;/p&gt;

&lt;p&gt;Step C: Encrypt and store records&lt;br&gt;
async function encryptBlob(cek: CryptoKey, data: Uint8Array) {&lt;br&gt;
  const iv = crypto.getRandomValues(new Uint8Array(12));&lt;br&gt;
  const ct = await crypto.subtle.encrypt(&lt;br&gt;
    { name: 'AES-GCM', iv },&lt;br&gt;
    cek,&lt;br&gt;
    data&lt;br&gt;
  );&lt;br&gt;
  return { iv, ct: new Uint8Array(ct) };&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;Persist { iv, ct } in IndexedDB. Never keep plaintext or keys in localStorage.&lt;/p&gt;

&lt;p&gt;Pattern 4 — Gate decryption behind User Verification (biometrics/PIN)&lt;/p&gt;

&lt;p&gt;On each unlock, require userVerification: 'required' via WebAuthn (or OS keychain on desktop apps). This makes decryption events interactive and ties them to Face/Touch ID.&lt;/p&gt;

&lt;p&gt;await navigator.credentials.get({&lt;br&gt;
  publicKey: {&lt;br&gt;
    challenge: await fetch('/unseal/challenge').then(r =&amp;gt; r.arrayBuffer()),&lt;br&gt;
    userVerification: 'required',&lt;br&gt;
    allowCredentials: [ /* the credential used to wrap CEK */ ]&lt;br&gt;
  }&lt;br&gt;
});&lt;br&gt;
// server returns a one-time unwrap token or a wrapped CEK shard&lt;/p&gt;

&lt;p&gt;Practical note: Cache a short-lived unwrapped CEK in memory only (not in storage). Clear it on tab close, inactivity, or lock.&lt;/p&gt;

&lt;p&gt;Pattern 5 — Service Worker as a thin shield&lt;/p&gt;

&lt;p&gt;A service worker can centralize fetches and enforce “no secrets in requests”:&lt;/p&gt;

&lt;p&gt;// sw.js&lt;br&gt;
self.addEventListener('fetch', (e) =&amp;gt; {&lt;br&gt;
  const url = new URL(e.request.url);&lt;br&gt;
  // Block accidental leakage of internal headers/query params&lt;br&gt;
  if (url.searchParams.has('token')) {&lt;br&gt;
    e.respondWith(new Response('Forbidden', { status: 403 }));&lt;br&gt;
    return;&lt;br&gt;
  }&lt;br&gt;
  e.respondWith(fetch(e.request));&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;It also provides offline caching of encrypted payloads only (Cache Storage). Never cache decrypted responses.&lt;/p&gt;

&lt;p&gt;Pattern 6 — Lock down the front end (CSP, Trusted Types, COOP/COEP)&lt;/p&gt;

&lt;p&gt;CSP: default-src 'self'; script-src 'self' 'strict-dynamic' 'nonce-...'; object-src 'none'; base-uri 'none'; frame-ancestors 'none'.&lt;/p&gt;

&lt;p&gt;Trusted Types: eliminate DOM XSS sinks by requiring safe HTML builders.&lt;/p&gt;

&lt;p&gt;Subresource Integrity: pin hashes for third-party JS (or better: self-host and sign).&lt;/p&gt;

&lt;p&gt;COOP/COEP: isolate your browsing context to reduce cross-origin surprises and enable powerful APIs safely.&lt;/p&gt;

&lt;p&gt;These won’t save you if you actively store secrets in JS storage, but they reduce XSS probability and blast radius.&lt;/p&gt;

&lt;p&gt;Pattern 7 — Sync without trusting the server (E2EE)&lt;/p&gt;

&lt;p&gt;For multi-device:&lt;/p&gt;

&lt;p&gt;Generate CEK on Device A.&lt;/p&gt;

&lt;p&gt;Wrap CEK using Device A’s wrapping key; upload only the wrapped blob.&lt;/p&gt;

&lt;p&gt;On Device B, after user verification, re-wrap CEK for Device B and store locally.&lt;/p&gt;

&lt;p&gt;Documents sync as ciphertext; the server never sees plaintext or unwrapped CEKs.&lt;/p&gt;

&lt;p&gt;If you add multi-party access (e.g., family vault), use asymmetric envelope encryption: a unique data key per item, wrapped for each member’s public key.&lt;/p&gt;

&lt;p&gt;Pattern 8 — Mobile &amp;amp; desktop: use platform keychains&lt;/p&gt;

&lt;p&gt;If you ship native shells (Capacitor, React Native, desktop apps):&lt;/p&gt;

&lt;p&gt;iOS: Keychain + Secure Enclave (non-exportable keys).&lt;/p&gt;

&lt;p&gt;Android: Keystore with StrongBox where available.&lt;/p&gt;

&lt;p&gt;Desktop: OS keyrings (Windows DPAPI, macOS Keychain, libsecret on Linux).&lt;/p&gt;

&lt;p&gt;Store wrapped keys or small secrets there, never plaintext in sandboxed files.&lt;/p&gt;

&lt;p&gt;What if you really need to remember something in the browser?&lt;/p&gt;

&lt;p&gt;If you must persist some state:&lt;/p&gt;

&lt;p&gt;Store opaque references or nonces, not secrets.&lt;/p&gt;

&lt;p&gt;Use short expiry and bind them to device/credential where possible.&lt;/p&gt;

&lt;p&gt;Rotate aggressively; treat it like a cache hint, not a keyring.&lt;/p&gt;

&lt;p&gt;Migration playbook (away from localStorage)&lt;/p&gt;

&lt;p&gt;Audit: find every read/write of localStorage, list the data classes (token, PII, UI prefs).&lt;/p&gt;

&lt;p&gt;Classify: move only non-sensitive prefs (theme, layout) to localStorage; everything else migrates.&lt;/p&gt;

&lt;p&gt;Session: swap JS bearer tokens for HttpOnly session cookies via a BFF.&lt;/p&gt;

&lt;p&gt;Vault: introduce IndexedDB + non-extractable keys; write a one-time migration that decrypts old blobs and re-encrypts under the CEK.&lt;/p&gt;

&lt;p&gt;App hardening: deploy CSP + Trusted Types; turn on SRI; review third-party scripts.&lt;/p&gt;

&lt;p&gt;Kill switch: add a remote feature flag to force logout + key wipe for incident response.&lt;/p&gt;

&lt;p&gt;Mini reference: Do / Don’t&lt;/p&gt;

&lt;p&gt;Do&lt;/p&gt;

&lt;p&gt;HttpOnly; Secure; SameSite cookies for sessions&lt;/p&gt;

&lt;p&gt;WebAuthn passkeys for auth + user verification&lt;/p&gt;

&lt;p&gt;Non-extractable keys + AES-GCM in IndexedDB&lt;/p&gt;

&lt;p&gt;E2EE sync (server sees ciphertext only)&lt;/p&gt;

&lt;p&gt;CSP, Trusted Types, SRI, SW hygiene&lt;/p&gt;

&lt;p&gt;Don’t&lt;/p&gt;

&lt;p&gt;Put tokens, private keys, or vault plaintext in localStorage&lt;/p&gt;

&lt;p&gt;Cache decrypted data in service worker/Cache Storage&lt;/p&gt;

&lt;p&gt;Log secrets to console/analytics&lt;/p&gt;

&lt;p&gt;Rely on obfuscation or UI-level “locks” as real security&lt;/p&gt;

&lt;p&gt;Closing thoughts&lt;/p&gt;

&lt;p&gt;A digital ID wallet lives or dies by how you store secrets. localStorage was never meant to be a key vault. With passkeys for sign-in, server-side sessions (or a BFF), and an encrypted vault backed by non-extractable keys in IndexedDB, you raise the bar dramatically—without wrecking UX. Add platform keychains on mobile/desktop, and you’ve got a modern, user-friendly wallet that stays locked even when the browser misbehaves.&lt;/p&gt;

&lt;p&gt;If you want a follow-up, I can post a small reference implementation: WebAuthn login + CEK wrapping + encrypted IndexedDB with React hooks and a service worker cache that never touches plaintext.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>security</category>
      <category>architecture</category>
      <category>webdev</category>
    </item>
    <item>
      <title>5 Lessons from Web Development That Apply to People-Finder Platforms</title>
      <dc:creator>Robert Domestisck</dc:creator>
      <pubDate>Thu, 31 Jul 2025 09:29:37 +0000</pubDate>
      <link>https://dev.to/robert_domestisck_ae7af5a/5-lessons-from-web-development-that-apply-to-people-finder-platforms-2bf5</link>
      <guid>https://dev.to/robert_domestisck_ae7af5a/5-lessons-from-web-development-that-apply-to-people-finder-platforms-2bf5</guid>
      <description>&lt;p&gt;&lt;strong&gt;What do building a React app and reconnecting with a childhood friend have in common?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;At first glance, not much. One involves component trees and state management; the other, years of distance and a lingering question: "What ever happened to them?" But look closer, and you’ll find that both share something powerful—code designed to connect people.&lt;br&gt;
People-finder platforms like Radaris help users track down old friends, classmates, family members, or long-lost loved ones. Whether you’ve moved across states or simply drifted apart over time, platforms like these turn fragmented data—addresses, phone numbers, public records—into meaningful reconnections. They’re part search engine, part digital detective.&lt;/p&gt;

&lt;p&gt;And they don’t work by accident. The tech principles that power great web applications—&lt;a href="https://web.dev/vitals/" rel="noopener noreferrer"&gt;speed, structure, security&lt;/a&gt;, and user-centered design—are the same ones that make people-finders so effective. Web development isn’t just about building tools for businesses—it’s about building bridges between people.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lesson 1: Speed Matters More Than Ever
&lt;/h2&gt;

&lt;p&gt;In web development, speed isn't just a bonus—it's survival. Studies show that users start bouncing if a page takes more than 2–3 seconds to load. That urgency only intensifies on platforms driven by emotion. People-finder tools like &lt;a href="https://www.radaris.com/" rel="noopener noreferrer"&gt;Radaris.com&lt;/a&gt; aren't just utilities—they’re emotional engines. When you're trying to reconnect with someone who disappeared from your life years ago, waiting isn’t just frustrating—it’s heartbreaking.&lt;/p&gt;

&lt;p&gt;That’s why performance optimization is critical. Platforms like Radaris leverage:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Indexed search to surface results faster than traditional database queries&lt;/li&gt;
&lt;li&gt;Smart caching to avoid reloading previously visited profiles&lt;/li&gt;
&lt;li&gt;Lazy loading to prioritize content visibility without overloading the page&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📌 Callout: “At Radaris, milliseconds matter when you're searching for someone who’s been missing for years.”&lt;/p&gt;

&lt;h2&gt;
  
  
  Lesson 2: User Experience is Everything
&lt;/h2&gt;

&lt;p&gt;Speed gets users in the door, but user experience earns their trust. Clunky interfaces breed hesitation, especially when someone’s emotionally invested in the outcome. On the other hand, a fluid, intuitive design helps users feel confident—and keeps them engaged.&lt;/p&gt;

&lt;p&gt;For people-finder platforms, that means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Search-as-you-type to show instant feedback and reduce typing errors&lt;/li&gt;
&lt;li&gt;Mobile-first UI for users looking up names from their phones at a family gathering&lt;/li&gt;
&lt;li&gt;Contextual breadcrumbs that help users trace their search journey without confusion&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Radaris excels at this with a clean, responsive layout, logical filtering options, and CTAs that guide without overwhelming. When someone is nervous about finding the right person, clarity becomes comfort.&lt;/p&gt;

&lt;p&gt;Trust isn't a feature—it’s the byproduct of thoughtful design.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lesson 3: Data Integrity is a Feature, Not a Footnote
&lt;/h2&gt;

&lt;p&gt;In web development, clean, structured, and normalized data is the foundation of any stable app. If your database is a mess, no amount of front-end magic can fix it. The same is even more critical in people-finder platforms like Radaris.&lt;/p&gt;

&lt;p&gt;When you're helping users reconnect with someone from their past, a wrong address or mismatched name isn’t just a technical hiccup—it’s a broken lead or false hope. That’s why data integrity isn’t a backend concern—it’s a core feature.&lt;/p&gt;

&lt;p&gt;Behind the scenes, platforms like Radaris rely on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deduplication algorithms to avoid showing the same person multiple times&lt;/li&gt;
&lt;li&gt;Validation rules to flag incomplete or suspicious entries&lt;/li&gt;
&lt;li&gt;Source hierarchy to prioritize the most credible data sets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The challenge? Balancing data volume with verification. Pulling from multiple public records, social networks, and third-party databases requires strict logic to determine what’s real and what’s noise.&lt;/p&gt;

&lt;p&gt;🛠️ People-finders aren’t just aggregators—they’re data curators.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lesson 4: Privacy by Design
&lt;/h2&gt;

&lt;p&gt;The old mindset was “gather everything.” In 2025, the mantra is “protect everything.”&lt;/p&gt;

&lt;p&gt;Privacy isn’t a checkbox—it’s a design principle. With increasing scrutiny from users and regulators, platforms like Radaris are embedding privacy directly into the product lifecycle.&lt;/p&gt;

&lt;p&gt;That means compliance with laws like GDPR and CCPA isn’t optional—it’s fundamental. But technical compliance is just one side of the coin. The developer’s role is to operationalize privacy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Building granular permission layers that control who sees what&lt;/li&gt;
&lt;li&gt;Creating opt-out workflows that are user-friendly and effective&lt;/li&gt;
&lt;li&gt;Securing data with encrypted endpoints and robust access controls&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔐 “Building trust starts in the codebase.” When users feel that their data is respected and protected, they’re far more likely to engage—and stay.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lesson 5: Empowering Users with Insight, Not Overload
&lt;/h2&gt;

&lt;p&gt;In development, we know the difference between a great dashboard and a terrible one. The best ones highlight what matters; the worst ones bury users in data. That same principle is crucial in people-finder platforms.&lt;/p&gt;

&lt;p&gt;When someone searches for a long-lost friend or relative, they don’t want a data dump. They want clarity. A smart interface prioritizes information like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Last known location&lt;/li&gt;
&lt;li&gt;Past occupations&lt;/li&gt;
&lt;li&gt;Possible relatives&lt;/li&gt;
&lt;li&gt;Relevant age or education markers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This isn’t just a UI challenge—it’s a UX responsibility. Overloading users with raw data can create anxiety or confusion, especially when it comes to sensitive subjects like reconnecting after years apart.&lt;/p&gt;

&lt;p&gt;Good platforms use &lt;a href="https://www.nngroup.com/articles/progressive-disclosure/" rel="noopener noreferrer"&gt;design patterns that support progressive disclosure&lt;/a&gt; to surface the most relevant details first, offer intuitive filters, and encourage thoughtful outreach, not invasive digging.&lt;/p&gt;

&lt;p&gt;📌 Ethical UX means empowering, not overwhelming.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion: Building With Empathy
&lt;/h2&gt;

&lt;p&gt;In the world of people-finder tools, web development isn't just about performance or architecture—it's about people.&lt;/p&gt;

&lt;p&gt;Your choices as a developer—from how fast a page loads to how data is displayed or protected—shape how someone experiences that crucial moment of reconnection. It's not just about using the latest tech stack or building the slickest UI.&lt;/p&gt;

&lt;p&gt;💡 “When you're building tools that help someone reconnect with a person they lost touch with, clean code and fast endpoints aren’t just nice-to-haves—they're acts of service.”&lt;/p&gt;

&lt;p&gt;That’s why &lt;a href="https://www.ibm.com/topics/privacy-by-design" rel="noopener noreferrer"&gt;privacy-by-design frameworks&lt;/a&gt; aren’t just compliance checkboxes—they’re trust-building tools. It’s also why people-finder tools must focus on &lt;a href="https://www.dataversity.net/understanding-the-importance-of-data-quality/" rel="noopener noreferrer"&gt;data accuracy&lt;/a&gt; as a product feature, not an afterthought.&lt;/p&gt;

&lt;p&gt;In the end, great platforms blend engineering skill with emotional intelligence—and that’s where the magic really happens.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
