# Lee Johnson > Lee Johnson is a UK-based app and web developer. He builds Apple Watch and iOS apps, fast mobile-first websites, data sites built from official statistics, and privacy-first, cookie-free analytics. He is available for hire. - Website: https://leej.uk/?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt - Email: hello@leej.uk - Phone: +44 7307 307625 - X: https://x.com/leejohnson (@leejohnson) ## Sites - [quietstats](https://quietstats.co.uk): cookie-free website analytics with a tracking script under 1 KB. No banner, no tracking. - [FlightScout](https://leej.uk/flightscout/?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): on-demand cheapest Google Flights fares in GBP. Nearby days (±3) compares seven departures so you can pick a cheaper date. - [HotelScout](https://leej.uk/hotelscout/?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): on-demand cheapest Google Hotels stays for a place and dates in GBP. Search only when you ask. - [FuelStop](https://leej.uk/fuelstop/?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): cheapest UK petrol or diesel near a place or postcode. Live forecourt prices, search only when you ask. - [Grok Booth](https://grok-bot-image-generator.vercel.app): a Grok bot avatar maker. Pick from 60 looks, mix shapes, eyes, mouths and extras, and save clear circular PNG or SVG icons for iOS. - [Stat Monkey](https://statmonkey.net): free, phone-first Premier League stats: the live table, match sheets, club and player pages and share images. - [Monkey Book](https://book.statmonkey.net): a free paper Premier League predictor built on Stat Monkey's data. Model calls, a paper bet slip, Big6 against the Monkey and an open results record. No real money, 18+. - [Scamdetectr](https://scamdetectr.com): a free, moderated directory of phones, emails and web addresses reported in scam and spam complaints, with sources and dates on every record. - [Court Day UK](https://courtday.uk): official UK court statistics. Search offences and local courts. Official figures, never names. - [evalu8](https://evalu8.co.uk): independent reviews of AI tools for UK sole traders and small businesses, with prices in £, VAT, GDPR and hours saved. - [StromaScape](https://stromascape.com): Apple Watch faces with live complications and customisation. ## Project pages A detailed page for each project: what it is, who it's for, what it does, why I built it and how it's built. - [All projects](https://leej.uk/projects?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt) - [quietstats](https://leej.uk/projects/quietstats?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt) - [FlightScout](https://leej.uk/projects/flightscout?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): on-demand cheapest flights in GBP; Nearby days (±3) compares nearby departures. - [HotelScout](https://leej.uk/projects/hotelscout?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): cheapest hotel stays near a place for your dates in GBP. - [FuelStop](https://leej.uk/projects/fuelstop?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): cheapest UK petrol or diesel near a place or postcode. - [Grok Booth](https://leej.uk/projects/grok-booth?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt) - [Stat Monkey](https://leej.uk/projects/stat-monkey?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt) - [Monkey Book](https://leej.uk/projects/monkey-book?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt) - [Scamdetectr](https://leej.uk/projects/scamdetectr?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt) - [Court Day UK](https://leej.uk/projects/court-day-uk?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt) - [evalu8](https://leej.uk/projects/evalu8?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt) - [StromaScape](https://leej.uk/projects/stromascape?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt) - [Kirby Essentials Pro](https://leej.uk/projects/kirby-essentials-pro?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): a modular plugin for Kirby 4 and 5 (PHP 8.1+): SEO, speed, forms, consent and redirects under one licence per site. Live, with all 24 modules documented. Product site: [kirbyessentialtool.com](https://kirbyessentialtool.com/?utm_source=leej.uk&utm_medium=referral&utm_campaign=kep-project&utm_content=llms-txt). ## Developer tools - [Developer tools](https://leej.uk/tools): 244 free tools for web designers and developers, built by Lee Johnson. Every tool runs in your browser: nothing you type, paste or upload is sent anywhere, there's no sign-up and they cost nothing. They're grouped into 12 sections (Indexing and AI visibility, Colour and accessibility, Layout and CSS, Images and media, SEO and marketing, Performance, Code and data, APIs and the web platform, Architecture and modelling, Encode, generate and time, Security and server, Planning, content and testing). 50 more are in production: 0 being built now and 50 planned next. - [Indexability Checker](https://leej.uk/tools/indexability-checker): Combines status, redirects, robots.txt, meta robots, X-Robots-Tag, canonicals, sitemap and hreflang into one verdict for Googlebot and Bingbot. - [llms.txt Validator](https://leej.uk/tools/llms-txt-validator): Parses llms.txt by the llmstxt.org format, flags structure and link problems, estimates size in tokens and writes a cleaned-up file. - [llms-full.txt Builder](https://leej.uk/tools/llms-full-txt-builder): Extracts each page's main content, converts it to Markdown, removes blocks repeated across pages and bundles llms-full.txt and llms.txt. - [XML Sitemap Validator](https://leej.uk/tools/sitemap-validator): Checks sitemaps and sitemap indexes against sitemaps.org rules with line numbers, including extensions, limits, hosts and lastmod dates. - [IndexNow Submission Builder](https://leej.uk/tools/indexnow-submitter): Makes an IndexNow key and key file, checks the key file is live, validates URLs by the protocol rules and writes the link, JSON and curl. - [Indexing Submission Tracker](https://leej.uk/tools/indexing-submission-tracker): Keeps sitemap snapshots and a submission log in your browser, diffs snapshots by URL and lastmod, and hands changes to IndexNow. - [AI Bot Log Analyser](https://leej.uk/tools/ai-bot-log-analyser): Reads access logs in the browser, finds 35 AI and search crawlers, checks their IPs against the ranges they publish and charts hits by day. - [Redirect Chain Tracer](https://leej.uk/tools/redirect-chain-tracer): Follows up to 20 URLs through up to 10 redirects each, labels what every hop changes, finds loops and temporary redirects and writes one-hop rules. - [Canonical Conflict Finder](https://leej.uk/tools/canonical-conflict-finder): Builds the URL-to-canonical graph from a crawl CSV or live pages and finds chains, cycles, bad targets and sitemap mismatches, with a fixed canonical map. - [Hreflang Cluster Validator](https://leej.uk/tools/hreflang-cluster-validator): Collects hreflang from tags, Link headers, sitemaps or live pages, checks every return link, self-reference, code and canonical, and writes corrected tags. - [Schema.org Entity Graph](https://leej.uk/tools/schema-entity-graph): Flattens every JSON-LD block into entities and links, merges by @id, and finds dangling references, islands, duplicates and untyped nesting. - [Answer Engine Content Analyser](https://leej.uk/tools/answer-engine-structure-analyser): Scores each section on question headings, direct answers, definitions, lists and reading ease, and the page on dates, sources and consistent names. - [Rendered vs Raw HTML Diff](https://leej.uk/tools/rendered-vs-raw-html-diff): Diffs the raw HTML and the rendered DOM facet by facet and works out the share of text that only exists after JavaScript runs. - [Snippet & AI Preview Control Tester](https://leej.uk/tools/snippet-control-tester): Reads robots meta tags, X-Robots-Tag headers and data-nosnippet sections per crawler, strikes out what Google won't quote and writes the tags you want. - [robots.txt & llms.txt Change Watch](https://leej.uk/tools/robots-llms-change-watch): Fetches both files on demand, keeps snapshots in your browser, diffs them and re-tests 36 AI and search crawlers on old and new versions. - [Internal Link & Orphan Page Graph](https://leej.uk/tools/internal-link-graph): Builds the internal link graph from a crawl export and works out click depth, internal PageRank, orphans, links to redirects and generic anchors. - [AI Crawler robots.txt Tester](https://leej.uk/tools/ai-crawler-robots-tester): Runs your robots.txt for 35 AI and search crawlers over every path you list, shows the rule that decides each one, and flags the mistakes that block search engines by accident. - [Schema.org Validator & Rich Result Checker](https://leej.uk/tools/schema-rich-result-validator): Reads JSON-LD, Microdata and RDFa, checks every type, property and value against schema.org, then Google's rich result requirements. - [Search Console Indexing Report Analyser](https://leej.uk/tools/gsc-indexing-report-analyser): Groups Search Console's not-indexed pages by reason and folder, weighs each reason by how much it matters and ranks the fixes, with a CSV to work through. - [AI Crawler IP & User-Agent Verifier](https://leej.uk/tools/ai-bot-ip-verifier): Checks each visit that claims to be an AI or search crawler against the IP ranges its company publishes, and writes rules to block the fakes. - [Crawl Trap & URL Parameter Finder](https://leej.uk/tools/crawl-trap-finder): Finds the URL patterns that waste crawl budget (session IDs, facet combinations, endless calendars and pagination, repeating paths) and suggests robots.txt rules. - [Keyword Cannibalisation Finder](https://leej.uk/tools/keyword-cannibalisation-finder): Finds the queries where two or more of your pages compete in Google, from Search Console query and page rows, and says which to merge, redirect or re-target. - [Title & Meta Bulk Auditor](https://leej.uk/tools/title-meta-bulk-auditor): Checks the titles and meta descriptions from a whole crawl for pixel width, length, duplicates and gaps, and lists each page to fix with how Google would cut it. - [Faceted Navigation & Pagination Planner](https://leej.uk/tools/pagination-facet-planner): Counts the URLs your filters and pagination create, then plans which to index, which to noindex and which to block, with robots.txt rules and link advice. - [AI Crawler Firewall Rule Builder](https://leej.uk/tools/ai-crawler-firewall-rules): Writes WAF, nginx, Apache and Workers rules to allow, block or rate-limit AI crawlers by user agent and verified IP range. - [AI Usage Policy Builder (TDMRep, Content Signals, ai.txt)](https://leej.uk/tools/ai-usage-policy-builder): Builds machine-readable AI usage opt-outs: TDMRep JSON and headers, robots.txt Content Signals and ai.txt, and validates existing ones. - [AI Crawler & Fetcher Directory](https://leej.uk/tools/ai-user-agent-directory): A searchable reference of AI crawlers, fetchers and agents: robots token, purpose, IP list, documentation and opt-out method. - [Markdown Mirror Generator for AI Agents](https://leej.uk/tools/markdown-mirror-generator): Turns pages into .md mirrors and writes the routing rules to serve them by URL suffix or Accept: text/markdown. - [X-Robots-Tag Header Rule Builder](https://leej.uk/tools/x-robots-tag-rule-builder): Writes server rules that send X-Robots-Tag for PDFs, feeds, search pages and staging hosts, with a tester for paths. - [Sitemap Coverage Diff](https://leej.uk/tools/sitemap-coverage-diff): Compares sitemap URLs with a crawl export and Search Console pages to find missing, orphaned and unindexed URLs. - [Image & Video Sitemap Generator](https://leej.uk/tools/image-video-sitemap-generator): Extracts images and videos from pasted pages and writes valid image and video sitemap XML. - [RSS, Atom & JSON Feed Validator](https://leej.uk/tools/feed-validator): Validates RSS 2.0, Atom and JSON Feed: required fields, dates, GUIDs, enclosures and discovery tags. - [Google Discover Readiness Checker](https://leej.uk/tools/discover-eligibility-checker): Checks a page against Google's documented Discover guidance: large images, max-image-preview, titles and structured data. - [Entity Home & sameAs Builder](https://leej.uk/tools/entity-home-sameas-builder): Builds Organization or Person JSON-LD for your entity home page with validated sameAs profile IDs. - [Soft 404 & Error Page Checker](https://leej.uk/tools/soft-404-checker): Requests a made-up URL on your site to see if missing pages return a real 404 or a soft 404. - [Structured Data Diff](https://leej.uk/tools/structured-data-diff): Compares JSON-LD between two versions of a page to catch rich-result properties lost in a redesign or deploy. - [URL Normalisation & Duplicate URL Finder](https://leej.uk/tools/url-normalisation-tester): Normalises a URL list by your rules (case, slashes, parameters, tracking tags) and finds duplicates with redirect rules. - [Crawl Comparison for Site Migrations](https://leej.uk/tools/crawl-comparison): Diffs two crawl exports (before and after a launch) for lost pages, status changes, titles, canonicals and word counts. - [Redirect Map Builder](https://leej.uk/tools/redirect-map-builder): Matches old URLs to new ones by slug, title and content similarity and exports a 301 map and server rules. - [Site Architecture & Click Depth Planner](https://leej.uk/tools/site-architecture-planner): Models a planned page tree and navigation to estimate click depth and internal link flow before launch. - [Near-Duplicate Content Checker](https://leej.uk/tools/duplicate-content-checker): Finds near-duplicate pages within your own site using shingles and SimHash on pasted pages or crawl text. - [Infinite Scroll & Load More Crawlability Checker](https://leej.uk/tools/infinite-scroll-crawlability): Checks whether paginated, infinite-scroll and load-more content is reachable through real links that crawlers follow. - [Contrast Checker](https://leej.uk/tools/contrast-checker): WCAG 2.2 AA and AAA checks, APCA, the nearest colour that passes, and an accessible palette from one brand colour. - [Image Palette Extractor](https://leej.uk/tools/image-palette-extractor): Pulls the main colours from any photo, logo or screenshot and shows which text and background pairs pass WCAG. - [Colour Blindness Simulator](https://leej.uk/tools/colour-blindness-simulator): Shows a design through four types of colour vision deficiency and flags palette colours that become hard to tell apart. - [Tap Target & Focus Checker](https://leej.uk/tools/tap-target-checker): Measures every link, button and field in pasted HTML for WCAG 2.2 target size, visible focus and an accessible name. - [Readability Checker](https://leej.uk/tools/readability-checker): Scores your copy for Flesch reading ease and UK reading age, and highlights long sentences and passive voice. - [Colour Converter](https://leej.uk/tools/colour-converter): Converts any CSS colour into HEX, RGB, HSL, HWB, OKLab, OKLCH and more, with opacity and contrast on white and black. - [Colour Harmony Generator](https://leej.uk/tools/colour-harmony-generator): Builds complementary, analogous, triadic and other palettes from one colour, with 50 to 900 shades for CSS and Tailwind. - [Accessibility Tree Inspector](https://leej.uk/tools/accessibility-tree-inspector): Builds the accessibility tree for pasted HTML and shows, step by step, how each element's accessible name was worked out. - [ARIA Role & Attribute Validator](https://leej.uk/tools/aria-validator): Checks the ARIA in pasted HTML against the ARIA 1.2 role model and ARIA in HTML, and gives each problem a rule, a line and a fix. - [APCA & WCAG Palette Optimiser](https://leej.uk/tools/apca-palette-optimiser): Checks a palette's text and background pairs with WCAG 2 and APCA, then fixes the failures by moving OKLCH lightness as little as possible. - [Design Token Generator](https://leej.uk/tools/design-token-generator): Builds 50 to 950 OKLCH colour scales from brand colours, picks light and dark semantic tokens by contrast, and exports them in five formats. - [Focus Order & Keyboard Trap Analyser](https://leej.uk/tools/focus-order-analyser): Renders pasted HTML, focuses every element in Tab order, and checks each stop for focus styles, names, order and hidden content. - [Motion & Animation Safety Auditor](https://leej.uk/tools/motion-safety-auditor): Checks every CSS animation and transition for flash rate, endless motion and missing prefers-reduced-motion support, against WCAG 2.2, and writes the override CSS. - [Forced Colours Mode Previewer](https://leej.uk/tools/forced-colours-previewer): Shows your HTML side by side as written and in simulated forced colours mode, and lists the icons, borders, focus rings and states that disappear, with fixes. - [Alt Text Quality Auditor](https://leej.uk/tools/alt-text-auditor): Checks every image's alt text in pasted HTML for missing alts, file names, "image of" openers, vague words, repeats and linked images with no name. - [Accessible Data Table Checker](https://leej.uk/tools/data-table-a11y-checker): Works out which headers every data cell is announced with, using the HTML standard's header algorithm, and lists the missing th, scope, caption and headers fixes. - [Colour-Blind Safe Chart Palette Generator](https://leej.uk/tools/cvd-safe-chart-palette): Generates categorical and sequential data-viz palettes that stay distinguishable under colour vision deficiencies. - [Form Accessibility & Autocomplete Auditor](https://leej.uk/tools/form-accessibility-auditor): Checks pasted form HTML for labels, autocomplete tokens, input types, error messaging and grouping. - [Fluid Type Scale](https://leej.uk/tools/fluid-type-scale): CSS clamp() type and spacing scales that grow smoothly from phone to desktop, with a live preview at any width. - [Shadow & Gradient Builder](https://leej.uk/tools/css-shadow-gradient): Layered, natural-looking box shadows and linear, radial or conic gradients with OKLCH blending, and clean CSS to copy. - [Grid & Flexbox Playground](https://leej.uk/tools/grid-flexbox-playground): Build Grid and Flexbox layouts visually, set spans and flex values per item, and copy the CSS and HTML. - [Clip-path, Blob & Divider Maker](https://leej.uk/tools/clip-path-maker): Drag points to make clip-path shapes, generate organic SVG blobs and wave or tilt section dividers. - [Easing & Animation Builder](https://leej.uk/tools/easing-builder): Drag a cubic-bezier curve, preview it against linear, and copy @keyframes with a reduced-motion fallback. - [Glassmorphism & Neumorphism](https://leej.uk/tools/glass-neumorphism): Frosted glass cards with backdrop-filter and soft neumorphic shadows, with contrast warnings and fallbacks. - [CSS Units Converter](https://leej.uk/tools/css-units-converter): Converts between px, rem, em, %, vw, vh, vmin, vmax and pt, and turns a whole stylesheet from px into rem. - [Font Pairing Previewer](https://leej.uk/tools/font-pairing): Try nine heading and body font pairs with your own words, then copy @font-face CSS for self-hosting. - [Aspect Ratio Calculator](https://leej.uk/tools/aspect-ratio-calculator): Works out ratios and missing sides, lists common sizes at that ratio, and writes the CSS aspect-ratio code. - [CSS Specificity Calculator](https://leej.uk/tools/css-specificity-calculator): Scores and ranks CSS selectors so you can see which rule wins, including :is(), :not(), :has() and :where(). - [CSS Cascade Conflict Resolver](https://leej.uk/tools/css-cascade-resolver): Ranks every CSS declaration that targets an element the way the cascade does, and says in plain words why the winner wins. - [Unused CSS Finder](https://leej.uk/tools/unused-css-finder): Tests every selector against several pages, reports what matches nothing and writes a purged stylesheet that keeps your formatting. - [Z-index & Stacking Context Debugger](https://leej.uk/tools/stacking-context-debugger): Renders pasted HTML, finds every stacking context and what created it, and explains why a higher z-index paints underneath. - [Critical CSS Extractor](https://leej.uk/tools/critical-css-extractor): Renders a page at phone and desktop sizes, keeps the CSS rules that style anything above the fold, and splits the stylesheet in two. - [CSS Custom Property Graph](https://leej.uk/tools/css-variable-graph): Draws every custom property and the var() references between them, flags cycles, undefined and unused properties, and lists each override by theme or media query. - [Baseline Browser Compatibility Checker](https://leej.uk/tools/baseline-compat-checker): Finds every CSS feature in your stylesheet and gives its Baseline status and date from the web-features data, then checks it against the Baseline target you pick. - [Scroll-driven Animation Builder](https://leej.uk/tools/scroll-animation-builder): Generates animation-timeline CSS for scroll() and view() timelines with named ranges, shows a live preview you can scroll, and adds a reduced-motion guard. - [SCSS to Native CSS Converter](https://leej.uk/tools/scss-to-native-css): Rewrites SCSS as native CSS: nesting kept or flattened, $variables as custom properties, mixins and @extend expanded, and a note for every part with no CSS equivalent. - [Tailwind Class to CSS Expander](https://leej.uk/tools/tailwind-to-css): Runs Tailwind CSS v4's own compiler in your browser to expand classes into the exact CSS, then gives a plain version with the theme values filled in. - [CSS Anchor Positioning Builder](https://leej.uk/tools/css-anchor-positioning-builder): Builds tooltips and popovers with CSS anchor positioning and position-try fallbacks, with a live preview. - [View Transitions Builder](https://leej.uk/tools/view-transitions-builder): Builds same-document and cross-document view transitions: names, pseudo-element animations and reduced-motion handling. - [Favicon Generator](https://leej.uk/tools/favicon-generator): favicon.ico, apple-touch-icon, Android and maskable icons, a web manifest and the HTML, from text, emoji or an image. - [Image Compressor](https://leej.uk/tools/image-compressor): Convert to WebP, AVIF or JPEG, resize, make every srcset width at once, and get the code. Nothing is uploaded. - [SVG Optimiser](https://leej.uk/tools/svg-optimiser): Safely strips editor data, scripts and whitespace, rounds numbers and shortens colours, with side-by-side previews. - [OG Image Maker](https://leej.uk/tools/og-image-maker): Design a 1200×630 share image with your title, logo and photo, and copy the matching Open Graph tags. - [Placeholder Image & Avatar Generator](https://leej.uk/tools/placeholder-images): Placeholder images at any size and initials avatars, as SVG, PNG or a data URI you can paste anywhere. - [QR Code Generator](https://leej.uk/tools/qr-code-generator): QR codes for links, Wi-Fi, email, phone and text, with colours, a logo, UTM tags and SVG or PNG downloads. - [Image Resizer & Cropper](https://leej.uk/tools/image-resizer-cropper): Crops to any shape or preset ratio, rotates, flips and resizes images, then saves JPEG, WebP or PNG. - [EXIF Viewer & Remover](https://leej.uk/tools/exif-viewer-stripper): Shows the camera, date and GPS location hidden in a photo, and removes them without re-compressing it. - [SVG to JSX & Data URI](https://leej.uk/tools/svg-to-jsx): Turns SVG code into a React component, a compact data URI and a CSS background in one go. - [SVG Path Editor](https://leej.uk/tools/svg-path-editor): Parses SVG path data, lets you drag points, converts absolute and relative, minifies, transforms and measures paths. - [srcset & sizes Checker](https://leej.uk/tools/srcset-sizes-calculator): Works out which srcset candidate each device downloads, as Chromium does, measures every file's real size and checks sizes against your layout. - [Image Quality vs Size Explorer](https://leej.uk/tools/image-quality-explorer): Encodes your image at ten quality settings in every format your browser can write, measures SSIM against the original and picks the smallest file that meets your target. - [Sprite Sheet Packer](https://leej.uk/tools/sprite-sheet-packer): Packs your images into the smallest sprite sheet it can find with MaxRects bin packing, then writes the PNG, a CSS class per image and a JSON atlas for games. - [SVG Symbol Sprite Builder](https://leej.uk/tools/svg-sprite-builder): Turns your SVG icons into one symbol sprite: ids prefixed so they can't clash, gradients moved where they render, scripts removed and colours set to currentColor. - [BlurHash, ThumbHash & LQIP Generator](https://leej.uk/tools/lqip-placeholder-generator): Makes four kinds of placeholder from your image with the reference encoders, previews each one decoded from the placeholder itself, and gives its size in bytes. - [GIF to MP4 & WebM Converter](https://leej.uk/tools/gif-to-video-converter): Decodes your GIF frame by frame, re-encodes it as MP4 and WebM with your browser's video encoder, and shows how many bytes the video saves. - [PNG Colour Quantiser](https://leej.uk/tools/png-palette-quantiser): Cuts your image to between 2 and 256 colours with median cut or k-means, with optional dithering, and writes a true indexed PNG-8 that keeps transparency. - [Web App Manifest Validator](https://leej.uk/tools/web-manifest-validator): Validates manifest.json for installability: icons, maskable safe zone, scope, start_url, display and shortcuts. - [Meta & Social Previewer](https://leej.uk/tools/meta-tag-previewer): Title and description checks, Google, X, LinkedIn and iMessage previews, and ready-to-paste meta and Open Graph tags. - [JSON-LD Schema Generator](https://leej.uk/tools/schema-generator): Structured data for local businesses, FAQs, articles, products and events, with hints from Google's guidelines. - [robots.txt & llms.txt Generator](https://leej.uk/tools/robots-llms-generator): robots.txt with AI crawler controls (training vs search), plus an llms.txt in the llmstxt.org format. - [UTM Link Builder](https://leej.uk/tools/utm-builder): Campaign links with consistent UTM tags, presets for common channels, and a whole CSV tagged at once. - [XML Sitemap Generator](https://leej.uk/tools/sitemap-generator): Turns a list of pages into a valid sitemap.xml, catching duplicates, other domains and pages that shouldn't be listed. - [Hreflang Tag Generator](https://leej.uk/tools/hreflang-generator): Builds hreflang tags, sitemap entries or headers for each language version, and checks the codes and x-default. - [URL Slug Generator](https://leej.uk/tools/slug-generator): Turns titles into clean, short URL slugs, with accents converted and filler words optionally removed. - [HTML Page Auditor](https://leej.uk/tools/html-page-auditor): Checks a page's HTML for about 40 SEO, accessibility, performance and best-practice issues, scored, with a fix for each. - [robots.txt Tester](https://leej.uk/tools/robots-txt-tester): Tests URLs against a robots.txt for many crawlers, AI bots included, using RFC 9309 matching, and shows the deciding rule. - [Structured Data Validator](https://leej.uk/tools/structured-data-validator): Finds JSON-LD in a page, resolves @graph and @id, and checks each item against Schema.org and Google's rich result requirements. - [Keyword Clustering Tool](https://leej.uk/tools/keyword-clustering): Groups a keyword list into topic clusters by shared words and SERP-free similarity, with a pillar per cluster. - [Striking Distance Keyword Finder](https://leej.uk/tools/striking-distance-keywords): Finds Search Console queries ranking in positions 8-20 with high impressions, and the page to improve for each. - [Search Console Regex Filter Builder](https://leej.uk/tools/gsc-regex-builder): Builds and tests RE2 regex filters for Search Console and GA4: branded, question and long-tail queries. - [Internal Link Suggester](https://leej.uk/tools/internal-link-suggester): Suggests internal links between your pages with anchor text, using TF-IDF similarity on pasted page text. - [Performance Budget Calculator](https://leej.uk/tools/performance-budget-calculator): Works back from a load-time goal on a chosen network to byte budgets per resource type, and writes a Lighthouse budget.json. - [Gzip & Brotli Size Checker](https://leej.uk/tools/gzip-size-estimator): Compresses text or files with the browser's gzip, deflate and, where supported, Brotli to show real transfer sizes and times. - [Responsive srcset Generator](https://leej.uk/tools/srcset-generator): Works out sizes and the widths needed from your layout, resizes an image to AVIF, WebP and JPEG, and writes markup. - [Core Web Vitals Calculator](https://leej.uk/tools/core-web-vitals-calculator): Turns raw LCP, INP and CLS field samples into the 75th percentile, rates them against Google's thresholds and computes session-window CLS. - [HAR File Waterfall Analyser](https://leej.uk/tools/har-waterfall-analyser): Reads a HAR file in your browser and turns it into a waterfall, weight by type and domain, a prioritised fix list and a redacted copy to share. - [Page Load Simulator](https://leej.uk/tools/perf-budget-simulator): Simulates a page load on four networks, request by request, and estimates FCP and LCP against your budget, with what-if switches for common fixes. - [Layout Shift (CLS) Simulator](https://leej.uk/tools/cls-simulator): Renders a page, applies late-loading images, inserted banners, font swaps and removals, and scores each shift as Chrome does. - [Font Subset Estimator](https://leej.uk/tools/font-subset-estimator): Reads TTF, OTF, WOFF or WOFF2 on your device, keeps the glyphs your text needs and estimates the subset's WOFF2 size. - [Service Worker Cache Strategy Builder](https://leej.uk/tools/service-worker-strategy-builder): Writes a dependency-free service worker from your routes: cache-first, network-first, stale-while-revalidate and more, with precaching, expiry, an offline page and versioning. - [Third-party Script Cost Calculator](https://leej.uk/tools/third-party-cost-calculator): Totals the bytes, requests, origins and main-thread time of the third-party tags you pick, from a catalogue measured in Chromium and HTTP Archive data. - [Font Fallback Metrics Calculator](https://leej.uk/tools/font-fallback-metrics): Computes size-adjust and ascent, descent and line-gap overrides so fallback fonts match your web font and reduce layout shift. - [Resource Hints & Loading Auditor](https://leej.uk/tools/resource-hints-auditor): Audits preload, preconnect, fetchpriority and lazy-loading in pasted HTML and suggests a better loading order. - [Chrome Performance Trace Analyser](https://leej.uk/tools/chrome-trace-viewer): Reads a Chrome DevTools performance trace to find long tasks, INP interactions and the scripts behind them. - [Lighthouse Report Comparison](https://leej.uk/tools/lighthouse-report-diff): Compares two or more Lighthouse JSON reports: metric deltas, audits that regressed and opportunity savings. - [JSON Formatter & Validator](https://leej.uk/tools/json-formatter): Pretty-prints, minifies and validates JSON, pointing to the exact line and column of any error. - [JSON ⇄ CSV Converter](https://leej.uk/tools/json-csv-converter): Converts JSON to CSV and back, flattening nested data and handling quotes, commas and Excel correctly. - [CSS Minifier & Beautifier](https://leej.uk/tools/css-formatter): Minifies CSS safely or beautifies it again, keeping strings and licence comments intact. - [HTML Minifier & Beautifier](https://leej.uk/tools/html-formatter): Minifies or indents HTML, leaving pre, textarea, script and style content exactly as it was. - [Markdown to HTML](https://leej.uk/tools/markdown-to-html): Converts Markdown to clean HTML with a live preview, escaping raw HTML so nothing pasted can run. - [Regex Tester](https://leej.uk/tools/regex-tester): Tests JavaScript regular expressions live, with highlighted matches, groups, replace and a plain-English breakdown. - [Text Diff Checker](https://leej.uk/tools/diff-checker): Compares two texts line by line with word-level highlights, side by side or inline, and makes a .patch file. - [JSON Schema Validator](https://leej.uk/tools/json-schema-validator): Validates JSON against a JSON Schema with every error's path and reason, and can infer a starting schema from sample data. - [JSON to TypeScript](https://leej.uk/tools/json-to-typescript): Infers TypeScript interfaces and a Zod schema from sample JSON, merging array items, optional keys and unions. - [YAML, JSON & TOML Converter](https://leej.uk/tools/yaml-json-toml): Converts between YAML, JSON and TOML with error line numbers, anchor expansion and warnings for values that don't translate. - [JSONPath Tester](https://leej.uk/tools/jsonpath-tester): Runs RFC 9535 JSONPath queries on JSON and lists each match with its normalised path, with filters and functions. - [SQL Formatter](https://leej.uk/tools/sql-formatter): Pretty-prints or minifies SQL with clauses on new lines, indented conditions and nested subqueries, keeping strings exact. - [Three-Way Merge](https://leej.uk/tools/three-way-merge): Merges two edited versions against their common base, auto-takes one-sided changes and marks true conflicts git-style. - [Markdown Table Editor](https://leej.uk/tools/markdown-table-editor): Edits tables in a grid, imports Markdown, CSV or spreadsheet cells and exports padded GitHub Markdown, HTML, CSV or JSON. - [Regex Railroad Diagram](https://leej.uk/tools/regex-railroad-diagram): Draws a regular expression as a railroad diagram with a plain-English explanation, and exports the SVG. - [Email CSS Inliner](https://leej.uk/tools/email-css-inliner): Inlines CSS into HTML email the way the cascade would, keeps media queries in a style block and adds Outlook-friendly attributes. - [Semver Range Checker](https://leej.uk/tools/semver-range-checker): Shows which versions an npm semver range allows, the highest match, and the range as plain comparators, prerelease rules included. - [CSV SQL Query](https://leej.uk/tools/csv-sql-query): Loads CSV files as tables and runs SELECT queries with joins, grouping and functions, then exports the result as CSV or JSON. - [XML Formatter & XPath Tester](https://leej.uk/tools/xml-formatter-xpath): Checks XML is well-formed, pretty-prints or minifies it, runs XPath 1.0 queries with namespaces and converts it to JSON. - [Mock Data Generator](https://leej.uk/tools/mock-data-generator): Generates realistic fake rows from a field list, repeatable with a seed, as JSON, CSV, NDJSON or SQL INSERT statements. - [Conventional Commit Linter](https://leej.uk/tools/conventional-commit-linter): Checks commit messages against Conventional Commits and commitlint rules, works out the version bump and drafts a changelog. - [JSON Structural Diff & Patch](https://leej.uk/tools/json-diff-patch): Compares two JSON documents path by path, ignoring key order, matches array items by key to spot moves, and writes JSON Patch and merge patch files. - [Git Branch Graph Visualiser](https://leej.uk/tools/git-log-graph): Draws the branch and merge graph from pasted git log output, finds the merge base of any two branches and counts commits per author. - [JS Bundle & Source Map Explorer](https://leej.uk/tools/source-map-explorer): Attributes every byte of a JavaScript bundle to the package and file it came from, using the source map, with a treemap, gzip sizes and duplicates. - [Minified Stack Trace Resolver](https://leej.uk/tools/stack-trace-resolver): Maps each frame of a minified stack trace back to the original file, line, column and function name with your source maps, and shows the code. - [npm Dependency Graph & Duplicates](https://leej.uk/tools/package-lock-graph): Reads package-lock.json v1 to v3, resolves dependencies the way Node does, and shows duplicates, why each package is installed, licences and depth. - [Regex Debugger with Step Trace](https://leej.uk/tools/regex-step-debugger): Runs your JavaScript regex on its own backtracking engine, records every step, and finds catastrophic backtracking by pumping inputs. - [SQL Query Plan Explainer](https://leej.uk/tools/sql-explain-visualiser): Turns EXPLAIN and EXPLAIN ANALYZE output into a plan tree with each step's own time, estimate errors and suggestions to test. - [OpenAPI Linter and Breaking Change Diff](https://leej.uk/tools/openapi-lint-diff): Compares two versions of an OpenAPI spec, sorts every change into breaking, to check and safe, lints the new spec and writes a changelog. - [GraphQL Query Complexity Analyser](https://leej.uk/tools/graphql-complexity-analyser): Validates a GraphQL operation against your schema, then works out its depth, requested nodes and cost with list multipliers, @listSize and @cost. - [JavaScript AST Explorer](https://leej.uk/tools/js-ast-explorer): Parses JavaScript with Acorn into an ESTree syntax tree you can browse, linked both ways to the source, with node fields, type counts and JSON. - [CSV Data Profiler](https://leej.uk/tools/csv-data-profiler): Profiles every column of a CSV: its type, gaps, distinct values, statistics and outliers, plus duplicate rows, ragged rows and encoding problems. - [SQL Query Linter](https://leej.uk/tools/sql-query-linter): Checks SQL queries for 23 anti-patterns that make them slow, wrong or risky, from SELECT * and implicit joins to non-sargable filters and NULL traps. - [JSON Schema to Form Builder](https://leej.uk/tools/json-schema-form-builder): Builds an accessible HTML form from a JSON Schema, validates what you type against the schema as you go, and gives you the data as JSON and the form's markup. - [gitignore Tester](https://leej.uk/tools/gitignore-tester): Tests file paths against .gitignore rules, showing which pattern ignores or re-includes each path. - [Glob Pattern Tester](https://leej.uk/tools/glob-pattern-tester): Tests glob patterns against paths with minimatch, picomatch or bash semantics and explains each match. - [CODEOWNERS Tester](https://leej.uk/tools/codeowners-tester): Shows which owners GitHub or GitLab assigns to each changed file from your CODEOWNERS file. - [Changelog Generator from Commits](https://leej.uk/tools/changelog-generator): Turns conventional commit history into a grouped CHANGELOG.md and the next semantic version. - [package.json Exports Resolver](https://leej.uk/tools/package-exports-resolver): Resolves import specifiers through package.json exports and imports maps for each condition, like Node and bundlers do. - [Regex Dialect Converter](https://leej.uk/tools/regex-dialect-converter): Converts regular expressions between JavaScript, PCRE, Python, Go RE2, Java and .NET, flagging unsupported features. - [SQL Dialect Converter](https://leej.uk/tools/sql-dialect-converter): Translates SQL between PostgreSQL, MySQL, SQLite and SQL Server: types, quoting, LIMIT, upserts and functions. - [MongoDB Query to SQL Translator](https://leej.uk/tools/mongodb-to-sql): Translates MongoDB find and aggregate pipelines into SQL and back, with unsupported stages listed. - [OpenAPI Viewer & Linter](https://leej.uk/tools/openapi-viewer): Reads OpenAPI 3.x or Swagger 2.0, lists every endpoint with examples built from the schemas, lints the spec and writes Markdown docs. - [cURL Converter](https://leej.uk/tools/curl-converter): Parses a curl command like a shell would and rewrites it as fetch, Python requests, Go, PHP, HTTPie or PowerShell. - [GraphQL Formatter & Analyser](https://leej.uk/tools/graphql-formatter): Formats or minifies GraphQL queries and SDL, reports syntax errors by line and checks depth, field count and unused parts. - [CSS Selector & XPath Tester](https://leej.uk/tools/css-selector-tester): Runs CSS selectors or XPath on pasted HTML, lists matches with unique paths, scores specificity and converts CSS to XPath. - [Cache-Control Explainer](https://leej.uk/tools/cache-control-explainer): Reads response headers per RFC 9111 and shows how long browsers and CDNs may reuse a response, plus a header builder. - [Set-Cookie Analyser](https://leej.uk/tools/set-cookie-analyser): Parses Set-Cookie headers and checks security flags, prefixes, scope, lifetime and size, then writes a safer header. - [User-Agent Parser](https://leej.uk/tools/user-agent-parser): Reads browser, engine, OS, device type and bots from User-Agent strings, and summarises a pasted log column. - [HTTP Response Header Inspector](https://leej.uk/tools/http-header-inspector): Fetches a URL's response headers and grades security, caching, compression and indexing headers with fixes. - [WebAuthn & Passkey Response Decoder](https://leej.uk/tools/webauthn-decoder): Decodes passkey registration and login responses: clientDataJSON, authenticatorData flags, attestation and COSE keys. - [Database Connection String Parser](https://leej.uk/tools/connection-string-parser): Parses and builds Postgres, MySQL, MongoDB, Redis and SQL Server connection strings with every option explained. - [Browserslist Query Tester](https://leej.uk/tools/browserslist-tester): Shows which browsers and versions a browserslist query targets and the global usage covered, from a dated snapshot. - [SQL Schema to ER Diagram](https://leej.uk/tools/sql-ddl-erd): Draws an entity relationship diagram from CREATE TABLE and ALTER TABLE statements, flags foreign keys with no index and exports Mermaid and DBML. - [State Machine Designer](https://leej.uk/tools/state-machine-designer): Turns a short text description of states and events into a statechart you can click through, checks it for logic bugs and exports XState, Mermaid and TypeScript. - [Rate Limit Algorithm Simulator](https://leej.uk/tools/rate-limit-simulator): Runs one request timeline through five rate-limiting algorithms and shows what each allows, queues or rejects, and the real peak per window. - [Queue & Capacity Calculator](https://leej.uk/tools/queue-capacity-calculator): Works out utilisation, the share of jobs that wait, average waits and queue length for each worker count, and the fewest workers that meet a target. - [Sequence Diagram from Text](https://leej.uk/tools/sequence-diagram-builder): Draws sequence diagrams from Mermaid-style text as a standalone SVG, with activations, notes and alt/loop blocks, and exports Mermaid and PlantUML. - [Docker Compose Visualiser & Linter](https://leej.uk/tools/docker-compose-visualiser): Draws the services in a compose file and what they depend on, checks it the way docker compose config does, and flags port clashes, cycles and risky settings. - [Kubernetes Manifest Linter](https://leej.uk/tools/k8s-manifest-linter): Runs kube-linter's checks on your Kubernetes manifests in the browser, with the same messages, and draws how Services, workloads and their dependencies connect. - [GitHub Actions Workflow Visualiser](https://leej.uk/tools/github-actions-visualiser): Draws the job graph of a GitHub Actions workflow, expands every matrix into its real runs, and flags broken needs:, bad permissions, unpinned actions and risky triggers. - [Bloom Filter Calculator](https://leej.uk/tools/bloom-filter-calculator): Sizes Bloom filters and cuckoo filters for a target false-positive rate, with a live insert and query demo. - [Consistent Hashing Ring Visualiser](https://leej.uk/tools/consistent-hashing-visualiser): Simulates consistent hashing, rendezvous and jump hash: key distribution, virtual nodes and keys moved when nodes change. - [Prisma & Drizzle Schema to ERD and SQL](https://leej.uk/tools/prisma-schema-erd): Draws an ER diagram from a Prisma or Drizzle schema and generates the matching SQL DDL. - [Base64 & Data URI Encoder](https://leej.uk/tools/base64-encoder): Encodes and decodes Base64 with full UTF-8, and turns small files into data URIs with CSS and HTML. - [URL Encoder & Parser](https://leej.uk/tools/url-encoder-parser): Percent-encodes and decodes text, splits addresses into parts, and lets you edit or strip query parameters. - [Hash & SRI Generator](https://leej.uk/tools/hash-generator): Makes SHA hashes and HMACs of text or files, compares checksums and writes Subresource Integrity attributes. - [JWT Decoder](https://leej.uk/tools/jwt-decoder): Decodes JSON Web Tokens in your browser, explains the claims and expiry, and checks HMAC signatures. - [UUID Generator](https://leej.uk/tools/uuid-generator): Generates v4 and time-ordered v7 UUIDs in bulk, and checks the version and date of any UUID. - [Password & Passphrase Generator](https://leej.uk/tools/password-generator): Makes strong random passwords or memorable passphrases on your device, with the strength shown in bits. - [Unix Timestamp Converter](https://leej.uk/tools/timestamp-converter): Converts Unix timestamps to dates in every format and time zone, and dates back to timestamps, one or many at once. - [Cron Expression Explainer](https://leej.uk/tools/cron-expression-explainer): Explains a cron schedule in plain English and lists the next 10 run times in UTC or your own time zone. - [Unicode Inspector](https://leej.uk/tools/unicode-inspector): Breaks text into graphemes and code points with category, script, UTF-8 and escapes, and flags hidden, bidi and look-alike characters. - [Number Base Converter](https://leej.uk/tools/number-base-converter): Converts numbers of any size between bases 2 to 36, with two's complement, a clickable bit grid, bitwise maths and IEEE 754 breakdowns. - [Base32, Base58 & Ascii85 Encoder](https://leej.uk/tools/base32-base58-encoder): Encodes and decodes Base32 (RFC 4648 and Crockford), Base58 with Base58Check, Ascii85, Z85, Base64url and Base36, and reads ULIDs. - [Hex File Inspector](https://leej.uk/tools/hex-file-inspector): A paged hex dump with file-type detection, structure walks for common formats, a data inspector, byte search, strings and entropy. - [JWT Encoder & Signer](https://leej.uk/tools/jwt-encoder): Builds JWT headers and claims, signs with HMAC, RSA, ECDSA or EdDSA through WebCrypto, and verifies tokens with time and audience checks. - [Key Pair Generator](https://leej.uk/tools/key-pair-generator): Generates RSA, ECDSA, ECDH, Ed25519 and X25519 key pairs and AES or HMAC keys with WebCrypto, exported as PEM, JWK, JWKS and OpenSSH. - [Time Zone & DST Explorer](https://leej.uk/tools/timezone-dst-explorer): Converts a wall-clock time across IANA zones, finds every DST change to the minute, flags skipped and repeated times and plans meetings. - [Cron & DST Schedule Simulator](https://leej.uk/tools/cron-dst-simulator): Runs a cron expression through each daylight saving change in a time zone and shows skipped, doubled and moved runs for three kinds of scheduler. - [iCalendar RRULE Expander](https://leej.uk/tools/rrule-expander): Expands RFC 5545 recurrence rules into every occurrence in local time and UTC, applying EXDATE and RDATE and handling daylight saving gaps. - [IEEE 754 & Bitwise Inspector](https://leej.uk/tools/float-bitwise-inspector): Rounds a number to float64, float32, float16 and bfloat16, shows each bit pattern, the exact stored value and the error, and lays out integers in two's complement. - [Protobuf, CBOR & MessagePack Decoder](https://leej.uk/tools/binary-wire-decoder): Decodes protobuf wire format with or without a .proto, CBOR with diagnostic notation, and MessagePack, from hex or base64, into a field table and JSON. - [JWE Decrypter & Encrypter](https://leej.uk/tools/jwe-decrypter): Decrypts and creates JSON Web Encryption tokens with WebCrypto: RSA-OAEP, ECDH-ES, AES-KW and AES-GCM. - [Security Headers Generator](https://leej.uk/tools/security-headers): A Content-Security-Policy built from presets, plus HSTS, Referrer-Policy, Permissions-Policy and more, for any server. - [Redirect Rules Generator](https://leej.uk/tools/redirect-generator): Turns a list of old and new addresses into rules for Apache, Nginx, Netlify and Cloudflare, with loop and chain checks. - [HTTP Status Code Reference](https://leej.uk/tools/http-status-codes): A searchable guide to HTTP status codes, in plain English, with what each one means for SEO and how to fix it. - [CSP Evaluator](https://leej.uk/tools/csp-evaluator): Parses a Content-Security-Policy, flags XSS weaknesses, shows the effective rule per resource type and tests URLs against it. - [Subnet Calculator (IPv4 & IPv6)](https://leej.uk/tools/subnet-calculator): IPv4 and IPv6 CIDR maths: network, range, masks, host counts and type, with splitting, summarising and membership checks. - [chmod Calculator](https://leej.uk/tools/chmod-calculator): Converts Unix permissions between octal and symbolic, applies symbolic changes, handles special bits and explains umask. - [Dockerfile Linter](https://leej.uk/tools/dockerfile-linter): Parses a Dockerfile, including multi-stage builds, and checks over 40 rules for security, size, caching and reproducibility. - [TOTP & 2FA Code Generator](https://leej.uk/tools/totp-generator): Makes RFC 6238 time-based and RFC 4226 counter-based one-time codes, generates secrets, and reads and writes otpauth links. - [nginx Config Generator](https://leej.uk/tools/nginx-config-generator): Builds a complete nginx server block for static sites, SPAs, reverse proxies or PHP-FPM, with HTTPS, headers, caching and limits. - [SPF, DKIM & DMARC Checker](https://leej.uk/tools/spf-dmarc-checker): Parses pasted SPF, DKIM and DMARC records, counts SPF lookups, tests an IP, reads DKIM key sizes and builds a DMARC record. - [.env File Checker](https://leej.uk/tools/env-file-checker): Parses .env files like dotenv, compares them with .env.example, flags problems and likely live secrets, and writes a safe example. - [HTTP Caching Header Simulator](https://leej.uk/tools/http-cache-simulator): Plays a request schedule through each visitor's browser cache, a CDN and your origin, so you can see hits, 304s and stale copies after a deploy. - [CORS Preflight Debugger](https://leej.uk/tools/cors-preflight-debugger): Runs the browser's CORS checks on a pasted fetch() call or curl command and your server's headers, step by step, with the console error and fixed config. - [CSP Violation Report Analyser](https://leej.uk/tools/csp-report-analyser): Groups CSP violation reports by directive and source, filters out extension and browser noise, and proposes the smallest safe change to your policy. - [Nginx Location Block Tester](https://leej.uk/tools/nginx-location-tester): Runs nginx's location matching, rewrites, try_files and proxy_pass rules on your config for each test URL and explains every step. - [JWT & JWKS Signature Verifier](https://leej.uk/tools/jwt-jwks-verifier): Checks a JWT's signature with your browser's own cryptography against a JWKS, public key, certificate or secret, then checks expiry, audience and issuer. - [SPF, DKIM & DMARC Builder and Linter](https://leej.uk/tools/spf-dkim-dmarc-builder): Counts SPF's DNS lookups through every include, lints SPF, DMARC and DKIM records against their RFCs, simulates DMARC alignment and builds new records. - [Webhook Signature Verifier](https://leej.uk/tools/webhook-signature-verifier): Recomputes webhook HMAC signatures for common providers' documented schemes with WebCrypto, compares them and checks the timestamp. - [X.509 Certificate & CSR Decoder](https://leej.uk/tools/x509-certificate-decoder): Decodes PEM certificates and certificate requests with an ASN.1 parser, puts a chain in order, verifies each issuer signature and checks a hostname. - [OAuth 2.0 PKCE Flow Simulator](https://leej.uk/tools/oauth-pkce-simulator): Makes a PKCE verifier and challenge with WebCrypto, builds the authorisation URL, checks the callback's state and errors, and writes the token request. - [SAML Response Decoder](https://leej.uk/tools/saml-response-decoder): Decodes SAML messages from the POST and redirect bindings and checks status, audience, recipient, time windows and what each XML signature covers. - [Email Header Analyser](https://leej.uk/tools/email-header-analyser): Turns raw email headers into a hop-by-hop timeline with delays and TLS, reads SPF, DKIM, DMARC and ARC results, and flags spoofing and delivery problems. - [Apache mod_rewrite Tester](https://leej.uk/tools/htaccess-rewrite-tester): Runs your RewriteRule and RewriteCond lines on test URLs the way Apache 2.4 does, shows the redirect or rewrite each one gets, and traces every rule. - [Open Source Licence Checker](https://leej.uk/tools/licence-compatibility-checker): Reads the licences in your lockfile or SBOM, parses each SPDX expression and flags the ones that conflict with your project's licence and how you ship it. - [Log Pattern Miner](https://leej.uk/tools/log-pattern-miner): Mines the patterns in a log with the Drain algorithm, so thousands of lines become a short list of templates with counts, levels and the values that vary. - [AWS IAM Policy Simulator](https://leej.uk/tools/aws-iam-policy-simulator): Evaluates IAM policies for an action and resource: explicit deny, allow, wildcards, NotAction and common conditions. - [Terraform Plan Viewer](https://leej.uk/tools/terraform-plan-viewer): Turns terraform show -json plan output into a readable change summary with destroy warnings and a resource graph. - [systemd Timer & OnCalendar Builder](https://leej.uk/tools/systemd-timer-builder): Builds and explains systemd OnCalendar expressions and timer units, converts from cron and lists the next runs. - [Website Brief & Quote Builder](https://leej.uk/tools/website-brief-builder): Guided questions that turn your website idea into a clear brief, as Markdown or PDF, ready to send for quotes. - [Breakpoint & Viewport Tester](https://leej.uk/tools/breakpoint-tester): Previews a page or pasted HTML at up to ten screen sizes at once and catches sideways scrolling. - [Placeholder Copy by Industry](https://leej.uk/tools/placeholder-copy): Realistic starter copy for 14 kinds of business, instead of lorem ipsum, as Markdown, HTML or plain text. - [Word Counter & Case Converter](https://leej.uk/tools/word-counter): Counts words, characters and reading time, checks limits for titles and posts, and converts between 10 case styles. - [HTML Entity & Character Finder](https://leej.uk/tools/html-entity-finder): Finds special characters by name and gives their HTML entity, code point and CSS escape, and encodes or decodes text. - [PingAI](https://leej.uk/pingai): free AI-visibility checker. Can ChatGPT, Claude, Perplexity, Gemini and Copilot crawlers reach and read your website? Checks robots.txt rules for AI crawlers, a firewall test, readability without JavaScript, title and description, headings, business summary and JSON-LD, sitemap and noindex, then gives a score out of 100 with plain-English fixes. Paid plans are not available yet. - [How PingAI fetches sites](https://leej.uk/pingai/bot): the PingAI user agent and how to opt out. - [How LeejTools fetches pages](https://leej.uk/tools/bot): the user agent the indexing tools use when you press Fetch, its limits and how to opt out. ### Tools in production (not live yet) 50 more tools are in production: 0 being built now and 50 planned next. Like the live tools they're free and private; most will run entirely in the browser, and the few that check a live URL will use a small leej.uk fetch that keeps no URLs or page content. Building now: Planned next: - Colour and accessibility (2): Document Outline Auditor, CSS Relative Color Builder. - Layout and CSS (3): CSS Container Query Builder, Print Stylesheet Previewer, Media Query Range Builder. - Images and media (1): BIMI SVG Checker. - SEO and marketing (2): ads.txt & app-ads.txt Validator, sellers.json Inspector. - Performance (5): Speculation Rules Builder, Subresource Integrity Hash Generator, Back/Forward Cache Readiness, 103 Early Hints Builder, Vary Cache-Key Explainer. - Code and data (8): Import Map Author, EditorConfig Tester, tsconfig Paths Resolver, ANSI Log to HTML, Intl Format Playground, npm Overrides Explainer, JSON Schema to Zod / Valibot, WebAssembly Module Inspector. - APIs and the web platform (8): Apple App Site Association Builder, Digital Asset Links Builder, Link Header Parser, Content Negotiation Explainer, ETag and Range Explainer, Multipart MIME Builder, WebSocket Frame Decoder, Client Hints Explainer. - Architecture and modelling (3): PromQL Explainer, Kubernetes Resource Calculator, OTLP JSON Trace Decoder. - Encode, generate and time (9): Protobuf Binary Decoder, iCalendar (ICS) Validator, vCard Validator, UK Postcode Formatter, ISBN, DOI & ORCID Checker, GTIN / EAN / UPC Check Digit, IBAN & VAT Checksum, Email Address Parser, File Magic / Content-Type Sniffer. - Security and server (9): security.txt Builder, Permissions-Policy Builder, Cookie Size Budget, Caddyfile Linter, HAProxy ACL Tester, DMARC Aggregate Report Parser, MTA-STS & TLS-RPT Builder, CAA & TLSA Record Builder, .well-known Directory Builder. ## Services Lee works with UK businesses and individuals on: Apple Watch, iPhone and Mac apps (Swift, SwiftUI); fast, mobile-first websites and web apps; data sites built from official statistics; privacy-first, cookie-free analytics; Cloudflare hosting, security, performance and SEO. Start at [Contact](https://leej.uk/contact) or email hello@leej.uk. ## Apps, articles and Swift reference Lee's Apple app work, articles and Swift reference. - [Apps](https://leej.uk/apps?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): Stromascape, +MetricTime, bPositive, Tipple Units, +StromaNotes, AiCuttr, with platform and status. - [Articles](https://leej.uk/articles?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): iOS development guides, advice for businesses planning an app, and Apple Watch articles, plus technical SEO, web performance and indie-app guides. ### Articles: iOS development - [SwiftUI state and app architecture with Observation](https://leej.uk/articles/swiftui-state-and-architecture?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): How to structure a SwiftUI app with the Observation framework: who owns state, @State vs @Bindable vs @Environment, services, loading and errors. - [Swift concurrency in practice: async/await, actors and the main actor](https://leej.uk/articles/swift-concurrency-in-practice?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): A practical guide to Swift concurrency for iOS apps: async/await, async let, task groups, actors, cancellation, Sendable and main-actor isolation. - [Persisting data with SwiftData: models, queries, background work and migrations](https://leej.uk/articles/persisting-data-with-swiftdata?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): A practical SwiftData guide for iOS apps: defining models and relationships, @Query, background imports with @ModelActor, schema migrations and iCloud sync. - [Finding and fixing iOS performance problems with Instruments](https://leej.uk/articles/finding-ios-performance-problems-with-instruments?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): How to find and fix slow launches, hangs, janky scrolling and memory growth in iOS apps with Instruments, signposts, XCTest metrics and MetricKit. - [Accessible iOS apps in SwiftUI: VoiceOver, Dynamic Type and beyond](https://leej.uk/articles/accessible-ios-apps-in-swiftui?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): Make SwiftUI apps work for everyone: VoiceOver labels and actions, Dynamic Type layouts, contrast, Reduce Motion, automated audits and App Store labels. - [Testing iOS apps with Swift Testing and XCTest](https://leej.uk/articles/testing-ios-apps-with-swift-testing?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): What to test in an iOS app and how: Swift Testing's @Test and #expect, parameterised tests, async code, test doubles, UI tests with XCTest and CI. - [Beyond the app icon: widgets, App Intents and Live Activities](https://leej.uk/articles/widgets-app-intents-and-live-activities?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): How to put your iOS app's most useful actions on the Home Screen, Lock Screen, Siri and Spotlight with WidgetKit, App Intents and ActivityKit. - [Privacy manifests, permissions and passing App Store review](https://leej.uk/articles/privacy-manifests-permissions-and-app-store-review?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): Get iOS apps through App Store review: privacy manifests, required-reason APIs, permission prompts, tracking, account deletion and review notes. ### Articles: For clients - [What an iOS app really costs, and how to scope one properly](https://leej.uk/articles/what-an-ios-app-really-costs?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): What decides the cost of building and running an iOS app: features, design, backend, integrations, testing, Apple fees and upkeep, and how to scope it. - [Native iOS or cross-platform? A plain guide for businesses](https://leej.uk/articles/native-ios-or-cross-platform?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): Swift and SwiftUI, React Native, Flutter, Kotlin Multiplatform or a web app? How to choose an app platform for your business, with honest trade-offs. - [From build to App Store: the iOS launch process and a realistic timeline](https://leej.uk/articles/from-build-to-app-store-launch-process?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): Every step between a finished build and your app on the App Store: developer accounts, TestFlight, product page, privacy details, review, release options. - [After launch: what it really takes to maintain an iOS app](https://leej.uk/articles/maintaining-an-ios-app-after-launch?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): What keeping an iOS app healthy involves after launch: yearly iOS releases, Apple's SDK deadlines, crashes, dependencies, security, reviews and planning upkeep. - [How to choose an iOS developer: questions to ask and red flags to spot](https://leej.uk/articles/how-to-choose-an-ios-developer?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): Hiring an iOS developer or agency? What to look for, the questions to ask, red flags, and how to make sure you own your code and Apple Developer account. - [The iOS app MVP checklist: what to build first, and what to leave out](https://leej.uk/articles/the-ios-app-mvp-checklist?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): A practical checklist for planning an iOS MVP: defining the core journey, what version one needs, what it can skip, and the launch basics Apple requires. - [Case study: small, focused Apple apps, and what they show about scoping](https://leej.uk/articles/case-study-small-focused-apple-apps?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): A walk through Lee Johnson's own Apple apps, from MetricEdition to Tipple Units, and the scoping decisions behind them that apply to any client project. ### Articles: Apple Watch - [How to Build Your First Apple Watch App: A Detailed Step-by-Step Guide with Swift & SwiftUI](https://leej.uk/articles/how-to-build-your-first-apple-watch-app?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): The Apple Watch is a remarkable device that extends the power of iOS development to the wrist, allowing for intimate, glanceable interactions. - [Designing for the Apple Watch: Crafting Impactful Experiences with Swift & SwiftUI](https://leej.uk/articles/designing-for-the-apple-watch?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): Crafting Impactful Apple watch experiences with Swift and SwiftUI. - [Optimising Battery Efficiency: Techniques and Tools for Lightweight iOS and watchOS Apps](https://leej.uk/articles/optimising-battery-efficiency?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): Battery life remains one of the most important factors in user satisfaction for iOS and watchOS apps. - [MetricEdition Watch App – An In‑Depth Review and Analysis](https://leej.uk/articles/metric-time?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): Innovation often starts with curiosity. MetricEdition, created by Lee Johnson under the StromaScape brand, is a perfect example of how curiosity about time… - [Enhancing the MetricEdition Apple Watch App: A Comprehensive Guide to Proposed Changes](https://leej.uk/articles/metrictime-code?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): Innovation often starts with curiosity. MetricEdition, created by Lee Johnson under the StromaScape brand, is a perfect example of how curiosity about time… ### Articles: Technical SEO and AI search - [How to write llms.txt that AI tools can use](https://leej.uk/articles/how-to-write-llms-txt?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): How to write llms.txt and llms-full.txt for AI tools: what to put in each file, where they go, how they relate to robots.txt, and how to check them. - [How to control AI crawlers without blocking Google](https://leej.uk/articles/how-to-control-ai-crawlers?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): How to allow, limit or block AI crawlers with robots.txt, headers, firewall rules and usage policies, without taking the site out of Google. - [Canonical tags, trailing slashes and duplicate URLs](https://leej.uk/articles/canonical-tags-and-duplicate-urls?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): How duplicate URLs appear through trailing slashes, www, parameters and HTTP, how to set an honest canonical tag, and how to check it live. - [Website migration SEO checklist](https://leej.uk/articles/website-migration-seo-checklist?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): A practical SEO checklist for moving a website: inventory, URL map, redirects, canonicals, Search Console, AI crawlers and go-live checks. - [How to find and fix soft 404 errors](https://leej.uk/articles/how-to-find-and-fix-soft-404s?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): What a soft 404 is, why ‘page not found’ served as HTTP 200 quietly drops pages from search, and a method for finding and fixing them on a small site. - [How to keep an XML sitemap accurate](https://leej.uk/articles/xml-sitemaps-that-match-your-site?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): How to build and maintain an XML sitemap that matches the live site: what to include, lastmod, images, coverage gaps, and the checks that catch stale URLs. - [robots.txt vs X-Robots-Tag: which to use](https://leej.uk/articles/robots-txt-vs-x-robots-tag?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): When to use robots.txt and when to use X-Robots-Tag or a meta robots tag, what each one can actually do, and a simple rule for HTML pages, files and APIs. - [Internal linking for small websites](https://leej.uk/articles/internal-linking-for-small-sites?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): A practical internal-linking method for small websites: click depth, orphan pages, clear anchors, and a routine that does not need a huge crawler. - [How to find keyword cannibalisation](https://leej.uk/articles/keyword-cannibalisation-small-sites?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): How two pages on a small site compete for the same query, how to spot it in Search Console, and how to fix it without deleting useful content. - [Why Google and AI see different HTML](https://leej.uk/articles/why-google-and-ai-see-different-html?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): Why a browser, Googlebot and an AI crawler can see different HTML: JavaScript, blocked assets, bot firewalls, and how to compare raw and rendered pages. - [How to get new pages indexed with IndexNow](https://leej.uk/articles/indexnow-and-getting-pages-indexed?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): How IndexNow fits into getting a page indexed: the key file, a clean submission, sitemaps, Search Console, and what a successful ping cannot promise. - [JSON-LD schema that search and AI can use](https://leej.uk/articles/json-ld-schema-for-search-and-ai?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): How to write JSON-LD that helps search and AI: useful types, entities and sameAs, Article and FAQ rules, and the errors that get markup ignored. - [How to write pages that AI answers can cite](https://leej.uk/articles/writing-for-ai-answers-and-search?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): How to write pages that search and AI answers can cite: answer first, visible facts, structure, original experience, and the padding to cut. - [Technical SEO checklist for a new website](https://leej.uk/articles/technical-seo-launch-checklist?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): A technical SEO checklist for a new website: HTTPS, canonicals, robots, sitemaps, schema, Core Web Vitals, AI crawlers and the final go-live pass. - [hreflang for UK and US English sites](https://leej.uk/articles/hreflang-uk-us-english?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): How to use hreflang for UK and US English versions of a site: en-GB versus en-US, x-default, return tags, and the mistakes that make both versions compete. ### Articles: iOS in practice - [How to migrate a UIKit app to SwiftUI](https://leej.uk/articles/uikit-to-swiftui-migration?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): A practical, incremental way to move a UIKit app to SwiftUI: wrapping views, sharing state, navigation, testing and when to leave UIKit in place. - [SwiftUI NavigationStack and deep links](https://leej.uk/articles/swiftui-navigationstack-deep-links?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): How to model SwiftUI navigation as state with NavigationStack, typed routes, deep links, state restoration and the usual broken-stack bugs. - [StoreKit 2 in-app purchases for indie apps](https://leej.uk/articles/storekit-2-in-app-purchases?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): How to add StoreKit 2 purchases and subscriptions to a small iOS app: products, entitlements, testing in Xcode and the checks App Review expects. - [Reliable iOS networking with URLSession](https://leej.uk/articles/ios-networking-urlsession-retries?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): How to build reliable iOS networking with URLSession: typed errors, retries, cancellation, decoding, auth headers and tests, without a heavy library. - [iOS background tasks with BGTaskScheduler](https://leej.uk/articles/ios-background-tasks-bgtaskscheduler?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): How to use BGTaskScheduler for refresh and processing tasks, what iOS will and will not guarantee, and how to test, budget and debug background work. - [How to localise an iOS app, including UK English](https://leej.uk/articles/localising-ios-apps-uk-english?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): How to localise an iOS app: String Catalogs, UK versus US English, dates, currency, images, pluralisation and tests that catch missing strings. - [iOS push notifications that users keep on](https://leej.uk/articles/ios-push-notifications-in-practice?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): How to add iOS push notifications that earn their permission: when to ask, tokens, rich notifications, Focus modes and the work on the server. - [How to ship and version a Swift package](https://leej.uk/articles/how-to-ship-a-swift-package?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): How to create, version and publish a Swift package: API design, semantic versioning, Git tags, DocC, privacy manifests and breaking changes. - [When an App Clip is worth building](https://leej.uk/articles/when-to-build-an-app-clip?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): What an App Clip can and cannot do, the size and invocation limits, and a plain decision guide for whether a small app should have one. - [Privacy-safe photo access with PhotoKit](https://leej.uk/articles/photokit-privacy-safe-photo-access?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): How to read and write photos with PhotoKit under limited library access, when to use the picker, truthful permission strings and review issues. - [Using SwiftUI previews for design QA](https://leej.uk/articles/swiftui-previews-for-design-qa?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): How to use SwiftUI previews as a design QA workflow: traits, Dynamic Type, colour schemes, sample data, snapshot tests and keeping previews fast. - [Xcode Cloud vs GitHub Actions for iOS CI](https://leej.uk/articles/xcode-cloud-vs-github-actions-ios?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): A practical comparison of Xcode Cloud and GitHub Actions for iOS: signing, tests, cost, privacy, runners and a setup that can use either. ### Articles: Web performance and HTTP - [How to diagnose Core Web Vitals issues](https://leej.uk/articles/diagnosing-core-web-vitals?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): How to diagnose LCP, INP and CLS from a lab test, a field trace and a waterfall: what each metric means, usual causes, and a fix order that does not guess. - [How to set a performance budget](https://leej.uk/articles/performance-budget-for-small-sites?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): How to set a performance budget for a small website: what to cap, how to measure it, how it relates to Core Web Vitals, and a budget you can keep. - [Security headers and CSP checklist](https://leej.uk/articles/security-headers-and-csp-checklist?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): A checklist for HTTP security headers and Content-Security-Policy on a small site: what to set, a safe CSP rollout, and how to check the result. - [HTTP caching headers explained](https://leej.uk/articles/http-caching-headers-explained?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): How Cache-Control, ETag, Last-Modified and Vary work for HTML, CSS, APIs and CDNs, with rules a small site can apply without breaking updates. - [CORS and preflight requests explained](https://leej.uk/articles/cors-preflight-explained?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): How CORS and preflight requests work, why a call is simple or not, how cookies change the rules, and a method for debugging a failed browser request. - [Accessible colour contrast, WCAG and APCA](https://leej.uk/articles/accessible-colour-contrast-wcag-apca?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): How to choose readable text and UI colours: WCAG contrast, APCA, colour blindness, dark mode, and a method that does not rely on one magic ratio. - [Responsive images with srcset and sizes](https://leej.uk/articles/responsive-images-srcset-sizes?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): How to ship sharp, compact images with srcset and sizes, width descriptors, art direction, modern formats, and the checks that catch an oversized download. - [Accessible web forms checklist](https://leej.uk/articles/accessible-web-forms-checklist?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): A checklist for accessible web forms: labels, autocomplete, errors, focus, keyboard use, and tests that catch problems a validator can miss. - [Making a Cloudflare Workers site searchable](https://leej.uk/articles/search-friendly-cloudflare-workers-sites?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): How to keep a Cloudflare Workers site friendly to search and AI crawlers: HTML first, cache, trailing slashes, headers and the mistakes that hide pages. - [Service workers, caching and SEO](https://leej.uk/articles/service-workers-caching-and-seo?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): How a service worker can help or hide a site from crawlers: cache strategies, offline pages, what Googlebot does, and a safe default for a small site. - [Favicons, web manifests and share images](https://leej.uk/articles/favicons-manifests-and-share-images?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): A checklist for favicons, Apple touch icons, a web app manifest and Open Graph images: the files to ship, useful sizes, and how to check they appear. - [SPF, DKIM and DMARC for a UK domain](https://leej.uk/articles/spf-dkim-dmarc-for-uk-domains?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): How to set up SPF, DKIM and DMARC on a UK domain: one policy, several mail senders, a safe rollout to reject, and checks for a missing or shadowed record. - [JWT, JWKS and API authentication explained](https://leej.uk/articles/jwt-jwks-and-api-auth?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): How JWTs and JWKS work in an API: signed versus encrypted tokens, trusted claims, key rotation, and the checks that stop you accepting a bad token. ### Articles: Indie apps and the business of shipping - [App Store optimisation checklist for indie apps](https://leej.uk/articles/app-store-optimisation-checklist?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): A practical ASO checklist for indie iOS apps: name, subtitle, keywords, screenshots, review prompts and product-page experiments, without folklore. - [TestFlight beta testing checklist](https://leej.uk/articles/testflight-beta-testing-checklist?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): A TestFlight checklist: internal versus external testers, what to ask them, feedback, expiry, compliance and the steps that delay an external beta. - [Paid, freemium or subscription for indie apps](https://leej.uk/articles/paid-freemium-or-subscription-indie-apps?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): How to choose between a paid app, a free app with purchases, and a subscription as a small indie, with a decision guide that stays honest about upkeep. - [How to make App Store screenshots and previews](https://leej.uk/articles/app-store-screenshots-and-preview-videos?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): How to plan, write and export App Store screenshots and a preview video: required sizes, the first frame, captions, localisation and a repeatable process. - [VAT when selling apps and digital products in the UK](https://leej.uk/articles/vat-and-selling-digital-products-uk?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): A plain-English map of how UK VAT usually applies when you sell an app or digital product, through Apple or your own site. This is not tax advice. - [How to write a privacy policy for a small UK app](https://leej.uk/articles/privacy-policy-for-a-small-uk-app?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): A practical template for a small UK app privacy policy: what to declare, analytics, purchases, third parties and App Store links. Not legal advice. - [How to price a small app or digital tool](https://leej.uk/articles/pricing-a-small-app-or-digital-tool?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): How to pick a price for a small app or digital tool: costs, value, price points, VAT, experiments and the mistakes of copying a competitor. - [Cookie-free analytics and UK GDPR](https://leej.uk/articles/cookie-free-analytics-and-uk-gdpr?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): How cookie-free analytics relates to UK GDPR and PECR: when a cookie banner is needed, what ‘no cookies’ means, and a cautious setup. Not legal advice. - [App Store rejection checklist and how to resubmit](https://leej.uk/articles/app-store-rejection-checklist?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): A checklist for an App Store rejection: how to read the message, the usual causes, what to fix, how to reply, and how to resubmit without guessing. - [App Store Accessibility Nutrition Labels checklist](https://leej.uk/articles/app-store-accessibility-nutrition-labels?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): A checklist for App Store Accessibility Nutrition Labels: what each feature means, how to test it honestly, and how this relates to accessible SwiftUI. - [Swift A–Z](https://leej.uk/swift?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): Swift and SwiftUI terms with definitions, code examples and usage tips. - [Swift references A–F](https://leej.uk/swift/a-f?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt) - [Swift references G–L](https://leej.uk/swift/g-l?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt) - [Swift references M–R](https://leej.uk/swift/m-r?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt) - [Swift references S–Z](https://leej.uk/swift/s-z?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt) - [Mastering Swift: the A to Z guide](https://leej.uk/swift/guide?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt) - [Privacy](https://leej.uk/privacy?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt) · [Terms](https://leej.uk/terms?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt) ## Skills and contact - [What I do](https://leej.uk/what-i-do?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): Apple platforms; Websites and web apps; Data and analytics; Infrastructure, security and performance; Product and delivery, each with evidence from Lee's own projects. - [Contact](https://leej.uk/contact?utm_source=llms-txt&utm_medium=ai&utm_campaign=llms-txt): enquiry form for Apple apps, websites and web apps, analytics and data. Replies come from hello@leej.uk. ## Skills Swift, SwiftUI, watchOS, iOS, JavaScript, Python, PHP, HTML/CSS, Cloudflare Workers and D1, SEO and performance. ## Notes This site sets no cookies. Analytics are provided by quietstats. ## Site files - [Sitemap](https://leej.uk/sitemap.xml): every public page with its last-modified date. - [Full text for AI assistants](https://leej.uk/llms-full.txt): the readable text of every public page in one file. - [robots.txt](https://leej.uk/robots.txt): all search engines and AI crawlers are allowed; only /admin and /api/ are private.