{
  "id": 16309179,
  "title": "I built a zero-cost Instagram toolkit with 47 static pages, 2 edge functions and no framework",
  "url": "https://urgent.news/2026/10/24/i-built-a-zero-cost-instagram-toolkit-with-47-static-pages-2-edge",
  "topic": "tech",
  "section": "Tech",
  "published": "2026-10-24T09:49:06.000Z",
  "source": {
    "name": "Dev.to",
    "slug": "dev-to",
    "url": "https://dev.to/igkit/i-built-a-zero-cost-instagram-toolkit-with-47-static-pages-2-edge-functions-and-no-framework-2l6a"
  },
  "original_language": "en",
  "account": "I was determined to find a single location for common Instagram tasks that people often search for online. These tasks included fancy bio fonts, keeping line breaks in captions, splitting photos into a profile grid, posting without cropping, and viewing public stories without logging in. This led to the creation of IGKit. I set a rule for myself: no server costs until the project generates revenue.\n\nThe technology stack involved a 600-line build.mjs file that rendered each page using plain template strings in the dist/ directory. There was no use of React, bundlers, or dependencies. Each tool was written in vanilla JavaScript and loaded with defer. Two edge functions were used for one feature that required a server. The entire site consists of 47 pages: 5 tools, 14 long-tail font pages, 4 viewer landing pages, and two most popular tools translated into 10 languages.\n\nInstagram doesn't offer a built-in font picker, but it renders any Unicode character. For instance, bold is represented as U+1D400, and script is U+1D49C. However, some script and fraktur letters were added to Unicode later, residing in the Letterlike Symbols block instead. A range function was used to map ASCII characters to their Unicode equivalents, handling exceptions for specific letters that might otherwise result in empty boxes.\n\nKeeping blank lines in captions proved challenging as Instagram trims empty lines and leading spaces. To overcome this, the Braille blank character U+2800 was used. It counts as a real character, so it survives in the text, but it renders as nothing visually. The format function splits the text into lines, trims whitespace from each line, and replaces completely blank lines with the Braille blank character. The lines are then joined back together.\n\nThe profile grid was adjusted to a 3:4 ratio, displaying thumbnails. The old square grid makers produced misaligned profiles. The grid tool centers the cropping to the grid's ratio, slices 1080x1440 tiles on a canvas, and numbers them in posting order – from bottom-right to top-left, as the newest post appears at the top-left.\n\nFor story viewing, data from Instagram was required, which couldn't be scraped myself. Instead, third-party data APIs were called through edge functions, with their free tiers serving as the budget. The function attempts providers in order and falls back on a 403/429 error. The response is cached at the CDN with cache-control: public, s-maxage=3600, stale-while-revalidate=10800. Popular accounts are looked up by multiple providers, and one upstream call serves everyone for an hour. Media is proxied through an allowlist, ensuring Instagram CDN URLs don't become an open proxy. If every quota is used up, the page gracefully degrades by displaying a message and directing users to other tools.\n\nTo improve SEO for a new domain, one page was created per specific intent, each with its own copy and FAQ schema. Translations for major Instagram markets (Spanish, Portuguese, Indonesian, Hindi, French, German, Turkish, Russian, Japanese, and Arabic with RTL) were provided and linked with hreflang. IndexNow was implemented for Bing and other search engines on every deploy, along with a sitemap for Google.\n\nFeedback was welcomed on which tool was missing, specifically the highlights viewer and reels downloader. Additionally, inquiries were made about multi-provider fallbacks for free API tiers and how to handle quota tracking. The site is accessible at https://igkit-tools.vercel.app.",
  "summary": "I wanted one clean place for the small Instagram chores people google every day: fancy bio fonts, keeping line breaks in captions, splitting a photo into a profile grid, posting without cropping, and watching public stories without logging in. So I built IGKit . The constraint I set myself: no server cost until it earns money. Here is how that worked out. The stack (or lack of it) A ~600 line…",
  "key_points": [
    "IGKit created to consolidate common Instagram tasks with zero server costs",
    "47 static pages built using plain template strings and vanilla JavaScript",
    "Edge functions used for server-required features, with CDN caching for data"
  ],
  "editors_take": "Building a specialized toolkit with a minimal, dependency-free stack proves that developers can capture high-intent search traffic and provide essential utility without incurring the overhead of modern web frameworks.",
  "illustration": null,
  "coverage": {
    "outlets": 1,
    "also_reported_by": []
  },
  "ai_generated": true,
  "disclaimer": "Summaries, key points and the editor’s take are written by software from other outlets’ reporting and may contain errors — always check the linked original."
}