DEV Community

Docat
Docat

Posted on

I Built 13 Free Browser Tools in a Weekend — Here's What I Learned

Last month I launched FreeTools — a collection of free, browser-based utilities. It started with 6 tools. Now it's 13 and growing.

The twist? Zero backend. Zero frameworks. Zero build step. Just HTML, Tailwind CDN, and vanilla JavaScript.

Here's what I built and what I learned.

The Tool Suite

Tool What it does
Password Generator Cryptographically secure passwords via crypto.getRandomValues()
Invoice Generator Professional invoices with live preview + PDF download
Privacy Policy Generator GDPR-compliant policies from a questionnaire
JSON Formatter Format, validate, minify with syntax highlighting
QR Code Generator URLs, text, WiFi, email, phone, SMS
Markdown Preview Live GFM editor with side-by-side preview
Color Palette Generator Harmonious schemes from any base color
Base64 Encoder/Decoder Text and file encoding/decoding
Word Counter Words, characters, sentences, reading time
CSV to JSON Auto-detect delimiters, instant conversion
Lorem Ipsum Generator Paragraphs, sentences, or words — classic start option
Hash Generator MD5, SHA-1, SHA-256, SHA-512 with hash comparison
UUID Generator v4 (random) and v7 (time-ordered) with bulk generation

Every tool is a single index.html file. No dependencies except Tailwind CDN.

Why No Framework?

I know this sounds controversial in 2026, but here's my reasoning:

1. Zero build = zero maintenance

No node_modules. No package.json. No Webpack/Vite/Turbopack config. No dependency updates. No security advisories for 847 transitive dependencies.

Each tool is a self-contained HTML file. Deploy to GitHub Pages and forget it.

2. Instant load times

Each tool page is under 30KB. No JavaScript bundle to parse. No hydration step. The page is interactive the moment HTML parsing completes.

3. Truly private

"100% client-side" isn't just a tagline — there's literally no server to send data to. GitHub Pages serves static files. That's it.

Technical Highlights

Hash Generator: Web Crypto API + Pure JS MD5

The SHA family (SHA-1, SHA-256, SHA-512) uses the Web Crypto API:

async function sha(algo, text) {
  const data = new TextEncoder().encode(text);
  const hashBuffer = await crypto.subtle.digest(algo, data);
  return Array.from(new Uint8Array(hashBuffer))
    .map(b => b.toString(16).padStart(2, '0'))
    .join('');
}
Enter fullscreen mode Exit fullscreen mode

But Web Crypto doesn't support MD5 (it's considered insecure). So I included a pure JS MD5 implementation for checksum use cases. All hashing happens in real-time as you type.

The tool also includes a hash comparison feature — paste an expected hash and it instantly tells you which algorithm matches.

UUID Generator: v4 and v7

UUID v4 is straightforward — fill 16 random bytes, set the version and variant bits:

function generateUuidV4() {
  const bytes = new Uint8Array(16);
  crypto.getRandomValues(bytes);
  bytes[6] = (bytes[6] & 0x0f) | 0x40; // version 4
  bytes[8] = (bytes[8] & 0x3f) | 0x80; // variant 1
  return formatBytes(bytes);
}
Enter fullscreen mode Exit fullscreen mode

UUID v7 (RFC 9562) is more interesting — it embeds a Unix timestamp in the first 48 bits, making UUIDs naturally sortable by creation time. This is huge for database primary keys:

function generateUuidV7() {
  const bytes = new Uint8Array(16);
  crypto.getRandomValues(bytes);
  const now = Date.now();
  // Embed timestamp in first 6 bytes
  bytes[0] = (now / 2**40) & 0xff;
  bytes[1] = (now / 2**32) & 0xff;
  // ... remaining timestamp bytes
  bytes[6] = (bytes[6] & 0x0f) | 0x70; // version 7
  bytes[8] = (bytes[8] & 0x3f) | 0x80; // variant 1
  return formatBytes(bytes);
}
Enter fullscreen mode Exit fullscreen mode

The Pattern: One Directory, One File

Every tool follows the exact same structure:

tool-name/
└── index.html    ← everything lives here
Enter fullscreen mode Exit fullscreen mode

Nav with breadcrumb → Main content → SEO section → Footer → <script> tag.

No shared components. No imports. Each tool is completely independent. You can literally copy one index.html to create a new tool.

Is it DRY? No. Is it maintainable? Absolutely. Each tool is ~150-300 lines. If I need to update the footer, a quick find-and-replace across 13 files takes 10 seconds.

What I'd Do Differently

Add <meta> structured data — I should add JSON-LD markup for each tool to improve search appearance.

Use Web Components — For the shared nav/footer, a lightweight custom element would reduce duplication without adding a build step.

Add offline support — A service worker would make these tools work without internet. Since there's no backend, it's trivial.

The SEO Play

Each tool targets a specific search query:

  • "free password generator online"
  • "uuid generator v7"
  • "sha256 hash online"
  • "lorem ipsum generator"
  • "csv to json converter"

These are high-volume, low-competition queries. The tools are genuinely useful (not just SEO bait), so they should rank well over time.

Try It

👉 FreeTools — 13 Free Browser Tools

All source code is on GitHub. MIT licensed.

Building AI-powered tools? Check out mcp-openapi (turn any REST API into AI-callable tools) and graphql-to-mcp (same for GraphQL).

Top comments (0)