Stream: general

Topic: Promote your blog


view this post on Zulip Daniel Buckmaster (May 12 2025 at 23:11):

Who has a blog and wants to share it? I'd love to add some new sites to my RSS reader app!

view this post on Zulip Daniel Buckmaster (May 12 2025 at 23:14):

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/

view this post on Zulip Dustin (May 13 2025 at 06:10):

Does one post every 2 years qualify :joy:

view this post on Zulip a4z (May 13 2025 at 06:19):

Since this seems a good first post (just joined), and you asked for it ;-) , I plug my one :-)

https://a4z.gitlab.io/blog/

view this post on Zulip Daniel Buckmaster (May 13 2025 at 06:39):

@Dustin yes, RSS is great for that as I'll see your site turn up once every 2 years ;)

view this post on Zulip Daniel Buckmaster (May 13 2025 at 06:39):

@a4z welcome!

view this post on Zulip Dustin (May 13 2025 at 06:41):

@Daniel Buckmaster I love the link dumps! How do you decide what goes in them

view this post on Zulip Dustin (May 13 2025 at 06:41):

https://dustin.knopoff.dev/categories/blog/

view this post on Zulip Dustin (May 13 2025 at 06:45):

Also! https://indieblog.page/ the random page button is super fun for finding niche interesting things on the web

view this post on Zulip Alexander Ou (May 13 2025 at 15:03):

Just started! https://blog.femtodata.com/

view this post on Zulip Matthew Sanabria (May 13 2025 at 16:35):

https://matthewsanabria.dev

view this post on Zulip Marcus Edwards (May 13 2025 at 16:40):

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. :)

view this post on Zulip Jordi Mon Companys (May 13 2025 at 17:14):

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/

view this post on Zulip Brett Cannon (May 13 2025 at 17:44):

https://snarky.ca

view this post on Zulip Dustin (May 13 2025 at 19:24):

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

view this post on Zulip Jamie Tanna (May 13 2025 at 20:59):

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)

view this post on Zulip Nick Campbell (May 14 2025 at 00:25):

Just spun up a very simple Hugo blog recently that could have been named The Anxious Engineer: https://www.sononick.com/thoughts

view this post on Zulip Daniel Buckmaster (May 15 2025 at 19:37):

Thanks everyone :grinning_face_with_smiling_eyes: keep it up!

view this post on Zulip Daniel Buckmaster (May 15 2025 at 19:41):

@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:

view this post on Zulip Nabeel S (May 18 2025 at 03:20):

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:

view this post on Zulip William V (May 19 2025 at 02:33):

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)

view this post on Zulip Matthew Sanabria (Jun 09 2025 at 14:08):

This post is particularly timely given the recent content about AI: https://matthewsanabria.dev/posts/ai-for-adults/

view this post on Zulip AJ Kerrigan (Jun 09 2025 at 14:19):

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)

view this post on Zulip Matthew Sanabria (Jun 09 2025 at 14:32):

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.

view this post on Zulip Dustin (Jun 09 2025 at 14:39):

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?

view this post on Zulip Matthew Sanabria (Jun 09 2025 at 15:09):

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 the Cleanup method if there were any Oxide resources created in the respective Run method. Do not change anything other than the Cleanup 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.")
+               }
+       }
+}

view this post on Zulip Matthew Sanabria (Jun 09 2025 at 15:11):

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.

view this post on Zulip Matthew Sanabria (Jun 09 2025 at 15:12):

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.

view this post on Zulip Dustin (Jun 09 2025 at 15:13):

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?

view this post on Zulip Matthew Sanabria (Jun 09 2025 at 15:13):

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.

view this post on Zulip Matthew Sanabria (Jun 09 2025 at 15:14):

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

view this post on Zulip Matthew Sanabria (Jun 09 2025 at 15:14):

That's a small task and only required one prompt from me so it was pretty cheap.

view this post on Zulip Andrew O'Brien (Jun 09 2025 at 15:35):

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.)

view this post on Zulip Matthew Sanabria (Jun 09 2025 at 15:44):

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.

view this post on Zulip Matthew Sanabria (Jun 09 2025 at 15:45):

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.

view this post on Zulip Andrew O'Brien (Jun 09 2025 at 16:55):

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.)

view this post on Zulip Matthew Sanabria (Jun 09 2025 at 17:03):

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.

view this post on Zulip Daniel Buckmaster (Jun 09 2025 at 21:46):

@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.

view this post on Zulip Daniel Buckmaster (Jun 09 2025 at 21:49):

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