This site is best experienced on a laptop or desktop.

Changelog

What has changed on this site from the first commit to the latest update. Full history is also in CHANGELOG.md.

Unreleased

2026-06-03live on site
Added
  • /links page: new Support section at the bottom with Patreon and Buy Me a Coffee links
  • /links page: GitLab and Codeberg profile links added under Professional, each with platform brand colours
  • README: GitLab and Codeberg profile badges added alongside the existing GitHub badge

v2.8.0

2026-05-30
Added
  • Mobile banner: slim dismissible notice below the header on screens narrower than 768px suggesting the site is best viewed on a laptop or desktop; hidden via md:hidden so it never appears on wider screens
  • git-unlocked project gallery expanded with 4 new images: 3D GitHub logo badge (card preview), Octocat with GitHub profile on laptop, Octocat and Groot figurines and close-up Octocat; card preview image updated from banner SVG to the 3D logo badge
  • /now page intro now links to nownownow.com/p/n4lZ alongside the existing Derek Sivers credit so visitors can find the listed profile
  • Colophon expanded: shadcn/ui and next-themes as separate entries; backend section adds Vercel, Resend, Beehiiv, GitHub Actions and Cloudflare Turnstile; design section adds GA4, share feature and responsive design note; new Notable pages and features section covers /lab, /blog renderer, /consumed, /changelog and OG image generation; all live status entries expanded with more detail; Vercel and Cloudflare links added to header meta
  • /now page content refreshed: updated Where I am (London for summer), Studying (FPGA/VHDL, competitive programming on Neetcode/Leetcode/Codeforces, hackathons), Building (accurate Phaemos hardware detail, World Cup 2026 AI Predictor added, This site blurb updated), Thinking about (internship search, events, Sky campus mention), Outside of work (running and hiking added)
Changed
  • PS5 Cloudflare Worker cron reduced from every minute to every 2 minutes to stay within the 1,000 write/day free tier KV limit (720 writes/day vs previous 1,440); Redis TTL for ps5:status extended from 120s to 150s to keep a 30s buffer between key expiry and the next poll
Fixed
  • Header theme toggle and hamburger menu now pin correctly to the far right on small screens; replaced the three-column grid with flex justify-between on mobile so the controls are never left drifting toward the centre when the desktop navigation is hidden
  • Mobile banner text changed from text-muted-foreground to text-foreground so it reads clearly as black on light and white on dark
  • /now page header now shows Updated live only - removed Last updated May 2026 which was misleading alongside a live indicator
  • /notes and /privacy pages updated from May 2026 to June 2026

v2.7.0

2026-05-29
Added
  • PS5 Busy mode: doNotDisturb PSN status treated as online; busy field added to Worker, API route and card
  • Notes page teaser strip: slim animated live status preview on /notes linking to /now; full widget removed from notes
  • Now and Lab added to main navigation; navigation centred in header using three-zone grid layout
  • Contact page now shows email address below the contact form
  • Footer social row reordered and simplified: All Pages, Contact, Newsletter, LinkedIn, GitHub, ORCID
  • Footer newsletter signup form removed; newsletter signup remains on /blog and /newsletter
  • Spotify card shows Spotify icon and external link to profile in card header
  • GPC daemon fetches cover art from IGDB (Twitch API) on first game detection and caches per session
  • GPC daemon sends game_image alongside game name; GPC card renders the cover art thumbnail
  • GPC daemon 5-tier game detection: hardcoded dict, Steam Web API, Epic Games manifests, EA App manifests and process-name IGDB fuzzy search
  • FiveM added to GPC game detection
  • GPC daemon cover art for GTA V, FC 26, Apex Legends, Rocket League, Overwatch 2, Fortnite, Minecraft and FiveM
  • PS5 Worker fetches game cover art from IGDB on each cron run; falls back to PSN conceptIconUrl when IGDB is not configured
  • PS5 card renders IGDB cover art when online; shows text-only last played game name when offline
  • PS5 Worker exchanges NPSSO for a refresh token on first run and stores it in KV; subsequent runs use the refresh token automatically
Changed
  • Spotify icon colour changed from Spotify green to blue to match site colour theme
  • GitHub strip moved above Discord card in live status widget
  • Home removed from navigation; avatar links to homepage
  • /uses and /now references to 'notes page' corrected to 'now page'
Fixed
  • feed.xml?raw no longer crashes with Cloudflare CPU timeout; returns raw XML directly instead of running regex transforms
  • PS5 lastGame and lastGameImage now read from lastKnown instead of the live source so the last played game persists when offline
  • PS5 card no longer shows online when console is off; API returns last genuine online timestamp rather than cron polling timestamp
  • PS5 Worker updated to current PSN client ID and required headers; old client ID was removed by PSN and caused 400 errors
  • PS5 Worker IGDB request includes Content-Type: text/plain header required by the Apicalypse query format
  • Discord activity card sorts Playing before Watching to match Discord display order
  • Discord activity large icon shows the small icon as a bottom-right overlay
  • Discord activity elapsed timestamp shows seconds in H:MM:SS / M:SS format and updates live every second
Security
  • Force brace-expansion to 5.0.6 via npm overrides to resolve CVE-2026-45149 (GHSA-jxxr-4gwj-5jf2)

v2.4.0

2026-05-27
Added
  • Share button on project detail pages, blog posts, /cv and /links - Web Share API with clipboard fallback and 2-second 'Copied!' confirmation
  • Open Graph thumbnails on every public page via /api/og - dynamic per-page title and description
Changed
  • Em and en dashes removed throughout the site; replaced with hyphens
  • Oxford commas removed throughout

v2.3.0

2026-05-20
Added
  • /consumed page: 49 YouTube videos, 12 Spotify podcasts and 10 books logged for 2026; content sorted oldest to newest across January to May; All tab groups by month; click-to-play video facade; music section links to the Notes page Spotify widget
  • /now page: snapshot of what I am doing right now covering location, studying, building, reading, thinking about, outside of work and listening; inspired by nownownow.com
  • /uses page: all the hardware, software and tools I use day to day
  • /colophon page: how the site is built, the full stack and the decisions behind it
  • /changelog page: this page, full version history from the first commit
  • Dark/light mode crossfade: 150ms ease transition on theme toggle instead of instant swap
  • Next and previous post navigation at the bottom of every blog post
  • Blog reactions: thumbs up, flame, lightbulb and heart per post stored in Redis; one click, no comments
  • Post series grouping: series and seriesPart fields on BlogPost; SeriesBanner component on post pages; series indicator on post cards
  • Hall of Fame reframe: personal acknowledgements (God, mum, dad) lead the page before security researchers
  • Command menu searches projects and includes all hidden pages in a More group
  • Gaming PC daemon, API route and live card: NVIDIA RTX 4060 GPU%, CPU% and active game via pynvml, runs via NSSM
  • Lenovo daemon, API route and live card: battery and charging state via NSSM service
  • Spotify device name shown in the card label when actively playing
  • Spotify podcast and episode support: episode title, show name and episode artwork shown the same as tracks
  • Spotify last played: when nothing is active the card shows the previous track or episode in a greyed-out grayscale state
  • Real-time Spotify progress bar: ticks forward every second client-side and snaps to the true position on each API poll
  • RSS feed 'View raw XML' button: opens a syntax-highlighted dark HTML view of the raw feed with colour-coded tags, attributes, CDATA and processing instructions
  • Scrolling marquee on long Spotify track titles: title scrolls continuously when it overflows the card width, looping seamlessly; short titles stay static
Changed
  • /consumed description updated to 'so far this year' to reflect ongoing additions
  • Gaming PC card restructured: offline state shows only last-seen; GPU, CPU and game fields are live-only
  • Live status layout: time card moved to the left column and MacBook card to the right in the two-column row
  • Spotify polling interval reduced from 30s to 10s so track changes appear faster
  • GitHub icon replaced with GitBranch from lucide-react in the last-pushed card
Fixed
  • YouTube and Spotify embeds blocked by CSP: added www.youtube.com and open.spotify.com to frame-src
  • Gaming PC card CPU and GPU combined onto one line to prevent the card expanding taller than others
  • Charging state hidden on device cards when last daemon update is more than 5 minutes old
  • Separator and icon visibility improved in both light and dark mode
  • Sitemap missing 7 pages: /now, /consumed, /uses, /changelog, /colophon, /all-pages and /privacy were live but not indexed by Google
  • RSS feed unstyled in Chrome: Chrome 131 dropped XSLT support; the feed now serves a styled dark HTML page to browsers and raw XML to feed readers
  • Spotify podcasts not showing in widget: the player API call was missing ?additional_types=track,episode so Spotify silently returned nothing for episodes

v2.2.0

2026-05-18
Added
  • Dynamic OG images per blog post and project page via Next.js ImageResponse
  • Article JSON-LD structured data on all published blog posts
  • Beehiiv past newsletter issues on the newsletter page, cached in Redis
  • Related posts section at the bottom of each blog post (up to 3 shared-tag matches)
  • GitHub contribution heatmap, commits, PRs, issues and last pushed on the Lab page
  • Blog post search in the command menu
  • RSS feed XSL stylesheet so the feed renders as a styled page in browsers
Changed
  • All ten project long descriptions expanded with design rationale and build process
  • Homepage hero completely rewritten with a two-paragraph structure and nav links
  • Lab terminal auto-focuses input after boot so you can type immediately
  • Sitemap lastModified dates changed from new Date() to real last-changed dates
Fixed
  • OG/Twitter image generation routes marked noindex so Google ignores them
  • Privacy page removed from sitemap to resolve conflicting noindex signals

v2.1.0

2026-05-15
Added
  • Live status widget: Spotify now playing with album art and progress bar, London time, MacBook battery and charging state, GitHub last push
  • Mac daemon (scripts/mac-daemon.py): writes battery, charging state, timezone and weather to Redis every 30s via launchd
  • Reading progress bar at the top of every blog post
  • Copy button on all code blocks
  • Sticky table of contents sidebar on blog posts with 3+ headings
  • Custom 404 page: terminal-style animated boot sequence with error line
  • /notes/world-cup-ai-predictor and /notes/prosthetics-health-tech detail pages
  • AstonCV blog post
Changed
  • Live status cards moved from homepage to /notes and /lab
  • Spotify polling interval reduced from 30s to 10s
  • Newsletter page fully rewritten with topic cards and past issues link
Fixed
  • All em dashes and en dashes removed sitewide
  • Oxford commas removed from all content

v2.0.0

2026-05-14
Added
  • Full blog system with 11 published posts across 7 content types
  • Blog-to-project cross-linking via projectSlug field
  • Newsletter system via Beehiiv API with subscription form
  • /notes page: public notebook with current builds and plans
  • /lab page: interactive terminal with 30+ commands
  • /security-policy and /hall-of-fame pages
  • Command menu keyboard shortcuts (Mod+H/A/P/E/S/B/N/J/C/L)
Changed
  • Blog page redesigned with type filter tabs and date-sorted post grid
  • Lab page: terminal moved here with upgraded colour scheme
  • About page intro expanded with retinoblastoma, father, Adisadel leadership and more
Fixed
  • Blog post 404s: params now awaited as Promise in Next.js dynamic routes
  • Lab terminal crash on boot fixed
Security
  • /security-policy published with responsible disclosure contact and response timeline

v1.1.0

2026-05-11
Added
  • avr-zac project: ATmega644P bare metal C with nine-mode state machine
  • Phaemos smart maintenance platform added to featured projects
  • ORCID profile link in footer and /links
  • Cybersecurity project category
  • Platforms & Operating Systems skills category
  • public/.well-known/security.txt
  • Per-page canonical tags on all routes
Fixed
  • GitHub username corrected from zaccesss to zaccesss throughout

v1.0.1

2026-05-06
Fixed
  • ERR_TOO_MANY_REDIRECTS in production caused by conflicting host redirect rules
  • Canonical host handling consolidated between app and edge layers
  • ThemeProvider typing compatibility restored for next-themes

v1.0.0

2026-04-28Initial launch
Added
  • Full portfolio site launched on isaacadjei.me
  • Pages: Home, About, Projects, Experience, Skills, Blog, Contact, CV, Links
  • Project detail pages with image gallery for 7 projects
  • CV viewer and downloadable PDF route
  • Contact form with honeypot, rate limiting and input sanitisation
  • Command palette (Cmd/Ctrl+I) for quick navigation
  • Dark/light mode toggle
  • Scroll progress indicator and back-to-top button
  • Open Graph and Twitter card metadata
  • Cloudflare Turnstile on contact form
  • Content Security Policy headers
  • Upstash Redis rate limiting
  • Gitleaks secret scanning in CI
  • Dependabot auto-updates with auto-merge