Speeding Up Self-Hosted Forgejo CI
My self-hosted CI pipeline got slower with every article I published. Here is how I traced where the time went, and the two config one-liners and one custom runner image that cut it roughly in half.
Articles on software development, web technologies, and life as a remote developer.
My self-hosted CI pipeline got slower with every article I published. Here is how I traced where the time went, and the two config one-liners and one custom runner image that cut it roughly in half.
Writing a tree-walking evaluator in Go with an object system, environments for variable bindings, and type switches to finally run the Monkey language.
Six years after my grandfather died, and a funeral I could not reach from Colombia, this is the goodbye I never got to say.
Building a Pratt parser in Go to turn Monkey's token into an AST, using operator-precedence parsing and Go interfaces to model every node type.
How to write a lexer in Go, turning Monkey source code into a stream of tokens by scanning the input byte by byte, and wiring up a first REPL.
Kicking off a Go series that builds an interpreter and then a compiler from Thorsten Ball's books, starting with a testing and Go-fundamentals warm-up.
I have lived in Colombia for nearly six years and the one skill everyone here wants is the one I have never had to think about. Time to do something about that.
A year after putting down my ex-wife's dog Tommie, I adopted a terrified rescue named Max. He promptly introduced himself by shitting in my bedroom. We have been inseparable ever since.
A breakdown of the tools, frameworks, and platforms I am reaching for in 2026 with an honest take on where AI fits into all of it.
How I wired a self-hosted Forgejo instance to my SvelteKit site through a Cloudflare Worker projecting away PII, caching at the edge, and stacking four layers of access control along the way.
All of my new personal projects live on a self-hosted Forgejo instance running in my house. Here is why I stopped using GitHub for personal work, and how I set it up.
Two years of hiding, a handful of losses, a divorce, a dog named Max. This is what starting over looks like when you do not have it figured out yet.
That time I ran into issues with my certificates being invalid leading to problems communicating between Fly.io and my Turso database.
An article to try my best and express who Tommie was and the happiness and love he brought my wife and myself.
Writing a simple HTTP Server using only what is provided via the Go Standard Library.
San Andrés is a little slice of paradise in the Caribbean owned by Colombia. The perfect place to celebrate all the new gray hairs that came with turning 36 years old.
Astro's content collection feature is a game changer for easily managing content in a type safe manner. It also can help to easily add related collections or data types through referencing. In this article I show how I implemented a related articles feature.
A quick how-to guide on deploying your server-side rendered Astro projects to Fly.io.
A quick how-to guide on deploying your static Astro projects to Fly.io.
In my journey into learning Go I have been learning how to use Makefiles within my Go projects. I had never worked with makefiles before and this post will touch on how to use them.
The chaos that is the JavaScript/TypeScript ecosystem has become too much to bear in my opinion. I have become unhappy with my direction in the tech industry and in late 2023 made the decision to begin teaching myself Go and pivoting my career out of the Frontend & away from JavaScript.
In 2023 I began making the move from NextJS to Astro for my personal website and blog. This is my experience with the transition.
In November of 2023 I traveled to Salento, Colombia for the adventure of a lifetime, climbing and summiting Colombia's second highest peak, Nevado del Tolima.
A quick guide on how to deploy a Qwik-City project to Cloudflare Pages from GitHub Actions.
After Bitwarden's decision to terminate their VP of Software due to his answer to preferred pronouns in the workplace, I have decided to move to a different password manager.
Part 4 in the Ectogram series where I cut my teeth on testing the user schema with ExUnit.
Part 3 in the Ectogram series where I generate the user table migration and schema.
Part 2 in the Ectogram series where I setup the project and make customizations to Ecto.
A clone of the popular social media platform, Instagram, written in Elixir & Ecto.
Everything I have learned when it comes to SSH after setting up my Raspberry Pi Cluster.
A post outlining my goals for 2022 and looking back on 2021.
How to use the Python Scripting API in iTerm2 to open several tabs and execute commands in those tabs.
How I created the animated social icons on my website using TailwindCSS.
My experience moving from classic yarn to pnpm as my package manager in JavaScript land.
My experience with renting property in Colombia as an expat.
A quick posts on how to kill processes on macOS.
A look back on 2020 and looking ahead to 2021.
Setting up a React project with Webpack 4, Babel 7, & TypeScript.
Two years of hard work finally delivered my first dev job.
A guide for how to build a stopwatch with JavaScript.
Working through Fibonacci using recursion and memoization in Python.
Writing a program that will read moves and populate a game board for the popular game Connect Four using Python.
How to build a simple black jack advice generator using Python.
Installation and setup of Python3 on macOS & development with Visual Studio Code.
Turning a new leaf and starting fresh in Portland, Oregon.
The admission and realization that I desperately need help.
My experience in building a bot for the popular Telegram Messenger Platform.
Where I've been and where I'm going in 2018.
How to get started with iTerm2, ZSH, & VSCode.
What I learned while rebuilding my site/blog with Hugo.