<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Home on DevBrett</title><link>https://devbrett.com/</link><description>Recent content in Home on DevBrett</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://devbrett.com/index.xml" rel="self" type="application/rss+xml"/><item><title>Remote.com</title><link>https://devbrett.com/portfolio/2025-remote-dot-com/</link><pubDate>Sun, 01 Jun 2025 00:00:00 +1000</pubDate><guid>https://devbrett.com/portfolio/2025-remote-dot-com/</guid><description>&lt;p&gt;I joined the Remote.com AI and Knowledge Management team in 2023.
On this team I was technical lead for a number of projects:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Knowledge Management &amp;amp; AI Governance Data Pipeline&lt;/li&gt;
&lt;li&gt;AI Support Chatbot&lt;/li&gt;
&lt;li&gt;AI Support Email Auto-Responder&lt;/li&gt;
&lt;li&gt;AI Evaluation Framework&lt;/li&gt;
&lt;li&gt;Ask An Expert (backend)&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Global Entertainment Company</title><link>https://devbrett.com/portfolio/2023-entertainment-company/</link><pubDate>Sun, 01 Jan 2023 00:00:00 +1000</pubDate><guid>https://devbrett.com/portfolio/2023-entertainment-company/</guid><description>&lt;p&gt;I began consulting for a global entertainment company in 2021.
I lead the project to restructure and dismantle a Kafka-based event-sourcing system costing the business tens of thousands of pounds every quarter in infrastructure costs.&lt;/p&gt;</description></item><item><title>SplitFire!</title><link>https://devbrett.com/portfolio/2021-splitfire/</link><pubDate>Fri, 01 Jan 2021 00:00:00 +1000</pubDate><guid>https://devbrett.com/portfolio/2021-splitfire/</guid><description>&lt;p&gt;SplitFire is an independent game I released which allows 2 players to battle head-to-head on a single mobile device.&lt;/p&gt;</description></item><item><title>Wi5</title><link>https://devbrett.com/portfolio/2020-wi5/</link><pubDate>Mon, 01 Jun 2020 00:00:00 +1000</pubDate><guid>https://devbrett.com/portfolio/2020-wi5/</guid><description>&lt;p&gt;I joined Wi5 in 2018, and worked as Tech Lead working predominately on their architecture, AWS infrastructure, and building their Point-of-Sale integrations and payment processing systems.
Wi5 was a POS integrated Order &amp;amp; Pay system for the hospitality industry.
Wi5 has since pivotted to focus on payment processing and renamed to &amp;ldquo;Onvi&amp;rdquo;.&lt;/p&gt;</description></item><item><title>Immerse VR</title><link>https://devbrett.com/portfolio/2019-immerse-infrastructure/</link><pubDate>Tue, 01 Jan 2019 00:00:00 +1000</pubDate><guid>https://devbrett.com/portfolio/2019-immerse-infrastructure/</guid><description>&lt;p&gt;&lt;a href="https://immerse.io"&gt;Immerse&lt;/a&gt; is a &lt;abbr title="Virtual Reality"&gt;VR&lt;/abbr&gt; startup based in London, &lt;abbr title="United Kingdom"&gt;UK&lt;/abbr&gt;.
&lt;a href="https://immerse.io"&gt;Immerse&lt;/a&gt; provides an enterprise virtual reality
&lt;abbr title="Content Management System"&gt;CMS&lt;/abbr&gt;
and
&lt;a href="https://unity3d.com/"&gt;
Unity
&lt;abbr title="Software Development Kit"&gt;SDK&lt;/abbr&gt;
&lt;/a&gt;. I joined the company in 2017 as their lead &lt;a href="https://puppet.com/blog/what-a-devops-engineer"&gt;DevOps
Engineer&lt;/a&gt; to lead the
company&amp;rsquo;s effort in becoming a global &lt;abbr title="Virtual
Reality"&gt;VR&lt;/abbr&gt; platform.&lt;/p&gt;</description></item><item><title>Quiqup B2B Ordering UI</title><link>https://devbrett.com/portfolio/2018-quiqup-b2b-application/</link><pubDate>Mon, 01 Oct 2018 00:00:00 +1000</pubDate><guid>https://devbrett.com/portfolio/2018-quiqup-b2b-application/</guid><description>&lt;p&gt;&lt;a href="https://www.quiqup.com/"&gt;Quiqup&lt;/a&gt; is a realtime delivery platform.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://quiqup.com"&gt;Quiqup&lt;/a&gt; provides a &lt;a href="https://itunes.apple.com/gb/app/quiqup/id899237324"&gt;customer-facing iOS application&lt;/a&gt; which allows customers to order from any restaurant or store in London and get it delivered within minutes.&lt;/p&gt;</description></item><item><title>Quiqup Last Mile Delivery Platform</title><link>https://devbrett.com/portfolio/2017-quiqup-api/</link><pubDate>Sun, 01 Jan 2017 00:00:00 +1000</pubDate><guid>https://devbrett.com/portfolio/2017-quiqup-api/</guid><description>&lt;p&gt;&lt;a href="https://www.quiqup.com/"&gt;Quiqup&lt;/a&gt; is a realtime delivery platform.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://quiqup.com"&gt;Quiqup&lt;/a&gt; provides a &lt;a href="https://itunes.apple.com/gb/app/quiqup/id899237324"&gt;customer-facing iOS application&lt;/a&gt; which allows customers to order from any restaurant or store in London and get it delivered within minutes.&lt;/p&gt;
&lt;p&gt;In addition, &lt;a href="https://quiqup.com"&gt;Quiqup&lt;/a&gt; provides a &lt;abbr title="Business to Business"&gt;B2B&lt;/abbr&gt; &lt;a href="https://business.quiqup.com/signup/home"&gt;web application&lt;/a&gt; and a &lt;a href="https://en.wikipedia.org/wiki/Representational_state_transfer"&gt;RESTful&lt;/a&gt; &lt;abbr title="Application Programming Interface"&gt;API&lt;/abbr&gt; for integrating their delivery platform into any eCommerce system.&lt;/p&gt;
&lt;p&gt;I joined Quiqup in 2015 as a senior full-stack
developer as we were pivoting from a customer-facing application, to a more enterprise offering; as well as expanding into Dubai and other locations.&lt;/p&gt;</description></item><item><title>Grouper Mobile App &amp; Backend</title><link>https://devbrett.com/portfolio/2015-grouper-api/</link><pubDate>Thu, 01 Jan 2015 00:00:00 +1000</pubDate><guid>https://devbrett.com/portfolio/2015-grouper-api/</guid><description>&lt;p&gt;&lt;a href="https://angel.co/grouper"&gt;Grouper&lt;/a&gt; is an &amp;ldquo;Offline Social Club&amp;rdquo; who joined &lt;a href="http://www.ycombinator.com"&gt;YCombinator&lt;/a&gt; in 2012.&lt;/p&gt;
&lt;p&gt;In 2013 Grouper decided to pivot towards a mobile-first experience, and I was brought onboard contracting as a senior full-stack developer.&lt;/p&gt;
&lt;p&gt;I worked under the guidance of &lt;a href="https://uk.linkedin.com/in/tomblomfield"&gt;Tom Blomfield&lt;/a&gt;, &lt;a href="https://www.linkedin.com/in/nottombrown"&gt;Tom Brown&lt;/a&gt; and &lt;a href="https://linkedin.com/in/michaelewaxman"&gt;Michael Waxman&lt;/a&gt; to deliver the backend services that powered the platform.&lt;/p&gt;</description></item><item><title>Grouper Experiments</title><link>https://devbrett.com/portfolio/2014-grouper-experiments/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://devbrett.com/portfolio/2014-grouper-experiments/</guid><description>&lt;p&gt;&lt;a href="https://angel.co/grouper"&gt;Grouper&lt;/a&gt; is an &amp;ldquo;Offline Social Club&amp;rdquo; who joined &lt;a href="http://www.ycombinator.com"&gt;YCombinator&lt;/a&gt; in 2012.&lt;/p&gt;
&lt;p&gt;In 2013 Grouper decided to pivot towards a mobile-first experience, and I was brought onboard contracting as a senior full-stack developer.&lt;/p&gt;
&lt;p&gt;I worked under the guidance of &lt;a href="https://uk.linkedin.com/in/tomblomfield"&gt;Tom Blomfield&lt;/a&gt;, &lt;a href="https://www.linkedin.com/in/nottombrown"&gt;Tom Brown&lt;/a&gt; and &lt;a href="https://linkedin.com/in/michaelewaxman"&gt;Michael Waxman&lt;/a&gt; to deliver the backend services that powered the platform.&lt;/p&gt;
&lt;p&gt;As part of an ongoing initiative, we frequenlty built off-shoot products and experiments in order to test our assumptions about our market. Each iteration went from conception to market in less than 2 weeks.&lt;/p&gt;</description></item><item><title>Elixir Phoenix Development</title><link>https://devbrett.com/services/elixir-phoenix-development/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://devbrett.com/services/elixir-phoenix-development/</guid><description>&lt;p&gt;Elixir Phoenix is a powerful framework for building web applications. It is a modern, functional, and performant framework that is easy to learn and use.&lt;/p&gt;
&lt;p&gt;Elixir and Phoenix excel at highly-concurrent, real-time applications. They are a great fit for building web applications that require low-latency and high-availability.&lt;/p&gt;</description></item><item><title>Cloud Cost Optimization</title><link>https://devbrett.com/services/cloud-cost-optimization/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://devbrett.com/services/cloud-cost-optimization/</guid><description>&lt;p&gt;Cloud costs can be a major expense for businesses. I can help you reduce your cloud costs by up to 90% by identifying and optimizing areas of your infrastructure that are costing you money.&lt;/p&gt;</description></item><item><title>GitLab Orchestration</title><link>https://devbrett.com/services/gitlab-orchestration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://devbrett.com/services/gitlab-orchestration/</guid><description>&lt;p&gt;Gitlab has quickly become the de-facto standard for code building sophisticated CI/CD pipelines, due to it&amp;rsquo;s flexible nature and diverse feature set. However, managing Gitlab workflows across multiple projects and teams can be challenging. This is where I can help.&lt;/p&gt;</description></item><item><title>Kubernetes Administration</title><link>https://devbrett.com/services/kubernetes-administration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://devbrett.com/services/kubernetes-administration/</guid><description>&lt;p&gt;Kubernetes is the platform for buliding platforms. In the right hands, it is an incredibly powerful and versitile tool for building scalable, resilient, and efficient systems.&lt;/p&gt;
&lt;p&gt;Unfortunately, Kubernetes comes with a steep learning curve and requires a lot of time and effort to master. If you need a certified Kubernetes Administrator, get in touch.&lt;/p&gt;</description></item><item><title>Terraform Automation</title><link>https://devbrett.com/services/terraform-administration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://devbrett.com/services/terraform-administration/</guid><description>&lt;p&gt;Terraform is a powerful tool for managing infrastructure as code. It is a modern, functional, and performant framework that is easy to learn and use.&lt;/p&gt;</description></item><item><title>Flexible Config</title><link>https://devbrett.com/projects/flexible-config/</link><pubDate>Mon, 10 Oct 2016 00:00:00 +0000</pubDate><guid>https://devbrett.com/projects/flexible-config/</guid><description>&lt;p&gt;FlexibleConfig promotes good OOP design, and the separation of logic and
configuration in your Ruby classes.&lt;/p&gt;
&lt;p&gt;FlexibleConfig allows you to set class constants cleanly in ruby with the
heirarchical structure and clean workflow of YML config, without sacrificing
the flexibility and immediacy of ENVironment variables.&lt;/p&gt;</description></item><item><title>CoCoach</title><link>https://devbrett.com/portfolio/2013-cocoach/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://devbrett.com/portfolio/2013-cocoach/</guid><description>&lt;p&gt;Cocoach is a business coaching and business management application for real-time collaboration,
document creation and project management.&lt;/p&gt;</description></item><item><title>Developer Workflow Optimization</title><link>https://devbrett.com/services/developer-workflow-optimization/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://devbrett.com/services/developer-workflow-optimization/</guid><description>&lt;p&gt;Has your development velocity plateaued? Are you struggling to keep up with the demands of your project? I can help you optimize your developer workflow to improve productivity.&lt;/p&gt;</description></item><item><title>Choosing Phoenix LiveView</title><link>https://devbrett.com/2025/11/choosing-phoenix-liveview/</link><pubDate>Sun, 16 Nov 2025 00:00:00 +0000</pubDate><guid>https://devbrett.com/2025/11/choosing-phoenix-liveview/</guid><description>&lt;p&gt;If I need to get a project to market quickly, &lt;a href="https://phoenixframework.org/"&gt;Phoenix LiveView&lt;/a&gt; is my go-to framework.&lt;/p&gt;
&lt;p&gt;Elixir LiveView is incredible, and an alluring choice for software leaders looking to develop applications super fast. However, in recent experience, I&amp;rsquo;ve seen teams hit some pitfalls.&lt;/p&gt;
&lt;p&gt;The trick is to understand what Elixir LiveView excels at, and what it doesn&amp;rsquo;t.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: LiveView is perfect for internal tools and simple apps. Skip it for complex UIs, offline-first apps, or if your team doesn&amp;rsquo;t know Elixir well.&lt;/p&gt;</description></item><item><title>A Game of Thrones: LCG</title><link>https://devbrett.com/projects/agot-lcg/</link><pubDate>Tue, 23 Apr 2019 00:00:00 +0000</pubDate><guid>https://devbrett.com/projects/agot-lcg/</guid><description>&lt;p&gt;Analyses the Meta for A Game of Thrones: Living Card Game and returns the best sets to buy.&lt;/p&gt;
&lt;h3 id="method"&gt;Method&lt;/h3&gt;
&lt;p&gt;Uses data pulled from the following websites:&lt;/p&gt;
&lt;p&gt;Cards &amp;amp; Set Database: &lt;a href="https://thronesdb.com/api/"&gt;https://thronesdb.com/api/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Meta Statistics: &lt;a href="http://thestonedrum.com/#/overview"&gt;http://thestonedrum.com/#/overview&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="considerations"&gt;Considerations&lt;/h3&gt;
&lt;p&gt;Considers agenda cards ~3x more important than a normal card.
Considers plot cards ~2x more important than a normal card.
Considers popular neutrals and non-loyal cards slightly more important (as they can be used in more decks).
Considers older chapter packs worth less (they become obsolete after 4 years).&lt;/p&gt;</description></item><item><title>8 Manoeuvres to Make You the Perfect Git Citizen</title><link>https://devbrett.com/2019/03/git-citizen/</link><pubDate>Sat, 30 Mar 2019 00:00:00 +0000</pubDate><guid>https://devbrett.com/2019/03/git-citizen/</guid><description>&lt;p&gt;One of the greatest features of the GIT version control system is its ability to
rewrite local history before pushing it to a remote repository.&lt;/p&gt;</description></item><item><title>Why I Believe Rails is Still Relevant in 2019</title><link>https://devbrett.com/2019/03/why-i-believe-rails-is-still-relevant-in-2019/</link><pubDate>Wed, 06 Mar 2019 00:00:00 +0000</pubDate><guid>https://devbrett.com/2019/03/why-i-believe-rails-is-still-relevant-in-2019/</guid><description>&lt;p&gt;You might have read the infamous blog posts titled &amp;ldquo;Rails is Dead&amp;rdquo;, but
I have seen development teams flounder over and over again when they try and
&lt;a href="https://blog.codinghorror.com/dont-reinvent-the-wheel-unless-you-plan-on-learning-more-about-wheels/"&gt;reinvent the wheel&lt;/a&gt;
using
&lt;a href="https://nodejs.org/en/"&gt;NodeJS&lt;/a&gt;
on the backend.&lt;/p&gt;</description></item><item><title>21 Commandments for Greenfield Development</title><link>https://devbrett.com/2019/03/21-commandments-for-greenfield-development/</link><pubDate>Mon, 04 Mar 2019 00:00:00 +0000</pubDate><guid>https://devbrett.com/2019/03/21-commandments-for-greenfield-development/</guid><description>&lt;p&gt;The &amp;ldquo;greenfield&amp;rdquo; project is known by developers as a productivity Nirvana. It is a beautiful
place where there is no legacy, no bugs and endless possibilities. It is also littered with mines.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve recently seen a number of anti-patterns around the creation and early growth new projects,
and thought I&amp;rsquo;d summarize the anti-patterns I&amp;rsquo;d seen in the past as a guide for developers to
avoid these common pitfalls.&lt;/p&gt;</description></item><item><title>Continuous Integration Woes With Unity 3d</title><link>https://devbrett.com/2018/09/continuous-integration-woes-with-unity-3d/</link><pubDate>Sat, 08 Sep 2018 00:00:00 +0000</pubDate><guid>https://devbrett.com/2018/09/continuous-integration-woes-with-unity-3d/</guid><description>&lt;p&gt;I love the Unity framework. It&amp;rsquo;s my go-to framework for
games development, and a cornerstone of the technology my company
&lt;a href="https://immerse.io"&gt;Immerse&lt;/a&gt;
builds.&lt;/p&gt;</description></item><item><title>Cloud Native London</title><link>https://devbrett.com/2018/09/cloud-native-london/</link><pubDate>Tue, 04 Sep 2018 00:00:00 +0000</pubDate><guid>https://devbrett.com/2018/09/cloud-native-london/</guid><description>&lt;p&gt;Members of the
&lt;a href="https://www.meetup.com/Cloud-Native-London/"&gt;Cloud Native London Meetup&lt;/a&gt;
had the pleasure tonight to hear some amazing speakers.&lt;/p&gt;
&lt;p&gt;The first talk was called
&lt;strong&gt;Switching Horses Midstream: The Challenges of Migrating 150+ Microservices to Kubernetes&lt;/strong&gt; where
&lt;a href="https://www.linkedin.com/in/sarahjwells1/"&gt;Sarah Wells&lt;/a&gt;, the Technical
Director for the &lt;a href="https://www.ft.com/"&gt;Financial Times&lt;/a&gt; spoke about
their migration from disperate Docker containers to a microservice
architecture orchestrated with Kubernetes.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The FT’s content platform team put our first containers live in
mid-2015 and migrated the rest of our services over by April 2016. We
weren&amp;rsquo;t using Kubernetes but in late 2016, we decided we wanted to
benefit from the work other people were doing and switched over to
Kubernetes. We had 150+ microservices and needed to keep the existing
platform running in parallel.&lt;/p&gt;</description></item><item><title>String.Chars Protocol for Elixir PIDs</title><link>https://devbrett.com/2018/08/implement-string-protocol-elixir-pid/</link><pubDate>Wed, 29 Aug 2018 00:00:00 +0000</pubDate><guid>https://devbrett.com/2018/08/implement-string-protocol-elixir-pid/</guid><description>&lt;p&gt;I recently did a &lt;a href="https://devbrett.com/videos/2018-08-27-volluma/"&gt;live coding session&lt;/a&gt; on a 3d
audio server built in &lt;a href="http://elixir-lang.org/"&gt;Elixir&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This project involves quite a complicated
&lt;a href="https://gist.github.com/gkaemmer/12a536f7c859c576200e974235e2f923"&gt;supervision tree&lt;/a&gt;
where
&lt;a href="https://hexdocs.pm/elixir/GenServer.html#content"&gt;GenServers&lt;/a&gt;
are created and destroyed dynamically based on users joining a room and
moving around.&lt;/p&gt;
&lt;p&gt;As such this requires in-depth logging of
&lt;a href="https://hexdocs.pm/elixir/Process.html#summary"&gt;processes&lt;/a&gt;
in the application.&lt;/p&gt;</description></item><item><title>Live Coding a 3D Chat Server in Elixir</title><link>https://devbrett.com/videos/2018-08-27-volluma/</link><pubDate>Mon, 27 Aug 2018 00:00:00 +0000</pubDate><guid>https://devbrett.com/videos/2018-08-27-volluma/</guid><description>&lt;p&gt;In this live-coding session I work on an Elixir server built to support
huge numbers of users chatting in 3d.&lt;/p&gt;
&lt;p&gt;In these sessions we build a
&lt;a href="https://gist.github.com/gkaemmer/12a536f7c859c576200e974235e2f923"&gt;supervision tree&lt;/a&gt;
based on the following architecture:&lt;/p&gt;</description></item><item><title>Surgeons Who Won't Sew</title><link>https://devbrett.com/2018/08/surgeons-who-wont-sew/</link><pubDate>Mon, 06 Aug 2018 00:00:00 +0000</pubDate><guid>https://devbrett.com/2018/08/surgeons-who-wont-sew/</guid><description>&lt;blockquote&gt;
&lt;p&gt;Then she gets up and leaves. The patient is
still on dialysis, still bleeding in places, and their internal organs
are still on show for everyone else in the room.
The patient&amp;rsquo;s immediate future is secure, but eventually they are still
going to bleed to death.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;As a DevOps engineer, perhaps one of the best things you can do for an engineering team is to
empower them to write and utilize tests. This may be as simple as setting them up with a
hosted &lt;a href="https://circleci.com"&gt;CircleCI&lt;/a&gt; account, or might be as involved as setting up an
entire build pipeline on an internal CI system like &lt;a href="https://www.jetbrains.com/teamcity/"&gt;TeamCity&lt;/a&gt;,
&lt;a href="https://aws.amazon.com/codebuild/"&gt;AWS Codebuild&lt;/a&gt; or &lt;a href="https://jenkins.io/"&gt;Jenkins&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Deploying a Static S3 Website With Terraform</title><link>https://devbrett.com/videos/2018-07-22-static-website-terraform/</link><pubDate>Sun, 22 Jul 2018 00:00:00 +0000</pubDate><guid>https://devbrett.com/videos/2018-07-22-static-website-terraform/</guid><description>&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
 &lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/fLjoES6ra5E?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
 &lt;/div&gt;

&lt;hr&gt;
&lt;p&gt;In this video we will set up an automatic deployment CI/CD pipeline which deploys our
static website to S3.&lt;/p&gt;
&lt;p&gt;We will then create a Terraform project which will orchestrate resources in AWS, and create an S3
bucket, and IAM user to use in our pipeline.&lt;/p&gt;</description></item><item><title>Qubula Puzzle Game</title><link>https://devbrett.com/videos/2018-03-06-qubula/</link><pubDate>Tue, 06 Mar 2018 00:00:00 +0000</pubDate><guid>https://devbrett.com/videos/2018-03-06-qubula/</guid><description>&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
 &lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/rFMWWlNsbkM?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
 &lt;/div&gt;

&lt;hr&gt;
&lt;p&gt;Qubula is a puzzle game where puzzles are generated from a gene and a
random seed.&lt;/p&gt;
&lt;p&gt;An Elixir program generates the puzzles, and outputs level files in
JSON.&lt;/p&gt;
&lt;p&gt;The frontend of the game is built in ReactJS, with the frontend state
management written using Mobx-state-tree.&lt;/p&gt;</description></item><item><title>Ruby Module Introspection</title><link>https://devbrett.com/videos/2016-07-26-module-introspection/</link><pubDate>Tue, 26 Jul 2016 00:00:00 +0000</pubDate><guid>https://devbrett.com/videos/2016-07-26-module-introspection/</guid><description>&lt;p&gt;The AST Guidelines &lt;a href="https://rubygems.org/"&gt;ruby gem&lt;/a&gt; gem analyses Ruby module heirarchies to ensure
you do not violate bounded context design.&lt;/p&gt;
&lt;p&gt;A &lt;a href="https://martinfowler.com/bliki/BoundedContext.html"&gt;bounded context&lt;/a&gt;
is a concept of
&lt;a href="https://airbrake.io/blog/software-design/domain-driven-design"&gt;domain driven design&lt;/a&gt;
which dictates the design of complex software systems.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
 &lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/QYSXevUo1jg?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
 &lt;/div&gt;</description></item><item><title>Ruby Service Objects</title><link>https://devbrett.com/videos/2016-07-24-service-objects/</link><pubDate>Sun, 24 Jul 2016 00:00:00 +0000</pubDate><guid>https://devbrett.com/videos/2016-07-24-service-objects/</guid><description>&lt;p&gt;The &lt;a href="https://rubyonrails.org/"&gt;Ruby on Rails&lt;/a&gt; framework often gets a lot of
&lt;a href="https://uselessdevblog.wordpress.com/2016/04/06/why-rails-sucks/"&gt;hate&lt;/a&gt;
over the years.&lt;/p&gt;
&lt;p&gt;Rails makes it easy to
&lt;a href="https://reinteractive.com/posts/32-ruby-on-rails-3-2-blog-in-15-minutes-step-by-step"&gt;get up and running quickly&lt;/a&gt;.
Unfortunately, its beginner-friendly approach leaves you high and dry
months later when you have thousands of lines of code.&lt;/p&gt;
&lt;p&gt;Rails applications of this type are often referred to as
&lt;a href="https://developers.soundcloud.com/blog/building-products-at-soundcloud-part-1-dealing-with-the-monolith"&gt;Rails monoliths&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;One of the best ways to refactor and save an aging Rails monolith, is to
&lt;a href="https://www.engineyard.com/blog/keeping-your-rails-controllers-dry-with-services"&gt;extract service objects&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In these videos we create a &amp;ldquo;base service&amp;rdquo; which allows us to easily
build service objects with powerful error handling and chaining
capabilities.&lt;/p&gt;</description></item><item><title>Your Production Environment Isn't Always So Important</title><link>https://devbrett.com/2016/05/your-production-environment/</link><pubDate>Thu, 19 May 2016 00:00:00 +0000</pubDate><guid>https://devbrett.com/2016/05/your-production-environment/</guid><description>&lt;blockquote&gt;
&lt;p&gt;Until you have found product-market fit, your production environment is often just another test environment. It&amp;rsquo;s not testing your code, it&amp;rsquo;s testing your customers.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;At a previous startup company, we had a few hundred thousand users. Not all that many, but enough to get some interesting data and be in a position to use it to optimize the business.
We had previously built a recommendation engine in Elasticsearch which all our users were piped through, and we user it to provide daily recommendations based on our most recent data.
It wasn&amp;rsquo;t all that complex at first, and served us really well for a while.&lt;/p&gt;</description></item><item><title>API Buddy</title><link>https://devbrett.com/videos/2015-06-28-api-buddy/</link><pubDate>Sun, 28 Jun 2015 00:00:00 +0000</pubDate><guid>https://devbrett.com/videos/2015-06-28-api-buddy/</guid><description>&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
 &lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/LlZh-R8wCOI?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
 &lt;/div&gt;

&lt;hr&gt;
&lt;p&gt;API Buddy is a DSL for defining stubbed RESTful API endpoints, and
generating documentation and tests based on the schema.&lt;/p&gt;</description></item><item><title>RSpec Describe Method</title><link>https://devbrett.com/projects/rspec-describe-method/</link><pubDate>Sat, 21 Dec 2013 00:00:00 +0000</pubDate><guid>https://devbrett.com/projects/rspec-describe-method/</guid><description>&lt;p&gt;RSpec Describe Method is a ruby gem that provides a shorthand for
testing specific methods of classes.&lt;/p&gt;
&lt;p&gt;It supports both instance methods and class methods, with or without
arguments.&lt;/p&gt;</description></item><item><title>Active Hash</title><link>https://devbrett.com/projects/active-hash/</link><pubDate>Sun, 23 Jun 2013 00:00:00 +0000</pubDate><guid>https://devbrett.com/projects/active-hash/</guid><description>&lt;p&gt;ActiveHash is a simple base class that allows you to use a ruby hash as a readonly datasource for an ActiveRecord-like model.&lt;/p&gt;
&lt;p&gt;ActiveHash assumes that every hash has an :id key, which is what you would probably store in a database. This allows you to seamlessly upgrade from ActiveHash objects to full ActiveRecord objects without having to change any code in your app, or any foreign keys in your database.&lt;/p&gt;
&lt;p&gt;It also allows you to use #has_many and #belongs_to (via belongs_to_active_hash) in your AR objects.&lt;/p&gt;
&lt;p&gt;ActiveHash can also be useful to create simple test classes that run without a database - ideal for testing plugins or gems that rely on simple AR behavior, but don&amp;rsquo;t want to deal with databases or migrations for the spec suite.&lt;/p&gt;</description></item><item><title>RSpec Situations</title><link>https://devbrett.com/projects/rspec-situations/</link><pubDate>Thu, 06 Jun 2013 00:00:00 +0000</pubDate><guid>https://devbrett.com/projects/rspec-situations/</guid><description>&lt;p&gt;Adds a super simple method to describe RSpec situations in terms of smaller situation blocks.&lt;/p&gt;
&lt;p&gt;Define a situation with the &amp;lsquo;situation&amp;rsquo; method. Add a symbol key to identify the situation, and add an optional description if you like, and pass in a block creating the situation.&lt;/p&gt;</description></item><item><title/><link>https://devbrett.com/error/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://devbrett.com/error/</guid><description>&lt;p&gt;Sorry, this page is not found.&lt;/p&gt;</description></item><item><title>Contact</title><link>https://devbrett.com/contact/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://devbrett.com/contact/</guid><description>&lt;style&gt;
 .contact-form {
 display: flex;
 flex-direction: column;
 gap: 1rem;
 }
 .contact-form input[type="checkbox"] {
 margin-right: 0.5rem;
 display: inline-block;
 }
 .services-checkboxes {
 display: grid;
 grid-template-columns: auto 1fr;
 gap: 0.5rem 2rem;
 }
 .services-checkboxes label {
 display: flex;
 align-items: center;
 cursor: pointer;
 }
 .services-checkboxes input[type="checkbox"] {
 margin-right: 0.5rem;
 }
&lt;/style&gt;

&lt;!-- modify this form HTML as you wish and place wherever you want your form --&gt;
&lt;form
 action="https://formcarry.com/s/VduhueBRx6g"
 method="POST"
 enctype="multipart/form-data"
 class="contact-form"
&gt;
 &lt;label&gt;
 Your email
 &lt;input required type="email" name="email"&gt;
 &lt;/label&gt;

 &lt;label&gt;
 Your message
 &lt;textarea required name="message"&gt;&lt;/textarea&gt;
 &lt;/label&gt;

 &lt;label&gt;
 Which services are you most interested in?
 &lt;/label&gt;

 &lt;div class="services-checkboxes"&gt;
 &lt;label&gt;
 &lt;input type="checkbox" name="services" value="platform-engineering"&gt;
 Platform Engineering
 &lt;/label&gt;
 &lt;label&gt;
 &lt;input type="checkbox" name="services" value="devops"&gt;
 CI/CD &amp;amp; DevOps
 &lt;/label&gt;
 &lt;label&gt;
 &lt;input type="checkbox" name="services" value="kubernetes-orchestration"&gt;
 Kubernetes Orchestration
 &lt;/label&gt;
 &lt;label&gt;
 &lt;input type="checkbox" name="services" value="developer-workflows"&gt;
 Developer Workflows
 &lt;/label&gt;
 &lt;label&gt;
 &lt;input type="checkbox" name="services" value="cloud-infrastructure"&gt;
 Cloud Infrastructure
 &lt;/label&gt;
 &lt;label&gt;
 &lt;input type="checkbox" name="services" value="backend-software"&gt;
 Backend Software
 &lt;/label&gt;
 &lt;label&gt;
 &lt;input type="checkbox" name="services" value="frontend-software"&gt;
 Frontend Software
 &lt;/label&gt;
 &lt;label&gt;
 &lt;input type="checkbox" name="services" value="architecture"&gt;
 Systems Architecture Consulting
 &lt;/label&gt;
 &lt;label&gt;
 &lt;input type="checkbox" name="services" value="security"&gt;
 Security &amp;amp; Data Protection
 &lt;/label&gt;
 &lt;label&gt;
 &lt;input type="checkbox" name="services" value="other"&gt;
 Other
 &lt;/label&gt;
 &lt;/div&gt;

 &lt;button style="max-width:400px;" type="submit"&gt;Send&lt;/button&gt;
&lt;/form&gt;</description></item></channel></rss>