Web applications
Custom web apps on Next.js and React with TypeScript: dashboards, portals, internal tools and customer-facing products. Server components, a proper data layer, and tests around the parts that touch money or records.
Raufun Nasim Khan Chowdhury · Software engineer
Next.js, React and TypeScript on the front. Node, WordPress, Sanity and third-party APIs behind. Six years remote, for companies in the US and Malta.
Free check · what a search engine sees, in about ten seconds
a live cleaning company
static HTML · 51 KB · 1,176 ms
Checked as Local business
61
Mixed. The red items are worth an afternoon. Start with profiles linked in your markup.
Out of 100 across 14 checks chosen for a local business. A pass counts in full, a warning half, a fail nothing.
Fix first
4 of 14
Profiles linked in your markupCosting you
Add a sameAs array to the LocalBusiness block: Google Business Profile, Facebook, Yelp, BBB, Instagram.
Review ratingCosting you
Put the same rating into an aggregateRating in the structured data, with ratingValue and reviewCount that match your Google profile.
Real photographyCosting you
Add real photos: the team, the vans, finished jobs. Eight or more on the homepage, none of them stock.
Third-party review proofWorth fixing
Link the Google reviews page directly under the rating, and add Yelp or BBB if you have a presence there.
Phase two · real phone speed
On a live check, Google loads the page on an emulated mid-range phone and reports what a visitor actually gets: performance score, largest paint, blocking time, layout shift.
Runs on request, takes up to a minute.
Costing you · 3
Profiles linked in your markup
Costing youNo sameAs links found
This is how Google ties the website to your Business Profile. Missing it costs you in the map results.
Add a sameAs array to the LocalBusiness block: Google Business Profile, Facebook, Yelp, BBB, Instagram.
Review rating
Costing youA rating is written on the page but is not in the markup, so it can never show in search results
A rating typed into the page is a claim. A rating in the markup can appear as stars in Google.
Put the same rating into an aggregateRating in the structured data, with ratingValue and reviewCount that match your Google profile.
Real photography
Costing you3 image tags, 2 unique files
People decide whether to let you into their home. Showing nobody is the most expensive thing on this list.
Add real photos: the team, the vans, finished jobs. Eight or more on the homepage, none of them stock.
Worth fixing · 5
Third-party review proof
Worth fixingLinks to Facebook
Visitors trust a number they can click and check far more than one you print yourself.
Link the Google reviews page directly under the rating, and add Yelp or BBB if you have a presence there.
Image alt text
Worth fixing1 of 3 have no alt attribute
Alt text is an accessibility requirement and it is read by search engines. Decorative images get an empty alt, never none.
Give every image an alt attribute: a short description for content images, alt="" for decorative ones.
Full postal address in markup
Worth fixingCity and region only, no street or postcode
A local business with no findable address reads as less established than it is.
Complete the PostalAddress in the structured data: streetAddress, addressLocality, addressRegion, postalCode. Service-area businesses can add areaServed instead of a street.
Title and description
Worth fixingTitle 80 characters, description 215
This is your advert in the search results, and it is free.
Shorten the title to 60 characters or fewer, service and place first, name last.
Link preview
Worth fixingOpen Graph title but no image
What the link looks like when someone pastes it into WhatsApp, LinkedIn or a text.
Add og:title, og:description and a 1200x630 og:image so shared links show a card instead of bare text.
Clear · 6
Local business structured data
ClearFound LocalBusiness, WebSite
Without it, search engines are guessing what you do and where you do it.
Tap-to-call
Clear4 tel: links
Most of this traffic is on a phone. If the number is not tappable, the call does not happen.
Page heading
ClearOne h1
One clear h1 tells search engines what this page is about.
AI answer engines can read the site
ClearChatGPT, ChatGPT search, Claude, Perplexity, Gemini, Apple Intelligence all allowed
People increasingly ask ChatGPT, Claude and Perplexity before they search. A crawler that is blocked cannot recommend you.
Mobile viewport
ClearDeclared
Without it a phone shrinks the whole desktop layout to fit.
Markup weight
Clear32 KB of markup, 51 KB total with inline scripts, fetched in 1,176 ms
Markup only, with inline scripts set aside so the number is comparable across platforms.
What this means
There is real ground to gain, and none of it needs a rebuild.
3 things are costing you calls: profiles linked in your markup, review rating and real photography. This is how Google ties the website to your Business Profile. Missing it costs you in the map results. 5 more are worth an afternoon: third-party review proof, image alt text, full postal address in markup, title and description and link preview. None of them needs a redesign; each is a specific change to the page or its markup.
What this check cannot see: whether your listings agree with each other across the web, whether you rank in the towns that actually produce work rather than the ones that do not, and what a booked job currently costs you. That is the part a written teardown covers, and you keep it either way.
A real site, checked live and anonymised. Yours gets the same treatment in about ten seconds, with the checks chosen for your kind of site: local business, company, or personal. No signup, nothing stored.
Before and after
Where a customer actually meets the site: the Google result and the phone in their hand. Nothing here is a redesign. It is the checks above, fixed.
Before · in Google
Sparkle & Shine
sparkleshine.example
Sparkle & Shine Cleaning Services | Residential and Commercial Cleaning Company Serving the San Fernan...
No rating shown · Los Angeles, CA
Welcome to our website. We are a professional cleaning company offering a wide range of cleaning services for residential and commercial clients. We pride ourselves on...
On a phone
Every space, spotlessly clean.
Professional cleaning for homes, offices, clinics, hotels and HOAs. Contact us today for a free quote!
Phone: (818) 555-0100
After · in Google
Sparkle & Shine
sparkleshine.example
House cleaning in the San Fernando Valley | Sparkle & Shine
Insured, bonded, same cleaner every visit. Book online or call (818) 555-0100. Serving Van Nuys, Sherman Oaks and Burbank.
On a phone

House cleaning in the Valley.
Price in 60 seconds
Title
80 characters, cut off
One line, place and service first
Rating
4.9 typed on the page
Stars from markup, 214 reviews
Number
Text in the footer
Tap-to-call bar on every screen
Proof
Nothing to check
Google profile, insured, sitelinks
About

Next.js, React and TypeScript on the front. Node services, WordPress and PHP, Sanity and third-party APIs behind. I have built campaign platforms with payments and transactional email, scrapers with admin dashboards, automation services in Docker, and a lot of websites for businesses that live on inbound calls.
What I bring past the code is the habit of checking. Structured data that is actually there, a webhook that actually fires, a page that is actually fast on a phone. The free check at the top of this page is that habit turned into a tool.
Services
Hire me for one of these or for the whole thing. Every item is work I do myself, not work I coordinate.
Custom web apps on Next.js and React with TypeScript: dashboards, portals, internal tools and customer-facing products. Server components, a proper data layer, and tests around the parts that touch money or records.
A Figma, Adobe XD or Photoshop file, even a Canva board, built into a full working site. Spacing, type and states as designed, accurate at every width, with real components behind it rather than a page that only matches at one size.
Connecting the tools a business already runs: webhooks, scheduled jobs, scrapers, CRM syncs and background services in Node and Docker. Built to survive bad data, and to tell you when something fails instead of failing quietly.
Keep the CMS the team already knows and replace the slow front end with Next.js. Content modelling, live preview, revalidation on publish, and a migration that keeps every URL and ranking.
Custom plugins, post types, importers and admin tooling, written to WordPress standards so the next developer can read them. Fixing, hardening and speeding up existing plugins too.
LocalBusiness and Organization markup, review and profile links, service-area pages and a complete address, so Google and the AI answer engines can connect the site to the business behind it and name it.
Diagnosing and fixing INP, LCP and blocking time on an existing site: images, scripts, fonts, server response. Measured before and after, in writing, against Google's own thresholds.
Quote and booking forms that convert, tap-to-call as the primary action, tracked numbers for paid traffic, and Meta Conversions API with deduplication so attribution survives ad blockers and iOS.
Moving a site between platforms, WordPress to Next.js or the reverse, with a one-to-one redirect map, structured data carried over, and the existing rankings protected rather than gambled.
Case studies
These are live under client and agency branding rather than mine, so they are described by sector and scope rather than named. The work is exact.
Local SEO + service areas
Service area system across dozens of suburbs: a page per city rather than one list, an interactive coverage map that only loads its script when tapped, and local business structured data per location.
Every suburb they served became a page somebody could actually find.
Brand + performance
Front end with a hero running background video of the crew working. Layering and responsive behaviour resolved so the headline stays readable at every width, with poster frame and encoding tuned so first paint never waits on the video.
Proof the crew is real, without the load time that usually costs.
Video + performance
A homepage video that had to autoplay with sound, which every browser blocks. The player starts muted so autoplay is allowed, unmutes itself the moment the browser permits, and falls back to a single tap-to-unmute overlay when it does not. The player itself now loads on the visitor's first interaction instead of on page load, because loading it eagerly had pulled a megabyte of script and five third-party cookies into every visit and cost a 49 mobile performance score.
Sound where the browser allows it, one tap where it does not, and a page that no longer pays for the player before anyone scrolls.
WordPress + conversion
Custom build with service pages split by search intent rather than bundled into one grid, the service area structure, complete local business markup, and tap-to-call handled as the conversion rather than decoration.
The phone number stopped being text and started being measured.
Server-side tracking
Meta Conversions API with event deduplication against the browser pixel, so attribution survives ad blockers and iOS. Pixel scoped to the thank-you page only, with the form platform passing qualification data through to the conversion event.
Ad spend measurable again after the browser pixel stopped reporting reliably.
Lead funnels
Quiz funnels where the qualification logic lives in the form tool itself rather than downstream, so the automation only reads a verdict it was handed. Qualifier and thank-you templates, with routing on the end screen rather than a redirect.
Unqualified leads filtered before they reached the client's inbox.
Booking integration
Embedded scheduling across a WordPress site, including private direct-booking routes for individual staff separate from the public calendar, and the caching quirks that make embedded calendars silently show the wrong availability.
Bookings that route to the right person without a receptionist.
Plugin development
A WordPress plugin importing a spreadsheet of practitioners repeatedly. Per-field provenance means a value corrected by hand in the admin is never overwritten by a later import, and the run report states exactly which fields it left alone and why. Locations resolve hierarchically so two cities of the same name in different states stay separate.
A spreadsheet can be re-imported all day without destroying corrections.
3D and media delivery
Interactive 3D model delivery on a platform that blocks the file type by default, worked around at the upload layer, with model preview pages built to load heavy assets without stalling the rest of the site.
Clients can turn the building around in the browser instead of viewing stills.
E-commerce
Storefront, product structure and checkout path for a seasonal delivery business, with the performance work to keep it quick on a phone during the short window when the orders actually arrive.
A seasonal business taking orders without answering the phone.
Email infrastructure
SPF, DKIM and DMARC configured across fifty domains and a hundred and fifty mailboxes, with the sending platform wired in and authentication verified per domain rather than assumed.
Mail that lands in the inbox instead of the spam folder.
Engineering
Specific work from real projects: the situation, what I built, and what changed. Names removed, everything else exact.

The situation
The agency's own site moved to Next.js, which killed the WordPress endpoint every client site phoned home to. Every site in the fleet started failing its heartbeat and showing admins a warning.
What I built
A Cloudflare Worker with a SQLite Durable Object and a capability-URL dashboard. Sites enrol and receive commands over HMAC-SHA256-signed requests verified on raw bytes; each site owns its token and the hub pins it on first contact, so a fresh, empty hub re-pairs the whole fleet by itself.
Result
Fleet back online without touching a single client site. No data migration, ever, by design.
The situation
A dozen custom plugins across many client sites, each updated by hand, each drifting.
What I built
A monorepo with a release Action: bump the version header, build the zip, publish a GitHub Release to a public mirror, regenerate the update manifest. Sites read that manifest through the plugin's Update URI and pull the new version within about twelve hours, or on demand from the control center.
Result
One push is a fleet-wide deploy, with the release history and the rollback path GitHub gives for free.
The situation
Editors published and the site kept serving old pages. Separately, hosting usage rose month on month on flat traffic. The revalidation webhook had returned 401 on every delivery since April: the secret contained a plus sign that the query-string parser turned into a space.
What I built
Secret moved to a header and compared byte for byte; cron-driven scheduled publishing with 24-hour ISR windows so pages regenerate when content changes, not every few minutes.
Result
Publishes land in seconds. Diagnosed from the usage page, not the code: the money was in ISR writes and build minutes, and the next invoice showed it.
The situation
The pixel had only ever been placed on the thank-you page, so it never saw the click ID on the landing page and every lead reached the ad platform unattributable. Ad blockers and iOS took the rest.
What I built
Pixel and click-ID capture on the landing page, a small server-side plugin relaying each lead through the Conversions API with a shared event ID for deduplication, and the discovery that a server-side redirect was stripping the click ID before the page ever saw it.
Result
Browser and server events matched in Events Manager instead of a pixel counting alone; the spec became the agency's reusable CAPI playbook.
The situation
The studio's product is 3D work, and WordPress blocks GLB and glTF uploads at the media layer regardless of role.
What I built
Uploads routed straight to disk through a file manager, source glTF converted to binary GLB at about a quarter smaller, and a preview page with an interactive viewer (rotate, auto-rotate, flat lighting) for two product variants.
Result
Models the studio could not even upload are now something a visitor can turn in their hand.
The situation
Funded deals lived as static cards hand-edited in the page builder; every new deal meant a developer.
What I built
A custom post type with three structured fields, a loop-item template with dynamic tags, and a loop carousel wired through the REST API: four slides on desktop, two on tablet, one on a phone, newest first.
Result
The client adds a deal by filling in a title, an image and three fields. Nobody opens the page builder.
The situation
An eleven-page spec, an ad budget, and a client who only wanted to hear about qualified prospects.
What I built
The quiz as a form with hidden tracking fields and readable field references, a WordPress ad-destination page, a thank-you page with the conversion pixel, and a routing automation whose only filter reads a qualification variable computed inside the form itself.
Result
The agency sees every submission; the client sees the qualified ones. The logic lives in one place, so nobody can quietly break it downstream.
The situation
Blank calendars on four pages, four marketing funnels whose second step returned 404, and a business-card link that pointed at a page that did not exist.
What I built
Traced each to its cause: an inactive calendar in the CRM, funnel domains pointed at the WordPress host instead of the CRM subdomain, and a slug mismatch fixed with a host-level rewrite rule. Later, a departing staffer's six calendars deactivated and verified dead, with the shared round-robin left intact.
Result
Every entry point returns 200 and lands where the client expects.
The situation
A 73 MB highlight reel as a hero background, a header cluttered against the designer's file, and a phone menu that never opened on a live site.
What I built
Video re-encoded two-pass to 8.5 MB with the intro trimmed, a layered z-index scheme for video, scrim and content across breakpoints, the header rebuilt to the design, and the menu bug traced to a stuck max-height transition that overrode the author styles.
Result
Verified with zero overflow and a one-line headline at six widths, and a mobile menu that opens.
Real output
Not screenshots of finished pages. The output itself, taken from real jobs with the client details removed.
Findings from a live cleaning company homepage. Every line is checkable in a couple of minutes.
FAIL Review rating 4.9 written on the page, absent from the markup
FAIL Profiles in markup no sameAs links to Google, Yelp or Facebook
FAIL Real photography 3 image tags, 2 of them the same logo file
WARN Postal address missing streetAddress and postalCode
PASS Tap-to-call 4 tel: links
PASS Markup weight 32 KB, fetched in 1,176 ms
A directory plugin where a spreadsheet is re-imported repeatedly. The report says what it changed and what it deliberately left alone.
run 2 added 1 updated 8 unchanged 0 skipped 0
row 2 HW-1001: updated | fields name, bio, phone, website
| left alone because edited here: firm
row 10 HW-1011: added | fields name, firm, bio, phone, website
Portland OR and Portland ME resolved as separate cities
Recommendations
Devin Dias
Software Engineer, Eureka Software
LinkedIn recommendation
I had the pleasure of working with Rauf in a remote capacity, where he reported directly to me on a daily basis and helped support several projects across WordPress, React, Next.js, and Sanity. Before working with Rauf, I'll be honest, I had not always had the best experiences with offshore contractors. Rauf completely changed that perspective for me. He is reliable, thoughtful, easy to communicate with, and genuinely cares about the quality of his work.
Heather Carr
Project Manager, Client Success
LinkedIn recommendation
As one of our web developers, he consistently built high-quality websites while keeping communication clear and consistent throughout each project. One of the things I appreciated most was his ability to troubleshoot challenges, identify solutions, and keep projects moving forward. He was proactive, dependable, and always approached problems with a solutions-focused mindset.
Justin Lucas
Software engineering colleague
LinkedIn recommendation
Rauf combines strong technical expertise with something equally valuable: the ability to understand the real business objective behind a project. He doesn't simply complete assigned tasks, he looks for better solutions, anticipates potential problems, and consistently works to improve the quality of the final product.
Vineeth N.
Client
Upwork review
Raufun is an expert in WordPress and Web Development, he helped us with fixing quite few issues with our website and actively suggested options to improve the performance, I highly recommend Raufun.
Process
The number that matters is the one a customer produces on a phone: a tap on the call button. Everything below exists to move it, and to prove it moved.

Before anything changes: rankings, impressions, load time, calls and completed quote requests. Without it nobody can tell afterwards whether the rebuild helped, which is where most rebuilds end up.
What is costing you, ranked, with what each one is worth. You see this before I write a line of code, and you can hand it to somebody else if you would rather.
Indexing off, redirects mapped one to one, structured data verified there. Nothing touches the live site until it has been checked somewhere that cannot hurt you.
Sitemap submitted, indexing requested on the pages that matter, Coverage and Performance watched daily for two weeks and weekly for a month after.
The same numbers from step one, side by side. If something did not move, I say so rather than pointing at traffic.
Hire me
Next.js, React and TypeScript on the front. Node, WordPress, Sanity and third-party APIs behind. Web applications, integrations, headless CMS builds, design to code, and the search and speed work around them. Direct, or through Upwork if you would rather have the platform in the middle.
My working evening is a US or UK morning, so replies land inside your day. Typical response under four hours.
Nothing subcontracted, no agency behind me. The person who scopes the work builds it, tests it and answers for it.
No discovery call required. Send the address, get the findings in priority order with what each is worth, then decide.
10 to 15 hours a week, evenings and weekends included. Fixed price or hourly, milestone based. Identity and phone verified on Upwork, 100% job success.
Claude Code and Codex in the loop for tests, refactors and review. Every change is still read, run and measured by me.
Questions
Whichever suits the job. WordPress when you want to edit everything yourself with no learning curve. Next.js when speed and search are the priority, paired with a CMS so editing still feels ordinary. I will tell you which one your project actually needs rather than the one I prefer.
Yes, and that is a build requirement rather than an afterthought. Prices, service areas, photos and copy are all yours to change without calling anyone.
Not if the URLs are handled properly. Every existing address is crawled and mapped one to one before anything is built, and nothing goes live until the redirects are verified on staging. Blanket redirects to the homepage are what actually destroys rankings.
No. Everything can be done in writing, which also means you have a record of what was agreed. If you would rather talk, that is fine too.
It depends on how many pages and how much of the local search work is already in place. Send me your address and you will get the fixes in priority order with what each one is worth, before any quote.
I can set both up and hand over the logins, or work inside whatever you already have. You own everything either way.
A focused fix is days. A full rebuild with service area pages is usually a few weeks, and I would rather give you a real date than an optimistic one.
That is fine and often the better place to start. Page speed, structured data, or the booking flow on its own are all normal first jobs.