<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Dev Std</title>
    <description>The latest articles on DEV Community by Dev Std (@devstd).</description>
    <link>https://dev.to/devstd</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4172880%2F9e86238e-3cc3-44b8-aa68-ff19f63055b9.jpg</url>
      <title>DEV Community: Dev Std</title>
      <link>https://dev.to/devstd</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/devstd"/>
    <language>en</language>
    <item>
      <title>Best 10 Free Instagram Video Downloader Online in 2027</title>
      <dc:creator>Dev Std</dc:creator>
      <pubDate>Mon, 26 Oct 2026 00:51:25 +0000</pubDate>
      <link>https://dev.to/devstd/best-10-free-instagram-video-downloader-online-in-2027-4no9</link>
      <guid>https://dev.to/devstd/best-10-free-instagram-video-downloader-online-in-2027-4no9</guid>
      <description>&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://igram.pk" rel="noopener noreferrer"&gt;iGram&lt;/a&gt;: A Convenient Online Instagram Video and Reels Downloader&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;_Hold for other downloaders in another posts&lt;br&gt;
_&lt;/p&gt;

&lt;p&gt;Instagram has become one of the most popular platforms for sharing photos, videos, Reels, Stories, and creative content. From educational clips and travel inspiration to entertaining videos and marketing ideas, users discover new content every day. Sometimes, you may want to save a useful video or memorable post so you can revisit it later.&lt;/p&gt;

&lt;p&gt;This is where an online Instagram downloader can be helpful. iGram offers a convenient way to access Instagram media through a simple, link-based downloading process.&lt;/p&gt;

&lt;p&gt;What Is iGram?&lt;br&gt;
iGram is an online tool designed to help users download supported Instagram content using a post link. Instead of installing additional software, users can access the website through a browser on a computer, tablet, or smartphone.&lt;/p&gt;

&lt;p&gt;For people who regularly browse Instagram, a web-based downloader can make saving supported media more straightforward. Whether you want to keep an inspiring Reel for personal reference or save a photo you have permission to use, iGram.pk provides an accessible option to explore.&lt;/p&gt;

&lt;p&gt;Why Use an &lt;a href="https://igram.pk" rel="noopener noreferrer"&gt;Instagram Downloader&lt;/a&gt;?&lt;br&gt;
Instagram is filled with content that people may want to revisit. A downloader can be useful when you want to keep a personal collection of inspiration, review educational material offline, or organize content for a project.&lt;/p&gt;

&lt;p&gt;Here are some common reasons people look for an Instagram video downloader:&lt;/p&gt;

&lt;p&gt;Save videos for later: Keep supported content available for personal viewing.&lt;/p&gt;

&lt;p&gt;Collect creative inspiration: Organize ideas related to photography, design, travel, or social media marketing.&lt;/p&gt;

&lt;p&gt;Access content conveniently: Use a browser-based tool instead of installing a separate application.&lt;/p&gt;

&lt;p&gt;Download supported Reels: Save videos using a compatible Instagram post link.&lt;/p&gt;

&lt;p&gt;Keep useful references: Maintain a collection of content you have permission to download and use.&lt;/p&gt;

&lt;p&gt;Key Features to Explore on iGram.pk&lt;br&gt;
A useful online downloader should be easy to understand and straightforward to navigate. iGram.pk is an option for users looking for a browser-based Instagram media downloading experience.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Simple Link-Based Process&lt;br&gt;
One of the main advantages of an online downloader is its straightforward workflow. Users typically copy the link of a supported Instagram post, paste it into the downloader, and follow the available download instructions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Convenient Access Across Devices&lt;br&gt;
A browser-based service can be accessed from many devices, including desktop computers, laptops, Android phones, and iPhones. This makes it convenient for users who switch between devices throughout the day.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Instagram Video and Reel Downloads&lt;br&gt;
Short-form video has become an important part of Instagram. A compatible downloader can help users save supported Reels and videos for personal reference, provided the content is accessible to the tool.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;No Separate Software Installation&lt;br&gt;
Online tools can be useful for people who prefer not to install another application. Accessing a downloader through a browser may simplify the process, although users should review the website's current functionality and privacy practices before using it.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;How to Download Instagram Videos Using iGram&lt;br&gt;
If you want to save a supported Instagram video, the process is generally simple.&lt;/p&gt;

&lt;p&gt;Step 1: Open Instagram&lt;/p&gt;

&lt;p&gt;Visit Instagram and find the public post or Reel you want to save.&lt;/p&gt;

&lt;p&gt;Step 2: Copy the Post Link&lt;/p&gt;

&lt;p&gt;Open the post options and select the option to copy its link.&lt;/p&gt;

&lt;p&gt;Step 3: Visit iGram.pk&lt;/p&gt;

&lt;p&gt;Open the iGram.pk website in your preferred browser.&lt;/p&gt;

&lt;p&gt;Step 4: Paste the Link&lt;/p&gt;

&lt;p&gt;Paste the copied Instagram URL into the downloader's input field.&lt;/p&gt;

&lt;p&gt;Step 5: Follow the Download Instructions&lt;/p&gt;

&lt;p&gt;Submit the link and, if the content is supported, follow the available instructions to download the media to your device.&lt;/p&gt;

&lt;p&gt;The exact options may vary depending on the Instagram post and the website's current functionality.&lt;/p&gt;

&lt;p&gt;Who Can Benefit From iGram.pk?&lt;br&gt;
An online Instagram downloader may be useful for different types of users.&lt;/p&gt;

&lt;p&gt;Students and learners: Save permitted educational videos for revision and reference.&lt;/p&gt;

&lt;p&gt;Content creators: Collect examples of visual storytelling and creative ideas for inspiration.&lt;/p&gt;

&lt;p&gt;Digital marketers: Review social media content and campaign examples when planning their own strategies.&lt;/p&gt;

&lt;p&gt;Travel enthusiasts: Keep a personal collection of travel inspiration and memorable clips.&lt;/p&gt;

&lt;p&gt;Everyday Instagram users: Save content they enjoy for convenient personal access, where downloading is supported and permitted.&lt;/p&gt;

&lt;p&gt;Regardless of your purpose, it is important to respect the original creator's rights and Instagram's applicable terms.&lt;/p&gt;

&lt;p&gt;Is It Legal to Download Instagram Videos and Photos?&lt;br&gt;
The legality of downloading Instagram content depends on factors such as copyright ownership, permission, the intended use, and applicable local laws.&lt;/p&gt;

&lt;p&gt;Downloading a video does not automatically grant permission to republish it, use it in advertising, or include it in commercial projects. If you want to reuse someone else's content, obtain permission from the copyright owner and provide attribution when appropriate.&lt;/p&gt;

&lt;p&gt;You should also avoid attempting to access private content without authorization and review Instagram's terms and the downloader's privacy practices.&lt;/p&gt;

&lt;p&gt;Final Thoughts&lt;br&gt;
Finding a convenient way to save useful social media content can make everyday browsing more practical. For users looking for a browser-based option, iGram.pk is worth exploring as an online Instagram downloader.&lt;/p&gt;

&lt;p&gt;Whether you are collecting creative inspiration, saving educational references, or keeping permitted content for personal viewing, start by visiting iGram.pk and checking the features currently available.&lt;/p&gt;

&lt;p&gt;Use any downloader responsibly, respect creators' intellectual property, and make sure you have the necessary permission before sharing or commercially reusing downloaded media.&lt;/p&gt;

&lt;p&gt;Visit iGram.pk to explore its Instagram downloading options.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Dev Std</dc:creator>
      <pubDate>Sun, 11 Oct 2026 12:56:06 +0000</pubDate>
      <link>https://dev.to/devstd/-2jmf</link>
      <guid>https://dev.to/devstd/-2jmf</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/devstd/building-a-multi-language-instagram-downloader-with-php-no-4l9o" class="crayons-story__hidden-navigation-link"&gt;Building a Multi-Language Instagram Downloader with PHP - No&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/devstd" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4172880%2F9e86238e-3cc3-44b8-aa68-ff19f63055b9.jpg" alt="devstd profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/devstd" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Dev Std
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Dev Std
                
                
              
              &lt;div id="story-author-preview-content-4822159" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/devstd" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4172880%2F9e86238e-3cc3-44b8-aa68-ff19f63055b9.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Dev Std&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/devstd/building-a-multi-language-instagram-downloader-with-php-no-4l9o" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Oct 9&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/devstd/building-a-multi-language-instagram-downloader-with-php-no-4l9o" id="article-link-4822159"&gt;
          Building a Multi-Language Instagram Downloader with PHP - No
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/php"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;php&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/seo"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;seo&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/opensource"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;opensource&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/devstd/building-a-multi-language-instagram-downloader-with-php-no-4l9o" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;3&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/devstd/building-a-multi-language-instagram-downloader-with-php-no-4l9o#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              9&lt;span class="hidden s:inline"&gt;&amp;nbsp;comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            4 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>backend</category>
      <category>php</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How I Built a Multilingual Instagram Downloader with Pure PHP (No Framework)</title>
      <dc:creator>Dev Std</dc:creator>
      <pubDate>Sat, 10 Oct 2026 10:28:12 +0000</pubDate>
      <link>https://dev.to/devstd/how-i-built-a-multilingual-instagram-downloader-with-pure-php-no-framework-2h25</link>
      <guid>https://dev.to/devstd/how-i-built-a-multilingual-instagram-downloader-with-pure-php-no-framework-2h25</guid>
      <description>&lt;p&gt;Most developers reach for Laravel or Symfony when starting a PHP project. I went the opposite direction  I built &lt;a href="https://igram.pk" rel="noopener noreferrer"&gt;iGram.pk&lt;/a&gt;, a free Instagram downloader that supports 16 languages, using nothing but vanilla PHP, .htaccess routing, and a clean file structure.&lt;/p&gt;

&lt;p&gt;Here's what I learned and how I structured it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why No Framework?
&lt;/h2&gt;

&lt;p&gt;For a tool like this, a full framework is overkill. The app does one thing: accept an Instagram URL, fetch the media, and serve it for download. I needed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fast page loads (no framework overhead)&lt;/li&gt;
&lt;li&gt;Clean SEO-friendly URLs&lt;/li&gt;
&lt;li&gt;Multi-language support without bloated i18n libraries&lt;/li&gt;
&lt;li&gt;Easy deployment on shared hosting or Heroku&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vanilla PHP gave me all of this with a tiny footprint.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Routing Layer
&lt;/h2&gt;

&lt;p&gt;Instead of a framework router, I used a single &lt;code&gt;index.php&lt;/code&gt; as the entry point with &lt;code&gt;.htaccess&lt;/code&gt; rewrites:&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
apache
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [QSA,L]

Then in index.php, I parse the URI and route to the right page:

$uri = trim(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH), '/');
$segments = explode('/', $uri);

// Check if first segment is a language code
$supportedLangs = ['ar', 'bn', 'de', 'es', 'fr', 'id', 
                   'it', 'ja', 'ko', 'pl', 'pt', 'ru', 
                   'th', 'tr', 'vi'];

$lang = 'en';
if (in_array($segments[0], $supportedLangs)) {
    $lang = array_shift($segments);
}

$page = implode('/', $segments) ?: 'home';

No regex libraries. No route definitions file. Just array lookups and string parsing. It handles 260+ URLs with zero dependencies.

Multi-Language Without i18n Libraries

Each language gets a single PHP file that returns a nested array:

// includes/translations/ko.php
return [
    'common' =&amp;gt; [
        'site_name' =&amp;gt; 'iGram',
        'download_btn' =&amp;gt; '다운로드',
        'paste_placeholder' =&amp;gt; 'Instagram 링크를 여기에 붙여넣으세요',
        'how_to_title' =&amp;gt; '다운로드 방법',
    ],
    'story-saver' =&amp;gt; [
        'title' =&amp;gt; 'Instagram 스토리 세이버',
        'description' =&amp;gt; '공개 Instagram 스토리를 다운로드하세요',
    ],
];

The loader merges common strings with page-specific ones:

function loadTranslations($lang, $slug = null) {
    if ($lang === 'en') return [];
    $file = __DIR__ . '/translations/' . $lang . '.php';
    if (!file_exists($file)) return [];
    $all = include $file;
    $common = $all['common'] ?? [];
    if ($slug === null) return $common;
    $page = $all[$slug] ?? [];
    return array_merge($common, $page);
}

function t($translations, $key, $fallback = '') {
    return $translations[$key] ?? $fallback;
}

The $fallback parameter is key — English pages just use the fallback strings directly, so there’s no English translation file at all. Less files, less maintenance.

SEO With Structured Data

Every tool page gets proper Schema.org JSON-LD without any library:

function schemaWebApplication($name, $path, $description, $lang = 'en') {
    return [
        '@context' =&amp;gt; 'https://schema.org',
        '@type' =&amp;gt; 'WebApplication',
        'name' =&amp;gt; $name,
        'url' =&amp;gt; 'https://igram.pk/' . ltrim($path, '/'),
        'description' =&amp;gt; $description,
        'applicationCategory' =&amp;gt; 'MultimediaApplication',
        'operatingSystem' =&amp;gt; 'Any',
        'inLanguage' =&amp;gt; $lang,
        'isAccessibleForFree' =&amp;gt; true,
        'offers' =&amp;gt; [
            '@type' =&amp;gt; 'Offer', 
            'price' =&amp;gt; '0', 
            'priceCurrency' =&amp;gt; 'USD'
        ],
    ];
}

This plus proper hreflang tags for all 16 languages gives Google clear signals about what each page is and which language it targets.

Hreflang for 16 Languages

Each tool page outputs hreflang links for every language variant:

$languages = getSupportedLanguages(); // returns all 16 codes
foreach ($languages as $code) {
    $href = $code === 'en' ? "/$slug" : "/$code/$slug";
    echo '&amp;lt;link rel="alternate" hreflang="' . $code . '" 
          href="https://igram.pk' . $href . '"/&amp;gt;';
}
echo '&amp;lt;link rel="alternate" hreflang="x-default" 
      href="https://igram.pk/' . $slug . '"/&amp;gt;';

The sitemap mirrors this with xhtml:link entries — 260 URLs total, all with proper language annotations.

Deployment

The whole app runs on Heroku’s free tier with one line in the Procfile:

web: vendor/bin/heroku-php-apache2

No build step. No compilation. Push and it’s live.

Performance Results

Without a framework:

First Byte Time: ~120ms
Total page weight: ~45KB (including CSS and JS)
Lighthouse Performance: 95+
Zero npm dependencies
What I’d Do Differently
Use a simple template engine — I started with raw &amp;lt;?php echo everywhere. Even a 50-line template function would’ve saved time.
Add automated tests earlier — Vanilla PHP makes it easy to skip testing. Don’t.
Plan the translation structure upfront — Adding languages 3 at a time when you started with 13 means retrofitting every page template.
Try It

The tool is live at igram.pk. It supports downloading Instagram videos, Reels, photos, carousel posts, Stories, Highlights, and profile pictures — all free, no login required.

If you’re building a simple web tool, consider whether you actually need that framework. Sometimes plain PHP is the fastest path to production.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>php</category>
      <category>webdev</category>
      <category>seo</category>
      <category>opensource</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Dev Std</dc:creator>
      <pubDate>Sat, 10 Oct 2026 00:57:40 +0000</pubDate>
      <link>https://dev.to/devstd/-2c5h</link>
      <guid>https://dev.to/devstd/-2c5h</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/devstd/building-a-multi-language-instagram-downloader-with-php-no-4l9o" class="crayons-story__hidden-navigation-link"&gt;Building a Multi-Language Instagram Downloader with PHP - No&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/devstd" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4172880%2F9e86238e-3cc3-44b8-aa68-ff19f63055b9.jpg" alt="devstd profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/devstd" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Dev Std
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Dev Std
                
                
              
              &lt;div id="story-author-preview-content-4822159" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/devstd" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4172880%2F9e86238e-3cc3-44b8-aa68-ff19f63055b9.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Dev Std&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/devstd/building-a-multi-language-instagram-downloader-with-php-no-4l9o" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Oct 9&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/devstd/building-a-multi-language-instagram-downloader-with-php-no-4l9o" id="article-link-4822159"&gt;
          Building a Multi-Language Instagram Downloader with PHP - No
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/php"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;php&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/seo"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;seo&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/opensource"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;opensource&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/devstd/building-a-multi-language-instagram-downloader-with-php-no-4l9o" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;3&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/devstd/building-a-multi-language-instagram-downloader-with-php-no-4l9o#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              9&lt;span class="hidden s:inline"&gt;&amp;nbsp;comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            4 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>php</category>
      <category>programming</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Building a Multi-Language Instagram Downloader with PHP - No</title>
      <dc:creator>Dev Std</dc:creator>
      <pubDate>Fri, 09 Oct 2026 08:37:09 +0000</pubDate>
      <link>https://dev.to/devstd/building-a-multi-language-instagram-downloader-with-php-no-4l9o</link>
      <guid>https://dev.to/devstd/building-a-multi-language-instagram-downloader-with-php-no-4l9o</guid>
      <description>&lt;p&gt;I recently built &lt;a href="https://igram.pk" rel="noopener noreferrer"&gt;iGram.pk&lt;/a&gt;, an Instagram downloader that supports 13 languages, serves 9 dedicated tool pages, and runs on a single &lt;code&gt;index.php&lt;/code&gt; front controller with zero framework dependencies. Here's what I learned about routing, i18n, SEO, and shipping fast without Laravel or Symfony.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why No Framework?
&lt;/h2&gt;

&lt;p&gt;The project needed to be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fast to load&lt;/strong&gt; - every millisecond counts for a tool people use on mobile&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cheap to host&lt;/strong&gt;- Heroku free/basic tier with Apache&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simple to deploy&lt;/strong&gt; - &lt;code&gt;git push&lt;/code&gt; and done&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A framework would add 20-50MB of vendor code, boot time overhead, and complexity that a tool site doesn't need. The entire codebase fits in a handful of files.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Routing Problem
&lt;/h2&gt;

&lt;p&gt;With 9 tool pages, 13 languages, 40+ blog posts, and static pages (about, contact, FAQ, legal), I needed clean URLs like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/download-instagram-reels        (English)
/ar/download-instagram-reels     (Arabic)
/fr/story-saver                  (French)
/blog                            (Blog index)
/how-to-download-instagram-videos (Blog post)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The solution is a single &lt;code&gt;index.php&lt;/code&gt; that acts as a front controller. Apache's &lt;code&gt;.htaccess&lt;/code&gt; sends everything there:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight apache"&gt;&lt;code&gt;&lt;span class="nc"&gt;RewriteCond&lt;/span&gt; %{REQUEST_FILENAME} !-f
&lt;span class="nc"&gt;RewriteCond&lt;/span&gt; %{REQUEST_FILENAME} !-d
&lt;span class="nc"&gt;RewriteRule&lt;/span&gt; ^(.*)$ /index.php [L,QSA]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then &lt;code&gt;index.php&lt;/code&gt; parses the URI, extracts the language prefix (if any), and routes to the correct PHP file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$requestUri&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;parse_url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$_SERVER&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'REQUEST_URI'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="kc"&gt;PHP_URL_PATH&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$requestUri&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;rawurldecode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$requestUri&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$slug&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;ltrim&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$requestUri&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'/'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Extract language prefix&lt;/span&gt;
&lt;span class="nv"&gt;$languages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'ar'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'de'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'es'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'fr'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'id'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'it'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'ja'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'pl'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'pt'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'ru'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'tr'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'vi'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="nv"&gt;$currentLang&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'en'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$languages&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nv"&gt;$l&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;strpos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$slug&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$l&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;'/'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$currentLang&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$l&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nv"&gt;$slug&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;substr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$slug&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;strlen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$l&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Route to the right file&lt;/span&gt;
&lt;span class="nv"&gt;$toolPages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'story-saver'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'downloadgram'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'download-instagram-reels'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;...&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;in_array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$slug&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$toolPages&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;include&lt;/span&gt; &lt;span class="k"&gt;__DIR__&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;'/pages/tools/'&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$slug&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;'.php'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No regex router library, no route registration — just an array lookup. It handles hundreds of URL combinations with zero overhead.&lt;/p&gt;

&lt;h2&gt;
  
  
  Multi-Language Without a Framework
&lt;/h2&gt;

&lt;p&gt;The i18n system is file-based. Each language gets a PHP file that returns an associative array:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// includes/translations/ar.php&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s1"&gt;'common'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="s1"&gt;'download'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'تحميل'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'paste_link'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'الصق رابط Instagram هنا'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'video_downloader'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'تحميل فيديو'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="c1"&gt;// ...&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="s1"&gt;'story-saver'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="s1"&gt;'title'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'حفظ ستوري انستقرام - تحميل القصص | iGram.pk'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'description'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'...'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'steps'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'...'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'...'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'...'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The loader merges common translations with page-specific ones:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;loadTranslations&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$lang&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$slug&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$lang&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="s1"&gt;'en'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
    &lt;span class="nv"&gt;$all&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;include&lt;/span&gt; &lt;span class="k"&gt;__DIR__&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;'/translations/'&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$lang&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;'.php'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;$common&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$all&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'common'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
    &lt;span class="nv"&gt;$page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$all&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$slug&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;array_merge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$common&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$page&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;English is the default — if a translation key is missing, the template falls back to the hardcoded English string using the null coalescing operator:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$pageTitle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$t&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'title'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="s1"&gt;'Instagram Story Saver - Download Stories | iGram.pk'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This approach is simple, fast (no database queries), and easy to extend. Adding a new language is literally creating one PHP file.&lt;/p&gt;

&lt;h2&gt;
  
  
  SEO Architecture
&lt;/h2&gt;

&lt;p&gt;For a content site competing in search, SEO structure matters as much as content quality. Here's what I implemented:&lt;/p&gt;

&lt;h3&gt;
  
  
  Structured Data (Schema.org)
&lt;/h3&gt;

&lt;p&gt;Every page type gets appropriate JSON-LD markup through helper functions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;schemaArticle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$headline&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$description&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$published&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$modified&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="s1"&gt;'@context'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'https://schema.org'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'@type'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Article'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'headline'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$headline&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'description'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$description&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'datePublished'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$published&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'dateModified'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$modified&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'author'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'@type'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Organization'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'name'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'iGram.pk'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="c1"&gt;// ...&lt;/span&gt;
    &lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tool pages use &lt;code&gt;WebApplication&lt;/code&gt; schema, blog posts use &lt;code&gt;Article&lt;/code&gt;, FAQ sections use &lt;code&gt;FAQPage&lt;/code&gt;. Each schema type is a function that takes the page's actual data, so the markup always matches the visible content.&lt;/p&gt;

&lt;h3&gt;
  
  
  Hreflang for Multi-Language
&lt;/h3&gt;

&lt;p&gt;Each tool page generates hreflang tags for all 13 language variants:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;getSupportedLanguages&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nv"&gt;$l&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$hreflangPages&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$l&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;ltrim&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;langUrl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$l&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$slug&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s1"&gt;'/'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This tells Google which version to show French users vs Arabic users vs English users. Without hreflang, Google might index the wrong language variant for a given region.&lt;/p&gt;

&lt;h3&gt;
  
  
  Blog Posts Are English-Only
&lt;/h3&gt;

&lt;p&gt;Blog content is only in English. If someone hits &lt;code&gt;/fr/how-to-download-instagram-videos&lt;/code&gt;, the router 301 redirects to the English version. This avoids thin translated content and keeps the canonical clear.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$currentLang&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="s1"&gt;'en'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;header&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Location: /'&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$blogSlug&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;301&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  AI Search Optimization
&lt;/h2&gt;

&lt;p&gt;With ChatGPT, Perplexity, and Google AI Overviews reshaping how people find tools, I added signals that AI crawlers specifically look for:&lt;/p&gt;

&lt;h3&gt;
  
  
  llms.txt
&lt;/h3&gt;

&lt;p&gt;This is a structured file at the site root that tells AI crawlers what the site is about:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# iGram.pk&lt;/span&gt;
&lt;span class="gt"&gt;&amp;gt; iGram.pk is a free, web-based Instagram downloader...&lt;/span&gt;

&lt;span class="gu"&gt;## Tools&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Video Downloader&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://igram.pk/download-instagram-video&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;: download videos in HD
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Story Saver&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://igram.pk/story-saver&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;: save Stories before expiry
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  robots.txt AI Bot Permissions
&lt;/h3&gt;

&lt;p&gt;Explicitly allowing AI crawler bots:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight apache"&gt;&lt;code&gt;&lt;span class="nc"&gt;User&lt;/span&gt;-agent: GPTBot
&lt;span class="nc"&gt;Allow&lt;/span&gt;: /

&lt;span class="nc"&gt;User&lt;/span&gt;-agent: ClaudeBot
&lt;span class="nc"&gt;Allow&lt;/span&gt;: /

&lt;span class="nc"&gt;User&lt;/span&gt;-agent: PerplexityBot
&lt;span class="nc"&gt;Allow&lt;/span&gt;: /
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Many sites block these bots. Allowing them increases the chance your tool gets recommended in AI-generated answers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Performance on Heroku
&lt;/h2&gt;

&lt;p&gt;The entire app runs on Heroku's basic tier with Apache:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;web: vendor/bin/heroku-php-apache2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With Cloudflare in front for caching and SSL, the setup handles the traffic without issues. PHP's built-in opcache handles the rest — no Redis, no Memcached, no queue workers.&lt;/p&gt;

&lt;p&gt;Total infrastructure cost: basically free.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd Do Differently
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Start with more tool pages&lt;/strong&gt; — dedicated pages for each content type (video, Reels, photos, carousel, Stories, Highlights, profile photos) rank independently in search. I should have built all 9 from day one instead of starting with 3.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Schema markup from the beginning&lt;/strong&gt; — I added &lt;code&gt;FAQPage&lt;/code&gt; and &lt;code&gt;Article&lt;/code&gt; schema later. Having it from launch would have earned rich snippets sooner.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Content velocity matters&lt;/strong&gt; — writing 40+ blog posts in the first two weeks had a measurable impact on organic traffic. Each post is a new entry point from search.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Results
&lt;/h2&gt;

&lt;p&gt;Within the first week:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1,500+ daily clicks from organic search&lt;/li&gt;
&lt;li&gt;143,000+ impressions for branded queries&lt;/li&gt;
&lt;li&gt;Ranking on page 1 for multiple "igram" keyword variations&lt;/li&gt;
&lt;li&gt;9 tool pages, 43 blog posts, 13 language variants&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The site is at &lt;a href="https://igram.pk" rel="noopener noreferrer"&gt;igram.pk&lt;/a&gt; if you want to see the implementation live. The &lt;a href="https://igram.pk/blog" rel="noopener noreferrer"&gt;blog&lt;/a&gt; has all 43 guides and tutorials.&lt;/p&gt;

&lt;h2&gt;
  
  
  Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;You don't need a framework for a tool site. Plain PHP with a front controller is fast, simple, and deployable anywhere.&lt;/li&gt;
&lt;li&gt;Multi-language support with file-based translations is underrated. It's faster than database lookups and easier to maintain than JSON files.&lt;/li&gt;
&lt;li&gt;SEO is architecture, not just content. Clean URLs, hreflang, structured data, and proper canonicalization compound over time.&lt;/li&gt;
&lt;li&gt;Ship fast, iterate based on search console data. GSC shows you exactly what people search for — write content that matches those queries.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Built with PHP, deployed on Heroku, cached with Cloudflare. No framework, no build step, no node_modules.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>php</category>
      <category>webdev</category>
      <category>seo</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
