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('');
}
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);
}
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);
}
The Pattern: One Directory, One File
Every tool follows the exact same structure:
tool-name/
└── index.html ← everything lives here
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)