AvatarOptions.mood — new MoodId = 'neutral' | 'happy' | 'serious' | 'sleepy' | 'wink'. Overrides seed-derived eyes + mouth with a curated pair: happy → wide + smile, serious → squint + flat, sleepy → sleepy + dot, wink → wink + smirk. Same seed + same mood = byte-identical render. Different mood on the same seed shares body / palette / topper. Bypasses pack pick constraints by design (the mood IS the override). neutral (or undefined) preserves prior behavior.
Runtime palette injection in build() — options.palette (Palette object) now wins over spec.palette (id). Lets callers pass a brand or runtime-built palette without registering it in PALETTES. Fall-through: options.palette → spec.palette id → PALETTES[0].
React <Navii> forwards new mood and palette props through to the engine; MoodId re-exported from the React package.
Added (API host)
GET /avatar/:seed?mood=happy|serious|sleepy|wink|neutral — server-side mood overlay. PNG cache key extended with m= so moods don't collide.
Elorm UI logo (inline SVG, currentColor) in the landing "built with navii" wall, sized via new .logo svg.lg rule.
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.
/privacy — public privacy policy page covering avatar requests, license verification, and analytics.
/support — public support page with contact email, GitHub issues link, and console-capture instructions.
Both pages linked from landing + docs footers and listed in /sitemap.xml.
Added (Figma plugin)
networkAccess.reasoning in manifest.json explaining why api.navii.dev and navii.dev are allowlisted.
Offline pre-flight on insert, fill-random, and license-verify — surfaces a clear notification instead of failing silently when navigator.onLine is false.
notify message type so the UI iframe can push toasts through figma.notify.