Who has a blog and wants to share it? I'd love to add some new sites to my RSS reader app!
I'll go first ;) https://crabmusket.net
I'm trying to blog a little more frequently in smaller chunks this year. Topics range from web-focused tech to housing and general interest stuff to religion. The post titles in the archive might give a good sense of things! https://crabmusket.net/archive/
Does one post every 2 years qualify :joy:
Since this seems a good first post (just joined), and you asked for it ;-) , I plug my one :-)
@Dustin yes, RSS is great for that as I'll see your site turn up once every 2 years ;)
@a4z welcome!
@Daniel Buckmaster I love the link dumps! How do you decide what goes in them
https://dustin.knopoff.dev/categories/blog/
Also! https://indieblog.page/ the random page button is super fun for finding niche interesting things on the web
Just started! https://blog.femtodata.com/
I'm writing occasionally on medium: https://marcusedwards-20301.medium.com/. I am also working on a writer's website here: https://marcusedwards.me/author-website. :)
I don't have a blog to promote (although, I will soon stand up my old blog) but I just released my last interview for Software Engineering Daily, my swan song! https://softwareengineeringdaily.com/2025/05/13/anthropic-and-the-model-context-protocol-with-david-soria-parra/
One of the things I love about the small web is everyone organizes things differently :smile: Always interesting to see the different visual and organizational structure
Always happy for a chance to self promote! https://www.jvt.me is my site, of which https://www.jvt.me/kind/articles/ is pure blog posts, and https://www.jvt.me/subscribe/ for all the ways to subscribe (ie RSS)
Just spun up a very simple Hugo blog recently that could have been named The Anxious Engineer: https://www.sononick.com/thoughts
Thanks everyone :grinning_face_with_smiling_eyes: keep it up!
@Dustin RE link dumps, it was inspired by Cory Doctorow. It's just gut feeling really. There are things I read that resonate strongly, or that I find worth promoting, but when it comes time to make a post I just try to choose a selection that's a bit varied.
I think the first one I did, my partner saw an article that made her say "wow, you didn't tell me about this!" so I try to keep that metric in mind :laughing:
https://nabeel.dev/blog/ (https://nabeel.dev/feed for the RSS)
Though I haven't posted much in a very long time. I really want to blog more, but kids :shrug: :laughter_tears:
I started mine a bit ago, but haven’t found too much to write about yet: https://williamvdg.me/.
The feed is here: https://williamvdg.me/rss (just looking at it now makes me thing it might be broken)
This post is particularly timely given the recent content about AI: https://matthewsanabria.dev/posts/ai-for-adults/
Useful focusing thoughts in that post @Matthew Sanabria :thumbs_up: . I particularly dig the bit about faciliating context switching. I still have to figure that bit out myself. I tried an app called Pieces a while back that _seemed_ geared toward that but it was really good at capturing stuff I didn't care about and worse at capturing stuff I needed :sweat_smile: . I've had Scott Hanselman's "dull, dirty, or dangerous" in my head, and I love the idea of having a personal context switching co-processor (even if it's on acid and/or wielding chainsaws)
Same! Even if it helps me shave off a few minutes in context switching that will add up to maybe hours over the span of a day or week. That's worth it to me. It's not perfect but it doesn't have to be. It just has to enable me to get back in the zone quickly.
I really wonder if I’m holding these AI agents wrong! I’ll I’ve ever managed to get from them is burning money trying and failing to answer my prompt. Is there anything in particular you do to get good output from them?
I generally keep things prescriptive. Previously I've used prompts to tell it what to do but I've been moving to plan files (i.e., a file with steps to follow) for the larger body of work I need to do. I'm specific enough to do a small to medium task but not overly specific as to waste my time typing.
Here's a prompt I gave Claude Code on the Oxide Packer plugin I'm building.
Implement the
Cleanup
method for the steps in the builder component. Only populate theCleanup
method if there were any Oxide resources created in the respectiveRun
method. Do not change anything other than theCleanup
method and do not change its function signature as it's required to implement an interface.
Here's the diff.
diff --git a/component/builder/instance/step_image_create.go b/component/builder/instance/step_image_create.go
index d9586909e7..9e67082f29 100644
--- a/component/builder/instance/step_image_create.go
+++ b/component/builder/instance/step_image_create.go
@@ -49,4 +49,17 @@
return multistep.ActionContinue
}
-func (s *stepImageCreate) Cleanup(stateBag multistep.StateBag) {}
+func (s *stepImageCreate) Cleanup(stateBag multistep.StateBag) {
+ if imageIDRaw, ok := stateBag.GetOk("image_id"); ok {
+ oxideClient := stateBag.Get("client").(*oxide.Client)
+ ui := stateBag.Get("ui").(packer.Ui)
+ imageID := imageIDRaw.(string)
+
+ ui.Say("Cleaning up Oxide image...")
+ if err := oxideClient.ImageDelete(context.Background(), oxide.ImageDeleteParams{
+ Image: oxide.NameOrId(imageID),
+ }); err != nil {
+ ui.Error("Failed to delete Oxide image during cleanup.")
+ }
+ }
+}
diff --git a/component/builder/instance/step_instance_create.go b/component/builder/instance/step_instance_create.go
index 0e95323c7e..30b8fa6375 100644
--- a/component/builder/instance/step_instance_create.go
+++ b/component/builder/instance/step_instance_create.go
@@ -81,4 +81,17 @@
return multistep.ActionContinue
}
-func (o *stepInstanceCreate) Cleanup(stateBag multistep.StateBag) {}
+func (o *stepInstanceCreate) Cleanup(stateBag multistep.StateBag) {
+ if instanceIDRaw, ok := stateBag.GetOk("instance_id"); ok {
+ oxideClient := stateBag.Get("client").(*oxide.Client)
+ ui := stateBag.Get("ui").(packer.Ui)
+ instanceID := instanceIDRaw.(string)
+
+ ui.Say("Cleaning up Oxide instance...")
+ if err := oxideClient.InstanceDelete(context.Background(), oxide.InstanceDeleteParams{
+ Instance: oxide.NameOrId(instanceID),
+ }); err != nil {
+ ui.Error("Failed to delete Oxide instance during cleanup.")
+ }
+ }
+}
diff --git a/component/builder/instance/step_snapshot_create.go b/component/builder/instance/step_snapshot_create.go
index 2544d21355..cffe055674 100644
--- a/component/builder/instance/step_snapshot_create.go
+++ b/component/builder/instance/step_snapshot_create.go
@@ -44,4 +44,17 @@
return multistep.ActionContinue
}
-func (s *stepSnapshotCreate) Cleanup(stateBag multistep.StateBag) {}
+func (s *stepSnapshotCreate) Cleanup(stateBag multistep.StateBag) {
+ if snapshotIDRaw, ok := stateBag.GetOk("snapshot_id"); ok {
+ oxideClient := stateBag.Get("client").(*oxide.Client)
+ ui := stateBag.Get("ui").(packer.Ui)
+ snapshotID := snapshotIDRaw.(string)
+
+ ui.Say("Cleaning up Oxide snapshot...")
+ if err := oxideClient.SnapshotDelete(context.Background(), oxide.SnapshotDeleteParams{
+ Snapshot: oxide.NameOrId(snapshotID),
+ }); err != nil {
+ ui.Error("Failed to delete Oxide snapshot during cleanup.")
+ }
+ }
+}
Now this is not how I would have coded things up. I'd prefer to use an early return here instead and it's not removing the object from the Packer state upon successful cleanup but it's enough for me to quickly edit in between meetings.
I liken it to the LSP "fill struct" functionality. You know that you want to populate a struct but you don't want to type all the fields or even need all the fields. You tell LSP to fill the struct and you populate the fields you care about and remove the ones you don't. Same thing with AI. Rinse and repeat.
I see I see! This is much closer to how I use Claude than what I was expecting. The only difference is I manually copy the relevant context into a chat window instead of I guess telling to find that?
Yep! I just let it find things by being specific enough. I could have used Claude Code's @
to specifically target files but I let AI figure that out instead.
Total cost: $0.1858
Total duration (API): 2m 23.4s
Total duration (wall): 8m 26.6s
Total code changes: 42 lines added, 3 lines removed
Token usage by model:
claude-3-5-haiku: 13.2k input, 484 output, 0 cache read, 0 cache write
claude-sonnet: 46 input, 2.6k output, 167.7k cache read, 22.5k cache write
That's a small task and only required one prompt from me so it was pretty cheap.
I'd prefer to use an early return here instead and it's not removing the object from the Packer state upon successful cleanup but it's enough for me to quickly edit in between meetings.
This is where I've gotten stuck asking myself if it's worth burning a prompt to tell it to fix it or I should just do it myself. (In my case a Makefile
recipe that used paths instead of variables.) But when I do it myself it feels like I'm not fully Embracing the Future.
With Copilot I wouldn't have thought twice since Pro is a flat fee for chats and their (admittedly less-capable, but adequate for that use) Agent Mode. But even though I still have >130 prompts in my free Cursor trial and I probably shouldn't be bean counting $0.04, I feel the pressure to make each one worth it a lot more than Copilot.
(I'm open to hearing ways or reasons why I just need to get over that.)
I'm glad you brought that up because I've had an entire "range anxiety" conversation with my colleagues and peers. Right now I'm using the ad-hoc API pricing for Anthropic so I find myself checking the cost too often when I really shouldn't care as much. This has gotten me to the point where I'm ready to subscribe to the monthly plan to free myself from that anxiety.
In this case the change was small so I don't mind fixing it as I do my review of the code itself.
To answer directly I'm trying to get over that myself. You should try to "make the prompts count" so costs stays low and effectiveness stays high but also there's an escape hatch in the monthly plan that frees you from that and allows you to use AI with more rigor without worrying about cost.
Mind if I ask if the company is picking up the tab for that? And if so, is that a less structured "just send the receipts and we'll reimburse" kind of thing or a more formal budgeted "we plan on an average of $x/month/engineer" allotment? (Asking because we're currently more the former and I'm wondering if/when others are transitioning to the later—especially in more engineer-driven cultures.)
Great question! There are people at Oxide that expense their monthly AI bill, among other things. We generally have a "if you need it to do your job better, expense it" policy but Bryan Cantrill is writing up an RFD specifically about AI so I imagine there will be some details in there about the future of such budget for AI tools. At this time we don't have a corporate AI account or similar. I'm currently deciding whether I sign up for a monthly plan and expense it with Oxide.
@Matthew Sanabria I enjoyed that post! I like how you considered your values and priorities and worked out how you could leverage tools to help those.
I wrote up my own short dissenting opinion over the weekend, as I felt like lots of responses to the "you're all nuts" piece weren't addressing the fundamental issue: yes, I am nuts!
https://crabmusket.net/2025/on-being-nuts/
Last updated: Jun 28 2025 at 12:32 UTC