<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>DevLog &amp;mdash; Attach to Process</title>
    <link>https://devblog.dinobansigan.com/tag:DevLog</link>
    <description>Thoughts and Notes on Software Development</description>
    <pubDate>Thu, 22 Oct 2026 05:14:31 +0000</pubDate>
    <image>
      <url>https://i.snap.as/4wmUdb6N.png</url>
      <title>DevLog &amp;mdash; Attach to Process</title>
      <link>https://devblog.dinobansigan.com/tag:DevLog</link>
    </image>
    <item>
      <title>DevLog – 005: The Write.as Archive Page Generator Is Back</title>
      <link>https://devblog.dinobansigan.com/devlog-005-the-write-as-archive-page-generator-is-back?pk_campaign=rss-feed</link>
      <description>&lt;![CDATA[In my last DevLog, I mentioned that I took down apps.dinobansigan.com, and with it, the Write.as Archive Page Generator. I said I was letting it go. Well, that lasted about two months.&#xA;&#xA;So, I went to update one of my other blogs recently, and realized the archive page on it was way out of date. The tool I used to update it was gone. Turns out I still needed it after all.&#xA;&#xA;Why it can&#39;t just be a website&#xA;&#xA;The old version was a Blazor WASM app. Since it ran in the browser, it couldn&#39;t call the Write.as API directly because of CORS. My workaround was to write my own API for the Blazor app to call, running as an Azure App Service. That API ran on free Azure credits that I&#39;ve since lost access to.&#xA;&#xA;I didn&#39;t want to host something again, since that means paying for it. And I didn&#39;t want to fight CORS again either. So this time around, the answer was an app that runs locally on my own machine. CORS only applies to browsers, so a regular app can call the Write.as API just fine.&#xA;&#xA;Rebuilding it with Claude Code&#xA;&#xA;I rebuilt this one with Claude Code. I treated it like pairing with another developer. Claude wrote most of the code, and I reviewed every change before it went in. Good news was, I still had the source code for both the old Blazor app and the API on my machine, so we had something to work off of. We ended up with a simple .NET console app. You run it with your blog&#39;s alias, and it spits out the HTML for your archive page. Same output as before, same CSS classes, so if you customized the look of your archive page, it should still work.&#xA;&#xA;It still uses my WriteAs.NET library to talk to the Write.as API. But we swapped out CommonMark.NET and HtmlAgilityPack for Markdig, which turns the Markdown of untitled posts into plain text in a single line of code. CommonMark.NET hasn&#39;t been updated in years, so it was time anyway. Going through my old code also turned up a few bugs, like the app crashing on short untitled posts. Oops.&#xA;&#xA;From reading through the old code to having a working app up on GitHub, the whole thing took one afternoon.&#xA;&#xA;Rate limiting&#xA;&#xA;The biggest surprise was that Write.as now heavily rate limits calls to its API. And because of how I wrote WriteAs.NET, a rate limited call just comes back empty instead of throwing an error. So the first test run fetched 20 out of 55 posts, and would have happily given me an incomplete archive page without me knowing.&#xA;&#xA;The fix was to slow things down. The app now waits 10 seconds between each page of posts, retries if it still gets rate limited, and checks the number of posts it got against what the blog says it has. It&#39;s slow, but it gets all of them. Funny enough, that&#39;s an improvement over the old version, which used to time out on blogs with a lot of posts. An API key would probably help with the rate limiting, but I don&#39;t have one set up right now.&#xA;&#xA;There was also a bug in the new version where some emojis in post titles showed up as code instead of the actual emoji. That one got fixed real quick.&#xA;&#xA;It&#39;s on GitHub&#xA;&#xA;Back in 2022, I said I&#39;d share the source code for the WPF version of this tool if there was enough interest. This time around, I&#39;m just putting it out there: writeas-archive-generator. It&#39;s a console app, so no pretty UI, but it does the job. You&#39;ll need the .NET 10 SDK to run it, and the README has all the details.&#xA;&#xA;Eventually, I want to build a Windows desktop app with a UI for it. But for now, this works, and my archive page is up to date again. Thanks for reading, and I&#39;ll catch you in the next DevLog.&#xA;&#xA;Tags: #DevLog #ClaudeCode #DotNet #CSharp #WriteAs #WriteAsNet&#xA;&#xA;!--emailsub--&#xA;&#xA;a href=&#34;https://remark.as/p/devblog.dinobansigan.com/devlog-005-the-write-as-archive-page-generator-is-back&#34;Discuss.../a or leave a comment below.]]&gt;</description>
      <content:encoded><![CDATA[<p>In my <a href="https://devblog.dinobansigan.com/devlog-004">last DevLog</a>, I mentioned that I took down apps.dinobansigan.com, and with it, the Write.as Archive Page Generator. I said I was letting it go. Well, that lasted about two months.</p>

<p>So, I went to update one of my other blogs recently, and realized the archive page on it was way out of date. The tool I used to update it was gone. Turns out I still needed it after all.</p>

<h2 id="why-it-can-t-just-be-a-website">Why it can&#39;t just be a website</h2>

<p>The old version was a Blazor WASM app. Since it ran in the browser, it couldn&#39;t call the Write.as API directly because of CORS. My workaround was to write my own API for the Blazor app to call, running as an Azure App Service. That API ran on free Azure credits that I&#39;ve since lost access to.</p>

<p>I didn&#39;t want to host something again, since that means paying for it. And I didn&#39;t want to fight CORS again either. So this time around, the answer was an app that runs locally on my own machine. CORS only applies to browsers, so a regular app can call the Write.as API just fine.</p>

<h2 id="rebuilding-it-with-claude-code">Rebuilding it with Claude Code</h2>

<p>I rebuilt this one with Claude Code. I treated it like pairing with another developer. Claude wrote most of the code, and I reviewed every change before it went in. Good news was, I still had the source code for both the old Blazor app and the API on my machine, so we had something to work off of. We ended up with a simple .NET console app. You run it with your blog&#39;s alias, and it spits out the HTML for your archive page. Same output as before, same CSS classes, so if you customized the look of your archive page, it should still work.</p>

<p>It still uses my <a href="https://github.com/DinoBansigan/WriteAs.NET">WriteAs.NET</a> library to talk to the Write.as API. But we swapped out CommonMark.NET and HtmlAgilityPack for Markdig, which turns the Markdown of untitled posts into plain text in a single line of code. CommonMark.NET hasn&#39;t been updated in years, so it was time anyway. Going through my old code also turned up a few bugs, like the app crashing on short untitled posts. Oops.</p>

<p>From reading through the old code to having a working app up on GitHub, the whole thing took one afternoon.</p>

<h2 id="rate-limiting">Rate limiting</h2>

<p>The biggest surprise was that Write.as now heavily rate limits calls to its API. And because of how I wrote WriteAs.NET, a rate limited call just comes back empty instead of throwing an error. So the first test run fetched 20 out of 55 posts, and would have happily given me an incomplete archive page without me knowing.</p>

<p>The fix was to slow things down. The app now waits 10 seconds between each page of posts, retries if it still gets rate limited, and checks the number of posts it got against what the blog says it has. It&#39;s slow, but it gets all of them. Funny enough, that&#39;s an improvement over the old version, which used to time out on blogs with a lot of posts. An API key would probably help with the rate limiting, but I don&#39;t have one set up right now.</p>

<p>There was also a bug in the new version where some emojis in post titles showed up as code instead of the actual emoji. That one got fixed real quick.</p>

<h2 id="it-s-on-github">It&#39;s on GitHub</h2>

<p>Back in 2022, I said I&#39;d share the source code for the WPF version of this tool if there was enough interest. This time around, I&#39;m just putting it out there: <a href="https://github.com/DinoBansigan/writeas-archive-generator">writeas-archive-generator</a>. It&#39;s a console app, so no pretty UI, but it does the job. You&#39;ll need the .NET 10 SDK to run it, and the README has all the details.</p>

<p>Eventually, I want to build a Windows desktop app with a UI for it. But for now, this works, and my archive page is up to date again. Thanks for reading, and I&#39;ll catch you in the next DevLog.</p>

<p><em>Tags: <a href="https://devblog.dinobansigan.com/tag:DevLog" class="hashtag"><span>#</span><span class="p-category">DevLog</span></a> <a href="https://devblog.dinobansigan.com/tag:ClaudeCode" class="hashtag"><span>#</span><span class="p-category">ClaudeCode</span></a> <a href="https://devblog.dinobansigan.com/tag:DotNet" class="hashtag"><span>#</span><span class="p-category">DotNet</span></a> <a href="https://devblog.dinobansigan.com/tag:CSharp" class="hashtag"><span>#</span><span class="p-category">CSharp</span></a> <a href="https://devblog.dinobansigan.com/tag:WriteAs" class="hashtag"><span>#</span><span class="p-category">WriteAs</span></a> <a href="https://devblog.dinobansigan.com/tag:WriteAsNet" class="hashtag"><span>#</span><span class="p-category">WriteAsNet</span></a></em></p>



<p><strong><a href="https://remark.as/p/devblog.dinobansigan.com/devlog-005-the-write-as-archive-page-generator-is-back">Discuss...</a></strong> or leave a comment below.</p>
]]></content:encoded>
      <guid>https://devblog.dinobansigan.com/devlog-005-the-write-as-archive-page-generator-is-back</guid>
      <pubDate>Wed, 14 Oct 2026 21:30:31 +0000</pubDate>
    </item>
    <item>
      <title>DevLog - 004: Rebuilding My Homepage with Claude Code</title>
      <link>https://devblog.dinobansigan.com/devlog-004?pk_campaign=rss-feed</link>
      <description>&lt;![CDATA[I&#39;ve had a personal Claude Pro subscription for a few months now. I&#39;ve used it to build a few apps that my kids and I use at home. Most recently, I rebuilt my personal homepage with the help of Claude Code.&#xA;&#xA;Choosing a tech stack&#xA;&#xA;Part of my discussion with Claude was what tech stack to build the new site on. I considered React, ASP.NET, or even a popular static site generator like Eleventy. But at the end of the day, those all felt like overkill for a static site with at most 2-3 pages. I decided to just have Claude build it with plain HTML and CSS. Any future updates I can handle myself by editing those files directly, and with continuous deployment from GitHub to Netlify, shipping a new build is quick and easy.&#xA;&#xA;That continuous deployment pipeline turned out to be one of the real benefits of using Claude to help build websites. It knows GitHub, and it knows Netlify. I had no idea how to set up a pipeline that deploys automatically from GitHub to Netlify, and researching it myself probably would&#39;ve taken a few hours. With Claude, I had step-by-step instructions and a working pipeline in under 10 minutes.!--more--&#xA;&#xA;Getting the design right&#xA;&#xA;The first design Claude came up with was kind of bland. I told it the design was &#34;meh,&#34; and it responded by putting together three more options for me to choose from. One of the designs seems to have taken inspiration from this very own site, it mimicked the blinking cursor, but gave it its own spin, pulling in some design cues from terminals and code. I chose that one. I toned it down a bit from the original concept, but I think it turned out pretty well.&#xA;&#xA;This was the other big benefit of rebuilding the site with Claude. I can build websites, but I&#39;m not much of a designer. Giving Claude some direction and getting back multiple design options to choose from, made that part of the process a lot less painful.&#xA;&#xA;Sunsetting apps.dinobansigan.com&#xA;&#xA;In other news, I took down the Blazor Web App at apps.dinobansigan.com. The site itself is still up, but it&#39;s now been replaced by a maintenance page (also built by Claude Code). That also means the Write.as Archive Page Generator app that used to live there is now gone.&#xA;&#xA;Truth is, that app has needed a fix every few months since I built it. The root cause is different each time, but there&#39;s always something going on with it. At this point I don&#39;t have the bandwidth to keep chasing the fixes, especially for something only a handful of people ever used. So I&#39;m letting it go.&#xA;&#xA;---&#xA;&#xA;That&#39;s it for this update. Between the new homepage and letting go of of the archive page generator app, it feels like I freed up space in my brain to focus on new stuff. Thanks for reading, and I&#39;ll catch you in the next DevLog.&#xA;&#xA;Tags: #DevLog #ClaudeCode #WebDevelopment #WriteAs&#xA;&#xA;!--emailsub--&#xA;&#xA;a href=&#34;https://remark.as/p/devblog.dinobansigan.com/devlog-004&#34;Discuss.../a or leave a comment below.]]&gt;</description>
      <content:encoded><![CDATA[<p>I&#39;ve had a personal Claude Pro subscription for a few months now. I&#39;ve used it to build a few apps that my kids and I use at home. Most recently, I rebuilt my <a href="https://dinobansigan.com/">personal homepage</a> with the help of Claude Code.</p>

<h2 id="choosing-a-tech-stack">Choosing a tech stack</h2>

<p>Part of my discussion with Claude was what tech stack to build the new site on. I considered React, ASP.NET, or even a popular static site generator like Eleventy. But at the end of the day, those all felt like overkill for a static site with at most 2-3 pages. I decided to just have Claude build it with plain HTML and CSS. Any future updates I can handle myself by editing those files directly, and with continuous deployment from GitHub to Netlify, shipping a new build is quick and easy.</p>

<p>That continuous deployment pipeline turned out to be one of the real benefits of using Claude to help build websites. It knows GitHub, and it knows Netlify. I had no idea how to set up a pipeline that deploys automatically from GitHub to Netlify, and researching it myself probably would&#39;ve taken a few hours. With Claude, I had step-by-step instructions and a working pipeline in under 10 minutes.</p>

<h2 id="getting-the-design-right">Getting the design right</h2>

<p>The first design Claude came up with was kind of bland. I told it the design was “meh,” and it responded by putting together three more options for me to choose from. One of the designs seems to have taken inspiration from this very own site, it mimicked the blinking cursor, but gave it its own spin, pulling in some design cues from terminals and code. I chose that one. I toned it down a bit from the original concept, but I think it turned out pretty well.</p>

<p>This was the other big benefit of rebuilding the site with Claude. I can build websites, but I&#39;m not much of a designer. Giving Claude some direction and getting back multiple design options to choose from, made that part of the process a lot less painful.</p>

<h2 id="sunsetting-apps-dinobansigan-com">Sunsetting apps.dinobansigan.com</h2>

<p>In other news, I took down the Blazor Web App at <a href="https://apps.dinobansigan.com/">apps.dinobansigan.com</a>. The site itself is still up, but it&#39;s now been replaced by a maintenance page (also built by Claude Code). That also means the Write.as Archive Page Generator app that used to live there is now gone.</p>

<p>Truth is, that app has needed a fix every few months since I built it. The root cause is different each time, but there&#39;s always something going on with it. At this point I don&#39;t have the bandwidth to keep chasing the fixes, especially for something only a handful of people ever used. So I&#39;m letting it go.</p>

<hr/>

<p>That&#39;s it for this update. Between the new homepage and letting go of of the archive page generator app, it feels like I freed up space in my brain to focus on new stuff. Thanks for reading, and I&#39;ll catch you in the next DevLog.</p>

<p><em>Tags: <a href="https://devblog.dinobansigan.com/tag:DevLog" class="hashtag"><span>#</span><span class="p-category">DevLog</span></a> <a href="https://devblog.dinobansigan.com/tag:ClaudeCode" class="hashtag"><span>#</span><span class="p-category">ClaudeCode</span></a> <a href="https://devblog.dinobansigan.com/tag:WebDevelopment" class="hashtag"><span>#</span><span class="p-category">WebDevelopment</span></a> <a href="https://devblog.dinobansigan.com/tag:WriteAs" class="hashtag"><span>#</span><span class="p-category">WriteAs</span></a></em></p>



<p><strong><a href="https://remark.as/p/devblog.dinobansigan.com/devlog-004">Discuss...</a></strong> or leave a comment below.</p>
]]></content:encoded>
      <guid>https://devblog.dinobansigan.com/devlog-004</guid>
      <pubDate>Tue, 04 Aug 2026 00:26:11 +0000</pubDate>
    </item>
    <item>
      <title>DevLog – 003</title>
      <link>https://devblog.dinobansigan.com/devlog-003?pk_campaign=rss-feed</link>
      <description>&lt;![CDATA[So, for awhile now, the Write.as Archive Page Generator on my hobby site wasn&#39;t working anymore. For some reason, calls to the Write.as api just started failing. The error I was getting back was “The response ended prematurely.”&#xA;&#xA;Took me awhile, but I finally found a fix for the error. Turns out, I now need to add a “user-agent” default header value to my requests, to allow the api call to go through. This seems to be an issue affecting Web APIs written using C#/.NET starting June 2024. Credit goes to this answer from StackOverflow.&#xA;&#xA;Tags: #DevLog#ASPNETCore #WebDevelopment #WriteAs&#xA;&#xA;a href=&#34;https://remark.as/p/devblog.dinobansigan.com/devlog-003&#34;Discuss.../a or leave a comment below.]]&gt;</description>
      <content:encoded><![CDATA[<p>So, for awhile now, the <a href="https://apps.dinobansigan.com/WriteAsArchivePageGenerator">Write.as Archive Page Generator</a> on my hobby site wasn&#39;t working anymore. For some reason, calls to the Write.as api just started failing. The error I was getting back was “The response ended prematurely.”</p>

<p>Took me awhile, but I finally found a fix for the error. Turns out, I now need to add a “user-agent” default header value to my requests, to allow the api call to go through. This seems to be an issue affecting Web APIs written using C#/.NET starting June 2024. Credit goes to this <a href="https://stackoverflow.com/questions/69513783/why-do-i-get-the-response-ended-prematurely-when-using-the-httpclient/78998204#78998204">answer</a> from StackOverflow.</p>

<p><em>Tags: <a href="https://devblog.dinobansigan.com/tag:DevLog" class="hashtag"><span>#</span><span class="p-category">DevLog</span></a><a href="https://devblog.dinobansigan.com/tag:ASPNETCore" class="hashtag"><span>#</span><span class="p-category">ASPNETCore</span></a> <a href="https://devblog.dinobansigan.com/tag:WebDevelopment" class="hashtag"><span>#</span><span class="p-category">WebDevelopment</span></a> <a href="https://devblog.dinobansigan.com/tag:WriteAs" class="hashtag"><span>#</span><span class="p-category">WriteAs</span></a></em></p>

<p><strong><a href="https://remark.as/p/devblog.dinobansigan.com/devlog-003">Discuss...</a></strong> or leave a comment below.</p>
]]></content:encoded>
      <guid>https://devblog.dinobansigan.com/devlog-003</guid>
      <pubDate>Sun, 10 Aug 2025 04:03:38 +0000</pubDate>
    </item>
    <item>
      <title>DevLog – 002</title>
      <link>https://devblog.dinobansigan.com/devlog-002?pk_campaign=rss-feed</link>
      <description>&lt;![CDATA[It&#39;s been awhile since I wrote on this blog. I&#39;m currently working on a possible rebuild of my landing page found at dinobansigan.com. That website is a static website generated using Wyam. I&#39;m thinking of rebuilding it using ASP.NET Razor Pages. &#xA;&#xA;I thought about rebuilding it using ReactJS. But for a mostly read-only website, using React seems overkill. Same goes for using ASP.NET Core MVC; it is overkill for such a simple website. Thought about using Blazor, but I do not need this website to be an SPA. So, ASP.NET Razor Pages seems like the perfect choice for what I want to do.&#xA;&#xA;I only started working on this like 30 minutes ago. Here&#39;s what I have so far.&#xA;&#xA;After I&#39;m satisfied with the content on the pages, I&#39;ll move on to modifying the look/theme of the website. Then will need to figure out where to host it. &#xA;&#xA;Part of the reason I stuck with a static website build, is because I can host it for free on Netlify. However, I&#39;ve been wanting to see what it takes to host an ASP.NET website outside of Azure. Now is my chance to learn how to make that work.&#xA;&#xA;Tags: #DevLog#ASPNETCore #WebDevelopment&#xA;&#xA;a href=&#34;https://remark.as/p/devblog.dinobansigan.com/devlog-002&#34;Discuss.../a or leave a comment below.]]&gt;</description>
      <content:encoded><![CDATA[<p>It&#39;s been awhile since I wrote on this blog. I&#39;m currently working on a possible rebuild of my landing page found at <a href="https://dinobansigan.com/">dinobansigan.com</a>. That website is a static website generated using <a href="https://github.com/Wyamio/Wyam">Wyam</a>. I&#39;m thinking of rebuilding it using ASP.NET Razor Pages.</p>

<p>I thought about rebuilding it using ReactJS. But for a mostly read-only website, using React seems overkill. Same goes for using ASP.NET Core MVC; it is overkill for such a simple website. Thought about using Blazor, but I do not need this website to be an SPA. So, ASP.NET Razor Pages seems like the perfect choice for what I want to do.</p>

<p>I only started working on this like 30 minutes ago. Here&#39;s what I have so far.
<img src="https://i.snap.as/k9KdjOYr.jpg" alt=""/></p>

<p>After I&#39;m satisfied with the content on the pages, I&#39;ll move on to modifying the look/theme of the website. Then will need to figure out where to host it.</p>

<p>Part of the reason I stuck with a static website build, is because I can host it for free on Netlify. However, I&#39;ve been wanting to see what it takes to host an ASP.NET website outside of Azure. Now is my chance to learn how to make that work.</p>

<p><em>Tags: <a href="https://devblog.dinobansigan.com/tag:DevLog" class="hashtag"><span>#</span><span class="p-category">DevLog</span></a><a href="https://devblog.dinobansigan.com/tag:ASPNETCore" class="hashtag"><span>#</span><span class="p-category">ASPNETCore</span></a> <a href="https://devblog.dinobansigan.com/tag:WebDevelopment" class="hashtag"><span>#</span><span class="p-category">WebDevelopment</span></a></em></p>

<p><strong><a href="https://remark.as/p/devblog.dinobansigan.com/devlog-002">Discuss...</a></strong> or leave a comment below.</p>
]]></content:encoded>
      <guid>https://devblog.dinobansigan.com/devlog-002</guid>
      <pubDate>Mon, 30 Jun 2025 04:51:05 +0000</pubDate>
    </item>
    <item>
      <title>DevLog - 001</title>
      <link>https://devblog.dinobansigan.com/devlog-001?pk_campaign=rss-feed</link>
      <description>&lt;![CDATA[A number of people have been asking me about why the WriteAs Archive Page generators I made no longer work. They no longer work because of CORS restrictions on the API server. I&#39;m trying to see if I can work around the restrictions on my Blazor WASM apps by going the Web API route.&#xA;&#xA;Started working on an API for my websites&#xA;&#xA;Tags: #DevLog#ASPNETCore #WebAPI #WriteAs&#xA;&#xA;a href=&#34;https://remark.as/p/devblog.dinobansigan.com/devlog-001&#34;Discuss.../a or leave a comment below.]]&gt;</description>
      <content:encoded><![CDATA[<p>A number of people have been asking me about why the WriteAs Archive Page generators I made no longer work. They no longer work because of CORS restrictions on the API server. I&#39;m trying to see if I can work around the restrictions on my Blazor WASM apps by going the Web API route.</p>

<p><a href="https://i.snap.as/i3gkca5v.png"><img src="https://i.snap.as/i3gkca5v.png" alt="Started working on an API for my websites"/></a></p>

<p><em>Tags: <a href="https://devblog.dinobansigan.com/tag:DevLog" class="hashtag"><span>#</span><span class="p-category">DevLog</span></a><a href="https://devblog.dinobansigan.com/tag:ASPNETCore" class="hashtag"><span>#</span><span class="p-category">ASPNETCore</span></a> <a href="https://devblog.dinobansigan.com/tag:WebAPI" class="hashtag"><span>#</span><span class="p-category">WebAPI</span></a> <a href="https://devblog.dinobansigan.com/tag:WriteAs" class="hashtag"><span>#</span><span class="p-category">WriteAs</span></a></em></p>

<p><strong><a href="https://remark.as/p/devblog.dinobansigan.com/devlog-001">Discuss...</a></strong> or leave a comment below.</p>
]]></content:encoded>
      <guid>https://devblog.dinobansigan.com/devlog-001</guid>
      <pubDate>Sat, 31 Dec 2022 16:12:08 +0000</pubDate>
    </item>
  </channel>
</rss>