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