Pack overhaul — all 7 packs given distinct visual identities via new render flags (flat, bgColor, featureStroke, paletteExclusive, glow). Each pack now reads as a different illustration system, not just a recoloring.
New body shapes (pack-only, base seeds unchanged): squircle (full-bleed corporate tile), pumpkin, ghost, skullHead.
New mouth styles (pack-only): jagged (carved-pumpkin grin), fangs (vampire teeth).
New toppers: witchHat, pumpkinStem, ghostSheet, bob, bun, ponytail.
New accessory: earring (palette-themed stud + drop pair).
New outfit: tie (corporate necktie — knot + tapered blade).
Pack.glow flag emits an outer-glow SVG filter behind the body (Gaussian blur tinted by palette). Used by Neon.
AvatarSpec.flat / bgColor / featureStroke / glow — render directives the engine reads to alter body/face rendering per enabled pack.
featureStroke multiplier scales stroke widths on eyes, mouth, glasses uniformly. Office bumps to 1.35, Neon 1.5, Mono down to 1.15 (delicate).
New office-bright pack — vivid sibling of Office for marketing/design teams.
Changed (@usenavii/core 0.5.0)
Pack picks now authoritative — resolvePartPool no longer intersects against base pool, so packs can introduce ids unknown to the base (e.g. Office's squircle). Type system enforces validity.
Office, Halloween, Pastel, Neon, Mono, Earth packs reauthored with theme-cohesive picks, style hints, and exclusive palette pools.
Office uses full-bleed squircle + white plate + necktie outfits + bolder strokes for ID-badge look.
Halloween uses pumpkin/ghost/skullHead bodies + jagged/fangs mouths + witchHat/stem/sheet toppers + dark night plate.
Neon emits an outer glow halo via SVG filter behind the body.
Mono switched to full-bleed squircle (was contained orb) for editorial tile look.
Added (API host)
Polar.sh license verification — POST /license/verify now proxies to Polar's /v1/customer-portal/license-keys/validate (replaces Polar.sh). Validates status === 'granted', expiry, and optional benefit-id match.
GET /checkout — redirects to Polar checkout w/ configured product preselected. Powered by @polar-sh/hono.
POST /polar/webhooks — signature-verified webhook receiver, logs events.
New env vars: POLAR_ORGANIZATION_ID, POLAR_PRODUCT_ID, POLAR_BENEFIT_ID, POLAR_ACCESS_TOKEN, POLAR_SUCCESS_URL, POLAR_WEBHOOK_SECRET, POLAR_SERVER.
Compose file wires all Polar vars from /opt/navii/.env.
8 new license unit tests w/ fetch mock covering granted/revoked/expired/wrong-product/upstream-error paths.
Changed (API host)
Privacy page swapped Polar.sh references for Polar.sh.
AppOptions renamed Polar.shProductPermalink → polarOrganizationId + related Polar fields.
Added (Figma plugin)
Style hint pill row in Packs panel — Auto / Masc / Femme / Neutral toggle. Persisted via navii.style localStorage. Disabled when no pack active.
Plugin checkout URL now points at ${API_BASE}/checkout (instead of hardcoded Polar.sh link), letting us swap payment providers without re-publishing.
Fixed (Figma plugin)
Left column in Packs panel was not scrollable when content overflowed (e.g. with new Style hint section). Added overflow-y: auto + min-height: 0 to .col-left.