Joel Always one syllable

Self-hosting Garage for object storage

26 Oct 2025

Photo of a garage courtesy Todd Kent @ Unsplash
Photo of a full, busy, garage. Courtesy Todd Kent @ Unsplash

Due to the work on Shubox block storage had become an interesting little corner that I’ve enjoyed researching. I had previously played with minio and found it to be fine. Recently, the maintainers of Minio had decided to change directions in how “open” they wanted to make their “open source” product. That’s fine. With the velocity and severity of these changes, though, it made sense to take a look at something that doesn’t risk having an even more severe rug-pull moment. Hence - garage.

Up and running with Garage

Docker compose is my preferred method for spinning up services in-house. For this experiment I decided to try both Garage and garage-webui together. Keep in mind that this is a single node installation, no replication. Just one machine, one instance.

That said, here’s a simple config in a compose.yml file to get things going:

services:
  garage:
    image: dxflrs/garage:v2.1.0
    container_name: garage
    volumes:
      - ./garage.toml:/etc/garage.toml
      - ./meta:/var/lib/garage/meta
      - ./data:/var/lib/garage/data
    restart: unless-stopped
    ports:
      - 3900:3900
      - 3901:3901
      - 3902:3902
      - 3903:3903
  garage-webui:
    image: khairul169/garage-webui:1.1.0
    container_name: garage-webui
    restart: unless-stopped
    volumes:
      - ./garage.toml:/etc/garage.toml:ro
    ports:
      - 3909:3909
    environment:
      API_BASE_URL: "http://garage:3903"
      S3_ENDPOINT_URL: "http://garage:3900"
    depends_on:
      - garage
    healthcheck:
      test: ["CMD-SHELL", "curl -f http://localhost:3909 || exit 1"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 20s

Where the contents of ./garage.toml are:

metadata_dir = "/var/lib/garage/meta"
data_dir = "/var/lib/garage/data"

replication_factor = 1

rpc_bind_addr = "[::]:3901"
rpc_public_addr = "[::]:3901"
rpc_secret = "..." # generate secret with `openssl rand -hex 32`

bootstrap_peers = []

[s3_api]
s3_region = "bully"
api_bind_addr = "[::]:3900"
root_domain = ".s3.your-domain.com"

[s3_web]
bind_addr = "[::]:3902"
root_domain = ".web.your-domain.com"
index = "index.html"

[admin]
api_bind_addr = "[::]:3903"
admin_token = "..."   # generate secret with `openssl rand -hex 32`
metrics_token = "..." # generate secret with `openssl rand -hex 32`

A quick docker compose up -d will get that up and running.

Create a cluster layout

While it may be up and running, you will still need to allocate the disk space (layout) for Garage. Here’s how:

# get the node id
NODE_ID=`xxd -p ./meta/node_key.pub | tr -d '\n'`

# shorthand for the garage cli
alias garage='docker exec garage /garage -c /etc/garage.toml --rpc-host $NODE_ID@127.0.0.1:3901'

# check status
garage status

# assign node and cluster layout with zone name (dc1) and disk space (10G)
garage layout assign $NODE_ID -z dc1 -c 10G

# apply the layout
garage layout apply --version 1

Check your work

At this point you should be able to visit http://[host-ip]:3909, see Garage-webui, create buckets & keys, etc. Beyond that, you should install an s3 client like awscli, mc, or s5cmd to test your buckets with whatever key and secret you’ve created via garage-webui.

Enjoy! 🛠️️

On home-cooked software

25 Oct 2025

I’d run into this presentation and blog post from Maggie Appleton before but just this weekend finally had a chance to sit down and really digest it. My opinion? The short version, the verdict, is that I could not agree more. Go read it or watch it. It’s worth it.

Her thesis is that the barefoot developer, the person at home writing software to scratch a particular itch, will see a rennaissance now that they are further enabled to write their “home-cooked” software with large language models. The barriers are now less fortified, the hoops to jump through are larger and less numerous.

I, for one, welcome this. C’mon in, the water’s warm!

To take it one step further, in addition to the novices (the “barefoot developers”) being able to do more with LLM’s, what about the professional engineers? Sure, there are ways where these tools can help at our day jobs. (Some ways better than others.) Consider those same coders - what about when they get home from their day job and want to deploy their skills but don’t want to be beholden to the long list of (necessary! VERY necessary) processes, checks, and balances that they adhere to at work?

Look - If you just want to whip up a slack bot for your friends to do some silly little thing? The barrier to getting that done in the past had been time and effort. I’ll speak for myself, but - the hours to assess, plan, choose the right stack, libraries, tools, code, document, package, etc … had been enough to discourage my (ADD-addled) brain from opening up my editor.

Now?

No problem.

It’s fun. It’s refreshing. It’s educational. It’s productive.

It’s not perfect, but it doesn’t need to be. It just needs to do that dumb thing in Slack for me and my friends.

(Note: not a word of this was written or edited with “AI”.)

Deciding to shut down Shubox

22 Sep 2025

Ruth, our puppy, lounging while I work on my laptop
Ruth, our puppy, keeping me company while I do some work.

For nearly nine years, Shubox has been a part of my life. It started as a passion project — a SaaS product that I dreamed might one day stand on its own. At the time, success, to me, meant autonomy. The more users, more revenue, the more viability, meant that maybe it could replace my day job. That was the vision.

(Does that story sound familiar? Work a full time job? Create a side-hustle that pops, concentrate on that full-time? Yes. It does sound familiar.)

But over time, my definition of success evolved. These days, success looks a lot more like balance: meaningful work at my full-time job, more time with my family, and projects that bring me energy rather than drain it. In that light, keeping Shubox running just didn’t fit anymore. This is why I made the decision to send an email out last week to customers, colleagues, friends, supporters, and advisors, that I would be shutting it down by the end of the year. Emails have been sent out. People have been notified. I will start the 3 month process of shutting all moving parts down.

It wasn’t a single dramatic event that led me here, but rather a quiet repetition: the voice in my head saying, “I should really work on Shubox.” I heard it one (maybe ten) too many times, often when I’d rather be fully present with my family. That’s when it clicked — instead of energizing me, Shubox had become a weight.

I’d had some conversations with friends about it (shout-out to Ben who in a catch-up conversation made me think really hard about this). Additionally, my CPA would, like clockwork, remind me every year that we could wind down all corporate considerations to make the yearly conversation reduce by one (shout-out Peter! 🐐️). The thought had been bouncing around in there for a while and when met with the experience above, I think I knew it was time.

The decision to walk away from Shubox has also changed how I think about these personal projects. What is “success”? Success isn’t just about longevity or profitability or autonomy. It’s about how well a project will fit into my life and whether it adds more than it takes. A successful side project might be small, fun, and light — not necessarily something that has to “make it big.”

I don’t think anyone would ask me for advice. But, if you’re wrestling with whether to shut down a project of your own, here’s what I’d say:

  • Listen to that inner voice; it’s usually telling you the truth.
  • Don’t measure yourself against other people’s expectations. Only you know whether a project is worth your time.
  • Letting go doesn’t mean failure. Sometimes it’s the most thoughtful, mature decision you can make.
  • You’re not giving up on creativity; you’re just making space for projects that actually fit your life.

In closing, Shubox will always mean a lot to me. It taught me about building, maintaining, and, eventually, letting go. More importantly, it taught me about myself. While Shubox is coming to an end, my creativity and my desire to build isn’t. It’s just shifting into something lighter, more sustainable, and more aligned with where I am today. I’m sure I’ll have something else to share in the not too distant future.

Fenway Fest 2025

12 Jan 2025

One of the gifts for my son this past holiday season was that we would bring him to Fenway Park for the first “Fenway Fest”. Typically the Red Sox have a “Winter Weekend” but this year moved it home, which is … much more convenient? For us, at least.

Of course getting to meet the players and get some autographs and cards signed was the highlight, but the absolute cherry on top of the entire event was the ability to be in Fenway Park in the middle of a beautiful snow storm.

Fenway. Snow. (animated)
Fenway. Snow. (animated)
Yaz -- his statue -- welcoming us to Fenway with a tip of his cap.
"Carl Yastrzemski" welcoming us to Fenway Park.
Statue of Ted Williams placing his cap on a little boy
The Ted Williams statue outside of Gate B.
Fenway 2025 signage, in lights
FENWAY 2025.
Entrance into Fenway, dusted with snow, the park in the distance
The entrance to Fenway dusted with snow, with the Green Monster in the distance.
The mini-est of snowmen.
The mini-est of snowmen.
Center and right field bleacher seats covered with snow.
Center and right field bleacher seats covered with snow.
New Balance.
New Balance.

All photos taken with an iPhone 14.

No one teaches you: Career growth and management

04 Jan 2025

'Feedback' as a young artist.
As cliché and corny as this may be, still: tend to your career like a garden.

Preface

When I say “no one teaches you”, I mean that there are life lessons that are not among the typical curriculum provided to young adults as they begin navigating their ADULT adult lives. Not from their schools, their first jobs, and not from their parents. This post is a reflection on life lessons you may have to learn the hard way - like I did.


No one is paying attention to you at work. (Like, really seeing you perform at that high level.)

Well, mostly. Maybe if you’re some wunderkind? Or 10x unicorn? Maybe.

But no, mostly. Nope.

Sorry.

Why? Because everyone is also trying to make their way, get by, keep their head above water, or get to the end of the day or week. Being an adult is hard, and most of us are just tired.

Of course there are always exceptions to the rule. People around you may care, and may be trying to do what they can to help you excel and get that promotion, but at the end of the day that responsibility ends up at your feet. The responsibility to prove that you are doing everything you need to do to move up that ladder, is ultimately on you.

For an interesting read on what it’s like navigating advancement of a career in “BIG TECH” (scare quotes!), there is this post from Michael Lynch - “Why I Quite Google to Work for Myself”. This post has stuck with me for months, so I couldn’t write my own thoughts without sharing his.

Now, here’s where some of those exceptions kick in - if you’re lucky, you work at a company that has a tried and true process for showcasing the impact you have delivered to the business. Perhaps that’s a set of documents that serve as a framework for advancement, or the company uses something like Lattice to good effect, or your manager is constantly on your ass to document everything. But that’s a lot o’ “buts” and “maybes”.

But … most don’t.

So don’t expect that the people in charge of making decisions will just know. They won’t.1

With that cynicism laced with realism—or vice-versa—out of the way, what now?

Keep receipts. Document what you’ve delivered month-over-month. What were your personal initiatives? Where have you delivered against your goals and promises? Who have you helped improve, and are you able to state how and why? Be direct on what you intend to do. What are your plans? Look at your organization’s leveling rubrics and not only track where you meet the expectations, but can exhibit how you have internalized those skills and have burned into muscle memory.

I want to be clear on something - I suck at this! I am often so focused on the day and week at hand, that I neglect to suitably prioritize the documentation of slow and steady growth. This is as much a reminder for me as it is for anyone I might have a similar conversation with. I wish I’d more people in my orbit over the years to beat this into my brain. Alas, I did not. C’est la vie. (Again, not their problem.)

So if you’re reading this, consider the above. Good luck. Look out for #1. Keep your receipts. And let me know how it goes.

  1. I worked at this consultancy several lifetimes ago. I was doing good work (as far as I knew) and had several people telling me as much. The challenge at the time was that the department we were in skewed more towards the design/IA/UX side of work at a digital agency, but as a specialist in front-end technology I, and others, were on the fringes and met with an apples vs. oranges, compare-and-contrast, problem. I was not equipped at that time to make the case for myself and outline where my personal value and the role’s trajectory (from a larger digital evolutionary perspective) was. My memory recalls that I eventually did get that promotion, but the glacial turn towards getting there burned me out enough to leave when I could. To be clear, most of that was a product of my inaction and the inability to realize this.