Helping businesses turn their ideas into reality

We are a passionate team of developers, entrepreneurs, and technology enthusiasts based in England. We’ve partnered with dozens of startups to turn their ideas into successful, profitable businesses.

Crafting user experiences
Building scalable products

We're your all-in-one project solution

Experience the advantage of an all-inclusive project solution, where excellence, speed, and responsiveness converge to ensure the highest quality outcome.

  • Excellence

    We care about doing great work. Every project gets our full attention and highest quality.

  • Speed

    We work fast and stay focused — not just for speed’s sake, but to deliver real value on time, where it matters most.

  • Responsiveness

    You can count on us to communicate clearly and respond quickly, every step of the way.

Years of experience
15+
Projects completed
100s
The tools I use on my day-to-day

Our latest work

My goal is to create effective digital experiences that make people’s lives easier and better. I hope my work is a reflection of this.

Carwow

We were brought in to support Carwow in enhancing their online automotive marketplace, working alongside their tech lead to deliver new features, improve platform stability, and ensure long-term scalability.

View Case Study

Juniper Education

We were brought in by Juniper Education to support the development of a modern school management suite, contributing from early concept and architecture through to implementation alongside their internal team.

View Case Study
ruby-on-rails-development
golang

Babbel

We collaborated with Babbel, a leading language learning platform, to enhance their internal developer tooling and support strategic decision-making around their A/B testing infrastructure.

View Case Study
ruby-on-rails-development

Citizens Advice

The team developed a highly customizable and robust system for managing complex multipage forms, using Rails and a customized gem. The solution handles data flow across multiple pages efficiently, with a focus on usability and maintaining data accuracy.

View Case Study

Thoughts on design, business and indie-hacking

ruby-on-rails-development

Rails Testing Gotcha: When Concerns Work in Console But Not in Tests

If you've ever encountered a situation where your Rails model associations work perfectly in the console but mysteriously fail in your test suite, you're not alone. I recently ran into this exact issue and wanted to share the solution along with some insights about Rails' autoloading behavior. ## The Problem I was working with a Rails app that uses concerns to share common functionality across models. One of these concerns, `Addressable`, defines a polymorphic association: ```ruby module Addressable extend ActiveSupport::Concern included do has_many :addresses, as: :addressable, dependent: :destroy accepts_nested_attributes_for :addresses, allow_destroy: true, reject_if: :all_blank end def full_address address = addresses.last return "No address available" if address.nil? # ... rest of method end end ``` My `Estate` model includes this concern: ```ruby class Estate < ApplicationRecord include BelongsToOrganisation include Addressable include ActiveAccountingPeriod has_many :blocks has_many :properties, through: :blocks # ... other associations end ``` Everything worked beautifully in the Rails console. I could create estates, add addresses, and call all the methods from the concern without any issues. But then my FactoryBot tests started failing: ```ruby # spec/factories/estates.rb FactoryBot.define do factory :estate do sequence(:name) { |n| "Estate #{n}" } association :organisation after(:create) do |estate| estate.addresses << build(:address, addressable: estate) end end end ``` The error was confusing: ``` NoMethodError: undefined method 'addresses' for an instance of Estate ``` ## The Investigation What made this particularly puzzling was that the concern seemed to be loaded properly. When I added debug output to check the model's ancestors, I could see `Addressable` was included: ```ruby puts estate.class.ancestors # => [Estate, ActiveAccountingPeriod, Addressable, BelongsToOrganisation, ...] ``` But when I checked the available associations: ```ruby puts estate.class.reflect_on_all_associations.map(&:name) # => [:pay_customers, :charges, :subscriptions, :blocks, :properties, :expense_categories, :transactions, :accounting_periods] ``` Notice what's missing? The `addresses` association from the `Addressable` concern wasn't there. ## The Root Cause The issue stems from Rails' different autoloading behavior between development and test environments: **Development Environment:** - Rails uses lazy loading - When you reference `Estate` in the console, Rails loads the model and properly includes all concerns - The `included` block in concerns executes when the model is first loaded **Test Environment:** - Rails optimizes for fast test startup - Models and concerns aren't always loaded in the same order or manner - The `included` block in concerns might not execute before your tests run ## The Solution The fix is to explicitly require your concerns and models in your test setup. Add this to your `rails_helper.rb`: ```ruby # spec/rails_helper.rb Dir[Rails.root.join('app/models/concerns/*.rb')].each { |f| require f } Dir[Rails.root.join('app/models/*.rb')].each { |f| require f } ``` This ensures that all your models and their concerns are loaded before any tests run, making the test environment behave consistently with development. ## Alternative Approaches There are a few other ways to solve this issue: ### 1. Eager Load Everything ```ruby # In rails_helper.rb RSpec.configure do |config| config.before(:suite) do Rails.application.eager_load! end end ``` This loads your entire application, which is more comprehensive but potentially slower. ### 2. Adjust Test Environment Configuration ```ruby # config/environments/test.rb config.eager_load = true ``` Though this changes the fundamental behavior of your test environment. ### 3. Force Model Loading in Factories ```ruby # At the top of your factory file Estate # Forces the model to load FactoryBot.define do factory :estate do # ... factory definition end end ``` ## Why This Matters This issue highlights an important aspect of Rails development: the framework's autoloading behavior can vary between environments. While this usually works seamlessly, it can occasionally lead to subtle bugs that are hard to track down. The explicit `require` approach I used is targeted and fast—it only loads what you need rather than the entire application. It's also explicit about the dependency, making it clear that your tests rely on these files being loaded. ## Takeaways - **Environment differences matter**: Always test your code in the same environment where it will run in production - **Explicit is better than implicit**: When in doubt, explicitly require the files you need - **Debug systematically**: Use Rails' reflection methods to understand what's actually loaded - **Consider autoloading**: Be aware of how Rails loads your code in different environments Have you encountered similar issues with concerns and testing? I'd love to hear about your experiences and solutions in the comments below. This post originally started as a question to the Rails community on Discord and Twitter. Thanks to everyone who shared their insights and experiences!

minute read

How Small Businesses Can Build Their Own Website Using Wix, WordPress, or Shopify — No Agency Needed

Need a website for your business but don’t have the budget for a web agency? You’re not alone—and the good news is, **you can absolutely do it yourself**. Whether you run a café, offer services, or sell products, platforms like **Wix**, **WordPress**, and **Shopify** offer powerful tools that let you launch a clean, professional website in just a few hours—with no coding required. This article breaks down the best options for small business owners and walks you through how to get started. ## ⚙️ 1. Wix: Drag-and-Drop Simplicity Best for: Local businesses, service providers, portfolio sites, one-pagers ### Why choose Wix? - Super easy drag-and-drop editor - Hundreds of pre-designed templates - Built-in hosting and SSL - Great for “set it and forget it” websites ### What you can do: - Add sections like “About Us”, “Contact”, or “Book Online” - Set up a blog or image gallery - Connect a custom domain (e.g. yourname.com) Costs: Free to start; paid plans with custom domain from ~£10/month 🔗 [Start with Wix](https://www.wix.com/) ## 🌐 2. WordPress.com: A Bit More Flexible Best for: Small businesses who may grow into more complex needs (e.g. blogging, SEO, integrations) ### Why choose WordPress.com? - Open-source power with a user-friendly interface - Tons of themes and plugins - Built-in blogging tools - Room to grow (and upgrade later) ### What you can do: - Build multi-page websites with menus, forms, and maps - Add plugins for bookings, email newsletters, or reviews - Improve SEO with tools like Yoast Costs: Free basic site; business plans start at ~£7/month 🔗 [Get started with WordPress](https://wordpress.com/) ## 🛒 3. Shopify: The Best Choice for Online Stores Best for: Product-based businesses (ecommerce), shipping physical or digital goods ### Why choose Shopify? - Everything you need to launch an online store - Easy inventory, payments, and shipping setup - Mobile-optimised checkout - Built-in analytics ### What you can do: - Add unlimited products - Accept card payments and PayPal - Connect Instagram/Facebook shopping Costs: Starts from ~£25/month (14-day free trial available) 🔗 [Start your store with Shopify](https://www.shopify.com/) **🧠 Tips for Going DIY Successfully** - Start with a template — don’t build from scratch - Keep it simple — focus on key info: what you do, who you are, how to contact you - Write your content first — then choose a layout that fits - Test on mobile — most visitors will view your site on their phones - Buy your own domain — it looks more professional and builds trust ## 👋 Final Thought: You Can Do This If you can write a few paragraphs and upload a photo, you can absolutely create your own website. Wix, WordPress, and Shopify give you the tools—you just need to take the first step. And if you ever need help down the line (e.g. integrations, custom design, or upgrading your site), an experienced web development team (like us 👋) is always here when you’re ready.

5 minute read

🚀 Is Your Rails App Holding You Back? How to Modernize Without Rebuilding From Scratch

If you’ve built your product on Ruby on Rails, you’re in good company—Rails powers thousands of successful businesses. But over time, many teams find that what was once a fast-moving framework starts to feel… slow. Slow to scale. Slow to ship. Expensive to maintain. The good news? You probably don’t need to rewrite everything. In this article, we’ll cover: - Common signs your Rails app needs modernization - Why full rewrites are usually a bad idea - Practical ways to refactor, scale, and extend Rails apps - How an experienced consultancy (like us) can help ## 🚩 Signs Your Rails App Might Be Slowing You Down You don’t have to be running a decade-old monolith to feel friction. Here are some common pain points: • Slow deploys and long test suites • Tangled models and unmaintainable code • Performance bottlenecks in key workflows • Inability to integrate new tools or services • Developer onboarding taking too long • Hard to deliver new features without breaking things If you recognize a few of these, your app may not need a rebuild—it likely needs a thoughtful modernization plan. ## 🛑 Why “Let’s Just Rewrite It” Is Usually a Trap Full rewrites are tempting, but they’re also risky: - 🚧 You’ll need to rebuild years of features before gaining value - 🕒 Projects often run over budget and over deadline - 🔁 You risk repeating the same architectural mistakes Instead, focus on incremental, high-impact improvements. ## 🔧 How We Help Modernize Rails Apps As a consultancy, we specialize in working with businesses that already have a Rails product and need to take it further. Some of the things we commonly do: - Refactor performance-critical parts of the app - Modularize monoliths to reduce coupling - Improve test coverage and CI/CD pipelines - Audit and reduce technical debt - Integrate third-party tools (analytics, auth, payments, A/B testing) - Optimize database queries and indexing - Design and build new features the right way All without halting development or putting your roadmap on hold. ## 🧠 Real-World Example We’ve worked with teams like Carwow to enhance high-traffic Rails platforms, helping them ship new features and reduce technical debt without risking stability. With Babbel, we helped evaluate and improve internal tools—improving developer productivity and shaping product decisions. Modernizing doesn’t mean starting over. It means improving what already works. ## 📈 Ready to Scale Smarter? If your Rails app is slowing down your team—or you want a second set of eyes on performance, architecture, or maintainability—we’re here to help. Whether you need hands-on refactoring, architectural guidance, or a long-term partner, we bring deep Rails expertise and a pragmatic approach to every project.

4 minute read

Subscribe to our newsletter

Join 10,000+ entrepeneurs and get creative site breakdowns, design musings and tips directly into your inbox.