Tech 3 min read

Lab Expansion: 12 New Text Tools and UI Improvements

Background

After the planning article pointed out that text processing tools were thin on the ground, I listed 12 candidates to add. This time I implemented all of them.

I also took the opportunity to rethink the category system and revamp the listing page UI.

Tools Added

All 12 tools from the plan were implemented.

PriorityToolDescription
HighJSON FormatterFormat, minify, and validate
HighBase64 ConverterEncode/decode text and images
MediumYAML FormatterFormat, validate, and convert to/from JSON
MediumText DiffHighlight differences between two texts
MediumURL Encode/DecodeSupports encodeURI/encodeURIComponent
MediumTimestamp ConverterConvert between Unix time and human-readable dates
MediumHTML Entity ConverterEscape and unescape HTML entities
LowUUID GeneratorGenerate random v4 UUIDs
LowHash GeneratorMD5/SHA-1/SHA-256/SHA-512
LowJWT DecoderDisplay header, payload, and expiry
Low.env EditorParse, detect duplicate keys, and format
LowINI EditorParse, format, and convert to JSON

I built all of them including the “Low” priority ones because once I got started, I just wanted to finish the whole list.

Category System Reorganization

The old categories were function-based.

// Old categories (function-based)
type LabToolCategory =
  | 'image-convert'
  | 'image-transform'
  | 'image-edit'
  | 'image-effect'
  | 'viewer'
  | 'nlp'
  | 'utility';

With more text processing tools added, I switched to a “purpose-based” system that creates a symmetry between image and text tools.

// New categories (purpose-based)
type LabToolCategory =
  | 'image-converter'   // image conversion
  | 'image-editor'      // image editing
  | 'image-generator'   // image generation
  | 'image-viewer'      // image viewing
  | 'text-converter'    // text conversion
  | 'text-formatter'    // text formatting
  | 'text-generator'    // text generation
  | 'text-analyzer'     // text analysis
  | 'language'          // language processing
  | 'qr-code'           // QR codes
  | 'experimental'      // experiments
  | 'utility';          // utilities

Image and text tools now follow the same pattern (converter, editor/formatter, generator, viewer/analyzer), which also makes the filter UI cleaner.

Listing UI Improvements

The Problem with Card Layout

The old card layout looks nice but started causing issues as the tool count grew.

  • Poor overview (few tools visible at once)
  • Card padding wastes vertical space
  • Descriptions sometimes get cut off awkwardly

Switch to Table Layout

With 43 tools now in the list, I switched to a table layout to prioritize scannability.

BeforeAfter
Cards (with thumbnails)Table (text only)
2–3 tools per row1 tool per row
Thumbnail images shownNo thumbnails

Thumbnails are gone, but I don’t think anyone will miss them. If you do want to browse them, the hero image gallery page has them all.

Build Size Impact

Text processing tools were implemented almost entirely with browser-native APIs, so external library additions were minimal.

  • js-yaml: for YAML parsing (~30 KB gzip)
  • diff: for text diff (~3 KB gzip)
  • js-md5: for MD5 hashing (~5 KB gzip)

SHA hashing was handled by the Web Crypto API, and UUID v4 used crypto.randomUUID(), so no additional libraries were needed for those.


Lab page: lilting.ch/lab