← Back
Changelog
Another update. Another city. Simple as that.
v5.04 Hamburg Active
- Animated moving border on liquid glass close buttons and action buttons — conic-gradient now transitions on hover
- Animated moving border on compose (+) and settings gear buttons — full glass hover recipe applied globally to glass-pill
- Reply, Reply All, Forward, and Trash buttons in the read panel restyled to match Cc/Bcc — plain muted icons with opacity hover
v5.03 Minsk
- Mark as read/unread button now toggles — click to mark read, click again to mark unread
- INBOX unread badge updates instantly when toggling read/unread without reload
- Thread grouping now works — Group mode collapses messages by subject with a count pill
- Fixed thread setting callback — switching Group/Separate re-renders list immediately
- Greeting first name now renders in blue, matching dashboard typography
v5.02 Sofia
- INBOX and Drafts badge counts now persist when switching to Sent, Trash, or other folders
- Mail search bar restyled to use glass class — now matches dashboard search visually
- Removed Reading Panel option from mail settings — replaced by modal view
- Fixed compose close: draft now reliably saves on close via synchronous value capture
- Added time-of-day greeting to mail page — matches dashboard heading style and padding
v5.01 Bern
- Replaced mail side panel with a centred read modal — cleaner, popup-style message view
- Fixed mail list width to 880px (was shrinking in flex layout)
- Fixed Czech email preview encoding — quoted-printable bytes now decoded before charset conversion
- Redesigned mail card: action buttons pinned to top-right, unread dot vertically centred
- Restyled search bar as a pill matching the dashboard search style
- Added deletion date below received date in Trash folder
- Fixed compose label formatting — no uppercase, wider field, Subject instead of RE
- Instant compose close — draft saves in background, no delay
- Replaced mark-as-unread icon with eye icon
- Folder pill indicator now refreshes dynamically when badge count changes
v5.00 Warsaw 🏅 Major update
- Rebuilt mail app with 16 UI fixes — complete overhaul of layout, typography, and interactions
- Fixed Czech character encoding in email previews (ěščřžýáíé now render correctly)
- Removed breadcrumb bar and aligned mail layout width to match dashboard (880px)
- Added full-width search bar below folder picker with live client-side filtering
- Improved email row typography — sender 12px/bold, subject 12px, preview 11px/muted
- Replaced compact date codes with human-readable dates (Today 14:23 / Yesterday / Mon 12:00)
- Moved action icons (Flag, Remind, Trash) to left side of card with unread dot above
- Added Mark as Unread button in INBOX action column
- Fixed INBOX unread badge — now shows correct count and hides when zero
- Fixed individual reading panel — no longer blocked by CSS override
- Added Off option to auto-delete trash setting
- Fixed CC/BCC fields hidden on compose open — only shown when toggled
- Fixed close compose — now auto-saves draft before closing
- Merged Logged in as label and Disconnect button onto same row in settings
v4.47 Riga
- Fixed APEX footer to be correctly centred on all pages
- Fixed licence seat count — config file now loads reliably from apex directory
- Improved licence display to show seats and remaining count
- Disabled Create user button and surfaced error when licence limit is reached
- Fixed spacing collision between the Licence row and Create user button
- Added 15-second timeout to mail inbox loading — shows clear error instead of infinite spinner
- Fixed pre-existing TypeScript errors in Hero and Layout components
v4.46 Basel
- Fixed mail app crash caused by duplicate JavaScript declaration blocking the entire script
- Fixed all liquid glass segment switchers to adapt pill width dynamically to label content
- Added licence system — configurable user cap enforced on account creation, displayed in admin tab
- Stripped APEX footer to NN. logo only
- Fixed mail polling to show persistent inline error after repeated connection failures
v4.45 Split
- Launched APEX Mail — full IMAP/SMTP client with inbox, sent, drafts, trash, compose, reply, and forward
- Mail card redesign — vertical liquid glass action column with per-folder button sets (flag, remind, trash, restore, delete forever)
- Mail unread dot states — blue for unread, red for flagged or overdue reminder, transparent for read
- Overdue reminders pin email to top of list and pulse red dot
- Dashboard updated — Drive and Calendar app cards added
- Settings API — avatar and profile endpoints added
- Modules renamed: CRM → Clients, Invoices → Finance
- Admin setup page redesigned for self-hosted APEX instances
v4.44 Salzburg
- Renamed APEX stylesheet portal.css → apex.css across all modules — aligns filename with portal→apex rebrand
v4.43 Zagreb
- Fixed VAL font not loading on APEX admin setup page — font-face src now points to studionn.cz/VAL.otf, bypassing apex subdomain 503
v4.42 Dublin
- Fixed 404 page 'Back to homepage' button invisible — class name collided with global sub-page header style, renamed to avoid conflict
- Restructured APEX into modules — crm, dashboard, and invoices moved to apex/modules/, Apex Drive placeholder added
- Fixed APEX DB config path — db.php now correctly reads apex-config.php from the directory above the web root
- Renamed portal → apex throughout codebase — db.php, config example, crm, invoices, schema
v4.41 Lisbon
- Fixed invisible clickable button during onboarding animation — pointer-events disabled on all steps, enabled on step 3 only after animation completes
- Fixed admin setup redirect loop — DB unavailability now shows error banner instead of bouncing back to login
- 2FA is now mandatory for admin accounts — TOTP QR rendered immediately on page load, no optional toggle
v4.40 Santiago
- Onboarding welcome flow now triggers correctly when database is unreachable on fresh deploy
- Onboarding headlines redesigned to match homepage Services section — bold weight, blue accent on key word
- 'Set up APEX' CTA replaced with liquid glass pill — canonical dark-first recipe with conic border ring
- 'Not now' simplified to subtle text link stacked below primary CTA
- Extended Inter font range to 100–900 for correct ultra-light weight rendering in onboarding
v4.39 Marrakech
- Login card glass recipe unified with contact form — saturate(150%) brightness(1.02), no outer shadow, canonical ::after inset positioning
- 404 back button unified with btn-cta-primary — dark-mode-first, correct light-mode override with hover state
- Login page NN. logo enlarged for better visual hierarchy
- Updated design-system.md and release-process.md to document correct backdrop-filter values
v4.38 Ghent
- Fixed VAL font still not rendering on apex subdomain — font URL changed to absolute path, Apache MIME type added to .htaccess
- Fixed first-run welcome flow — nested fallback query handles missing role column in production DB; correctly triggers on fresh deploy
- Login card now uses .glass class — proper ::after conic border ring matching changelog cards
- Sign In / Continue buttons redesigned — animated glass pill with @property conic rotation and scale(0.975) press-down, matching 404 back button
- Added Back to homepage button below login card — exact design match to /404 back button
- Updated design-system.md — documents interactive button recipe, clarifies glass-pill is non-interactive only
v4.37 Brussels
- Fixed VAL font not loading on apex subdomain — self-hosted in apex/assets/fonts/ to avoid cross-origin CORS block
- Fixed first-run onboarding — detection now checks for active admin users instead of total user count; triggers correctly when old non-admin users exist in DB
- Fixed admin setup guard — consistent with login detection, allows first-admin creation even when legacy users exist
- Redesigned first-run onboarding — macOS-style three-step cinematic sequence (Hello → Welcome to APEX → Let's get you started)
- Updated Sign In and Continue buttons to liquid glass pill matching design system
v4.36 Krakow
- Rebuilt apex auth system — JWT sessions, invite-code login, password + TOTP 2FA with backup codes
- Added first-run onboarding — animated walkthrough triggers on empty database, leads to admin creation form
- Added portal login page (/login/) — VAL font logo, glass card, password eye toggle, liquid glass submit button, and Back to homepage link
- Added account setup pages (/setup/, /setup/admin/) for invite-flow users and first admin creation
- Added settings page (/settings/) with password change, 2FA management, backup codes, login history, and admin user management
- Fixed first-run detection — DB init isolated from JWT verification to prevent false negatives on malformed cookies
- Removed legacy OTP auth files superseded by new JWT auth system
- Fixed Lab section headline — removed orphan line break between 'best' and 'client.'
- Fixed portal background CSS token (--bg was stale at old warm beige value)
v4.35 Antwerp
- Renamed internal portal directory from portal/ to apex/ across all files and config references
- Split deploy workflow FTP secrets into separate FTP_WWW_* and FTP_APEX_* pairs for finer deployment control
v4.34 Sarajevo
- Replaced portal navbar with a floating glass nav matching the main site — NN. logo and Settings button, no page section links
- Added Settings panel (CC panel) to portal with Dark Mode toggle and English / Čeština language picker
- Unified portal background with homepage — colourful radial gradient on dashboard, CRM, and invoices pages
- Added favicons to portal dashboard, CRM, and invoices pages
v4.33 Tbilisi
- Fixed Sign out button not responding — inline handler added to dashboard as the deployed portal.js predated the initSignOut function
v4.32 Bogotá
- Fixed portal-config.php path in db.php, me.php, and logout.php — file lives at portal_storage/portal-config.php, not directly at dirname(DOCUMENT_ROOT); database connection now resolves correctly
v4.31 Caracas
- portal/auth.php changed from fail-closed to fail-open on DB unavailability — JWT signature + expiry check now runs even when the database is unreachable, matching me.php behaviour and breaking the /login/ ↔ /portal/dashboard/ redirect loop
- portal/dashboard stats queries now guarded against a null DB connection — dashboard renders cleanly with empty data when database is unavailable
v4.30 Nairobi
- Fixed me.php portal DB path — portal/ is deployed inside the document root, not outside; the dirname() change in v4.28 was incorrect and caused me.php to skip revocation checks, producing an infinite /login/ ↔ /portal/dashboard/ redirect loop
v4.29 Quito
- Removed rate limit from me.php — JWT verification is the correct security layer; rate-limiting a session-check endpoint was blocking legitimate logins
- goToDashboard() now retries up to 3 times on 429 responses instead of showing a connection error
v4.28 Lima
- Fixed redirect loop on /login/ caused by me.php using an incorrect portal DB path — revoked JWTs were treated as valid, causing a /login/ ↔ /portal/dashboard/ redirect loop that exhausted the rate limit
v4.27 Colombo
- OTP codes are now random per request instead of deterministic — re-requesting a code immediately invalidates the old one
- Fixed 10-minute lockout after sign-out: requesting a new code always generates a fresh code usable straight away
- Replay prevention maintained: each code is single-use and expires after 10 minutes
v4.26 Montevideo
- Login flow unified: /login/ is now the only entry point for the portal
- After OTP verification, users are redirected straight to /portal/dashboard/ instead of the static Screen 3 launcher
- Returning users with a valid session are also redirected to /portal/dashboard/ on /login/ page load
- /portal/ no longer shows a login form — authenticated users go to the dashboard, everyone else goes to /login/
- All portal auth guards redirect to /login/ instead of /portal/ on session failure
- Portal sign-out fixed: button now POSTs to the logout API (clears cookie and revokes JWT) before redirecting to /login/
v4.25 Taipei
- Login dashboard redesigned: site navbar and footer are now hidden when the dashboard is active
- CRM and Invoicing app cards are now links to /portal/crm/ and /portal/invoices/
- Removed app descriptions and ACTIVE badges from dashboard app cards
- Time-based greeting added (Morning / Afternoon / Evening)
- Display name reads from localStorage first name; falls back to email local part
- Expandable User Account panel added — save first and last name to localStorage
- Expandable Session history panel added — shows last 3 logins with date and IP
- Sign out row moved to bottom of dashboard with "Logged in as" email label
- Dashboard padding updated to match /changelog and /privacy pages
- /api/auth/me now returns the client IP alongside the email
v4.24 Yerevan
- JWT revocation is now database-backed — revocations survive server restarts and tmp cleanup
- JWT tokens carry a unique jti claim; logout writes to jwt_revocations table and verify_jwt checks it
- OTP replay lockfile key now includes the time window, preventing false denials when the same 6-digit code recurs in a future window
- HTTPS detection replaced: CF-Visitor header used instead of X-Forwarded-Proto across all auth endpoints
- Content-Security-Policy added to all portal HTML pages
- X-Frame-Options and CSP added to all portal JSON API endpoints
- Per-user rate limiting added to all five portal API endpoints (contacts, notes, documents, invoices, subscriptions)
- Email validation added to contact PATCH as well as POST
- Length limits enforced on all contact and invoice text fields
- Date format validated (YYYY-MM-DD) on invoice due_date and subscription dates
- Tax rate bounded to 0–100%; subscription price must be non-negative
- Maximum 100 line items per invoice enforced server-side
- Contact DELETE uses a transaction and cleans up invoices, documents, and files before removing the contact
- Invoice DELETE uses a transaction for safe cascade cleanup
- db.php no longer leaks the internal config path in HTTP 500 responses
- Schema: added jwt_revocations table; invoices.contact_id FK now ON DELETE CASCADE; documents FKs use proper FOREIGN KEY syntax
- Rate-limit cleanup is now probabilistic (1-in-50) instead of running on every request
v4.23 Reykjavik
- Hardened portal security: OTP replay prevention, JWT revocation on logout
- Removed X-Forwarded-For IP fallback — rate limiting now trusts only CF-Connecting-IP or REMOTE_ADDR
- Added HSTS and Referrer-Policy headers to all auth and portal API endpoints
- Portal auth guard is now fail-closed — DB unavailability redirects to login instead of allowing access
- File uploads now enforce extension allowlist, MIME validation, and 20 MB size limit
- Invoice totals are now recalculated server-side from line items; client-submitted values are ignored
- Invoice number query uses a prepared statement to prevent SQL injection
- Notes and documents now require ownership before deletion
- Note content capped at 10,000 characters
- Contact email validated on creation
- GET logout removed — logout now requires POST to prevent CSRF-triggered session clearing
- Stale rate-limit temp files are cleaned up on each request
- New users inserted with a secure random password placeholder instead of an empty string
- Removed portal-config.php from web root; .htaccess blocks direct access to config and header files
v4.22 Kathmandu
- Added JS-driven Loading... ellipsis to changelog Show more button — dots ping-pong (. → .. → ... → ..) for 1.5 s before entries expand
- Show less is now instant with no loader delay
- Improved text contrast in light mode across About, Lab, Contact, and Process sections
v4.21 Tashkent
- Added left-edge fade to services carousel when a previous card exists — toggled via has-prev class on navigation
v4.20 Muscat
- Added right-edge fade mask to services carousel viewport for cleaner card overflow on mobile
v4.19 Doha
- Reduced mouse blob opacity from 0.28 to 0.15 for a subtler ambient glow
v4.18 Beirut
- Fixed body background overriding CSS radial-gradient in light mode — body is now transparent
- Increased gradient opacity for more visible colour pools
- Fixed hero CTA hover on returning visits — skip-loader rule no longer sets transform: none on the button
v4.17 Almaty
- Fixed hero CTA hover animation — replaced transform in fadeUpCTA keyframe with standalone translate property so the forwards fill no longer overrides hover transform
v4.16 Accra
- Fixed light mode hover state on liquid glass buttons — added matching specificity hover rule to override static light mode styles
v4.15 Colombo
- Replaced DOM blob system with pure CSS radial-gradient background in light mode
- Hidden all .page-blob and .blob-layer elements in light mode to eliminate visual noise
v4.14 Tunis
- Reduced light mode background blobs from 15 to 4 for a cleaner, more atmospheric look
- Increased blob blur from 80px to 110px and lowered opacity for subtlety
v4.13 Naypyidaw
- Refined pg-blob portal palette opacities — lowered to 0.18→0.08 range for a subtler ambient effect
v4.12 Casablanca
- Replaced full-page ambient blob layer (pg-blob) mint-teal colours with portal palette — blue, purple, amber, green cycle
- Removed mix-blend-mode: multiply from pg-blob base rule
v4.11 Montevideo
- Replaced light mode page background with flat #e4dfd5 base colour
- Replaced light mode ambient blob palette from mint-teal to portal palette (blue, purple, amber, green cycle) with radial gradients
- Unified mouse blob colour to blue (rgba(0, 71, 255, 0.28)) across both light and dark modes — removed redundant dark mode override
v4.10 Dubai
- Added llms.txt — structured AI-readable studio summary covering profile, services, team, process, reach, and pricing
- Simplified robots.txt — removed AI training bot blocks, all crawlers now allowed
- Updated sitemap.xml lastmod dates to current release date
v4.09 Nicosia
- Updated /changelog subtitle copy — "island" → "city" to match the new city-based versioning scheme
v4.08 Baku
- Unified content width on /privacy to 720px — matches /changelog
v4.07 Tbilisi
- Added logo-only navbar to /changelog and /privacy pages — consistent with /login and /404
- Removed nav links and Login button from all sub-pages (/login, /404, /changelog, /privacy) — navbar shows logo and settings only
- Fixed "← Back to homepage" button on 404 page — press-down hover effect and correct ::after ring, matching all other buttons
v4.06 Reykjavik
- Fixed login page "Send access code" button — reduced backdrop-filter to blur(2px) inside the glass card to prevent double-blur washout in light mode
- Added drop shadow and press-down hover effect to "Send access code" button — consistent with all other glass buttons
- Fixed "← Back to homepage" button hover — now scales down (press) instead of floating up, added missing ::after box-shadow
v4.05 Valletta
- Fixed Hero CTA press effect — cleared entry animation after completion so hover scale transform takes effect
v4.04 Lagos
- Fixed segmented control indicator positioning — subtracted container padding so pill aligns with active option
- Removed saturate filter from segmented indicator in light mode — prevents colour tinting
- Added press-down hover effect to "Let's talk →" service card buttons — consistent with Send and Login
- Fixed "See our work" hover — now scales down like other buttons instead of floating up
v4.03 Cape Town
- Fixed Services carousel — nav buttons, dots, and card-click navigation now initialise reliably on all renders
- Fixed segmented control indicator — uses offsetWidth/offsetLeft instead of getBoundingClientRect so it positions correctly before scroll
- Fixed truncated Work.astro script that caused a build failure
v4.02 Nairobi
- Added Process and Lab links to navbar — all six page sections now accessible from navigation
- Added nav.process and nav.lab i18n keys in EN and CS
v4.01 Montreal
- Reordered navbar links to match page section order — Services now appears before Our Story
- Fixed scroll spy section order to correctly highlight the active nav link
v4.00 Singapore 🏅 Major update
- Updated team member profiles — real names, roles, and bios for Adam Goldmann and Petra Pijáčková
- Renamed "You?" invitation card to "You" with updated role (UI/UX Designer) and rewritten copy
- Fixed "Let's talk." link in You card — inherits text color and weight instead of rendering blue and bold
- Fixed hero CTA button light-mode appearance — removed saturate filter that caused green tint from hero blobs
- Fixed hero CTA animated conic border ring — added @property interpolation, hover and active angle transitions
- Fixed Login button in navbar — disabled backdrop-filter inside navbar stacking context to remove washed-out look
- Fixed checkbox borders in Services — border color now matches body text instead of faint grey
- Updated Work section heading to "Delivered projects. / That we're proud of."
v3.08 Dubrovnik
- Merged Team section into About — two-column layout with statement + bio on the left and liquid glass team cards on the right
- Added second team member card and open "You?" invitation card with dashed border
v3.07 Kyoto
- Added Team section introducing the people behind the studio
- Added Lab section explaining proprietary NN. software usage and AI transparency
v3.06 Lyon
- Added Login button to navbar — pill-styled glass button linking to /login, typography matching nav links
- Fixed active nav link colour — now highlights in blue in both dark and light mode
- Fixed login page primary button in light mode — matched box-shadow and backdrop-filter to site-wide btn-cta-primary recipe
v3.05 Nice
- Fixed production CSS not loading — asset filenames containing @ were rejected by the web server; Vite now sanitises all asset names before deployment
v3.04 Seville
- Fixed Chrome layout break — added overflow-x: hidden to body and main to prevent horizontal overflow from ambient blob elements
v3.03 Bruges
- Removed NN. wordmark from hero — headline stands alone
- Hero headline "wanna use." highlighted in blue
- Added minimalist scroll indicator — bottom-right, animated blue drop line
v3.02 Porto
- Hero redesign — NN. wordmark at 96px full opacity, large h1 headline, single centered CTA
- Removed period from hero headline
- Added dark mode blob layers to all pages — index, changelog, privacy, 404, login
- Page loader redesign — 96px NN. wordmark, dark mode ambient blue blobs on flat #161625 background
- Removed spinning blob animation from page loader
- Removed confetti animation from contact form submit
- Fixed addon checkbox border color in dark mode
v3.01 Valletta
- Redesigned favicon — VAL font glyphs baked as vector paths, blue background, white NN.
- Added full favicon suite — apple-touch-icon, 192px and 512px PNGs, site.webmanifest
- Updated robots.txt with four newer AI training bots (Applebot-Extended, DuckAssistBot, AI2Bot, meta-externalagent)
- Added lastmod dates to all sitemap entries
- Renamed login page title from "Portal" to "Login"
- Applied animated conic border to all interactive buttons — card CTA, carousel nav, social icons, Send, Back, Show more, and login buttons
- Redesigned changelog filter (All / Major / Minor) as a segmented control with sliding glass indicator
v3.00 Florence 🏅 Major update
- Added Navbar and footer to login portal for consistent site-wide navigation
- Fixed login card vertical centering — viewport-height wrapper keeps card centered in all viewports
- Fixed 404 page layout — footer now visible within the viewport via flex: 1 on main and body flex column
- Fixed blob layer with position: fixed to eliminate background color cutoff on sub-pages
- Replaced 404 legacy button with unified pill-style btn-back, repositioned below the card
v2.19 Ljubljana
- Fixed PHP 8 strict typing error in OTP generation — cast modulo result to string for str_pad compatibility
v2.18 Bratislava
- Added passwordless login portal at /login with email and one-time code screens
- Built PHP auth backend with OTP generation, HS256 JWT sessions, and rate limiting
- Wired login page to real PHP endpoints with page-load session check and logout redirect
- Styled login cards and buttons with the liquid glass recipe
- Placed "Back to homepage" pill button centered below the card
v2.17 Geneva
- Reduced light-mode background blob opacity and spread for less washed-out appearance
- Normalized glass card backdrop-filter to saturate(150%) brightness(1.02) across all components
- Added 6 ambient blue blobs for depth in light mode, toggled by Control Centre blob switch
- Removed outer drop shadow from all light-mode glass cards — inset shimmer and conic border ring provide card definition
- Fixed four Navbar ::after conic rings from calc() overhang to inset: 0 to prevent corner artifacts
- Fixed invisible text in Services cards in light mode with explicit rgba overrides
v2.16 Vilnius
- Upgraded Services option groups to sliding segmented controls
v2.15 Warsaw
- Added Process section with interactive step selector and sticky glass detail panel
v2.14 Riga
- Added Stats section with four key metrics and blue-accented number display
v2.13 Tallinn
- Added Services section with interactive pricing configurator and horizontal card carousel
v2.12 Reykjavik
- Added Manifesto section with reveal-on-hover typographic treatment
v2.11 Budapest
- Added Selected Work section — editorial table layout with glass type pills, hover slide interaction, and bilingual project descriptions
v2.10 Helsinki
- Redesigned About section — bold typographic statement with sticky positioning replaces plain section heading; bio paragraphs move to right column
v2.09 Athens
- Redesigned Contact section left column — replaced plain paragraph with bold typographic statement for stronger visual impact
v2.08 Edinburgh
- Fixed Send button text color — white in dark mode, dark in light mode, matching the glass surface metaphor
v2.07 Zurich
- Unified contact form inputs with glass design system — translucent backgrounds, warm border, consistent radius
- Replaced Send button and changelog Show more/less buttons with liquid glass pill recipe
- Removed Roboto font violations from 404 page — Inter Variable is now the only body font
- Cleaned orphaned CSS variables from global.css
v2.06 Rome
- Replaced all Roboto font references in 404.astro with Inter Variable
- Moved inline transition-delay styles in About.astro to CSS nth-child rules
- Moved inline font-weight on contact intro span to CSS rule
- Fixed ::after conic ring clipping in Contact form and Changelog cards (inset: 0)
- Updated Changelog card light mode override to beige glass recipe with backdrop-filter
- Fixed timeline dot border color in light mode (rgba(17,17,17,0.10))
- Updated Hero NN. letter and line color to rgba(17,17,17,0.85) in light mode
- Removed unused --shadow-glass and --shadow-glass-hover CSS variables
- Removed dead dark mode CSS rules for legacy sections (tag, role-desc, exp-summary, exp-company, promo-divider, strava-card, strava-divider, pill)
v2.05 Dublin
- Replaced light mode background with organic diagonal radial gradient (blue corners, cool cream/beige mid-section)
- Introduced --beige (#EDE8DF) as a new CSS variable for the cool cream/beige accent tone
- Updated --border to #d8d4cd (warm-neutral beige-grey) for consistency with new background
- Updated --black to #111111 and replaced all rgba(1,9,19,...) text overrides with rgba(17,17,17,...)
- Reduced glass card light mode opacity to 0.55 max and shifted tint toward beige anchor to preserve glass effect
v2.04 Copenhagen
- Replaced light mode background with organic diagonal-slash radial gradient
- Fixed light mode text color from cold blue-tinted (#010913) to warm neutral (#111111)
- Reduced glass card light mode opacity to preserve transparency against new background
- Updated CSS variable --black to #111111
v2.03 Stockholm
- Replaced warm cream/beige background with pure white base and soft blue corner whispers (7–8% opacity radial gradients)
- Updated --black root variable from #0a0a0a to #111111 for pure neutral near-black
- Updated dark mode variable scale: --black 0.88, --muted 0.48, --text-body 0.70 for cleaner contrast hierarchy
- Replaced all rgba(1,9,19,...) light mode text with rgba(17,17,17,...) across Hero, About, Contact, Navbar, and global overrides
- Updated glass card light mode recipe to 0.30/0.55/0.30 opacity + blur(18px) saturate(180%) brightness(1.03) on contact form, hero CTA, navbar, and Control Centre panel
- Updated CLAUDE.md Section 5 with new color tokens, dark mode overrides, light mode opacity scale, and glass card light recipe
v2.02 Milan
- Applied canonical liquid glass recipe to Contact form, Hero CTA, and changelog cards — unified backdrop-filter, gradient, and box-shadow across all surfaces
- Removed ::before inner gloss (mix-blend-mode: screen) from all glass surfaces — eliminated harsh white diagonal streak in dark mode
- Removed Work (Projects) and Services sections from the site and navbar
- Removed glass card placeholder from Our Story section
- Deep code audit: deleted orphaned component files, data files, dead i18n keys, and unused CSS rules
v2.01 London
- Removed scroll indicator from hero scroll-hint bubble — glass pill remains
- Renamed "About" section to "Our Story" (EN: Our Story / CS: Náš příběh)
- Removed all cards from About section — single empty glass card placeholder added on right
- Applied canonical dark-mode glass card recipe to About card (blur(44px) saturate(180%) brightness(1.65), unified border/shadow)
- Added light-mode frosted glass override for About card
- Unified About section text to rgba(1,9,19,0.85) in light mode via var(--text-body)
v2.00 Paris 🏅 Major update
- Switched default theme to light mode
- Replaced Roboto with Inter Variable (self-hosted via @fontsource-variable/inter)
- Added atmospheric light mode gradient background (white top-left → deep blue bottom-right, fixed attachment)
- Unified all light mode text to #010913 at 0.85 opacity site-wide
- Redesigned language picker as a sliding segmented control with a liquid glass indicator pill
- Redesigned Control Centre toggles as On/Off segmented controls matching the language picker
- Removed dividers from the Control Centre settings panel
- Applied full liquid glass button recipe to all segmented indicators — ::before screen-blend gloss, ::after conic border ring, unified box-shadow
v1.08 Amsterdam
- Removed hero section background — page gradient now flows uniformly through all sections
- Removed overflow:hidden from hero — blobs are no longer clipped at the section boundary
- Extended hero blob physics to allow 50% drift below hero into the About section
- Increased ambient blob density (multiplier 1.5→2.5, max 6/12→10/18) for full-page coverage
- Applied canonical glass recipe (blur(44px) saturate(180%) brightness(1.65)) to all section cards including Projects flip-front
- Updated glass card shadow to unified inset highlight pattern across all cards
- Aligned text opacity scale across all sections — primary rgba(255,255,255,0.85), body 0.75, muted 0.65
- Fixed --radius-card token to 18px (was incorrectly set to 20px)
- Fixed --radius-btn token to 9999px for action/icon buttons; contact form inputs restored to 10px
- Fixed changelog badge border-radius to pill shape (was inheriting card radius)
v1.07 Barcelona
- Converted language picker buttons to frosted glass cards (18px radius, unified glass recipe)
- Restyled CTA button as pill shape (border-radius: 9999px) to match design system convention for action buttons
- Removed dark mode toggle from Control Centre — site always renders in dark mode
- Replaced spherical CSS blob divs with organic SVG path blobs for a more natural, abstract look
- Replaced CSS keyframe blob drift with JS physics simulation — blobs wander slowly and elastically collide with realistic momentum transfer
v1.06 Madrid
- Fixed VAL font not rendering on first load by changing font-display from optional to block
- Added preload hint for VAL.otf to ensure immediate fetch on page load
- Consolidated VAL @font-face declaration into global.css, removing duplicates from Navbar, Hero, and Footer
v1.05 Lisbon
- Self-hosted all fonts locally — Roboto (latin + latin-ext) and Material Symbols Outlined downloaded and served from the same origin
- Removed unused Anton and Boldonse Google Fonts imports
- Added preload hints for Roboto subsets to eliminate render-blocking font requests
- Updated privacy policy to reflect no third-party font services are used
v1.04 Prague
- Added Cache-Control immutable headers for all hashed static assets to prevent 503 errors on concurrent CSS loads
v1.03 Vienna
- Redesigned hero with polar navy gradient background and animated bubble blobs
- Converted navbar to floating glass card with frosted glass effect
- Moved settings panel outside navbar to fix frosted glass stacking context
- Added wave and vibration interaction to CREATIVE DEVELOPER STUDIO letters
- Restyled CTA button and scroll hint as frosted glass cards
- Unified glass card border-radius to 18px across all components
- Unified primary text opacity to 0.85 across navbar and hero
- Updated hero tagline copy
v1.02 Berlin
- Increased shadow depth and intensity across all cards and components
v1.01 Oslo
- Fixed page jumping on refresh by disabling browser scroll restoration
- Fixed invisible hero text on revisits (skip-loader animation bypass)
- Restored frosted glass effect on navbar when scrolled past hero
- Loading screen polish: larger text, dynamic bar width, faster dismiss
- Auto-language detection via navigator.languages (Czech browsers default to CS)
v1.00 Tokyo 🏅 Major update
- Initial launch of studionn.cz
- Hero section with Studio NN. branding and typewriter tagline
- About section with studio overview and stats
- Projects section with flip cards (Kamenictví Petržel, adamgoldmann.cz, APEX., studionn.cz)
- Services section with 4 service cards
- Contact section with form and social links
- Bilingual support (EN/CS)
- Dark mode with system preference detection
- Control Centre: Ambient Blobs, Mouse Glow, Animations, Dark Mode toggles
- Scroll reveal animations and typewriter effect
- Custom 404 page (Garmin GPS device design)
- Privacy policy page
- robots.txt blocking AI training bots