For most of this year my writing lived in other people's houses. An article went up on Hashnode, then DEV, then Medium, and my portfolio pointed at all of them with a small stack of cards that said "read more" and sent you somewhere else. I was a guest everywhere, and the one place with my name on the door had no room for the words.
That changed this month. I rebuilt ahmershah.dev from an empty folder and gave my writing a permanent address on it. Somewhere in the middle of that, Google started showing a knowledge panel when you search my name. This post covers all three, as plainly as I can, including the parts that aren't finished yet.
What the old site was
The previous version is still public on GitHub as old_portfolio_v2. It was a static site: hand-written HTML, vanilla JavaScript with some jQuery, Bootstrap 5 for the grid, and Three.js loading a 3D Iron Man model into the hero. Some parts I was proud of at the time. There was a certificate flipbook built on Turn.js that you could actually page through, a dark and light theme toggle, a service worker so it kept working offline, and a contact form wired to EmailJS.
It also had the problems every hand-rolled static site collects. Forty-one stylesheets, each one patching something another one broke. More than thirty scripts that had to load in the right order or the page fell over. Every section was its own island, so changing the brand green meant a find-and-replace across the project and hoping nothing else matched.
And the blog wasn't really a blog. It was a card stack of links to articles hosted somewhere else. The README listed "Blog integration with real articles (not just links)" under Upcoming Features. It never left that list.
None of that makes it a bad site. It was what I could build at the time, and it taught me exactly what I didn't want to maintain for another year.
What ahmershah.dev is now
The new site is a Next.js 16 app on React 19, written in TypeScript and styled with Tailwind CSS v4. Motion runs on GSAP with ScrollTrigger, smooth scrolling on Lenis, and the hero scene is three.js through React Three Fiber. It deploys to Vercel from a private repository.
| Old portfolio (v2) | ahmershah.dev today | |
|---|---|---|
| Built with | HTML, vanilla JS, jQuery, Bootstrap 5 | Next.js 16, React 19, TypeScript, Tailwind CSS v4 |
| Content | Written into the markup, page by page | Typed content files, one source of truth |
| Blog | Cards linking out to Hashnode, DEV, Medium | A built-in blog with 44 articles on my own domain |
| 3D | Iron Man model on every device | WebGL hero on desktop, a CSS-only version on phones |
| Contact | EmailJS, sent from the browser | Checked on the server, sent through Resend |
| Help | None | An on-site assistant that answers from the site's own data |
The stack isn't what makes it better, though. The structure is.
One source of truth. My name, role, education, every certificate with its credential ID, the services, the client reviews: each lives once, in a typed content file. The pages render from those files. So does the structured data search engines read, and so does the small assistant in the corner of the site. When something changes, it changes everywhere, and I can't accidentally tell Google one thing and a visitor another.
Phones get their own layout, not a shrunken one. Below the desktop breakpoint, three.js never downloads at all. The hero turns into a poster layout, the education timeline runs vertically, and the loader gets shorter. A phone on a slow connection shouldn't pay for a 3D scene it can barely show.
Honest numbers. Lighthouse gives accessibility, best practices and SEO a score of 100 on every page type I tested, on mobile and desktop. Performance is where I have to be straight with you. The blog, article and legal pages score between 95 and 99 on desktop. The home page sits around 55 on desktop, and the mobile scores land in the high 50s and low 60s. The home page is one long document with every section in it, plus a WebGL scene. I chose that design knowing what it costs, and I'd rather show you the number than claim a perfect score.
There are small things too: interface sounds synthesized live in the browser instead of loaded from audio files, and a scroll-to-top button shaped like a pistol. I left a few jokes in for people who look closely.
The blog moved home
This is the part I care about most.
All 44 of my articles now live at ahmershah.dev/blogs as Markdown files inside the site itself. Code blocks are highlighted at build time. Each article has a table of contents, a reading time, tags, and a series if it belongs to one. There's an RSS feed, a save-for-later list, a read-aloud mode that highlights each paragraph as it's spoken, and a button to download any article as Markdown. This week I added a featured slot, pinned articles, sorting (latest, oldest, longest, quickest, A to Z) and an index view for scanning the whole archive at once.
Why bother, when free platforms already exist? Because the words are mine and should live at an address I control. Platforms change their rules, their paywalls and their feeds. If any one of them shut down tomorrow, nothing on ahmershah.dev would break, and no link I've shared would go dead.
How cross-posting works now
I'm not leaving the other platforms. DEV, Medium, Hashnode, CoderLegion and AWS Builder Center have readers I'd never reach alone, so every article still goes to them, sometimes reworded for the audience there.
What changed is the direction. New articles are published on ahmershah.dev first, and each copy elsewhere carries a canonical link back to the original. A canonical link is one line in a page's head that tells search engines "the real version of this lives over there." Without it, five copies of the same article compete with each other in search results. With it, the original gets the credit and the copies still get read.
The older articles are a different story, and I've kept them honest. Before this site had a blog, each piece was published first on DEV, Medium or Hashnode, and that's where its canonical link still points. Its page here says so under the title, links to the original, and lists the other places it was shared. Relabelling those older posts as "originally on ahmershah.dev" would be rewriting history, and search engines would see through it anyway. The rule only runs forward: from this article on, the original lives here.
Why it isn't open source (yet)
The old portfolio is public. This one isn't, and that's deliberate.
The site is new, and I'm still watching how it behaves on real phones, slow networks and browsers I don't own. This week alone I fixed testimonial arrows that didn't respond to taps on phones, service cards whose buttons were cut off on small screens, and a 404 page that deserved better than it had.
The biggest fix was email. The contact form used to hand messages to EmailJS from your browser, and it wasn't reliable enough. It now goes through Resend: the email is sent from the server, from my own domain, after the form has been checked for spam. When you write to me, you get one confirmation that your message arrived and that I'll reply within 2 to 4 working days. One email, not a newsletter.
Once the site has been stable for a while and I've cleaned up the parts I'm not proud of yet, I'll think about opening the code. I'm not promising a date.
A knowledge panel with my name on it
The second piece of news is smaller than it sounds, and I want to describe it accurately.
When you search my name, Google now shows a knowledge panel: here it is. A knowledge panel is the information box Google shows for a person, place or organization it's confident it understands, assembled from sources across the web. You can't buy one or apply for one.
Google doesn't explain why it creates a panel, so I can't tell you exactly what did it. Here's what I did that I believe helped:
- The same name, photo and description everywhere. LinkedIn, GitHub, the writing platforms and the business listings all describe the same person in the same words.
- One identity in the site's structured data. Every page on ahmershah.dev refers to a single
Personentry, and that entry lists every profile that belongs to me. - Consistent handles.
@syedahmershahand@ahmershahdevon every platform where I could get them. - Writing under my own name, regularly, so there was something real for all of those profiles to point at.
I've since claimed the panel. Claiming means Google checked that I really am the person it describes, through my own verified accounts. After that I can suggest corrections when something in the panel is wrong or out of date.
What it doesn't mean matters just as much. It doesn't make me famous, and it isn't an endorsement of my work. It means Google is confident who I am and which profiles are mine, and it lets me keep that description accurate. For someone early in their career that's genuinely useful: a client who searches my name finds me, my work and my writing in one place, not a guess.
What's next
- Watch the new contact form deliver for a few weeks, and fix whatever real visitors find.
- Keep every new article's copies on DEV, Medium and Hashnode pointing back here.
- Keep writing. The blog has room now.
- Decide, later and without hurry, whether to open-source the site.
A portfolio used to be a brochure to me: something you glance at and leave. This one is closer to a home. The work lives here, the writing lives here, and everything else I have on the internet points back to it.
If something on the site breaks for you, tell me through the contact form. I read every message.



