[{"content":" I started this article in 2022 and have forgotten a lot of the additional details I intended to write nearly 4 years ago as of 2026. Rather than leave it in drafts I have decided to at least publish what I had in the hopes of helping anyone else starting out extending a terraform provider. Problem #At my day job we use terraform pretty extensively for all of our infrastructure. We also use terraform along with some other automations to automatically create dashboards and monitors for new teams and services.\nStarting point #Hashicorp provides an excellent tutorial on their learning site on how to write a provider for terraform. Datadog also has some useful instructions on the development process they use for this provider.\nHere is the PR that adds the ability to create a monitor using a JSON document.\nForcing in dev provider #To not use the provider from the registry and instead use a local one under development, create a config file for the terraform cli:\nprovider_installation { dev_overrides { # provider to be overridden, path to new provider. # path must include provider binary with name as it is expected appear # e.g. terraform-provider-datadog \u0026#34;\u0026lt;repository\u0026gt;/\u0026lt;provider-name\u0026gt;\u0026#34; = \u0026#34;/Users/\u0026lt;username\u0026gt;/go/bin/\u0026#34; \u0026#34;Datadog/datadog\u0026#34; = \u0026#34;/Users/spothier/go/github.com/Datadog/datadog-terraformprovider\u0026#34; } direct {} } Force the cli to use this config with TF_CLI_CONFIG_FILE=/path/to/dev.tfrc\nhttps://www.terraform.io/docs/cli/config/config-file.html#development-overrides-for-provider-developers\nDebugging #Add the following to main.go and run with --debug flag:\nfunc main() { var debugMode bool flag.BoolVar(\u0026amp;debugMode, \u0026#34;debug\u0026#34;, false, \u0026#34;set to true to run the provider with support for debuggers like delve\u0026#34;) flag.Parse() opts := \u0026amp;plugin.ServeOpts{ProviderFunc: provider.New} if debugMode { // TODO: update this string with the full name of your provider as used in your configs err := plugin.Debug(context.Background(), \u0026#34;registry.terraform.io/my-org/my-provider\u0026#34;, opts) if err != nil { log.Fatal(err.Error()) } return } plugin.Serve(opts) } This will output something like:\nTF_REATTACH_PROVIDERS=\u0026#39;{\u0026#34;registry.terraform.io/my-org/my-provider\u0026#34;:{\u0026#34;Protocol\u0026#34;:\u0026#34;grpc\u0026#34;,\u0026#34;ProtocolVersion\u0026#34;:5,\u0026#34;Pid\u0026#34;:26460,\u0026#34;Test\u0026#34;:true,\u0026#34;Addr\u0026#34;:{\u0026#34;Network\u0026#34;:\u0026#34;unix\u0026#34;,\u0026#34;String\u0026#34;:\u0026#34;/var/folders/y8/bxwjmbw535n429n5nb7b86y80000gp/T/plugin216655400\u0026#34;}}}\u0026#39; Add/export this when running terraform plan/apply and it will use the running provider\nhttps://www.terraform.io/docs/extend/debugging.html#enabling-debugging-in-a-provider\n","date":"January 5, 2026","permalink":"https://spenser.io/posts/extending-a-terraform-provider.html","section":"Posts","summary":"At my day job I was given the opportunity to contribute to a Terraform provider for datadog to add the ability to create a monitor using a JSON document.","title":"Extending a Terraform Provider"},{"content":"","date":null,"permalink":"https://spenser.io/posts/index.html","section":"Posts","summary":"","title":"Posts"},{"content":"","date":null,"permalink":"https://spenser.io/index.html","section":"Spenser Pothier","summary":"","title":"Spenser Pothier"},{"content":"","date":null,"permalink":"https://spenser.io/tags/cloudflare-pages.html","section":"Tags","summary":"","title":"Cloudflare Pages"},{"content":"Overview #I had an idea during COVID lockdown for an EDH counter app that could be run on each players personal device for keeping track of score while playing remotely. Lockdown eventually ended and I never actually got around to creating the app during that time, but the idea still stuck with me. The app itself always seemed like a relatively simple CRUD app for the most part, so it felt like a pretty good candidate for learning how to thoroughly vibe code. I was able to get to a v1 having only used prompts and writing just a small amount of code that I knew I could do myself faster than figuring out how to phrase a prompt to generate said code.\nSince this project was entirely vibe coded into existence, please also see my position on using LLMs at my /ai page.\nTechnologies Used # Frontend: Vue, Typescript Backend: Go Infrastructure: Cloudflare Pages, Fly.io Tools: Claude Features #Pulled straight from what Claude wrote for the feature list, emojis included\n🎮 Real-time game state synchronization via WebSockets 👥 Support for 2-10 players plus spectator mode 💫 Track life totals, commander damage, poison counters, and custom counters 🎴 Commander selection via Scryfall API 🎲 Random player selection with \u0026ldquo;Chooser\u0026rdquo; feature 📱 Progressive Web App - installable on mobile devices 🔄 Auto-reconnection and game code persistence ","date":"December 15, 2025","permalink":"https://spenser.io/projects/commander-games.html","section":"Projects","summary":"\u003ch2 id=\"overview\" class=\"relative group\"\u003eOverview \u003cspan class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100\"\u003e\u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700\" style=\"text-decoration-line: none !important;\" href=\"#overview\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\u003c/span\u003e\u003c/h2\u003e\u003cp\u003eI had an idea during COVID lockdown for an EDH counter app that could be run on each players personal device for keeping track of score while playing remotely. Lockdown eventually ended and I never actually got around to creating the app during that time, but the idea still stuck with me. The app itself always seemed like a relatively simple CRUD app for the most part, so it felt like a pretty good candidate for learning how to thoroughly vibe code. I was able to get to a v1 having only used prompts and writing just a small amount of code that I knew I could do myself faster than figuring out how to phrase a prompt to generate said code.\u003c/p\u003e","title":"Commander.games"},{"content":"","date":null,"permalink":"https://spenser.io/tags/fly.io.html","section":"Tags","summary":"","title":"Fly.io"},{"content":"","date":null,"permalink":"https://spenser.io/tags/go.html","section":"Tags","summary":"","title":"Go"},{"content":"","date":null,"permalink":"https://spenser.io/tags/llms.html","section":"Tags","summary":"","title":"LLMs"},{"content":"Browse through my projects below.\n","date":null,"permalink":"https://spenser.io/projects/index.html","section":"Projects","summary":"\u003cp\u003eBrowse through my projects below.\u003c/p\u003e","title":"Projects"},{"content":"","date":null,"permalink":"https://spenser.io/tags/index.html","section":"Tags","summary":"","title":"Tags"},{"content":"","date":null,"permalink":"https://spenser.io/tags/typescript.html","section":"Tags","summary":"","title":"Typescript"},{"content":"","date":null,"permalink":"https://spenser.io/tags/vue.html","section":"Tags","summary":"","title":"Vue"},{"content":"","date":null,"permalink":"https://spenser.io/pages/index.html","section":"","summary":"","title":""},{"content":"As of 2026-03-31, here is how I\u0026rsquo;ve used generative AI/LLM tools.\nI have used claude.ai mostly for fixing or creating new things in the theme of this website. Occasionally I\u0026rsquo;ve used it for brainstorming, but anything posted on this website unless explicitly specified otherwise was created by me. I am not anti AI, I am anti big tech and what they have expressed as their goals with this technology. I think LLMs are not without use, and as such will continue to use them cautiously and mostly at my place of employment. I am categorically against using generative technology for creative pursuits because I think being creative is one of the few things that makes us human, and the training data used for image generation was largely used without permission or compensation. As with any topic, there is plenty of naunce and opinions can change over time. If I use one of these tools to code something I will continue to be the one responsible for reviewing it and releasing it for use by others.\nThe point of this page is to let you know that nothing claiming to be written by me on this site is written by an AI/LLM.\nIf this changes in the future, I’ll update this page at this permanent URL: https://spenser.io/ai\nThis page was inspired by https://sive.rs/ai\n","date":null,"permalink":"https://spenser.io/pages/ai.html","section":"","summary":"Usage of AI on this website","title":"AI Usage"},{"content":"In this winter of 2022, where over 30,000 tech workers were laid off in the course of a few weeks I decided to put together a page of tech workers that I would absolutely work with again given the opportunity.\nYou can find the entire list here\n","date":"November 16, 2022","permalink":"https://spenser.io/posts/techie_recommendations.html","section":"Posts","summary":"In this winter of 2022, where 30,000 tech workers were laid off in the course of a few weeks I decided to put together a page of tech workers that I would absolutely work with again given the opportunity.","title":"Techie Recommendations"},{"content":"I enjoy seeing the setups of folks on instagram/reddit/etc., so here is a post that contains my mobile tech setup.\nElectronics # 2020 Macbook Pro M1 13\u0026quot; AirPods Pro iPhone 15 Pro iPad Mini 6th Generation Magic Mouse (or Logitech MX3) Apple Watch Series 6 Bose QC35 II Keychron K7 Ultra-slim Wireless Mechanical Keyboard (and pouch) SteamDeck Anker Dongle Various cables USB-C cables HDMI Other Gear # Roost V3 Laptop Stand Hive Pocket Tom Bihn #My wife and I are huge fans of pretty much everything Tom Bihn, so just gonna group it all together in one section of the gear portion of this post\nBrain Bag Side Kick Freudian Slip Snake Charmer Cache laptop case ","date":"May 2, 2022","permalink":"https://spenser.io/posts/mobile-tech-setup.html","section":"Posts","summary":"I enjoy seeing the setups of folks on instagram/reddit/etc., so here is a post that contains my mobile tech setup.","title":"Mobile Tech Setup"},{"content":"This is a now page\nWhere #Greater Seattle area. I observe the Pacific time zone\nWhat I\u0026rsquo;m playing now # Recently playing What I\u0026rsquo;m Doing Now #Perfecting my mobile work setup. Learning how to use Blender. Camping adventures.\nWhat is on my backlog #More camping adventures, venturing further out and for longer. Lots of books, lots of games.\n","date":null,"permalink":"https://spenser.io/pages/now.html","section":"","summary":"\u003cp\u003eThis is a \u003ca href=\"https://nownownow.com/about\" target=\"_blank\" rel=\"noreferrer\"\u003enow page\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"where\" class=\"relative group\"\u003eWhere \u003cspan class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100\"\u003e\u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700\" style=\"text-decoration-line: none !important;\" href=\"#where\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\u003c/span\u003e\u003c/h2\u003e\u003cp\u003eGreater Seattle area. I observe the \u003ca href=\"https://time.is/Seattle\" target=\"_blank\" rel=\"noreferrer\"\u003ePacific time zone\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"what-im-playing-now\" class=\"relative group\"\u003eWhat I\u0026rsquo;m playing now \u003cspan class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100\"\u003e\u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700\" style=\"text-decoration-line: none !important;\" href=\"#what-im-playing-now\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\u003c/span\u003e\u003c/h2\u003e\n\n\u003cdiv id=\"rp-widget\" aria-live=\"polite\" aria-label=\"Recently playing\"\u003e\n  \n  \u003cdiv class=\"rp-card\"\u003e\n    \u003cdiv class=\"rp-art rp-art--skeleton\"\u003e\u003c/div\u003e\n    \u003cdiv class=\"rp-meta\"\u003e\n      \u003cp class=\"rp-label\"\u003e\n        \u003cspan class=\"rp-pulse\" aria-hidden=\"true\"\u003e\u003c/span\u003e\n        Recently playing\n      \u003c/p\u003e\n      \u003cdiv class=\"rp-skeleton rp-skeleton--title\"\u003e\u003c/div\u003e\n      \u003cdiv class=\"rp-skeleton rp-skeleton--sub\"\u003e\u003c/div\u003e\n      \u003cdiv class=\"rp-skeleton rp-skeleton--sub\" style=\"width: 55%\"\u003e\u003c/div\u003e\n    \u003c/div\u003e\n  \u003c/div\u003e\n\u003c/div\u003e\n\n\u003cstyle\u003e\n  .rp-card {\n    display: flex;\n    gap: 1rem;\n    align-items: center;\n    background: rgba(255, 255, 255, 0.05);\n    border: 1px solid rgba(255, 255, 255, 0.08);\n    border-radius: 12px;\n    padding: 1rem 1.25rem;\n  }\n\n  .rp-art {\n    width: 72px;\n    height: 72px;\n    border-radius: 8px;\n    object-fit: cover;\n    flex-shrink: 0;\n    background: rgba(255, 255, 255, 0.08);\n  }\n\n  .rp-art--skeleton {\n    animation: rp-shimmer 1.4s ease-in-out infinite;\n  }\n\n  .rp-art--fallback {\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    color: rgba(255, 255, 255, 0.3);\n  }\n\n  .rp-meta {\n    flex: 1;\n    min-width: 0;\n    display: flex;\n    flex-direction: column;\n    gap: 3px;\n  }\n\n  .rp-label {\n    font-size: 11px;\n    text-transform: uppercase;\n    letter-spacing: 0.08em;\n    color: rgba(255, 255, 255, 0.4);\n    margin: 0;\n    display: flex;\n    align-items: center;\n    gap: 5px;\n  }\n\n  .rp-pulse {\n    display: inline-block;\n    width: 6px;\n    height: 6px;\n    border-radius: 50%;\n    background: #4ade80;\n    flex-shrink: 0;\n    animation: rp-pulse 2s ease-in-out infinite;\n  }\n\n  .rp-title {\n    font-size: 17px;\n    font-weight: 600;\n    margin: 0;\n    white-space: nowrap;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    color: inherit;\n  }\n\n  .rp-platform {\n    display: inline-flex;\n    align-self: flex-start;\n    font-size: 11px;\n    color: rgba(255, 255, 255, 0.5);\n    background: rgba(255, 255, 255, 0.07);\n    border-radius: 5px;\n    padding: 2px 7px;\n  }\n\n  .rp-stats {\n    display: flex;\n    gap: 12px;\n    flex-wrap: wrap;\n    margin-top: 1px;\n  }\n\n  .rp-stat {\n    font-size: 12px;\n    color: rgba(255, 255, 255, 0.45);\n    display: flex;\n    align-items: center;\n    gap: 4px;\n  }\n\n  .rp-icon {\n    width: 13px;\n    height: 13px;\n    flex-shrink: 0;\n    stroke: currentColor;\n    fill: none;\n    stroke-width: 1.75;\n    stroke-linecap: round;\n    stroke-linejoin: round;\n  }\n\n  .rp-time {\n    font-size: 11px;\n    color: rgba(255, 255, 255, 0.3);\n    margin: 0;\n  }\n\n  .rp-error-note {\n    font-size: 12px;\n    color: rgba(255, 255, 255, 0.3);\n    margin: 0;\n  }\n\n  .rp-skeleton {\n    height: 11px;\n    background: rgba(255, 255, 255, 0.08);\n    border-radius: 4px;\n    animation: rp-shimmer 1.4s ease-in-out infinite;\n  }\n\n  .rp-skeleton--title {\n    height: 17px;\n    width: 65%;\n  }\n\n  .rp-skeleton--sub {\n    width: 42%;\n  }\n\n  @keyframes rp-pulse {\n    0%,\n    100% {\n      opacity: 1;\n    }\n    50% {\n      opacity: 0.3;\n    }\n  }\n\n  @keyframes rp-shimmer {\n    0%,\n    100% {\n      opacity: 0.6;\n    }\n    50% {\n      opacity: 0.2;\n    }\n  }\n\u003c/style\u003e\n\n\n\u003cscript src=\"/js/recently-playing.min.4c3b9c848aaee4f691500af342462221f33a8283419719d575a8cb37c7b5683b.js\" defer\u003e\u003c/script\u003e\n\n\n\u003ch2 id=\"what-im-doing-now\" class=\"relative group\"\u003eWhat I\u0026rsquo;m Doing Now \u003cspan class=\"absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100\"\u003e\u003ca class=\"group-hover:text-primary-300 dark:group-hover:text-neutral-700\" style=\"text-decoration-line: none !important;\" href=\"#what-im-doing-now\" aria-label=\"Anchor\"\u003e#\u003c/a\u003e\u003c/span\u003e\u003c/h2\u003e\u003cp\u003ePerfecting my \n      \n    \u003ca href=\"https://spenser.io/posts/mobile-tech-setup.html\"\u003emobile work setup\u003c/a\u003e.\nLearning how to use \u003ca href=\"https://www.blender.org/\" target=\"_blank\" rel=\"noreferrer\"\u003eBlender\u003c/a\u003e.\nCamping adventures.\u003c/p\u003e","title":"Now"},{"content":"My name is Spenser Pothier (he/him), I live in Seattle, WA and obvserve the Pacific time zone. I help create software on all platforms.\nI currently work as a Site Reliability Engineer.\nI went to the University of Washington - Bothell to pursue a degree in Computing and Software Systems\nI enjoy spending time outdoors hiking and backpacking with my wife. I also enjoy staying at home hanging out with our pets, playing games with friends, and working on improving our house and garden.\nI am always trying to learn new technologies, but lately my focus has been on Go, Terraform, and Kubernetes\n","date":null,"permalink":"https://spenser.io/pages/about.html","section":"","summary":"\u003cp\u003eMy name is Spenser Pothier (he/him), I live in Seattle, WA and obvserve the \u003ca href=\"https://time.is/Seattle\" target=\"_blank\" rel=\"noreferrer\"\u003ePacific time zone\u003c/a\u003e. I help create software on all platforms.\u003c/p\u003e\n\u003cp\u003e\u003ci class='fa fa-briefcase'\u003e\u003c/i\u003e I currently work as a Site Reliability Engineer.\u003c/p\u003e\n\u003cp\u003e\u003ci class='fa fa-graduation-cap'\u003e\u003c/i\u003e I went to the \u003ca href=\"http://uwb.edu/\" target=\"_blank\" rel=\"noreferrer\"\u003eUniversity of Washington - Bothell\u003c/a\u003e to pursue a degree in Computing and Software Systems\u003c/p\u003e\n\u003cp\u003e\u003ci class='fa fa-heart'\u003e\u003c/i\u003e I enjoy spending time outdoors hiking and backpacking with my wife. I also enjoy staying at home hanging out with our pets, playing games with friends, and working on improving our house and garden.\u003c/p\u003e","title":"About Me"},{"content":"Browse through my photo galleries below.\nComing soon!\n","date":null,"permalink":"https://spenser.io/photos/index.html","section":"Photos","summary":"\u003cp\u003eBrowse through my photo galleries below.\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eComing soon!\u003c/em\u003e\u003c/p\u003e","title":"Photos"}]