tools

Tools

A collection of single-file HTML tools — each tool is one .html file with inline CSS and JavaScript. No build steps, no frameworks, no dependencies beyond CDN-loaded libraries.

Inspired by Simon Willison’s “Useful patterns for building HTML tools”.

Principles

  1. One file = one tool. Everything (HTML, CSS, JS) lives in a single .html file. This makes deployment trivial — just serve static files.
  2. No build step. No React, no Webpack, no npm. If you need a library, load it from a CDN (cdnjs, jsdelivr, unpkg).
  3. Keep it small. A few hundred lines is ideal. If a tool grows too large, it’s probably two tools.
  4. Deploy = copy the file. GitHub Pages, any static host, or just open locally with file://. Zero infrastructure.
  5. Secrets stay client-side. API keys go in localStorage, never in the HTML. Use prompt() or a settings panel to collect them.

Current tools

File Description
triage.html Decision Canvas — a triage/prioritization board for sorting items
firestore.html Firestore Recovery Tool — backup and restore Firestore data

Creating a new tool

When building a new tool for this repo:

Useful patterns

These patterns from the Simon Willison article apply directly to how we work here:

Design system

The visual style is “Productivity Minimalist” — inspired by Linear, Superhuman, and Vercel. Every tool must follow these rules strictly to maintain a cohesive, premium feel.

Color palette

Use CSS custom properties defined in :root:

:root {
    --bg-body: #FFFFFF;        /* or very subtle off-white #F9FAFB */
    --bg-subtle: #F9FAFB;     /* secondary backgrounds, cards */
    --bg-element: #FFFFFF;     /* inputs, interactive elements */
    --text-main: #111827;      /* headings, primary text — never use pure #000000 */
    --text-secondary: #6B7280; /* labels, helper text, timestamps */
    --border-color: #E5E7EB;   /* all borders — thin, 1px */
    --accent-color: #2563EB;   /* ONE accent color for primary actions only */
    --focus-ring: #111827;     /* input focus borders — dark, high contrast */
    --radius: 6px;             /* subtle curve, not pill-shaped */
    --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
    --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
}

Rules:

Typography

font-family: -apple-system, BlinkMacSystemFont, "Inter", "Segoe UI", Roboto, Helvetica, Arial, sans-serif;

Components

Buttons:

Inputs:

Cards / containers:

Spacing:

CSS custom properties template

Every new tool should start with these variables in :root and reference them throughout. Never hardcode color values in individual rules — always use the variables.