Audit of the Hexo site (fctheme). Issues grouped by priority.
themes/fctheme/layout/layout.ejs
The matrix/glitch intro overlay runs on every page navigation, not just the first visit. There is no localStorage check to skip it for returning visitors. A 10-second blocking overlay on every page is a major UX problem — users navigating between posts or archives see it repeatedly. Either remove it entirely or gate it with a session/localStorage flag so it only shows once per session.
themes/fctheme/layout/_partial/head.ejs
Using UA-167238494-1 (Universal Analytics). Google shut down UA processing in July 2023 — this tag no longer records any data. Migrate to a GA4 property and replace the gtag config with the new G-XXXXXXXX measurement ID.
_config.yml line 38–40
a Sitemap: # ← broken key, treated as arbitrary string
path: sitemap.xmlShould be:
sitemap:
path: sitemap.xmlNo sitemap is being generated, hurting SEO and crawlability.
_config.yml
url: http://chetansachdev.comAll canonical URLs, OG tags, and Disqus configs that pull from config.url produce http:// links. Change to https://chetansachdev.com.
themes/fctheme/layout/_partial/head.ejs
The fallback Open Graph image is set to /img/og-default.png, but this file does not exist in themes/fctheme/source/img/. Posts without a cover or thumbnail in front-matter will have a broken OG image, making link previews appear blank on social platforms. Create and add the image.
themes/fctheme/layout/_partial/head.ejs
<meta name="twitter:site" content="@chetansachdev">
<meta name="twitter:creator" content="@chetansachdev">But all actual social links (header, footer, sidebar, about page) point to @cksachdev. Pick one handle and make it consistent everywhere.
themes/fctheme/layout/_partial/head.ejs
StackPath discontinued its free CDN. FA 4.7 is also outdated (2016). This is a single point of failure — if the CDN is unavailable, all icons (nav, social links, footer) disappear. Replace with locally hosted SVG icons or upgrade to Font Awesome 6 (CDN from Cloudflare or self-hosted).
themes/fctheme/layout/layout.ejs
<main id="main-content"> exists but there is no visible skip link before the header. Keyboard and screen reader users must tab through the entire nav on every page. Add:
<a href="#main-content" class="skip-link">Skip to content</a>with appropriate CSS to show it on focus.
source/service/index.md — blank page (no content)
source/services/index.md — rough stub with typos ("Developement") and <br> formatting
source/_posts/post.md — placeholder test post that is published live
source/_drafts/index.md — an index file sitting in _drafts
These should be deleted or properly fleshed out. The service and services pages are both orphaned (not in nav), duplicated, and embarrassing on a professional blog.
source/payment/index.md
Uses legacy Hexo {% img %} tag syntax, an emoji heading (# Payment Details :), and has no surrounding context or design. Either remove it from the site, restrict it, or redesign it to match the rest of the theme.
themes/fctheme/layout/_partial/head.ejs
An Atom feed is configured (atom.xml) but there is no <link rel="alternate" type="application/atom+xml"> tag in the HTML head. Browsers and feed readers won't auto-detect the feed. Add:
<link rel="alternate" type="application/atom+xml" title="<%= config.title %>" href="/atom.xml">themes/fctheme/layout/_partial/header.ejs
Clicking outside the open mobile nav drawer does not close it. Add a document click listener that closes the drawer when focus moves away.
themes/fctheme/layout/_partial/head.ejs
Mobile browsers use this to colour the browser chrome. Add one for each theme:
<meta name="theme-color" content="#0d1117" media="(prefers-color-scheme: dark)">
<meta name="theme-color" content="#ffffff" media="(prefers-color-scheme: light)">_config.yml
keywords: ... adobe flex engineer, freelance flash developer ...Flash and Flex are defunct technologies. Update keywords to reflect current skills (eLearning, SCORM, xAPI, Adapt Framework, Sunbird, JavaScript).
themes/fctheme/layout/_partial/head.ejs / post.ejs
No Schema.org markup. Adding BlogPosting for posts and Person for the about page would improve Google rich results. At minimum, add a WebSite schema with sitelinks search potential.
themes/fctheme/layout/_partial/article.ejs
this.page.url = 'https://chetansachdev.com/<%- item.path %>';This is actually correct, but it diverges from config.url (http://). Once config.url is fixed to https://, update Disqus config to use the config variable instead of a hardcoded string.
themes/fctheme/layout/_partial/header.ejs
Theme is applied via JavaScript after DOM parse. Users on a non-default theme may briefly see the dark theme before the script runs. Move the theme-reading logic to a <script> in <head> (before CSS loads) or use a CSS custom property with prefers-color-scheme as the default.
source/about/index.md
The entire about page layout is built with inline style="" attributes (margins, colors, font sizes, flex). These override nothing and are hard to maintain — if the design system changes, they won't update. Extract these into CSS classes in styles.css.
themes/fctheme/_config.yml
The theme config menu section still defines categories, tags, payment, and github items. The actual rendered nav (hardcoded in header.ejs) doesn't use this config — it's dead config. Either wire the nav to use the config or remove the stale entries.
_config.yml
This combination is known to cause inconsistent asset URL resolution in Hexo. Test post images carefully or switch to absolute paths.
themes/fctheme/layout/_partial/head.ejs
Three font families (Inter, Lora, JetBrains Mono) are loaded without font-display: optional or preload hints. Add <link rel="preload"> for the most critical weights to reduce Cumulative Layout Shift.
Footer, sidebar, and about page still say "Twitter" and link to twitter.com. The platform is now X (x.com). Update the display text and links.
themes/fctheme/layout/index.ejs
The <h1> says "Writing" but the page <title> is just "Chetan Sachdev". Consider adding the subtitle ("planting ideas") to the home page title for better context.
themes/fctheme/layout/archive.ejs
The <h1> only renders if (title). When page.archive is true but no year/month, title is set to 'Archives' — this works, but the logic is fragile. Add a fallback default string to make it explicit.
themes/fctheme/layout/_partial/article.ejs
Post content images rendered from Markdown don't get loading="lazy". This causes all post images to load immediately. Consider a post-processing step or Hexo plugin to inject this attribute.
_config.yml
With 35 posts and pagination disabled via a high per_page, the home page renders all posts in a single HTML response. As the blog grows this will get slower. Reduce to 20–30 and enable pagination.
source/robots.txt
The file exists (good) but verify it allows crawling of all intended paths and disallows _drafts, payment, etc. if those should remain private.
themes/fctheme/layout/_partial/head.ejs
Only favicon.ico is declared. Add apple-touch-icon and a 192×192 PNG for PWA/Android home screen support:
<link rel="apple-touch-icon" href="/img/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="192x192" href="/img/icon-192.png">