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

Support Pages

  1. Terms & Imprint
  2. Privacy
  3. Sitemap

Social Accounts

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

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