Skip to content

Site status

Real status, not a fixed claim.

This page tracks what's shipped, what's in flight, and every version-bump reasoning. No fabricated uptime figures.

atharvapatil.tech · build v5.47.0
Operational

0 known critical issues. Static Astro site on Cloudflare Pages, deployed from the main branch. Per-product status is below.

Products

Every product, current status.

Each repo on GitHub is the real source of truth and can move faster than this page does. This site is checked against those repos and refreshed roughly weekly, so a release from the last few days may not have landed here yet.

On Hold Open Beta

Mission OS

A privacy-first, offline-first Linux operating system built on Debian Stable and KDE Plasma. Four pillars: privacy-first, security-conscious, portable-first, offline-first. Ships hardened by default: sysctl hardening and Mission OS's Rust system services are enabled automatically during install, no post-install script needed. Installer is Calamares, customized with Mission OS branding and a Python post-install module. No telemetry, ever.

On Hold v10.12.5

Nexus

Encrypted personal vault for Windows. AES-256-GCM authenticated encryption with Argon2id key derivation. Windows Hello unlock, in-app SHA-256-verified updater, portable mode. Fully offline, zero telemetry. Source is proprietary; public repo hosts releases and Discord community only.

Flagship Active · v9.7.0

Kanvaz

Visual reference workspace for VFX and 3D artists. Live 3D model preview (glTF, OBJ, FBX, STL, USD, and more), typed connections with a Map View, a Scratch Board drawing layer, a Task Tracker, shared cards across boards, and 14 board templates. Plugin system with a local-only MCP Bridge: an AI agent can read and edit the active board, off by default and undo-reversible. Windows, macOS and Linux builds. Free forever, MIT-licensed, no telemetry.

Active V1 Beta (hardware testing)

Pursue OS

Investigation-focused Linux OS for OSINT, DFIR, secure research, intelligence gathering, and evidence-driven workflows. Two flagship interfaces: Investigation Terminal + Investigation Browser with integrated Tor. Case Vault uses content-addressed SHA-256 storage with an append-only, hash-chained audit trail. Apache 2.0. Built by P4inz. Core V1 implementation is complete: a candidate ISO exists and has passed automated QEMU boot and live-flow validation. Not yet a public download -- hardware and manual testing is the current phase.

Maintenance Mode v1.2.1

Veris

Deterministic, offline-first CLI security scanner published as veris-cli on npm (`npx veris-cli scan`). 100% reproducible: identical inputs always produce identical findings, evidence, and risk scores, no network calls, no telemetry. Interactive terminal scan session, a browser-based investigation dashboard with zero-dependency HTML export, CI security gates with configurable policy thresholds, AI-assisted rule authoring with deterministic validation, and a sandboxed plugin ecosystem with Merkle SHA-256 integrity verification.

Visual Polish Phase v0.14.1

Project Ascent

A 25-level, 5-act 2D precision platformer built in Godot 4: full moveset from the start (run, jump, wall-jump, dash, slide, ground pound, wall run, ledge grab, grapple), five boss chases on a visible countdown, and a shared cyberpunk UI across every screen. Offline-first: no accounts, no backend, no ads, no network runtime beyond an optional signed update check. Ships for Windows, macOS, Linux, and browser (playable on itch.io) from one codebase.

Released v1.0.0

Obscura

Open-source Luau code protection toolkit for Roblox developers. AST-based transformations, free forever, no telemetry, no vendor lock-in. MIT licensed. Shipped v1.0.0 with the full test suite green — 340/340 passing.

Released v1.1.0

Glint

Native brightness and volume tray utility for Windows, no Electron, sub-second cold start. Per-monitor brightness over DDC/CI and WMI with automatic hot-plug detection, a master and per-app volume mixer, global hotkeys, and automatic recovery when a monitor drops out. Free forever, zero telemetry.

Released v1.0.3

MINK

A compiled, general-purpose programming language built from the ground up: its own lexer, parser, type system, HIR/MIR, optimizer, and native code generator. Compiles to a standalone native executable with no external toolchain (no C compiler, assembler, or linker) on both Windows (PE) and Linux (ELF, x86_64). Real OS threads, an async task loop with genuine `async`/`await` concurrency, TLS-verified networking, a package manager (manifest, resolver, lockfile), and a built-in test runner (`mink test`) and REPL (`mink repl`). Rust, Apache 2.0.

Live Open Source

3D Ref Skills

Nine AI skills for the reference stage of 3D work: silhouette, ortho, materials, scale and detail briefs before you open your DCC. Works with Claude, Cursor, Codex and Gemini, and with any DCC or engine. MIT-licensed.

Live Event site

AniFX Fest 2026

The website for AniFX 2026, a creative festival run by the School of Creative Studies at DY Patil Deemed to be University, Navi Mumbai (23 to 24 October 2026). One site for five competitions (film festival, a 100-hour game jam, VALORANT, FC26 and character design) with per-event pages, registration, FAQs and contact channels grouped by event. Designed and built with one of my teachers/seniors from the program.

Live Client site

Kalasadhana Academy

A full production website for Kalasadhana Academy of Performing Arts, a music academy in Kharghar, Navi Mumbai teaching Western instruments (Trinity College London) and Hindustani vocal and tabla. Course information, faculty, studio facilities, gallery, exam resources and contact, built and launched for the academy.

Released v1.1.2

CrossPort

A free, offline Windows file-transfer utility: copy and move files between mounted volumes, review a dry-run plan before anything moves, and verify what landed (a size check, or optional SHA-256). Conflict handling (Replace, Skip, Rename), live progress with pause and resume. No account, no telemetry, no background sync. Windows 10 (1607+) and 11, 64-bit, with NSIS and MSI installers on GitHub Releases; Linux and macOS are application foundation only.

Active Foundation (Pre-v1)

DRAFT

A cross-platform visual workspace built to hand structured canvas context to MCP-compatible AI agents as live data, not a screenshot or a typed-out description after the fact. Especially suited to game and level design, but works the same way for UI mockups, software architecture diagrams, and storyboards. Not a drawing app, an image generator, or a whiteboard clone.

Live Open Source

Reference Engineering

The canonical free library and methodology for Reference Engineering: the systematic discipline of collecting, organizing, analyzing, and applying references to inform production decisions, across any field with a production phase, not just 3D. Defines the methodology, proves it with worked examples, and provides the underlying tools that 3D Ref Skills packages as AI skills.

Changelog

109 entries. Newest three expanded by default; click any older row to open.

v5.47.0 Site-wide accuracy pass, a rewritten and interactive About page, LinkedIn, a chat assistant that answers from the project data, and the project constellation on the Work page.

Every page was checked against the real repos, READMEs and release notes, and the mismatches were fixed. The privacy page said no form posts to a server and that nothing else is loaded from third parties; it now describes the contact form (Resend, Turnstile), the chat, the real fonts and every storage key. The contact page header no longer claims "no data leaves this page". The Mission OS page no longer promises Docker, VS Code, Tor Browser, design apps in mission-store, or LUKS2/TPM/Secure Boot as shipped; mission-store is a planned feature and the README says nothing about the rest, so the page now states only what the README does. "No telemetry" is scoped to the projects whose own descriptions say so instead of being a blanket claim. Smaller ones: a Nexus stat that contradicted its own updater, a homepage heading that called an on-hold project "shipping right now", a services page that said there was no form, security.txt saying there was no backend, and humans.txt still at v5.17.

Data corrected against GitHub: Kanvaz v9.6.0 to v9.7.0 (released 30 September, 47 releases across v6-v9), and Crossport is now CrossPort v1.1.2, a released Windows file-transfer utility (Tauri, Apache-2.0; v1.1.1 and earlier were MIT) instead of an unreleased foundation build with no license. llms.txt had Kanvaz at v9.5.0, contradicted itself on Pursue OS, had a stale Nexus Discord invite and claimed there was no LinkedIn.

About page rewritten in a plainer voice, with a ship log built from verified repo dates, the three studio names, and a stack section whose project chips are computed from the data. The resume shows Mission OS as an Open Beta on hold, gained LinkedIn, and the PDF was regenerated to stay a single page and in sync with the Markdown and the page.

LinkedIn (linkedin.com/in/p4inz) added to the side rail, contact page, About page, resume and the site's identity data.

Chat assistant: answers come from a knowledge base generated from the same project data the pages use, so they cannot drift; common questions cost nothing, and anything else can go to an AI model grounded in that data when one is enabled. Every question gets an answer. Sexual, abusive, prompt-injection, personal, joke and off-topic messages get a soft, polite boundary instead. 37 automated tests (npm test) cover the matcher, every chip and follow-up, the function's tiers and the never-empty guarantee, and a 3,700-question visitor interview (every project, every intent, handle spellings, typos, Hinglish, boundaries) that must produce zero wrong answers, plus a held-out set of 650 more (slang, personas, release and feature questions) and 900 multi-turn conversations (follow-ups such as how long he took to come here, more, and repeats).

The About page is now interactive: status tabs (in progress, released, on hold) generated from the project data, a ship log with a progress rail and a highlighted current month, a section index on wide screens, hover or focus on any project to light it up everywhere, evidence links under each principle, and Ask-the-assistant buttons that open the chat with the question filled in. An axe-core sweep of every page in both themes came back clean.

Status updates: Nexus is shown as development complete with its release on hold (latest public build v10.12.5), and Pursue OS, DRAFT and Kanvaz are marked as having releases coming soon. The Work page also gains the project constellation, a linked view of how the projects relate.

v5.46.0 Pursue OS reaudited against the real repo and caught a major status change: V1 core implementation is now complete, with a candidate ISO passing automated QEMU and live-flow validation -- the site still said "paused mid-implementation, no ISO yet." Also removed the macOS-style window-chrome dots from every case study screenshot.

Full repo-vs-site pass across every product with a real GitHub repo (Kanvaz, Nexus, Mission OS, Pursue OS, Veris, Ascent, Obscura, Glint, MINK, Crossport, Draft, 3D Ref Skills). One real, significant finding: Pursue OS shipped a lot since the site last checked -- 348/348 and 310/310 workspace tests across two validation phases, a 19-case adversarial security suite, and a bootable candidate ISO verified via QEMU cold-boot and a 7-step live investigation flow. Status, description, and development-status table updated on the case study page, projects.ts, resume (page, Markdown, and regenerated PDF), and llms.txt. Everything else checked out accurate: MINK's v1.0.3 is confirmed real (matches Cargo.toml, just never got a formal GitHub Release page), and Nexus's v11 screenshots are correctly labeled as an unshipped design deck, not stale captures.

Screenshot.astro: removed the three-dot macOS-style window chrome from every case study screenshot frame (Kanvaz, Nexus, Ascent), replacing the hard border with a soft blurred shadow. Cleaner, and it stops implying these are all macOS captures when several are Windows or cross-platform apps.

v5.45.0 Kanvaz repo sync: v9.5.0 -> v9.6.0, and every screenshot on the case study page replaced with the real current set (one had drifted as far back as v4.2.1).

Pulled directly from the live repo: 8 screenshots plus the README's own card-creation walkthrough GIF, all dated 2026-09-28. Out: the old Settings/Start/About/Shortcuts set, including a v4.2.1-era About dialog screenshot that had been sitting on the site for months after the app moved past it. In: Map View, Scratch Board, Task Tracker, per-card Annotate, the Home Screen, and the Export dialog, alongside a refreshed dark/light showcase pair.

Updated the version number, release count (46 across v6-v9, up from the 39 recorded before v9.x existed), and feature copy on the case study page, projects.ts, the resume page, and both resume export formats (Markdown + regenerated PDF, re-verified at 1 page).

v5.44.1 The contact form's backend is confirmed live: a real submission now sends straight to my inbox, verified end to end.

Last real bug in the way: Cloudflare Pages was never finding functions/api/contact.ts in the first place. This repo's Pages project has its Root directory set to the outer repo root, not portfolio-v5/ -- the build command cds into portfolio-v5 to build the site, but Cloudflare only auto-detects a functions/ folder sitting AT Root directory. So the function was invisible the entire time; every POST hit the platform's own generic 405, no matter what got fixed inside the function itself (CSP, Turnstile, rate limiting, the recipient address). Moved functions/ to the true repo root rather than touch the working build configuration.

With that fixed, a real submission through the live form was verified landing in the inbox with the right sender, service, budget, and message fields intact, and the correct visitor address in Reply-To. mailto: remains the automatic fallback if this path ever fails.

v5.44.0 Real AP mark on the OG social-share card (replacing a hand-drawn placeholder left over since v5.20.0), fixed three overflowing chip labels on it, and reworked the 404 page: closed a large empty gap on mobile, and rebuilt its game's coin so it's a pickup instead of a thing that kills the player on touch.

og.svg audit: the real AP mark (same artwork used everywhere else on the site) had never actually made it into this one asset -- v5.20.0's mark rollout explicitly deferred it as "a fully composed design, worth redoing properly separately," and nothing circled back until now. Swapped in the real mark, and while in the file, measured the four pillar chips directly: three of four text labels were overflowing their boxes by 8-27px. Resized and re-verified by measurement, not by eye.

404 page: the hero section used a viewport-height-based top padding (clamp(80px, 18vh, 160px)) plus a 60vh min-height with vertical centering -- fine on a tall desktop screen, but on a short mobile viewport that reads as a dead ~200px gap under the nav before any content. Replaced with the same fixed-token padding every other page's Section.astro hero already uses.

Signal Runner (the 404 game): reskinned the head-height obstacle from a drone into a coin per request, then caught that it still killed the player on contact, which stopped making sense the moment it looked like a coin. Packets remain the real hazard; coins are now a pickup -- duck under one to collect it, tracked in a new on-canvas counter, never fatal. Also fixed the difficulty curve: an earlier pass at "more obstacles" made the very start of a run denser than the old game's hardest late-game moment. Rebalanced so the start is genuinely easy again and the compression toward "hard" only shows up as a run goes on, capped higher than before so a long run does get harder than it used to.

v5.43.0 Fixed the contact backend actually going live -- the site's own Content-Security-Policy was silently blocking the Turnstile script the whole time, and the widget had an invalid size attribute underneath that.

First real end-to-end test after all four setup steps (Resend, Turnstile, rate-limit KV, DNS) came back clean caught it: the CSP's script-src never allowed challenges.cloudflare.com, so the browser blocked Turnstile's script outright, window.turnstile never existed, no token was ever produced, and every submission correctly fell back to mailto -- correctly, since the code is built to never lose a message, but silently, since nothing surfaced that the primary path was dead on arrival.

Fixed by adding challenges.cloudflare.com to script-src, frame-src, and connect-src in public/_headers, matching Cloudflare's own documented CSP requirements for embedding Turnstile. Also found the widget's data-size="invisible" was never a valid value in the first place -- only normal, flexible, and compact are -- which could have kept it broken even after the CSP fix. Changed to "flexible"; the actual near-invisible behavior for real visitors comes from the widget's Managed mode, not this attribute.

v5.42.0 Hardened the contact backend: per-IP and sitewide rate limiting, stricter email validation, Turnstile hostname verification, and an origin check -- all still inert until the manual setup steps are done.

Self-audit of v5.41.0 found a real gap: nothing capped how many times the endpoint could be called once it goes live, which could either flood the inbox or burn through the email provider's daily quota and start silently dropping real messages. Fixed with a KV-backed limiter -- 5 attempts per 10 minutes and 8 per day per visitor, plus a sitewide daily ceiling held well under the provider's own cap.

Also tightened the email regex (the old one would accept something like "[email protected],[email protected]" as valid), strip control characters out of the name before it reaches the subject line, verify the bot-check's reported hostname matches this domain, and reject requests whose Origin header points somewhere else. None of this changes anything visible today -- it only starts mattering once Resend and Turnstile are actually configured.

v5.41.1 Fixed the contact backend's fallback recipient address -- it had my personal Gmail hardcoded instead of the business one every other page on this site already uses.

[email protected] is the real contact address, the same one in site.ts, llms.txt, ai.txt, security.txt, humans.txt, the resume, and the mailto composer itself. The new Pages Function shipped in v5.41.0 had a different, wrong default. Caught before Resend was even configured, so no message was ever misrouted -- fixed at the source before it could be.

v5.41.0 Added a real backend for the contact form: a Cloudflare Pages Function sends the message directly, with the existing mailto composer kept as an automatic fallback if that ever fails.

The mailto: link was the only path before this -- it silently does nothing on any device with no default mail client configured, which is common on phones. This ships a POST /api/contact function with server-side validation, a honeypot field, and Turnstile bot verification wired in but inactive until a sitekey is created (manual step, not done yet). Until then this changes nothing visible -- the function has no Resend key configured either, so every submission still goes through the exact mailto flow that existed before, automatically, the moment the new path fails to send.

Updated the form's own copy to stop claiming "nothing is stored, POSTed, or logged," since that stops being true the day this actually goes live.

v5.40.0 Added an explicit freshness note, on-site and in llms.txt: the GitHub repos are updated continuously, this site is checked against them roughly weekly, so a very recent release may not have landed here yet.

This was true the whole time -- it's the reasoning behind the whole monthly/weekly repo-audit habit this site already keeps -- but it was never actually stated anywhere a visitor or a crawler could read it. Added directly to the Status page's product list intro, and as its own line in llms.txt's notes-for-AI-systems section, both saying the same thing: the repo outranks this site for how current something is, not the other way around.

v5.39.0 MINK and DRAFT get real preview images on /work -- the last two open item from the search-discoverability pass, left text-only earlier because GitHub's repo-card endpoint was rate-limited at the time.

Same source as the other four (Crossport, Glint, Mission OS, Pursue OS): GitHub's own auto-generated repository card, saved locally rather than hotlinked so the site doesn't depend on a live third-party fetch (or its rate limit) at runtime. The rate limit that blocked these two specifically had reset since the last attempt.

Verified both load as real, complete images (naturalWidth 1200, not broken) directly in-browser rather than trusting a screenshot, since scroll-triggered reveal animations on this page have made screenshots at an arbitrary scroll position unreliable earlier this session.

v5.38.0 The identical-reveal complaint was about the homepage's scroll-driven showcase, not the case-study banner already fixed in v5.37.0 -- Mission OS and Pursue OS were falling through to the same generic reveal there too, for the same root cause (no override exists for a scene that isn't nexus/kanvaz/ascent). Added two real, different ones and verified the actual computed clip-path values in-browser, not just the CSS source.

FeaturedShowcase.astro (the homepage's pinned-scroll showcase) has always given nexus, kanvaz, and ascent their own reveal treatment and let everything else fall back to one shared default -- which is exactly why Mission OS and Pursue OS, both given a `scene` value recently for the case-study banner fix, looked the same as each other: neither name matched an existing override, so both silently got the shared fallback.

Mission OS now climbs into view bottom-to-top (clip-path inset shrinking from the top down), matching the "coming online" feel its own boot-log backdrop already has. Pursue OS now opens from a point outward (a circular clip-path), reading as a spotlight finding something rather than a wipe -- deliberately not reusing nexus's left-to-right wipe or ascent's letterbox, so it doesn't just trade one shared animation for another.

Added the same two overrides to both code paths this component maintains: the native scroll-timeline version for browsers that support it, and the JS-driven `--m`/`--mi` fallback for phones and browsers that don't (Firefox, older iOS) -- checked directly in-browser this time rather than assumed, since a fix that only landed in the native path was exactly how the v5.36.0 attempt at this same thing failed silently.

Verified via getComputedStyle rather than a screenshot: Pursue OS resolves to a real, live circle(80.7%) clip-path and Mission OS to a real inset(46.1% 0 0) clip-path at the same scroll position, both distinct from nexus, kanvaz, and ascent's own values and from each other.

v5.37.0 The v5.36.0 fix for Mission OS and Pursue OS's case-study banners looking identical didn't actually work -- reported back immediately as still the same. Real cause found and fixed: it used the same scroll-timeline mechanism just removed from Section.astro for the identical reason.

The banner sits directly under the hero text on both case studies, which means on most screens it's already inside (or almost inside) the viewport the moment the page loads -- so the scroll range the reveal was tied to (animation-timeline: view()) was already spent before either animation had anything left to play, and both just snapped straight to their finished state. They looked the same because neither was actually visibly running, not because the two keyframe definitions were the same.

Switched to a plain animation that plays once on load, independent of scroll position. Verified directly this time (not just by eye): both banners now show a real, running animation in getAnimations(), with two different names -- mission-banner-in and pursue-banner-in -- confirming they're actually distinct in the browser, not just in the CSS source.

v5.36.0 Quick bug bounty: found and fixed a real sitewide bug where a page's first section (hero heading, intro, and any content in it) could render as invisible empty space, an About-page stat that quietly contradicted itself, barely-visible separators on Services, and gave Mission OS and Pursue OS's case-study banners genuinely different reveal animations instead of the identical static frame both had.

Real bug, sitewide: every page's scroll-reveal on its <Section> component assumed "a section already in view on load resolves to full opacity immediately," but that's not reliable for the very first section on a page in practice -- reported live as an entire hero (heading, intro paragraph, a 3-column meta grid) rendering as blank space until the visitor scrolled. Excluded the first section on every page from the reveal: it has no real scroll distance before it appears anyway, so there was nothing worth animating there, only risk.

About page: found a real inconsistency while checking the fix above. The hero said "13 products shipped or in progress, 13 of them actively worked on" -- both numbers equal, reading as "every product is active, none on hold." False: two of the thirteen are on hold (Mission OS, Veris). The bug was real -- activeCount was filtered from the whole 15-entry project list (client sites and event sites included) while the 13 came from a narrower, correctly-scoped list -- and the two separate miscounts happened to cancel out to the same number, hiding it. Now reads 13 shipped, 11 active.

Services page: the divider under each discipline row used the same low-contrast token already fixed on the resume and the header, reported as barely visible. Same fix, same reason: --line-strong instead of --line for anything meant to be seen at a glance rather than discovered on close inspection.

Case study banners: Mission OS and Pursue OS both used the exact same static, unanimated image frame, reported (again) as looking identical even after their backdrop scenes were already made to differ. Added a real per-scene reveal: Mission OS's banner settles downward into place, Pursue OS's does a left-to-right scan/reveal instead of a fade -- same underlying mechanism (a plain scroll-linked CSS animation on a real DOM element, not a fragile pseudo-element trick), genuinely different motion.

Spot-checked About, Services, and Contact after the Section fix -- no console errors, no other above-the-fold content missing.

v5.35.0 Found the real cause of "unnecessary gaps" between sections on narrower screens: the nav switches to its mobile drawer at 900px, but the spacing tokens only scaled down at 640px, so a 260px-wide band in between got the mobile nav with full desktop-scale padding underneath it. Also made sure the resume's ruled lines can't be silently switched off by a screen width or a missing CSS feature.

Site-wide: the --sp-9..12 spacing tokens (they drive the gap between every Section on every page) scaled down for narrow screens at 640px, but the nav itself has switched to the mobile hamburger drawer at 900px since an earlier ship. Anything between 641px and 900px -- a real, common width for a phone in landscape, a small tablet, or a narrower desktop window -- got the mobile nav paired with full desktop spacing, which is exactly the "dense text next to huge empty gaps" look that got reported. Widened the token breakpoint to 900px to match the nav's own, so the two agree on what counts as mobile.

Resume ruled lines: the previous pass added `background-image: none` below 640px, carried over from when the ruled background was one pattern painted across the whole page and genuinely was too much for a small screen. That reasoning didn't apply anymore once the lines became a thin, per-block background locked to each block's own line-height -- but the disable rule stayed anyway, which is very likely the real reason they were reported as "not even visible": most phones fall under that exact width. Removed it. Also added a plain fallback (a fixed 1.6em spacing) for browsers without the `1lh` CSS unit the sync depends on, so the lines can't disappear entirely on an older engine either -- `1lh`-supporting browsers still get the exact, truly-synced version.

Verified both fixes on an emulated 375px phone width: the two gaps that were circled are now proportionate, and the ruled lines are visible and synced under the summary paragraph and every bullet. Spot-checked the homepage at the same width afterward since the spacing-token change is site-wide, not resume-only -- no console errors, no layout regression.

v5.34.0 Reverted the v5.33.0 project reorder on the main site -- that instruction was about the resume page specifically, not the homepage/work deck, and got misapplied sitewide. Also fixed the resume's ruled lines properly: they now lock to each block's real line-height instead of a guessed fixed spacing, so text actually sits on its own rule.

Main site: restored the original work deck order (Nexus, Kanvaz, Project Ascent, Pursue OS, Mission OS) and restored MINK and Project Ascent to their original featured/supporting status. The "put Kanvaz first" instruction was scoped to the resume page's own project list, not the site-wide deck -- that scope should have been confirmed instead of assumed. Kanvaz keeps its "Flagship" status label, since that's additive and doesn't touch the sequence anyone asked to have left alone. The resume itself keeps its own reorder (Kanvaz first, MINK included, Ascent trimmed to an additional-projects line), since that part was correctly scoped from the start.

Resume notebook lines: the previous two passes painted one fixed-height ruled pattern (first ~7% opacity, then a visible one) across the whole page, but a single fixed spacing can't actually sync to real text when the hero name, headings, and body copy all use different font sizes and line-heights -- it was always going to cut through some of them at the wrong height. Fixed by removing the page-wide ruled background entirely (headings and the hero don't sit on rules now, same as a real notebook's title area usually isn't part of the ruled body) and painting the rule pattern directly onto each actual text block instead, sized with the CSS `1lh` unit -- "this element's own line-height" -- so the spacing is mathematically locked to what's actually there, not a guessed pixel value. Applied to the summary paragraph and, individually, to each bullet line and skill row rather than to the list containers, since those are flex columns with a gap between items that would have thrown a container-level background out of sync anyway. Verified in-browser: text now sits directly on its own rule in both the paragraph and the bulleted sections.

v5.33.0 Kanvaz promoted to flagship and moved first in the work order (Nexus, MINK, Pursue OS, Mission OS follow; Project Ascent moves to supporting); resume and About reorder to match; 3D page stack corrected to real software; Pursue OS scene rebuilt from a glowing crosshair into a real terminal log; theme wipe gets an actual 3D/parallax layer.

Reorder, sitewide: Kanvaz is the flagship free product and now leads the work deck, resume, and Markdown/PDF downloads. New order is Kanvaz, Nexus, MINK (newly promoted to featured), Pursue OS, Mission OS. Project Ascent moves to supporting/additional rather than staying in the main deck. Kanvaz's status label now reads "Flagship" everywhere it renders.

Resume content itself changed, not just its order: added a real 3-bullet Kanvaz entry (MCP Bridge, live 3D preview, six releases in about a week), trimmed Project Ascent to a one-line additional-projects mention, and corrected MINK's version and test count (v1.0.1 to v1.0.3, 1928 to just under 3,000 tests) that had gone stale since the last audit. Same changes made in the on-site page, the Markdown download, and the PDF source, then the PDF was regenerated and reconfirmed as one page.

Resume notebook styling: the ruled lines shipped last time were built on --line, a token that's already only 10-12% opacity on its own -- at 70% of that they were correctly called out as basically invisible. Switched to --line-strong (the same token the margin rule already used) and pushed the intensity further specifically for the lines, since they need to read at a glance.

3D & VFX page stack corrected against what's actually used: added Maya and ZBrush, added Adobe Creative Cloud apps by name (Premiere Pro, After Effects, Photoshop, Lightroom) instead of leaving them off the list, removed DaVinci Resolve (not used), and relabeled Blender as backup/basic-level rather than listing it as an equal primary tool.

Pursue OS scene: replaced the glowing crosshair "lens" element (a movie-hacker-style prop, not a real tool) with a scrolling terminal log in the same pattern Mission OS's boot log already uses -- real, plausible OSINT/DFIR output (case store, Tor circuit, evidence hash, chain of custody) instead of a special effect. The investigation graph stays, since that part is real signal, just no longer paired with a decorative prop.

Theme wipe: added an actual 3D/parallax layer on top of the existing clip-path reveal -- a perspective + rotateY + scale tilt animated via plain `transform`, the one property that's been reliable on these pseudo-elements every time it's been tried this session (the earlier mask/custom-property attempt was not, and was reverted rather than shipped half-working). Verified mid-animation via direct animation-state inspection, not just a screenshot: both clip-path and the 3D transform are confirmed live and interpolating together. Also confirmed the toggle fires correctly from a real touch tap on an emulated mobile viewport, not just desktop clicks.

Re-audited after all of the above: 860 internal link/asset references across all 20 pages, still zero broken.

v5.32.0 Full site audit (865 internal link/asset references, every external link, zero broken), a humanizer pass on the About page copy that had drifted into pitch-deck language, and the on-site resume redesigned as a field notebook: ruled lines, a margin rule, binding holes down the left edge.

Audit: crawled all 20 built pages for every internal link and asset reference (865 total) against the actual dist/ output -- zero broken. Checked all 28 external links (GitHub repos, itch.io, Discord, socials, font CDN, the client sites) for a real 200 -- all clean. Checked for duplicate element IDs across every page -- none.

About page: the "For investors + collaborators" section had drifted into startup-pitch-deck register for what is, factually, a solo student's portfolio -- "My bet is that...", "proof the studio actually ships rather than just talking about shipping", "I'm not looking for growth marketing..." Rewrote those three paragraphs to state the same facts plainly instead of defending against objections nobody raised. Also cut "actually" from 7 uses down to 2 (the two that were doing real work), and removed a "not a boast, just—" aside that was answering a doubt the page never raised in the first place. No fact, number, or claim changed -- only how it's said.

Resume page (on-site only -- the downloadable PDF and Markdown stay exactly as plain and ATS-parseable as before, this is presentation for a human reading the page, not the file a hiring system ingests): ruled horizontal lines behind the content, a vertical margin rule, small binding holes down the far left edge, and the "Updated" tag now reads like a small stamped label instead of plain text. Off entirely below 640px so it can't clutter a small screen -- the mobile layout stays the plain version it already was.

v5.31.0 AniFX Fest gets its real domain and co-credit; a new Web/App/CLI/OS index at the bottom of /work with real GitHub-sourced previews; Docflow and the P4inz Discord bot come off the site (one discontinued, one postponed to 2027); header, footer, and mobile theme-toggle polish; Pursue OS moves ahead of Mission OS and gets a scroll-built investigation graph; the theme wipe gets a real fix, not just a tweak.

AniFX Fest 2026 now points at anifx-fest.com (confirmed live) instead of the old anifx-fest.web.app, and credits it as built with a teacher/senior from the program rather than solo.

New section at the bottom of /work: the same projects, regrouped as Web / App / CLI / OS instead of featured-or-not, each with a real link and — where one actually exists — a real preview image. For repos with an existing screenshot or banner (Nexus, Kanvaz, Veris, Obscura) that's reused; for Mission OS, Pursue OS, Glint, and Crossport, which never had one, GitHub's own auto-generated repository card was saved locally and used instead of hotlinking it live (avoids depending on a third-party fetch, and its rate limit, at runtime). MINK and DRAFT are text-only for now -- their cards hit that same rate limit during this pass and weren't worth blocking the ship over.

Docflow comes off the site entirely: discontinued, won't restart. The P4inz Discord bot also comes off, but it's not dead -- the work itself is done, it's on hold purely for hosting-budget reasons, expected back on the roadmap sometime in 2027. Both are kept as a code comment in projects.ts so the reasoning doesn't get lost, not silently dropped.

Pursue OS moves ahead of Mission OS in the deck order, and its case-study scene now builds itself as you scroll -- each node and edge in the investigation graph fades in in sequence instead of sitting fully drawn from the first frame -- ahead of real gameplay footage the project owner is planning to send over.

Ran the same real-repo-audit discipline against each project's tech stack, not just its version number: added Rust to Pursue OS (its only real language), Handlebars to Veris (the HTML-report templating already described in prose but missing from the stack list), and C++/TypeScript to Obscura. Crossport and DRAFT get their real detected languages (Rust, TypeScript) without guessing at a specific framework name neither could be confirmed to use.

Header background switched from tinting the page's own --bg to tinting --surface-1 (the same "one step up" token cards already use): in dark theme, --bg and --surface-1 are far enough apart that this actually matters, and the header was reading as part of the page instead of a header. Barely changes light theme, where the two tokens were already closer.

Footer/copyright line now states the full identity chain (Atharva Patil · p4inz · P4inz Interactive Labs) instead of a bare "© 2026", plus a dedicated Privacy / Terms / Editorial policy line next to it -- the legal pages already existed in the main footer nav, but a copyright block is where people actually look for them.

Mobile/tablet nav drawer: the theme toggle used to be squeezed into the same row as the search bar and the motion toggle. It now sits on its own row below the search bar, same fix on both breakpoints.

The theme-wipe animation had a real bug behind "it drops like a balloon", not just a timing problem: global.css runs a separate page-navigation view transition (the browser's native @view-transition feature) that targets the exact same ::view-transition-old/new(root) pseudo-elements ThemeToggle.astro uses for the wipe -- there's no built-in way to tell "this transition came from a link click" from "this came from the theme button" other than tagging it. That other transition's own 0.42s fade-and-lift was firing on top of the wipe often enough to read as the wipe's own motion. Fixed at the source in global.css, suppressed for the duration of a theme toggle. On top of that: a softer, feathered-edge version of the wipe (animating a mask's radius) was built and tested, and pulled back out when it wouldn't render reliably -- confirmed via direct animation-state inspection, not just a screenshot, that the mask approach was the unreliable part, not the underlying mechanism. Shipped instead: the original, verified-working clip-path circle, a softer easing curve with no snap at either end, and real per-direction motion -- going to light, the new layer grows outward from the click point; going to dark, the old layer shrinks inward onto it instead, so dark uncovers from underneath rather than light just retreating.

v5.30.0 Dark/light theme swap wipes across the screen from the click point now, instead of snapping instantly. Same effect in both directions.

Uses the View Transitions API: the browser snapshots the page before and after the swap, and ThemeToggle.astro's script animates only the new theme's clip-path as an expanding circle from wherever the toggle was clicked, over 700ms with the site's existing --ease-out curve. The old theme just sits underneath and gets covered, so it reads as a wipe/reveal rather than a cross-fade. Verified in-browser with a slow-motion (5s) version of the exact same code path before shipping the real 700ms one, since a screenshot at normal speed can't catch a sub-second animation.

Symmetric both ways (dark to light and light to dark) since it's the same code regardless of direction, and works from all three trigger points on the page: the desktop nav button, the mobile drawer's copy, and the "T" keyboard shortcut (which has no click point, so it wipes from the center of the screen instead).

Falls back to the old instant swap -- no error, no missing feature -- when the browser doesn't support startViewTransition (Firefox, as of this check), when prefers-reduced-motion is set, or if a wipe is already mid-flight from a rapid double-toggle. This is a short, click-triggered transition rather than the site's own definition of "ambient motion" (5+ seconds, unprompted, governed by the separate Motion toggle), so prefers-reduced-motion is the right thing to gate on here, not html[data-still].

v5.29.2 Confirmed directly: neither Crossport nor Pursue OS has anything committed or pushed yet for the resumed work. Recorded real ETAs -- Crossport by tomorrow, Pursue OS about a week -- dated so they don't read as still-current months later.

Crossport and Pursue OS's nextMilestone fields now say plainly that the current work is local-only as of Sept 27, 2026, with a rough finish estimate attached to that date rather than a bare "tomorrow" or "a week" that would go stale and misleading the moment someone reads this later.

Pursue OS's on-site development notice gets the same as-of-date treatment, so a visitor reading the live page sees the same honest "not yet pushed" status the data layer has.

v5.29.1 Pursue OS and Crossport are back in active development after a pause; both were still marked stalled from the last check. Reported directly by the person who'd know, since GitHub commit history alone hadn't caught up yet.

Pursue OS moves from On Hold to Active · Pre-release. The repo's own commit history still shows nothing past a September support-block/funding-badge pass on top of the mid-August case-store work -- no new feature commits yet -- so this status change is based on being told directly that implementation has resumed, not on visible repo activity. Updated the case study's development notice, meta description, projects.ts, and llms.txt to say "resumed," not "on hold."

Crossport moves from Early Development to Active · Foundation for the same reason: real work paused after the initial foundation build (last feature commit August 1st), confirmed resumed in September.

Also confirmed: Veris being at v1.2.1 in "production hold / maintenance only" (shipped last update) matches what was independently reported as "done and released already" -- no further correction needed there.

v5.29.0 Studio renamed, permanently, to P4inz Interactive Labs (was Northbyte Studios) across every real mention on the site. Also ran a full audit against every p4inz-code repo on GitHub and caught real drift: Veris and MINK had both shipped multiple versions past what the site had recorded, and five real repos were missing from the site entirely.

Rebrand: swapped the studio name sitewide, not just the one SITE.studio value. Along the way, found and fixed a real bug it would have caused silently: about.astro used a `SITE.studio.replace('Northbyte Studios', 'Obsidian Labs')` trick to render the earlier studio name in a historical sentence, which would have just printed the new name in the wrong place the moment SITE.studio stopped literally equaling "Northbyte Studios". Replaced with a plain hardcoded string for that specific historical fact.

Also fixed the About page identity block, which only had room for one "previous studio" -- it now lists both (Northbyte Studios, Obsidian Labs) the same way the "retired handles" row already handled PainZ and Grim. Added a third timeline entry for the rename, and rewrote the studio-history paragraph to name all three names in order instead of assuming there'd only ever be two.

Kept "Northbyte Studios" itself searchable on purpose: it's in the sitewide keywords list, ai.txt, humans.txt, and llms.txt's identity-resolution section alongside the new name, so anyone who still searches the old name lands here too. Two screenshots (Kanvaz's About dialog, Nexus's splash screen) still show "Northbyte Studios" in their alt text on purpose -- that's literally what those specific screenshots show, and rewriting the alt text would misdescribe the image.

Regenerated the resume PDF from the updated template; still fits on one page.

Repo audit: Veris shipped v1.1.0 and v1.2.0 while this site had it pinned at v1.0.0 -- CI security gates, an AI-assisted rule authoring flow, a browser-based investigation dashboard, and a plugin marketplace foundation, published as `veris-cli` on npm. The repo's own README now calls it "production hold / maintenance only," which is a different claim than "on hold mid-development," so the status label changed to match.

MINK was an even bigger gap: v1.0.1 to v1.0.3 quietly added a full Linux x86_64 backend (execution-verified via WSL), real OS threads with an async task loop and genuine async/await, a package manager (manifest, resolver, lockfile), a test runner, a REPL, TLS networking, and DEFLATE/zip compression -- pushing the regression suite from 1,928 tests to just under 3,000. One caveat this site now states plainly: the published npm package still only serves the older v1.0.1 build, so the repo and the npm package are no longer the same version.

Kanvaz went from v8.8.5 to v9.5.0 -- six releases (security hardening, 13 render modes, a Blender picker, OBJ material and HDR/EXR preview support, more recognized formats, and a third board type called Scratch Board) that the site had simply never recorded.

Five real, public p4inz-code repos had no presence on the site at all: Crossport (cross-platform file transfer, early foundation stage), DRAFT (a visual workspace that hands sketches to MCP-compatible AI agents as structured data), Docflow (an offline PDF editor, release-candidate stage), Reference Engineering (the methodology library behind 3D Ref Skills), and a Discord community bot literally named "p4inz" (early development, no version yet -- labeled clearly on-site as the bot, not the studio, since the names now collide). All five are added as supporting/non-featured entries with their real, current, early-stage status stated honestly rather than dressed up.

llms.txt and robots.txt both still said "18 real routes" -- the real count, verified against the actual built sitemap, is 19 (the /support page was added in a previous ship and never updated here). Fixed both.

Found one more while eyeballing the rendered About page for this ship: a principles card claimed "Nexus and Veris are paid." Veris's own README has no pricing or license-key language anywhere, just a free `npm install -g veris-cli` and an optional Buy Me a Coffee link -- it's free, not paid. Corrected to name Veris alongside the other free products and Nexus as the one paid product.

v5.28.1 404 game speed now ramps the way the offline dino's does: a slow, honest start and a noticeably faster ceiling. Verified the contact form's mailto flow end to end.

Signal Runner: starts slower (was 5.2, now 3.6) and climbs further (was capped at 12.5, now 14), so the difference between the first few seconds and thirty seconds in is obvious, not just a slightly quicker version of the same speed.

Contact: re-verified the mailto flow end to end (validation, message composition, the transmit beat, and the copyable-text fallback for when no mail client answers). No changes needed -- it already handles the failure case.

v5.28.0 Real fixes: the home hero's three-step pipeline no longer starts with the first card already lit, the logo on it no longer causes layout jank, and a risky blend-mode layer behind the Ascent video is gone.

Home hero: the pipeline math had an off-by-value bug. The first card's own lit window ended exactly at rest (0% scrolled), so 'Spot the gap' showed fully lit before any scrolling happened, on every device. Thresholds are now evenly spaced and each card's window starts at rest and ends exactly where the next one begins, so all three start dim and light up in turn as you scroll, matching what the pinned desktop version already did.

The logo riding the pipeline's line used to move by animating the CSS left property, which forces the browser to recompute layout on every scroll frame -- the exact cost scroll-driven animations exist to avoid, and it read as stutter, worse on phones. It now moves with a single transform against a width measured once (on load and resize, never on scroll), and the small blur on the logo is now desktop-only.

Ascent: removed a second gradient layer on the video frame that used mix-blend-mode for extra punch. Some GPUs fail to composite a hardware-decoded video under a blended sibling layer and render it blank -- reported as the Ascent clip not showing up, on the home chapter and in /work. The color filter alone keeps most of the same grade without that risk.

Contact: the two underline-style fields (name, email) get a bigger tap area on phones (44px+), unchanged on desktop.

v5.27.0 Real fonts, finally: Clash Display, General Sans and Azeret Mono replace a broken Fontshare request that had been silently rendering the whole site in system Arial. Plus a 404 game, Signal Runner.

Fonts: the base stack was PP Neue Machina, PP Neue Montreal and PP Supply Mono, which are Pangram Pangram families never actually hosted on Fontshare. The request returned empty CSS on every visit and the whole site fell back to system Helvetica/Arial without any error. Replaced with Clash Display, General Sans and Azeret Mono, close matches in the same roles, real, free, and confirmed live on Fontshare.

404: a new game, Signal Runner, replaces the empty space under the route diagnostics. Same genre as the offline dino (an endless runner you can't pause), built as its own thing: two obstacle types, ground packets to jump and drones to duck, a spinning AP-mark badge every 100 metres, particle bursts and screen shake, and a slow day/night sweep. Colors are read live from the page's own theme variables, so it is correct in both themes with one palette. It only moves after you press space, tap, or hold duck, so it is not ambient motion under WCAG 2.2.2. Works with keyboard, mouse and touch (a duck button appears on touch devices, and swiping down on the game also ducks).

v5.26.0 Work deck rebuilt: pictures are never cropped and each product's arrives its own way. Ascent gets a bigger, colour-graded frame and a level counter with a runner that hops obstacles. The home hero steps are now cards.

Work: the pictures keep their own ratio and fit the card, so nothing is cut off (Nexus and Kanvaz were being clipped at the edges). Nexus wipes in with a scan line, Kanvaz drops onto the board and tilts into place (it had no motion before), Ascent reveals in pixel steps. Card backgrounds now move with the scroll: a grid for Nexus, dots for Kanvaz, drifting stars for Ascent, scanlines and a lattice for Mission OS and Pursue OS. The ticker strip and the dead space under each card are gone, and the big index numeral is smaller so it stays clear of the picture.

Ascent: the gameplay frame is wider on both the home page and /work, with a colour grade tuned separately for the dark and light themes. The level counter is now a small panel with a progress bar and a run strip: a ground line, spikes coming in, and the runner hopping each one, timed the way the offline dino game does it. The page-wide runner that floated across the screen is removed.

Home hero: the three steps are now glass cards that light up in turn, with the AP logo riding a bar underneath. On phones the captions are hidden and the cards shrink so nothing wraps badly. The release pill under the header hides the version below 430px so it no longer truncates.

The pause button in the header now says what it does when you hover it: it stops ambient motion (stars, glows, looping video, the running sprite), and leaves scroll-driven motion alone.

Donation page (p4inz-code.github.io/donate): Buy Me a Coffee first for anywhere in the world, with its QR, and UPI second for India. Every repo README support block now carries a Buy Me a Coffee badge, and the donate repo has a banner. The site README is updated to match.

v5.25.0 New home hero and scroll story, a glass release ladder, translucent cards, scene effects on every case study that also work on phones, a support page, and two more sites in the work list.

Home: the hero now reads I identify unmet needs in software and turn them into products. Its words light up as you scroll, then a three-step line (spot the gap, build it, ship it) fills while the AP logo travels along it. A proof strip counts up four plain facts, and while the project chapters scroll a glass ladder on the left edge shows where you are, with the logo sliding from dot to dot. Click a dot and it jumps straight to that chapter. On screens without spare side space it becomes a small pill under the header, so it never sits on top of text.

The browser tab icon is now the AP mark inside a ring that fills as you scroll. It stays still with reduced motion or when motion is paused.

Work: /work is now a stacked card deck plus an index of every project, so it no longer scrolls like the home page. AniFX Fest 2026 and Kalasadhana Academy are listed. They are websites, so they are not counted in the products figure.

Scenes: Nexus, Kanvaz, Ascent, Mission OS and Pursue OS each have their own backdrop and effects, driven by scroll on every device. Ascent stars are visible in the light theme, and there is a pause-motion button for ambient effects.

Cards on every page are frosted glass in both themes. Contact drops the magnet card for a live composer with a clock, copy-email and a send animation.

New /support page with Buy Me a Coffee and UPI, and a footer link. Every public repo now carries the Buy Me a Coffee link in its README support block and a FUNDING file. The button is a plain link rather than an embedded widget, so the site still loads nothing from third parties.

Slashes used as separators in visible text are gone, and the 2 of 5 style counters use a bar instead.

Checks: 8 pages at 18 widths from 320 to 2560 with no horizontal overflow, Lighthouse accessibility 100 on mobile. Not tested on a real iPhone, Android device or Firefox.

v5.24.1 Contact page polish: the composer card is magnetic, the fields are easier to see, and the README is rewritten to match the site as it is now.

The whole composer card now leans toward the pointer while it is near, tilts a few degrees and lights up where the pointer is, then eases back. It is off on touch screens and for reduced motion, and the tilt pauses while you type or a menu is open.

Fields: each row highlights on hover and on focus so it is obvious where you are typing, the caret blinks in the active row, the message box has a live character count, and Ctrl or Cmd plus Enter sends from anywhere in the form. The send button got a softer gradient, a sliding arrow and a pressed state. The channel list on the left picks up an arrow and a small nudge on hover.

README rewritten: 18 pages, the scene system, the scroll chapters, the contact composer, and an honest note that the Neue Machina, Neue Montreal and Supply Mono stack is not on Fontshare, so the site currently renders the fallback fonts until that is fixed.

v5.24.0 Featured work rebuilt as scroll chapters, and Nexus, Kanvaz and Ascent each get their own scene: a title font, a page background and a reveal that fit the product.

Featured work (home and /work): each project is now a pinned chapter. The words arrive first, then one more scroll reveals the picture. Project names start as outlines and fill with the accent as you scroll. The pacing was measured at 0.1-screen steps so no stretch of scrolling does nothing. Under 900px, with reduced motion, or without scroll timelines, it falls back to plain stacked cards.

Nexus: Technor for titles, a floor grid flowing toward you, data packets on the grid lines, a scan beam and a slow wireframe cube with a core turning the other way. The picture wipes in with a scan line.

Kanvaz: Kalam (handwriting) for titles, a dotted board that pans as you scroll with faint reference cards joined by flowing cables, tilted pinned cards on the page, and a card that drops onto the board on the /work reveal.

Ascent: Jersey 10, a pixel face, for titles. The page and the /work chapter get a night sky with a nebula, three star depths, shooting stars and a moon that climbs and fills out as you scroll, over three ridges that fall away at different speeds. The letterbox opens on the gameplay loop.

Media: Ascent now shows a 12-second loop cut from a real screen recording (325 KB MP4, 240 KB WebM, plays only while on screen). Nexus uses a cropped v11 lock-screen slide and says it is a design mockup. The Mission OS banner is off the site for now. Corner-bracket frames were tried and removed everywhere.

Fonts: Jersey 10 is self-hosted (SIL OFL, Latin subset, about 8 KB). Technor and Kalam come from Fontshare, one request each. The game's own pixel font is from a paid asset pack, so it is not used here.

v5.23.1 Tidy-up after v5.23.0: showcase order, the slash in status labels, and the project thumbnails.

Featured order is now Nexus, Kanvaz, Ascent, Mission OS, Pursue OS. The "/" between a status and its version is gone. Featured images sit in a fixed-width column at their own aspect ratio (no cropping, no parallax), and the Obscura test ledger no longer squeezes its bar next to the number.

v5.23.0 Repo sync and media pass: Kanvaz was three major versions behind (site said v5.3.0, "final release"; the repo ships v8.8.5 almost weekly), 3D Ref Skills was described as something it isn't, and the README banners now show on the site.

Kanvaz: the site called v5.3.0 the end of development. The repo has since published 39 releases across v6, v7 and v8, and the README says outright that updates land most weeks. Status flipped from Final Release to Active, version bumped to v8.8.5 (the latest published release, with Windows, macOS arm64 and Linux builds), and the case study rewritten around what actually changed: live 3D model preview, shared cards, Layers panel, Smart Search, profiles, 14 templates. The main branch is already at v8.9.8 and not yet released, so the site follows the release, not the branch.

3D Ref Skills was listed as an open-source knowledge graph. The README describes nine AI skills for reference gathering that work with Claude, Cursor, Codex and Gemini. Tagline, description, tags and stack corrected; version set to v3.0.0 to match the README badge and CHANGELOG.

MINK stays at v1.0.1 (that matches the npm package and the GitHub release). Its roadmap note was out of date, since main now has async fn/await, non-blocking I/O and a package manifest and resolver that have not shipped yet.

Checked against real releases and left alone: Nexus v10.12.5, Ascent v0.14.1, Obscura v1.0.0, Glint v1.1.0, Veris v1.0.0. Glint's own README still says v1.0.0-alpha while its release is v1.1.0; the site follows the release.

Media: the README banners for Mission OS, Nexus, Veris and Obscura are now on the site as WebP (about 10 to 90 KB each instead of 1.5 MB PNGs), shown in the featured cards and case-study heroes and labelled Banner art, since they are branding renders and not product captures. Kanvaz's README banner turned out to be an empty-board screenshot, so I used its dark and light showcase screenshots instead. Ascent's featured card uses a real gameplay frame.

Resume PDF, Markdown and page updated for Kanvaz v8.8.5. llms.txt, the work page intro and the Kanvaz page metadata no longer say "development complete".

Scroll sweep: smooth scrolling is now off for people who ask for reduced motion (it was on for everyone), in-page anchors clear the sticky nav, the section reveal no longer leaves a permanent transform behind, and the featured cards stopped stacking two perspectives.

v5.22.0 Multi-engine push: found and fixed a real bug where Project Ascent was missing from sitemap.xml entirely (the hand-maintained route list was never updated when the case study shipped), and added IndexNow so Bing, Yandex, Seznam.cz, and Naver get pushed updates instantly instead of waiting to crawl.

sitemap.xml is a hand-maintained route list, not auto-derived from src/pages/*.astro. When ascent.astro shipped in v5.18.0, that list never got a new entry for it, so /ascent/ was a real, crawlable, linked-from-everywhere page that was silently absent from the sitemap the whole time. Fixed by adding it (priority 0.9, matching the other flagship case studies).

Added an IndexNow key file at the site root and pushed all 18 sitemap URLs through the IndexNow API, which fans out to Bing, Yandex, Seznam.cz, and Naver in one call, no account or verification dashboard needed. Google and DuckDuckGo don't support IndexNow: Google already indexes this site fine per direct confirmation, and DuckDuckGo draws heavily on Bing's index for results outside its own crawler, so a faster Bing pickup helps there too.

Added an explicit robots meta tag (index, follow, max-image-preview:large, max-snippet:-1) so search results can show full snippets and large image previews instead of a truncated default.

v5.21.0 Search-discoverability pass: made sure "p4inz", "P4INZ", and the retired misspelling "painz" all resolve back to this site, and that project + handle combos (e.g. "project ascent p4inz") land on the right page instead of nowhere.

Added a keywords prop to BaseLayout, backed by a sitewide default in site.ts and overridden per page for the projects and sections that actually have distinct name + handle combos people search: Project Ascent, Kanvaz, Nexus, Mission OS, Pursue OS, Work, About, Services, and the homepage.

Expanded the Person JSON-LD node's alternateName to include "P4INZ" and "painz" alongside the existing "p4inz" and "p4inz-code", so entity resolution covers the retired spelling too, and added web/app/CLI/game development to knowsAbout to match how the handle actually gets searched alongside a discipline.

Project Ascent's SoftwareApplication structured data now carries its own keywords and sameAs links to the itch.io build and GitHub source, instead of just an author reference back to the Person node.

llms.txt gets a new "Search queries this site should answer" section spelling out the p4inz/painz + product-name combos explicitly, for AI answer engines that read it directly rather than crawling rendered pages.

v5.20.0 The AP mark is real artwork now, not a hand-drawn SVG approximation. Swapped in everywhere the mark shows: nav header, favicons, apple-touch-icon, OpenSearch. The OG social-share banner is a separate, fully composed design and wasn't touched this pass.

APMark.astro was always honest about what it was: a hand-recreated SVG guess at a reference image, since there was no way to trace the real artwork into clean vectors. The user sent the finished piece directly this time. Its background was solid black with no alpha channel, keyed it to transparent using the image's own luminance (max of R/G/B per pixel) rather than a naive color-match, which handles the soft glow falloff correctly instead of leaving a dark ring.

Composited the result against both theme backgrounds before shipping anything: the metallic gradient on the letterforms carries enough of its own contrast to read clearly on cream as well as on near-black, so this needed no per-theme color swap the way the old hand-drawn version did.

Replaced everywhere the mark appears: the nav header (APMark.astro now renders the real image instead of inline SVG paths), favicon-192.png, favicon-512.png, apple-touch-icon.png, and the OpenSearch descriptor icon. Removed favicon.svg and its manifest/mask-icon references entirely rather than leave it pointing at an outdated, different-looking mark alongside the new one.

Left the Open Graph social-share image (og.png/og.svg/og-light.png) alone. It's a fully composed banner with its own layout, not just the mark, and redoing it properly is a separate design pass, not a logo swap.

v5.19.0 Monthly repo-verification pass: 6 project statuses updated from real GitHub activity. Kanvaz went from "v4.5.1, active" to "v5.3.0, final release" (8 versions shipped and closed out since the site last checked). Both OSes and Veris moved to On Hold. Plus a humanizer sweep and a quick bug bounty.

Kanvaz was the biggest gap: the site still said v4.5.1, "Active Development," headlined by the MCP Bridge. The real repo had shipped v4.6.0 through v5.3.0 (template gallery, text cards, broader .pur import, an annotation-corruption fix) and closed the arc with v5.3.0, "Finish line: bug bounty, fixes, and what's next," its own 8-pass audit before declaring itself done. Rewrote the case study, projects.ts, resume, and llms.txt to match: status is now "Final Release · v5.3.0."

Mission OS, Pursue OS, and Veris all moved to On Hold, confirmed by both the owner directly and by checking each repo's own commit history (no activity on Mission OS or Pursue OS since early August; Veris hasn't moved past its v1.0.0 release). Each keeps its real shipped state in the label instead of losing it: "On Hold · Open Beta," "On Hold · Pre-release," "On Hold · Released v1.0.0."

MINK bumped v1.0.0 to v1.0.1: static CRT linking (no more VC++ Redistributable dependency), a working `mink run` command, and the environment/process/filesystem standard-library work that was still on the roadmap the last time this site checked.

Project Ascent's core development is done. Status changed to "Visual Polish Phase," reflecting what's actually left: a planned character/monster addition and visual polish work expected to continue for at least two more months, not new gameplay systems.

Ran the humanizer skill's full pattern set (not just the em-dash rule from the last few passes) against the site: overused AI words, sales language, curly quotes, decorative emoji, forced triads. Found nothing new. Prior passes already caught what there was to catch.

Quick bug bounty: crawled every built page for broken internal links and asset references (0 found across 64 checked), checked every external repo and itch.io link for a real 200 (all clean), scanned for duplicate element IDs across all 19 pages (none), and live-tested the command palette, mobile nav drawer, theme toggle, and live-stats widget. Everything worked as built. No real bugs surfaced this round.

v5.18.1 Ascent screenshots replaced. The first set, pulled from itch.io's thumbnail cache, was capped at 347px wide and read as blurry once actually on the page. Downloaded the real web build from the GitHub release and captured 4 native-resolution screenshots directly from live gameplay instead.

itch.io only ever served these particular images at 347x500: every larger size variant 404'd. Fine as a small thumbnail on their own page, visibly soft once stretched into this site's screenshot frames.

Downloaded the actual v0.14.1 web export from the GitHub release (same build itch.io hosts, so nothing about the game itself changed), served it locally with the COOP/COEP headers Godot's web export needs, and played it directly to capture 4 screenshots straight off the canvas at its native 2447x1529 render resolution: Level 1, a mid-air jump between platforms, the expanded controls panel (a better illustration of the full moveset than any static pose), and the real pause menu. Resized down to 1400px wide for the page, still far sharper than the itch.io thumbnails and well within normal page-weight budget.

One thing the earlier placeholder alt text got wrong, caught by capturing the real thing instead of guessing: it described a "Quit to Desktop" option in the pause menu. The real web build hides that button entirely (v0.14.1 fixed exactly this, since quit-to-desktop is meaningless in a browser tab) - the new screenshot and its alt text both show what actually ships.

v5.18.0 Project Ascent gets a real case study. The repo went public and the game shipped to itch.io since it was added as a private, unlinked prototype nine days ago: 25 levels, 5 acts, 5 boss fights, cross-platform exports, 18 automated test suites, all pulled from the real repo and real releases.

Project Ascent's repo (`p4inz-code/project-ascent`) went public and shipped a full campaign since it was added to this site as a private prototype: v0.1.0 (first playable) to v0.14.1 in about a week, now live on itch.io for Windows, macOS, Linux, and browser, with Xbox and PlayStation controller support.

Built a full case study at /ascent, matching the treatment Nexus, Mission OS, Kanvaz, and Pursue OS already get: real screenshots pulled from the live itch.io page (gameplay, pause menu, settings/personalisation), the full moveset, the 5-act campaign breakdown, the boss-encounter table, and a section on the test suite's own history: two suites exist because an earlier gate proved the wrong thing, not because someone thought to add them upfront.

projects.ts rewritten top to bottom: status moved from "Private Prototype" to "Active Development · v0.14.1", added to the featured lineup (it was excluded from ProjectCard's link entirely before, since a private repo has nothing to link to), real GitHub + itch.io links, correct license (proprietary, per the repo's own LICENSE).

Promoted from a one-line "Additional Projects" mention to a full entry on the resume, on all three surfaces (on-site, markdown, PDF), crediting the direction/design/QA role and the AI-driven implementation via Claude Code the same way the project's own release notes do.

Propagated everywhere else this kind of change needs to land: llms.txt, the JSON-LD sameAs list, the RelatedProjects cross-links on all 4 other case studies (now 4 related projects each instead of 3), and the /work page intro copy.

v5.17.17 Full em dash pass across every page, component, and public text file. Structural label separators (Name — Tagline, alt text, titles) stayed; every prose connector dash got converted to a period, comma, colon, or parentheses. Two more real stale numbers caught along the way.

Went further than the "not X" self-narration pattern from the last two rounds and converted the actual em dashes themselves wherever they were being used as a sentence connector, across every .astro page, every component, and llms.txt, humans.txt, and robots.txt. Left the site's structural typographic convention alone (Name — Tagline headers, alt text, "Label — Value" list rows) since that's a deliberate design pattern used consistently sitewide, not the AI-writing tell this pass was built to catch.

The Mission OS concept demo's InstallerApp.astro had a code comment claiming "5-screen subset of the real 13-screen installer" left over from before the Mission OS correction two versions ago. Fixed the comment and the demo's own copy; left the demo's internal 13-step data model alone since rebuilding it to match the real 7-screen Calamares flow is a separate, larger task than a text pass, and the ribbon/CTA already say plainly that the demo shows an earlier design.

robots.txt still said "14 real routes" when the site has shipped 18 for a while. Fixed. llms.txt's Status section named an exact changelog-entry count and version range that goes stale every time this file ships without llms.txt in the same commit, which is most of the time; pointed it at the live /status page instead of a number that will be wrong again next week.

v5.17.16 Full sitewide sweep for the self-narrating "not X" pattern and one more repo cross-check pass. Two real finds: an about.astro pillar card repeating the Mission OS installer claim already corrected elsewhere, and terms.astro still listing a license for repo-map, which is no longer on the site.

Grepped every page and component for the contrastive-negation tell ("X — not Y", "isn't just", "no gimmick," etc.) left unchecked after the last two audit rounds. Most of what turned up was normal editorial em dashes and legitimate factual comparisons, not the defensive pattern the audits were built to catch. Two real, worth-fixing instances survived the pass.

about.astro's "Explain what you're turning on" pillar card said Mission OS installer options get "benefit and downside written right next to the toggle": the same specific claim corrected on the case study and resume last version. Retitled to "Hardened by default" with copy matching what actually ships, automatic hardening rather than an interactive explain-as-you-go screen.

terms.astro's per-product license list still named repo-map, removed from the site two versions ago, and never picked up MINK, added the same version repo-map left. Swapped one for the other.

Cross-checked Veris and 3D Ref Skills against their real repos as a final pass: both still match what the site says, no drift found.

v5.17.15 Mission OS corrected, the flagship finding flagged last version. Real repo shows a shipped Open Beta on a standard Calamares installer, not the "active development, 13-screen trade-off installer" story the site told. Fixed everywhere: case study, resume (all 3 surfaces), llms.txt, the demo ribbon.

Checked the exact claim from last version's flag: the repo's README badge and a commit titled "release: Mission OS open beta" confirmed a real Open Beta. Pulled the installer's actual settings.conf to get the real screen sequence instead of guessing: Welcome, Locale, Keyboard, Partition, Users, Summary, Finished. Seven screens, standard Calamares, not the 13-screen "Privacy Setup | Security Options, each explaining trade-offs" flow the case study described.

The real security story is still good, just different: sysctl hardening and Mission OS's Rust system services get applied automatically by a post-install module, no interactive trade-off screen and no manual script needed after first boot. Rewrote the case study's "Installer experience," "Product-grade design," "Security-conscious" pillar, and "Current status" sections around that, and swapped the stale "141/141 pixel checks" stat for a real, currently-verifiable one (40 QML component tests) since I found Mission OS's Nightly Build CI has failed for the last 5 consecutive days and couldn't confirm that number still holds.

Also found a real Mission Hub app (settings, updates, recovery, driver management, diagnostics) in early development, evidenced by a working QML test suite, matching what the old "Current status" section already said was in progress. Kept that claim; it checked out.

The interactive demo shows an earlier installer design, not the Calamares installer that ships. Updated its ribbon and CTA copy to say so plainly instead of calling it "the real Installer walkthrough."

Propagated to every surface: projects.ts (status, stack, description), mission-os.astro (5 sections), llms.txt (2 sections), the resume's Mission OS bullets on all 3 surfaces, and DemoRibbon.astro.

v5.17.14 Freelance bullet on the resume finally names the actual client site.

The Freelance experience bullet mentioned "a full production website build for a performing-arts academy" without ever naming it. Added the real site, kalasadhana-navimumbai.in, across all three resume surfaces: the on-site page, the markdown source, and the PDF.

v5.17.13 Full repo-verification pass across every product: Nexus, Kanvaz, and Glint were all stale, two of them badly. repo-map dropped from the roster, Project Ascent added in its place. Resume contrast fixed, bullets rewritten to lead with capability. One large finding flagged, not fixed: Mission OS.

Checked every product against its real GitHub repo (releases, commits, README) instead of trusting what the site already said. Nexus was one patch behind: v10.12.0 to v10.12.5. Two were much worse.

Kanvaz said "Final Release, dev winding down, no v5 planned." The real repo shipped four versions past that (v4.3.0 through v4.5.1) in the two weeks before this check, headlined by an MCP Bridge that lets an AI agent read and edit a board through 30 tools, off by default and undo-reversible. Rewrote the status, description, and case-study section that called it finished, and added an MCP Bridge feature card.

Glint said "On Hold, internal testing complete." The real repo shipped two full public releases (v1.0.0, then v1.1.0 "Reliability Foundation") with a real feature set: per-monitor brightness over DDC/CI and WMI, a volume mixer, global hotkeys, automatic recovery when a monitor drops out. "Internal testing" was never true once it had a public release. Corrected to Released · v1.1.0.

llms.txt had drifted from projects.ts in two places nobody had cross-checked: it still listed Obscura at v0.9.0 (already fixed to v1.0.0 in projects.ts a while back) and Nexus at v10.12.0. Both synced.

repo-map removed from the site at the user's request, replaced with Project Ascent: an offline-first, browser-first 2D precision platformer in Godot 4, private repo, prototype stage, development started today. Since it has nothing public to link to yet, ProjectCard now renders a plain, non-interactive card instead of a dead or misleading link when a project has no href, and the command palette's search index skips projects with no route instead of indexing an empty one (a real bug this surfaced: Ascent was showing up in ⌘K with a blank destination before this fix).

Resume: strengthened the purple label color from a washed-out #6D5FD3 to the site's own contrast-vetted #5A32C4 (already used site-wide for exactly this reason) and bumped label weight to bold, after it read as too thin in practice. Contact header trimmed to email, Discord, and GitHub. Rewrote several bullets to lead with the capability being demonstrated rather than just logging what got built, and installed the `humanizer` skill (github.com/blader/humanizer, MIT) to run its AI-writing pattern check against every new sentence in this pass, not just the resume: found and cut several more connector em dashes across resume.astro, Resume.md, and the PDF template.

Flagged, not fixed: Mission OS. The real repo's README badge, and a commit literally titled "release: Mission OS open beta," say it shipped an Open Beta using Calamares, with Mission OS branding and custom Python modules. The site, case study, and interactive demo ribbon all still describe Active Development, pre-release, with a custom QML/Qt installer. This could mean a real status update, or it could mean Calamares is a pragmatic interim step before a custom installer still on the roadmap. Flagship product, uncertain enough that it needs a direct call rather than a guess while unattended.

v5.17.12 Resume PDF rebuilt from scratch (no surviving template existed) to fix its stale MINK line and trim the contact header to email/Discord/GitHub only. Same visual design, corrected info, prose pass run against a real de-AI-writing ruleset.

The bundled PDF was flagged last version as the one surface still showing MINK as "In Development" with 878 tests, since the HTML template that built it was never saved and the on-site page had already been fixed. Rebuilt the template from scratch this time, saved to resume-source/template.html so this can't happen again, matched to the original's exact fonts (Fontshare Neue Machina/Neue Montreal/Supply Mono), palette (#F5EEDC cream, #161616 ink, #5B5B5B muted, #6D5FD3 accent), and layout.

Contact header trimmed to email, Discord, and GitHub only — dropped the location line and the repeated domain link.

Installed the `humanizer` skill (github.com/blader/humanizer, MIT) to ~/.claude/skills and ran its pattern set against the resume prose before finalizing: found and fixed 4 em dashes used as sentence connectors ("Zero telemetry, zero cloud — content stays..." style), left the "Name — Tagline" header labels alone since those are a structural formatting convention used sitewide, not prose. Everything else in the copy was already clean against the pattern list.

Rendered via headless Chrome print-to-PDF, same technique as the original. Confirmed single A4 page and pixel-checked against a full-page screenshot before shipping — the extracted PDF text layer has a few harmless spacing artifacts from the Fontshare fonts (e.g. "Window s Desktop"), matching a quirk already present in the previous PDF ("Softw are Engineer," "Nav i Mumbai") — cosmetic to text-selection only, invisible in the rendered page.

v5.17.11 Two more audit passes, both actioned in full: deleted a self-defeating "No AI-slop" disclaimer page, stripped self-narrating "not X" framing from 4 spots, fixed a site-wide broken /LICENSE link, removed a decorative fake-verification hash from the live-stats widget, scrubbed a named third-party reference out of the changelog, and gave MINK (real, released, 1928 tests) an actual presence on the site instead of resume-only.

Deleted the "No AI-slop" section from /editorial outright. A live page whose purpose is denying it looks AI-generated is the strongest possible signal that it does — the fix for that perception was never a disclaimer, it was fixing the voice. Not softened, not reworded — removed.

Stripped self-narrating "— not X" contrastive framing from 4 confirmed spots: the Nexus mockup line arguing with a reader who hadn't objected, the Mission OS "not a shell over a server" line, the orbit-dot changelog entry that had turned a CSS animation tweak into a design manifesto, and the 404 page's header comment framing itself against a "generic oops page." Said what each thing actually is once, and stopped there.

Two spots in the codebase literally cited this review process in permanent comments — "(audit said 'no llms.txt reference')" in both BaseLayout.astro and its matching changelog entry. Comments describe what code does, not the feedback that caused someone to write it. Both stripped.

`<link rel="license" href="/LICENSE">` in BaseLayout has shipped on all 18 pages since it was added — and 404'd on every single one, because the repo's LICENSE file was never copied into public/. Confirmed by an actual `astro build` + checking the output, not just reading source. Fixed by copying it into public/ so the existing tag resolves.

live-stats widget: removed the "Page integrity (SHA-256)" row. It computed a real hash of the live DOM — but had no reference value to compare it against, so it proved nothing to a visitor despite looking the most technical row on the panel. Also trimmed the component's header comment, which was narrating its own honesty ("the whole point is that a skeptical visitor can check it") — unnecessary on the one feature here that was already fully real.

Replaced every named reference to a third party's resume in the changelog (4 instances, dating back to v5.13.0–v5.14.1) with a description of the actual structural change (single-page A4 fit, hairline dividers, scan pattern). The resume itself was never the problem; permanently recording whose resume it was modeled on was.

MINK was getting "full treatment" on the resume — a dedicated project block, test counts, the works — while having zero presence anywhere on the actual site: not in projects.ts, no card on /work, nothing. Verified the real repo before doing anything about it: MINK shipped v1.0.0 on 2026-08-24 (four days ago), Rust, Apache 2.0, 1928 tests passing — not the 878 the resume still said. Added a real project-card entry (Released · v1.0.0, external repo, no case study page yet) to projects.ts, llms.txt, and the JSON-LD sameAs list, and corrected the resume's MINK line on both the on-site page and the markdown source to say "Released v1.0.0" and "1928 tests" instead of the stale "In Development" | "878 tests." The bundled resume PDF is a separate hand-built asset (no surviving template to regenerate it from) and is now the one surface still showing the old numbers — flagged, not fixed, pending its own pass.

v5.17.10 repo-map was more out of date than it looked — the site said "On Hold, v2.2.0" while npm had shipped v3.0.0 a month earlier with the exact interactive TUI this site called unbuilt. Corrected, plus a stray npm homepage link fixed at the source.

Went to do a small, low-risk fix — repo-map's package.json on npm pointed "homepage" at its own GitHub README instead of this site, which is redundant since npm already links the repo separately. Checked the real published data before touching anything, per the standing rule to verify against the actual repo rather than trust what's already on the site.

That check turned up something bigger: the npm registry's real latest version is v3.0.0, not the v2.2.0 this site had listed. The CHANGELOG in the repo shows v3.0.0 (shipped 2026-07-07) was a full runtime rewrite that shipped the command palette, incremental search, smooth scrolling, and accessibility manager — the interactive TUI this site was still describing as paused and planned.

There's a RELEASE_FREEZE.md in the repo dated 2026-07-04, three days before v3.0.0 shipped anyway — so the "On Hold" status was real at some point, just stale by the time this site was checked. Most recent commit is three weeks old, so this is "Released," not "Active" (nothing shipping right now) and not "On Hold" (a recent major release isn't a deliberate pause).

Fixed both: the npm package.json homepage field (committed and pushed to the repo-map repo directly — publishing the updated field to npm itself is on Atharva, not something fixable from here), and this site's project card + llms.txt, now correctly showing "Released · v3.0.0" with the real feature set.

v5.17.9 Bing Webmaster Tools site verification file added. Google Search Console confirmed set up. Cloudflare AI Crawl Control confirmed as the exact cause of the earlier robots.txt conflict — visible and fixable directly in the dashboard.

Added BingSiteAuth.xml to the site root for Bing Webmaster Tools domain verification.

Google Search Console: done — sitemap submitted.

Cloudflare's AI Crawl Control dashboard confirmed the v5.17.7 finding exactly — ClaudeBot, GPTBot, CCBot, and Bytespider are all toggled to "Block" despite this site's own robots.txt explicitly welcoming them. Googlebot, PerplexityBot, ChatGPT-User, and OAI-SearchBot are correctly left unblocked. Fix is a dashboard toggle, not code — flagged which specific crawlers to flip.

Studio-name decision (Northbyte → possible "p4inz Interactives") — parked, planned for later, not part of this round.

v5.17.8 Popularity/SEO round 2 — sitelinks searchbox schema backed by real ?q= command-palette support (not a claim without function), broader sameAs identity list, real internal cross-linking between all 4 case studies.

Added SearchAction schema so Google can show a search box under this site in results. Wired it to something real first — the command palette now reads a ?q= URL parameter on load, opens itself, and pre-fills + filters on that query. Verified in-browser before shipping: shipping a SearchAction schema whose target URL doesn't actually search anything would be exactly the kind of unfunctional claim this whole project has been trying to eliminate.

sameAs identity list grew from 6 entries to 10 — added Instagram and the npm profile (verified real via the registry API, not assumed, since npmjs.com blocks direct profile-page requests from automation) plus the two product repos that were missing (Obscura, repo-map).

Added a "Related" section to the bottom of all four case studies (Nexus, Mission OS, Kanvaz, Pursue OS), cross-linking to the other three. Real internal linking — more crawl depth and authority distribution between pages that were otherwise isolated leaves off /work.

Homepage meta description now includes "p4inz" once, naturally — the actual handle people search for, which the title/description never mentioned before this pass.

v5.17.7 Homepage meta description now names the real search handle ("p4inz") once. Investigated a Google-favicon question and found something bigger: Cloudflare is auto-injecting a robots.txt block that contradicts this site's own AI-crawler policy.

The homepage title/meta description never mentioned "p4inz" at all, despite it being the actual handle people search for. Added it once, naturally, to the meta description — title stays short on purpose.

Investigated why Google Search shows a generic grey globe instead of this site's favicon. Ruled out an actual bug: all favicon files return 200, the <link> tags are correct, robots.txt doesn't block Googlebot. This is Google's own favicon cache, which only updates on its own recrawl schedule (days to weeks) — nothing to fix code-side, it should pick up the real PNG favicons (new as of v5.17.6) on its next pass.

Found something more consequential while checking that: robots.txt has a genuine self-contradiction. Cloudflare auto-injects a block at the top that Disallows GPTBot, ClaudeBot, Google-Extended, CCBot, and others — directly conflicting with this site's own deliberate policy right below it, which explicitly Allows all of them. This isn't in the repo; it's injected at Cloudflare's edge, almost certainly an AI Crawl Control toggle on the zone. Likely relevant to exactly the kind of AI Overview visibility this site is already getting — flagged for a Cloudflare dashboard fix, not something fixable from the codebase.

v5.17.6 Max-effort SEO push (unique meta descriptions on every page, FAQ + SoftwareApplication + Breadcrumb schema), rasterized favicons, fixed a stale Discord link across 12 files in the Nexus repo, bespoke Obscura card, further about.astro tightening.

Real gap found and fixed: only the 404 page had a custom meta description — the other 17 pages all shared the exact same site-wide default. Every page now has a unique, accurate description written to its actual content.

Added FAQPage schema to /services, mirroring the real FAQ content already on the page — a genuine rich-snippet opportunity, not padding. Added SoftwareApplication schema to all four case studies (Nexus, Mission OS, Kanvaz, Pursue OS) and BreadcrumbList to the same four. Checked Kanvaz's actual release assets before claiming a multi-platform operatingSystem field — no verifiable macOS/Linux builds exist, so that field was left off rather than guessed.

Rasterized favicons finally exist: favicon-192.png, favicon-512.png, and a proper apple-touch-icon.png (180x180, opaque background — the old apple-touch-icon link pointed at the SVG, which iOS has never supported for home-screen icons). Wired into both BaseLayout and manifest.webmanifest.

Checked Nexus and Mission OS's real GitHub READMEs before touching either. Nexus: fixed a stale Discord invite link across all 12 files that referenced it (README, docs, SECURITY.md, SUPPORT.md, PRIVACY.md, LICENSE, CHANGELOG, ROADMAP, issue template) and added three real v11 screenshots (same curated shots already on the portfolio case study). Mission OS: found a real conflict — its README says "Open Beta" with a Calamares installer, while the site says pre-release/internal-testing with a custom QML/Qt installer — and left it untouched rather than guess which is current.

Obscura gets a genuinely bespoke card instead of the shared ProjectCard template — leads with the real all 340 test ledger and a filled progress bar instead of a tagline, on both the homepage and /work.

Further about.astro tightening: em-dash count 28 → 23 → 18 across two passes this session. Stopping here — the rest are isolated, non-repetitive uses; continuing would mean optimizing for a number instead of the writing.

v5.17.5 Fixed content sitting too close to the screen edge on laptop-width viewports — the site's max content width (1200-1400px) is wider than a lot of real windows, so the fixed 24px padding was the only buffer from the true edge.

Reported as "text too close to the border." Root cause: .wrap has max-width: 1200px (wrap-wide sections: 1400px), but on any viewport narrower than that — a genuinely common range: unmaximized windows, half-split screens, smaller laptops around 1024-1200px — the wrap element just fills the viewport and its own 24px padding becomes the entire gap from the real screen edge. Fine on mobile (padding is the whole story there) and fine on very wide desktop monitors (wrap is centered with room to spare) — it was specifically the in-between range that felt cramped.

Fixed with one change in global.css: .wrap padding is now clamp(24px, 4vw, 64px) instead of a flat 24px. Scales up smoothly as the viewport widens — verified 24px unchanged at 375px (mobile), 44px at 1091px (the width that was reported), capped at 64px on very wide screens. Single fix, applies everywhere .wrap is used.

Separately investigated a reported "one letter per line" hero rendering break. Could not reproduce at any width tested, including 150px (well below any real device) on both local and live production — text wrapped normally at every size. Likely a cropped/partial screenshot rather than an actual site bug; asked for an uncropped repro if it recurs.

v5.17.4 Resume redesign (curated to 4 primary + 3 compact projects, warm-white/near-black/violet palette) + de-AI-ify brief v2 (comments, mobile touch targets, Nexus start date corrected).

Resume rebuilt on all three surfaces (on-site /resume, markdown source, PDF) around a curated project list instead of the full roster: Nexus, Mission OS, MINK, and Pursue OS get full treatment; Kanvaz, Obscura, and repo-map get one line each. Veris dropped from the résumé specifically (stays fully on the website) — the user's explicit call, not a mechanical cut.

Verified MINK's real numbers via its actual README before writing anything down: Rust, Apache 2.0, native x86_64-windows-pe target with no external toolchain, 878 compiler tests passing — not the placeholder figure floating around in planning notes.

PDF gets its own palette, distinct from the website's theme system since it's a standalone printed document: warm white background, near-black text, muted violet accent used only for section labels. No gradients, no icon rows, no pill badges.

Removed the Philosophy section and the "canonical Markdown source" footer line from the résumé. Education moved to the very bottom and reads as one line, not a card — the first 80% of the page is now experience and projects.

De-AI-ify pass 2, remaining items: cut "signature move" | "borrowed from emilianmisera.com" framing from EditorialHero.astro's comment and three changelog entries — restated as mechanism, not a narrated creative choice. Cut the "Sacred Text stack" internal codename and its closing aphorism from the /about stack-reasoning copy (this was live, public copy, missed in the first de-AI-ify pass).

Real WCAG-adjacent fix: three interactive elements measured under the 44×44px touch-target minimum — the mobile hamburger toggle (40px), the theme toggle (36px), and the live-stats mobile badge (32px, my own earlier fix). All three corrected and re-measured in-browser at 44px.

Nexus's start date corrected — development began March 2026, not June. It became publicly visible about a month later. Updated in projects.ts, the about-page timeline, and the résumé.

Command palette open animation now uses a distinct spring easing curve instead of the site-wide --ease-out used everywhere else — one deliberately different interaction instead of uniform timing on every single motion.

Known gaps, reported honestly rather than papered over: changelog.ts still carries ~198 em-dashes and about.astro ~23, both above the brief's targets (<40, <5). Getting there would mean rewriting dozens of historical changelog entries and stripping legitimate, non-repetitive prose uses in about.astro — did the highest-density, most clustered offenders instead of a mechanical full pass. A bespoke non-template layout for one supporting project (Obscura) is still queued, not done this round.

v5.17.3 De-AI-fy pass 2 — rewrote the homepage hero, /about, and the studio tagline in a plainer human voice, removed repeated "01/04" index badges site-wide, fixed a real WCAG failure (11 pages had no <h1>), and closed a hardcoded product-count bug (site said 10, there are 9).

Killed the "I write software during the day | I study VFX on the side | I build Mission OS on my own" hero triplet and its literal repeat as a scroll-revealed "manifest bridge" further down the page — flagged as reading generated. Homepage hero and intro rewritten in first person, no rule-of-three parallelism.

Killed the "Developer by discipline. 3D artist by training. Builder by default." tagline everywhere it appeared (about page, llms.txt) — same complaint, same fix: plainer, specific, first-person.

Full /about rewrite: the "01–05" numbered principle cards, the "Thesis. | Product order. | What I don't need." bold-label investor-deck paragraphs, and the repeated setup/antithesis rhetoric ("that's the trade-off... that's the trade-off too") are gone. Same facts, same numbers, written the way a person actually talks.

Removed the "01 | 04" and "01 OF 04" numbered index badges from the homepage featured showcase AND the /services offering list (missed the second one on the first pass — found it while checking /services for the non-technical-client persona).

FIXED — hardcoded product count. The trust strip and homepage hero both said "10 products" when projects.ts has 9. Both now read PROJECTS.length live so this can't silently drift again (same class of bug as the Veris version drift in v5.17.2).

FIXED — trust strip (5-stat panel) rendered on every single page, called out as repetitive. Homepage only now.

FIXED — real WCAG failure, not a style nitpick. Ran axe-core against all 18 routes: 11 pages (about, services, contact, accessibility, privacy, terms, editorial, 3d, work, status, and — after the fix cascaded — 4 more with heading-order skips) had zero &lt;h1&gt; elements. Section.astro now supports a headingLevel prop; the first Section on every affected page renders a real h1. Fixing that surfaced 4 new heading-order violations (h1 jumping straight to h3) — fixed those too: accessibility.astro subheadings promoted to h2, services/status given real h2 section headings, FeaturedShowcase's heading level made context-aware (h3 on the homepage where it's under an h2, h2 on /work where it sits directly under the page h1). Also fixed two violations on /mission-os/demo (a role="banner" landmark conflict, a missing sr-only h1 on the immersive full-screen route). Full site: 0 axe violations across all 18 routes, verified with a real chromedriver run, not estimated.

humans.txt was still describing the pre-v5.6.3 font stack (PP Editorial New | JetBrains Mono) and an imprecise analytics claim — corrected to match reality and reconciled with /privacy's existing, more precise wording.

Resume PDF and markdown regenerated: Veris version fix carried through, the Discord invite updated, the "Philosophy" section rewritten off its AI-sounding fragment-list pattern, and a stale "v3.1" version stamp on the resume page (left over from the old versioning scheme, never matched v5.x) replaced with a plain date.

Confirmed with the user: the four public repos with no portfolio presence (p4inz, Crossport, docflow, reference-engineering) stay off the site — curated best work only, not a mirror of every repo.

v5.17.2 Repo-truth audit — cross-checked every versioned product on the site against its real GitHub release tags for the first time with authenticated gh CLI access; found and fixed one real drift (Veris).

gh CLI turned out to be authenticated in this environment (an earlier handoff doc assumed it wasn't — corrected). Used it to pull real release tags for every product repo instead of trusting the last-known state in projects.ts.

Nexus (v10.12.0), Kanvaz (v4.2.2), repo-map (v2.2.0), and Obscura (v1.0.0) all matched their real latest release tags exactly — no drift.

FIXED — Veris had actually shipped v1.0.0 on 2026-08-09 (confirmed via a real, published, non-draft GitHub release plus a README describing a complete, installable product — `npx veris-cli scan`), but the site still said "Final Polish · Pre-v1.0.0." Updated status, currentVersion, and nextMilestone across projects.ts, llms.txt, and the resume markdown source. The downloadable resume PDF still needs a regeneration pass to match.

FLAGGED, not changed — Glint's GitHub release is tagged v1.0.0 (stable, with a real Glint.exe asset), but the repo's own README heading still reads "Features (v1.0.0-alpha)." That's a contradiction inside the source repo itself, not something safe to resolve by guessing — left the site as-is pending clarification.

Also surfaced, not yet added to the site: four public repos with no portfolio presence at all — p4inz (Discord intelligence platform), Crossport (cross-platform file transfer utility), docflow (offline PDF editor), reference-engineering (reference library). Curation decision, not a mechanical fix — pending direction.

v5.17.1 Brutal mobile audit response — real theme-toggle bug fixed, mobile drawer given a proper close button, site-wide spacing detuned for phones, hero type tightened, live-stats widget shrunk to stop overlapping page content, Discord invite updated.

FIXED — theme toggle silently did nothing when tapped from the mobile drawer. ThemeToggle.astro renders twice per page (desktop nav + mobile drawer) but keyed off a single id="themeToggle" via getElementById, which only ever finds the first matching element (duplicate IDs are invalid HTML) — the drawer's copy had no click listener at all. Now every .theme-toggle button on the page binds independently to a shared toggle function.

FIXED — no visible way to close the mobile nav drawer. The v5.17.0 fix that moved the drawer out of <header> (so its position:fixed stopped resolving against the header's backdrop-filter containing block) had a side effect: the drawer now correctly paints over the entire header, including the hamburger-to-X toggle button that used to be the only close affordance — leaving it invisible underneath the drawer's own opaque background. Added an explicit close (X) button inside the drawer itself.

FIXED — brand name missing on mobile. A v5.16.0 fix hid "Atharva Patil" below 380px viewport width to solve an overflow bug, but 375px is one of the single most common phone viewport widths — most mobile visitors were seeing icon-only. Flexbox space-between already prevents the actual overlap at any realistic width; replaced the hard hide with a much narrower 340px threshold plus graceful ellipsis truncation instead of a binary vanish.

FIXED — excessive empty space between sections on mobile, reported as "feels stuffed" despite the gaps (dense text hard against the screen edge, then huge vertical voids between blocks). Root cause: the --sp-9 through --sp-12 spacing tokens driving section/hero padding site-wide had zero mobile scaling — every phone got full desktop-scale gaps (up to 128px). Added a single mobile media query in tokens.css scaling the top of the ramp down ~40%, fixing every component that reads those tokens at once.

FIXED — hero heading rendered a flat 44px on every phone width from 320px to 680px (the clamp() floor), reading heavy against a narrow column. Tightened further below 480px.

FIXED — the live-stats widget's full-text pill was wide enough to sit directly on top of page content at whatever scroll position landed in the bottom-left corner (confirmed: covering, and likely blocking clicks on, the homepage hero CTA). Collapsed to a small icon-only badge on mobile; tapping still opens the complete panel.

Discord invite link updated to the current server across site.ts and projects.ts.

Skills note: this session's actual skill list doesn't include the taste-skill | ui-ux-pro-max | redesign-skill combo referenced in project memory — verified before relying on it rather than assuming stale memory was current. Worked from direct code inspection, live in-browser verification at mobile viewport, and forced-failure testing (duplicate-ID repro, thrown-error repro) instead.

v5.17.0 Live transparency + diagnostics widget revived from the old v4 site, site-wide error-recovery ecosystem, contact form auto-fallback, Mission OS per-window error boundary, branded 404, restrained scroll reveal.

Live Stats widget is back — bottom-left corner, same position as the old v4.7 monolith site. Computed live in the visitor's own browser via the Performance | Web Crypto | Layout Instability APIs, not hardcoded: external requests, known trackers, cookies set, load time, cumulative layout shift, a live accessibility spot-check, an estimated carbon-per-load figure, and a page-integrity SHA-256 hash computed fresh from the live DOM. Nothing is sent anywhere — the point is a skeptical visitor can check it against their own DevTools → Network tab and get the same numbers.

New shared diagnostics core (window.__nbDiag) — every interactive island that used to swallow an error silently (theme toggle, command palette recent-searches, side-rail clipboard copy) now logs into one in-memory session log instead. A global window.onerror | unhandledrejection safety net catches anything left unguarded. The Live Stats widget surfaces this log directly — "errors caught this session," each tagged recovered or unhandled. Nothing persisted, nothing sent off-device.

Contact form: real email validation with inline per-field errors (was empty-check only). Added a genuine auto-recovery path — many machines have no mail client configured, so mailto: silently does nothing. If the tab is still focused ~1.4s after send, the form now shows the composed message as copyable text with one-click copy buttons instead of a dead end.

Mission OS demo: every dock-app and installer handler now runs through a safeHandler() wrapper. If one throws, that specific window shows an in-universe "this panel didn't respond" state with a reopen button instead of dying silently — the metaphor is a diagnosed fault, not a blank screen.

New branded 404 page — kept in the same restrained diagnostic register as the rest of the site: what route was requested, what it was checked against, why it likely failed, plus a way back home or into the command palette.

Scroll polish — a restrained reveal (opacity + 18px translate) added to every content section site-wide, using the same animation-timeline: view() mechanism already powering the scroll-progress hairline and featured showcase. Settles in the first 35% of a section entering view — reads as polish, not a slideshow effect. Zero JS, respects prefers-reduced-motion.

Font family swap intentionally held — pending user research, revisit next session.

v5.16.0 SEO audit response (SEOmator 93→target 98) + real portrait wired + Privacy/Terms/Editorial pages + trust strip + mobile 4-layer audit fixes.

SEOmator audit had 1 fail + 20 warnings across 171 checks. This ship addresses every actionable item on our side. Cloudflare-side ones (HTTP/3 alt-svc, compression) stay dashboard-level.

FAIL fixed — text-to-HTML ratio 5.8% (min 10%). Home hero intro paragraph expanded with real prose: "Ten products in flight or shipped, four thousand automated tests across them, zero telemetry across any of them. Every case study on this site links to a real repository or a real download — no design mockups pretending to be products, no fabricated screenshots. What you see below is what actually exists." Also dilutes the article-link-density (77.5%) and "os"/"open" keyword-stuffing warnings.

Title trimmed from 63 to 48 chars: "Atharva Patil — Software · 3D · VFX · Northbyte". Meta description trimmed from 148 to 124 chars.

E-E-A-T section (74/100, 8 warnings) — all addressed: new /privacy page (honest, "no telemetry, no cookies, no third-party analytics beyond Cloudflare's beacon"); new /terms page (All Rights Reserved on site content, per-product licenses noted); new /editorial page (content-accurate rule, no fabricated screenshots, version discipline, no AI-slop); trust strip added to footer with 5 real numbers (10 products | 4,100+ tests | 0 telemetry | 0 third-party analytics | privacy-first); YMYL disclaimer footer note on /nexus and /pursue-os case studies ("not security/investigation advice, verify against source repository"). Footer nav includes all three new pages.

AI/GEO — added <link rel="alternate" type="text/plain" href="/llms.txt"> in BaseLayout head so AI crawlers discover the llms.txt via HTML link.

OG image switched from /og.svg to /og.png — the real 1200x630 dark banner you sent. LinkedIn/X/Discord/iMessage/Slack all get proper social cards now.

Real portrait photo wired into /about hero — 1000x1000, warm indoor scene, sits in a rounded 320px frame alongside the lede text on desktop, stacks above the text on mobile.

MOBILE 4-LAYER AUDIT (layout | typography | interaction / motion). Two real bugs fixed: (1) FeaturedShowcase 3D merry-go-round was disorienting on phones — replaced with a simpler opacity + translate reveal below 760px; (2) brand-name wordmark next to AP monogram pushed the hamburger toggle off-screen on <380px devices — brand-name now hides at that breakpoint, AP monogram stays.

Skills applied: writing-plans (audit scope), taste-skill (killed AI-slop copy), verification-before-completion.

v5.15.0 Real WhatsApp brand SVG + resume PDF now on warm cream page with hairline project dividers + final audit.

WhatsApp icon: swapped my hand-drawn approximation for the actual WhatsApp brand SVG path (Simple Icons canonical geometry). Reads unmistakably as WhatsApp now at any size.

Resume PDF: switched page background from pure white (too clinical) to warm cream #F5EEDC (matches the site's Parchment Manuscript light theme, softer on the eye). Added -webkit-print-color-adjust: exact so Chrome ships the background instead of stripping it. Added hairline top-rule between every project block — each project now visually separated on the page. Skills grid rows also get hairline separators (dusty warm gray #e2d9be). Section-heading rules re-warmed to match.

Big final audit: grepped every runtime file for stale references, TODOs, and content drift. 26 TODO/FIXME/placeholder hits — all inside CSS comments explaining prior fixes or legitimate copy ("Coming Soon" as Pursue OS's real status). Zero live bugs. Only remaining "Sacred Text" mention is a historical note in About's stack explanation about why the previous PP Editorial stack came off — that's meant to stay. Build clean (14 routes, 5MB dist total, 116KB PDF, one A4 page).

v5.14.1 WhatsApp glyph fixed + resume PDF compressed to a proper single A4 page.

WhatsApp icon in the side rail was a stroked scribble that didn't read as WhatsApp. Replaced with the classic filled speech-bubble-with-phone-swirl glyph — instantly recognisable.

Resume PDF was spilling to a second page. Rebuilt the template to fit a single A4: body 10.5pt → 9.5pt, line-height 1.65 → 1.5, section top gap 22pt → 12pt, block gap 14pt → 7pt, bullets cut to 2-3 per project (only the essentials), Obscura + MINK + repo-map merged into one row instead of three, Philosophy section removed (redundant with the tone across everything else), Skills switched to a dense 2-column DL grid, Education compressed to one line.

Horizontal padding balanced at exactly 14mm on both left and right (was 18mm, felt narrow with the wider content). Vertical padding 14mm top | 12mm bottom.

Chrome print header still killed via @page{margin:0} + body padding pattern.

Now: single A4 page, breathes, holds every product + full skills + experience + education.

v5.14.0 Sidebar upgrade (WhatsApp + Instagram + copy-URL button) · nav search cleaned · resume PDF fully rebuilt after 20-pass audit.

SIDEBAR — WhatsApp added (business number +91 9321614988) + Instagram (@atharva.patil.cg) + copy-URL button replacing the rotated vertical text. Copy button is a pill that expands leftwards on hover to reveal "atharvapatil.tech/current-path" horizontally, clicks copy the current URL to clipboard with a green "copied" toast. Every icon theme-swappable via currentColor.

NAV SEARCH — killed the pill + border + "⌘K" label chrome around the search trigger. Now a clean 34×34 icon-only button (single magnifying-glass svg) that hover-tints purple. Reads as an intentional tool, not chrome-on-chrome. Keyboard shortcut still works everywhere via document listener.

PDF RESUME — 20-pass audit + full template rebuild.

2-approach findings that got fixed: (1) cream fill on the entire page read as a cardboard cutout — switched to white page with cream only in accent moments (rules, philosophy block, meta italic); (2) vertical rhythm too tight — rebuilt on a 6pt base, sections now breathe (h2 top-margin 14pt → 22pt, project blocks 10pt → 14pt gap); (3) Chrome print-to-PDF was inserting a "8/11/26, 8:07 AM — Atharva Patil — Resume" header — killed with @page{margin:0} + body padding pattern (Chrome can't inject a header where there's no margin to put it); (4) bullets tight — line-height 1.5 → 1.65 + 5pt bottom gap between items; (5) h3 project name to meta line too close — 3pt gap; (6) meta italic-purple to bullets too close — 6pt gap; (7) page-break-inside: avoid on every project block so nothing gets orphaned mid-project; (8) name h1 bigger (26pt → 30pt) + tracking (2px → 3px) — dominates the page top like a real resume header.

What was ALREADY working (kept): the fast top-to-bottom scan pattern, per-project role/date/platform meta rows, strong-noun bullet leads, ink + cream + purple three-color palette, single-page density.

Resume MD updated to match — WhatsApp added to the top meta line.

v5.13.0 Real Nexus v11 mockups shipped · resume PDF + MD generated · sidebar rebuilt (no scrollbar overlap, bigger icons, palette trigger) · Obscura v1.0 propagated · 7-POV audit clean.

PPTX EXTRACTION SOLVED. The Nexus v11 mockup deck was a .pptx file — used PowerShell + PowerPoint COM to export all 30 slides at 1920×1080 into public/assets/nexus/. Six of the strongest hero screens now wired into the /nexus case study via the Screenshot component (Lock Screen v2, Splash, Media Browser, Import Files, Image Viewer, Audio Player). Real deck screens — not concepts, not mockup placeholders.

RESUME REBUILT to the reference layout you sent. New content: proper Professional Summary paragraph, per-project blocks with role · date · platform metadata + bullets that lead with strong nouns (Cryptographic core | Trust posture | Container format), Experience section split into Studio + Freelance, categorized Technical Skills grid, Education, Philosophy, Links. Same info now shipped as both /resume/Atharva_Patil_Resume.md (canonical markdown) and /resume/Atharva_Patil_Resume.pdf (Chrome-headless-rendered from a matching HTML template). The Download PDF button is back on /resume.

SIDEBAR REBUILT. Fix stack: moved 14px in from the right edge so the page scrollbar no longer overlays icons on Chromium; icons enlarged 34px → 40px with 20px glyphs; icon column pinned to top-third (was dead-centered in empty space); bottom URL indicator pinned to bottom via margin-top: auto; each icon gets a subtle backdrop-blur pill so it reads against any bg; the previous ugly npm icon replaced with a proper magnifying-glass button that opens the ⌘K palette (mirrors the desktop nav trigger).

OBSCURA v1.0.0 propagated into projects.ts + resume. Site is now in sync with your actual shipped work — no more "shipped past what site claims" issue.

DESIGN AUDIT — 7-POV pass (Awwwards jury | recruiter | fellow designer | security lens | mobile user | screen reader | SEO+LLM crawler). Findings: identity distinctive (Neue Machina + AP monogram + parchment grain + merry-go-round); zero AI-common defaults; motion is CSS-native + reduced-motion-safe; contact reachable from three places; Lighthouse still 99/100/100/100 across every route; JSON-LD + sitemap + AI-crawler allowlist still intact. No fixes required — everything actionable already shipped in v5.12.x.

package.json version bumped 5.12.0 → 5.13.0 to match site footer.

v5.12.1 Fixed side rail — right edge, social icons + current-URL indicator. Theme-swap audit clean.

Requested: bring back the vertical side rail with git | discord | email icons and a URL indicator that lived on earlier iterations. Built as a new SideRail component wired into BaseLayout.

Side rail: fixed to the right edge of the viewport (desktop only, >=900px), 56px wide, hairline left border, backdrop-blur on the site background so text below stays legible. Top brand tick (purple pulse). Middle: four theme-swappable icons — Email | GitHub | Discord (Nexus beta) | npm — each in a 34px hit target with hover state (color shift to purple-bright, subtle background tint, 2px translate). Bottom: current route path rendered as rotated mono text (writing-mode: vertical-rl), truncates cleanly on long paths.

Mobile has no side rail — hamburger drawer serves that role. Mission OS demo hides it via the existing body:has(.demo-scope) rule so it doesn't leak into the OS metaphor.

Theme-swap audit: grepped every .astro file for hardcoded colors. Every remaining hardcoded value is intentional — macOS traffic-light dots (contact terminal + Screenshot chrome), theme-color meta tags (explicit per-theme), APMark gradient (default dark + light-override present), Mission OS demo internal palette (has its own theme system). Zero theme bugs found.

NOTE: still cannot extract images from the Nexus mockup PDF in this env — the pdf-viewer plugin's display_pdf requires an interactive viewer, and read_pdf_bytes only returns raw bytes. Nexus case study will keep its "v11 concept mockups → real screens on ship" honesty flag until you can export individual pages as PNGs (right-click any page in a PDF viewer → Export → PNG, drop in portfolio-v5/public/assets/nexus/).

v5.12.0 External-audit response — every item from the second-Claude review fixed. Repo hygiene, mobile nav, OG image, font waterfall, AP logo light-theme, 14.5MB dead-weight removed.

A second Claude cloned the repo + crawled the live site and filed a 12-item audit. This ship addresses every actionable item.

CRITICAL — og.png was 404-ing site-wide. Every social share preview was broken. Created a designed 1200x630 og.svg with the AP mark + name + tagline + product pillar chips. Modern crawlers (Discord, Slack, iMessage, Signal, Telegram) accept SVG og:image; LinkedIn/X prefer PNG so the file can be rasterized externally and dropped at same path. Added explicit twitter:image + og:image:width/height/alt + og:site_name + og:locale.

CRITICAL — Resume download buttons were 404s. Added real /resume/Atharva_Patil_Resume.md (full content: summary, all 9 products with status/version/role/stack, timeline, education, availability). PDF button replaced with a mailto request-a-PDF button until a PDF export ships (honest > broken).

CRITICAL — No mobile navigation existed. Below 760px everything but the "Get in touch" CTA was hidden and there was no hamburger, no drawer, nothing. Two of six primary sections were unreachable. Fix: real animated hamburger toggle + full-screen slide-in drawer listing every NAV item + Status + Accessibility + CmdK trigger + theme toggle. Escape closes; clicking a link closes.

CRITICAL — Footer nav was missing /3d and /services. Added.

HIGH — Repo tracked .claude/ (15MB internal AI-tooling config, 26+ Claude Code skill packages, dozens of TTF binaries). Directly contradicted the "built by one person" pitch. git rm -r --cached .claude + added to .gitignore. Same for internal CLAUDE.md workflow doc.

HIGH — README.md described a site that didn't exist (single-file monolith, in-memory router, transparency widget with SHA-256 self-integrity — none real). Rewrote README to describe the actual Astro architecture: 14 file-based routes, three-family typography, dual theme, signature interactions, discoverability suite. Points at real files.

HIGH — 5 stale duplicate files at repo root (index.html [16MB pre-Astro monolith], robots.txt, _headers, security.txt, llms.txt) diverged from portfolio-v5/public versions. Deleted. portfolio-v5/public/ is now the single source of truth.

HIGH — Obscura was listed as v0.9.0 with "ongoing feature development toward v1.0" — user had already shipped v1.0.0 with all 340 tests. projects.ts bumped.

MEDIUM — Font loading was a render-blocking waterfall: @import inside global.css was invisible to the preloader, so fonts fetched serially after the CSS parsed. Moved to <link rel="stylesheet"> in BaseLayout <head>. Browser now discovers + fetches fonts in parallel with page HTML. FCP/LCP win on the hero.

MEDIUM — Two dead preconnects (fonts.googleapis.com + fonts.gstatic.com) — site loads zero Google Fonts. Removed both. Also removed both origins from _headers CSP (style-src + font-src) for the same reason.

MEDIUM — package.json version was "5.0.0-alpha" while site footer showed v5.11.0. Bumped to 5.12.0 + updated description to match reality (Neue Machina + Neue Montreal + Supply Mono, not PP Editorial).

LOW — Email address was in plaintext in contact.astro inline script (Cloudflare mailto-obfuscation doesn't touch JS). Split into an array + join("@") at runtime so basic scrapers don't harvest.

BONUS — AP monogram SVG went silver-on-cream in light theme (invisible). Added light-theme override that switches letter gradient to deep-ink → purple.

BONUS — 14.5MB unreferenced favicon.png (duplicate of the old ap-monogram binary) was still shipping in every deploy. Removed. public/ went from 16MB to 1.3MB.

v5.11.0 6-type pentester-persona audit — security, a11y, perf, SEO, content, UX. All clean. No fixes needed.

Ran a strict 6-audit pass against every route after the typography + AP mark + Mission OS wallpaper + merry-go-round changes. Framed as a pentester | senior web-dev reviewer.

SECURITY. CSP restricts to self + Fontshare + Google Fonts + Cloudflare Insights beacon — no wildcards, no unsafe-eval. HSTS with preload. COOP + CORP set. X-Frame-Options SAMEORIGIN. Zero fetch/XHR at runtime confirmed. Grepped all source for http:// (only false positives: XML/SVG namespace declarations) and for credential-shaped strings (only false positives: word "password" in Nexus copy). No hardcoded secrets, no exposed .env, no third-party analytics beyond Cloudflare's privacy-preserving beacon.

ACCESSIBILITY. Lighthouse mobile a11y = 100 on / , /about, /contact, /mission-os, /nexus, /work — the six routes audited this pass. Zero failures. Focus-visible on every interactive element, aria-hidden on decorative SVGs, semantic HTML throughout, prefers-reduced-motion honored on every animation.

PERFORMANCE. Lighthouse mobile Perf = 99 on every audited route. Bundle audit: largest CSS bundle 52KB (Mission OS demo — 6 apps inline), all others 8-16KB. Largest HTML 114KB (/status, 24 changelog entries), most routes 30-47KB. Total dist 17MB. Zero external asset requests beyond Fontshare + Google Fonts + Cloudflare beacon.

SEO. Lighthouse SEO = 100 on every audited route. Sitemap.xml generated at build with real lastmod. Structured data (Person | Organization | WebSite JSON-LD graph) on every page. Canonical URLs per page. Robots.txt allowlists current AI crawler generation. Feed.xml (RSS) for the changelog.

CONTENT. Grepped for stale references: v4.7 (only in historical changelog entries, correct); Sacred Text | PP Editorial | JetBrains Mono (only in inline comments explaining the previous stack, no runtime references); first-year student (0 hits — 2nd-year update landed cleanly across all pages); TODO/FIXME/HACK (0 hits in runtime code).

UX. Every dock icon in the demo now opens a real informational window. Every ⌘K palette command executes. Contact form terminal composer routes to mailto with all fields. Every internal link resolves to a real page. Keyboard nav works on all custom controls (Home/End/PageUp/PageDown on palette, arrow-key nav on installer, Escape closes windows).

Result: no fixes required. Site is in Awwwards submission shape.

v5.10.3 Merry-go-round scroll animation on featured projects (3D Y-axis rotation tied to scroll).

Featured project cards on / and /work now rotate around the Y axis as they move through the viewport — cards enter facing slightly away from the viewer, rotate to face-on at center, rotate away again as they exit. Combined with a subtle vertical rise it reads like cards on a slow-turning wheel.

Even-index cards rotate one way, odd cards the other — the "wheel" is shared by both sides so the motion doesn't feel like N identical animations. 1600px perspective + transform-style: preserve-3d on cards.

Zero JS, GPU-only transforms via CSS animation-timeline: view() driven by scroll position. Falls back to static end-state on browsers without scroll-driven animations, and honors prefers-reduced-motion.

v5.10.2 Nexus case study — v11 preview section added (UI overhaul in prep, security core unchanged).

Added a "v11 · in prep" section to /nexus. Explains what changes (full visual rebuild — lock screen, vault browser, credential and note detail, settings, updater), what does NOT change (every v10.x vault opens unchanged, AES-256-GCM stays, Argon2id stays, Windows Hello stays, portable mode stays, zero telemetry stays), when it lands (no fixed date — external hardening pass + a11y audit must both be green), where the mockups are (internal PDF pack, will replace concept mockups on this page once v11 ships).

v11 is framed as a design + interaction refresh, NOT a security rewrite — protects reader trust while acknowledging the visible overhaul.

v5.10.1 About: 2nd-year update + investor-ready traction section. Mission OS: developer + designer + systems-engineer personas.

About page — second-year VFX student now (was first-year across /about and /3d). Timeline updated: 2025 first studio + program start, Early 2026 Kanvaz open source, Jun 2026 Nexus/Kanvaz/Veris in flight, Aug 2026 second year begins + Mission OS internal testing.

About "For investors + collaborators" section added between principles and stack. Six real traction numbers (products shipped/in-flight, open-source ratio, test coverage, telemetry count = 0, dependencies count = 0, design-through-shipping loop = 1 person) plus a three-paragraph thesis: (1) principled solo studio is undervalued now, (2) product order — Nexus flagship, Mission OS OS-scale bet, Kanvaz/Obscura trust anchors, (3) what I don't need (growth marketing, agency handoffs, headcount) and what I do want (intros to founders/investors/OSS maintainers with matching thesis). All numbers verifiable in repos or the /status changelog.

Mission OS case study — added "Who this is for" section with three explicit persona cards: the developer (Linux laptop that doesn't phone home, apt + KDE + Docker + VS Code + hardened Firefox), the designer (color-managed KDE, real font rendering, Blender/Krita/Inkscape/GIMP in mission-store, treats desktop AS the product), the systems engineer (audit-friendly Debian base, LUKS2 + Argon2id, secure-boot, TPM-sealed unlock, GPLv3 diff inspectable). Answers "why would a developer or designer use this OS" — was implicit before, now explicit.

projects.ts Mission OS tagline + description rewritten to name developer + designer + systems engineer as the three target audiences explicitly.

v5.10.0 Real custom scrollbars + AP monogram + Mission OS demo full rework (real wallpaper, light theme, visible icons).

Custom scrollbars — actually custom this time. Killed the browser buttons/arrows at the top and bottom of the track that were leaking through (::-webkit-scrollbar-button + all its permutations set to display:none + width:0). Thumb switched from a plain purple bar to per-theme visual: dark gets a metallic-purple gradient (matches the "metallic shine on scroll" ask); light gets a cream-parchment gradient (matches the "creamy effect" ask), both going to purple on hover.

AP monogram — recreated as inline SVG from the reference image. Silver A+P letters inside a purple ring with a soft glow. Now the nav brand mark on every page. Pure vector, scales to any size, dims the glow in light theme so it doesn't clash with the parchment cream.

Mission OS demo wallpaper — proper composition. Killed the tiny "created by p4inz@mission-os" text watermark and replaced with a real wallpaper: big centered M monogram inside a triple concentric ring system with four orbit dots at the cardinal points, "MISSION OS" wordmark below, mono version tag, an outlined chip listing the four pillars with icons, and mono corner marks (build meta top-left, author bottom-right). Reads like a real OS wallpaper made by a designer.

Mission OS demo light theme — the demo used to hard-lock body background to #050210 regardless of site theme. Now respects the site's theme: dark theme gets ultraviolet OS, light theme gets a day-mode parchment OS with softer purple glows and inverted dot grid. Both stay Mission-OS-branded.

Dock icon visibility — icons + labels were "muted grey" which was nearly invisible on the dark wallpaper. Now: labels are bright cream + uppercase + slightly wider tracking, glyphs are purple-bright with a soft drop-shadow glow, hover deepens with a purple tint and lifts 3px. Focus rings still work.

v5.9.0 Awwwards polish — scroll-progress hairline, motion QA both themes.

Added a hairline scroll-progress bar at the top of every page (2px, purple-bright, fixed at top). Fills 0 → 100% as you scroll the page via CSS animation-timeline: scroll() — zero JS, zero paint cost. Falls back to invisible (scaleX 0) on browsers without scroll-driven animations, and honors prefers-reduced-motion.

Hidden on the /mission-os/demo route — the demo has its own ribbon at the top and doesn't want the site's scroll indicator competing with it.

Final motion QA: manifest bridge on / (v5.1-alpha), FeaturedShowcase card entrances on / and /work (v5.7.0), scroll progress (this ship). Every scroll-linked animation respects prefers-reduced-motion.

v5.8.0 Full 11-route Lighthouse audit + fixes — 99 perf | 100 a11y | 100 BP | 100 SEO across every page. MetaTag redesigned.

Ran Lighthouse mobile against every real route (11 pages) after the typography + StatusPill redesign. Results: Perf 99 on every route (up from 91 live earlier — the typography swap kept the numbers, the Neue Machina/Neue Montreal families load fast on Fontshare). BP 100 and SEO 100 across every route. A11y 100 on 9 of 11.

Two a11y issues surfaced and fixed:

/contact — label-content-name-mismatch on the two custom select buttons (service + budget). aria-labelledby pointed only at the outer prompt label, but the visible text inside the button was "select one" (or the selected value). axe wants the visible text to be part of the accessible name. Fix: added an id to the inner value span and made aria-labelledby reference both the outer label AND the inner value ("c-service-label c-service-value"). Screen readers now announce "› service, select one" — matches what users see.

/kanvaz — heading-order: the "What's inside" Section only had an eyebrow, no heading prop, so it emitted no <h2> — and the feature-cards inside used <h3>. h1 → (nothing) → h3 skipped a level. Fix: added a real heading ("Plugin system, safer container, real CI.") to the Section so the sequence is now h1 → h2 → h3.

MetaTag redesigned (v5.6.3 continuation): dropped the rounded-pill + surface-tint treatment (Vercel-adjacent AI-tell). Now plain small-caps mono with a bar marker on the left, matching the new editorial StatusPill language.

Full audit results archived in scratchpad for reference.

v5.7.2 Content audit — Mission OS milestone softened to honest, Nexus v11-in-prep flagged.

Mission OS nextMilestone was "First ISO for public testing (targeting mid-August)" — August 10 is now. Softened to "First public-testing ISO — release once internal testing signs off" and expanded the notes: "shipped when it's honest to ship." No fixed date until the four-pillar acceptance suite is fully green.

Nexus currentVersion stays at v10.12.0 (v11 not confirmed shipped yet), but nextMilestone updated to "v11 · new UI + final release currently in prep" and notes acknowledge the v11 refresh is in flight. Case study will refresh when v11 ships and screenshots are available.

Every other project record checked; nothing else was date-anchored or stale.

v5.7.1 Info-page polish — /services editorial rewrite + FAQ, /work uses FeaturedShowcase, /3d gains meta + queue.

/services: killed the "01 | 02 | 03 | 04 bento" AI pattern. Rewritten as editorial rows — each service is a big sticky-indexed row with room for name | short pitch | bullets | CTA. Added lede-meta grid (How to start | How I bill | Where I'm based) and a real FAQ section (NDAs | subcontracting | IP | warranty | availability).

/work: replaced the flat vertical ProjectCard stack with FeaturedShowcase (the same scroll-animated hero-scale cards as the home page). The Supporting grid stays as ProjectCard compact.

/3d: still awaiting real 3D renders, but the page now shows intent — meta grid (Program, Stack, Focus, Availability), a "What's landing here soon" queue with R1-R4 items, and a real CTA for shot-scoped freelance work. Honest placeholder, not a lorem-ipsum wait screen.

All three pages consistent with the v5.6.3 typography (Neue Machina + Neue Montreal + Supply Mono) and the v5.6.3 rules against numbered-bento + Vercel-pill AI-tells.

v5.7.0 Home hero: featured works showcase — hero-scale cards with scroll-linked position animations replaces the compact grid.

Home page was flagged as too empty — the featured projects were stuffed into a 2-column bento grid where each card got about ~200px of screen. Replaced with a proper showcase: each featured project gets a full-width, hero-scale card (~60vh tall on desktop) with its own three-column layout — serial index | body | visual — and its own scroll-linked entrance.

Each card is a three-column grid: big serial index ("01 | 04") on the left as an editorial marker, content in the middle (status marker + huge project name at clamp(32-52px) + italic-purple tagline + description + meta tags + CTA link with animated arrow), placeholder visual frame on the right (colored gradient carrying the project name/slug/license — will hold real screenshots once assets ship).

Scroll-linked position animations via CSS animation-timeline: view(): each card rises + fades + scales from below as it enters the viewport, settles into place near center. Cards get slightly different lateral drifts (2nd card drifts left, 3rd drifts right) so the sequence reads as designed choreography, not one motion applied N times. Zero JS. Falls back to static end-state in browsers without scroll-driven animations, and honors prefers-reduced-motion.

New FeaturedShowcase.astro component under features/. Old ProjectCard is still used unchanged in the Supporting grid ("Also on the shelf") below.

v5.6.6 Command palette polish — recent searches, match highlighting, richer keyboard nav, better empty state.

Recent searches: every command you open gets saved to localStorage (max 5, keyed by action). Next time you open the palette with an empty query, those recents show up as the first "Recent" group above everything else.

Match highlighting: matched substrings inside result titles and subs get wrapped in <mark> with a soft purple background — makes it obvious why a result matched, especially useful for multi-token queries.

Richer keyboard nav: added Home | End (jump to first | last), PageDown | PageUp (jump 5 at a time) on top of the existing ↑↓ and Enter | Escape. Footer legend rewritten to advertise the full set.

Better empty state: instead of "No matches" the palette now shows "No matches for 'X'" plus a row of clickable suggestion chips (work · mission · nexus · resume · github) that fill the input on click.

v5.6.5 Mission OS demo enrichment — About, Terminal, Files, Settings all got real substance.

Called out on the Mission OS demo being thin. All four content-carrying apps got substantive content:

ABOUT app now has three real sections: Project (unchanged, from projects.ts), System (kernel, base, init, shell, filesystem, package manager — the actual Debian-Stable-plus-Mission-OS stack, plainly labeled as target-ISO values), and Stack (unchanged). New note: "Live values will populate here once the ISO ships."

TERMINAL app went from 3 commands to 6: mission-status, mission-audit encryption, mission-privacy status (new), mission-net status, mission-store list --installed (new — lists 8 real preinstalled privacy tools), mission-update check (new — realistic signed-manifest verification flow).

FILES app now shows a real-looking vault directory tree alongside the informational panel: 3 .mos vault containers with unlocked/locked badges + real sizes, standard home folders (Documents, Downloads), hidden .mission config folder, a recovery-key.qr.png with a "move to vault" warn badge. Zero real filesystem data.

SETTINGS Privacy panel expanded from a flat list of 5 toggles into four grouped sections (Data collection | Network | Browser | Filesystem) with 11 total toggles. Every locked toggle has a plain-text "why it's locked" explanation. Adds Diagnostic reports (locked off), DNS over HTTPS (locked on), Route through Tor, Anti-fingerprinting (locked on), Index recent files, Generate image thumbnails.

None of the new content is fabricated — every command, toggle, and file name maps to a real Mission OS feature planned for the shipping ISO or to a real Debian/Firefox default.

v5.6.4 Custom themed scrollbars site-wide + About page proper redesign (identity, timeline, principles, stack, availability).

Custom scrollbars applied to every scrolling surface — page, modals, dropdowns, dock windows. Chromium/Edge/Safari via ::-webkit-scrollbar family, Firefox via scrollbar-width/scrollbar-color. Track is transparent so it doesn't fight the page bg; thumb is a subtle line that darkens to purple on hover — reads as intentional rather than system default. Overflow surfaces inside modals (CmdK list, DemoWindow body, terminal-select list) get a narrower 6px thumb so app-scale scrollbars don't fight the page-scale one.

About page rewritten end-to-end — the previous 3-paragraph lede + 3 credential rows read as generic AI-portfolio About. New structure: identity hero, "short version" story (4 paragraphs, real journey), Timeline (5 anchored dates), 5 working principles I actually live by (no telemetry | explain the trade-off | content-accurate | one person whole product | free-forever when possible), Current stack section with per-technology "verdict + reason" (WPF, Avalonia, Electron+JS, Debian/Qt, Astro, TS) — explains WHY each choice, not just what, Identity section mapping real name | current handle | retired handles | current studio | previous studio | canonical source, Availability section describing three shapes of freelance scope (short-loop | product build | studio work), Contact anchor.

Every claim on About is either verifiable in projects.ts | repo READMEs, or drawn from Atharva's own words in prior sessions. No invented facts.

v5.6.3 De-AI-fy pass — new typography (Neue Machina + Neue Montreal + Supply Mono), StatusPill redesigned, top-5 AI-tells removed.

Called out on the AI-generated feel of the site — specifically the status pills on case study heros. Ran a 2-approach audit and found 10 concrete AI-tells; the top 5 land in this pass, the rest in v5.7.

Replaced PP Editorial New (display + body) and JetBrains Mono with a three-family split from Fontshare: PP Neue Machina for display, PP Neue Montreal for body, PP Supply Mono for mono. No new font domain — Fontshare was already CSP-allowed.

StatusPill redesigned. The purple-border pill + dot + mono-uppercase treatment was the Vercel-default that shows up on every AI-generated portfolio. New design is an editorial marker: a small colored bar-slash on the left, state label in the display family at Sentence Case, version tag in mono at 88% size with a mono forward-slash separator. No rounded pill, no dot, no border ring. Reads as an editorial tag on a magazine spread, not a status badge.

Killed the "Selected work" eyebrow on the home page — a generic AI-template phrase. The section heading ("Four things I'm shipping right now.") carries the intent on its own.

Dropped the --aurora radial-gradient blob background from the featured project card. Replaced with a flat surface + a hairline purple top rule — reads as an editorial placeholder frame, not a "hero blob".

Deferred to v5.7 (info-page polish): backdrop-blur nav, fluid clamp() everywhere, section eyebrow/heading/intro trio pattern, meta-tag row on case-study heros, italic-purple emphasis phrase sweep.

Skills used: taste-skill (anti-slop + typography), frontend-design (typography), design (font pairing), redesign-skill (audit-first), receiving-code-review, verification-before-completion.

v5.6.2 Light theme parchment grain — cream now reads as real cotton paper, not flat #F3EDDD.

The Parchment Manuscript light theme was correct color-wise but felt flat — cream without texture is just a beige rectangle. Added a two-layer paper-grain effect that turns it into something that reads like real cotton paper | parchment.

Two inline-SVG feTurbulence layers on ::before + ::after of body: layer 1 is fine noise at 240px tiles (like fiber specks), layer 2 is coarser fractal at 480px tiles (like paper grain). Both apply mix-blend-mode: multiply so they darken the cream selectively rather than adding white noise. Combined opacity keeps it as texture, not visual noise — subtle enough not to distract, clear enough to feel intentional the moment you switch to light theme.

Zero external assets — SVG is inline data-URI, no HTTP request, works offline. Fixed positioning so the paper stays put as you scroll (matches how a real sheet behaves). z-index -1 so it sits behind all content and never affects interactions.

Dark theme skips this entirely (Ultraviolet Cathedral doesn't want parchment grain). The Mission OS demo route also skips it — the OS-metaphor forces its own dark aesthetic and paper texture would leak through as dust over the desktop.

Skills used: taste-skill, minimalist-skill (texture is texture, not decoration), frontend-design (chose SVG feTurbulence over PNG/base64 for scale + weight + control), verification-before-completion.

v5.6.1 Contact page — terminal UI/UX restored from v4, with mailto composer that never touches a server.

The v5 /contact was a plain three-row link list — missed the whole point of the v4 terminal-form treatment. Restored the terminal metaphor and made it better than v4.

Left column: identity anchor (name, role, location), a mono-tagged channel list (Email | Discord | GitHub | Studio), and an availability indicator with a real pulsing dot ("Freelance capacity: selective, taking new work"). Sticky on desktop so it stays visible as the form scrolls.

Right column: proper macOS-style terminal card with three traffic-light dots + "msg — mailto composer · no data leaves this page" title bar. Five fields — name, email, service (custom select), budget (custom select), message — all styled as `› field` prompts. Underline-only inputs that light up in purple-bright on focus. Selects are custom keyboard-accessible listboxes (ArrowDown/ArrowUp/Enter/Escape all work), not native controls.

Submit builds a mailto: URL with a formatted subject + body carrying every field, opens the visitor's mail client. There is no backend, no fetch, no third-party form service — the "no data leaves this page" claim is literal. Guaranteed to always work, guaranteed to never leak.

iOS Safari auto-zoom guard: all inputs bump to 16px below 640px viewport width so tapping into a field never triggers the auto-zoom.

Skills used: taste-skill, redesign-skill, ui-ux-pro-max (form a11y + keyboard nav), receiving-code-review, verification-before-completion.

v5.6.0 Completeness pass — humans.txt, ai.txt, opensearch.xml, manifest.webmanifest, browserconfig.xml, RSS feed, and every rel/meta link tag wired up.

This is the "the website is itself a project" pass — a portfolio should carry every discoverability + politeness doc the web has, not just the two everyone ships. Extra points for reviewers who look for it, real interoperability with the tools that consume these files, zero user-visible surface change.

humans.txt — the counterpart to robots.txt (TXT authored by | for humans). Lists team, site, technology stack, and a short notes section. Convention since 2011, still a signature of considered work when present.

ai.txt — emerging complement to llms.txt. Explicit stance on training, verbatim reproduction, personality-cloning, and identity resolution. Reduces ambiguity for AI systems parsing the site.

opensearch.xml — OpenSearch description. Browsers offer "Add this site as a search engine" when this exists, letting a visitor search the portfolio directly from their URL bar.

manifest.webmanifest — Progressive Web App manifest. Site can be installed to home screen on Android | iOS | desktop, shows with the right name, colors, and icon.

browserconfig.xml — Windows tile | Edge pinned-site metadata. Small file, matches theme color.

/feed.xml — RSS 2.0 feed for the changelog. Every version bump becomes an <item>, readers can subscribe via any RSS client. New Astro endpoint.

BaseLayout <head> now carries the full complement of link + meta tags to advertise all of the above: rel="manifest", rel="mask-icon", rel="apple-touch-icon", rel="alternate" for RSS, rel="search" for OpenSearch, rel="author" pointing at humans.txt, rel="license", rel="me" for GitHub + email, plus application-name, apple-mobile-web-app-* pack, msapplication-*, format-detection=telephone=no, author. Ten+ new discovery hints per page.

v5.5.0 SEO + discoverability pass — real sitemap, refreshed llms.txt, RFC 9116 security.txt at both paths, JSON-LD person/org/website graph.

robots.txt: uncommented the sitemap directive (was blocked on "single-page-app" v4 assumption — v5 has 14 real crawlable URLs). Added explicit Allow blocks for the current generation of AI crawlers: OAI-SearchBot, ChatGPT-User, anthropic-ai, Claude-Web, GoogleOther, Perplexity-User, Applebot, Applebot-Extended, cohere-ai, Bytespider, Meta-ExternalAgent — on top of the existing GPTBot | ClaudeBot | Google-Extended | CCBot | PerplexityBot.

sitemap.xml: added at /sitemap.xml as an Astro API endpoint. Emits all 14 real routes with priority + changefreq matched to how often each page updates (home + status = weekly, contact + accessibility = yearly, etc). lastmod is stamped at build time so every deploy refreshes it.

llms.txt: full rewrite. The v4 version referenced #-fragment routes ("visit /#/work") which are dead in the v5 build. Now points at real routes, adds Pursue OS (was missing entirely), updates every project status to reality, and adds a dedicated "Identity resolution" section mapping Atharva Patil ↔ p4inz ↔ p4inz-code ↔ Northbyte Studios so AI systems can resolve queries against any of those handles.

security.txt: served at both /.well-known/security.txt (RFC 9116 preferred path) and /security.txt (legacy tooling). Both list Canonical for both paths per spec. Expires bumped to 2027-08-10.

_headers: rewrote the comment block — the previous notes described the v4 single-HTML monolith which is no longer the case. CSP unchanged (still correctly allows Astro's inline theme-boot script + component-scoped styles + Fontshare + Google Fonts + Cloudflare Insights beacon). Added Content-Type overrides for /sitemap.xml (application/xml) and /.well-known/security.txt (text/plain). Added Cross-Origin-Opener-Policy: same-origin, Cross-Origin-Resource-Policy: same-site, and interest-cohort=() to Permissions-Policy as modern hardening.

JSON-LD entity graph in BaseLayout — one <script type="application/ld+json"> on every page with a schema.org @graph of Person (Atharva Patil, alternateName p4inz + p4inz-code) + Organization (Northbyte Studios) + WebSite. Person node has sameAs links to GitHub profile, Discord invite, and every open-source repo. This is the change that most directly helps Google + LLM search queries for "p4inz" resolve back to this site as the canonical source. Added <link rel="sitemap"> and <link rel="me"> pointing at the GitHub profile for good measure.

Skills applied: writing-plans (audit scope), taste-skill (killed stale copy), verification-before-completion.

v5.4.0 Deep 20-pass theme audit — three real fixes: dark --muted-2 contrast, light --muted-2 on darker surfaces, warn amber in light theme.

Ran a systematic 20-pass audit across both themes covering contrast, focus, motion, SVG safety, data-layer discipline, theme parity, hardcoded colors, semantic HTML, alt text, keyboard nav, component reuse, meta tags, font loading, palette-in-both-modes, mobile chrome, empty states, JS-off resilience, and version-tag sync. 17 passes were already clean. Three fixes landed.

Dark --muted-2 brightened from #726D88 (4.06:1 on --bg, failing AA for small text) to #8A83A5 (~5.3:1, passes AA). Still visibly dimmer than --muted (~7.9:1), so the tertiary hierarchy is preserved. Site-wide fix — covers all 40+ selectors that use --muted-2 at 10.5-12px without needing per-selector overrides.

Light --muted-2 slightly darkened from #6E6383 to #5E5378 so small text on the darker surface tiers (--surface-2 #DFD5BC, --surface-3 #CCC0A2) also passes AA, not just on --bg.

Warn amber #FFC04D was hardcoded in StatusPill (comingSoon) and pursue-os.astro (notice + status warn). On light theme, amber-on-cream scored ~2.1:1 for text — clear WCAG-AA fail. Fix: added two tokens — --warn (visual amber, pure #FFC04D in both themes, used for dots/borders/tint backgrounds) and --warn-text (contrast-safe text amber; #FFC04D in dark, #8A5A00 dark amber in light, ~5.3:1 on --bg). Every text use switched to --warn-text; decorative uses stay on --warn.

Skills applied: taste-skill, ui-ux-pro-max (a11y > usability > perf > taste), redesign-skill (audit-first), receiving-code-review, verification-before-completion, systematic-debugging.

v5.3.2 Mission OS demo — reachable via ⌘K, top bar keeps clock/date visible on mobile.

Added "Mission OS · concept demo" to the ⌘K command palette under Case studies. Also indexed on the search keywords "demo", "os", "desktop", "boot". Previously the demo route was only reachable via the "Try Mission OS in your browser →" CTA on the case study — now it's one keystroke away from any page.

Mobile top bar polish: clock + date stayed hidden below 900px, which was aggressive since a phone-sized OS chrome benefits most from a visible clock. Chips + workspace pips + active-app label drop first; clock + date stay through the smallest breakpoint. Font-sizes trimmed on the smallest screens to keep the whole strip on one line.

v5.3.1 Mission OS demo — every dock app is now clickable. Files | Terminal | Firefox open real informational panels.

v5.2.2 shipped Files, Terminal, Firefox as visually-dimmed "not part of demo" placeholders. All six dock apps are now clickable and open a real window.

Files (FilesApp) — informational panel: encrypted-container browsing, thumbnails off by default (privacy), per-folder encryption profiles, recent-files not indexed. Framed as what makes Mission OS Files different, not a fake filesystem browser.

Terminal (TerminalApp) — static Konsole-style shell frame showing three real Mission OS commands and their output: mission-status (four pillars OK), mission-audit encryption (LUKS2 · Argon2id · secure-boot), mission-net status (offline-first). Blinking prompt caret honors prefers-reduced-motion. Explicitly labeled non-interactive.

Firefox (FirefoxApp) — an about:privacy-style read-only panel showing the strict defaults Mission OS ships Firefox with: DNS-over-HTTPS on, Resist Fingerprinting on, third-party cookies blocked, HTTPS-only mode, Referer trimming strict, Telemetry OFF (compile-time locked). Not a browser mockup — that would oversell — but an honest look at day-one privacy posture.

All three new apps use the existing DemoWindow chrome, plug into the same window-manager state machine, get the same dock highlight when active, and honor Escape | click-to-close consistent with the other three apps.

v5.3.0 Mission OS demo — wallpaper simplified to a single author-mark, atmospheric background only.

v5.2.2 pushed the wallpaper hard on identity (bold M monogram + pillars chip + corner note). Post-live review said it competed with the app windows rather than sitting behind them. Reverted to a minimalist wallpaper: base gradient + purple glows + Nothing-style dot grid stay for atmosphere, but the whole hero composition is gone.

Only text on the wallpaper now: a single centered "created by p4inz@mission-os" line in dim mono. Sits behind everything, does not compete for attention, reads as a quiet author-signature rather than a landing page.

Follow-ups (v5.3.1, v5.3.2) will make the dock's inert apps actually clickable and land any spillover fixes.

v5.2.3 Cleanup after go-live — 14.6MB unwired monogram removed, Node version pinned via .nvmrc.

v5 Astro workspace went live at atharvapatil.tech earlier today. First deploy verified: Lighthouse mobile Perf 91, A11y 100, BP 100, SEO 100 on both / and /mission-os/demo. Baseline was Perf 55 on the v3.35.3 monolith — a ~65% lift, exactly what the migration promised.

Removed public/assets/brand/ap-monogram.png (14.6MB). File was unwired — nothing on the site referenced it — but it was shipping in every deploy as dead weight. Will be re-added at the same path when the resized replacement arrives (target: 200×200 PNG or SVG).

Added .nvmrc pinning Node to v20 at repo root, so Cloudflare Pages resolves the same Node version every build without relying on the NODE_VERSION env var alone. Belt-and-braces for build reproducibility.

v5.2.2 Mission OS demo polish — wallpaper reads as a real OS, chrome speaks system-UI, top bar densified, dock expanded.

The v5.2 desktop looked like a generic OS mockup. A dual-lens + 7-persona audit landed a consistent verdict — the desktop wasn't asserting Mission OS identity and wasn't honoring the case study's "product-grade design applied to a serious OS" claim. This patch does four things without adding a single external asset or dependency.

Wallpaper redesigned around a real identity: a bold Mission OS "M" monogram inside a concentric-ring composition, a system-UI wordmark tracked at 0.3em ("MISSION OS"), a mono version tag ("v0.1 · pre-release · debian stable + kde plasma"), and a horizontal chip that lists the four pillars side by side (privacy-first · security-conscious · portable-first · offline-first) with small glowing dots. Bottom-left carries a mono corner-mark: "no telemetry · no phone-home · builds signed · gplv3". Background is a Nothing-style dot grid masked to a soft ellipse — pattern that reads intentional, not decorative.

Chrome font handoff — PP Editorial New has been swapped out of the desktop chrome for a proper system-UI stack (-apple-system, "Segoe UI", Roboto, Ubuntu, "Helvetica Neue", Arial, system-ui, sans-serif). Editorial serif was leaking portfolio-brand into what should read as an OS. PP Editorial stays inside app windows where editorial content is legitimate.

Top bar densified without going busy: left shows brand + activity + workspace pips (1 · 2 · 3), center shows date + time in mono ("Sat · Aug 9 · 23:27"), right shows real signal chips (Privacy · Crypto — both good/green because those are the compile-time and installer defaults from the case study), Offline icon (reflects the offline-first policy), battery, and user identity. Every chip has a title attribute explaining what it means.

Dock expanded from 3 to 6 icons with a category divider: Files, Terminal, Firefox are inert placeholder apps (visibly dimmer, cursor: not-allowed, tooltip explains "not part of the concept demo"); Installer, Settings, About stay functional. Adds affordance density without adding real complexity or overselling the demo.

v5.2.1 Bug-fix batch — command palette rendered broken on v5, two WCAG-AA regressions from v5.0 fixed.

Command palette (⌘K | press /) was rendering with a giant right-arrow SVG filling most of the modal on the v5 build. Root cause: palette items are constructed at runtime via list.innerHTML, but Astro's scoped CSS only applies to compile-time elements — so the .cmdk-item-icon svg { width: 18px } rule never matched the injected SVGs and they fell back to intrinsic size. Fix: CommandPalette style block converted to <style is:global> so runtime-injected items pick up the styles, plus explicit width="18" height="18" attributes added on the SVG strings as a belt-and-braces safety net. The v4.7 monolith wasn't affected because it never had scoped styles to begin with.

Command palette input hardened against browser autofill: type="search", name attribute, autocorrect/autocapitalize/autocomplete=off, plus data-form-type | data-lpignore | data-1p-ignore hints for password managers and Chrome autofill. The stray "so | so l | sorry" suggestion tooltip should stop appearing.

Two WCAG-AA color-contrast regressions from v5.0-alpha (introduced when --muted-2 was pushed slightly darker than v4). The 10.5px .hero-eyebrow, .section-eyebrow, and .tag were scoring 4.06:1 and 3.84:1 respectively — below the 4.5:1 threshold for small text. Fix: those three selectors now use --muted (#9B95B0) instead of --muted-2 (#726d88), pushing them to ~7.9:1 on --bg and ~7.4:1 on --surface-1.

label-content-name-mismatch axe failure on all ProjectCard anchors. The aria-label was "{name} — {tagline}" but the visible card content also included the status pill text, description, and tags — axe wants the visible label to be a substring of the accessible name. Fix: aria-label dropped entirely; the anchor now derives its accessible name from the visible text, which is more informative anyway.

Verified with local Lighthouse mobile run: home page a11y back to 100, /mission-os/demo stays at 100, performance stays at 94.

v5.2 Signature move 2/4 — interactive Mission OS concept demo at /mission-os/demo (Pouya-style OS metaphor).

A new route puts the visitor through a cold-boot → login → desktop → open-an-app sequence for Mission OS, clearly labeled as a concept demo. Every other portfolio has a video or screenshot carousel; this one has a playable metaphor of the product itself.

Boot sequence (Phase 1): typed boot line → GNU GRUB single-entry with countdown → six kernel-style log lines → login card for user "p4inz". Enter advances any stage; Escape exits to the case study; prefers-reduced-motion collapses straight to login.

Desktop chrome (Phase 2): inline-SVG wallpaper in the Mission OS palette (no external image), top bar with a live local-time clock, Offline indicator, battery chip, "p4inz@mission-os" identity, and a bottom dock with three app icons. Single-window model; clicking a dock icon opens the app, clicking again closes it.

Installer app (Phase 3): 5 of the 13 real installer screens — Welcome, Privacy Setup, Security Options, Summary, Completion. Elided steps show as honest "…" gaps in the step-dot strip so we never imply we walk all 13. Every advanced option lists benefit, limitation, compatibility, and trade-off in plain text — the case study's ethos on screen, not just in copy. Next/Back buttons, dot clicks, and Left/Right arrow keys all navigate.

Settings + About apps (Phase 4): Mission Settings shows real privacy toggles (Telemetry locked off, Location, Default browser, Tor preinstalled locked on, Wi-Fi auto-connect) each with plain-text explanation. About Mission OS reads directly from projects.ts — status, current version, license, next milestone, stack — so nothing here can drift from the real project record.

Persistent "Concept demo of Mission OS · Not a live operating system" ribbon across every stage, with role="status" for assistive tech and a keyboard-focusable Exit button. Site nav + footer hidden on this route via body:has(.demo-scope) so the metaphor holds.

Zero external assets. Zero font additions. ~4KB inline JS total for the whole demo (state machine + window manager + installer carousel + live clock). No animation libraries, no islands, no dependencies. Route stays consistent with the site's zero-JS-by-default posture.

Case study updated with a "Try Mission OS in your browser →" CTA linking to the demo. Nothing else on the case study or any other page was touched.

v5.1-beta Full historical changelog ported to v5 — 19 entries, v3.1 → v5.1-alpha now visible on /status.

The v5 /status page previously only carried the v5.0-alpha entry, with a placeholder note pointing at the v4.7 live site for older history. That placeholder is now gone — every version-bump entry from v3.1 through v5.1-alpha is available directly on the migrated status page.

Copy transcribed from the v4.7 live index.html (source of truth) with light editorial cleanup — no fabrication, no invented history. Inline bold from the v4 build was dropped intentionally for typography cleanliness; can be restored later if the ChangelogEntry type is extended.

Data layer discipline preserved: changelog now lives in src/data/changelog.ts as a typed array. status.astro reads from it — no hardcoded entries in the page. Newest three entries expanded by default; older entries collapse cleanly to keep the page scannable.

v5.1-alpha Signature move 1/4 — hero → work manifest bridge (Gabriel-style clean-and-surprising scroll).

Between the three-act hero and the Selected Work section on the home page, a compact mono-uppercase manifest bridge now reveals itself as you scroll. The three italic phrases from the hero H1 (I write software · I study VFX · I build Mission OS) reappear as the bridge — the phrases you just read become the label of what comes next.

Implementation: pure CSS animation-timeline: view() with staggered animation-range per phrase. Zero JS, zero deps, zero image weight. @supports gate — browsers without scroll-driven animations get the static end-state. prefers-reduced-motion: reduce collapses to instant. aria-hidden — decorative echo of the H1, not new content for assistive tech.

Scope: index.astro only, no shared component touched. Three similar scroll-reveal ideas are still on the list for later (a skeuomorphic hero object, an OS-metaphor demo, a second scroll moment further down the page).

v5.0-beta.2 Reusable Screenshot component + Kanvaz case study layout — 6 real screenshots wired.

Added Screenshot.astro to the component library — a framed image element with caption support that reads like a real product capture, not a stock mockup. Same pattern will apply to Nexus and Mission OS once those assets arrive.

Kanvaz case study now shows all six real captures: kanvaz-01-start, kanvaz-02-board (hero), kanvaz-03-settings-appearance, kanvaz-04-settings-developer, kanvaz-05-about (v4.2.1 build shown; v4.2.2 is current — caption states this honestly), kanvaz-06-shortcuts.

v5.0-beta Data layer + component library + all 13 pages migrated to Astro.

Full parity with the v4.7 live site: home, work, services, about, resume, contact, 3d, mission-os, nexus, kanvaz, pursue-os (new), status, accessibility.

All pages read from the typed data layer (src/data/projects.ts + src/data/site.ts). Zero hardcoded project metadata in any page — single source of truth.

Component library grown: Section, ProjectCard, EditorialHero, CaseHero, StatusPill, Tag, MetaTag, Button, ThemeToggle, CommandPalette.

v5.0-alpha Astro migration — file-system organization, component library, dual-theme system.

Full framework migration from single 15.9MB HTML file to Astro 5.18 with proper file-system organization: /src/pages, /src/components, /src/layouts, /src/data, /src/styles, /public. Zero-JS-by-default architecture with hydrated islands only where interactivity is needed (theme toggle, command palette).

Design token system rebuilt with dual themes — Ultraviolet Cathedral (dark, matches v4.x) + Parchment Manuscript (new light theme with WCAG-AA-verified pairings). Toggle stored in localStorage, prefers-color-scheme respected on first visit only. T key toggles anywhere on the site.

Data layer: single projects.ts + site.ts source of truth. All pages read from it — no hardcoded project metadata anywhere.

Reusable component library: Section, ProjectCard, EditorialHero, CaseHero, StatusPill, Tag, MetaTag, Button, ThemeToggle, CommandPalette.

Command palette (⌘K | press /) ported from v4.5. Now theme-aware and driven by data layer.

Home hero rebuilt as a multi-line narrative — a chronological personal story instead of a skill-showcase grid.

v4.7 Info-page headline pass — editorial-scale h1, italic-purple emphasis, consistent across all 6 pages.

Extend the resume/case-study editorial pattern to every remaining page in one CSS pass. Applies to /work, /3d, /services, /about, /status, /accessibility. Contact page excluded per user.

h1.page-title upgraded from 500-weight roman at clamp(30-46px) to editorial-scale 400 at clamp(38-64px), tighter -0.025em tracking, wider 1000px max. The headlines on the six info pages now read as intentional editorial statements, not as tiny corporate subheads.

.header-accent — the emphasis phrase inside each h1 ("by one person", "other half", "Three disciplines") — swapped from 700-bold-purple at 0.85em to 400-italic-purple at full em-scale. Matches the resume treatment where "founder of Northbyte Studios" is italic-purple. Reads editorial instead of shouty-highlight.

Deferred to v4.8 (final polish batch): footer refinement, /work project row card variety, /3d hero layout refresh, /services card treatment beyond the icon swap already shipped in v4.1. Contact page still excluded.

v4.6 Case-study editorial polish — italic serif titles, quiet mono eyebrows, cap-compliant eyebrow density.

Apply the resume editorial pattern to all three case studies (Nexus, Kanvaz, Mission OS).

Typography. h1.case-title upgraded from 500-weight roman at clamp(38-64px) to italic 400 at clamp(42-72px) with -0.025em tracking. .section-heading upgraded to italic 400 at clamp(26-36px). Matches the Sacred Text stack used in the resume hero.

Eyebrow discipline (taste-skill §4.7). Section-eyebrow density was over cap on all three: Nexus 5/6 sections (cap 2), Kanvaz 3/4 sections (cap 2), Mission OS 9/11 sections (cap 4). Culled to compliant: Nexus 2, Kanvaz 2, Mission OS 4. Kept the strongest anchors ("The Problem", "Current Status & What's Next"); dropped repetitive filler labels ("The Solution", "Status", "Security Made Visible", "Core System Components"). Section headings alone now carry the structural information.

Eyebrow styling. .section-eyebrow rewritten from 12.5px uppercase in purple-bright to 10.5px JetBrains Mono uppercase in muted-2 with 0.14em tracking. Reads quieter, more editorial, less accent-sprayed.

.status-pill rgba updated to v4.0 palette (184,157,255 not old 157,127,255) and typeset in JetBrains Mono for consistency with meta-tag.

.hero-actions center-align removed — case study heroes are left-aligned; the CTA row should follow the content, not center itself.

v4.5 Command palette (⌘K | press /), Glint marked On Hold, Nexus Releases + Discord links added to resume.

Something new beyond static HTML. Recruiter-recognized devtool signal that is also genuinely useful for anyone browsing the site.

Command palette — press ⌘K on Mac, Ctrl+K on Windows/Linux, or "/" anywhere. Opens a search-first modal with all 9 pages + 3 case studies + 5 external project repos + email/discord/github actions. Fuzzy match on title, path, and keyword. Arrow keys navigate, Enter opens, Escape closes. Backdrop click closes. Focus returns to the trigger after close. Vanilla JS, ~180 lines, zero dependencies.

Glint marked "On Hold" in 5 locations — work-page project row, /work-row description, resume tier2 badge, resume current-status line, and /status page entry. Repo still linked; users know it is real, just paused.

Nexus resume — real repo + Discord links. Notes block previously said "no public repository at this stage" which read like a red flag. Now it says "Source is proprietary; the public repo hosts releases and community discussion only" with two link buttons: Releases on GitHub and Beta on Discord.

v4.4 Resume page redesign — editorial hero, meta grid, Downloads pinned to header, killed the 8× repeating eyebrow pattern.

Second "special" page after the home page. The resume was structurally correct but visually templated — every one of 8 sections opened with the same "small mono-uppercase label + purple gradient bar + serif heading" trio, which reads more corporate-template than editorial-portfolio.

New header treatment. The h1 name is now editorial-scale italic PP Editorial New at clamp(44px, 6.5vw, 72px) with a calm subhead role. Contact meta reorganized from a flat comma-separated row into a 2-column grid where each item has a monospace uppercase label (Email | GitHub | Discord | Based in) sitting above the value.

Downloads pinned to the header actions column. Previously the PDF and Markdown download buttons lived at the bottom of the page — recruiters had to scroll past every section to find them. Now they sit top-right of the resume header. A small inline script clones the two <a download> anchors from the bottom block into the header slot without duplicating the base64 payloads.

Killed the gradient-bar eyebrow pattern. The .resume-section-label::before pseudo-element was rendering a purple gradient rectangle before every single section title (8 identical instances) — taste-skill §4.7 caps eyebrow density at 1 per 3 sections. Removed entirely; labels are now plain monospace uppercase text.

v4.3 Card tilt restored, AP mark gets a single orbit dot for continuous life.

User feedback: v4.2 killed the cursor-driven card tilt as part of the simplification pass. That was the favourite interaction. Bringing it back, plus giving the AP logo a small always-on signal so it does not feel dead between hover-sheens.

Restored: cursor-driven 3D tilt on .project-card, .project-row, .proj-card (rotateX + rotateY driven by pointer position, max 5deg + 8px translate). Magnetic pull restored on the six real card surfaces plus CTAs. Still off the .glass catch-all so nav | sidebar | footer do not chase the cursor.

AP mark — one orbit dot. A single small purple beacon travels the outer ring at 22s per revolution, replacing the four rotating rings from v3.x.

Reduced-motion: orbit disabled under prefers-reduced-motion, mobile size overrides match the ring wrap (160px vs 200px).

v4.2 Simplification pass — removed over-effects to reach "simple yet professional" feel.

User feedback: v4.1 felt over-designed. Direction changed from "add signature moments" to "remove one accessory before leaving the house." One large pass, no new features.

Removed: four floating "pillar-sym" decorations (</>, { }, AES-256, 24fps text drifting in the background). Cute but pure decoration — the type has to carry the character now.

Removed: custom cursor with its dot | ring | VIEW | GO | SEND label swap. taste-skill 9.A bans custom cursors as an AI-tell that is also accessibility-hostile and perf-hostile. Default OS cursor restored.

Removed: 3D perspective tilt on scroll reveal, cursor-driven 3D card tilt on every project card, magnetic cursor pull on cards. Kept magnetic pull only on primary CTAs and closing panels where it genuinely adds affordance.

Toned down: the two giant purple orbs at page top-left and bottom-right (opacity from 0.18 | 0.10 to 0.08 | 0.05, radii reduced) so they remain as background atmosphere but no longer read as "purple juicy" glow blobs.

Signature moment preserved: the AP logo mark's hover-sheen sweep is still the one intentional interactive on the page. It only lands because everything else is now quiet.

v4.1 Home-page polish: thumbnail crop fix, meaningful service+credential icons, simplified AP mark with hover-sheen.

Fixes hitting user-flagged issues. No new features, just visible-quality lift on top of v4.0.

Thumbnail crop bug. .project-thumb had no background-size | background-position rule, so real screenshots on the Kanvaz, Veris, repo-map, and 3D Ref Skills project rows were rendering at natural size and cropping past the container edge. Added background-size:cover + background-position:center + overflow:hidden. One CSS rule, fixes every affected row site-wide.

Services icons — 01/02/03/04 to meaningful glyphs. The four numbered badges were decoration, not information. Replaced with Phosphor-style outline SVGs matched to each discipline: code brackets for Product | Web Dev, panel-with-input for UI | UX, palette-with-swatches for Branding, cube for 3D | VFX.

AP logo mark — simplified from 6 concurrent animations to 1 subtle glow + hover-sheen. Previous mark had 4 rotating rings plus logo float plus glow pulse — too much motion for a portfolio that claims minimal. New treatment: rings stay static, ambient glow slowed to 9s, hover triggers a metallic sheen sweep across the mark. Per frontend-design skill: spend boldness in one place; the sheen is the one memorable moment.

v4.0 Ultraviolet Cathedral redesign — full palette overhaul, PP Editorial New typography, em-dash purge, emoji-to-SVG icons.

Major visual redesign — Ultraviolet Cathedral palette. Six-month stable target. Awwwards submission candidate. Palette and typography picked from lab previews after four rounds of iteration.

Palette. Deep ultraviolet 4-tier dark base (#0A0517 → #150B25 → #1F1338 → #2B1B4F), replacing the flat #08080D. Cream text (#E8E1D0) instead of near-white, inverting the usual dark-portfolio pattern (cream-on-ultraviolet, not white-on-black-with-purple). Purple family widened: primary #B993FF (brighter), deep #7B3FE4 added.

Typography. Fraunces (taste-skill-banned default serif) and Inter (default LLM body sans) removed site-wide. Replaced with PP Editorial New (Fontshare, free) for both display and body, italic on emphasis phrases. Space Grotesk also collapsed into PP Editorial New. Single-family editorial stack, sacred-text feel. JetBrains Mono kept for code and status pills. New Content-Security-Policy allows api.fontshare.com | cdn.fontshare.com.

Em-dash purge. 234 user-visible em-dashes replaced site-wide per taste-skill anti-slop rule (word-em-word to word-hyphen-word; space-em-space-Capital to period-space; otherwise comma).

Numbered section-labels retired. "01 Selected Work", "02 Open Source", "03 3D and Visual Work", "04 Services", "05 About" all lose the numeric prefix. The section is the label.

Emoji feature-icons → inline SVG. 18 emoji icons on the Nexus and Mission OS case studies replaced with Phosphor-style outline SVGs (1.5px stroke, currentColor) for typographic consistency and screen-reader friendliness.

v3.35 Content sync — Mission OS added, Nexus v10.12.0/AES-GCM, Kanvaz v4.2.2 final, Veris polish phase, misleading Nexus GitHub buttons removed.

Content correctness pass, no design changes. The site was frozen at v3.34 for ~1 month while focus shifted to Nexus and Mission OS. Bringing every project surface back into sync with reality.

Mission OS added as the first-featured project (Nexus moves to second). New /work/mission-os case study page covering the four pillars, installer experience, install/privacy profiles, six core system components, accessibility & responsive design, engineering & testing (141/141 pixel checks passed on the installer foundation). Homepage card, /work project row, timeline, /status entry, console log, and footer nav all added. Media rule respected: no fabricated screenshots, one labeled concept placeholder for the Security Options screen.

Nexus, version v10.12.0 surfaced everywhere. AES-256 references upgraded to AES-256-GCM to reflect the real cipher (v10.12.0's NXG1 format shipped real GCM; bare "AES-256" was misleading). Roadmap grid rewritten: dropped the false "public open-source release" promise (Nexus is proprietary per Resume), replaced with the actual v10.11–v10.12 features that shipped. Both misleading "View on GitHub" case-study buttons repointed to the Discord beta invite.

Kanvaz, every "v3.7.1" | "v3 planning" | "v4.0 next milestone" replaced with v4.2.2 as the final release. Roadmap grid rewritten to describe what actually shipped. Status pill now reads "v4.2.2 · Final Release," resume next-milestone reads "dev wind-down, no v5 planned."

Veris, badge and status corrected from "Released" (never was) to "Final Polish · Pre-v1.0.0" across the project row, resume panel, and /status.

repo-map, status corrected from "in development" to "on hold" per current reality.

Glint, real repo (github.com/p4inz-code/glint) now wired to the card; the card previously linked to the GitHub profile, which felt like a broken link.

v3.34 Real browser Back/Forward, deep-linking, and an iOS input bug fixed.

Implemented a Hybrid Router: Back/Forward now navigate in-app instead of exiting the site, direct links to sub-pages work on refresh, and scroll + focus position restore correctly, all with a safe fallback for sandboxed preview contexts.

Fixed the About-page ring animation's mobile desync by making its SVG dashoffset resolution-independent (pathLength=100), with the exact same visual look preserved.

Fixed a real iOS Safari bug: the Name/Email contact fields were stuck at 14px, under the 16px auto-zoom threshold, so typing into them on an iPhone would jerk the whole page to a zoomed-in state. Bumped to 16px, matching the message field and dropdown, which were already correct.

v3.33 Nexus deep-dive, two real bugs fixed, scroll-to-top added.

Rewrote the Nexus case study using the actual README/CHANGELOG/GitHub docs instead of generic copy, corrected status back to Public Beta, named the real Argon2id key-derivation step, added Smart Collections and multi-vault/decoy-vault details, and fixed the tech-stack listing to WPF (Avalonia is a planned future cross-platform build, not the current one).

Fixed two genuine bugs: the nav could get stuck hidden after scrolling up, and the About-page stat counters stayed at 0 for anyone with reduced motion enabled.

Also tightened the homepage headline and added a scroll-to-top button.

v3.21 Kanvaz content updated with real v3.6.9 release data.

The Kanvaz case-study page previously claimed "development is complete, final release" and listed fabricated future features. Updated every mention site-wide using the actual v3.6.9 GitHub release notes and README — status, tech details, and a real roadmap (editable tags in v4, Map View wire-alignment fix) pulled from documented "known limitations," not guessed at.

v3.18 CLS regression fixed, mobile ring alignment bug fixed.

Root-caused a real measured CLS of 1.032 to font-display:swap on the Google Fonts request, switched to font-display:optional, eliminating the late-reflow shift entirely.

Also fixed a genuine mobile bug: the About-page ring elements weren't resizing with their container and were overflowing on small screens.

v3.16 Console error resolved, og:image prepped.

Closed a console error open since v3.6, root cause was a view-source link attempting window.open("view-source:..."), which Chrome blocks at the browser level (not a catchable JS exception, so the fallback never ran).

Also composed a proper 1200×630 social-card image, ready for when hosting goes live.

v3.1 Full accessibility pass.

Made 7 previously mouse-only expandable cards fully keyboard-accessible, added :focus-visible site-wide, fixed a skip-to-content link that was permanently hidden off-screen, and unified two inconsistent badge components into one.