Skip to content
Numan Zahid
Get in touch
Available for new work

I build websites, and what's behind them.

Numan Zahid · Web Developer · Remote

I've been doing this since 2016. Lots of WordPress, these days mostly Next.js and Astro, and quite often the API, plugin or import script that the site depends on. That last part is usually where the interesting problems are.

I've left client names out. Most of this work is under confidentiality agreements.

Next.jsAstroReactSvelteTypeScriptWordPressPHPLaravelTailwind CSS
Services

What I can help with

Most projects I take on fit one of these, and plenty end up being two of them. Each one links to a real project where I did it.

New builds

A new site on Next.js or Astro. I'll plan the CMS and any integrations at the start too, because adding them at the end is where most projects get messy.

Example: a job board

Moving to a new platform

Getting off an old theme or page builder without breaking your URLs. I script the redirects from your existing links, so nothing gets missed.

Example: WordPress to Astro

Integrations and APIs

Hooking your site up to the system your data already lives in, or building an API for it. That includes planning for the days that system is slow or down.

Example: a jobs API

Custom WordPress plugins

When WordPress can't do what you need out of the box. A proper plugin is easier to look after than a hack in the theme that the next update breaks.

Example: a Substack sync
Work

Some things I've built

A mix of websites, APIs and WordPress plugins. Click through to see how each one was put together and what I'd point out about it.
Education

Exam results system for an educational institute

Takes exam results from spreadsheets through validation, review and approval, then publishes the approved set to a public site, centre reports and print.

7 statesFrom draft import to published results, each one an explicit gate
Django 5Next.js 16KeystaticPostgreSQL
Read more
Media and publishing

Podcast and video site on WordPress and Next.js

Podcasts, videos and articles unified behind one GraphQL layer, with the content model and editorial fields version-controlled as plugin code.

0Rebuilds needed to publish, via on-demand revalidation
WPGraphQLACFWordPressNext.js 16
Read more
Recruitment technology

One jobs API on top of several recruitment systems

Pulls vacancies out of several recruitment systems, normalises them, and republishes them behind one contract, so a site integrates once, not once per platform.

1Integration a site maintains, whatever the number of upstream systems
Laravel 12Filament 3REST integrationsOAuth2
Read more
Publishing integration

A plugin that pulls Substack posts into WordPress

Brings an external publication into WordPress as native posts while the team keeps writing their own, with a configurable line between what each side owns.

5Conditions that abort a removal pass before it can trash anything
WordPressPHP 8WP-CronPHPUnit
Read more
Professional services

Moving a WordPress site to Astro without losing rankings

A content-heavy site moved off WordPress onto prerendered Astro, with every legacy URL mapped by a script rather than by hand.

40Legacy URLs redirected, generated rather than hand-written
Astro 6Content collectionsSvelte 5TypeScript
Read more
Creative studio

An animated studio portfolio that barely uses any JavaScript

A film-inspired studio site with a custom carousel and gallery lightbox, built so the animation is islands and everything around it is static HTML.

5Hydrated islands; the rest of the site is static HTML
Astro 6Svelte 5PartytownContent collections
Read more
How I work

Things I've learned the hard way

These come up on almost every project. None of them are new ideas, but deciding them early saves a lot of arguments later.

Not every page needs a server

A marketing page can be a plain file on a CDN. A job listing that changes every hour needs refreshing when it changes. A dashboard behind a login shouldn't be prebuilt at all. I pick per page, not per site.

WordPress is great for editors

It's the editor most teams are happy to use, so I keep it. But visitors don't need to hit it on every request. I pull the content at build time or through an API, and the public site stays fast.

Schema markup should write itself

Hand-written structured data drifts out of date within a couple of releases, and wrong markup is worse than none. I generate it from the same data the page renders, so the two always match.

Plan how the cache gets cleared

Any cache makes a demo look fast. What matters is what happens when the content changes. If the only answer is 'clear everything', it'll cause an outage sooner or later.

Syncs and people shouldn't edit the same thing

If an automated import and a person can both edit the same field, someone's changes will vanish without anyone noticing. So I decide upfront which fields the sync owns and lock them at the database level, not just in the UI.

Design an API for the people using it

The people using your API want to ask what's changed since yesterday, get a quick 'nothing' when nothing has, and have one key revoked without everyone else's breaking. Adding any of that later breaks things for them, so I build it in from the start.

Stack

Tools I use

Most projects only need the first two groups. The ones I enjoy most usually need a bit of everything.

Front end

Next.js (App Router)AstroReactSvelteTypeScriptTailwind CSS

Content

WordPressHeadless WordPressWPGraphQLACFCustom pluginsContent collections

Back end and data

LaravelFilamentDjangoPHPMySQLPostgreSQLSQLite

APIs and integrations

Bullhorn RESTREST and GraphQLWebhooksRedisCaching strategyRate limiting

Performance and search

Core Web VitalsStructured dataTechnical SEOImage pipelinesCI budgetsAccessible markup

Testing and delivery

VitestPHPUnitLighthouse CIGitHub ActionsComposerNetlify
About

A bit about me

I started building websites in 2016, mostly custom WordPress themes. I did a lot of those, and I've since had to maintain plenty of other people's. That's taught me to care a lot about what a site is like to work on a year after launch.

A lot of the projects I get have the same problem. The site's design and its data are so tangled together that you can't change one without breaking the other. Important content often doesn't have its own page either, so it can't show up in search.

My fix is usually to separate them. The data lives in one place, editors keep the CMS they already know, and the public site becomes fast static pages. Sometimes that means writing the API or plugin that connects it all, which I enjoy more than I probably should.

10Years building for the web
100+Sites and projects shipped
170%More engagement after a rebuild
FAQ

Questions people usually ask

For pricing and timelines, just email me. They depend too much on the project to put here.

Usually, yes. On most of these projects WordPress stayed exactly where it was. Your team keeps the same admin, accounts and content. I just change how the public pages get built.

No. You keep publishing the way you do now, often with the same plugins you already use. If people need retraining after I hand over, I haven't done my job.

It shouldn't. I generate the redirects from your old URLs with a script and carry your SEO titles and descriptions across, so old links keep working from launch day.

No. They're what I use for most front ends, but I do a fair bit of Laravel and Django too, and I spent years on regular WordPress themes before any of that. What you end up with should depend on who's going to maintain it.

Then I'll probably write a plugin for it. Three of the projects here include one, for things like a custom API for the front end or pulling in posts from Substack.

Got a project?

Email me with where things are now and what you'd like to change. If I'm not the right person for it, I'll tell you, and I'll usually know someone who is.

hello@zahid.dev