# FreeAgent

Tales of code crunching from the FreeAgent Engineering team

This is one page of public article previews, not the complete archive. Follow Next page to continue. Summaries are not the original full articles.

## The Fellowship of Code: My Quest at Ruby for Good in Ghent

DevFeed: [The Fellowship of Code: My Quest at Ruby for Good in Ghent](<https://devfeed.tech/articles/the-fellowship-of-code-my-quest-at-ruby-for-good-in-ghent-30007.md>)

Original publisher: [Read original article](<https://engineering.freeagent.com/2026/07/27/the-fellowship-of-code-my-quest-at-ruby-for-good-in-ghent/>)

Author: Fiona McLaren

Published: 2026-07-27T14:09:36Z

Content type: opinion

Language: en

Sources: [FreeAgent](<https://devfeed.tech/sources/freeagent.md>)

Topics: [Ruby](<https://devfeed.tech/topics/ruby.md>), [Rails](<https://devfeed.tech/topics/rails.md>), [Azure](<https://devfeed.tech/topics/azure.md>), [Content Management System](<https://devfeed.tech/topics/cms.md>), [Open Source](<https://devfeed.tech/topics/open-source.md>)

Tags: [azure](<https://devfeed.tech/tags/azure.md>), [cms](<https://devfeed.tech/tags/cms.md>), [coding](<https://devfeed.tech/tags/coding.md>), [conferences](<https://devfeed.tech/tags/conferences.md>), [culture](<https://devfeed.tech/tags/culture.md>), [development](<https://devfeed.tech/tags/development.md>), [open-source](<https://devfeed.tech/tags/open-source.md>), [open-source-code](<https://devfeed.tech/tags/open-source-code.md>), [rails](<https://devfeed.tech/tags/rails.md>), [ruby](<https://devfeed.tech/tags/ruby.md>), [ruby-on-rails](<https://devfeed.tech/tags/ruby-on-rails.md>)

### AI overview

A junior developer describes attending Ruby for Good in Ghent and contributing to SkillRX, a project providing medical education materials in low-resource areas. The team addressed inefficient Azure file-storage synchronization by planning Beacons that communicate directly with the health professionals' CMS.

### Source excerpt

It isn't very hard to pitch tech conferences. Offering a getaway from the usual desk work, a chance to pick up on new wisdoms from like-minded and genuinely inspiring folk, and room in the itinerary for sightseeing and socialising in the hip host city in between times? It's a no-brainer... well, for most. I had [...]

## Writing expressive RSpec tests for Ruby objects and Rails views

DevFeed: [Writing expressive RSpec tests for Ruby objects and Rails views](<https://devfeed.tech/articles/spec-tacular-ways-to-think-about-writing-expressive-rspec-30006.md>)

Original publisher: [Read original article](<https://engineering.freeagent.com/2026/07/07/spec-tacular-ways-to-think-about-writing-expressive-rspec/>)

Author: Simon Fish

Published: 2026-07-07T13:26:00Z

Content type: tutorial

Language: en

Sources: [FreeAgent](<https://devfeed.tech/sources/freeagent.md>)

Topics: [RSpec](<https://devfeed.tech/topics/rspec.md>), [Testing](<https://devfeed.tech/topics/testing.md>), [Ruby](<https://devfeed.tech/topics/ruby.md>), [Rails](<https://devfeed.tech/topics/rails.md>), [render](<https://devfeed.tech/topics/render.md>)

Tags: [rails](<https://devfeed.tech/tags/rails.md>), [render](<https://devfeed.tech/tags/render.md>), [rspec](<https://devfeed.tech/tags/rspec.md>), [ruby](<https://devfeed.tech/tags/ruby.md>), [ruby-on-rails](<https://devfeed.tech/tags/ruby-on-rails.md>), [testing](<https://devfeed.tech/tags/testing.md>), [tooling](<https://devfeed.tech/tags/tooling.md>)

### AI overview

The article explains how to use RSpec expressively to separate test phases, clarify expected behavior, and document interfaces. It also discusses why this approach needs adjustment when testing Rails views, which are rendered templates rather than ordinary Ruby objects.

### Source excerpt

Using RSpec's functionality expressively helps to draw focus to the right parts of a test, but it's not always easy to understand how best to use it.

## Web Day Out, March 2026

DevFeed: [Web Day Out, March 2026](<https://devfeed.tech/articles/web-day-out-march-2026-30005.md>)

Original publisher: [Read original article](<https://engineering.freeagent.com/2026/05/28/web-day-out-march-2026/>)

Author: Laurence Hughes

Published: 2026-05-28T14:37:56Z

Content type: article

Language: en

Sources: [FreeAgent](<https://devfeed.tech/sources/freeagent.md>)

Topics: [Web Development](<https://devfeed.tech/topics/web-development.md>), [Web platform](<https://devfeed.tech/topics/web-platform.md>), [Front end](<https://devfeed.tech/topics/frontend.md>), [CSS](<https://devfeed.tech/topics/css.md>), [HTML](<https://devfeed.tech/topics/html.md>), [JavaScript](<https://devfeed.tech/topics/javascript.md>), [Accessibility](<https://devfeed.tech/topics/accessibility.md>), [API](<https://devfeed.tech/topics/api.md>), [User Experience](<https://devfeed.tech/topics/user-experience.md>), [Design system](<https://devfeed.tech/topics/design-system.md>)

Tags: [accessibility](<https://devfeed.tech/tags/accessibility.md>), [api](<https://devfeed.tech/tags/api.md>), [css](<https://devfeed.tech/tags/css.md>), [design-system](<https://devfeed.tech/tags/design-system.md>), [development](<https://devfeed.tech/tags/development.md>), [front-end](<https://devfeed.tech/tags/front-end.md>), [front-end-development](<https://devfeed.tech/tags/front-end-development.md>), [guide](<https://devfeed.tech/tags/guide.md>), [html](<https://devfeed.tech/tags/html.md>), [javascript](<https://devfeed.tech/tags/javascript.md>), [performance](<https://devfeed.tech/tags/performance.md>), [web](<https://devfeed.tech/tags/web.md>), [web-development](<https://devfeed.tech/tags/web-development.md>)

### AI overview

A first-person recap of Web Day Out in March 2026, covering modern browser capabilities, front-end performance and reliability, and planning web feature adoption with Baseline. The author highlights browser-native features such as the Popover API, dialog, and CSS Anchor Positioning, along with progressive enhancement and fallbacks for browser support.

### Source excerpt

In March I attended Web Day Out - a one-day event all about what you can do in web browsers today. It was hosted by Clearleft at the Brighton Dome Studio. It was a brilliant day featuring a diverse line-up, friendly hosting and opportunities to mingle with likeminded souls. At this time when software engineers [...]

## Fine-tuning a DistilBERT classifier with numerical and text inputs

DevFeed: [Fine-tuning a DistilBERT classifier with numerical and text inputs](<https://devfeed.tech/articles/fine-tuning-a-distilbert-classifier-with-numerical-and-text-inputs-30004.md>)

Original publisher: [Read original article](<https://engineering.freeagent.com/2026/04/10/fine-tuning-a-distilbert-classifier-with-numerical-and-text-inputs/>)

Author: Paloma Jol

Published: 2026-04-10T10:04:33Z

Content type: tutorial

Language: en

Sources: [FreeAgent](<https://devfeed.tech/sources/freeagent.md>)

Topics: [Fine-tuning](<https://devfeed.tech/topics/fine-tuning.md>), [Transformer](<https://devfeed.tech/topics/transformer.md>), [foundation-models](<https://devfeed.tech/topics/foundation-models.md>), [Training AI Models](<https://devfeed.tech/topics/training-ai-models.md>), [datasets](<https://devfeed.tech/topics/datasets.md>), [Kaggle](<https://devfeed.tech/topics/kaggle.md>), [scikit-learn](<https://devfeed.tech/topics/scikit-learn.md>)

Tags: [ai](<https://devfeed.tech/tags/ai.md>), [aws](<https://devfeed.tech/tags/aws.md>), [data](<https://devfeed.tech/tags/data.md>), [data-ml](<https://devfeed.tech/tags/data-ml.md>), [data-science](<https://devfeed.tech/tags/data-science.md>), [dataset](<https://devfeed.tech/tags/dataset.md>), [encoding](<https://devfeed.tech/tags/encoding.md>), [fine-tuning](<https://devfeed.tech/tags/fine-tuning.md>), [hugging-face](<https://devfeed.tech/tags/hugging-face.md>), [kaggle](<https://devfeed.tech/tags/kaggle.md>), [llms](<https://devfeed.tech/tags/llms.md>), [machine-learning](<https://devfeed.tech/tags/machine-learning.md>), [model](<https://devfeed.tech/tags/model.md>), [models](<https://devfeed.tech/tags/models.md>), [nlp](<https://devfeed.tech/tags/nlp.md>), [performance](<https://devfeed.tech/tags/performance.md>), [text-classification](<https://devfeed.tech/tags/text-classification.md>), [training-data](<https://devfeed.tech/tags/training-data.md>), [validation](<https://devfeed.tech/tags/validation.md>)

### AI overview

This tutorial explains how to fine-tune a DistilBERT text classifier while incorporating a numerical feature into the same network. It uses the Kaggle wine reviews dataset, combining review descriptions with price and preprocessing the data for training, validation, and testing.

### Source excerpt

Text classification is often done through fine-tuning of a pretrained foundation model with domain-specific data. In FreeAgent we use transformer based models to automatically classify incoming bank transactions. Specifically we use a DistilBERT model that is fine-tuned on hundreds of millions of bank transactions with customer-labelled accounting categories. The model inputs are currently text-based, built from a combination of bank transaction descriptions and amounts. In this post we describe an approach to fine-tuning the DistilBERT model and training the classifier including the numerical amount feature as a single network.

## Structured outputs with Pydantic AI

DevFeed: [Structured outputs with Pydantic AI](<https://devfeed.tech/articles/structured-outputs-with-pydantic-ai-30003.md>)

Original publisher: [Read original article](<https://engineering.freeagent.com/2026/03/24/structured-outputs-with-pydantic-ai/>)

Author: Ed Berry

Published: 2026-03-24T10:34:08Z

Content type: tutorial

Language: en

Sources: [FreeAgent](<https://devfeed.tech/sources/freeagent.md>)

Topics: [Large Language Model](<https://devfeed.tech/topics/llm.md>), [JSON Schema](<https://devfeed.tech/topics/json-schema.md>), [Prompt Engineering](<https://devfeed.tech/topics/prompt-engineering.md>), [Pydantic](<https://devfeed.tech/topics/pydantic.md>), [Python](<https://devfeed.tech/topics/python.md>), [Structured-data](<https://devfeed.tech/topics/structured-data.md>)

Tags: [ai](<https://devfeed.tech/tags/ai.md>), [data](<https://devfeed.tech/tags/data.md>), [data-ml](<https://devfeed.tech/tags/data-ml.md>), [data-science](<https://devfeed.tech/tags/data-science.md>), [data-validation](<https://devfeed.tech/tags/data-validation.md>), [genai](<https://devfeed.tech/tags/genai.md>), [json-schema](<https://devfeed.tech/tags/json-schema.md>), [llms](<https://devfeed.tech/tags/llms.md>), [prompt-engineering](<https://devfeed.tech/tags/prompt-engineering.md>), [python](<https://devfeed.tech/tags/python.md>), [schema](<https://devfeed.tech/tags/schema.md>), [structured-output](<https://devfeed.tech/tags/structured-output.md>)

### AI overview

This article explains structured outputs for LLMs using Pydantic AI. It introduces the relationship between Python type hints, static analysis, Pydantic, and runtime data validation, while noting that Pydantic AI is model-agnostic.

### Source excerpt

One of the challenges of working with LLMs is getting them to respond with a consistent format, such as a given JSON schema. Anyone who has tried to solve this issue with prompt engineering knows how frustrating it can be. You add a 'MUST' here and an 'always return JSON' there, but still the output [...]

## Naming Things Is Hard

DevFeed: [Naming Things Is Hard](<https://devfeed.tech/articles/naming-things-is-hard-30002.md>)

Original publisher: [Read original article](<https://engineering.freeagent.com/2026/02/02/naming-things-is-hard/>)

Author: Simon Fish

Published: 2026-02-02T09:37:06Z

Content type: article

Language: en

Sources: [FreeAgent](<https://devfeed.tech/sources/freeagent.md>)

Topics: [Code](<https://devfeed.tech/topics/code.md>), [Rails](<https://devfeed.tech/topics/rails.md>), [Architecture & Design](<https://devfeed.tech/topics/architecture-design.md>), [Requirements](<https://devfeed.tech/topics/requirements.md>)

Tags: [architecture](<https://devfeed.tech/tags/architecture.md>), [code](<https://devfeed.tech/tags/code.md>), [debugging](<https://devfeed.tech/tags/debugging.md>), [development](<https://devfeed.tech/tags/development.md>), [general](<https://devfeed.tech/tags/general.md>), [rails](<https://devfeed.tech/tags/rails.md>), [requirements](<https://devfeed.tech/tags/requirements.md>), [ruby](<https://devfeed.tech/tags/ruby.md>), [ruby-on-rails](<https://devfeed.tech/tags/ruby-on-rails.md>), [software](<https://devfeed.tech/tags/software.md>), [software-engineer](<https://devfeed.tech/tags/software-engineer.md>), [software-engineering](<https://devfeed.tech/tags/software-engineering.md>)

### AI overview

The article examines why naming objects and methods in code is difficult, especially when domain models such as Rails Active Record models have broad responsibilities. It argues that precise names should reflect purpose and that clarifying requirements can reveal when complex concepts should be broken into smaller parts.

### Source excerpt

Choosing good names for objects and methods in code is one of the toughest things to do as a software engineer. It comes with the great and invisible reward of simplicity - second only to having less code in the first place, having code that's easy to reason with makes extending it and debugging it in [...]

## Two Engineers, One Mentoring Story: Why Both Sides Win

DevFeed: [Two Engineers, One Mentoring Story: Why Both Sides Win](<https://devfeed.tech/articles/two-engineers-one-mentoring-story-why-both-sides-win-30001.md>)

Original publisher: [Read original article](<https://engineering.freeagent.com/2026/01/27/two-engineers-one-mentoring-story-why-both-sides-win/>)

Author: Mila Kirova

Published: 2026-01-27T14:05:40Z

Content type: opinion

Language: en

Sources: [FreeAgent](<https://devfeed.tech/sources/freeagent.md>)

Topics: [Learning](<https://devfeed.tech/topics/learning.md>), [Rails](<https://devfeed.tech/topics/rails.md>), [Ruby](<https://devfeed.tech/topics/ruby.md>)

Tags: [blog](<https://devfeed.tech/tags/blog.md>), [career-progression](<https://devfeed.tech/tags/career-progression.md>), [careers](<https://devfeed.tech/tags/careers.md>), [culture](<https://devfeed.tech/tags/culture.md>), [development](<https://devfeed.tech/tags/development.md>), [experience](<https://devfeed.tech/tags/experience.md>), [insights](<https://devfeed.tech/tags/insights.md>), [mentoring](<https://devfeed.tech/tags/mentoring.md>), [rails](<https://devfeed.tech/tags/rails.md>), [ruby](<https://devfeed.tech/tags/ruby.md>)

### AI overview

FreeAgent engineers Carme and Mila discuss their three-year mentoring relationship, including how Carme strengthened her Ruby and Rails knowledge through guided study, practical exercises, and increasingly self-directed learning.

### Source excerpt

We are Carme and Mila, both software engineers at FreeAgent, where we collaborate as mentee and mentor. In this blog we interview each other about our mentoring relationship. We're hoping that our experience is universal and sharing our insights will be useful to anyone who is interested in mentoring. If you like what you read, [...]

## Persisting nested form attribute indexes through Turbo updates

DevFeed: [Persisting nested form attribute indexes through Turbo updates](<https://devfeed.tech/articles/persisting-nested-form-attribute-indexes-through-turbo-updates-30000.md>)

Original publisher: [Read original article](<https://engineering.freeagent.com/2026/01/08/persisting-nested-form-attribute-indexes-through-turbo-updates/>)

Author: georgebaker

Published: 2026-01-08T12:57:43Z

Content type: article

Language: en

Sources: [FreeAgent](<https://devfeed.tech/sources/freeagent.md>)

Topics: [Ruby on Rails](<https://devfeed.tech/topics/ruby-on-rails.md>), [Forms](<https://devfeed.tech/topics/forms.md>), [JavaScript](<https://devfeed.tech/topics/javascript.md>), [web applications](<https://devfeed.tech/topics/web-applications.md>)

Tags: [forms](<https://devfeed.tech/tags/forms.md>), [html](<https://devfeed.tech/tags/html.md>), [javascript](<https://devfeed.tech/tags/javascript.md>), [rails](<https://devfeed.tech/tags/rails.md>), [ruby](<https://devfeed.tech/tags/ruby.md>), [ruby-on-rails](<https://devfeed.tech/tags/ruby-on-rails.md>), [server-side-rendering](<https://devfeed.tech/tags/server-side-rendering.md>), [software-engineering](<https://devfeed.tech/tags/software-engineering.md>), [turbo](<https://devfeed.tech/tags/turbo.md>), [uncategorized](<https://devfeed.tech/tags/uncategorized.md>)

### AI overview

This article examines a problem with maintaining nested form attribute indexes when Turbo Streams update part of a Ruby on Rails form. It explains how indexes are generated during server rendering and in browser-side JavaScript, and why introducing server-side Turbo Stream rendering creates additional complexity.

### Source excerpt

Introduction We recently encountered an interesting problem when using Turbo Streams to update part of a complex nested form in FreeAgent's main Ruby on Rails web application. For those unfamiliar, nested forms allow a user to enter data relating to both a main parent object and its associated objects. This could be, for example, a [...]

## How we Use Dagster Automations in our Data Pipeline

DevFeed: [How we Use Dagster Automations in our Data Pipeline](<https://devfeed.tech/articles/how-we-use-dagster-automations-in-our-data-pipeline-29999.md>)

Original publisher: [Read original article](<https://engineering.freeagent.com/2025/12/10/how-we-use-dagster-automations-in-our-data-pipeline/>)

Author: Delphine Rabiller

Published: 2025-12-10T11:32:42Z

Content type: article

Language: en

Sources: [FreeAgent](<https://devfeed.tech/sources/freeagent.md>)

Topics: [Automation](<https://devfeed.tech/topics/automation.md>), [data](<https://devfeed.tech/topics/data.md>), [migration](<https://devfeed.tech/topics/migration.md>)

Tags: [analytics-engineering](<https://devfeed.tech/tags/analytics-engineering.md>), [automation](<https://devfeed.tech/tags/automation.md>), [dagster](<https://devfeed.tech/tags/dagster.md>), [data-ml](<https://devfeed.tech/tags/data-ml.md>), [data-pipeline](<https://devfeed.tech/tags/data-pipeline.md>), [data-pipelines](<https://devfeed.tech/tags/data-pipelines.md>), [declarative](<https://devfeed.tech/tags/declarative.md>), [migration](<https://devfeed.tech/tags/migration.md>), [pipeline](<https://devfeed.tech/tags/pipeline.md>), [scheduled](<https://devfeed.tech/tags/scheduled.md>), [sensors](<https://devfeed.tech/tags/sensors.md>), [tooling](<https://devfeed.tech/tags/tooling.md>), [triggers](<https://devfeed.tech/tags/triggers.md>)

### AI overview

This engineering post explains how FreeAgent is migrating data pipelines to Dagster and re-architecting its automation logic. It describes three approaches to automating asset materialization: schedules, declarative automation, and asset sensors, including when schedules are appropriate and how declarative automation uses asset dependencies and materialization status.

### Source excerpt

Introduction The heart of a reliable data platform are robust and automated data pipelines. As our team migrates our data pipelines to Dagster, re-architecting our automation logic is a crucial task. Dagster offers condition-based approaches to creating or updating a data asset (table or file), moving us toward a modern, asset-centric view of data. This [...]

## A refreshing take: using serverside rendering to reduce fragile DOM state

DevFeed: [A refreshing take: using serverside rendering to reduce fragile DOM state](<https://devfeed.tech/articles/a-refreshing-take-using-serverside-rendering-to-reduce-fragile-dom-state-29998.md>)

Original publisher: [Read original article](<https://engineering.freeagent.com/2025/10/17/a-refreshing-take-using-serverside-rendering-to-reduce-fragile-dom-state/>)

Author: Simon Fish

Published: 2025-10-17T08:33:59Z

Content type: article

Language: en

Sources: [FreeAgent](<https://devfeed.tech/sources/freeagent.md>)

Topics: [Hotwire](<https://devfeed.tech/topics/hotwire.md>), [Front end](<https://devfeed.tech/topics/frontend.md>), [Rails](<https://devfeed.tech/topics/rails.md>), [Stimulus](<https://devfeed.tech/topics/stimulus.md>), [WebSocket](<https://devfeed.tech/topics/websocket.md>), [Document Object Model (DOM)](<https://devfeed.tech/topics/dom.md>), [tbox](<https://devfeed.tech/topics/tbox.md>)

Tags: [browser](<https://devfeed.tech/tags/browser.md>), [development](<https://devfeed.tech/tags/development.md>), [frontend](<https://devfeed.tech/tags/frontend.md>), [hotwire](<https://devfeed.tech/tags/hotwire.md>), [html-elements](<https://devfeed.tech/tags/html-elements.md>), [js](<https://devfeed.tech/tags/js.md>), [rails](<https://devfeed.tech/tags/rails.md>), [ruby-on-rails](<https://devfeed.tech/tags/ruby-on-rails.md>), [stimulus](<https://devfeed.tech/tags/stimulus.md>), [streams](<https://devfeed.tech/tags/streams.md>), [websocket](<https://devfeed.tech/tags/websocket.md>)

### AI overview

This article examines FreeAgent's use of server-side rendering with Hotwire, Turbo, Stimulus, and Rails to reduce fragile DOM state. It explains how Turbo Streams and Action Cable can update browser pages asynchronously, contrasting these behaviors with the original DOM-manipulation actions.

### Source excerpt

Hotwire is central to how we drive the frontend at FreeAgent, and Action Cable allows us to send Turbo Streams as users browse the site, adding a layer of richness to the user experience.