<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Sean Boult</title>
    <description>The latest articles on DEV Community by Sean Boult (@hacksore).</description>
    <link>https://dev.to/hacksore</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F828306%2Fbf0bbed7-7874-4a26-8137-bb761a4b7f23.png</url>
      <title>DEV Community: Sean Boult</title>
      <link>https://dev.to/hacksore</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hacksore"/>
    <language>en</language>
    <item>
      <title>Bidwatch - Search Live Ebay Auctions Ending Soon</title>
      <dc:creator>Sean Boult</dc:creator>
      <pubDate>Sat, 11 Jul 2026 18:04:21 +0000</pubDate>
      <link>https://dev.to/hacksore/bidwatch-search-live-ebay-auctions-ending-soon-1393</link>
      <guid>https://dev.to/hacksore/bidwatch-search-live-ebay-auctions-ending-soon-1393</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/challenges/weekend-2026-07-09"&gt;Weekend Challenge: Passion Edition&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;I use ebay.com a lot as a passionate card collector to find auctions. It's super difficult to use their filters on both the web and mobile, but mobile is especially frustrating.&lt;/p&gt;

&lt;p&gt;The goal was to build a simple app that allows users to search for any auctions on eBay, filter those listings, find the ones ending soon, and save their filter preferences to find auctions more quickly.&lt;/p&gt;

&lt;p&gt;In &lt;a href="https://bidwatch.app/" rel="noopener noreferrer"&gt;Bidwatch&lt;/a&gt;, you can look for auctions ending soon with bids, no bids, or all auctions. These filters help you understand market sentiment for prices and see what's actually popular.&lt;/p&gt;

&lt;p&gt;I've used the app many times now to win some really awesome auctions that I would have never seen otherwise.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/ZknUzX4L20s"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;AI helped me ship this pretty fast...&lt;/p&gt;

&lt;p&gt;I validated the idea was possible by starting up Codex Chat and explaining the basic MVP. It helped me research the ebay.com REST API offerings and confirmed it was possible to get all the data I needed.&lt;/p&gt;

&lt;p&gt;Codex helped me create a PRD (Product Requirements Document) for the MVP. Initially, that was literally just pulling search data back.&lt;/p&gt;

&lt;p&gt;The scope grew over time, and more and more features were added, such as filters, authentication, caching, and favoriting.&lt;/p&gt;

&lt;p&gt;Here is a quick look at the system architecture. &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq8d4zlkftdsvp8irjseb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq8d4zlkftdsvp8irjseb.png" alt=" " width="800" height="504"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;Excited to be part of this challenge and see all the other project submitted.&lt;/p&gt;

&lt;p&gt;If you have any feedback or questions leave a comment.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://bidwatch.app" class="crayons-btn crayons-btn--primary" rel="noopener noreferrer"&gt;Visit bidwatch.app today 🚀&lt;/a&gt;
&lt;/p&gt;




&lt;p&gt;Happy coding 😛!&lt;/p&gt;

&lt;p&gt;Follow me for all things tech&lt;/p&gt;
&lt;div class="ltag__user ltag__user__id__828306"&gt;
    &lt;a href="/hacksore" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=150,height=150,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F828306%2Fbf0bbed7-7874-4a26-8137-bb761a4b7f23.png" alt="hacksore image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/hacksore"&gt;Sean Boult&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/hacksore"&gt;Developer. Hacker. Creator.&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>nextjs</category>
      <category>ai</category>
    </item>
    <item>
      <title>Why Error Messages Matter More in the Age of AI</title>
      <dc:creator>Sean Boult</dc:creator>
      <pubDate>Fri, 10 Jul 2026 12:45:24 +0000</pubDate>
      <link>https://dev.to/aws/why-error-messages-matter-more-in-the-age-of-ai-dib</link>
      <guid>https://dev.to/aws/why-error-messages-matter-more-in-the-age-of-ai-dib</guid>
      <description>&lt;p&gt;Everyone talks about AI writing code.&lt;br&gt;
Nobody talks about AI debugging code.&lt;/p&gt;

&lt;p&gt;Bad error messages are the worst, we've all seen them. You open the logs or run your program and see something like this...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Error: something went wrong
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn5f8kulz7mtbk02yd2zg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn5f8kulz7mtbk02yd2zg.png" alt=" " width="660" height="825"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It leaves you asking:&lt;/p&gt;

&lt;p&gt;What happened?&lt;br&gt;
Where did it happen?&lt;br&gt;
Why did it happen?&lt;br&gt;
How do I fix it?&lt;/p&gt;

&lt;p&gt;You might have written some of these pretty silly error messages, I know I have. They don't help us fix software quickly because we first have to figure out why the error happened.&lt;/p&gt;

&lt;p&gt;Rust has been shipping fantastic error messages for years.&lt;/p&gt;

&lt;p&gt;Take this example where I accidentally call &lt;code&gt;println&lt;/code&gt; instead of &lt;code&gt;println!&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;cargo run                                                                                                   101 ↵
&lt;span class="go"&gt;   Compiling ducksay v0.2.0 (~/oss/ducksay)
error[E0423]: expected function, found macro `print`
&lt;/span&gt;&lt;span class="gp"&gt;  --&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;src/main.rs:51:3
&lt;span class="go"&gt;   |
&lt;/span&gt;&lt;span class="gp"&gt;51 |   print("{}", render_with_style(&amp;amp;message, cli.width.get(), style));&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="go"&gt;   |   ^^^^^ not a function
   |
help: use `!` to invoke the macro
   |
&lt;/span&gt;&lt;span class="gp"&gt;51 |   print!("{}", render_with_style(&amp;amp;message, cli.width.get(), style));&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="go"&gt;   |     
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;It's fantastic! It tells you what went wrong, where it occurred, and how to fix it.&lt;/p&gt;

&lt;p&gt;When you're building software, you should make your error messages exceptional (punny 😂).&lt;/p&gt;

&lt;p&gt;Here's another example from &lt;a href="https://viteplus.dev/" rel="noopener noreferrer"&gt;Vite+&lt;/a&gt; where I had a syntax error in the config file.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;vp dev
&lt;span class="go"&gt;
failed to load config from ~/oss/test-ssr-on-aws/vite.config.ts
error when starting dev server:
Error: Build failed with 1 error:

[PARSE_ERROR] Error: Unexpected token
   ╭─[ vite.config.ts:5:3 ]
   │
 5 │   ,
   │   ┬
   │   ╰──
───╯
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Now imagine debugging code with generic error messages that tell you absolutely nothing helpful. You'll have to manually trace through the code to figure out what the heck is going on.&lt;/p&gt;

&lt;p&gt;AI agents run into the same problem. If the error tells them almost nothing, they have to spend extra time reading files, tracing execution paths, and making additional tool calls just to understand what failed.&lt;/p&gt;

&lt;p&gt;So what can we do to help humans and AI? Here are some of my top recommendations for writing good error messages.&lt;/p&gt;
&lt;h4&gt;
  
  
  1. Be descriptive and specific
&lt;/h4&gt;

&lt;p&gt;We started with &lt;code&gt;Error: Something went wrong&lt;/code&gt; and it tells us almost nothing.&lt;/p&gt;

&lt;p&gt;Instead, tell them exactly what happened and where it happened.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Error: Failed to load config.toml.

config.toml:23
Unknown property "waddles".
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  2. Emit structured logs
&lt;/h4&gt;

&lt;p&gt;A good error message is one thing, but don't forget about the logs around it.&lt;/p&gt;

&lt;p&gt;Using a structured logger like &lt;a href="https://getpino.io/#/" rel="noopener noreferrer"&gt;pino&lt;/a&gt; means every log includes useful metadata like timestamps, log levels, and request IDs.&lt;/p&gt;

&lt;p&gt;If you're writing JavaScript, pair it with &lt;a href="https://github.com/pinojs/pino-pretty" rel="noopener noreferrer"&gt;pino-pretty&lt;/a&gt; and your logs become a lot easier on the eyes too 💅.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;[17:35:28.992] ERROR (1337): Loading configuration failed, unknown property "waddles" config.toml:23
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Those logs aren't just useful in your terminal. Once they're in your observability platform, you can search, filter, and correlate events across your application. &lt;a href="https://aws.amazon.com/blogs/mt/introducing-opentelemetry-promql-support-in-amazon-cloudwatch/?trk=02c7b25c-78f4-4968-8fa2-241bdf0bcf97&amp;amp;sc_channel=el" rel="noopener noreferrer"&gt;CloudWatch now supports OpenTelemetry&lt;/a&gt;, so all of that structured context comes along for the ride.&lt;/p&gt;

&lt;p&gt;The more useful context your logs contain, the less detective work there is for both you and your AI agent.&lt;/p&gt;
&lt;h4&gt;
  
  
  3. Provide solutions/hints
&lt;/h4&gt;

&lt;p&gt;When things go wrong (and they will), a simple hint can save someone a lot of time.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Error: Missing required environment variable "DATABASE_URL".

hint: Add DATABASE_URL to your .env file or export it before starting the application.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Not every error can tell you exactly how to fix it, and adding hints can take extra work. But if you already know the most common fix, include it anyway. It'll save someone or an AI agent a trip to the documentation.&lt;/p&gt;



&lt;p&gt;FWIW some of these will only make sense when you are in a trusted environment. When giving errors to clients it's best to not give them more than they need, otherwise you might leak information that could help an attacker.&lt;/p&gt;

&lt;p&gt;For trusted environments like a local CLI tool or a server application where you control the logs it's ideal to craft really detailed messages.&lt;/p&gt;

&lt;p&gt;Good error messages have always mattered. AI agents make them even more valuable.&lt;/p&gt;

&lt;p&gt;AI is getting better at writing code every day. We should make it just as good at debugging it.&lt;/p&gt;

&lt;p&gt;Follow AWS for more articles like this.&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__user ltag__user__id__1726"&gt;
  &lt;a href="/aws" class="ltag__user__link profile-image-link"&gt;
    &lt;div class="ltag__user__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=150,height=150,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F1726%2F2a73f1e6-7995-4348-ae37-44b064274c59.png" alt="aws image"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
      &lt;a href="/aws" class="ltag__user__link"&gt;AWS&lt;/a&gt;
      Follow
    &lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a href="/aws" class="ltag__user__link"&gt;
        Articles written by current and past AWS Developer Advocates to help people interested in building on AWS. Opinions are each author's own.
      &lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;Follow me for all things tech.&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__user ltag__user__id__828306"&gt;
    &lt;a href="/hacksore" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=150,height=150,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F828306%2Fbf0bbed7-7874-4a26-8137-bb761a4b7f23.png" alt="hacksore image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/hacksore"&gt;Sean Boult&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/hacksore"&gt;Developer. Hacker. Creator.&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


</description>
      <category>programming</category>
      <category>ai</category>
    </item>
    <item>
      <title>Quickie Posts, Is Anyone Using Them?</title>
      <dc:creator>Sean Boult</dc:creator>
      <pubDate>Mon, 29 Jun 2026 20:09:34 +0000</pubDate>
      <link>https://dev.to/hacksore/quickie-posts-is-anyone-using-them-252d</link>
      <guid>https://dev.to/hacksore/quickie-posts-is-anyone-using-them-252d</guid>
      <description>&lt;p&gt;So there is this feature on dev.to called "Quickie Posts".&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs7vt45xmbuj13ey18esj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs7vt45xmbuj13ey18esj.png" alt=" " width="800" height="230"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;They meant to be short twitter like posts then show up on the home feed.&lt;/p&gt;

&lt;p&gt;I've tried a few times but never got any traction on them. Curious have you used them or did the feature never really take off?&lt;/p&gt;

&lt;p&gt;Some original lore from &lt;a class="mentioned-user" href="https://dev.to/ben"&gt;@ben&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/ben/this-is-a-new-thing-a-type-of-quick-post-that-doesnt-show-up-on-your-profile-or-in-notifications-its-in-beta-and-we-have-a-few-adjustments-and-improvements-in-the-pipeline-but-if-you-have-ideas-let-me-know-3e6a" class="crayons-story__hidden-navigation-link"&gt;This is a new thing: A type of quick post that doesn't show up on your profile or in notifications. It's in beta, and we have a few adjustments and improvements in the pipeline — but if you have ideas, let me know.&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-status"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/ben" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1%2Fbabb96d0-9cd2-49bc-a412-2dc4caf94c2a.png" alt="ben profile" class="crayons-avatar__image" width="800" height="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/ben" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Ben Halpern
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Ben Halpern
                &lt;a href="/++"&gt;&lt;img alt="Subscriber" class="subscription-icon" src="https://assets.dev.to/assets/subscription-icon-805dfa7ac7dd660f07ed8d654877270825b07a92a03841aa99a1093bd00431b2.png" width="166" height="102"&gt;&lt;/a&gt;
              
              &lt;div id="story-author-preview-content-2101446" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/ben" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1%2Fbabb96d0-9cd2-49bc-a412-2dc4caf94c2a.png" class="crayons-avatar__image" alt="" width="800" height="800"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Ben Halpern&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/ben/this-is-a-new-thing-a-type-of-quick-post-that-doesnt-show-up-on-your-profile-or-in-notifications-its-in-beta-and-we-have-a-few-adjustments-and-improvements-in-the-pipeline-but-if-you-have-ideas-let-me-know-3e6a" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Nov 12 '24&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-status"&gt;
        &lt;a href="https://dev.to/ben/this-is-a-new-thing-a-type-of-quick-post-that-doesnt-show-up-on-your-profile-or-in-notifications-its-in-beta-and-we-have-a-few-adjustments-and-improvements-in-the-pipeline-but-if-you-have-ideas-let-me-know-3e6a" id="article-link-2101446"&gt;
          This is a new thing: A type of quick post that doesn't show up on your profile or in notifications. It's in beta, and we have a few adjustments and improvements in the pipeline — but if you have ideas, let me know.
        &lt;/a&gt;
      &lt;/h2&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/ben/this-is-a-new-thing-a-type-of-quick-post-that-doesnt-show-up-on-your-profile-or-in-notifications-its-in-beta-and-we-have-a-few-adjustments-and-improvements-in-the-pipeline-but-if-you-have-ideas-let-me-know-3e6a" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;10&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/ben/this-is-a-new-thing-a-type-of-quick-post-that-doesnt-show-up-on-your-profile-or-in-notifications-its-in-beta-and-we-have-a-few-adjustments-and-improvements-in-the-pipeline-but-if-you-have-ideas-let-me-know-3e6a#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              19&lt;span class="hidden s:inline"&gt;&amp;nbsp;comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            1 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


&lt;p&gt;If you have not tried a quickie post, maybe give it a try today and let me know your experience.&lt;/p&gt;

</description>
      <category>discuss</category>
    </item>
    <item>
      <title>have you installed the Agent Toolkit for AWS yet?</title>
      <dc:creator>Sean Boult</dc:creator>
      <pubDate>Tue, 16 Jun 2026 21:03:54 +0000</pubDate>
      <link>https://dev.to/hacksore/have-you-installed-the-agent-toolkit-for-aws-yet-2bap</link>
      <guid>https://dev.to/hacksore/have-you-installed-the-agent-toolkit-for-aws-yet-2bap</guid>
      <description></description>
      <category>agents</category>
      <category>ai</category>
      <category>aws</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Testing Neovim in a Container with Finch (like Docker)</title>
      <dc:creator>Sean Boult</dc:creator>
      <pubDate>Fri, 12 Jun 2026 15:30:00 +0000</pubDate>
      <link>https://dev.to/aws/testing-neovim-in-a-container-with-finch-like-docker-31dj</link>
      <guid>https://dev.to/aws/testing-neovim-in-a-container-with-finch-like-docker-31dj</guid>
      <description>&lt;p&gt;So developers like CI... for everything! We do this because we like things to be automated. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa3sqj6qsegypqq9wpem8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa3sqj6qsegypqq9wpem8.png" alt=" " width="400" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Building software is tedious and risky. If we can push a commit and let things happen in the cloud to give our change confidence, we absolutely will do that to reduce that potential risk.&lt;/p&gt;

&lt;p&gt;Now let's get into what this blog is about, brace yourself...&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F65h1dqtzmqip8gb1z8h8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F65h1dqtzmqip8gb1z8h8.png" alt=" " width="500" height="625"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I've been using Neovim for a few years now and maintain my own config. Updating Neovim or my plugins is often considered scary because you are trusting a whole lot of maintainers to not make a breaking change that could bring you to a screeching halt.&lt;/p&gt;

&lt;p&gt;One day I had a wild idea. Is it possible to test the most critical part of my workflow? To me that's the TypeScript LSP which gives me hover diagnostics, go to definitions, and of course, the red squiggles.&lt;/p&gt;

&lt;p&gt;Now the implementation is somewhat involved but you can take a peek at my &lt;a href="https://github.com/Hacksore/dotfiles" rel="noopener noreferrer"&gt;dotfiles repo&lt;/a&gt; to learn more about how it works, I won't dive too deep here.&lt;/p&gt;

&lt;p&gt;Originally I only supported Docker because it's been one of my toolchains for a long time, over a decade at this point. I recently learned about Finch, an &lt;a href="https://aws.amazon.com/blogs/opensource/introducing-finch-an-open-source-client-for-container-development/" rel="noopener noreferrer"&gt;open source project by AWS&lt;/a&gt; which allows you to build and run containers.&lt;/p&gt;

&lt;p&gt;Finch is a drop-in replacement for Docker so I updated my CLI (&lt;code&gt;hack&lt;/code&gt;) to let me specify &lt;code&gt;docker&lt;/code&gt; or &lt;code&gt;finch&lt;/code&gt; via an env var (&lt;code&gt;HACK_CONTAINER_RUNTIME&lt;/code&gt;) or CLI flag (&lt;code&gt;--runtime&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;So I can start a run with Finch:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;hack &lt;span class="nt"&gt;--runtime&lt;/span&gt; finch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Once the build and tests finish, you should see output showing that the TypeScript LSP was able to report diagnostics, which gives me confidence that my Neovim setup isn't broken.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;⌛ Starting TypeScript LSP validation...   
📊 TypeScript diagnostics found: 1    
  [1] Type 'number' is not assignable to type 'string'.
✅ LSP validation completed successfully!
✅ Neovim test ran successfully...
NVIM v0.12.2
Build type: Release
LuaJIT 2.1.1774638290
Vim versions: 8.1, 8.2, 9.0, 9.1, 9.2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;What happened at a high level after running the &lt;code&gt;hack&lt;/code&gt; CLI:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Builds the container image with Finch&lt;/li&gt;
&lt;li&gt;Installs Neovim and development tools in the container&lt;/li&gt;
&lt;li&gt;Links the Neovim configuration into the container&lt;/li&gt;
&lt;li&gt;Starts the test container in Finch&lt;/li&gt;
&lt;li&gt;Neovim opens a TypeScript test file&lt;/li&gt;
&lt;li&gt;Runs a custom Neovim command to verify the TypeScript LSP works&lt;/li&gt;
&lt;li&gt;Success 🥳&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My test is pretty narrow but solves my use case of ensuring my TypeScript LSP will work when new plugins and Neovim updates land.&lt;/p&gt;

&lt;p&gt;Give &lt;a href="https://runfinch.com/" rel="noopener noreferrer"&gt;Finch&lt;/a&gt; a try for running containers locally and let me know what you think in the comments.&lt;/p&gt;

&lt;p&gt;Happy Coding 🙂!&lt;/p&gt;



&lt;p&gt;Follow AWS for more articles like this&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__user ltag__user__id__1726"&gt;
  &lt;a href="/aws" class="ltag__user__link profile-image-link"&gt;
    &lt;div class="ltag__user__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=150,height=150,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F1726%2F2a73f1e6-7995-4348-ae37-44b064274c59.png" alt="aws image"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
      &lt;a href="/aws" class="ltag__user__link"&gt;AWS&lt;/a&gt;
      Follow
    &lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a href="/aws" class="ltag__user__link"&gt;
        Articles written by current and past AWS Developer Advocates to help people interested in building on AWS. Opinions are each author's own.
      &lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;Follow me for all things tech&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__user ltag__user__id__828306"&gt;
    &lt;a href="/hacksore" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=150,height=150,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F828306%2Fbf0bbed7-7874-4a26-8137-bb761a4b7f23.png" alt="hacksore image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/hacksore"&gt;Sean Boult&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/hacksore"&gt;Developer. Hacker. Creator.&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


</description>
      <category>neovim</category>
      <category>containers</category>
      <category>docker</category>
      <category>ci</category>
    </item>
    <item>
      <title>AWS Waddles: What the Duck?</title>
      <dc:creator>Sean Boult</dc:creator>
      <pubDate>Mon, 01 Jun 2026 23:33:50 +0000</pubDate>
      <link>https://dev.to/aws/aws-waddles-what-the-duck-23nn</link>
      <guid>https://dev.to/aws/aws-waddles-what-the-duck-23nn</guid>
      <description>&lt;p&gt;For over a decade, there's been a tiny ASCII duck hiding in plain sight. Open the page source for &lt;a href="https://amazon.com" rel="noopener noreferrer"&gt;amazon.com&lt;/a&gt;, scroll all the way to the bottom, and there it is, surfing the web and quietly meowing at anyone who looks.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!--       _
       .__(.)&amp;lt; (MEOW)
        \___)
 ~~~~~~~~~~~~~~~~~~--&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;A few years ago I stumbled onto this meowing duck, and it turns out &lt;a href="https://www.reddit.com/r/ProgrammerHumor/comments/9zflz9/theres_meowing_duck_in_amazon_source_code/" rel="noopener noreferrer"&gt;the internet&lt;/a&gt; had too. MEOW has lived in that source code for years. If you've never seen it, go look now!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx41d1qtszkbr79awreio.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx41d1qtszkbr79awreio.png" alt=" " width="240" height="93"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One day I thought, why not bring that same duck energy to AWS? So I made my own mascot. Same surfing spirit, except this one doesn't meow. It barks. Meet Waddles.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!--       _
       .__(.)&amp;lt; (woof)
        \___)
 ~~~~~~~~~~~~~~~~~~--&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Waddles made his first appearance on March 12, 2026 and landed on the timeline on X/Twitter.&lt;br&gt;
&lt;iframe class="tweet-embed" id="tweet-2032135107977322989-291" src="https://platform.twitter.com/embed/Tweet.html?id=2032135107977322989"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-2032135107977322989-291');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=2032135107977322989&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;You'll be seeing Waddles around more, but I figured I owe the internet an explanation of sorts.&lt;/p&gt;

&lt;p&gt;Ok, I think all my ducks are in a row now 😂.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Waddles takin a nap
    _
.__(_)&amp;lt;
 \___)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Want your own Waddles? I built a little tool called &lt;code&gt;ducksay&lt;/code&gt;. &lt;a href="https://github.com/sboult/ducksay" rel="noopener noreferrer"&gt;Check out the repo here&lt;/a&gt;. Give it a message and it hands it right back to you, duck included:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ ducksay "woof"
&amp;lt;!--       _
       .__(.)&amp;lt; (woof)
        \___)
 ~~~~~~~~~~~~~~~~~~--&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;If ducks aren't your thing, drop some of your favorite ASCII art in the comments. Waddles could use some friends.&lt;/p&gt;

&lt;p&gt;Happy Coding 🤗!&lt;/p&gt;



&lt;p&gt;Follow AWS for more articles like this&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__user ltag__user__id__1726"&gt;
  &lt;a href="/aws" class="ltag__user__link profile-image-link"&gt;
    &lt;div class="ltag__user__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=150,height=150,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F1726%2F2a73f1e6-7995-4348-ae37-44b064274c59.png" alt="aws image"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
      &lt;a href="/aws" class="ltag__user__link"&gt;AWS&lt;/a&gt;
      Follow
    &lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a href="/aws" class="ltag__user__link"&gt;
        Articles written by current and past AWS Developer Advocates to help people interested in building on AWS. Opinions are each author's own.
      &lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;Follow me for all things tech&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__user ltag__user__id__828306"&gt;
    &lt;a href="/hacksore" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=150,height=150,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F828306%2Fbf0bbed7-7874-4a26-8137-bb761a4b7f23.png" alt="hacksore image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/hacksore"&gt;Sean Boult&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/hacksore"&gt;Developer. Hacker. Creator.&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


</description>
      <category>aws</category>
      <category>watercooler</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Markdown Should be Supported Everywhere Natively</title>
      <dc:creator>Sean Boult</dc:creator>
      <pubDate>Fri, 29 May 2026 19:27:54 +0000</pubDate>
      <link>https://dev.to/aws/markdown-should-be-supported-everywhere-natively-8nd</link>
      <guid>https://dev.to/aws/markdown-should-be-supported-everywhere-natively-8nd</guid>
      <description>&lt;p&gt;You've probably seen this tweet by &lt;a href="https://x.com/trq212/" rel="noopener noreferrer"&gt;@trq212&lt;/a&gt; floating around on Twitter about letting agents write HTML instead of markdown...&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-2052811606032269638-893" src="https://platform.twitter.com/embed/Tweet.html?id=2052811606032269638"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-2052811606032269638-893');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=2052811606032269638&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;Listed below are some of the reasons mentioned in the article: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Information Density&lt;/li&gt;
&lt;li&gt;Visual Clarity &amp;amp; Ease of Reading&lt;/li&gt;
&lt;li&gt;Ease of Sharing (to me this is the most compelling)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I don't disagree with Tariq, but rather than switch to HTML, I think the answer is to make markdown supported everywhere. We've been using it for years and it's powering much of the modern web. However, if we look at how software and platforms have evolved, markdown support is very dependent on the platform to render it.&lt;/p&gt;

&lt;p&gt;Why does markdown work for humans and machines? Well, it's pretty simple, humans write simple syntax that gets rendered into something rich, and unironically, that's often by converting it to HTML and a browser engine rendering it. For machines, it's lightweight to parse and easy to generate token by token without the verbosity of HTML.&lt;/p&gt;

&lt;p&gt;We write headers, code blocks, pull quotes, bold text, and what typically happens is something is converting that markdown to HTML.&lt;/p&gt;

&lt;p&gt;For example, I am literally typing this blog in &lt;strong&gt;markdown&lt;/strong&gt;, and the only way I can share it to the masses is through a platform like dev.to that converts it to HTML and hosts it for me.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcr743izmtwef1oggod83.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcr743izmtwef1oggod83.png" alt=" " width="800" height="650"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So if the feature is available in some places, why is it not everywhere? I believe that software vendors haven't prioritized adding markdown rendering support, and they should.&lt;/p&gt;

&lt;p&gt;We should be able to send a standalone index.md file and view it in all web browsers, chat applications, and emails. Some apps already do this like Discord and Slack (Slack's &lt;a href="https://www.markdownguide.org/tools/slack/" rel="noopener noreferrer"&gt;markdown support&lt;/a&gt; disappoints me). We can do this with HTML today, all modern browsers will render something nice, but if you load up markdown in your browser today you will become sad.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu3vm83fa178xsnib3bt4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu3vm83fa178xsnib3bt4.png" alt=" " width="800" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We have to reach for things like Obsidian or Kiro to render the markdown, which I feel limits the portability of it all.&lt;/p&gt;

&lt;p&gt;Curious what you think and where you see yourself heading in terms of AI agent output. Let me know in the comments if you're switching to HTML or sticking with markdown.&lt;/p&gt;




&lt;p&gt;As always, happy coding 🫡!&lt;/p&gt;

&lt;p&gt;Follow AWS for more articles like this&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__user ltag__user__id__1726"&gt;
  &lt;a href="/aws" class="ltag__user__link profile-image-link"&gt;
    &lt;div class="ltag__user__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=150,height=150,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F1726%2F2a73f1e6-7995-4348-ae37-44b064274c59.png" alt="aws image"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
      &lt;a href="/aws" class="ltag__user__link"&gt;AWS&lt;/a&gt;
      Follow
    &lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a href="/aws" class="ltag__user__link"&gt;
        Articles written by current and past AWS Developer Advocates to help people interested in building on AWS. Opinions are each author's own.
      &lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


</description>
      <category>discuss</category>
      <category>html</category>
      <category>productivity</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Terminal Superpowers You Should Be Using in 2026</title>
      <dc:creator>Sean Boult</dc:creator>
      <pubDate>Tue, 19 May 2026 15:00:00 +0000</pubDate>
      <link>https://dev.to/aws/terminal-superpowers-you-should-be-using-in-2026-38b4</link>
      <guid>https://dev.to/aws/terminal-superpowers-you-should-be-using-in-2026-38b4</guid>
      <description>&lt;p&gt;I live in my terminal. Here's what I use to stay fast.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fuzzy finder (fzf)&lt;/li&gt;
&lt;li&gt;Terminal motions&lt;/li&gt;
&lt;li&gt;Sudo shortcut&lt;/li&gt;
&lt;li&gt;Tab completion&lt;/li&gt;
&lt;li&gt;Autosuggestion&lt;/li&gt;
&lt;li&gt;Autocompletion&lt;/li&gt;
&lt;li&gt;Syntax highlighting&lt;/li&gt;
&lt;li&gt;Command buffering&lt;/li&gt;
&lt;li&gt;Terminal clearing&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;NOTE: Some of these are zsh-specific, so make sure you have that set up first.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Fuzzy finder (fzf)
&lt;/h2&gt;

&lt;p&gt;Please please stop spamming up arrow to find that command you ran. Instead you can make this so much simpler with &lt;a href="https://github.com/junegunn/fzf" rel="noopener noreferrer"&gt;fzf&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Once installed, hit &lt;code&gt;Ctrl+R&lt;/code&gt; and your shell history becomes searchable. No more mashing the up arrow 47 times to find that docker command you ran last Tuesday.&lt;/p&gt;

&lt;p&gt;You can also use it to find files:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# fuzzy find a file and open it in your editor&lt;/span&gt;
vim &lt;span class="si"&gt;$(&lt;/span&gt;fzf&lt;span class="si"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Or pipe anything into it:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# search git branches&lt;/span&gt;
git branch | fzf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Seriously, just install fzf.&lt;/p&gt;
&lt;h2&gt;
  
  
  Terminal motions
&lt;/h2&gt;

&lt;p&gt;Stop holding backspace and typing everything all over again...&lt;/p&gt;

&lt;p&gt;Here are the motions that saved me the most time:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Shortcut&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Option + ←/→&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Jump by word&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Option + Backspace&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Delete a word&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Ctrl + A&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Jump to beginning of line&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Ctrl + E&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Jump to end of line&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Ctrl + K&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Delete everything after cursor&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Drill these for a week and holding backspace will start to physically hurt you.&lt;/p&gt;
&lt;h2&gt;
  
  
  Sudo shortcut
&lt;/h2&gt;

&lt;p&gt;You've done this before:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;something
&lt;span class="c"&gt;# Permission denied&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Instead of retyping the whole thing, just run:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="o"&gt;!!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;code&gt;!!&lt;/code&gt; expands to your last command. Done.&lt;/p&gt;
&lt;h2&gt;
  
  
  Tab completion
&lt;/h2&gt;

&lt;p&gt;ZSH tab completion goes further than bash:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tab into directories and keep going (no need to hit enter between each level)&lt;/li&gt;
&lt;li&gt;Cycle through matches with repeated tab presses&lt;/li&gt;
&lt;li&gt;Case-insensitive matching by default&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this case I did &lt;code&gt;~/.aw&amp;lt;tab&amp;gt;/co&amp;lt;tab&amp;gt;&lt;/code&gt;.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhulspug40q4a2g97csvm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhulspug40q4a2g97csvm.png" alt=" " width="800" height="267"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you're typing full paths by hand, you're doing it wrong.&lt;/p&gt;
&lt;h2&gt;
  
  
  Autocompletion
&lt;/h2&gt;

&lt;p&gt;Some CLI tools ship with their own completions for subcommands and flags. The &lt;a href="https://docs.aws.amazon.com/cli/v1/userguide/cli-configure-completion.html" rel="noopener noreferrer"&gt;AWS CLI&lt;/a&gt; is a good example:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Add this to your .zshrc&lt;/span&gt;
autoload bashcompinit &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; bashcompinit
autoload &lt;span class="nt"&gt;-Uz&lt;/span&gt; compinit &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; compinit
&lt;span class="nb"&gt;complete&lt;/span&gt; &lt;span class="nt"&gt;-C&lt;/span&gt; &lt;span class="s1"&gt;'/usr/local/bin/aws_completer'&lt;/span&gt; aws
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxm24amx3prz7b7wacowu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxm24amx3prz7b7wacowu.png" alt=" " width="800" height="267"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now &lt;code&gt;aws s3&amp;lt;TAB&amp;gt;&lt;/code&gt; shows you all the s3 subcommands. Most popular CLIs (&lt;code&gt;docker&lt;/code&gt;, &lt;code&gt;kubectl&lt;/code&gt;, &lt;code&gt;gh&lt;/code&gt;, &lt;code&gt;npm&lt;/code&gt;) have similar setups. Check their docs.&lt;/p&gt;
&lt;h2&gt;
  
  
  Autosuggestions
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/zsh-users/zsh-autosuggestions" rel="noopener noreferrer"&gt;zsh-autosuggestions&lt;/a&gt; gives you fish-like behavior in ZSH. As you type, it shows a grayed-out suggestion based on your history. Press the right arrow to accept it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpllkeiaffkjy5tsd15ee.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpllkeiaffkjy5tsd15ee.png" alt=" " width="800" height="267"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Give it a few days and you won't be able to go back.&lt;/p&gt;
&lt;h2&gt;
  
  
  Syntax highlighting
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/zsh-users/zsh-syntax-highlighting" rel="noopener noreferrer"&gt;zsh-syntax-highlighting&lt;/a&gt; highlights your commands as you type. Valid commands go green, invalid go red. It's instant feedback before you even hit enter.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbpedbeii4ec59ynt2fhd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbpedbeii4ec59ynt2fhd.png" alt=" " width="800" height="267"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You catch typos before you hit enter. That's it, that's the sell.&lt;/p&gt;
&lt;h2&gt;
  
  
  Command buffering
&lt;/h2&gt;

&lt;p&gt;Kick off a long-running command like &lt;code&gt;pnpm i&lt;/code&gt;, then just type your next command and hit enter. ZSH buffers it and runs it when the first one finishes.&lt;/p&gt;

&lt;p&gt;You're typing blind so typos happen, but it beats waiting around.&lt;/p&gt;
&lt;h2&gt;
  
  
  Terminal clearing
&lt;/h2&gt;

&lt;p&gt;Two quick ones:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;clear&lt;/code&gt; (or &lt;code&gt;Ctrl + L&lt;/code&gt;) - clears the screen but keeps scrollback&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Cmd + K&lt;/code&gt; - nukes everything including scrollback&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I use &lt;code&gt;Cmd + K&lt;/code&gt; when I want a clean slate and &lt;code&gt;clear&lt;/code&gt; when I just want visual breathing room.&lt;/p&gt;
&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;p&gt;Here's everything linked in one place:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/ohmyzsh/ohmyzsh" rel="noopener noreferrer"&gt;Oh My ZSH&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/junegunn/fzf" rel="noopener noreferrer"&gt;Fuzzy Finder (fzf)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/zsh-users/zsh-autosuggestions" rel="noopener noreferrer"&gt;zsh-autosuggestions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/zsh-users/zsh-syntax-highlighting" rel="noopener noreferrer"&gt;zsh-syntax-highlighting&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/a/5542996" rel="noopener noreferrer"&gt;Terminal Motions Reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://scriptingosx.com/2019/07/moving-to-zsh-part-5-completions" rel="noopener noreferrer"&gt;Tab Completion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;That's my setup. Most of these take under a minute to install and will save you hours over time. If you found this useful, feel free to follow me for more dev tooling tips.&lt;/p&gt;

&lt;p&gt;Happy coding 😀!&lt;/p&gt;

&lt;p&gt;Also follow AWS for more articles like this&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__user ltag__user__id__1726"&gt;
  &lt;a href="/aws" class="ltag__user__link profile-image-link"&gt;
    &lt;div class="ltag__user__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=150,height=150,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F1726%2F2a73f1e6-7995-4348-ae37-44b064274c59.png" alt="aws image"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
      &lt;a href="/aws" class="ltag__user__link"&gt;AWS&lt;/a&gt;
      Follow
    &lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a href="/aws" class="ltag__user__link"&gt;
        Articles written by current and past AWS Developer Advocates to help people interested in building on AWS. Opinions are each author's own.
      &lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;



</description>
      <category>productivity</category>
      <category>cli</category>
      <category>zsh</category>
    </item>
    <item>
      <title>S3 Account Regional Namespaces with CDK</title>
      <dc:creator>Sean Boult</dc:creator>
      <pubDate>Tue, 12 May 2026 19:07:20 +0000</pubDate>
      <link>https://dev.to/aws/s3-bucket-regional-namespaces-with-cdk-3j86</link>
      <guid>https://dev.to/aws/s3-bucket-regional-namespaces-with-cdk-3j86</guid>
      <description>&lt;p&gt;&lt;strong&gt;THIS HAS BEEN PATCHED AND THE WORKAROUND IS NO LONGER NEEDED 🙌&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you are using &lt;a href="https://github.com/aws/aws-cdk/releases/tag/v2.256.0" rel="noopener noreferrer"&gt;aws-cdk-lib@2.256.0&lt;/a&gt; or newer you should be able to use both &lt;code&gt;bucketNamePrefix&lt;/code&gt; and &lt;code&gt;bucketNamespace&lt;/code&gt; with the native &lt;a href="https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_s3-readme.html" rel="noopener noreferrer"&gt;L2 Bucket construct&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;So you learned about the new &lt;a href="https://aws.amazon.com/blogs/aws/introducing-account-regional-namespaces-for-amazon-s3-general-purpose-buckets/" rel="noopener noreferrer"&gt;S3 bucket account regional namespace&lt;/a&gt; feature and you're thinking "this is amazing, let me try in CDK."&lt;/p&gt;

&lt;p&gt;Well... This is where you'll learn that the &lt;a href="https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_s3.Bucket.html" rel="noopener noreferrer"&gt;L2 Bucket construct&lt;/a&gt; has not yet been updated to allow for this. &lt;/p&gt;

&lt;p&gt;Currently there are the following items which are tracking the long term fix.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/aws/aws-cdk/issues/37760" rel="noopener noreferrer"&gt;Issue aws/aws-cdk#37760&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/aws/aws-cdk/pull/37386" rel="noopener noreferrer"&gt;PR aws/aws-cdk#37386&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You should give both of these a 👍 to help them get prioritized and shipped. &lt;/p&gt;

&lt;h2&gt;
  
  
  Workaround
&lt;/h2&gt;

&lt;p&gt;Good news there is a workaround! By using the L1 construct as an escape hatch we can then pass in &lt;code&gt;bucketNamePrefix&lt;/code&gt; and &lt;code&gt;bucketNamespace&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;cdk&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;aws-cdk-lib&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Construct&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;constructs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;s3&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;aws-cdk-lib/aws-s3&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Cdk101Stack&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;cdk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Stack&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Construct&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="nx"&gt;cdk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;StackProps&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// WORKAROUND: use the L1 bucket construct&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;s3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;CfnBucket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ConfigBucket&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;bucketNamePrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;config&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;bucketNamespace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;account-regional&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;After deploying this you'll see your new bucket with &lt;code&gt;{name}-{account}-{region}-an&lt;/code&gt; (the an suffix indicates account namespace).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff6lb1dlx5m0o1pm2rod9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff6lb1dlx5m0o1pm2rod9.png" alt=" " width="800" height="80"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That will work if you only need to deploy the bucket. But if you need an L2 reference (&lt;code&gt;IBucket&lt;/code&gt;), use &lt;code&gt;s3.Bucket.fromCfnBucket&lt;/code&gt; to convert it. &lt;/p&gt;

&lt;p&gt;Full code demo:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;cdk&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;aws-cdk-lib&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Construct&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;constructs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;s3&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;aws-cdk-lib/aws-s3&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;s3deploy&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;aws-cdk-lib/aws-s3-deployment&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;path&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Cdk101Stack&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;cdk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Stack&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Construct&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="nx"&gt;cdk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;StackProps&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// NOTE: workaround for the following CDK issues&lt;/span&gt;
    &lt;span class="c1"&gt;// https://github.com/aws/aws-cdk/issues/37760&lt;/span&gt;
    &lt;span class="c1"&gt;// https://github.com/aws/aws-cdk/pull/37386&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cfnBucket&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;s3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;CfnBucket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ConfigBucket&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;bucketNamePrefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;config&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;bucketNamespace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;account-regional&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;bucket&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;s3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Bucket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fromCfnBucket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cfnBucket&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Upload a config file to the bucket on deploy&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;s3deploy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;BucketDeployment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;DeployConfig&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;sources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;s3deploy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Source&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;asset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../config&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))],&lt;/span&gt;
      &lt;span class="na"&gt;destinationBucket&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;bucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;p&gt;Hope this blog helped you get a workaround for now and once &lt;a href="https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib-readme.html" rel="noopener noreferrer"&gt;aws-cdk-lib&lt;/a&gt; is patched I'll update this blog.&lt;/p&gt;

&lt;p&gt;Happy coding 😃!&lt;/p&gt;

&lt;p&gt;Follow AWS for more articles like this&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__user ltag__user__id__1726"&gt;
  &lt;a href="/aws" class="ltag__user__link profile-image-link"&gt;
    &lt;div class="ltag__user__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=150,height=150,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F1726%2F2a73f1e6-7995-4348-ae37-44b064274c59.png" alt="aws image"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
      &lt;a href="/aws" class="ltag__user__link"&gt;AWS&lt;/a&gt;
      Follow
    &lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a href="/aws" class="ltag__user__link"&gt;
        Articles written by current and past AWS Developer Advocates to help people interested in building on AWS. Opinions are each author's own.
      &lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;



</description>
      <category>aws</category>
      <category>cdk</category>
      <category>devops</category>
    </item>
    <item>
      <title>Embed These Websites In Your Blog Today</title>
      <dc:creator>Sean Boult</dc:creator>
      <pubDate>Thu, 07 May 2026 18:34:41 +0000</pubDate>
      <link>https://dev.to/aws/embed-these-websites-in-your-blog-today-286p</link>
      <guid>https://dev.to/aws/embed-these-websites-in-your-blog-today-286p</guid>
      <description>&lt;p&gt;I stumbled onto the DEV &lt;a href="https://dev.to/p/editor_guide#supported-url-embeds-list"&gt;supported URL embeds list&lt;/a&gt;, which revealed some interesting supported platforms.&lt;/p&gt;

&lt;p&gt;You'll want to refer to the link above to figure out the syntax for the DEV specific ones but most are just:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight liquid"&gt;&lt;code&gt;&lt;span class="cp"&gt;{%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;embed&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;url&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;%}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;If you would like to jump around.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;asciinema&lt;/li&gt;
&lt;li&gt;StackBlitz&lt;/li&gt;
&lt;li&gt;GitHub&lt;/li&gt;
&lt;li&gt;X/Twitter&lt;/li&gt;
&lt;li&gt;YouTube&lt;/li&gt;
&lt;li&gt;DEV specific&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  &lt;a href="https://asciinema.org" rel="noopener noreferrer"&gt;asciinema&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;A video-like player which is so cool because you can actually pause it and copy the text from it.&lt;/p&gt;


&lt;div class="ltag_asciinema"&gt;
  
&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;a href="https://stackblitz.com" rel="noopener noreferrer"&gt;StackBlitz&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Interactive code editor right in a blog post 😍. Seems like the embedded terminal and preview will fail due to some &lt;code&gt;postMessage&lt;/code&gt; shenanigans, but perhaps it can be fixed.&lt;/p&gt;

&lt;p&gt;&lt;iframe src="https://stackblitz.com/edit/vitejs-vite-48u9w2no?file=src%2FApp.tsx&amp;amp;view=editor" width="100%" height="500"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://github.com" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;It supports rendering the README to give some brief context with a CTA to open the repo.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/strands-agents" rel="noopener noreferrer"&gt;
        strands-agents
      &lt;/a&gt; / &lt;a href="https://github.com/strands-agents/sdk-typescript" rel="noopener noreferrer"&gt;
        sdk-typescript
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A model-driven approach to building AI agents in just a few lines of code. 
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div&gt;
  &lt;div&gt;
    &lt;a href="https://strandsagents.com" rel="nofollow noopener noreferrer"&gt;
      &lt;img src="https://camo.githubusercontent.com/1cf2d94f5ad881d696cc58b3ffad81acf923846f6c5132f56d6a355ebbb9d6a5/68747470733a2f2f737472616e64736167656e74732e636f6d2f6c61746573742f6173736574732f6c6f676f2d6769746875622e737667" alt="Strands Agents" width="55px" height="105px"&gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;
    Strands Agents - TypeScript SDK
  &lt;/h1&gt;
&lt;/div&gt;
  &lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;
    A model-driven approach to building AI agents in TypeScript/JavaScript
  &lt;/h2&gt;
&lt;/div&gt;
  &lt;div&gt;
    &lt;a href="https://github.com/strands-agents/sdk-typescript/graphs/commit-activity" rel="noopener noreferrer"&gt;&lt;img alt="GitHub commit activity" src="https://camo.githubusercontent.com/8821bd0b3888f85c4a98c53352d041c4f739503a337ee8c8a4875cd3188b998f/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6d6d69742d61637469766974792f6d2f737472616e64732d6167656e74732f73646b2d74797065736372697074"&gt;&lt;/a&gt;
    &lt;a href="https://github.com/strands-agents/sdk-typescript/issues" rel="noopener noreferrer"&gt;&lt;img alt="GitHub open issues" src="https://camo.githubusercontent.com/cda88797d49d9b5fbdc6adf4b2653ab119f098575d4cd890075e2ede90d39a76/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732f737472616e64732d6167656e74732f73646b2d74797065736372697074"&gt;&lt;/a&gt;
    &lt;a href="https://github.com/strands-agents/sdk-typescript/pulls" rel="noopener noreferrer"&gt;&lt;img alt="GitHub open pull requests" src="https://camo.githubusercontent.com/b97af830b461ced88f0c8d3a1131e8e97ef484357fc50cc9207bb80b40661893/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732d70722f737472616e64732d6167656e74732f73646b2d74797065736372697074"&gt;&lt;/a&gt;
    &lt;a href="https://github.com/strands-agents/sdk-typescript/blob/main/LICENSE.APACHE" rel="noopener noreferrer"&gt;&lt;img alt="License" src="https://camo.githubusercontent.com/0c123f3b067b77f5b9daffb5702a6465f7b31a8592c15b115f0ff751dfb21300/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f737472616e64732d6167656e74732f73646b2d74797065736372697074"&gt;&lt;/a&gt;
    &lt;a href="https://www.npmjs.com/package/@strands-agents/sdk" rel="nofollow noopener noreferrer"&gt;&lt;img alt="NPM Version" src="https://camo.githubusercontent.com/f5536192be00821a49a2cef74506f8a603018b1ff32f3bd3fc1c257d64b74e64/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f40737472616e64732d6167656e74732f73646b"&gt;&lt;/a&gt;
    &lt;a href="https://discord.gg/strands" rel="nofollow noopener noreferrer"&gt;&lt;img alt="Strands Discord" src="https://camo.githubusercontent.com/f09e977a820d4079f7027dc8c6cc2203d606fb6fbaf7a3ba6db7849fc8a1203a/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f446973636f72642d537472616e64732d3538363546323f6c6f676f3d646973636f7264266c6f676f436f6c6f723d7768697465"&gt;&lt;/a&gt;
  &lt;/div&gt;
  &lt;p&gt;
    &lt;a href="https://strandsagents.com/" rel="nofollow noopener noreferrer"&gt;Documentation&lt;/a&gt;
    ◆ &lt;a href="https://github.com/strands-agents/samples" rel="noopener noreferrer"&gt;Samples&lt;/a&gt;
    ◆ &lt;a href="https://github.com/strands-agents/sdk-python" rel="noopener noreferrer"&gt;Python SDK&lt;/a&gt;
    ◆ &lt;a href="https://github.com/strands-agents/tools" rel="noopener noreferrer"&gt;Tools&lt;/a&gt;
    ◆ &lt;a href="https://github.com/strands-agents/agent-builder" rel="noopener noreferrer"&gt;Agent Builder&lt;/a&gt;
    ◆ &lt;a href="https://github.com/strands-agents/mcp-server" rel="noopener noreferrer"&gt;MCP Server&lt;/a&gt;
  &lt;/p&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Overview&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Strands Agents is a simple yet powerful SDK that takes a model-driven approach to building and running AI agents. The TypeScript SDK brings key features from the Python Strands framework to Node.js environments, enabling type-safe agent development for everything from simple assistants to complex workflows.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Key Features&lt;/h3&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;🪶 Lightweight &amp;amp; Flexible&lt;/strong&gt;: Simple agent loop that works seamlessly in Node.js and browser environments&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🔒 Type-Safe Tools&lt;/strong&gt;: Define tools easily using Zod schemas for robust input validation and type inference&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;📋 Structured Output&lt;/strong&gt;: Get type-safe, validated responses from LLMs using Zod schemas with automatic retry on validation errors&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🔌 Model Agnostic&lt;/strong&gt;: First-class support for Amazon Bedrock and OpenAI, with extensible architecture for custom providers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🔗 Built-in MCP&lt;/strong&gt;: Native…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/strands-agents/sdk-typescript" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h3&gt;
  
  
  &lt;a href="https://x.com" rel="noopener noreferrer"&gt;X/Twitter&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Useful when a tweet has some context you want to reference.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-2052162536301072643-169" src="https://platform.twitter.com/embed/Tweet.html?id=2052162536301072643"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-2052162536301072643-169');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=2052162536301072643&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://www.youtube.com" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Video is king 👑. However, I'd probably reach for the "Cover Video Link" feature, where you can have the video be your banner instead of an image.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/NJ6F0atWKpM"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  DEV specific
&lt;/h2&gt;

&lt;p&gt;These are some of the custom things that DEV supports outside of third party site embeds.&lt;/p&gt;

&lt;p&gt;Article Link:&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/aws/stop-reaching-for-python-strands-agents-typescript-sdk-just-hit-10-4lk6" class="crayons-story__hidden-navigation-link"&gt;Stop Reaching for Python: Strands Agents TypeScript SDK Just Hit 1.0&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;
          &lt;a class="crayons-logo crayons-logo--l" href="/aws"&gt;
            &lt;img alt="AWS logo" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F1726%2F2a73f1e6-7995-4348-ae37-44b064274c59.png" class="crayons-logo__image" width="320" height="320"&gt;
          &lt;/a&gt;

          &lt;a href="/erikch" class="crayons-avatar  crayons-avatar--s absolute -right-2 -bottom-2 border-solid border-2 border-base-inverted  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1994%2F0j84YwMs.jpeg" alt="erikch profile" class="crayons-avatar__image" width="208" height="208"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/erikch" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Erik Hanchett
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Erik Hanchett
                
              
              &lt;div id="story-author-preview-content-3610948" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/erikch" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1994%2F0j84YwMs.jpeg" class="crayons-avatar__image" alt="" width="208" height="208"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Erik Hanchett&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

            &lt;span&gt;
              &lt;span class="crayons-story__tertiary fw-normal"&gt; for &lt;/span&gt;&lt;a href="/aws" class="crayons-story__secondary fw-medium"&gt;AWS&lt;/a&gt;
            &lt;/span&gt;
          &lt;/div&gt;
          &lt;a href="https://dev.to/aws/stop-reaching-for-python-strands-agents-typescript-sdk-just-hit-10-4lk6" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;May 4&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/aws/stop-reaching-for-python-strands-agents-typescript-sdk-just-hit-10-4lk6" id="article-link-3610948"&gt;
          Stop Reaching for Python: Strands Agents TypeScript SDK Just Hit 1.0
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/typescript"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;typescript&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/aws"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;aws&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/agents"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;agents&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/aws/stop-reaching-for-python-strands-agents-typescript-sdk-just-hit-10-4lk6" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/raised-hands-74b2099fd66a39f2d7eed9305ee0f4553df0eb7b4f11b01b6b1b499973048fe5.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;19&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/aws/stop-reaching-for-python-strands-agents-typescript-sdk-just-hit-10-4lk6#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              1&lt;span class="hidden s:inline"&gt;&amp;nbsp;comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            8 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


&lt;p&gt;User Profile:&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__user ltag__user__id__735825"&gt;
    &lt;a href="/brooke_jamieson" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=150,height=150,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F735825%2F6ede452c-440e-4a66-af2f-7ef5ab91eaa2.jpeg" alt="brooke_jamieson image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/brooke_jamieson"&gt;Brooke Jamieson&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/brooke_jamieson"&gt;🌥️ I’ll teach you tech tips in bite sized videos
📣 Keynote Speaker
👩🏻‍💻 AI/ML Specialist
💼 AWS Sr Developer Advocate (views are my own)
🇦🇺AU ➡️ NYC🗽&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Tag Profile:&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__tag ltag__tag__id__397"&gt;
    &lt;div class="ltag__tag__content"&gt;
      &lt;h2&gt;#&lt;a href="https://dev.to/t/aws" class="ltag__tag__link"&gt;aws&lt;/a&gt; Follow
&lt;/h2&gt;
      &lt;div class="ltag__tag__summary"&gt;
        Amazon Web Services (AWS) is a collection of web services for computing, storage, machine learning, security, and more

There are over 200+ AWS services as of 2023.
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Comment:&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__comment crayons-card my-2 p-0 overflow-hidden"&gt;
    &lt;a href="https://dev.to/aws/what-even-is-ai-i-took-a-break-had-to-relearn-everything-3dpj" class="flex items-center gap-2 p-3 fs-s color-base-60 hover:color-base-90"&gt;
      

      &lt;span&gt;Comment on &lt;strong class="fw-medium color-base-90"&gt;What Even Is AI? (I Took a Break &amp;amp; Had to Relearn Everything)&lt;/strong&gt;&lt;/span&gt;
    &lt;/a&gt;
  &lt;div class="p-4"&gt;
    &lt;div class="flex items-center gap-2 mb-3"&gt;
      &lt;a href="/jess" class="crayons-avatar crayons-avatar--l"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F264%2Fb75f6edf-df7b-406e-a56b-43facafb352c.jpg" alt="jess" class="crayons-avatar__image" width="400" height="400"&gt;
      &lt;/a&gt;
      &lt;div&gt;
        &lt;a href="/jess" class="crayons-link fw-medium"&gt;Jess Lee&lt;/a&gt;
        &lt;span class="fs-xs color-base-60 ml-1"&gt;May 5&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="text-styles"&gt;
      &lt;blockquote&gt;
&lt;p&gt;I just came back from maternity leave. And honestly? I felt like I'd missed a decade in six months.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I feel this so hard.&lt;/p&gt;

&lt;p&gt;Looking forward to your series!&lt;/p&gt;


    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Podcast Episode:&lt;br&gt;
&lt;/p&gt;
&lt;div class="podcastliquidtag"&gt;
  &lt;div class="podcastliquidtag__info"&gt;
    &lt;a href="/awsbites/120-lambda-best-practices"&gt;
      &lt;h1 class="podcastliquidtag__info__episodetitle"&gt;120. Lambda Best Practices&lt;/h1&gt;
    &lt;/a&gt;
    &lt;a href="/awsbites"&gt;
      &lt;h2 class="podcastliquidtag__info__podcasttitle"&gt;
        AWS Bites
      &lt;/h2&gt;
    &lt;/a&gt;
  &lt;/div&gt;
  &lt;div id="record-120-lambda-best-practices" class="podcastliquidtag__record"&gt;
    &lt;img class="button play-butt" id="play-butt-120-lambda-best-practices" src="https://assets.dev.to/assets/playbutt-5e444a2eae28832efea0dec3342ccf28a228b326c47f46700d771801f75d6b88.png" alt="play"&gt;
    &lt;img class="button pause-butt" id="pause-butt-120-lambda-best-practices" src="https://assets.dev.to/assets/pausebutt-bba7cb5f432cfb16510e78835378fa22f45fa6ae52a624f7c9794fefa765c384.png" alt="pause"&gt;
    &lt;img class="podcastliquidtag__podcastimage" id="podcastimage-120-lambda-best-practices" alt="AWS Bites" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fpodcast%2Fimage%2F674%2F056236bd-d6bf-4665-9ef1-ec6e3009420d.png"&gt;
  &lt;/div&gt;

  &lt;div class="hidden-audio" id="hidden-audio-120-lambda-best-practices"&gt;
  
    
    Your browser does not support the audio element.
  
  &lt;div id="progressBar" class="audio-player-display"&gt;
    &lt;a href="/awsbites/120-lambda-best-practices"&gt;
      &lt;img id="episode-profile-image" alt="120. Lambda Best Practices" width="420" height="420" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fpodcast%2Fimage%2F674%2F056236bd-d6bf-4665-9ef1-ec6e3009420d.png"&gt;
      &lt;img id="animated-bars" src="https://assets.dev.to/assets/animated-bars-4e8c57c8b58285fcf7d123680ad8af034cd5cd43b4d9209fe3aab49d1e9d77b3.gif" alt="animated volume bars"&gt;
    &lt;/a&gt;
    &lt;span id="barPlayPause"&gt;
      &lt;img class="butt play-butt" alt="play" src="https://assets.dev.to/assets/playbutt-5e444a2eae28832efea0dec3342ccf28a228b326c47f46700d771801f75d6b88.png"&gt;
      &lt;img class="butt pause-butt" alt="pause" src="https://assets.dev.to/assets/pausebutt-bba7cb5f432cfb16510e78835378fa22f45fa6ae52a624f7c9794fefa765c384.png"&gt;
    &lt;/span&gt;
    &lt;span id="volume"&gt;
      &lt;span id="volumeindicator" class="volume-icon-wrapper showing"&gt;
        &lt;span id="volbutt"&gt;
          &lt;img alt="volume" class="icon-img" height="16" width="16" src="https://assets.dev.to/assets/volume-cd20707230ae3fc117b02de53c72af742cf7d666007e16e12f7ac11ebd8130a7.png"&gt;
        &lt;/span&gt;
        &lt;span class="range-wrapper"&gt;
          
        &lt;/span&gt;
      &lt;/span&gt;
      &lt;span id="mutebutt" class="volume-icon-wrapper hidden"&gt;
        &lt;img alt="volume-mute" class="icon-img" height="16" width="16" src="https://assets.dev.to/assets/volume-mute-8f08ec668105565af8f8394eb18ab63acb386adbe0703afe3748eca8f2ecbf3b.png"&gt;
      &lt;/span&gt;
      &lt;span class="speed" id="speed"&gt;1x&lt;/span&gt;
    &lt;/span&gt;
    &lt;span class="buffer-wrapper" id="bufferwrapper"&gt;
      &lt;span id="buffer"&gt;&lt;/span&gt;
      &lt;span id="progress"&gt;&lt;/span&gt;
      &lt;span id="time"&gt;initializing...&lt;/span&gt;
      &lt;span id="closebutt"&gt;×&lt;/span&gt;
    &lt;/span&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


&lt;p&gt;Organization:&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__user ltag__user__id__1726"&gt;
  &lt;a href="/aws" class="ltag__user__link profile-image-link"&gt;
    &lt;div class="ltag__user__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=150,height=150,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F1726%2F2a73f1e6-7995-4348-ae37-44b064274c59.png" alt="aws image"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
      &lt;a href="/aws" class="ltag__user__link"&gt;AWS&lt;/a&gt;
      Follow
    &lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a href="/aws" class="ltag__user__link"&gt;
        Articles written by current and past AWS Developer Advocates to help people interested in building on AWS. Opinions are each author's own.
      &lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Well, this one is not a website, but it's useful when you want to add some CTA at the end of a blog.&lt;/p&gt;

&lt;p&gt;Buttons:&lt;br&gt;
&lt;a href="https://x.com/AWSDevelopers" class="crayons-btn crayons-btn--primary" rel="noopener noreferrer"&gt;View @AWSDevelopers on X/Twitter 💻&lt;/a&gt;
&lt;br&gt;
—&lt;br&gt;
&lt;a href="https://builder.aws.com/?trk=02c7b25c-78f4-4968-8fa2-241bdf0bcf97&amp;amp;sc_channel=el" class="crayons-btn crayons-btn--primary" rel="noopener noreferrer"&gt;Visit AWS Builder Center&lt;/a&gt;
&lt;/p&gt;




&lt;p&gt;Let me know what your favorite embed is or if I'm missing any amazing ones in the comments. &lt;/p&gt;

&lt;p&gt;Happy coding 👨‍💻!&lt;/p&gt;

</description>
      <category>devto</category>
      <category>todayilearned</category>
      <category>howtodev</category>
    </item>
    <item>
      <title>{% embed https://dev.to/hacksore %}</title>
      <dc:creator>Sean Boult</dc:creator>
      <pubDate>Thu, 07 May 2026 02:18:21 +0000</pubDate>
      <link>https://dev.to/hacksore/-embed-httpsdevtohacksore--ho1</link>
      <guid>https://dev.to/hacksore/-embed-httpsdevtohacksore--ho1</guid>
      <description>&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://dev.to/hacksore" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3otvb2z646ytpt1hl2rv.jpg" height="400" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://dev.to/hacksore" rel="noopener noreferrer" class="c-link"&gt;
            Sean Boult - DEV Community
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Developer. Hacker. Creator.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8j7kvp660rqzt99zui8e.png" width="300" height="299"&gt;
          dev.to
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


</description>
      <category>automation</category>
      <category>github</category>
      <category>opensource</category>
      <category>tooling</category>
    </item>
    <item>
      <title>1Password, GitHub, and Git CLI with Multiple Users</title>
      <dc:creator>Sean Boult</dc:creator>
      <pubDate>Fri, 01 May 2026 23:03:23 +0000</pubDate>
      <link>https://dev.to/hacksore/1password-github-and-git-cli-with-multiple-users-a0j</link>
      <guid>https://dev.to/hacksore/1password-github-and-git-cli-with-multiple-users-a0j</guid>
      <description>&lt;p&gt;Do you use the &lt;a href="https://git-scm.com/" rel="noopener noreferrer"&gt;git&lt;/a&gt;, &lt;a href="https://cli.github.com/" rel="noopener noreferrer"&gt;github&lt;/a&gt;, and &lt;a href="https://developer.1password.com/docs/cli/" rel="noopener noreferrer"&gt;1password&lt;/a&gt; CLI? I do!&lt;/p&gt;

&lt;p&gt;I want to be able to act as different users in certain directories to support my personal projects (&lt;code&gt;~/code&lt;/code&gt;) and my work projects (&lt;code&gt;~/oss&lt;/code&gt;) automatically, because, you know, developers automate everything.&lt;/p&gt;

&lt;p&gt;This means I want to be able to run &lt;code&gt;gh&lt;/code&gt; commands as the correct user, as well as have &lt;code&gt;git&lt;/code&gt; commands pick the correct SSH key.&lt;/p&gt;

&lt;p&gt;If you want to have a single dotfiles repo for both work and personal development, this should give you something to follow.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ If you use a single GitHub account for everything, this article might not be very helpful for you.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Tools you’ll need to make all this work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.1password.com/docs/cli/" rel="noopener noreferrer"&gt;1Password CLI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://git-scm.com/install" rel="noopener noreferrer"&gt;Git CLI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cli.github.com/" rel="noopener noreferrer"&gt;GitHub CLI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You’ll also want to designate some folders to hold projects. This guide will use the following structure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;~/code&lt;/code&gt; - where I do personal development on my personal machine&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;~/oss&lt;/code&gt; - where I do all my work open source code (repros, demos, etc.)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  1) Set a global default (personal)
&lt;/h3&gt;

&lt;p&gt;In &lt;code&gt;~/.gitconfig&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[user]&lt;/span&gt;
    &lt;span class="py"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;Sean Boult&lt;/span&gt;
    &lt;span class="py"&gt;email&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;996134+Hacksore@users.noreply.github.com&lt;/span&gt;

&lt;span class="nn"&gt;[includeIf "gitdir:~/oss/"]&lt;/span&gt;
    &lt;span class="py"&gt;path&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;~/.gitconfig-work&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So we’ve added the default user in the &lt;code&gt;[user]&lt;/code&gt; block and added an &lt;code&gt;includeIf&lt;/code&gt; (&lt;a href="https://git-scm.com/docs/git-config#Documentation/git-config.txt-includeIfconditionpath" rel="noopener noreferrer"&gt;docs&lt;/a&gt;) block that specifies that inside &lt;code&gt;~/oss&lt;/code&gt; we’ll make sure to load the config options in &lt;code&gt;~/.gitconfig-work&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Given that you need to be “inside a git directory” based on the &lt;code&gt;gitdir&lt;/code&gt; clause, it means that &lt;code&gt;~/oss&lt;/code&gt; should be a valid Git directory.&lt;/p&gt;

&lt;p&gt;To do that, run this in &lt;code&gt;~/oss&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# make ~/oss a valid git repo&lt;/span&gt;
git init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We will also want to create a &lt;code&gt;.gitignore&lt;/code&gt; file to not track anything in this directory.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# ~/oss/.gitignore&lt;/span&gt;
&lt;span class="c"&gt;# Sentinel repo: exists only so includeIf matches when cwd is ~/oss&lt;/span&gt;
&lt;span class="c"&gt;# Ignore all subdirs (they're separate repos)&lt;/span&gt;
&lt;span class="k"&gt;*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2) Put work identity in a separate config
&lt;/h3&gt;

&lt;p&gt;Create &lt;code&gt;~/.gitconfig-work&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt;user]
    name &lt;span class="o"&gt;=&lt;/span&gt; Sean Boult
    email &lt;span class="o"&gt;=&lt;/span&gt; &amp;lt;yourWorkEmail&amp;gt; &lt;span class="c"&gt;# replace this with your email&lt;/span&gt;
    &lt;span class="c"&gt;# optional ssh key signing&lt;/span&gt;
    &lt;span class="c"&gt;# signingkey = ~/.ssh/id_rsa.pub&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3) Make SSH key selection automatic
&lt;/h3&gt;

&lt;p&gt;Now configure SSH so Git will pick the right key based on the repo you are in.&lt;/p&gt;

&lt;p&gt;In &lt;code&gt;~/.ssh/config&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Github and we default personal&lt;/span&gt;
Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_rsa.personal
    IdentitiesOnly &lt;span class="nb"&gt;yes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, in &lt;code&gt;~/.gitconfig-work&lt;/code&gt;, add:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt;core]
    sshCommand &lt;span class="o"&gt;=&lt;/span&gt; ssh &lt;span class="nt"&gt;-i&lt;/span&gt; ~/.ssh/id_rsa &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nv"&gt;IdentitiesOnly&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;yes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At this point:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Any repo elsewhere uses your personal Git identity and personal SSH key.&lt;/li&gt;
&lt;li&gt;Any repo under &lt;code&gt;~/oss&lt;/code&gt; uses your work Git identity and work SSH key.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  1Password CLI Plugin
&lt;/h2&gt;

&lt;p&gt;The next step is to allow the &lt;code&gt;gh&lt;/code&gt; CLI to know what directory you’re in and use the right GitHub PAT (personal access token).&lt;/p&gt;

&lt;p&gt;To put it simply, I have two PATs in my 1Password vault: &lt;code&gt;gh-pat-cli&lt;/code&gt; (personal) and &lt;code&gt;gh-pat-cli-sboult&lt;/code&gt; (work/oss). In the &lt;code&gt;op&lt;/code&gt; setup, instruct 1Password to use the &lt;code&gt;gh-pat-cli-sboult&lt;/code&gt; PAT so that when you’re in &lt;code&gt;~/oss&lt;/code&gt;, it uses the correct PAT to authenticate with the GitHub CLI.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fijf02e26r6nvqaxt18q1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fijf02e26r6nvqaxt18q1.png" alt=" " width="800" height="488"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.1password.com/docs/cli/shell-plugins/github/" rel="noopener noreferrer"&gt;Use 1Password to securely authenticate the GitHub CLI&lt;/a&gt; is a helpful doc if you get stuck.&lt;/p&gt;

&lt;h2&gt;
  
  
  Work repos (&lt;code&gt;~/oss&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/oss

git clone git@github.com:awslabs/mcp.git
&lt;span class="c"&gt;# or&lt;/span&gt;
&lt;span class="c"&gt;# gh repo clone awslabs/mcp&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once the repo is under &lt;code&gt;~/oss/&lt;/code&gt;, Git uses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;your work &lt;code&gt;user.name&lt;/code&gt; / &lt;code&gt;user.email&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;your work SSH key&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then normal commands work:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git remote &lt;span class="nt"&gt;-v&lt;/span&gt;
git push

gh &lt;span class="nb"&gt;pr &lt;/span&gt;list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Personal repos
&lt;/h2&gt;

&lt;p&gt;Outside of &lt;code&gt;~/oss&lt;/code&gt;, everything uses your default (personal) identity.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone git@github.com:Hacksore/test.git
&lt;span class="c"&gt;# or&lt;/span&gt;
&lt;span class="c"&gt;# gh repo clone test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;That’s it! You should now be able to reproduce the setup I have.&lt;/p&gt;

&lt;p&gt;Happy coding 😊!&lt;/p&gt;

</description>
      <category>github</category>
      <category>cli</category>
      <category>1password</category>
      <category>tooling</category>
    </item>
  </channel>
</rss>
