<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Nick Mitchinson</title>
    <link>https://www.nrmitchi.com/</link>
    <description>Recent content on Nick Mitchinson</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Sat, 08 Aug 2026 09:00:00 -0700</lastBuildDate>
    <atom:link href="https://www.nrmitchi.com/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Aligning Double-Sided Cards in Spite of Cricut Design Space</title>
      <link>https://www.nrmitchi.com/2026/08/aligning-double-sided-cards-in-spite-of-cricut-design-space/</link>
      <pubDate>Sat, 08 Aug 2026 09:00:00 -0700</pubDate>
      <guid>https://www.nrmitchi.com/2026/08/aligning-double-sided-cards-in-spite-of-cricut-design-space/</guid>
      <description>&lt;p&gt;Cricut Design Space is the required software to use when interacting with a Cricut device. It is also one of the most infuriating, piece of shit softwares I have ever had the necessity to use.&lt;/p&gt;&#xA;&lt;p&gt;Most of what makes it awful is a licensing decision rather than a technical one. A Cricut is a stepper-driven gantry with a tool head on it. That is a CNC machine. Nearly every other machine in that class — mills, routers, 3D printers, most desktop lasers — speaks some dialect of G-code, which means you can drive it from whatever software you prefer, or from a file you generated yourself. Cricut instead ships a proprietary protocol, an account requirement, and a cloud round-trip for a device sitting eighteen inches from your hands. There is no engineering reason a blade on a gantry needs to phone home before it moves three inches to the left.&lt;/p&gt;&#xA;&lt;p&gt;The lock-in is the whole point, and they have been fairly open about it. In March 2021 they announced that anyone without a subscription would be capped at twenty uploads of their own artwork per month, and &lt;a href=&#34;https://gizmodo.com/cricut-backs-down-will-now-give-existing-registered-us-1846489707&#34;&gt;only reversed it after several days of very loud backlash&lt;/a&gt;. That is the posture of a company that knows you cannot take your machine elsewhere. The software is as bad as it is because it has never had to be better.&lt;/p&gt;&#xA;&lt;p&gt;Anyway. Here is one specific way it is broken, and the workaround I ended up being forced to build.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Change Capacity</title>
      <link>https://www.nrmitchi.com/2026/07/change-capacity/</link>
      <pubDate>Mon, 27 Jul 2026 00:00:00 -0700</pubDate>
      <guid>https://www.nrmitchi.com/2026/07/change-capacity/</guid>
      <description>&lt;p&gt;For most of the time I&amp;rsquo;ve been writing software, the thing that decided what actually shipped was how fast the team could build it. Engineering capacity — the throughput of design, build, test, and release — was the ceiling. It&amp;rsquo;s why engineering leadership tended to end up as the de facto gatekeepers of the roadmap: the constraint on what reached customers &lt;em&gt;was&lt;/em&gt; the engineering org&amp;rsquo;s constraint. If you wanted more out the door, you argued for more engineers, or you argued about priorities inside a fixed budget of engineering-weeks.&lt;/p&gt;&#xA;&lt;p&gt;Agents are quietly removing that ceiling, and I don&amp;rsquo;t think we&amp;rsquo;ve fully reckoned with what replaces it.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Using Git Worktrees for Multi-Feature Development with AI Agents</title>
      <link>https://www.nrmitchi.com/2025/10/using-git-worktrees-for-multi-feature-development-with-ai-agents/</link>
      <pubDate>Mon, 13 Oct 2025 00:00:00 -0700</pubDate>
      <guid>https://www.nrmitchi.com/2025/10/using-git-worktrees-for-multi-feature-development-with-ai-agents/</guid>
      <description>If you&amp;rsquo;ve ever needed to work on multiple features simultaneously, you&amp;rsquo;ve likely encountered the friction of context switching between git branches. The traditional approach—stashing changes, switching branches, and checking out different code—disrupts your flow and can be error-prone. Git worktrees offer an elegant solution, and they become even more powerful when you&amp;rsquo;re working with local AI coding agents.&#xA;What Are Git Worktrees?# Git worktrees allow you to check out multiple branches of the same repository simultaneously in different directories.</description>
    </item>
    <item>
      <title>About | Nick Mitchinson</title>
      <link>https://www.nrmitchi.com/about/</link>
      <pubDate>Mon, 19 May 2025 09:00:00 -0800</pubDate>
      <guid>https://www.nrmitchi.com/about/</guid>
      <description>living in San Diego working on a number of new things&#xA;Will mostly talk about technical things, primary in the Kubernetes, engineering practices, and Reliability space, maybe with some opinions of mine thrown in the mix.&#xA;I do technical advising for early-stage startups, primarily in the B2B SaaS space, with a focus on backend systems/product architecture, reliability, observability, cloud operations, security, and preparing teams to have systems in place to facilitate scale.</description>
    </item>
    <item>
      <title>Consulting | Nick Mitchinson</title>
      <link>https://www.nrmitchi.com/consulting/</link>
      <pubDate>Mon, 19 May 2025 09:00:00 -0800</pubDate>
      <guid>https://www.nrmitchi.com/consulting/</guid>
      <description>I provide consulting services within software engineering and management, primarily focused on small to mid-sized engineering and product teams, with a focus on backend systems/product architecture, reliability, observability, cloud operations, security, and preparing teams to have systems in place to facilitate scale. If you&amp;rsquo;re looking for advice, you can book an initial conversation via my consultancy, Stratus Studios.&#xA;Consulting engagements begin with an initial flat-rate evaluation of the problem set, and professional recommendations for future work.</description>
    </item>
    <item>
      <title>Projects | Nick Mitchinson</title>
      <link>https://www.nrmitchi.com/projects/</link>
      <pubDate>Mon, 19 May 2025 09:00:00 -0800</pubDate>
      <guid>https://www.nrmitchi.com/projects/</guid>
      <description>Preview# Preview is a SaaS application for generating and managing dynamic and ephemeral Preview environments. Production-like environments are created to track every Pull Request, or manually for demos, manual testing, or training.&#xA;MergeDeps# MergeDeps is a Github application for managing Pull Request dependencies and avoiding accidental premature merges.&#xA;Redirector# Redirector is a hosted application for managing and servicing permanent or temporary redirects from one domain to another.&#xA;RecruitMe# RecruitMe is a hosted application to filter inbound recruitment emails to only serious opportunities.</description>
    </item>
    <item>
      <title>Streaming Build Logs</title>
      <link>https://www.nrmitchi.com/2022/07/streaming-build-logs/</link>
      <pubDate>Mon, 11 Jul 2022 00:00:00 -0700</pubDate>
      <guid>https://www.nrmitchi.com/2022/07/streaming-build-logs/</guid>
      <description>The PreviewHQ product is a hosted ephemeral Preview Environment service. It contains both an internal build and deployment service, and logs from these services need to be available to users.&#xA;The initial implementation of these log streams was based entirely on Kubernetes pod logs. On a request for logs, the application backend:&#xA;Queried for the name of the Kubernetes pod that ran that workflow step Created a kubernetes client to tail the logs of that pod Filter out any internal application logs Stream each log to the client While this approach was relatively simple to implement it had a number of core issues:</description>
    </item>
    <item>
      <title>Debugging Mystery 502 Errors in Kubernetes</title>
      <link>https://www.nrmitchi.com/2022/07/debugging-mystery-502-errors-in-kubernetes/</link>
      <pubDate>Mon, 04 Jul 2022 00:00:00 -0700</pubDate>
      <guid>https://www.nrmitchi.com/2022/07/debugging-mystery-502-errors-in-kubernetes/</guid>
      <description>For a while, under any real load, one of my services was returning 502 errors at an ~0.5% rate.&#xA;This is a service that is run in Kubernetes, with an Nginx Ingress Controller, and a Flask python application being run with uWSGI.&#xA;I was expecting these errors to be fairly easy to identify because I generate Request IDs in nginx (added as an X-Request-Id HTTP header to both the downstream request and upstream response), and add this ID to the request-context logger in the application.</description>
    </item>
    <item>
      <title>DigitalOcean Connection Pool Metrics</title>
      <link>https://www.nrmitchi.com/2022/06/digitalocean-connection-pool-metrics/</link>
      <pubDate>Sat, 25 Jun 2022 08:38:32 -0700</pubDate>
      <guid>https://www.nrmitchi.com/2022/06/digitalocean-connection-pool-metrics/</guid>
      <description>DigitalOcean is a player in the Infrastructure-as-a-Service (IaaS) market, competing with options such as Amazon Web Services (AWS), Google Cloud Platform (GCP), as well as other &amp;ldquo;low cost&amp;rdquo; providers such as Linode.&#xA;Amoung these services, DigitalOcean has their &amp;ldquo;Managed Database&amp;rdquo; offering. One of the downsides of this offering is the terribly low connection limits, particularly on Postgres. In order to address this, DigitalOcean offers managed Connection Pools as well.&#xA;Details of how a postgres connection pool works is outside the scope here, however as a brief summary the connection pool accepts a number of client connections, and then load balances upstream server connections between the clients.</description>
    </item>
    <item>
      <title>Software Engineer Leveling</title>
      <link>https://www.nrmitchi.com/2022/02/software-engineer-leveling/</link>
      <pubDate>Tue, 01 Feb 2022 18:00:00 -0600</pubDate>
      <guid>https://www.nrmitchi.com/2022/02/software-engineer-leveling/</guid>
      <description>Software leveling is a complicated debate. What is a &amp;ldquo;Junior&amp;rdquo; Engineer? At what point is someone &amp;ldquo;Senior&amp;rdquo;? Every company has a slightly different outlook on this, and this is just my opinion; it&amp;rsquo;s the mental model I use.&#xA;Junior Software Engineer# As a Junior Software Engineer, an individual would be primarily getting small-to-medium tasks delegated by their manager (or team lead). The expectation should be that this engineer will require assistance with these tasks as they become familiar with the environment, tools, and grow into their role.</description>
    </item>
    <item>
      <title>Update: Managing Kubeconfig Files</title>
      <link>https://www.nrmitchi.com/2021/06/update-managing-kubeconfig-files/</link>
      <pubDate>Sun, 06 Jun 2021 14:34:50 -0500</pubDate>
      <guid>https://www.nrmitchi.com/2021/06/update-managing-kubeconfig-files/</guid>
      <description>I while back I wrote about how I managed Kubeconfig files in my environment, in a easy-to-modify way.&#xA;I&amp;rsquo;ve changed my approach recently to make this easier to use; requiring a KUBECONFIG_MANUAL environment variable in order to avoid an explicitly-set KUBECONFIG being overwritten was error-prone and ergonomically poor.&#xA;I&amp;rsquo;ve recently decided to take a different approach, with the assumption that I will never explicitly set a KUBECONFIG environment variable using multiple files.</description>
    </item>
    <item>
      <title>Capability vs Task Based Scheduling</title>
      <link>https://www.nrmitchi.com/2021/05/capability-vs-task-based-scheduling/</link>
      <pubDate>Mon, 03 May 2021 17:40:01 -0500</pubDate>
      <guid>https://www.nrmitchi.com/2021/05/capability-vs-task-based-scheduling/</guid>
      <description>Container (or deployment) orchestration is the automation of taking your application, and placing it on infrastructure (typically a machine or VM) to execute as part of your larger application, while ensuring that the workload continues to run through a variety of potential issues. Scheduling, a subset of orchestration, determines which node (or nodes) in your infrastructure the application should run on. Controlling this scheduling is often necessary in order to ensure that scheduled applications are capable of running.</description>
    </item>
    <item>
      <title>Introducing Hookshot</title>
      <link>https://www.nrmitchi.com/2021/04/introducing-hookshot/</link>
      <pubDate>Tue, 27 Apr 2021 12:15:23 -0500</pubDate>
      <guid>https://www.nrmitchi.com/2021/04/introducing-hookshot/</guid>
      <description>As the third project in my 12 Startups in 12 Months year, I&amp;rsquo;m announcing Hookshot.&#xA;Hookshot is a managed platform for Webhook delivery. It is designed to handle the full lifecycle of a Webhook implementation, from allowing the end-user to create, manage, and inspect events, to ensuring reliable and secure delivery across a variety of potential issues.&#xA;Implementing a reliable webhook delivery system on your own feels like it should be trivial, however increases in complexity as you grow.</description>
    </item>
    <item>
      <title>Using Calendly to Get Kittens Adopted</title>
      <link>https://www.nrmitchi.com/2021/04/using-calendly-to-get-kittens-adopted/</link>
      <pubDate>Fri, 23 Apr 2021 16:12:13 -0500</pubDate>
      <guid>https://www.nrmitchi.com/2021/04/using-calendly-to-get-kittens-adopted/</guid>
      <description>This is the first post in my new &amp;ldquo;Everyday Automation&amp;rdquo; series, which explores using free tools and services to make every day life just a little bit easier.&#xA;As a bit of background, through 2020 I have been fostering kittens. While fun and entertaining, the process of getting them actually adopted during COVID can be time consuming. The program we foster through switched to virtual Meet and Greets, which means when a litter of kittens are ready to be adopted, we have a huge flurry of interest all at once.</description>
    </item>
    <item>
      <title>Introducing: Everyday Automation Series</title>
      <link>https://www.nrmitchi.com/2021/04/introducing-everyday-automation-series/</link>
      <pubDate>Mon, 19 Apr 2021 22:19:07 -0500</pubDate>
      <guid>https://www.nrmitchi.com/2021/04/introducing-everyday-automation-series/</guid>
      <description>Programming (or coding) is an extremely powerful skill that is becoming more important each year. There is a misconception though: that the benefits of these skills are always trapped behind learning a programming language, and writing your own software. Automation, one of the large benefits that programmers are able to utilize, can be accomplished in every day life using readily available tools. The key is to think about the things that you are doing on a regular basis, and finding an already built tool that you can use to solve this problem.</description>
    </item>
    <item>
      <title>Announcing Recruitme</title>
      <link>https://www.nrmitchi.com/2021/01/announcing-recruitme/</link>
      <pubDate>Sat, 02 Jan 2021 23:13:41 -0600</pubDate>
      <guid>https://www.nrmitchi.com/2021/01/announcing-recruitme/</guid>
      <description>As the second project in my 12 Startups in 12 Months year, I&amp;rsquo;m releasing (sort of) RecruitMe.&#xA;I&amp;rsquo;m a full time software engineer, and week-to-week I&amp;rsquo;ll receive up ~5 cold-outreach opportunities from recruiters for new opportunities. Unfortunately the majority of these are clearly not a good fit, are impersonal, and are low-effort outreach from low-quality recruiters. If the person reaching out had taken the time to review me, it would have been clear that I would not be interested.</description>
    </item>
    <item>
      <title>12 Startups in 12 Months</title>
      <link>https://www.nrmitchi.com/2020/12/12-startups-in-12-months/</link>
      <pubDate>Wed, 16 Dec 2020 22:56:14 -0600</pubDate>
      <guid>https://www.nrmitchi.com/2020/12/12-startups-in-12-months/</guid>
      <description>&amp;ldquo;12 Startups in 12 Months&amp;rdquo; has been a relatively popular goal for a little bit now. The idea is to give yourself 12 months to attempt to start 12 unique companies, in a &amp;ldquo;fail fast&amp;rdquo; approach, with the goal of finding something that sticks.&#xA;This is, in my opinion, a good goal. It splits evenly into a year (1 concept per month), and gives you a set amount of time for each attempt.</description>
    </item>
    <item>
      <title>Building Environment-Friendly React Apps</title>
      <link>https://www.nrmitchi.com/2020/12/building-environment-friendly-react-apps/</link>
      <pubDate>Mon, 14 Dec 2020 12:00:00 -0600</pubDate>
      <guid>https://www.nrmitchi.com/2020/12/building-environment-friendly-react-apps/</guid>
      <description>A core tenant of application promotion is that you are using the same version of your application between environments. If you have a version of your code running on staging, or in a Preview environment, and you want to promote that code to production, you simply deploy same image to production, with the production set of environment variables. With a populate-on-build system like Reacts&amp;rsquo;, you can not do this. The staging environment variables are baked in to the image, so it can not be deployed to production.</description>
    </item>
    <item>
      <title>MergeDeps Time-based Blocking</title>
      <link>https://www.nrmitchi.com/2020/12/mergedeps-time-based-blocking/</link>
      <pubDate>Sat, 12 Dec 2020 13:40:25 -0600</pubDate>
      <guid>https://www.nrmitchi.com/2020/12/mergedeps-time-based-blocking/</guid>
      <description>Last month I released MergeDeps in order to allow developers and teams to easily blocked Pull Request merges based on dependencies.&#xA;Today, I&amp;rsquo;m announcing that MergeDeps can now block merges based on time.&#xA;Often times you may not want a PR to be merged before a specific date or time. Especially with a Continuous Deployment pipeline in place, you do not want to merge code into your main branch before you want it deployed.</description>
    </item>
    <item>
      <title>All Your Code Are Belong to Me</title>
      <link>https://www.nrmitchi.com/2020/12/all-your-code-are-belong-to-me/</link>
      <pubDate>Thu, 10 Dec 2020 08:00:00 -0600</pubDate>
      <guid>https://www.nrmitchi.com/2020/12/all-your-code-are-belong-to-me/</guid>
      <description>Publishing of this post was postponed until the report vulnerability described here had been corrected. The core risk of software supply chain issues is still a widespread issue.&#xA;tldr; don’t depend on un-pinned external projects controlled by someone who doesn’t work at your company. Especially as a core part of your payment processing infrastructure.&#xA;Fun security-related thing that I thought I’d share, just so that people don’t forget the risk.</description>
    </item>
    <item>
      <title>Product vs Project Management</title>
      <link>https://www.nrmitchi.com/2020/12/product-vs-project-management/</link>
      <pubDate>Tue, 08 Dec 2020 11:34:39 -0600</pubDate>
      <guid>https://www.nrmitchi.com/2020/12/product-vs-project-management/</guid>
      <description>The last couple days I&amp;rsquo;ve been involved in a couple unique conversations about the difference between Product and Project Management. As someone who does not work in either of these roles, but often works with people in these roles, these are just my opinions and expectations as an engineering looking in. I don&amp;rsquo;t expect to be 100% right, and recognize that these roles will have slightly different meanings in different organizations.</description>
    </item>
    <item>
      <title>Mailchimp deleted my account with no warning or notification - 2020 Edition</title>
      <link>https://www.nrmitchi.com/2020/12/mailchimp-deleted-my-account-with-no-warning-or-notification-2020-edition/</link>
      <pubDate>Sat, 05 Dec 2020 17:57:08 -0600</pubDate>
      <guid>https://www.nrmitchi.com/2020/12/mailchimp-deleted-my-account-with-no-warning-or-notification-2020-edition/</guid>
      <description>I hate doing this. Apparently writing public blog posts and crossing my fingers (🤞🏼) is the best way to get a delete Mailchimp account recovered.&#xA;This is a follow on from this post from 2018. And from this post in 2019. It sucks that I have to be the one writing the 2020 edition.&#xA;tldr; Mailchimp deleted my account and all of my data without notification because they felt I wasn&amp;rsquo;t using their product enough.</description>
    </item>
    <item>
      <title>Lime, Bird, Lyft: What the F*ck</title>
      <link>https://www.nrmitchi.com/2020/11/lime-bird-lyft-what-the-fck/</link>
      <pubDate>Fri, 27 Nov 2020 18:58:37 -0600</pubDate>
      <guid>https://www.nrmitchi.com/2020/11/lime-bird-lyft-what-the-fck/</guid>
      <description>There were decades of campaigns to get kids to wear helmets while riding bikes. Decades. 2018. 2017. 2015. 2010. 2000. 1990.&#xA;Then Bird/Lime/Uber/Lyft/whoever all came in and were like ELECTRIC SCOOTERS FOR EVERYONE NO HELMET NEEDED and just threw all of that progress in the trash?&#xA;I was out for a walk through downtown Austin, and I passed no-less-than 8 couldn’t-be-older-than-13-year-old children flying around on scooters without helmets. 2 of them quite literally could not even see over the handle bars.</description>
    </item>
    <item>
      <title>Announcing MergeDeps</title>
      <link>https://www.nrmitchi.com/2020/11/announcing-mergedeps/</link>
      <pubDate>Fri, 20 Nov 2020 18:43:46 -0600</pubDate>
      <guid>https://www.nrmitchi.com/2020/11/announcing-mergedeps/</guid>
      <description>Today, I am announcing the initial launch of a new project, MergeDeps. In one line, MergeDeps allows a developer to specify a dependency for a Github Pull Request, and MergeDeps will ensure that the Pull Requests are merged in the correct order. These dependencies are specified directly in the Pull Request body, without any necessary changes to your code or workflow.&#xA;Whether you are a solo developer working on multiple branches, or a larger team needing to ensure dependencies across teams, MergeDeps is designed to easily and seamlessly address your coordination issues.</description>
    </item>
    <item>
      <title>One Simple Trick for Building Images Faster</title>
      <link>https://www.nrmitchi.com/2020/10/one-simple-trick-for-building-images-faster/</link>
      <pubDate>Sat, 17 Oct 2020 10:49:15 -0500</pubDate>
      <guid>https://www.nrmitchi.com/2020/10/one-simple-trick-for-building-images-faster/</guid>
      <description>First off, I apologize for the clickbait title. It hurt me just writing it.&#xA;A common step in a Continuous Integration/Continuous Delivery (CI/CD) pipeline is building container images. Fast image building is heavily dependent on being able to use a layer cache, which is many cases happens by default. The layer cache is what allows a docker build to skip a complex or long-running build step, by instead using the already-built layer.</description>
    </item>
    <item>
      <title>Handling Remote Salaries</title>
      <link>https://www.nrmitchi.com/2020/10/handling-remote-salaries/</link>
      <pubDate>Wed, 14 Oct 2020 18:24:46 -0500</pubDate>
      <guid>https://www.nrmitchi.com/2020/10/handling-remote-salaries/</guid>
      <description>Large tech organizations are announcing permanent &amp;ldquo;work-from-home&amp;rdquo; policies. Companies are announcing that they will be &amp;ldquo;remote first&amp;rdquo;. As employees chose to move out of high cost of living areas, companies are introducing compensation adjustments. This is a very complex topic.&#xA;Overall, I feel that location-adjusted compensation for location-independent work is, at best, fundamentally unfair to employees, and at worst, discriminatory.&#xA;Note that I am focusing on remote-within-the-United-States. When looking internationally, there are more variables at play, which makes it a more complex discussion.</description>
    </item>
    <item>
      <title>State of Continuous Product Review Tools</title>
      <link>https://www.nrmitchi.com/2020/10/state-of-continuous-product-review-tools/</link>
      <pubDate>Mon, 12 Oct 2020 12:37:47 -0500</pubDate>
      <guid>https://www.nrmitchi.com/2020/10/state-of-continuous-product-review-tools/</guid>
      <description>Disclaimer: I am currently building a product in this space at Preview. As such, I have biased opinions regarding the &amp;ldquo;correct&amp;rdquo; way of addressing Continuous Product Review needs. Preview is explicitly not included in this posting.&#xA;This article is meant to be a summary of existing tools in the space, and not a comparison between tools.&#xA;Over the last year, there as been an explosion of new tools and products in the Continuous Product Review space.</description>
    </item>
    <item>
      <title>Working Around Kubernetes Sidecar Shutdowns</title>
      <link>https://www.nrmitchi.com/2020/09/working-around-kubernetes-sidecar-shutdowns/</link>
      <pubDate>Fri, 04 Sep 2020 13:38:57 -0500</pubDate>
      <guid>https://www.nrmitchi.com/2020/09/working-around-kubernetes-sidecar-shutdowns/</guid>
      <description>Over 2 years ago I wrote a quick Kubernetes controller in order to ensuring that &amp;ldquo;sidecar&amp;rdquo; containers were shut down after the &amp;ldquo;main&amp;rdquo; container in a pod exited. The issue we were seeing was fairly straight forward: we had a container running in a pod to accomplish some application logic, as well as a number of &amp;ldquo;sidecar&amp;rdquo; containers to provide some functionality to the application. Examples of this are log forwarding, sql proxies, networking proxies, or in our case, metric collectors.</description>
    </item>
    <item>
      <title>Non-Terminating Namespace Removal</title>
      <link>https://www.nrmitchi.com/2020/09/non-terminating-namespace-removal/</link>
      <pubDate>Thu, 03 Sep 2020 00:00:00 -0500</pubDate>
      <guid>https://www.nrmitchi.com/2020/09/non-terminating-namespace-removal/</guid>
      <description>Namespaces are a core component of the Kubernetes landscape which are often used as as a base level of resource isolation. As a resource which contains multiple others, the shutdown behaviour associated with terminating namespaces is complex. In effect, namespaces can often get &amp;ldquo;stuck&amp;rdquo; in a Terminating state. I ran into this recently with a variety of namespaces in a Digital Ocean Kubernetes cluster.&#xA;Much advice on the internet will recommend editing the namespace to remove any finalizers on the object.</description>
    </item>
    <item>
      <title>Yes, Kubernetes &#34;Limits&#34; Are Important</title>
      <link>https://www.nrmitchi.com/2020/09/yes-kubernetes-limits-are-important/</link>
      <pubDate>Wed, 02 Sep 2020 19:08:00 -0500</pubDate>
      <guid>https://www.nrmitchi.com/2020/09/yes-kubernetes-limits-are-important/</guid>
      <description>Early today an engineer at Buffer put out a post about removing resource limits from a subset of their Kubernetes deployments in order to &amp;ldquo;make their services faster&amp;rdquo;. In summary, they were experiencing a kernel bug in which cpu throttling was being applied to containers which had not yet hit their CPU limits. They determined that this bug did not have an impact if no limits were set. This bug has since been fixed, and backported to many current linux versions, however they are still using a lack of limits to provide greater performance for some of their user-facing features.</description>
    </item>
    <item>
      <title>Apple&#39;s Market Dominance</title>
      <link>https://www.nrmitchi.com/2020/08/apples-market-dominance/</link>
      <pubDate>Thu, 13 Aug 2020 16:43:51 -0500</pubDate>
      <guid>https://www.nrmitchi.com/2020/08/apples-market-dominance/</guid>
      <description>Note that while Google took similar action, I will be focusing primarily on a discussion of Apple&amp;rsquo;s market dominance and anti-competitive behaviour, rather than Google&amp;rsquo;s. This is, honestly, because much of this post was written before Google took action.&#xA;There are many things at play here, and they are conflated. Early today Epic Games fired the first shots to kick of a war with Apple and Google over their dominance of their respective platforms.</description>
    </item>
    <item>
      <title>WeChat Executive Order is Not About National Security</title>
      <link>https://www.nrmitchi.com/2020/08/wechat-executive-order-is-not-about-national-security/</link>
      <pubDate>Mon, 10 Aug 2020 11:30:59 -0500</pubDate>
      <guid>https://www.nrmitchi.com/2020/08/wechat-executive-order-is-not-about-national-security/</guid>
      <description>On August 6th, 2020, Donald Trump signed an Executive Order prohibiting any transaction related to WeChat within the United States after September 15th, 2020. It was claimed to be in the name of &amp;ldquo;National Security&amp;rdquo;, however it feels more like a targetted attack to reduce day-to-day communication between the US and China.&#xA;This is a follow on from the Executive Order targeted at TikTok. There are similiarities here, but there are some key differences between the two.</description>
    </item>
    <item>
      <title>Going Political</title>
      <link>https://www.nrmitchi.com/2020/08/going-political/</link>
      <pubDate>Sun, 09 Aug 2020 12:02:21 -0500</pubDate>
      <guid>https://www.nrmitchi.com/2020/08/going-political/</guid>
      <description>When I first tried to start writing more, I purposely attempted to avoid political topics. Those days are over.&#xA;I figured that the political topics were totally disjoint from the technical side of things that I was trying to talk about, and my opinions on political topics were not necessary. I don&amp;rsquo;t believe that assumption holds any more. Technology is being more and more a political game as it&amp;rsquo;s influence on the world expands outwards.</description>
    </item>
    <item>
      <title>Avoiding Log Loss from Short-Lived Job Containers</title>
      <link>https://www.nrmitchi.com/2020/05/avoiding-log-loss-from-short-lived-job-containers/</link>
      <pubDate>Mon, 25 May 2020 11:44:03 -0500</pubDate>
      <guid>https://www.nrmitchi.com/2020/05/avoiding-log-loss-from-short-lived-job-containers/</guid>
      <description>In multiple situations and clusters I&amp;rsquo;ve encounted the problem of logs being lost from short-lived containers; ie, a container which is dynamically spun up to complete a single job, and then exiting. These containers will often only exist for a couple of seconds, which makes effectively collecting and forwarding their logs challenging.&#xA;There are two main log-collection methods in Kubernetes: using a log-forwarding sidecar (1), or a node-based collector agent watching log locations on the host machine (typically under /var/containers/logs) (2).</description>
    </item>
    <item>
      <title>The Facebook-Giphy Data Play</title>
      <link>https://www.nrmitchi.com/2020/05/the-facebook-giphy-data-play/</link>
      <pubDate>Wed, 20 May 2020 00:00:00 -0500</pubDate>
      <guid>https://www.nrmitchi.com/2020/05/the-facebook-giphy-data-play/</guid>
      <description>On May 15th, 2020, Facebook announced that it had reached an agreement to purchase Giphy, for $400M.&#xA;To many, this seems like a staggering amount of money for something that just serves GIFs. Facebook&amp;rsquo;s main business is in advertising, and GIFs are not inherently valuable for advertising purposes. There may be some possible value, such as Giphy selling &amp;ldquo;preferred placement&amp;rdquo; of specific GIF themes in searches, but that risk doesn&amp;rsquo;t seem to warrant the $400M price tag.</description>
    </item>
    <item>
      <title>COVID-19 Impact on Restaurant and Bar Industry</title>
      <link>https://www.nrmitchi.com/2020/05/covid-19-impact-on-restaurant-and-bar-industry/</link>
      <pubDate>Sun, 17 May 2020 20:02:29 -0500</pubDate>
      <guid>https://www.nrmitchi.com/2020/05/covid-19-impact-on-restaurant-and-bar-industry/</guid>
      <description>Note that I have no experience in the restaurant industry, and these are my thoughts as pure outsider. If you&amp;rsquo;re looking for an opinion with hard facts backing it up, you&amp;rsquo;re not going to find it here.&#xA;Over the past couple of days, I have been seeing a lot of discussion about how COVID-19 is the beginning of the end for the restaurant and bar industry. It is no secret that currently, even after &amp;ldquo;reopening&amp;rdquo;, government enforced social distancing is causing restaurants to struggle.</description>
    </item>
    <item>
      <title>Instacart and their Unsustainable Model</title>
      <link>https://www.nrmitchi.com/2019/11/instacart-and-their-unsustainable-model/</link>
      <pubDate>Sun, 10 Nov 2019 13:15:39 -0600</pubDate>
      <guid>https://www.nrmitchi.com/2019/11/instacart-and-their-unsustainable-model/</guid>
      <description>Personally, I believe that Instacart is attempting to operate on a fundamentally flawed business model, and is doomed to fail unless the underlying model is changed. It is being kept afloat by external money, but will never be economically viable in a socially responsible way. If they can’t make enough margins to actually pay their employees, it’s not a viable business.&#xA;Note that I have 0 background or knowledge in this specific sector.</description>
    </item>
    <item>
      <title>CircleCI Tooling Wishlist</title>
      <link>https://www.nrmitchi.com/2019/09/circleci-tooling-wishlist/</link>
      <pubDate>Sun, 15 Sep 2019 18:46:18 -0500</pubDate>
      <guid>https://www.nrmitchi.com/2019/09/circleci-tooling-wishlist/</guid>
      <description>CircleCI is a great CI/CI solution for companies who do not want to build an internal expertise on running these systems. For small-to-medium startups (up to ~50 engineers), these is almost always a small tradeoff. Despite some issues I have brought up in the past, I still believe that CircleCI can be effectively used as long as it is setup and administered appropriately for the security concerns of the company.</description>
    </item>
    <item>
      <title>Risking Private Key Exposure with CircleCI</title>
      <link>https://www.nrmitchi.com/2019/09/risking-private-key-exposure-with-circleci/</link>
      <pubDate>Tue, 10 Sep 2019 00:00:00 -0400</pubDate>
      <guid>https://www.nrmitchi.com/2019/09/risking-private-key-exposure-with-circleci/</guid>
      <description>Note that in order to avoid confusion with this separate issue, the publish date of this post was pushed back.&#xA;On July 29th, 2019, I discovered what I consider to be a major security risk with the use of the CircleCI CI/CD product that should be unacceptable to any corporation or open source project. This article details how commonly used CircleCI features interact with GitHub security mechanisms in a way that exposes GitHub secret keys to malicious users.</description>
    </item>
    <item>
      <title>Private Slack Channels</title>
      <link>https://www.nrmitchi.com/2019/04/private-slack-channels/</link>
      <pubDate>Mon, 01 Apr 2019 00:00:00 -0400</pubDate>
      <guid>https://www.nrmitchi.com/2019/04/private-slack-channels/</guid>
      <description>Many of us have been there. We interview at hot new companies, excited to join a small team building out a new product or platform. One of the major draws of joining a startup is being able to have a major contribution to the vision, and to have a level of transparency that you can&amp;rsquo;t get at a larger organization. You decide on one of these companies after hearing from everyone you spoke with at the company how open and transparent the organization.</description>
    </item>
    <item>
      <title>Rebase After a Squash</title>
      <link>https://www.nrmitchi.com/2019/02/rebase-after-a-squash/</link>
      <pubDate>Mon, 11 Feb 2019 20:30:14 -0600</pubDate>
      <guid>https://www.nrmitchi.com/2019/02/rebase-after-a-squash/</guid>
      <description>Depending on your development workflow, rebasing may be a common component of your workflow; ie:&#xA;You branch off master (we&amp;rsquo;ll call this branch A) You add a bunch of commits, for instance, developing a new feature You branch off again for a small fix (we&amp;rsquo;ll call this branch B) B1---B2 branch-b / A1---A2---A3 branch-a / M master Now, A gets merged into master. Typically (if keeping a clean git history), A was squashed into a single commit before merging.</description>
    </item>
    <item>
      <title>Managing kubeconfig Files</title>
      <link>https://www.nrmitchi.com/2019/01/managing-kubeconfig-files/</link>
      <pubDate>Sat, 12 Jan 2019 00:00:00 -0600</pubDate>
      <guid>https://www.nrmitchi.com/2019/01/managing-kubeconfig-files/</guid>
      <description>Note: There is an updated version of this functionality described in a later post.&#xA;If you deal with Kubernetes, you are most likely familar with the kubeconfig file, typically located at ~/.kube/config. This file typically contains the clusters, users, and contexts (combinations of clusters and users) that you use in order to connect to our Kubernetes environments (typically with kubectl).&#xA;As well as using the default file at ~/.kube/config, there is also the option to specify a kubeconfig file using either the --kubeconfig argument, or the KUBECONFIG environment variable.</description>
    </item>
    <item>
      <title>Linting Your Helm Charts</title>
      <link>https://www.nrmitchi.com/2018/12/linting-your-helm-charts/</link>
      <pubDate>Thu, 20 Dec 2018 23:11:30 -0500</pubDate>
      <guid>https://www.nrmitchi.com/2018/12/linting-your-helm-charts/</guid>
      <description>In any engineering environment, linting is an important tool to help maintain style, and prevent simple mistakes. The same is true of your Helm charts. Chart linting is an easy tool that you can add to your pipeline to ensure your deployments are valid and versioned correctly.&#xA;Getting linting set up for your custom Helm charts is actually extremely straight-forward thanks to the Helm chart-testing project, which can be found here: https://github.</description>
    </item>
    <item>
      <title>Identifying Kubernetes Evictions</title>
      <link>https://www.nrmitchi.com/2018/11/identifying-kubernetes-evictions/</link>
      <pubDate>Wed, 07 Nov 2018 13:28:30 -0500</pubDate>
      <guid>https://www.nrmitchi.com/2018/11/identifying-kubernetes-evictions/</guid>
      <description>For personal projects, I run a single node &amp;ldquo;cluster&amp;rdquo; on an OVH node, with kubeadm. Over the last couple months, I&amp;rsquo;ve been having repeated issues with pod evictions, which are typically not an issue, except when affecting critical pods, such as the kube-apiserver and kube-scheduler. Despite these being marked as critical pods, they were still being evicted due to disk pressure. After fighting with pod evictions for a while, it became clear that I wasn&amp;rsquo;t actually solving the underlying problem; this machine has 2TB of disk space… disk pressure evictions should not be occurring.</description>
    </item>
    <item>
      <title>Using PGAnalyze</title>
      <link>https://www.nrmitchi.com/2018/05/using-pganalyze/</link>
      <pubDate>Wed, 23 May 2018 00:28:24 -0500</pubDate>
      <guid>https://www.nrmitchi.com/2018/05/using-pganalyze/</guid>
      <description>We recently set up PGAnalyze as a way of doing a quick database health check, and managed to get a couple quick wins out of it.&#xA;By looking at the Query Performance section, we were able to quickly identify a bad outlying query which was accounting for ~7.5% of our total DB activity. Furthermore, we were able to see that this query was loading ~7.65 GB of data per call, with the majority of the data needing to be loaded from disk (rather than buffer cache), and was taking almost a full minute on each execution.</description>
    </item>
    <item>
      <title>Swapping ALB Request IDs for Nginx</title>
      <link>https://www.nrmitchi.com/2018/04/swapping-alb-request-ids-for-nginx/</link>
      <pubDate>Wed, 04 Apr 2018 00:00:00 -0600</pubDate>
      <guid>https://www.nrmitchi.com/2018/04/swapping-alb-request-ids-for-nginx/</guid>
      <description>I&amp;rsquo;ve recently been making a switch from using Amazon&amp;rsquo;s Application Load Balancers (ALBs), to using their new Network Load Balancers (NLBs). There are many reasons for this switch (that are not the subject of this post), but there was one glaring short fall: We heavily rely on request log data centered around the ALB provided X-Amzn-Trace-Id Request ID value.&#xA;When switching to the NLB (which is L4, vs the ALBs&amp;rsquo; L7), this HTTP header is not added for us.</description>
    </item>
    <item>
      <title>Recovering a Kubeadm Cluster</title>
      <link>https://www.nrmitchi.com/2018/03/recovering-a-kubeadm-cluster/</link>
      <pubDate>Fri, 23 Mar 2018 00:00:00 -0600</pubDate>
      <guid>https://www.nrmitchi.com/2018/03/recovering-a-kubeadm-cluster/</guid>
      <description>Recently a small cluster I maintain became unresponsive due to a failure of the kube-apiserver. Kubeadm clusters are currently limited to a single master, this meant that any interaction with the cluster was impossible.&#xA;Due to interaction through the API being (obviously) impossible, troubleshooting and recovery required digging a bit deeper. By ssh -ing to the physical node, I was able to at least determine that the kube-apiserver was attempting to start, and then being killed because it was not responding to a livenessProbe in time.</description>
    </item>
    <item>
      <title>Why Traffic Manipulation Capabilities Matter</title>
      <link>https://www.nrmitchi.com/2017/11/why-traffic-manipulation-capabilities-matter/</link>
      <pubDate>Tue, 14 Nov 2017 20:34:54 -0600</pubDate>
      <guid>https://www.nrmitchi.com/2017/11/why-traffic-manipulation-capabilities-matter/</guid>
      <description>Multi-tenancy systems are very common for a simple reason: it both saves costs, and reduces complexity. Unfortunately, the biggest downside is that in certain situations, a small group of clients can negatively impact the rest of the system.&#xA;At Cratejoy, we run with a multi-tenant set up which is part SaaS, part Marketplace, and part Website Hosting. These 3 sections of our business have drastically different traffic patterns. Even within out Website Hosting, our individual merchants see extremely different traffic patterns.</description>
    </item>
    <item>
      <title>Importance of Index Monitoring</title>
      <link>https://www.nrmitchi.com/2017/11/importance-of-index-monitoring/</link>
      <pubDate>Mon, 13 Nov 2017 19:13:34 -0600</pubDate>
      <guid>https://www.nrmitchi.com/2017/11/importance-of-index-monitoring/</guid>
      <description>&lt;p&gt;Monitoring is a a large, and complex topic, so rightfully is a a lot written about it. One topic that is not covered often however, is effectively monitoring your database indexes. This particular aspect of monitoring is something that had not previously occurred to me as something important, however one incident was rather eye-opening.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Easy &#34;Maintenance Mode&#34; in Kubernetes</title>
      <link>https://www.nrmitchi.com/2017/11/easy-maintenance-mode-in-kubernetes/</link>
      <pubDate>Sat, 11 Nov 2017 22:53:38 -0600</pubDate>
      <guid>https://www.nrmitchi.com/2017/11/easy-maintenance-mode-in-kubernetes/</guid>
      <description>&lt;p&gt;Despite our best efforts, systems sometimes require downtime for a variety of reasons. Different systems that I&amp;rsquo;ve seen have built this capability into different areas of their stacks, mostly in the application itself, or into the web server (such as nginx). Many of these solution still require the application to be running in order to serve an appropriate maintence page. At Cratejoy, this requirement proved problematic.&lt;/p&gt;</description>
    </item>
    <item>
      <title>&#34;PastaPassport&#34;: Why You Didn&#39;t Win (and why a bot may not have either)</title>
      <link>https://www.nrmitchi.com/2017/09/pastapassport-why-you-didnt-win-and-why-a-bot-may-not-have-either/</link>
      <pubDate>Thu, 14 Sep 2017 20:02:56 -0500</pubDate>
      <guid>https://www.nrmitchi.com/2017/09/pastapassport-why-you-didnt-win-and-why-a-bot-may-not-have-either/</guid>
      <description>Earlier today, Olive Garden ran their annual PastaPass promotion. I&amp;rsquo;m going to assume you know what this is (or else why else are you reading this?), but just incase you don&amp;rsquo;t, during this promotion, the Olive Garden restaurant chain sells (this year) 22000 &amp;lsquo;PastaPasses&amp;rsquo;, each of which entitle the holder to unlimited soup, breadsticks, and pasta during their &amp;lsquo;Never Ending Pasta Bowl&amp;rsquo; season. This year, that time period is 8 weeks long, so if you plan on eating alot of pasta (or live near an Olive Garden and want to save some money on food), it is clear why getting one of these $100 &amp;lsquo;passes&amp;rsquo; is a good investment.</description>
    </item>
    <item>
      <title>Correcting Kops Etcd</title>
      <link>https://www.nrmitchi.com/2017/08/correcting-kops-etcd/</link>
      <pubDate>Wed, 16 Aug 2017 23:38:46 -0500</pubDate>
      <guid>https://www.nrmitchi.com/2017/08/correcting-kops-etcd/</guid>
      <description>&lt;p&gt;Recently, I attempted to downsize a staging cluster from a 3 master HA setup, to a single master. The HA setup was unnecessary, and this was done primarily as a cost saving measure. Unfortunately, this &amp;lsquo;quick cost cut&amp;rsquo; ended up taking multiple hours to clean up.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Separating a Monolith while Keeping Commit History</title>
      <link>https://www.nrmitchi.com/2017/05/separating-a-monolith-while-keeping-commit-history/</link>
      <pubDate>Wed, 31 May 2017 20:55:12 -0500</pubDate>
      <guid>https://www.nrmitchi.com/2017/05/separating-a-monolith-while-keeping-commit-history/</guid>
      <description>As small companies grow, and their engineering teams expand, they will often wish to begin splitting a large, monolithic repository into smaller service repositories. There are two naive approaches to this, neither of which we wanted to do:&#xA;1. Copy into a new repo# This would simply involve copying the files related to the service into a new repository, and then removing them from the original. This solution will totally work, however you will lose all history in the migration.</description>
    </item>
    <item>
      <title>Killing a Service with Healthchecks</title>
      <link>https://www.nrmitchi.com/2017/05/killing-a-service-with-healthchecks/</link>
      <pubDate>Fri, 05 May 2017 14:43:41 -0500</pubDate>
      <guid>https://www.nrmitchi.com/2017/05/killing-a-service-with-healthchecks/</guid>
      <description>&lt;p&gt;If you&amp;rsquo;ve been reading anything I&amp;rsquo;ve written lately, you&amp;rsquo;ll be aware that we at &lt;a href=&#34;https://www.cratejoy.com/&#34;&gt;Cratejoy&lt;/a&gt; have recently migrated out infrastructure into a new &lt;a href=&#34;https://kubernetes.io/&#34;&gt;Kubernetes&lt;/a&gt; deployment. Throughout this process, we hit a couple rather embarassing snafus, and this was just one of them.&lt;/p&gt;&#xA;&lt;p&gt;Long story short, we accidently DoS&amp;rsquo;d some of our own services, and attempting to solve the problem by scaling horizontally only made the problem worse.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Migrating to a VPC</title>
      <link>https://www.nrmitchi.com/2017/03/migrating-to-a-vpc/</link>
      <pubDate>Tue, 28 Mar 2017 19:47:25 -0500</pubDate>
      <guid>https://www.nrmitchi.com/2017/03/migrating-to-a-vpc/</guid>
      <description>&lt;p&gt;There are many advantages to running your infrastructure inside a VPC on AWS, as opposed to running in general EC2-Classic. While EC2-Classic is basically one giant, shared VPC, isolating your resources into your own VPC gives you greater control over internal communication, networking, and security.&lt;/p&gt;&#xA;&lt;p&gt;We recently made a full transition from EC2-Classic into a set of VPC&amp;rsquo;s.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Integrating PayPal - Some Things To Remember</title>
      <link>https://www.nrmitchi.com/2017/03/integrating-paypal-some-things-to-remember/</link>
      <pubDate>Wed, 01 Mar 2017 00:00:00 -0500</pubDate>
      <guid>https://www.nrmitchi.com/2017/03/integrating-paypal-some-things-to-remember/</guid>
      <description>Around August, I began implementing a full PayPal integration for our merchants, allowing any of them to beign accepting PayPal payments, in the exact same way as any of our other payment providers. This project actually went rather smoothly, and much better than my initial expections. Our requirements prevented us from using their newer REST API, however after spending a day getting familiar with their SOAP API, and writing a small wrapper lib for the functionality we needed, it was no longer a concern.</description>
    </item>
    <item>
      <title>Assumption Verification with &#34;Impossible&#34; Bugs</title>
      <link>https://www.nrmitchi.com/2017/01/assumption-verification-with-impossible-bugs/</link>
      <pubDate>Sun, 15 Jan 2017 11:35:57 -0600</pubDate>
      <guid>https://www.nrmitchi.com/2017/01/assumption-verification-with-impossible-bugs/</guid>
      <description>Recently at Cratejoy, we found ourselves in a situation where we had an &amp;ldquo;impossible&amp;rdquo; bug, and a limited time to identify and correct the issue. For a bit of background, one of our merchants was about to begin a relatively large marketing event, and we had developed a new caching solution designed to address the traffic profile we were expecting.&#xA;The Problem# Unfortunately, a few hours before the event, we started seeing reports of pages returning blank responses.</description>
    </item>
    <item>
      <title>Effective Code Review</title>
      <link>https://www.nrmitchi.com/2016/09/effective-code-review/</link>
      <pubDate>Wed, 28 Sep 2016 12:51:56 -0500</pubDate>
      <guid>https://www.nrmitchi.com/2016/09/effective-code-review/</guid>
      <description>&lt;p&gt;Code reviews are an important tool in every engineering organization, with lists of benefits just a quick Google search away. With that said, simply &amp;lsquo;doing&amp;rsquo; code reviews is not always enough. It is important to ensure that teams are focused on conducting effective code reviews, and are not just going through the process in order to check a box.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Handling Timeouts in RQ</title>
      <link>https://www.nrmitchi.com/2016/07/handling-timeouts-in-rq/</link>
      <pubDate>Wed, 06 Jul 2016 22:12:23 -0500</pubDate>
      <guid>https://www.nrmitchi.com/2016/07/handling-timeouts-in-rq/</guid>
      <description>An important part of building scalable applications and systems is to offload non-urgent tasks to worker processes. We want to do this in order to limit the time a user is waiting on requests, and prevent our application servers from getting bogged down with non-urgent tasks.&#xA;Recently I was migrating a selection of long running processes (data export operations to be specific) to background processes, with two main goals:&#xA;Preventing request timeouts that some of our clients had been seeing Move this load off of our application servers Imagine my surprise when, after moving these tasks completely out of process, I found a JobTimeoutException in our logs.</description>
    </item>
    <item>
      <title>Deduplication Failures with SQLAlchemy collection_class</title>
      <link>https://www.nrmitchi.com/2016/07/deduplication-failures-with-sqlalchemy-collection_class/</link>
      <pubDate>Wed, 06 Jul 2016 21:42:23 -0500</pubDate>
      <guid>https://www.nrmitchi.com/2016/07/deduplication-failures-with-sqlalchemy-collection_class/</guid>
      <description>As discussed in Failsafing Multitenancy in SQLAlchemy, we use a custom collection_class as a failsafe to protect against cross tenant data leakage in our environment. This was working very well, until we discovered a bug which sometimes caused objects to be dropped incorrectly. Ie, if we had a Customer with 2 addresses, one for merchant_1, and one on merchant_2, a request against merchant_1 would always correctly remove the address for merchant_2, however would sometimes also remove the address for merchant_1.</description>
    </item>
    <item>
      <title>Failsafing Multitenancy in SQLAlchemy</title>
      <link>https://www.nrmitchi.com/2016/07/failsafing-multitenancy-in-sqlalchemy/</link>
      <pubDate>Wed, 06 Jul 2016 21:42:08 -0500</pubDate>
      <guid>https://www.nrmitchi.com/2016/07/failsafing-multitenancy-in-sqlalchemy/</guid>
      <description>&lt;p&gt;At &lt;a href=&#34;https://start.cratejoy.com&#34;&gt;Cratejoy&lt;/a&gt;, we run a hosted, multi-tenant application, and for multiple reasons, certain data is centralized between our separate merchants. Merchant specific data should never be crossed, for obvious reasons, however our current setup led to simple engineering oversights to lead to exactly this. We were able to trace data leaks back to our use of &lt;code&gt;joinload&lt;/code&gt;&amp;rsquo;s of SQLAlchemy backrefs on centralized models. Ie, we have a centralized model with a child relation to something that is store specific. When we joinload the child model, it includes the children across all merchants, not the specific one we want at the time. While we could manually filter this in most cases, we take these data leakages very seriously, and do not want an oversight by an engineer to so easily lead to data leakage. We took some time to develop a failsafe system that &lt;em&gt;should&lt;/em&gt; prevent data leakage between stores, even in the event of missing filters.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Using Pow for Single Page Applications</title>
      <link>https://www.nrmitchi.com/2015/01/using-pow-for-single-page-applications/</link>
      <pubDate>Fri, 23 Jan 2015 23:38:29 -0500</pubDate>
      <guid>https://www.nrmitchi.com/2015/01/using-pow-for-single-page-applications/</guid>
      <description>&lt;p&gt;I recently started building out the front ends of a project I&amp;rsquo;ve been working on, and spent longer than I&amp;rsquo;d like to admit getting Pow to serve it properly. Since I&amp;rsquo;ve built the backend purely as a RESTful API, the front end is a single page application which manages it&amp;rsquo;s own state. This works perfectly fine when hitting the root route (ie, &lt;code&gt;/&lt;/code&gt;), however Pow fails when hitting any other routes. Seeing as the files don&amp;rsquo;t actually exist this is understandable, however Single Page Applications are becoming more popular, and it seems like this should be an quick fix.&lt;/p&gt;&#xA;&lt;p&gt;What we need to do here is rewrite all URLs to serve &lt;code&gt;index.html&lt;/code&gt;. This seemed simple enough, however getting Pow to do this was not as straightforward as I had hoped (admittedly probably due to a lack of experience with Ruby). I finally got it working, and thought I&amp;rsquo;d put some straight forward directions here for future reference.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Resume | Nick Mitchinson</title>
      <link>https://www.nrmitchi.com/resume-director/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://www.nrmitchi.com/resume-director/</guid>
      <description></description>
    </item>
    <item>
      <title>Resume | Nick Mitchinson</title>
      <link>https://www.nrmitchi.com/resume-infra/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://www.nrmitchi.com/resume-infra/</guid>
      <description></description>
    </item>
    <item>
      <title>Resume | Nick Mitchinson</title>
      <link>https://www.nrmitchi.com/resume-prod-eng/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://www.nrmitchi.com/resume-prod-eng/</guid>
      <description></description>
    </item>
    <item>
      <title>Resume | Nick Mitchinson</title>
      <link>https://www.nrmitchi.com/resume/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://www.nrmitchi.com/resume/</guid>
      <description></description>
    </item>
  </channel>
</rss>
