Blog

Release notes, design decisions, and what's new in Navii. Minor and major versions only — patches live on CHANGELOG.md.

v0.23.0 May 26, 2026 yanked
#

AvatarOptions.mood

Added (@usenavii/core 0.6.0, @usenavii/react 0.6.0)

  • 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.palettespec.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.
v0.22.0 May 26, 2026
#

Pack overhaul

Added (@usenavii/core 0.5.0)

  • 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 authoritativeresolvePartPool 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 verificationPOST /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.
  • GET /portal — Polar customer portal proxy (license re-fetch, refund request).
  • 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.shProductPermalinkpolarOrganizationId + 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.
v0.21.0 May 26, 2026
#

Landing "built with navii" logo wall section above the playground, in two cen…

Added (API host)

  • Landing "built with navii" logo wall section above the playground, in two centered rows.
  • GET /logos/:file route serving PNG/SVG/JPG/WEBP assets from packages/api/public/logos with a filename whitelist and path-traversal guard.
  • Dockerfile copies packages/api/public into the runtime image so the route works in production.
v0.20.0 May 25, 2026
#

/privacy — public privacy policy page covering avatar requests, license ver…

Added (API host)

  • /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.
v0.4.0 May 23, 2026
#

Navii.random() — pick a random seed and return its avatar, so callers don't…

Added

  • Navii.random() — pick a random seed and return its avatar, so callers don't need to bring their own RNG.
v0.2.0 May 22, 2026
#

Navii.build(parts) — compose an avatar from explicit part choices, no seed …

Added

  • Navii.build(parts) — compose an avatar from explicit part choices, no seed required.
  • Navii.seed(...) — public seed-to-parts derivation surface.
  • Snapshot test coverage for build and seed.
v0.1.0 May 22, 2026
#

Initial public release of @usenavii/core and @usenavii/react.

Added

  • Initial public release of @usenavii/core and @usenavii/react.
  • Deterministic avatar engine: Navii(seed) returns a stable SVG string for any seed.
  • React binding: <Navii seed="..." />.
  • Dual ESM/CJS build via tsup. TypeScript types included.