<?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>Forem: Patrick Hannah</title>
    <description>The latest articles on Forem by Patrick Hannah (@pjhannah1).</description>
    <link>https://forem.com/pjhannah1</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F634748%2F9f8df79f-7b67-4ea4-bba2-af75136bfa96.jpg</url>
      <title>Forem: Patrick Hannah</title>
      <link>https://forem.com/pjhannah1</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/pjhannah1"/>
    <language>en</language>
    <item>
      <title>Creating a Personal Landing Page: Oops I created a CMS</title>
      <dc:creator>Patrick Hannah</dc:creator>
      <pubDate>Fri, 24 Apr 2026 17:52:34 +0000</pubDate>
      <link>https://forem.com/pjhannah1/creating-a-personal-landing-page-oops-i-created-a-cms-47hn</link>
      <guid>https://forem.com/pjhannah1/creating-a-personal-landing-page-oops-i-created-a-cms-47hn</guid>
      <description>&lt;p&gt;Well, that got out of control.&lt;/p&gt;

&lt;p&gt;I ended up building more of a landing page than a blog (perhaps what LinkedIn could be? Or a really powerful LinkTree-like site). My initial goal was to create a simple showcase of my work and achievements, but as I delved deeper into the project, it evolved into something much more comprehensive and robust.&lt;/p&gt;

&lt;h3&gt;
  
  
  Delving into the Scraping Process
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Gathering Data from Various Sources&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To create a landing page that truly represents me, I had to gather a significant amount of information from various sources. This process involved dealing with both public and non-public APIs, which presented its own set of challenges. While Kiro's warnings about the risks of using non-public APIs were very much valid, the data I scraped was essential in creating a comprehensive and personalized landing page.&lt;/p&gt;

&lt;p&gt;Scraping data from APIs was relatively straightforward and provided the foundation for my landing page, ensuring that it was both informative and reflective of my professional journey.&lt;/p&gt;

&lt;h3&gt;
  
  
  Building a Custom CMS
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The Need for a Content Management System&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As I started aggregating data, I quickly realized that I needed a way to manage and edit these pages effectively. While WordPress is a popular and powerful option, I chose to create a custom content management system (CMS) to avoid the usual security and operational concerns associated with WordPress. This decision allowed me to have full control over the development process and to tailor the CMS to my specific needs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Creating a Local Client&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The custom CMS I built is designed to run locally on my machine. This local client ensures that all the code is executed in a controlled environment, providing a seamless development experience. Once the code is ready, it is versioned and pushed to GitHub. However, the CMS is flexible enough to work with any static hosting site solution, giving me the freedom to choose the platform that best suits my needs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enhancing Visual Appeal with Jekyll&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To handle the visual aspects of my landing page, I used Jekyll, a popular static site generator, combined with a well-crafted template. Jekyll's simplicity and flexibility made it an ideal choice for this project, allowing me to create a visually appealing and professional-looking website without the need for complex server-side scripting.&lt;/p&gt;

&lt;h3&gt;
  
  
  Enhancing the Project with Additional Features
&lt;/h3&gt;

&lt;p&gt;To further enhance my landing page, I created several additional features that improve both the functionality and user experience.&lt;/p&gt;

&lt;h4&gt;
  
  
  Media Library Manager
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Organizing and Managing Media Files&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One of the key features I added was a media library manager. This tool is essential for organizing and managing all the media files I use on my site, such as images, videos, and presentations. It also deploys and manages the content delivery network (CDN), ensuring that my media content is efficiently distributed and accessible to users worldwide.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keeping Content Up-to-Date&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In addition to managing media files, the media library manager extracts and re-tags common tags from YouTube and SlideShare content I have previously authored. This ensures that my landing page always showcases the most relevant and up-to-date information. With nearly 200 references, having a well-organized media library is crucial to avoid overwhelming visitors with too much information.&lt;/p&gt;

&lt;h4&gt;
  
  
  URL Shortener
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Simplifying Long URLs&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Another crucial addition to my landing page is a URL shortener. This feature simplifies long URLs, making them more user-friendly and easier to share. It also helps with tracking and analytics, providing insights into how users interact with my content. By shortening URLs, I can monitor which links are most popular and adjust my content strategy accordingly.&lt;/p&gt;

&lt;h4&gt;
  
  
  YouTube Synchronization
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Keeping Content Fresh and Engaging&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To keep my content fresh and engaging, I implemented YouTube synchronization. This feature automatically updates my landing page with the latest videos from my YouTube channel, ensuring that visitors always have access to the most recent content.&lt;/p&gt;

&lt;h4&gt;
  
  
  Editorial Assistance with Bedrock
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Maintaining High-Quality Content&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To maintain high-quality content, I integrated Bedrock, as an editorial assistance tool. Using basic prompts, Bedrock helps with spelling and grammar checks, as well as elaboration and generation of titles, descriptions, and tags. This feature ensures that my content is polished and professional, while still remaining authentic to my voice and style. By leveraging AI-driven editorial assistance, I can focus on creating high-quality content without worrying about minor errors or inconsistencies.&lt;/p&gt;

&lt;h3&gt;
  
  
  Balancing Efficiency and Effectiveness
&lt;/h3&gt;

&lt;p&gt;While this project isn't 'agentic' in the sense of being fully autonomous, it strikes a balance between efficiency and effectiveness. By building a custom CMS and adding these additional features, I created a landing page that is not only functional but also serves as my portfolio. This balance ensures that I meet my needs while keeping costs and resources in check.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Creating a personal landing page turned out to be more than a 24-hour project, but (and the same can be said about nearly any AI project), it came down to data quality. I found this to be a great exercise in using Kiro to build something that sees the light of day (versus the other dozen or two projects I've not yet deployed). The journey of creating this landing page has been a valuable learning experience, providing insights into the intricacies of scraping APIs, building a custom CMS with Jekyll, and the balance between efficiency and effectiveness in personal projects.&lt;/p&gt;

</description>
      <category>apiscraping</category>
      <category>customcms</category>
      <category>jekyll</category>
      <category>medialibrarymanager</category>
    </item>
    <item>
      <title>First Post</title>
      <dc:creator>Patrick Hannah</dc:creator>
      <pubDate>Fri, 17 Apr 2026 18:33:33 +0000</pubDate>
      <link>https://forem.com/pjhannah1/first-post-1l85</link>
      <guid>https://forem.com/pjhannah1/first-post-1l85</guid>
      <description>&lt;p&gt;I want to get back into writing (okay, blogging), but the challenge I've always had is never having a permanent home for it. Self host? Use a platform? What about ownership? Future paywalls?&lt;/p&gt;

&lt;p&gt;I used my AI friends to help get to a conclusion - host it on GitHub. No different than Code and I alone determine how my intellectual property is used and by who. The problem is, the workflow around publishing to GitHub, and writing in Markdown puts me back into a spot I was in previously.&lt;/p&gt;

&lt;p&gt;The other issue is reach - how can I use friendlier platforms (ideally ones with APIs and are geared towards the community of developers) to syndicate my writing elsewhere?&lt;/p&gt;

&lt;p&gt;I've been using Kira A LOT, nothing (recently, at least) has made it to the Internet, so this is the first. I used Kiro to help me create a browser based (albeit local) "application" that handles the editorial lifecycle of content drafted, reviewed and published by a singular person (so no sharing, RBAC, etc.) with a heavy focus on the publishing workflow and syndication.&lt;/p&gt;

&lt;p&gt;After about a dozen tests (I see Twitter, I mean X is still desparate for money and posting through an API is nowhere near free), I am able to post to GitHub, Dev.to, Hashnode and a link from "Linked" In to the GitHub based Blog. Twitter sure would be nice, as would the AWS developer community portal (hint hint). Medium and Substack seem to be less than intersted in API-based posting, and based on some of Medium's practices in the past, I am less interested in posting there (Substack is still promising, though).&lt;/p&gt;

&lt;p&gt;Perhaps in the future I'll cross post to Slack, eh?&lt;/p&gt;

&lt;p&gt;Anyway, this is the first test post I won't delete, and I'm proud that it cost me zero hard dollars and about a day or so to incept, iterate and begin using.&lt;/p&gt;

&lt;p&gt;Patrick&lt;/p&gt;

</description>
      <category>first</category>
      <category>post</category>
    </item>
  </channel>
</rss>
