<?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: JaredHarbison</title>
    <description>The latest articles on DEV Community by JaredHarbison (@jaredharbison).</description>
    <link>https://dev.to/jaredharbison</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%2F215541%2F5dc07cbb-d642-483a-9b97-869eda3c6686.png</url>
      <title>DEV Community: JaredHarbison</title>
      <link>https://dev.to/jaredharbison</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jaredharbison"/>
    <language>en</language>
    <item>
      <title>Am I Doing This Right? #1: Deploy Notifications That Actually Get Read</title>
      <dc:creator>JaredHarbison</dc:creator>
      <pubDate>Sun, 23 Nov 2025 19:13:57 +0000</pubDate>
      <link>https://dev.to/jaredharbison/am-i-doing-this-right-1-deploy-notifications-that-actually-get-read-1ink</link>
      <guid>https://dev.to/jaredharbison/am-i-doing-this-right-1-deploy-notifications-that-actually-get-read-1ink</guid>
      <description>&lt;p&gt;I'm the only engineer at my company. That means when I deploy, there's no one watching the CI pipeline with me—my teammates are non-technical stakeholders who care about &lt;em&gt;what&lt;/em&gt; shipped and &lt;em&gt;what they need to do about it&lt;/em&gt;, not the mechanics of how it got there.&lt;/p&gt;

&lt;p&gt;So I built a system that meets them where they are: a Slack message on every deploy that includes recent commits and links to any new documentation.&lt;/p&gt;

&lt;p&gt;Here's what it looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;💯 Deployment to staging succeeded!

📚 New Documentation:
• Testing: New Feature Name

Recent commits:
• feat: add user onboarding flow
• fix: resolve null check in profile loader
• chore: update dependencies
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And here's how it works.&lt;/p&gt;




&lt;h2&gt;
  
  
  The trigger
&lt;/h2&gt;

&lt;p&gt;The GitHub Action fires on any push to &lt;code&gt;main&lt;/code&gt; or &lt;code&gt;staging&lt;/code&gt;. Staging deploys include commit messages; production deploys are cleaner since by that point everyone's already seen what's coming.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;main&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;staging&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This assumes you've added your Heroku API key and Slack webhook URL as repository secrets in GitHub.&lt;/p&gt;




&lt;h2&gt;
  
  
  The documentation layer
&lt;/h2&gt;

&lt;p&gt;This was the part I thought hardest about. I write SOPs (Standard Operating Procedures) for site admins—things like how to report issues, how to test a new feature, how to run monthly reports. I use AI to draft these and review before publishing, which makes it realistic to keep docs current even as a solo eng. The docs live in Google Docs because that's what my team already knows. No learning curve, no new logins, free.&lt;/p&gt;

&lt;p&gt;I needed a way to attach new docs to the next deploy notification without manually editing the workflow every time. So I created a simple YAML file that tracks documents and whether they've been sent:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;notes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sop"&lt;/span&gt;
    &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Admin&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Issue&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Reporting&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Guide"&lt;/span&gt;
    &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://docs.google.com/document/d/your-doc-id"&lt;/span&gt;
    &lt;span class="na"&gt;added&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2025-11-21T23:15:58Z"&lt;/span&gt;
    &lt;span class="na"&gt;sent&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And a shell script to add new notes without touching the YAML directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./scripts/add-deploy-note.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It prompts for the doc type (SOP or technical), title, and URL, validates that it's a Google Docs link, and appends it to the file with &lt;code&gt;sent: false&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The deploy workflow
&lt;/h2&gt;

&lt;p&gt;The workflow does a few things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Sets environment variables based on the branch (staging vs. production, different Heroku apps)&lt;/li&gt;
&lt;li&gt;Pulls commit messages since the last deploy using &lt;code&gt;git log&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Checks the notes file for any unsent documentation&lt;/li&gt;
&lt;li&gt;Pushes to Heroku&lt;/li&gt;
&lt;li&gt;Builds and sends the Slack message&lt;/li&gt;
&lt;li&gt;Marks notes as sent and commits that change back to the repo&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The Slack message construction looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Build and send Slack notification&lt;/span&gt;
  &lt;span class="na"&gt;if&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;success()&lt;/span&gt;
  &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
    &lt;span class="s"&gt;if [[ "$ENVIRONMENT" == "production" ]]; then&lt;/span&gt;
      &lt;span class="s"&gt;EMOJI="✅"&lt;/span&gt;
    &lt;span class="s"&gt;else&lt;/span&gt;
      &lt;span class="s"&gt;EMOJI="💯"&lt;/span&gt;
    &lt;span class="s"&gt;fi&lt;/span&gt;

    &lt;span class="s"&gt;MESSAGE_TEXT="$EMOJI *Deployment to $ENVIRONMENT succeeded!*"&lt;/span&gt;

    &lt;span class="s"&gt;if [[ "$HAS_NOTES" == "true" &amp;amp;&amp;amp; -n "$NOTES_SECTION" ]]; then&lt;/span&gt;
      &lt;span class="s"&gt;MESSAGE_TEXT="${MESSAGE_TEXT}"$'\n\n'"${NOTES_SECTION}"&lt;/span&gt;
    &lt;span class="s"&gt;fi&lt;/span&gt;

    &lt;span class="s"&gt;MESSAGE_TEXT="${MESSAGE_TEXT}"$'\n\n'"${SAFE_COMMITS}"&lt;/span&gt;

    &lt;span class="s"&gt;# ... send via curl to Slack webhook&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After a successful deploy, the workflow marks all notes as &lt;code&gt;sent: true&lt;/code&gt; and commits the change with &lt;code&gt;[skip ci]&lt;/code&gt; to avoid triggering another run.&lt;/p&gt;




&lt;h2&gt;
  
  
  Decisions I made (and am not sure about)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Google Docs over a proper docs site:&lt;/strong&gt; I went with Google Docs because my stakeholders already live there. But it means documentation isn't versioned with the code, search is scattered, and I'm trusting Google's link permanence. Would love to hear from anyone who's migrated a non-technical team to something like Notion or a static docs site.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;YAML for note tracking:&lt;/strong&gt; This felt simpler than a database or external service, and it lives in the repo so it's versioned. But the "mark as sent and commit back" step feels slightly fragile. If the commit fails for some reason, notes could get re-sent. Is there a cleaner pattern here?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Shell script for adding notes:&lt;/strong&gt; I like that it validates URLs and keeps the YAML format consistent. But it's another thing to remember. Would a GitHub Issue template or something more visual be better for a mixed-technical team?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Using AI for documentation:&lt;/strong&gt; I draft SOPs with AI and review before publishing. It's the only way I can keep docs current as a solo eng. But I'm curious how others feel about this—any concerns about quality, consistency, or maintainability?&lt;/p&gt;




&lt;h2&gt;
  
  
  The full workflow
&lt;/h2&gt;

&lt;p&gt;Full source available here: &lt;a href="https://gist.github.com/JaredHarbison/8d9bf5430c42402a0c5f528c1a524e07" rel="noopener noreferrer"&gt;deploy.yml and add-deploy-note.sh&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;That's the setup. Am I overcomplicating this? Undercomplicating it? Missing something obvious? Let me know how your team handles deploy communication—especially if you're bridging technical and non-technical audiences.&lt;/p&gt;

</description>
      <category>cicd</category>
      <category>github</category>
      <category>devops</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Am I Doing This Right? A Solo Engineer's Open Invitation</title>
      <dc:creator>JaredHarbison</dc:creator>
      <pubDate>Sat, 22 Nov 2025 21:40:06 +0000</pubDate>
      <link>https://dev.to/jaredharbison/am-i-doing-this-right-a-solo-engineers-open-invitation-43ne</link>
      <guid>https://dev.to/jaredharbison/am-i-doing-this-right-a-solo-engineers-open-invitation-43ne</guid>
      <description>&lt;p&gt;I'm a senior software engineer with almost six years of experience, mostly in Rails and React. For the past several years, I've been the only engineer at my company.&lt;br&gt;
That means I own everything—architecture, implementation, deploys, firefighting. It also means I don't have anyone to tell me when I'm doing something weird.&lt;/p&gt;

&lt;p&gt;I've worked on teams before. I know the value of code review, of someone asking "why not just...?" before you're three layers deep in a bad abstraction. I miss that. So I'm trying to build it for myself, here.&lt;/p&gt;

&lt;p&gt;This series is called "Am I Doing This Right?" and the premise is simple: I'll walk through something I've built or a decision I've made, explain my reasoning, and invite you to weigh in. Tell me how your team does it. Tell me I'm overcomplicating it. Tell me about the footgun I haven't noticed yet.&lt;/p&gt;

&lt;p&gt;I'm not looking for validation. I'm looking for the perspective that comes from working with other engineers—something I don't get day-to-day.&lt;/p&gt;

&lt;p&gt;First up: a GitHub Actions workflow that posts to Slack with recent commits and links to SOPs whenever we deploy. It's a small thing, but it touches CI/CD, team communication, and documentation habits, so there's plenty to pick apart.&lt;/p&gt;

</description>
      <category>career</category>
      <category>discuss</category>
      <category>learning</category>
    </item>
    <item>
      <title>Karaoke Queue, a web app for hosting karaoke parties.</title>
      <dc:creator>JaredHarbison</dc:creator>
      <pubDate>Wed, 13 Dec 2023 02:32:50 +0000</pubDate>
      <link>https://dev.to/jaredharbison/karaoke-queue-a-web-app-for-hosting-karaoke-parties-18f4</link>
      <guid>https://dev.to/jaredharbison/karaoke-queue-a-web-app-for-hosting-karaoke-parties-18f4</guid>
      <description>&lt;h2&gt;
  
  
  Description
&lt;/h2&gt;

&lt;p&gt;I built a web app to use when I host karaoke in my building's theater room. This is not a tutorial, just an explanation of my project. I would, however, be happy to answer any questions or help anyone solve problems they may have when creating a Rails 7 app for hosting on Heroku.&lt;/p&gt;

&lt;h2&gt;
  
  
  Requirements
&lt;/h2&gt;

&lt;p&gt;1) For my own setup the laptop running the karaoke equipment uses Chromecast to display the karaoke video on a large projected screen, and bluetooth to play the music to a karaoke speaker with two microphones. The app needed to be accessible from each guest's phone for easy queueing of songs, therefore hosted and not just operating locally on the laptop running the karaoke equipment.&lt;/p&gt;

&lt;p&gt;2) The app needed to queue songs with a user-input URL pointing to the location of a video karaoke version of a song. When a performer clicks the URL of the next song from the laptop, the app needs to mark that song as finished. I also anticipated that songs would need to be skipped/postponed in case a performer was not available in the moment to perform their song. &lt;/p&gt;

&lt;p&gt;3) A single user was sufficient for my own purposes, and I opted out of a traditional sign up to avoid managing users who might randomly access the hosted web app. This also allowed me to skip a lot of work that would be needed for a publicly accessible app, like validation of URLS or updating each logged in device's view with an implementation of ActionCable and Redis on Heroku. &lt;/p&gt;

&lt;h2&gt;
  
  
  Stack
&lt;/h2&gt;

&lt;p&gt;I used Rails 7 and Postgres for hosting on Heroku with minimal Javascript and Sass. I also used Devise, Haml, Html to Haml, and RSpec.&lt;/p&gt;

&lt;h2&gt;
  
  
  Approach
&lt;/h2&gt;

&lt;p&gt;I kept things as simple as possible in order to complete the project quickly. In all, it took me about four hours. &lt;/p&gt;

&lt;p&gt;1) I ran Rails new, set up initial gems, initialized a Git repository with a remote connection, and prepared the app for Heroku.&lt;/p&gt;

&lt;p&gt;2) I implemented basic CRUD for a Song with additional features to finish a queued song upon click of its link and skip of a song upon the click of a button. &lt;/p&gt;

&lt;p&gt;3) I installed HAML and ran html2haml to convert all existing ERB files, based on a strong preference for HAML over ERB. I also use HAML on a daily basis professionally. &lt;/p&gt;

&lt;p&gt;4) I used Sass for styling of the app. I kept the overall styling pretty simple to allow for thorough styling of states including active, hover, etc and usage of SVG icons. &lt;/p&gt;

&lt;p&gt;5) I set up Devise to handle sign in of a single user. Devise will allow for future features, like using the invitable option to invite other users to the app. &lt;/p&gt;

&lt;p&gt;6) I used RSPEC for minimal initial testing of CRUD for songs. &lt;/p&gt;

&lt;p&gt;7) Last, I used ZeroSSL to create my own certificates, added them to the Heroku app, and set up a CNAME through my own domain provider in order to move from the Heroku app URL to &lt;a href="http://www.karaoke.jaredharbison.com"&gt;www.karaoke.jaredharbison.com&lt;/a&gt;.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--A9-wwsHG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/JaredHarbison"&gt;
        JaredHarbison
      &lt;/a&gt; / &lt;a href="https://github.com/JaredHarbison/karaoke"&gt;
        karaoke
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;h2&gt;
KARAOKE QUEUE&lt;/h2&gt;
&lt;p&gt;This karaoke web app can run on a laptop computer casting video to a screen via chromecast and audio to a karaoke speaker using bluetooth. Users can login from their mobile devices with the karaoke host's login information to add songs to the queue.&lt;/p&gt;
&lt;h2&gt;
Description&lt;/h2&gt;
&lt;p&gt;A user can access the web app to login with the karaoke host's login information and then click the link to navigate to the /songs index page. The /songs index page contains a form at the top to queue a new song object containing a URL to a video karaoke version of a song, likely from YouTube. Upon submit of the form the song is added to the bottom of the queue on the /songs index page. The next song has a play icon that will open the URL in a new browser tab and mark the song object as finished, then it…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/JaredHarbison/karaoke"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


</description>
      <category>showdev</category>
      <category>webdev</category>
    </item>
    <item>
      <title>FaeCMS - Getting Started</title>
      <dc:creator>JaredHarbison</dc:creator>
      <pubDate>Sat, 25 Jan 2020 23:59:43 +0000</pubDate>
      <link>https://dev.to/jaredharbison/faecms-getting-started-2a1i</link>
      <guid>https://dev.to/jaredharbison/faecms-getting-started-2a1i</guid>
      <description>&lt;h1&gt;&lt;center&gt;A CMS Documentation Clarification&lt;/center&gt;&lt;/h1&gt;




&lt;p&gt;I've started a couple of side projects for community organizations that are pushing me into new areas of development. Along with open-source contributions, these are giving me a sense of what IRL development feels like beyond my own personal projects. &lt;/p&gt;

&lt;p&gt;In one case I initially thought I needed an open source CMS which led me to running through a side-by-side installation of several options like a &lt;a href="https://www.youtube.com/watch?v=XDDwErNg52A"&gt;pig race&lt;/a&gt;. Documentation for most was spotty but &lt;a href="https://alchemy-cms.com/about"&gt;AlchemyCMS&lt;/a&gt; and &lt;a href="https://ghost.org/"&gt;GhostCMS&lt;/a&gt; were best documented and -although very different- tied for the win. &lt;/p&gt;

&lt;p&gt;Even though I'm now looking into CRM options for both projects instead, I'm going to provide some guidance through my process that resolved a number of issues I ran into getting started with &lt;a href="https://www.faecms.com/"&gt;FaeCMS&lt;/a&gt;. Not all of the steps below were in the documents, and some were only found through extensive googling and problem solving on my own. &lt;/p&gt;




&lt;h1&gt;&lt;center&gt; Let's get started! &lt;/center&gt;&lt;/h1&gt;




&lt;p&gt;My current environment versions are &lt;code&gt;ruby 2.6.1p33&lt;/code&gt; and  &lt;code&gt;Rails 6.0.2.1&lt;/code&gt; and the &lt;a href="https://github.com/JaredHarbison/faeDEV"&gt;repo&lt;/a&gt; is currently just the corrected boilerplate.&lt;/p&gt;

&lt;p&gt;Naturally I started with running &lt;code&gt;rails new FaeDEV&lt;/code&gt; then &lt;code&gt;bundle add fae-rails&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Following the docs, &lt;code&gt;rails g fae:install&lt;/code&gt; did not work. I found that I needed to opt out of a Rails 6 dependencies autoloading mode called &lt;a href="https://guides.rubyonrails.org/autoloading_and_reloading_constants.html#rails-autoloaders"&gt;zeitwerk&lt;/a&gt; by adding &lt;code&gt;config.autoloader = :classic&lt;/code&gt; to config/application.rb. &lt;/p&gt;

&lt;p&gt;Upon running &lt;code&gt;rails g fae:install&lt;/code&gt; per the docs, the install broke. Based on the error messages I determined it was down to an ActiveRecord issue. I added '[4.2]' to the end of 'ActiveRecord::Migration' in each migration file. I was then able to run &lt;code&gt;rails db:create &amp;amp;&amp;amp; rails db:migrate&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;The final error I worked through before successfully spinning up the server was solved by adding '//= link fae/application.css' and '//= link fae/application.js' to app/assets/config/manifest.js. &lt;/p&gt;

&lt;p&gt;A run of &lt;code&gt;rails s&lt;/code&gt; and a visit to localhost:3000 now led me to creating the first user for the project. &lt;/p&gt;




&lt;h1&gt;&lt;center&gt; That's all folks! &lt;/center&gt;&lt;/h1&gt;

</description>
      <category>ruby</category>
      <category>rails</category>
    </item>
    <item>
      <title>AlchemyCMS - Getting Started</title>
      <dc:creator>JaredHarbison</dc:creator>
      <pubDate>Sat, 25 Jan 2020 22:39:45 +0000</pubDate>
      <link>https://dev.to/jaredharbison/alchemycms-getting-started-4gob</link>
      <guid>https://dev.to/jaredharbison/alchemycms-getting-started-4gob</guid>
      <description>&lt;h1&gt;&lt;center&gt;A CMS Documentation Clarification&lt;/center&gt;&lt;/h1&gt;




&lt;p&gt;I've started a couple of side projects for community organizations that are pushing me into new areas of development. Along with open-source contributions, these are giving me a sense of what IRL development feels like beyond my own personal projects. &lt;/p&gt;

&lt;p&gt;In one case I initially thought I needed an open source CMS which led me to running through a side-by-side installation of several options like a &lt;a href="https://www.youtube.com/watch?v=XDDwErNg52A"&gt;pig race&lt;/a&gt;. Documentation for most was spotty but &lt;a href="https://alchemy-cms.com/about"&gt;AlchemyCMS&lt;/a&gt; and &lt;a href="https://ghost.org/"&gt;GhostCMS&lt;/a&gt; were best documented and -although very different- tied for the win. &lt;/p&gt;

&lt;p&gt;Even though I'm now looking into CRM options for both projects instead, I'm going to provide some guidance through my process that resolved minor issues I ran into getting started with AlchemyCMS. While the steps below are found in the documentation, the process avoids some very minor hiccups for intermediate developers and potential roadblocks for beginners. &lt;/p&gt;




&lt;h1&gt;&lt;center&gt; Let's get started! &lt;/center&gt;&lt;/h1&gt;




&lt;p&gt;My current environment versions are &lt;code&gt;ruby 2.6.1p33&lt;/code&gt; and  &lt;code&gt;Rails 6.0.2.1&lt;/code&gt; and the &lt;a href="https://github.com/JaredHarbison/AlchemyDEV"&gt;repo&lt;/a&gt; is currently just the corrected boilerplate.&lt;/p&gt;

&lt;p&gt;Naturally I started with running &lt;code&gt;rails new AlchemyDEV&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I only needed two additional gems to get running with &lt;code&gt;bundle add alchemy_cms alchemy-devise &amp;amp;&amp;amp; bundle update&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;In config/routes.rb I added &lt;code&gt;mount Alchemy::Engine =&amp;gt; '/'&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Per the docs, I installed Alchemy into the project with &lt;code&gt;bin/rake alchemy:install&lt;/code&gt; then Devise with &lt;code&gt;bin/rails g alchemy:devise:install&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;A run of &lt;code&gt;rails s&lt;/code&gt; and a visit to localhost:3000 should lead you to creating the first admin user for your project. &lt;/p&gt;




&lt;h1&gt;&lt;center&gt; That's all folks! &lt;/center&gt;&lt;/h1&gt;

</description>
      <category>rails</category>
      <category>ruby</category>
    </item>
    <item>
      <title>Relaunch with React and Github Pages</title>
      <dc:creator>JaredHarbison</dc:creator>
      <pubDate>Sun, 12 Jan 2020 22:14:10 +0000</pubDate>
      <link>https://dev.to/jaredharbison/cha-cha-cha-changes-to-my-portfolio-djk</link>
      <guid>https://dev.to/jaredharbison/cha-cha-cha-changes-to-my-portfolio-djk</guid>
      <description>&lt;h1&gt;&lt;center&gt;My Portfolio Site - Pt 5&lt;/center&gt;&lt;/h1&gt;




&lt;p&gt;This week I relaunched my &lt;a href="//jaredharbison.com"&gt;portfolio site&lt;/a&gt; as a React app on Github Pages. I won't get into the details of the process because the documentation from the React team was far better than any blogging I found on the subject. Truly nothing beats the actual documentation from any framework or library IMO. &lt;/p&gt;

&lt;p&gt;As much as I wanted to keep it framework free, relaunching with React will surely help me in the future. I was able to keep this CSS library free- just for fun and developing my skills. For this version I've only left my tech stack and portfolio projects in terms of content but made it a little moodier with some recently acquired CSS skills. &lt;/p&gt;




&lt;h1&gt;&lt;center&gt; Take a look at some code! &lt;/center&gt;&lt;/h1&gt;




&lt;p&gt;One of the biggest updates to this version is some media responsiveness. The images are still my own and manipulated with &lt;a href="https://www.gimp.org/"&gt;Gimp&lt;/a&gt; and &lt;a href="https://compresspng.com/"&gt;Compress PNG&lt;/a&gt;&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;One of my favorite tricks learned was the auto-grid class for the portfolio cards which I built myself. I used SVG icons as often as possible with a handful of &lt;a href="https://fontawesome.com/"&gt;Font Awesome&lt;/a&gt; as I anticipate using it in the future.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;





&lt;h1&gt;&lt;center&gt; That's All Folks! &lt;/center&gt;&lt;/h1&gt;




</description>
      <category>react</category>
      <category>github</category>
      <category>html</category>
      <category>css</category>
    </item>
    <item>
      <title>Hey, post a selfie! Show yourself!</title>
      <dc:creator>JaredHarbison</dc:creator>
      <pubDate>Sun, 05 Jan 2020 23:52:30 +0000</pubDate>
      <link>https://dev.to/jaredharbison/hey-post-a-selfie-show-yourself-37b0</link>
      <guid>https://dev.to/jaredharbison/hey-post-a-selfie-show-yourself-37b0</guid>
      <description>&lt;h3&gt;&lt;center&gt;WERQBOOK - Pt. 1&lt;/center&gt;&lt;/h3&gt;




&lt;p&gt;I've seen some interest in a feature within one of my earlier apps called &lt;a href="https://github.com/JaredHarbison/WerqBook"&gt;WERQBOOK&lt;/a&gt;- a chat app with some simple but really important features like time stamps, real-time updates, and image posting. It's the image posting that sparks the most interest. Rails made it so easy!&lt;/p&gt;




&lt;h1&gt;&lt;center&gt; Let's get started! &lt;/center&gt;&lt;/h1&gt;




&lt;p&gt;I ran &lt;code&gt;gem install carrierwave fog mini_magick &amp;amp;&amp;amp; bundle install&lt;/code&gt; to get started. CarrierWave allowed access &lt;code&gt;rails generate uploader Picture&lt;/code&gt; to create an image uploader. The images were to be uploaded into user posts, so I ran &lt;code&gt;rails generate migration add_picture_to_microposts picture:string &amp;amp;&amp;amp; rails db:migrate&lt;/code&gt; to add image strings to the existing schema. The generator added &lt;code&gt;mount_uploader :picture, PictureUploader&lt;/code&gt; to the &lt;a href="https://github.com/JaredHarbison/WerqBook/blob/master/app/models/micropost.rb"&gt;micropost.rb&lt;/a&gt; file. Then I needed to update the private micropost_params method in &lt;a href="https://github.com/JaredHarbison/WerqBook/blob/master/app/controllers/microposts_controller.rb"&gt;micropost_controller.rb&lt;/a&gt; to "permit" &lt;code&gt;:picture&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I added an image_tag to the &lt;a href="https://github.com/JaredHarbison/WerqBook/blob/master/app/views/microposts/_micropost.html.erb"&gt;_micropost_form.html.erb&lt;/a&gt; partial to prompt image uploads.&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;span class="content"&amp;gt;
  &amp;lt;%= micropost.content %&amp;gt;
  &amp;lt;%= image_tag micropost.picture.url if micropost.picture? %&amp;gt;
&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For some image validation I added a simple method into the &lt;a href="https://github.com/JaredHarbison/WerqBook/blob/master/app/uploaders/picture_uploader.rb"&gt;picture_uploader.rb&lt;/a&gt; file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def extension_whitelist 
  %w(jpg jpeg gif png) 
end 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I added another validation in &lt;a href="https://github.com/JaredHarbison/WerqBook/blob/master/app/models/micropost.rb"&gt;micropost.rb&lt;/a&gt; through &lt;code&gt;validate :picture_size&lt;/code&gt; and a private picture_size method&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def picture_size 
  if picture.size &amp;gt; 5.megabytes
    errors.add(:picture, "should be less than 5MB")
  end 
end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Images could be posted of any size, potentially ruining the layout of the application. I found I needed to &lt;code&gt;brew install imagemagick&lt;/code&gt; into my development environment. The MiniMagick documentation was pretty good, which I followed to add the following into the &lt;a href="https://github.com/JaredHarbison/WerqBook/blob/master/app/uploaders/picture_uploader.rb"&gt;picture_uploader.rb&lt;/a&gt; file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;include CarrierWave::MiniMagick 
process resize_to_limit: [400, 400]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally I updated &lt;a href="https://github.com/JaredHarbison/WerqBook/blob/master/app/uploaders/picture_uploader.rb"&gt;picture_uploader.rb&lt;/a&gt; for production storage with&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if Rails.env.production? 
  storage :fog 
else 
  storage :file
end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;&lt;center&gt; That's all folks! &lt;/center&gt;&lt;/h1&gt;

</description>
      <category>ruby</category>
      <category>rails</category>
    </item>
    <item>
      <title>DRAGnet Reducer</title>
      <dc:creator>JaredHarbison</dc:creator>
      <pubDate>Mon, 30 Dec 2019 03:21:59 +0000</pubDate>
      <link>https://dev.to/jaredharbison/dragnet-reducer-52ih</link>
      <guid>https://dev.to/jaredharbison/dragnet-reducer-52ih</guid>
      <description>&lt;h3&gt;&lt;center&gt;Rails + React + Redux - Pt 11&lt;/center&gt;&lt;/h3&gt;




&lt;p&gt;The queens_reducer.js was the first reducer I wrote for DRAGnet. It was a natural choice as the simplest. &lt;/p&gt;




&lt;h1&gt;&lt;center&gt; Let's get started! &lt;/center&gt;&lt;/h1&gt;




&lt;p&gt;For UPDATE_QUEEN I defined idx as the id for the queen being updated by the user. In the case of UPDATE_QUEEN, the return is the data for the updated queen spliced from the complete array of drag_queens. &lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;





&lt;h1&gt;&lt;center&gt; That's all folks! &lt;/center&gt;&lt;/h1&gt;

</description>
    </item>
    <item>
      <title>It's Just Pretentious Enough - An Update to My Parallax</title>
      <dc:creator>JaredHarbison</dc:creator>
      <pubDate>Mon, 23 Dec 2019 04:25:42 +0000</pubDate>
      <link>https://dev.to/jaredharbison/it-s-just-pretentious-enough-an-update-to-my-parallax-1jpa</link>
      <guid>https://dev.to/jaredharbison/it-s-just-pretentious-enough-an-update-to-my-parallax-1jpa</guid>
      <description>&lt;h1&gt;&lt;center&gt;My Portfolio Site - Pt 4&lt;/center&gt;&lt;/h1&gt;




&lt;p&gt;I tend to gravitate to my portfolio site of all my side projects at the moment. I would like to make sure a viewer sees something different and unique to me before I hop into some of the functional features I have planned. With most of the more complicated visual features behind me, I can whip up some better styling for the content, push it, and move on. I've been eager to get back into DRAGnet! &lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/knlLPN0Zpbw"&gt;
&lt;/iframe&gt;
&lt;/p&gt;




&lt;h1&gt;&lt;center&gt; Take a look at some code! &lt;/center&gt;&lt;/h1&gt;





&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;I hope to publish the updated version of the site this week! &lt;/p&gt;




&lt;h1&gt;&lt;center&gt; That's All Folks! &lt;/center&gt;&lt;/h1&gt;




</description>
      <category>html</category>
      <category>css</category>
    </item>
    <item>
      <title>♬♫♪COME TOGETHER♪♫♬</title>
      <dc:creator>JaredHarbison</dc:creator>
      <pubDate>Mon, 09 Dec 2019 04:13:46 +0000</pubDate>
      <link>https://dev.to/jaredharbison/come-together-4bhp</link>
      <guid>https://dev.to/jaredharbison/come-together-4bhp</guid>
      <description>&lt;p&gt;NYC provides opportunity like few other places in the world. While technology connects us more and more without requiring we link up in person, that technology exists here along side one of the largest metropolises on the planet. &lt;/p&gt;

&lt;p&gt;As I began looking for IRL resources to continue development of my engineering skills, I quickly realized the intellectual and networking gold mine within the NYC tech events space. I've found many helpful resources navigating the opportunities, but you might imagine I gravitated to Meetup for help navigating all the opportunities in NYC.&lt;/p&gt;

&lt;p&gt;When I began attending tech events in NYC I decided to cast a wide net before solidifying a selective strategy. I spent an hour every Monday morning looking at events in the city for the current and following weeks. I set a goal to attend an average of three events each week. I attended networking mixers, instructional classes, group projects, panel discussions, conferences, and a couple I can probably classify as miscellaneous. &lt;/p&gt;

&lt;p&gt;After a couple months of attending a variety of events I had a better idea of where I found and provided value. I want to share my resources and favorites here but hope to only share why I like them. TBH I feel conflicted in encouraging anyone to attend because some are already quite packed and I like a good seat! &lt;/p&gt;

&lt;p&gt;I'm currently thinking I'll refresh this single post often with my favorites, rather than turning it into a series. I would rather it evolve over time than expand.&lt;/p&gt;




&lt;h1&gt;&lt;center&gt; Let's get started! &lt;/center&gt;&lt;/h1&gt;




&lt;blockquote&gt;
&lt;p&gt;Meetup Group =&amp;gt; &lt;a href="https://www.meetup.com/Build-with-Code-New-York/"&gt;Build with Code NYC&lt;/a&gt; =&amp;gt; JavaScript the Hard Parts. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This revolving lecture series is 6:30pm most Thursdays at &lt;a href="//codesmith.io"&gt;Codesmith&lt;/a&gt; in Tribeca. Codesmith hosts several other great event series and a learning platform called CSX. The JStHP series is generally led by the CEO or Senior Software Engineer and provided via webcast for anyone unable to attend in person. Like many other things in NYC, you know this is a good time from the size of the crowd that it can draw. I usually sign up the week before to avoid the waiting list. Each event starts out with an introduction around the room and a simple and relevant ice breaker. The instructors keep the room engaged by prompting participation from the room. As you answer questions in front of roughly 50-70 other attendees, the instructors coach you on your problem solving and technical communication. These events have really helped break down my discomfort talking about code under pressure, which as you can imagine is a great preparation for technical interviews. In addition to great subject matter, I have found great connections in attendance at JStHP. (as of Dec 2019)&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Heroku Ruveal</title>
      <dc:creator>JaredHarbison</dc:creator>
      <pubDate>Mon, 02 Dec 2019 03:59:54 +0000</pubDate>
      <link>https://dev.to/jaredharbison/dragnet-4mib</link>
      <guid>https://dev.to/jaredharbison/dragnet-4mib</guid>
      <description>&lt;h1&gt;&lt;center&gt;Rails + React + Redux - Pt 10 &lt;/center&gt;&lt;/h1&gt;




&lt;p&gt;I'm nearly ready to make the DRAGnet backend accessible while I continue work on the frontend. I decided to run with Heroku, largely because I found their documentation to be so good. The setup was really simple so I've tested it and pulled it back down while I put together some documentation. &lt;/p&gt;




&lt;h1&gt;&lt;center&gt; Let's get started! &lt;/center&gt;&lt;/h1&gt;




&lt;p&gt;I had already installed the Heroku CLI onto my machine for a previous project- it was easy breezy.&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;heroku login&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;Because I had previously stuck with the 'sqlite3' gem when creating the Rails project, I needed to switch to 'pg' in the gemfile.&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;bundle install&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;With the database gem change I needed to update the config/database.yml file.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;The Heroku &lt;a href="https://devcenter.heroku.com/articles/getting-started-with-rails6#create-a-welcome-page"&gt;documentation&lt;/a&gt; recommends setting up a welcome page, which I already had by a different name. The next step in their documentation is to store the project in git, which I had already already done. &lt;/p&gt;

&lt;p&gt;I ran &lt;code&gt;heroku create&lt;/code&gt; from the root directory then verified the remote was added with &lt;code&gt;git config --list | grep heroku&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I deployed the code with &lt;code&gt;git push heroku master&lt;/code&gt; and migrated the database with &lt;code&gt;heroku run rake:db migrate&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I ran a dyno with &lt;code&gt;heroku ps:scale web=1&lt;/code&gt;, checked the state of the dyno with &lt;code&gt;heroku ps&lt;/code&gt;, then paid a little visit &lt;code&gt;heroku open&lt;/code&gt;!&lt;/p&gt;




&lt;h1&gt;&lt;center&gt; That's all folks! &lt;/center&gt;&lt;/h1&gt;

</description>
      <category>ruby</category>
      <category>rails</category>
    </item>
    <item>
      <title>Baby's First Open Source Contribution</title>
      <dc:creator>JaredHarbison</dc:creator>
      <pubDate>Mon, 25 Nov 2019 04:16:14 +0000</pubDate>
      <link>https://dev.to/jaredharbison/gulp-3aa7</link>
      <guid>https://dev.to/jaredharbison/gulp-3aa7</guid>
      <description>&lt;h1&gt;&lt;center&gt;GitPitch Tags for Dev.to&lt;/center&gt;&lt;/h1&gt;




&lt;p&gt;I have been revisiting my previous DEV posts to update content and build a consistent format between each post. Through that process -and as I developed additional ideas for what I want to achieve with my DEV journal- I began to see the need for something to help accomplish two objectives...&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;I wanted an extremely simple method to update a single post with more content, preferably through Github. &lt;/li&gt;
&lt;li&gt;I wanted a method to embed a slideshow in a post, but something with fewer steps than using SlideShare or Speakerdeck. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After some quick research, I landed on GitPitch as the perfect option. With a GITPITCH.md markdown file in a GitHub repo, a presentation is instantly available through a GitPitch URL! &lt;/p&gt;

&lt;p&gt;Check out this example from GitPitch! &lt;/p&gt;

&lt;p&gt;&lt;iframe height="450" src="https://gitpitch.com/gitpitch/in-60-seconds#/"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Fortunately, DEV.to had Liquid tags for SlideShare and Speakerdeck but not GitPitch. I thought it was a perfect time and task for my first open source contribution. Given my existing knowledge of Ruby and ERB, it was simple enough to get a grasp of the process without getting tied up with researching the work itself. &lt;/p&gt;

&lt;p&gt;I submitted a pull request to DEV.to explaining what I was hoping to achieve. With the approval, DEV.to provided a document to guide the creation of a Liquid tag. I hadn't come across any need for Liquid before and I was happy to learn a little about it through the process. I was on my way once I forked and cloned the DEV.to platform to run locally on my machine while I built the tag. &lt;/p&gt;




&lt;h1&gt;&lt;center&gt; Let's get started! &lt;/center&gt;&lt;/h1&gt;




&lt;p&gt;I created an RSpec file to keep myself on the right track and meet the pull request requirements.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Next I built the tag methods. I used other Liquid tag source code for a little direction, but still found opportunities to write new code and refactor things down to a reasonable minimum. &lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;I included a partial file to a simple iframe embed of a gitpitch tag. I looked at other partials to determine a reasonably consistent height for the iframe. Checkout the example below from GitPitch!&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;My last step was an extremely brief addition to the DEV Community Editor Guide! Peak inside the Gist below for usage instructions for the tag or the Editor Guide itself. &lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;It was a lot of fun to contribute and I can't wait to start using the GitPitch tag! I realize now this fits pretty squarely within how I found software engineering- with a "need it? make it!" mentality. &lt;/p&gt;




&lt;h1&gt;&lt;center&gt; That's all folks! &lt;/center&gt;&lt;/h1&gt;

</description>
      <category>opensource</category>
      <category>firstyearincode</category>
      <category>ruby</category>
      <category>tdd</category>
    </item>
  </channel>
</rss>
