Redesigning My Personal Website with Claude Code The author redesigned their personal website in two waves, first adding infrastructure improvements like full-text search, dark mode support, and structured data, then overhauling content and layout using Claude Code. The site, originally built with Jekyll and GitHub Pages, had become outdated with missing features and poorly organized pages. Key fixes included client-side search via a JSON index, expanded dark mode coverage, and fixing a bug where comments failed to load during AJAX page transitions. Redesigning My Personal Website with Claude Code Three years ago, I wrote about creating this website https://andlukyane.com/blog/how-i-created-this-website using Jekyll, GitHub Pages, and a custom domain. That post is still one of the most-read things on my blog. The site served me well since then — it helped during job interviews, got me a few consulting projects, and became a home for 190+ ML paper reviews. But I felt that by early 2026, the site was in need of a refresh: - Some content was outdated About and Career pages weren’t updated for years - Some pages weren’t structured well Actitivies page was a flat chronological list, Projects page had exactly two entries, Tags page was a wall of unsorted tags - And the site itself lacked many basic features, like search or dark mode support I did the redesign in two waves. I started with infrastructure improvements search, dark mode, structured data, footer, sharing . Then I did a full content and layout overhaul using Claude Code . Wave 1: infrastructure improvements Before touching any content, I wanted to fix the technical foundation. It took several sessions to make them. Full-text search The site had no search functionality at all. With 190+ posts, finding something specific meant scrolling through the blog listing or using the browser’s Ctrl+F on the tags page. I added a client-side search powered by a JSON index file that Jekyll generates at build time. The search modal opens with Ctrl + K or Cmd + K on Mac and supports multi-term filtering across titles, descriptions, tags, and content. The search index is generated by a search.json file with Liquid: {% for post in site.posts %} { "title": {{ post.title | jsonify }}, "url": "{{ post.url }}", "date": "{{ post.date | date: '%b %d, %Y' }}", "description": {{ post.description | jsonify }}, "tags": {{ post.tags | jsonify }}, "content": {{ post.content | strip html | truncatewords: 50 | jsonify }} }{% unless forloop.last %},{% endunless %} {% endfor %} The JavaScript fetches this JSON once on the first search, then filters locally. It is not as powerful as Algolia or Lunr, but it works well enough for a static site with a few hundred posts and requires no external service. Dark mode The site already had a basic dark mode toggle from an earlier refactor, but it was incomplete — many elements code blocks, tables, form inputs, the career timeline still used hardcoded light colors. I expanded the dark-mode.css file from about 100 lines to over 250, covering every component on the site. The dark mode toggle also needed to sync with the Utterances comment theme, so switching to dark mode now sends a postMessage to the Utterances iframe: js const updateUtterancesTheme = theme = { const utterancesFrame = document.querySelector '.utterances-frame' ; if utterancesFrame { utterancesFrame.contentWindow.postMessage { type: 'set-theme', theme: theme }, 'https://utteranc.es' ; } }; Speaking of Utterances — the comments had an embarrassing bug. The comment section did not appear at all until you manually refreshed the page. The cause was that the site uses AJAX navigation via History.js in personal.js , so navigating to a post did not trigger a full page load. The Utterances