Sitemap

Main Pages

  1. Homepage
  2. About
  3. Services
  4. Case Studies
  5. Articles
  6. Resources
  7. Timeline
  8. Availability
  9. Contact

Services

  1. Embedded Technical Leadership
  2. Fractional Technical Leadership
  3. Next.js Platform Architecture
  4. Headless Architecture Consulting
  5. Next.js Platform Consulting
  6. Performance Optimisation and Core Web Vitals
  7. Technical SEO for JavaScript Applications
  8. Next.js Website and Application Development
  9. Migrations to Next.js
  10. Technical SEO Recovery and Debugging
  11. Next.js Performance and Stability
  12. Headless CMS Integration
  13. Vercel Deployment Debugging
  14. React SPA to Next.js Migration
  15. WordPress to Next.js Migration
  16. Gatsby to Next.js Migration
  17. Contentful to Sanity Migration
  18. Shopify to Next.js Headless Commerce
  19. Drupal to Next.js Migration
  20. Pages Router to App Router Migration
  21. WordPress to Next.js SEO Recovery
  22. Traffic Drop After a Redesign or Replatform
  23. JavaScript SEO Rendering and Indexing Fix
  24. Next.js Sitemap, Robots, and Crawlability Debugging
  25. Next.js Redirects and URL Normalisation Fix
  26. Next.js Core Web Vitals Regression Fix
  27. Next.js Hydration Mismatch Fix
  28. Third‑Party Script Performance Optimisation
  29. Next.js Draft Mode Preview Fix
  30. Headless CMS SEO Gaps
  31. Headless CMS Cache and Revalidation Debugging
  32. Contentful Preview Performance in Next.js
  33. Next.js Vercel Build Failures Debugging
  34. Next.js Site Broke After Deploy
  35. Next.js Vercel Build Timeout and Memory Fix
  36. ISR and Revalidation Failures on Vercel
  37. NextAuth Production Authentication Debugging
  38. Next.js Multi‑Tenant Architecture
  39. Next.js Multi‑Brand Platform Architecture
  40. App Router Performance and Caching Debugging
  41. Supporting Services
    1. Technical Writing and Documentation
    2. Partnership and Advisory Support
    3. Technical Content Partnerships
    4. Accessibility and Usability Reviews
    5. Codebase Audits and Optimisation
    6. Ongoing Support and Maintenance
    7. Hosting and Platform Support

Resources

  1. Website Replatforming Risk Register
  2. Technical SEO Audit Checklist for React and Next.js Websites
  3. Structured Data Implementation Matrix for React and Next.js Websites
  4. Traffic Drop Triage Checklist After a Redesign or Replatform
  5. Headless CMS SEO Controls Matrix
  6. Rendered HTML Migration Comparison Worksheet

Case Studies

  1. Virgin Atlantic & Holidays
  2. IMG Licensing
  3. Microsoft
  4. Nando’s
  5. HSBC Corporate Banking
  6. Selfridges
  7. Linkudo
  8. John Lewis
  9. Navico
  10. BBC Future Media
  11. The World Economic Forum
  12. Style.com
  13. Bose Product Support
  14. Polestar
  15. Macmillan Education
  16. Plex.tv
  17. Boohoo Group
  18. Dataffirm
  19. Lotus
  20. LEGO
  21. Wreel Agency
  22. Red Central
  23. MOSCOT Eyewear
  24. Cox & Kings
  25. Tony's Chocolonely
  26. ToyBoxX

Support Pages

  1. Terms & Imprint
  2. Privacy
  3. Sitemap

Social Accounts

  1. WhatsApp
  2. LinkedIn
  3. GitHub
  4. YunoJuno
  5. Wellfound (Formerly AngelList)
  6. Gatsby
  7. Google Maps
  8. X

Article Categories

  1. Accessibility
  2. Adaptive Development
  3. Algorithms
  4. AMP
  5. Angular
  6. Answer Engine Optimisation (AEO)
  7. April Fools
  8. Architecture
  9. Artificial Intelligence (AI)
  10. Brighton
  11. Career
  12. Chakra UI
  13. CMS
  14. Consulting
  15. Contentful
  16. Copyright
  17. Cross‑Browser Compatibility
  18. CSS
  19. Cypress
  20. Data Structures
  21. Delivery
  22. Design Systems
  23. Dev Match
  24. Development
  25. Digital Transformation
  26. Drupal
  27. E‑Commerce
  28. Engineering Practices
  29. ES6
  30. Front‑End Development
  31. FTP
  32. Gatsby
  33. GDPR
  34. Generative Engine Optimisation (GEO)
  35. Git
  36. Google
  37. GraphQL
  38. Guides
  39. Headless CMS
  40. Hiring
  41. Hosting
  42. .htaccess
  43. HTML
  44. Image Rendering
  45. Images
  46. Internet Explorer
  47. JavaScript
  48. jQuery
  49. JSX
  50. Leadership
  51. LeetCode
  52. Liquid
  53. Miscellaneous
  54. Netlify
  55. Next.js
  56. Node.js
  57. Performance
  58. PHP
  59. React
  60. Responsive Design
  61. Responsive Development
  62. Sass
  63. Search Engine Optimisation (SEO)
  64. Security
  65. Server‑Side Rendering (SSR)
  66. Shopify
  67. Sitemaps
  68. Static Sites
  69. Structured Data / schema.org
  70. styled‑components
  71. Technical SEO
  72. Testing
  73. TypeScript
  74. Typography
  75. Vercel
  76. Video
  77. Vue.js
  78. WordPress

Articles

  1. Building Accessible Modals, Drawers, and Popovers in React
  2. Choosing Where State Lives in React: Local State, Context, URL, Cache, or Server
  3. Turning Lighthouse Findings into a Credible Engineering Roadmap
  4. When AI Starts Doing Our Thinking for Us
  5. Using useTransition and useDeferredValue to Keep React Interfaces Responsive
  6. Profiling React Re‑Renders Before Reaching for useMemo
  7. Stale Closures in React: Why Handlers, Effects, and Timers Read Old State
  8. Debugging Hydration Mismatches in React and Next.js
  9. AI Search Readiness is Not Protocol‑First
  10. How to Measure GEO Without Chasing Made‑up Metrics
  11. Reducing Headless CMS Image Bandwidth with a Storage Mirror
  12. Lessons from Running Next.js Pages Router at Scale in 2026
  13. How to De‑Risk a CMS Migration Before the Real Migration Starts
  14. Retention Theatre: Why Companies Lose Good Engineers Whilst Pretending to Listen
  15. Why Transformation Programmes Fail After the Slide Deck
  16. Technical AEO: Structuring Content for Direct Answers Without Creating FAQ Spam
  17. Building an LRU Cache in TypeScript: Hash Map and Doubly Linked List in Practice
  18. Product Engineers and Software Engineers: What's the Difference?
  19. How to Make Content Easier for Generative Engines to Trust
  20. The Consultancy Rescue Loop
  21. The Deadline Debt Nobody Tracks
  22. When Sass Colours Break After a Next.js Production Build
  23. Mastering Server Components in Next.js
  24. The Engineering Capability Trap
  25. HTTP 402 finally Found a Purpose
  26. LeetCode: 'Maximum Subarray' and Kadane's Algorithm Explained
  27. The Seniority Trap: Hiring Experience Without Giving Authority
  28. The Talent Bar Paradox in Engineering Hiring
  29. The Web is Becoming Machine‑Readable First
  30. Converting Objects to Query Strings and Vice Versa
  31. The False Economy of Cheap Engineering
  32. HTTP Cache Validation with ETag and Last-Modified
  33. Best Practices for Managing Environment Variables in Next.js
  34. Production Observability for Next.js: Instrumentation, Logs, and Release Debugging
  35. The False Economy of Cutting QA in the AI Delivery Era
  36. Everyone Wants the Best Engineers. Fewer Companies Want to Pay for Them.
  37. Your Website Has a New Customer: The AI Agent
  38. AI Slop is a Symptom, Not the Disease
  39. Faceted Navigation SEO in Headless Commerce: Filters, Canonicals, and Crawl Control
  40. The Platform Dependency Trap: When Efficiency Becomes Lock‑in
  41. Right to Represent Agreements for UK Contractors
  42. Error Handling in JavaScript with try, catch, and finally
  43. Gatsby Build Times are Slow: Fix or Migrate?
  44. When AI Search Creates Visibility Without a Visit
  45. The AI Governance Gap in Digital Transformation
  46. GTM, Consent Tools, and Core Web Vitals: How to Audit Third‑Party Script Cost
  47. Why AI Makes Senior Engineers More Important, Not Less
  48. Gatsby to Next.js Migration Checklist
  49. The Automation Tax No One Measures
  50. Contentful to Sanity Migration Checklist for Next.js Sites
  51. SEO Best Practices in Next.js: Improving Core Web Vitals
  52. Google's Search Monopoly Was Built on a Deal. AI is Rewriting It.
  53. Why Your Next.js App Router Page is Stale: Cache Tags, Revalidation, and CMS Publishing
  54. Contentful to Sanity Migration Risks for Next.js Sites
  55. AI and the Collapse of Organisational Memory
  56. CMS Preview Should Be a Migration Requirement, Not an Afterthought
  57. The Hidden Cost of Replacing Juniors with AI
  58. The Web Just Invented a Toll Booth for AI
  59. Should You Move from Contentful to Sanity?
  60. AGI vs. AI vs. ASI: What Actually Changes?
  61. A Deep Dive into JavaScript's Proxy and Reflect API
  62. Fixing Contentful Preview in Next.js Draft Mode
  63. Union‑Find Explained: Solving the 'Number of Provinces' Problem
  64. Privacy by Design is Not a Cookie Banner
  65. The Great AI Content Collapse: Why Cheap Content Makes Real Expertise More Valuable
  66. The AI Middle Manager Problem
  67. Next.js Build Failing on Vercel: How to Find the First Real Failure
  68. Technical GEO for Websites: Entities, Structured Data, and Crawl Paths
  69. State Management in Angular: NgRx vs. SignalStore
  70. Schema for Service Pages Without Overclaiming
  71. How Service Pages Become Answerable in AI Search
  72. AI is Making Technical Debt Cheaper to Create
  73. Traffic Dropped After a Replatform: The Technical Checks I Run First
  74. E‑Commerce SEO Migration: Product and Category Pages in Next.js
  75. The AI Productivity Mirage: When More Output Does Not Mean More Value
  76. AI Will Be OK If We Stop Treating It Like Magic
  77. Should You Move a Shopify Storefront to Next.js?
  78. What is Artificial Superintelligence (ASI)?
  79. What is a Timing Attack? Side Channels, Examples, and Safer Comparisons
  80. Next.js Multi‑Tenant Architecture
  81. State Management in Vue: Vuex vs. Pinia
  82. Content Security Policy in Next.js: Static Pages, Nonces, and Real‑World Trade‑Offs
  83. Pages Router to App Router Migration Risk Checklist
  84. What AEO is, and How It Fits with SEO and GEO
  85. Core Web Vitals Got Worse After a Redesign
  86. Solving the LeetCode N‑Queens Problem
  87. The AI Layoff Trap: When Local Efficiency Becomes Systemic Fragility
  88. When Production Data Breaks a Next.js Site
  89. How to Vet a Senior Next.js Developer for a Replatform or Recovery Project
  90. Using Angular Signals for Performance Optimisation
  91. Responsible AI Needs an Owner
  92. NextAuth Works Locally but Fails in Production
  93. LeetCode: The 'Kth Smallest Element in a BST' Problem
  94. Using RxJS for State Management in Angular
  95. Why Next.js Builds Time Out on Vercel
  96. React Developer vs. Next.js Developer: What Actually Changes in Production
  97. Backtracking Decision Trees: Solving 'Combination Sum'
  98. GEO vs. SEO: Where They Overlap, and Where They Don't
  99. Next.js Site Broke After Deploy: A Production Triage Checklist
  100. Solving the 'Jump Game' Problem with Greedy Algorithms
  101. Memoisation in JavaScript: Optimising Function Calls
  102. Next.js Proxy Replaces Middleware: What Changes in Practice
  103. CMS Content Not Updating in Next.js
  104. Dynamic Programming in LeetCode: Solving 'Coin Change'
  105. Handling API Routes in Next.js: When to Use Server Actions vs. API Routes
  106. LeetCode: Finding the Diameter of a Binary Tree
  107. Headless CMS SEO Controls Checklist
  108. Topological Sort: Solving the 'Course Schedule' Problem
  109. Enterprise AI Delivery Starts After the Pilot
  110. Technical SEO Launch Criteria for a Next.js Migration
  111. What GEO is, and Why It is Not Just SEO for AI
  112. Understanding the Module Pattern in JavaScript
  113. How to Compare Rendered HTML Before and After a Migration
  114. Multi‑Source BFS: Solving the 'Rotting Oranges' Problem
  115. Caching Across React, Next.js and Serverless Applications
  116. Traffic Dropped After a WordPress to Next.js Migration: What to Check First
  117. Agentic Systems Do Not Fix Weak Service Boundaries
  118. WordPress to Next.js Migration Checklist for Content, Preview and SEO
  119. Quickselect in TypeScript: Solving 'Kth Largest Element in an Array'
  120. Practical Use Cases for JavaScript Set and Map
  121. Next.js Sitemap, Robots, and Crawlability Debugging Checklist
  122. Find Peak Element: Binary Search Without a Fully Sorted Array
  123. Deep Tech Needs Translation, Not Simplification
  124. Why JavaScript Pages are Crawled but Not Indexed
  125. Graph Traversal: Solving the 'Course Schedule' Problem
  126. React SPA to Next.js Migration Checklist for SEO and Indexing
  127. Dev Match Ltd., James McConnell, and the Refund That Never Came
  128. Testing Vue Components with Vue Test Utils
  129. Modified Binary Search: Solving 'Search in Rotated Sorted Array'
  130. Rewrite, Refactor, or Strangle? A Practical Decision Framework
  131. Greener Software is Mostly Less Waste
  132. LeetCode: Solving the 'Merge Two Sorted Lists' Problem
  133. Binary Search on the Answer: Solving 'Koko Eating Bananas'
  134. Understanding Tail Call Optimisation in JavaScript
  135. Understanding WeakMap and WeakSet in JavaScript
  136. JavaScript Symbols: When and Why to Use Them
  137. React's Virtual DOM vs. the Real DOM
  138. Best Practices for Vue Router in Large Applications
  139. How JavaScript Handles Memory Management and Garbage Collection
  140. Implementing Server‑Side Rendering (SSR) in Vue
  141. Monotonic Stack: Solving the 'Daily Temperatures' Problem
  142. Generate Parentheses in TypeScript: A Clean Backtracking Walkthrough
  143. Implementing a Trie in TypeScript: Solving 'Implement Trie (Prefix Tree)'
  144. Building Efficient Recursive Functions in JavaScript
  145. The Execution Context in JavaScript
  146. Optimising Performance in React with useMemo and useCallback
  147. Solving the LeetCode 'Binary Tree Zigzag Level Order Traversal' Problem
  148. When Next.js 15.5.5 Middleware Does Not Fire in Pages Router
  149. Optimising Next.js Performance with Incremental Static Regeneration (ISR)
  150. Reverse an Array in JavaScript
  151. Preventing and Debugging Memory Leaks in React
  152. Creating Custom Vue Directives for Enhanced Functionality
  153. Breadth‑First Search: Solving Binary Tree Level Order Traversal
  154. Prefix Sums and Hash Maps: Solving 'Subarray Sum Equals K'
  155. Container Queries in CSS
  156. Building a Headless CMS‑Powered Site with Next.js
  157. Sorting Complex Arrays in JavaScript
  158. Understanding the Backtracking Approach: Solving the 'Word Search' Problem
  159. CSS aspect-ratio for Responsive Layouts
  160. Fast and Slow Pointers: Solving the 'Linked List Cycle' Problem
  161. Building Multi‑Tenant Applications with Next.js
  162. Single Number in TypeScript with Bit Manipulation
  163. From Netlify Deploys to Vercel Pipelines
  164. Ethical AI, Sustainability and the Future of Web Development
  165. Building a Custom Vue 3 Composable Using the Composition API
  166. Redirect a Default Vercel Subdomain to Your Custom Domain
  167. Grid Traversal: Solving the 'Number of Islands' Problem
  168. Vue's provide/inject API: When and How to Use It
  169. Ethical AI in Web Development: AI's Impact on Developers and the Industry
  170. Vue 3 Reactivity: Proxies vs. Vue 2 Reactivity
  171. Understanding the Difference Between <b> and <strong>
  172. Optimising Vue.js Performance with Lazy Loading and Code Splitting
  173. Sliding Window Fundamentals: Solving 'Longest Substring Without Repeating Characters'
  174. Using Next.js Proxy for Route Protection
  175. Control CSS Container Layouts with place-content
  176. Fixed Quote, Day Rate, or Retainer: Buying Senior Web Development Work
  177. When Static Generation Stopped Being Simple
  178. Simplify Your Layout CSS with place-items
  179. Optimising Angular Forms: Template‑Driven vs. Reactive Forms
  180. From Liquid Templates to Headless Storefronts
  181. Converting Between Camel, Snake, and Kebab Case in JavaScript
  182. LeetCode: The 'Trapping Rain Water' Problem with Two‑Pointer Approach
  183. AI in Web Development: Useful, but Not Magic
  184. Lazy Loading in Angular: Optimising Performance
  185. A Brief Look at JavaScript's Temporal Dates and Times API
  186. Next.js vs. Remix: Understanding the Key Differences
  187. Horizontal & Vertical Scanning: The Longest Common Prefix Problem
  188. Intervals in Practice: Solving the 'Merge Intervals' Problem
  189. Understanding the CSS :where() Function
  190. Understanding Signals in Angular: The Future of Reactivity
  191. Generating Email Addresses from Public Data is Illegal
  192. Using Vue's suspense for Asynchronous Components
  193. Declarative vs. Imperative Programming
  194. Prefix and Suffix Products: Solving 'Product of Array Except Self'
  195. Currying in JavaScript Explained
  196. LeetCode: Removing the nth Node from the End of a List
  197. Building Custom Directives in Angular
  198. Gatsby and Contentful: Why the Pair Worked
  199. OWASP Top Ten: What Web Engineers Should Know
  200. The Palindrome Number Problem: Strings vs. Maths in JavaScript
  201. Building Design Systems for Web Applications with Figma, Storybook, and npm
  202. Caching Strategies for Data Fetching in Next.js
  203. What are Higher‑Order Components in React?
  204. Object Control in JavaScript: defineProperties()
  205. The JavaScript map() Method
  206. Angular Standalone Components: Do We Still Need Modules?
  207. React's Reconciliation Algorithm Explained
  208. Finding the Median of Two Sorted Arrays with JavaScript
  209. Understanding Event Loop and Concurrency in JavaScript
  210. Exploring the call() Method in JavaScript
  211. The Role of Dependency Injection in Angular
  212. Understanding Short‑Circuiting in JavaScript
  213. Finding the Difference Between Two Strings in JavaScript
  214. Using Vue's Teleport for Modals and Portals
  215. Tips for Managing Memory in JavaScript
  216. Understanding the Difference Between 'Indexes' and 'Indices'
  217. Best Practices for Angular Routing and Lazy Loading
  218. Track Element Visibility Using Intersection Observer
  219. Deep‑Cloning vs. Shallow‑Cloning in JavaScript
  220. Component APIs Before React Hooks Settled
  221. Mastering JavaScript Iterators and Generators
  222. Access Search Parameters in Next.js SSR'd Layout
  223. Freelancer, Agency, or Lead‑Level Contractor: Which Fits a Serious Web Platform Project?
  224. Flattening Arrays in JavaScript
  225. Unit Testing in Angular: Writing Effective Tests
  226. Delete All Local Git Branches Except for master or main
  227. Use JavaScript to Find the Week Day from a Date
  228. Dynamic Sizing with CSS clamp()
  229. Understanding Object Types with JavaScript's instanceof
  230. Implementing Authentication in Next.js Using NextAuth.js
  231. Understanding Transient Props in styled-components
  232. reduce() in JavaScript
  233. Creating Progressive Web Apps (PWAs) with Angular
  234. Dynamic Sizing with CSS max()
  235. Object Equality in JavaScript: {} isn't Equal to {}
  236. Pure Functions in JavaScript
  237. Understanding the Composition API in Vue 3
  238. Dynamic Sizing with CSS min()
  239. Testing the Content of JSX Data in Cypress
  240. Angular Change Detection: How It Works and How to Optimise It
  241. How View Source Stopped Being Enough
  242. Validating Parentheses Input Using TypeScript
  243. Dynamic Calculations in CSS Using calc()
  244. Leveraging .then() in Modern JavaScript
  245. Stopping Propagation vs. Preventing Default in JavaScript
  246. Solving the 'Letter Combinations of a Phone Number' Problem with TypeScript
  247. Creating Custom Viewport Units Instead of Using vh and vw
  248. Introducing Seeded Randomisation into an SSR Gatsby Project
  249. LeetCode: Converting Roman Numerals to Integers
  250. LeetCode: Converting Integers to Roman Numerals
  251. Staying Current: Automating Copyright Year Updates
  252. Repetitive Asynchronous Tasks with JavaScript's setInterval()
  253. Dynamic Navigation with React Router
  254. Understanding and Solving Regular Expression Matching
  255. LeetCode Container with Most Water: The Two‑Pointer Solution
  256. How Much Do Software Engineers Make in the UK?
  257. JavaScript Build Tools Before Framework CLIs Took Over
  258. Top Reasons to Work with a Local Web Developer in Brighton
  259. Is a Software Engineer High Paying?
  260. Understanding prototype.apply() in JavaScript
  261. The Longest Palindromic Substring in JavaScript
  262. Enhancing Web Typography with text-wrap: balance
  263. Using JavaScript and the Two‑Pointer Technique to Solve 4Sum
  264. The Power of text-wrap: pretty
  265. When jQuery Plugins Became Front‑End Debt
  266. JavaScript's hasOwnProperty() Method
  267. 3Sum Closest in JavaScript: Sorting and Two Pointers
  268. Removing Duplicates from a JavaScript Array ('Deduping')
  269. Add Two Numbers in TypeScript: A LeetCode Linked List Solution
  270. Trigonometric Functions in CSS
  271. 3Sum in JavaScript: Two Pointers After Sorting
  272. JavaScript's typeof Operator: Uses and Limitations
  273. Will AI Replace Front‑End Developers?
  274. Rethinking Carousels: Going Around in Circles
  275. Differences Between Falsy and Nullish Values in JavaScript
  276. parseInt in JavaScript: The Significance of Radix
  277. Longest Substring Without Repeating Characters in JavaScript
  278. Valid Palindrome in JavaScript: Two Pointers and Normalisation
  279. Build‑Time SEO Checks in Gatsby
  280. Harnessing the Power of Function.prototype.bind()
  281. Automatically Generate Text Sitemaps in Gatsby
  282. Harnessing JavaScript's defineProperty()
  283. String to Integer (atoi): Decoding Strings in JavaScript
  284. JavaScript Array Manipulation: slice() vs. splice()
  285. Understanding the Nullish Coalescing (??) Operator in JavaScript
  286. Understanding setTimeout() in JavaScript
  287. The LeetCode Zigzag Conversion Problem in TypeScript
  288. Common Accessibility Pitfalls in Web Development
  289. Sorting Objects in JavaScript
  290. Commenting in Front‑End Languages
  291. Return the Length of Arguments Passed in JavaScript
  292. Dynamic Array Manipulation with JavaScript's splice()
  293. Swearing in the Workplace
  294. LeetCode: Reversing Integers with JavaScript
  295. Using the filter() Method in JavaScript
  296. Manipulating Strings in JavaScript with split()
  297. Check If Today is Between Two Dates in JavaScript
  298. JavaScript String Manipulation: substring() vs. substr()
  299. Solving the LeetCode Two Sum Problem Using JavaScript
  300. Why We Use an Empty Dependency Array in React's useEffect Hook
  301. Mastering JavaScript's slice()
  302. Understanding JavaScript's sort() Method
  303. Responsive JavaScript and the matchMedia Method
  304. Unravelling JavaScript: Commonly Misunderstood Methods and Features
  305. The will-change Property in CSS
  306. JavaScript's % Operator: Remainder and Modulo
  307. Throttling Scroll Events in JavaScript
  308. What A Levels Do You Need for Software Engineering?
  309. How to Handle Multiple Named Exports in One JavaScript File
  310. Why Remote Work Did Not Make Brighton Web Developers Less Local
  311. Using CSS Logical Properties for Direction‑Aware Layouts
  312. How to Import All Named Exports from a JavaScript File
  313. Check If a String Contains Only Whitespace with JavaScript
  314. Keeping Gatsby Build Times Under Control
  315. Higher‑Order Functions in JavaScript
  316. Improve Page Performance with content-visibility
  317. Resolving mini-css-extract-plugin Warnings in Gatsby
  318. The End of Internet Explorer
  319. Technical Debt vs. Bad Code
  320. Using Container Queries in CSS
  321. position: sticky in CSS
  322. Using the CSS :has Pseudo‑Class
  323. Spread Syntax in JavaScript (...)
  324. The Safest Way to Test for NaN in JavaScript
  325. When to Use var or let or const
  326. Local SEO is a Technical Problem Too
  327. What is a Distributed Denial of Service (DDoS) Attack?
  328. Gatsby & GraphQL: Nodes vs. Edges
  329. HTML Video and the preload Attribute
  330. Why You Should Not Use Protocol‑Relative URLs
  331. Can I Learn Front‑End Development in 2 Months?
  332. Where to Find Jobs in Web Development
  333. localStorage in JavaScript
  334. Detecting Breakpoints in React Using Chakra UI
  335. How to Improve Your Time to First Byte (TTFB)
  336. Optional Chaining in JavaScript (?.)
  337. Semantic HTML
  338. Positioning in CSS
  339. Why is Time to First Byte (TTFB) Important?
  340. Automatically Submit Sitemaps to Google During Gatsby Build
  341. Margin Collapse in CSS
  342. Use CSS to Change the Mouse Cursor
  343. Exploring CSS Viewport Units Beyond vw and vh
  344. Cleaning up Your JavaScript Code: The Double Bang (!!) Operator
  345. Performance Lessons from Small Brighton Websites
  346. Web Development and the Environment
  347. Understanding and Using Flexbox in CSS
  348. React vs. Vue vs. Angular
  349. Specificity in CSS
  350. Static Site Generators
  351. Use Chrome's Developer Tools to Track Element Focus
  352. 10 Essential SEO Tips for Front‑End Developers
  353. All About Headless CMSes
  354. How to Amend Git Commits
  355. A Beginner's Guide to Web Hosting
  356. Planning Content Models for a Headless CMS
  357. What Makes a Great JavaScript Developer?
  358. Do Websites Need to Look the Same in Every Browser?
  359. Adaptive vs. Responsive Design & Development
  360. What Skills are Required for a Front‑End Developer?
  361. CSS Visual Order is Not Document Order
  362. What is an HTML Entity?
  363. Flexbox vs. grid
  364. Renaming and Destructuring Variables in ES6
  365. How to Choose a React Developer
  366. Create Arrays of Any Size with Placeholder Content in JavaScript
  367. The Quirks of z-index
  368. How to Rename Local and Remote Git Branches
  369. How to Hire a JavaScript Developer
  370. ReferenceError: window is Not Defined in Gatsby
  371. Life as a Freelance Developer in Brighton
  372. Has Google Killed AMP?
  373. Announcing Dynamic Updates with ARIA Live Regions
  374. Ethical Web Development II: Accessibility and Inclusivity
  375. How to Hire a Freelance Front‑End Developer
  376. Changing the Colour of Placeholder Text
  377. Ethical Web Development I: Privacy, Consent, and Security
  378. Git is a Little Bit Like a Diary
  379. UK Freelance Front‑End Developer Rates in 2021
  380. The Differences Between Lead and Senior Roles in Front‑End Development
  381. Block Bad Bots Using .htaccess
  382. What Does Front‑End Development Mean?
  383. Front‑End Web Development: A Beginner's Introduction
  384. Access CSS Variables from a Database via db-connect
  385. Incremental Static Regeneration and CMS Publishing Freshness
  386. Installing Gatsby onto an M1 MacBook Air
  387. React: Functional, Class, and Pure Components
  388. What Does a Software Engineer Do?
  389. How to Find Your First Web Developer Job in the UK
  390. Preview Mode in Next.js with a Headless CMS
  391. Detecting and Dealing with Website Theft
  392. Sort the Keys of an Object with JavaScript
  393. Previewing CMS Content in Gatsby Workflows
  394. Bug, Defect, Issue, or Incident?
  395. Disabling Gatsby Telemetry
  396. Removing p Tags from Contentful List Items
  397. Rendering CMS Rich Text Safely in Gatsby and React
  398. Rendering Contentful Rich Code Snippets in Gatsby
  399. Why Gatsby and Contentful Work Well Together
  400. What are Array‑Like Objects in JavaScript?
  401. Replace Inline Styles in Gatsby with an External CSS File
  402. Why Choose Me as a Brighton and South East Web Developer
  403. When to Use Promise.allSettled in JavaScript
  404. Disabling Source Maps in Gatsby for Production
  405. Image Optimisation with next/image
  406. Responsive Images for Faster Front‑End Pages
  407. Optimising gatsby-image Even Further
  408. Using Regex to Replace Numbers in a String
  409. Intercepting Clipboard Events with JavaScript
  410. Dynamic Imports and Code Splitting in Next.js
  411. Accessibility in Reusable Front‑End Components
  412. Adding Static Files to a Gatsby Site
  413. CSS Focus Styles for Keyboard Users Only
  414. Keeping Gatsby Builds Predictable
  415. Parent Selectors in CSS and Sass
  416. Automatically Deploy a Static Gatsby Site via FTP
  417. Using JavaScript to Avoid Orphans
  418. Understanding getStaticPaths in Next.js
  419. Using CSS to Deal with Widows
  420. Use Greater‑Than and Less‑Than Symbols in JSX
  421. Using getStaticProps with CMS Data
  422. Reducing Image Brightness with CSS
  423. Commenting in JSX
  424. getStaticProps vs. getServerSideProps in Next.js
  425. Creating a Discernible Name for Icon Links
  426. Static Generation with CMS Content and Build‑Time Data
  427. Interpolation: Sass Variables Inside calc()
  428. Building Custom Hooks in React
  429. What is a Static Site Generator?
  430. Deploying Static Front Ends with Netlify and Build Hooks
  431. Static Generation vs. Server‑Side Rendering in Next.js
  432. Redirect a Default Netlify Subdomain to Your Custom Domain
  433. Break Out of CSS Nesting with Sass
  434. Advanced Sass: Loops
  435. Using Storybook to Document Front‑End Components
  436. API vs. Endpoint: Are They the Same Thing?
  437. Hiding Empty Elements with CSS
  438. Disabling Text Selection Highlighting with CSS
  439. Alternative Text in the CSS content Property
  440. Prepending PHP to a Page in Gatsby
  441. Automatically Generate urllist.txt from sitemap.xml
  442. Conditional HTML for Browsers Other than Internet Explorer
  443. Throttling vs. Debouncing in JavaScript: Managing Event Frequency
  444. How to Replace All Instances of a String in JavaScript
  445. Understanding Element Dimensions in JavaScript: Width and Height
  446. Using CSS Custom Properties for Shared Design Values
  447. Managing Design Values in Front‑End Code
  448. How to Use and Clear the CSS float Property
  449. Using display in CSS
  450. How to Use grid in CSS
  451. useReducer in React
  452. Check If Three Values are Equal in JavaScript
  453. Toggle a Boolean in JavaScript
  454. Dynamic Routes in Next.js
  455. 301 vs. 307 Redirects
  456. JavaScript's Math.random()
  457. Shopify Theme Constraints with Liquid
  458. useRef in React
  459. Using Liquid Templates in E‑Commerce Front Ends
  460. Exploring the Liquid Templating Language
  461. React Hooks: Modern State Management
  462. Authentication vs. Authorisation: What's the Difference?
  463. Why forEach Does Not Wait for async Callbacks
  464. Checking Rendered HTML for JavaScript Pages
  465. Class vs. Functional Components in React
  466. Advanced Techniques for Responsive Web Design
  467. Client‑Side Rendering and Search Visibility
  468. Custom _app and Custom _document in Next.js
  469. The JavaScript Event Loop: A Beginner's Guide
  470. Creating Interactive User Interfaces with HTML, CSS, and JavaScript
  471. Simplify Asynchronous JavaScript with async/await
  472. How to Prevent Race Conditions in JavaScript with AbortController
  473. Best Practices for Cross‑Browser Compatibility
  474. Library vs. Framework: What's the Difference?
  475. Using next/link for Client‑Side Navigation
  476. Opening Links in a New Tab Safely
  477. Event Delegation in JavaScript
  478. The React Context API: When to Use It and When Not to
  479. JavaScript Rendering and SEO Checks
  480. Merging Multiple Objects in JavaScript
  481. Front‑End Risks in Drupal Template Work
  482. Submitting Forms with JavaScript and FormData
  483. Event Bubbling vs. Capturing in JavaScript
  484. SEO Risks in WordPress Theme and Plugin Work
  485. Leveraging JavaScript Frameworks for Efficient Development
  486. The Fetch API for Beginners: GET, POST, JSON, and Errors
  487. Making CMS Templates Maintainable with HTML, CSS, and JavaScript
  488. Tagged Template Literals in JavaScript
  489. Technical SEO Checks for CMS Templates
  490. Escaping and Unescaping Special Characters in JavaScript
  491. Integrating CMSes with HTML, CSS, and JavaScript
  492. React Error Boundaries Explained
  493. Manipulate Elements with CSS transform
  494. URL, Uri, and Urn: What's the Difference?
  495. Object.keys(), Object.values(), and Object.entries() Explained
  496. Single or Double Colons in CSS Pseudo‑Elements (:before vs. ::before)
  497. CSS box-sizing: Controlling the Element Box Model
  498. Understanding File‑System Routing in Next.js
  499. JavaScript Hoisting: Variables, Functions, and More
  500. Closures in JavaScript: The Key to Lexical Scope
  501. Static Methods vs. Instance Methods in JavaScript Classes
  502. Understanding the :hover Pseudo‑Class in CSS
  503. The Value of Choosing a Web Developer Near You: Customised Solutions for Local Success
  504. Using Viewport Units in CSS: vw and vh
  505. Mutation vs. Immutability in JavaScript Arrays and Objects
  506. Array.includes() vs. indexOf() in JavaScript
  507. Respecting Reduced‑Motion Preferences in CSS
  508. React Portals Explained
  509. Enhancing User Experience with CSS and JavaScript Animations
  510. CSS Animations: Transitions vs. Keyframes
  511. React Fragments Explained
  512. Building Responsive Navigation with CSS and JavaScript
  513. Understanding Media Queries in CSS
  514. Setting Front‑End Performance Budgets
  515. Optimising Website Performance with HTML, CSS, and JavaScript
  516. Avoiding Forced Layout and Layout Thrashing in JavaScript
  517. Understanding Browser Caching with Cache-Control and Validators
  518. Mastering CSS Animations with @keyframes
  519. extends and super in JavaScript Classes
  520. JavaScript Essentials for Freelance Web Developers
  521. React Unknown DOM Props: Why Component Props Reach the HTML
  522. Some of the Most‑Misunderstood Properties in CSS
  523. Improving Scroll Performance with Passive Event Listeners
  524. ::before and ::after Pseudo‑Elements in CSS
  525. Accessibility vs. Usability: What's the Difference?
  526. Understanding the Critical Rendering Path
  527. Promise.all() vs. Promise.race() in JavaScript
  528. Generators in JavaScript: A Beginner's Guide
  529. Building Polyfills for JavaScript Array and String Methods
  530. JavaScript Error Handling Patterns
  531. The CSS overflow Property
  532. The Difference Between JavaScript Callbacks and Promises
  533. Array.find(), Array.some(), and Array.every() in JavaScript
  534. Understanding CSS Transitions
  535. Object.is() vs. Strict Equality in JavaScript
  536. What is CORS and Why is My JavaScript fetch Blocked?
  537. BEM and Sass for Component CSS
  538. Creating and Dispatching Custom Events in JavaScript
  539. Mastering CSS for Freelance Web Development Projects
  540. Organising Sass with Partials and Mixins
  541. What are CSS Preprocessors, and Why Should You Use Them?
  542. Fundamentals of HTML: A Guide
  543. Object.freeze(), Object.seal(), and preventExtensions()
  544. CSS visibility: Hiding Elements Without Affecting Layout
  545. Controlling Element Transparency with CSS opacity
  546. JavaScript or JavaScript: Does Capitalisation Matter?
  547. Optimising HTML Markup for SEO
  548. Number.isNaN(), Number.isFinite(), and Number.isInteger() in JavaScript
  549. Browser vs. Node.js in JavaScript: Why Code Works in One and Fails in the Other
  550. Understanding CSS Positioning
  551. Promises in JavaScript: An Introduction
  552. Function Declarations vs. Function Expressions vs. Arrow Functions
  553. Rest and Spread Operators in JavaScript: A Beginner's Guide
  554. Template Literals in JavaScript: Writing Multi‑Line Strings
  555. String.startsWith(), endsWith(), and includes() in JavaScript
  556. Understanding Phantom window.resize Events in iOS
  557. for...in vs. for...of in JavaScript
  558. JSON.parse() and JSON.stringify() Explained for Beginners
  559. Default Parameters in JavaScript in More Depth
  560. Live and Static DOM Collections in JavaScript
  561. Array.from() and Array.of() in JavaScript
  562. Default Parameters in JavaScript: A Guide
  563. Understanding Arrow Functions in JavaScript
  564. The arguments Object vs. Rest Parameters in JavaScript
  565. Why input.value Returns a String in JavaScript
  566. Object Property Shorthand and Computed Property Names in JavaScript
  567. Client‑Side Form Validation with the HTML Constraint Validation API
  568. Parameters vs. Arguments: What's the Difference?
  569. null and undefined in JavaScript
  570. Exporting and Importing Using ES6 Modules
  571. Back End, Backend, or Back‑End: Which is Correct?
  572. Object.assign() in JavaScript: Merging and Shallow Copies
  573. Using Feature Detection in Front‑End Development
  574. Rendering Lists in React and Why Keys Matter
  575. The Difference Between == and === in JavaScript
  576. Classes in JavaScript: An Introduction
  577. Comparing Arrays in JavaScript
  578. Writing Safer JavaScript for Older Browsers
  579. Immediately Invoked Function Expressions (IIFEs)
  580. Understanding call, apply, and bind in JavaScript
  581. Appending and Prepending Items to JavaScript Arrays
  582. How Inheritance Works in the JavaScript Prototype Chain
  583. JavaScript Build Tools and Module Formats
  584. Type Coercion in JavaScript: Implicit vs. Explicit Conversion
  585. Using CommonJS to Implement Modules in JavaScript
  586. Five Tips for Transitioning from Permanent to Freelancing
  587. Object URLs Need a Lifecycle: Creating and Revoking Blob URLs
  588. Login, Log in, or Log‑in: Which is Correct?
  589. How to Find the Best Web Developer Near You: A Guide for Local Businesses
  590. Controlled vs. Uncontrolled Components in React
  591. Why this Changes in JavaScript Event Handlers and Methods
  592. Looping in JavaScript ES5 and ES6: forEach and for...of
  593. Asynchronous Module Definition (AMD) in JavaScript
  594. Keeping jQuery Plugins Maintainable
  595. Getting Started with Callbacks in JavaScript
  596. Primitive vs. Reference Types in JavaScript
  597. Lifting State up in React
  598. Check If Your Site is Running on localhost
  599. When to Use a jQuery Plugin and When to Write Your Own
  600. Five Tips on How to Be a Good Web Developer
  601. Dynamically Create a Script Element with JavaScript
  602. Webpage, Web Page, or Website: What's the Difference?
  603. How to Read JavaScript Errors and Stack Traces
  604. Pass by Value vs. Reference in JavaScript
  605. Accessing a Random Element from an Array Using JavaScript
  606. Why Hiring a Local Web Developer Near You Matters
  607. Get the Number of Years Between Two Dates with PHP and JavaScript
  608. Using data-* Attributes and dataset in JavaScript
  609. Writing JavaScript That Still Works Without jQuery
  610. DOM Traversal: closest() in Vanilla JavaScript and jQuery
  611. Using classList in JavaScript: add(), remove(), toggle(), and contains()
  612. Progressive Enhancement with jQuery
  613. !important in CSS
  614. Frontend, Front‑End, or Front End: Which is Correct?
  615. Handling Click Events in JavaScript
  616. DOMContentLoaded vs. load in JavaScript
  617. Why querySelector Returns null in JavaScript
  618. How to Check an Element Exists with and Without jQuery
  619. A Simple Popup Window Using jQuery
  620. Setting CSS Blur Filter to Zero on a Retina Screen
  621. Button vs. Link: Native Semantics Before Custom Click Handlers
  622. Safe DOM Insertion and Sanitisation
  623. Why removeEventListener() Needs the Same Function Reference