DEV Community

Mobeen Ahmed profile picture

Mobeen Ahmed

I build small, practical web tools and write about how they are made. PHP, CSS, and shipping simple ideas without overcomplicating them.

Joined Joined on 
Why the download button waits for your tap

Why the download button waits for your tap

Comments
3 min read
Telling "video deleted or private" apart from "provider is down" — and saying so plainly

Telling "video deleted or private" apart from "provider is down" — and saying so plainly

Comments
3 min read
Check the link before you spend the API call: validating pasted URLs on a video downloader

Check the link before you spend the API call: validating pasted URLs on a video downloader

Comments
3 min read
Stripping tracking parameters from pasted video links before I send them anywhere

Stripping tracking parameters from pasted video links before I send them anywhere

Comments
2 min read
Normalizing pasted links: expanding vt.tiktok.com and youtu.be before resolving

Normalizing pasted links: expanding vt.tiktok.com and youtu.be before resolving

Comments
3 min read
Monitoring RapidAPI quota burn: staying inside the free tier on a side project

Monitoring RapidAPI quota burn: staying inside the free tier on a side project

Comments
3 min read
Three providers, three error formats: normalising them into one honest message

Three providers, three error formats: normalising them into one honest message

Comments
3 min read
Timing out provider calls so one slow API can't hang the whole page

Timing out provider calls so one slow API can't hang the whole page

Comments
3 min read
Why my downloader has two PHP endpoints instead of one

Why my downloader has two PHP endpoints instead of one

Comments
3 min read
Setting the right MIME type when proxying MP4 and M4A through PHP

Setting the right MIME type when proxying MP4 and M4A through PHP

Comments
3 min read
How I turn messy video titles into safe download filenames (including non-ASCII ones)

How I turn messy video titles into safe download filenames (including non-ASCII ones)

Comments
3 min read
Streaming big downloads through PHP without blowing the memory limit

Streaming big downloads through PHP without blowing the memory limit

Comments
3 min read
No database on purpose: flat files are enough for a downloader

No database on purpose: flat files are enough for a downloader

Comments
3 min read
Secrets on Shared Hosting: Keeping My RapidAPI Key in a .htaccess-Blocked config.php

Secrets on Shared Hosting: Keeping My RapidAPI Key in a .htaccess-Blocked config.php

Comments
3 min read
Rebuilding a Node.js downloader in plain PHP: what shared hosting forced me to rewrite

Rebuilding a Node.js downloader in plain PHP: what shared hosting forced me to rewrite

Comments
3 min read
Writing honest 'coming soon' placeholders instead of shipping fake features

Writing honest 'coming soon' placeholders instead of shipping fake features

Comments
4 min read
A /api/health Endpoint: The Cheapest Uptime Monitoring There Is

A /api/health Endpoint: The Cheapest Uptime Monitoring There Is

Comments
3 min read
Why Extracted Folders Come Back as 750 on Shared Hosting and Break Everything

Why Extracted Folders Come Back as 750 on Shared Hosting and Break Everything

Comments
3 min read
Cache-Busting Static Assets with ?v=: So Visitors Actually Get the Fix

Cache-Busting Static Assets with ?v=: So Visitors Actually Get the Fix

Comments
4 min read
.htaccess Recipes I Trust: Forcing HTTPS and Hiding Config Files on Shared Hosting

.htaccess Recipes I Trust: Forcing HTTPS and Hiding Config Files on Shared Hosting

Comments
3 min read
Structuring a PHP project for shared hosting: no Composer, no build step

Structuring a PHP project for shared hosting: no Composer, no build step

Comments
3 min read
Facebook Reel Extraction Quirks I Ran Into

Facebook Reel Extraction Quirks I Ran Into

Comments
3 min read
TikTok watermarked vs clean: what the API options really mean

TikTok watermarked vs clean: what the API options really mean

Comments
3 min read
Why Some Instagram Reels Resolve and Stories Don't: Public vs Expiring Content

Why Some Instagram Reels Resolve and Stories Don't: Public vs Expiring Content

Comments
3 min read
Expiring Signed URLs: Why Some Download Links Die After Minutes

Expiring Signed URLs: Why Some Download Links Die After Minutes

Comments
3 min read
End-to-end download testing with curl: my checklist before calling a feature live

End-to-end download testing with curl: my checklist before calling a feature live

Comments
3 min read
Free vs paid RapidAPI tiers: the maths I did before subscribing

Free vs paid RapidAPI tiers: the maths I did before subscribing

Comments
3 min read
No Sign-Up, No Accounts: The Privacy Posture of a Simple Downloader

No Sign-Up, No Accounts: The Privacy Posture of a Simple Downloader

Comments
3 min read
Why I never store downloaded files on my own server

Why I never store downloaded files on my own server

1
Comments 1
3 min read
Logging provider failures without storing anything about the user

Logging provider failures without storing anything about the user

Comments 1
3 min read
When the Provider Is Down, Say So: Honest Error Messages Instead of Spinners

When the Provider Is Down, Say So: Honest Error Messages Instead of Spinners

Comments
3 min read
'Direct' vs 'proxied' download links: what the user actually experiences

'Direct' vs 'proxied' download links: what the user actually experiences

Comments
3 min read
A Language Selector Dropdown With No Framework and No Layout Shift

A Language Selector Dropdown With No Framework and No Layout Shift

1
Comments
3 min read
Share links with app state in the URL hash: copy, paste, resume

Share links with app state in the URL hash: copy, paste, resume

2
Comments
3 min read
Canvas-generated receipt images in the browser: no server, no library

Canvas-generated receipt images in the browser: no server, no library

Comments
3 min read
Minifying a shared JS engine and proving it still works

Minifying a shared JS engine and proving it still works

Comments
3 min read
Deferring render-blocking JS without breaking a vanilla-JS app

Deferring render-blocking JS without breaking a vanilla-JS app

Comments
4 min read
Favicon 404s: the tiny missing file that made Google show a generic globe

Favicon 404s: the tiny missing file that made Google show a generic globe

Comments
3 min read
I Retagged My Site With the Wrong GA4 ID and Lost a Week of Data

I Retagged My Site With the Wrong GA4 ID and Lost a Week of Data

Comments 1
3 min read
ads.txt on a plain PHP site: the 5-minute job people skip

ads.txt on a plain PHP site: the 5-minute job people skip

Comments
3 min read
Robots meta vs X-Robots-Tag: why I only use the meta tag

Robots meta vs X-Robots-Tag: why I only use the meta tag

1
Comments
3 min read
Open Graph Tags for a Downloader: Making Pasted Links Look Right

Open Graph Tags for a Downloader: Making Pasted Links Look Right

1
Comments
3 min read
WebApplication Schema for a Free Web Tool: the JSON-LD I Ship on ramrom.io

WebApplication Schema for a Free Web Tool: the JSON-LD I Ship on ramrom.io

Comments
3 min read
FAQPage JSON-LD on Tool Pages: What It Is and Why I Add It to Every New Page

FAQPage JSON-LD on Tool Pages: What It Is and Why I Add It to Every New Page

Comments
3 min read
Mobile-First CSS for a Single-Purpose Tool Page

Mobile-First CSS for a Single-Purpose Tool Page

Comments
3 min read
Why some CDNs serve empty responses to datacenter IPs — and the direct-link fallback that saved my downloader

Why some CDNs serve empty responses to datacenter IPs — and the direct-link fallback that saved my downloader

Comments
3 min read
Following redirects safely in a PHP download proxy: why I cap them at five hops

Following redirects safely in a PHP download proxy: why I cap them at five hops

Comments
4 min read
Content-Disposition: the header that makes the browser download instead of play

Content-Disposition: the header that makes the browser download instead of play

Comments
3 min read
How I Check a Download Is a Real MP4, Not an HTML Error Page Wearing a .mp4 Name

How I Check a Download Is a Real MP4, Not an HTML Error Page Wearing a .mp4 Name

Comments
3 min read
Where the Download Button Goes: Small UX Decisions on a Tool Homepage

Where the Download Button Goes: Small UX Decisions on a Tool Homepage

Comments
3 min read
Sitemap strategy for an 18-page tool site: what to include and what to leave out

Sitemap strategy for an 18-page tool site: what to include and what to leave out

Comments
3 min read
Submitting URLs to IndexNow from PHP: getting Bing and Yandex to notice new pages in hours

Submitting URLs to IndexNow from PHP: getting Bing and Yandex to notice new pages in hours

Comments
3 min read
i18n for 9 languages with a tiny JS dictionary and zero frameworks

i18n for 9 languages with a tiny JS dictionary and zero frameworks

Comments
3 min read
A network-first service worker for a tool site: installable without breaking the downloader

A network-first service worker for a tool site: installable without breaking the downloader

Comments
2 min read
Caching provider API responses in flat files to survive outages on shared hosting

Caching provider API responses in flat files to survive outages on shared hosting

Comments 1
3 min read
There Is No MP3 on YouTube: Why I Label the Audio Button M4A

There Is No MP3 on YouTube: Why I Label the Audio Button M4A

Comments
2 min read
YouTube adaptive vs muxed streams: why video-with-sound tops out at 360p

YouTube adaptive vs muxed streams: why video-with-sound tops out at 360p

Comments
3 min read
HLS vs progressive MP4: what a video downloader actually hands you

HLS vs progressive MP4: what a video downloader actually hands you

Comments
3 min read
Why I proxy video downloads through my own server instead of hotlinking

Why I proxy video downloads through my own server instead of hotlinking

Comments
2 min read
The guard rails in my PHP download proxy: stopping server-side request forgery on ramrom.io

The guard rails in my PHP download proxy: stopping server-side request forgery on ramrom.io

1
Comments
3 min read
loading...