— Project 03

Transform Text Extension

DeveloperOct 2023 Mar 2026

macOS and Safari have a native Transform option in the right-click context menu — uppercase, lowercase, and title case built directly into the OS. Chromium-based browsers and Firefox have no equivalent. Every time I switched browsers, that feature was gone.

I had already built Transform Text — a single-page React application covering the transformations I used most: formatting strings for file names, function names, API payloads, and JSON bodies. The logic was written, tested, and working. The missing piece was surface area — it needed to be available everywhere, not just in a browser tab.

This project was also my first deliberate experiment using generative AI as a coding partner. I had seen a talk by developers at Microsoft on integrating AI into their daily workflow and wanted to test the same approach on a real, bounded project. The scope made it a good candidate — the transformation logic was already written, requirements were clear, and I could review every output critically.

Before writing a line of extension code, I reviewed the existing repo. The review surfaced real issues: a function named in PascalCase inconsistent with every other export, a circular test where the expected value used the same logic as the function under test, a non-deterministic test that could fail by chance, and missing explicit return types on several functions. All were fixed and committed before anything was ported across.

The extension is built with TypeScript compiled by esbuild, tested with Vitest, and follows Manifest V3. The initial implementation used <all_urls> in the content scripts, which triggered a broad host permissions warning during Chrome Web Store submission. Rather than accepting the warning, I refactored to use chrome.scripting.executeScript with activeTab — injecting the replacement script only when the user explicitly triggers a transformation. One transformation, Trim Whitespace, came from Claude during planning — a useful addition I hadn't considered.

Firefox support was added in v1.1.0 via webextension-polyfill— it required source code submission alongside the built ZIP and additional manifest declarations Chrome didn't need.

The extension was approved first time on all three stores — Chrome Web Store, Microsoft Edge Add-ons, and Firefox Add-ons — with no rejections or resubmissions.