Grinding Gears
Tales of code crunching from the FreeAgent Engineering team
Ruby / RailsAI / MLMobile / iOS / AndroidFrontend / CSS / browsers
- Posts
- 223 from 24 Aug 2011 to 27 Jul 2026
- Posting
- monthly (9 in the last year)
- Kind
- company blog
- Feed
- https://engineering.freeagent.com/feed/
2026 8
- The Fellowship of Code: My Quest at Ruby for Good in Ghent
- Spec-tacular: ways to think about writing expressive RSpec
- Web Day Out, March 2026
- Fine-tuning a DistilBERT classifier with numerical and text inputs
- Structured outputs with Pydantic AI
- Naming Things Is Hard
- Two Engineers, One Mentoring Story: Why Both Sides Win
- Persisting nested form attribute indexes through Turbo updates
2025 19
- How we Use Dagster Automations in our Data Pipeline
- A refreshing take: using serverside rendering to reduce fragile DOM state
- Streamlining DBT Macro Testing: A Unit Test Approach with Pytest and Jinja
- Waiting for it with Capybara’s synchronize method
- Wiggling my way to a win
- Switching to Swift: The iOS Migration
- Building the bridge from education to real-world application
- Building the building blocks: My summer on FreeAgent’s Design System Team
- Uncharted Waters: a guide to exploring unfamiliar codebases
- Creating re-usable descriptions in dbt with Jinja docs
- The Engineering Behind Salesforce at FreeAgent
- View specs: rendering templates that are nested within a view component
- The Other Copilot: Coding with AI
- Decoding Data Orchestration Tools: Comparing Prefect, Dagster, Airflow, and Mage
- The 5 rules for migrating data pipelines successfully
- State of the browser 2025
- Mission jQuery Zero: How FreeAgent removed jQuery from our application
- Introducing Analytics Engineering
- A case of missing validation messages
2024 11
- The five stages of AI tool adoption: a developer’s journey
- From QA Engineer to Software Engineer: my journey
- Blasting away with Jetpack Compose: Android development at FreeAgent
- Hybrid working: finding balance in flexibility
- It takes a village to raise an intern
- Breaking the coding doom loop: lessons from my intern project
- Thinking on paper the software engineering way
- Combining text with numerical and categorical features for classification
- How the Ruby Interpreter Creates Methods on the Fly
- Restructuring our analytics team
- Using API Gateway, Lambda, SageMaker and DynamoDB to build a categorisation service in AWS
2023 18
- Combining machine learning with rules-based personalisation
- The architecture of FreeStyle, our design system
- Ease into Ruby with a Python background
- Factories: don’t stop production!
- How to survive imposter syndrome in your software engineering internship
- My internship project: from ideation to implementation
- Fireside chats about tech careers and automation paranoia
- Combining data from different sources with SageMaker pipelines
- A view of technical leadership from across the industry
- The web application brand refresh journey
- Five principles for writing an engineering progression framework
- Generative AI: Programmable Reasoning Machines of the Future
- Challenge Accepted: Our Weekly Looker Challenge
- Readable Dates in Rails
- Meet our women in engineering (Part 2)
- Meet our women in engineering
- The Data Science Internship Chronicles: A Starfleet-worthy Tale of Numeric Exploration
- Mindfulness with GitHub
2022 28
- How we hire in engineering
- Type checking in Ruby – Part 1
- My experience as an Analytics Intern
- Fixing my first bug – the experience
- A brief introduction to ‘the cloud’ and managing infrastructure with code
- What is a tech spec and why do I need one?
- The 4 SQL queries you need to debug Redshift performance
- So you’re going to be an intern
- CSS Day conference, June 2022
- Engineering lessons from my SaaS startup
- How to boost your confidence as a beginner software engineer
- An introduction to object-oriented programming
- What a data science degree doesn’t teach you
- Getting started with Jupyter Notebook
- A 12-step guide to AWS cost optimisation
- In full flow: moving from Jenkins to Actions – Part 1
- How we structure our data teams at FreeAgent
- 10 tips and tricks for a good intern job application
- The three skills you need to be a Data Analyst, and how to get them – Part 3
- The three skills you need to be a Data Analyst, and how to get them – Part 2
- The three skills you need to be a Data Analyst, and how to get them – Part 1
- The legendary data warehouse application
- Hosting Women Who Code Edinburgh
- Trading the lab coat for the computer – my journey to data science
- Training Hugging Face models in parallel with SageMaker
- Our data science hiring process
- Hiding Elements on the Web
- How I prepare for a tech job interview
2021 23
- Being an Introvert in a Meeting
- Using data to understand the effects of a four day working week
- Here’s to Thriday
- Fine-Tuning BERT for multiclass categorisation with Amazon SageMaker
- Software engineering: 5 things they don’t teach you at university
- The Value of an Internship at FreeAgent
- New wine, old skins – how FreeAgent blends existing tools and fresh approaches
- I Came, I Saw, I Categorised
- Lessons from my first software engineering internship
- Bank Transaction Entity Detection with AWS Comprehend
- Say hello to some of our women in engineering!
- Titlecase, underscore and laser guns
- Engineering Principles at FreeAgent
- Control freaks: how we built our own version control for Matillion
- A day in the life of a Web Analyst
- Shopping for data: How thinking about supermarkets might help you to manage your Looker implementation
- Timecop vs Rails TimeHelpers
- We’re Gonna Need a Bigger Boat
- Managing Python dependencies across multiple Data Science projects with Poetry
- Unpacking Amazon ECS
- The Mobile Apps and the Tester
- Six years of data science and analytics interns at FreeAgent
- Testing Child Processes in Ruby
2020 21
- Moving 100,000 customers from co-lo data centres to the cloud. With zero downtime.
- Answering bigger questions with BigQuery
- Empowering our practices: Take 2
- Breathing New Life into Dormant Code
- Can’t someone else do it? Automating Looker Housekeeping in Two Days
- Return of the intern
- How we publish user events for 100,000 customers
- What is a Business Intelligence Analyst?
- Transaction Taxonomy: Spending the Summer Studying SVMs
- Uprooting the Binary Tree
- The perils of a bad date
- Starting from Home: Remote Data Science Internship at FreeAgent
- Switching to Feature Testing with Headless Chrome
- How I made personal development work for me
- Replatforming the iOS mobile app
- How we built the FreeAgent Furlough Calculator in a week
- Working from Home: The desks of FreeAgent Engineering
- How to Measure Pointless Things?
- Tooled Up. A brief history of SaaS tools we’ve loved (and lost)
- An Evolution of Bank Feeds: from Yodlee to Open Banking
- On the road to real-time reporting with incremental data transfer
2019 23
- Serverless: From POC to Production
- Let’s talk tools
- Rails Girls London 2019: A fun weekend of coding
- Head In The Clouds
- How To Write A Good Bug Report
- To Error, or Not to Error, that is the Question
- How we make architectural decisions
- From Computer Science student to Software Engineering intern
- Down the Ruby Mine, Part III: Splat and splat again
- Down the Ruby Mine, Part II: Ruby’s seemingly illogical logical operators
- Delivering Practice Insights: My internship at FreeAgent
- Down the Ruby Mine, Part I: The code insertion trinity
- Deriving and verifying the uncertainty on conversion rate predictions
- Being a Data Science Intern at FreeAgent: The first month
- Settling in for summer: my data science internship
- Shaving yaks – problem solving in Dev Platform
- How to count what counts
- Why we love accessibility (and you should too!)
- Introducing the Band – James Bell
- Micro-batching Event Data Into Amazon Redshift
- Surviving your first winter as a remote worker
- Separating job applicants in multiple dimensions
- From Finder to Sublime Text
2018 14
- What We Value – Writing Code At FreeAgent
- Have your butler do the de-linting
- FreeAgent is now on Rails 5.2!
- Wondering where the weeks went: a reminiscent reflection of my FreeAgent internship
- Accurately ascertaining attitudes: designing unbiased survey questions
- Sourcing a suitable sample: understanding selection bias in survey data
- My Summer @ FreeAgent
- DevBots, squirrels and bouncing emails — just another intern’s summer
- Summer in the city: my data science internship at FreeAgent
- Dealing with dirty data: useful functions for data cleaning in R
- Clean house: clear mind. Clean data: clear findings.
- Castles, canals and coffee: my first week as a FreeAgent data science intern
- Rails migration aliases with fzf
- Remote Desks (Revisited!)
2017 8
- Ruby 2.5: How’s That Backtrace looking?
- Ruby 2.5: Not Blocking My Rescue
- Ruby 2.5: yield_self
- Ruby 2.5: The Christmas Present
- FreeAgent Testermonials: Getting rid of ‘QA’ and why what we call things matters
- External authentication scripts in OpenVPN the right way
- Running a high-availability SaaS infrastructure without breaking the bank
- FreeAgent Testermonials: Making user stories valuable with exit criteria
2016 10
- Schrodinger’s Ruby array
- Passphrase generation using awk
- Programming, Burgers, and Treasure: Summer with FreeAgent
- Rest in peace, @mathie
- Querying the past
- How we run 4 hours of tests in under 4 minutes
- A brief history of mobile
- Many timezones, one team – How do WE stand up?
- FreeAgent’s AV Adventure Continues – 12 Months On
- Many timezones, one team – how do you stand up?
2015 9
2014 4
2013 4
2012 13
- Summer Internships in Engineering – apply for the Class of 2013
- Revving the engine
- Switching wings mid-flight
- Hack Week 2.0 round-up
- Hack Week 2.0
- Bunking off
- Conference Pairs
- CoffeeScript with jQuery sprinkles
- ! ‘CoffeeScript: two sugars, no bitter aftertaste’
- Hack Week round up
- Engineering Summer Interns
- Hack Week update
- Hack Week [initial commit]