<?xml version='1.0' encoding='UTF-8'?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><atom:link href="https://claytn.dev" rel="self" type="application/rss+xml"/><title>clayton marshall</title><link>https://claytn.dev</link><description>This blog is awesome</description><lastBuildDate>Sat, 30 May 2026 20:05:31 -0600</lastBuildDate><generator>clj-rss</generator><item><guid>https://claytn.dev/posts-output/2026-05-25-supabase-full-vacuum/</guid><link>https://claytn.dev/posts-output/2026-05-25-supabase-full-vacuum/</link><title>Supabase free tier and full vacuums</title><description>I learned something fun about the difference between Postgres vacuum and vacuum full today while trying to trim the fat on an Supabase instance that was getting close to the free tier database size limit.When a row is deleted from a Postgres table, the underlying tuple on disk is not actually deleted, but marked as deleted. This is enables all the fun MVCC magic. Then Postgres kindly runs a background vacuum job on some cadence to actually removes those tuples from disk and gives you back all that sweet sweet storage. EXCEPT IT DOESN'T. The autovacuum job just marks those "deleted" tuples on disk as "reusable". It does NOT give that freed up disk space back to the OS.</description><pubDate>Mon, 25 May 2026 00:00:00 -0600</pubDate></item><item><guid>https://claytn.dev/posts-output/2024-04-05-node-http-request-abort/</guid><link>https://claytn.dev/posts-output/2024-04-05-node-http-request-abort/</link><title>Handling aborted HTTP requests in NodeJS v17+</title><description>I want to know when HTTP requests sent to my Node server are canceled by the user. In the past you could listen to the 'abort' event on a http.ClientRequest, but that event and it's related fields on the request object have been deprecated since node v16.12. You can still listen to this event. It's continued to work for me, but I don't want to rely on an event that's explicitly deprecated.TL;DR</description><pubDate>Fri, 05 Apr 2024 00:00:00 -0600</pubDate></item><item><guid>https://claytn.dev/posts-output/2022-07-31-writing-gif-player/</guid><link>https://claytn.dev/posts-output/2022-07-31-writing-gif-player/</link><title>Writing a GIF Player in Go</title><description>I'm reimplementing one of my projects, movemygif, in Go. In short, movemygif is a digital picture frame I've hung on my bedroom wall that plays a GIF and tracks the motion of the viewer looking at the frame. When the viewer moves towards the frame, the GIF plays forward, if they move backwards the GIF reverses. I wanted to benchmark the Go implementation against the original Clojurescript/Javascript solution in hopes of getting much better performance outside of a browser. I'm also learning Go and this project seemed more motiviating than practice problems.For starters, I need a GIF player that lets me rewind, pause, and play a GIF whenever needed. A default GIF viewer like what you'd get from most GUI libraries won't do the trick here. I also haven't been able to find a GUI agnostic GIF player available for Go that I could extend. So, I'm left with the option of writing my own.</description><pubDate>Sun, 31 Jul 2022 00:00:00 -0600</pubDate></item><item><guid>https://claytn.dev/posts-output/2022-07-10-tom-sachs-shoe/</guid><link>https://claytn.dev/posts-output/2022-07-10-tom-sachs-shoe/</link><title>The Tom Sach's Nike Shoe</title><description>On May 29th, a popular artist/sculpture, Tom Sachs, posted about a new shoe collaboration he's doing with Nike on Instagram.</description><pubDate>Sun, 10 Jul 2022 00:00:00 -0600</pubDate></item><item><guid>https://claytn.dev/posts-output/2022-06-13-ghost-custom-integrations/</guid><link>https://claytn.dev/posts-output/2022-06-13-ghost-custom-integrations/</link><title>Ghost's starter tier should include custom integrations</title><description>The "starter" tier($9 at the time of writing) for a Ghost hosting membership does not include custom integrations. This means you can't get API keys to manage customer and content information from remote applications. So, if I want to, for example, fetch a list of my active susbscribers inside an AWS lambda function, I have to upgrade to the "creator" tier and pay $25 a month. I do not want to do that. There is another alternative to Ghost's pricing model which is self hosting. Ghost is an open source project and the paid tiers more-or-less just offer convenient hosting and support for larger teams. So, in lieu of upgrading my subscription to $25 a month, I setup a self-hosted instance and started paying Digital Ocean $5 a month and canceled my Ghost subscription of $9 a month.I think Ghost is missing an opportunity here. The Ghost customers on the starter tier that want access to API keys are also the same customers that have the experience to easily self-host a Ghost instance elsewhere. I think Ghost is trying to use custom integrations as a selling point to upgrade to the next tier, but in reality it's an incentive to abandon paying Ghost altogether and choosing self-hosting as an alternative.</description><pubDate>Mon, 13 Jun 2022 00:00:00 -0600</pubDate></item><item><guid>https://claytn.dev/posts-output/2020-11-25-reddit-year-review/</guid><link>https://claytn.dev/posts-output/2020-11-25-reddit-year-review/</link><title>A year in review for reddit</title><description>Introduction> 01/18/2020</description><pubDate>Wed, 25 Nov 2020 00:00:00 -0700</pubDate></item><item><guid>https://claytn.dev/posts-output/2020-05-01-choosing-clojure/</guid><link>https://claytn.dev/posts-output/2020-05-01-choosing-clojure/</link><title>Choosing Clojure: Part 1 - Code is Data</title><description>During the past year, I've been reading about and building projects with a programming language called, Clojure. For those who aren't familiar, Clojure is a modern-day LISP that runs on the JVM. Yes, it's one of these parenthesis hogs...</description><pubDate>Fri, 01 May 2020 00:00:00 -0600</pubDate></item><item><guid>https://claytn.dev/posts-output/2020-01-06-js-pipeline/</guid><link>https://claytn.dev/posts-output/2020-01-06-js-pipeline/</link><title>Javascript's New Pipeline Operator</title><description>Javascript is getting a new operator! Maybe.A new operator is currently in stage 1 of the TC39 proposal process. Stage 1 is still early in the process, but getting to stage 1 means that it is being considered, and has an audience of developers pushing for it. If you have recently learned Javascript, or you’re still inexperienced with the language, you may be wondering what new operator Javascript could possibly need. It’s called a pipeline operator, and its necessity is definitely debateable. In this post, I want to give an overview of what the pipeline operator does, along with the positive and negative impacts of adopting it.</description><pubDate>Mon, 06 Jan 2020 00:00:00 -0700</pubDate></item><item><guid>https://claytn.dev/posts-output/2019-12-02-intro-fp/</guid><link>https://claytn.dev/posts-output/2019-12-02-intro-fp/</link><title>Yet another introduction to functional programming</title><description>What is Functional Programming?Wikipedia:</description><pubDate>Mon, 02 Dec 2019 00:00:00 -0700</pubDate></item><item><guid>https://claytn.dev/posts-output/2019-09-22-fp-lists/</guid><link>https://claytn.dev/posts-output/2019-09-22-fp-lists/</link><title>Impractical, Functional Lists (List out of Lambda)</title><description>For my first post, I wanted to do something strange and entertaining. I don't want to bore you with super serious facts, or cover anything practical for that matter. Instead, we'll be walking through a programming exercise of sorts. The ideas in this post come from a topic in math called Church Encodings, and were inspired by another article, List out of Lambda.Introduction:</description><pubDate>Sun, 22 Sep 2019 00:00:00 -0600</pubDate></item></channel></rss>