<?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: Luke</title>
    <description>The latest articles on Forem by Luke (@lukerrr).</description>
    <link>https://forem.com/lukerrr</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%2F3674326%2F9d5bda8c-e0f2-4f5c-9b49-8835f92f8b53.png</url>
      <title>Forem: Luke</title>
      <link>https://forem.com/lukerrr</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/lukerrr"/>
    <language>en</language>
    <item>
      <title>From #96 to #12 on ProductHunt: What I Learned</title>
      <dc:creator>Luke</dc:creator>
      <pubDate>Thu, 22 Jan 2026 14:44:31 +0000</pubDate>
      <link>https://forem.com/lukerrr/from-96-to-12-on-producthunt-what-i-learned-cl1</link>
      <guid>https://forem.com/lukerrr/from-96-to-12-on-producthunt-what-i-learned-cl1</guid>
      <description>&lt;p&gt;Hi, I'm Luke. I'm a software developer and entrepreneur. &lt;/p&gt;

&lt;p&gt;I've launched a handful of products in my life, the biggest ones being &lt;a href="https://mymobilemods.com" rel="noopener noreferrer"&gt;MyMobileMods&lt;/a&gt;, &lt;a href="https://biblify.ai" rel="noopener noreferrer"&gt;Biblify.ai&lt;/a&gt;, and now &lt;a href="https://doclific.com" rel="noopener noreferrer"&gt;Doclific&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Each one of these projects I did entirely by myself. No graphic designers. No UI/UX designers. Nothing. &lt;/p&gt;

&lt;p&gt;When I originally launched MyMobileMods, my first project, &lt;a href="https://www.producthunt.com/products/home-8/launches/mymobilemods" rel="noopener noreferrer"&gt;this&lt;/a&gt; was my ProductHunt listing. I essentially just added some horrible screenshots and a random video I made. I didn't explain the product particularly well. I asked all my family members and friends to make accounts and upvote it (&lt;strong&gt;big mistake&lt;/strong&gt;). It did alright; maybe top 100, but was hidden early on and lost its rank because of the "spam" accounts (really just my friends and family) that upvoted it. The product itself was buggy and, honestly, kind of ugly. I should have taken more time to polish it before launching.&lt;/p&gt;

&lt;p&gt;After that, I launched Biblify.ai: &lt;a href="https://www.producthunt.com/products/biblify-ai" rel="noopener noreferrer"&gt;https://www.producthunt.com/products/biblify-ai&lt;/a&gt;. This product was objectively better than MyMobileMods. It was more polished and genuinely useful. However, I still put no effort into the images, only uploading a single screenshot/mockup of the application. It ended up getting a handful of upvotes, ranking #96 for the day.&lt;/p&gt;

&lt;p&gt;Today, I launched Doclific: &lt;a href="https://www.producthunt.com/products/doclific" rel="noopener noreferrer"&gt;https://www.producthunt.com/products/doclific&lt;/a&gt;. Yes, it's still early in the day, but it looks pretty likely that I'll end up in at least the top 15 products for the day. Not bad. Here's what changed:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;I focused on my images and content. I paid $30 to use Screen Studio on Mac (an amazing product btw). This allowed me to create amazing screen recordings and beautiful screenshots too. I learned how to use Figma and spent hours perfecting my images and screen recordings. From a technical perspective, these tasks seem unimportant, but I'm slowly discovering that if you're going to be a solopreneur, it's essential. You can't &lt;em&gt;just&lt;/em&gt; focus on the parts you like. In fact, you should probably be spending &lt;strong&gt;extra&lt;/strong&gt; time on the parts you don't like because you're probably worse at them.&lt;/li&gt;
&lt;li&gt;I still sent the ProductHunt link to people, but I chose them more carefully. People already in the tech space or people were the best options. I avoided people not in that space and people that don't already have an account. It's not the worth the risk of potentially getting shadow banned or unranked. &lt;/li&gt;
&lt;li&gt;I posted on LinkedIn. This was actually a decent help. As long as you have a decent post, LinkedIn will share it with randos, so I actually got some decent engagement from that. I also posted multiple times already. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you have any other suggestions or just questions, I'd love to hear them. &lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>opensource</category>
      <category>showdev</category>
      <category>marketing</category>
    </item>
    <item>
      <title>Checksums: What They Are, Why They Matter, and Where They Belong in Your Release Pipeline</title>
      <dc:creator>Luke</dc:creator>
      <pubDate>Wed, 14 Jan 2026 23:57:51 +0000</pubDate>
      <link>https://forem.com/lukerrr/checksums-what-they-are-why-they-matter-and-where-they-belong-in-your-release-pipeline-393</link>
      <guid>https://forem.com/lukerrr/checksums-what-they-are-why-they-matter-and-where-they-belong-in-your-release-pipeline-393</guid>
      <description>&lt;p&gt;When you distribute software—especially binaries—you’re making an implicit promise: this file is exactly what I intended to ship. Checksums are how you keep that promise.&lt;/p&gt;

&lt;p&gt;In this article we’ll go through what checksums are, why they matter, and how to add them to your own open source project. Let’s get started!&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a checksum?
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;checksum&lt;/strong&gt; is a fixed-length value derived from a file’s contents using a cryptographic hash function. SHA256 is the gold standard, so unless you have a specific reason to use another algorithm, best to stick with SHA256. If even a single byte of the file changes, the checksum changes completely. After downloading the file, the checksum can be computed and compared against the advertised value. Thus, a checksum is basically a way of saying &lt;em&gt;“yes, this program is what it claims to be.”&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  To summarize…
&lt;/h3&gt;

&lt;p&gt;Checksums (in this context) &lt;strong&gt;can&lt;/strong&gt;…&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Detect &lt;strong&gt;corruption&lt;/strong&gt; after downloading a file&lt;/li&gt;
&lt;li&gt;Detect &lt;strong&gt;tampering&lt;/strong&gt; after downloading a file&lt;/li&gt;
&lt;li&gt;Provide confidence to end users&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Checksums &lt;strong&gt;cannot&lt;/strong&gt;…&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prove &lt;strong&gt;who&lt;/strong&gt; created the file&lt;/li&gt;
&lt;li&gt;Protect against malicious servers publishing a tampered with file and corresponding checksum&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  A note on package managers
&lt;/h3&gt;

&lt;p&gt;You may be wondering if you’re currently as risk for any attacks or malware because of the 20,000 npm packages you installed within the past couple minutes. However, nearly all package managers have some sort of safety net that verifies the integrity of the download before installing. Binaries that are not distributed by a package manager (via GitHub releases and the like) don’t have that built in. Just something to keep in mind.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adding checksums to your project
&lt;/h2&gt;

&lt;p&gt;Adding checksums to your open source project is actually quite simple. Just make sure you put them in the right place or they won’t work.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Build artifacts
↓
Package artifacts (tar.gz, zip, binaries)
↓
Generate checksums
↓
Publish artifacts + checksums
↓
Create release
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;My current project, Doclific, uses a single file (checksums.txt) containing the checksums followed by two spaces, then the specific file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;a21bd2e10abbdb057e8acd91a331b5ff6e187e845031f22d0117927e276d6b4f  doclific-v0.1.1-darwin-amd64.tar.gz
a8c91ead81f402e380293f9a0fa6cf56cf380782dbfdff9bc604548bf14a35da  doclific-v0.1.1-darwin-arm64.tar.gz
499224f4d05f023c560978c6fff2bbb381b7425e742e0b5b3c4b54068d7f6dfb  doclific-v0.1.1-linux-amd64.tar.gz
1913c0669ec383133e8460a0be9df43e285a5ebc39928e62c86fcb6c9b486665  doclific-v0.1.1-linux-arm64.tar.gz
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I generate the file in my &lt;code&gt;release.sh&lt;/code&gt; file which runs every time I create a new release.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;echo "🔐 Generating checksums"
cd "$DIST_DIR"
shasum -a 256 * &amp;gt; checksums.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then when the user runs the command &lt;code&gt;curl -fsSL https://raw.githubusercontent.com/muellerluke/doclific/main/scripts/install.sh | bash&lt;/code&gt; it will pull the install.sh script and run it. Inside the install script, it generates a checksum based upon the downloaded file and checks to make sure it matches that of the hosted checksum.txt file in the release.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;info "Verifying checksum..."

# Determine command
if command -v sha256sum &amp;gt;/dev/null 2&amp;gt;&amp;amp;1; then
    CHECKSUM_CMD="sha256sum -c -"
elif command -v shasum &amp;gt;/dev/null 2&amp;gt;&amp;amp;1; then
    CHECKSUM_CMD="shasum -a 256 -c -"
else
    err "No SHA256 checksum tool found. Please install sha256sum or shasum."
fi

# Run checksum verification
grep "$ARCHIVE" "$CHECKSUM_FILE" | $CHECKSUM_CMD || err "Checksum verification failed"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Note: some OS version may or may not have shasum installed, so I first check to see if it is or use sha256 if it is not.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Closing thoughts
&lt;/h2&gt;

&lt;p&gt;Again, if you're distributing software via a package manager, you generally don't have to worry about this. However, if you're distributing a binary outside of a package manager using curl or something else, then implementing checksums will provide an added layer of security and confidence for your end users.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>opensource</category>
      <category>security</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Switching from TS to Go</title>
      <dc:creator>Luke</dc:creator>
      <pubDate>Wed, 14 Jan 2026 19:07:14 +0000</pubDate>
      <link>https://forem.com/lukerrr/switching-from-ts-to-go-5770</link>
      <guid>https://forem.com/lukerrr/switching-from-ts-to-go-5770</guid>
      <description>&lt;p&gt;I recently built my first open-source project. It's called "Doclific" and it was originally an NPM module that could be used in the CLI to start a notion-like documentation editor. It worked great and got over 2k downloads in the first month. However, I soon realized that by keeping it as an NPM package, I could potentially be alienating quite a few devs. Thus, I started the journey of transitioning the TypeScript and oRPC backend into Golang...&lt;/p&gt;

&lt;p&gt;To begin, it took a little bit to figure out how I wanted to structure the project originally. I'm familiar with how to structure Node projects, but not as familiar with Go. There were definitely some nuances, but eventually I figured it out.&lt;/p&gt;

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

&lt;p&gt;The actual server setup, routes, and controllers were fairly simple as well. Coming from TypeScript primarily, it was easy to translate.&lt;/p&gt;

&lt;p&gt;The hard parts came from the shell scripts needed for creating the releases and install. I'm not much of a bash guy, so this was a pain. &lt;/p&gt;

&lt;p&gt;One thing I became more familiar with was checksum verification. When the release script runs, it generates a hash for the built files.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# ----------------------------
# Generate checksums
# ----------------------------
echo "🔐 Generating checksums"
cd "$DIST_DIR"
shasum -a 256 * &amp;gt; checksums.txt
cd ..
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After that, when a user installs it, it will verify that the checksum of the install matches that of the checksum in GitHub.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# -----------------------------
# Verify checksum
# -----------------------------
info "Verifying checksum..."

# Determine command
if command -v sha256sum &amp;gt;/dev/null 2&amp;gt;&amp;amp;1; then
    CHECKSUM_CMD="sha256sum -c -"
elif command -v shasum &amp;gt;/dev/null 2&amp;gt;&amp;amp;1; then
    CHECKSUM_CMD="shasum -a 256 -c -"
else
    err "No SHA256 checksum tool found. Please install sha256sum or shasum."
fi

# Run checksum verification
grep "$ARCHIVE" "$CHECKSUM_FILE" | $CHECKSUM_CMD || err "Checksum verification failed"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Previously, when a user wanted to download Doclific, they would have to use this command &lt;code&gt;npm i -g doclific&lt;/code&gt; -- meaning they would have to have npm/node installed. Now, it can be installed with &lt;code&gt;curl -fsSL https://raw.githubusercontent.com/muellerluke/doclific/main/scripts/install.sh | bash&lt;/code&gt; -- making it more accessible.&lt;/p&gt;

&lt;p&gt;If you have any thoughts or suggestions, leave a comment!&lt;/p&gt;

</description>
      <category>programming</category>
      <category>go</category>
      <category>typescript</category>
      <category>opensource</category>
    </item>
    <item>
      <title>STOP DOING KT SESSIONS</title>
      <dc:creator>Luke</dc:creator>
      <pubDate>Tue, 06 Jan 2026 14:42:13 +0000</pubDate>
      <link>https://forem.com/lukerrr/stop-doing-kt-sessions-2lpj</link>
      <guid>https://forem.com/lukerrr/stop-doing-kt-sessions-2lpj</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;STOP IT. STOP IT NOW.&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  For The Uninitiated...
&lt;/h3&gt;

&lt;p&gt;For those of you uninitiated, KT sessions are these long (sometimes 3+ hours) and painful live and recorded sessions where a certain person with a certain level of knowledge on a project goes through the entire project trying to explain things. &lt;/p&gt;

&lt;h3&gt;
  
  
  KT Sessions in Practice
&lt;/h3&gt;

&lt;p&gt;In practice they're essentially useless. Nobody is actually paying attention. Nobody will go back and watch them in the future (unless forced to do so). Nobody wants to talk for that long. Given the fact that the person giving the KT session also didn't prepare for it, there's usually also a large amount of rambling and circular explanations. They're essentially useless. &lt;/p&gt;

&lt;p&gt;However, with AI now, they are &lt;em&gt;slightly&lt;/em&gt; less useless. Instead of listening for the 4+ hours to find the minute detail you're looking for, you can just search the AI-generated notes. However, this only solves that specific problem. Even if you find what you're looking for in the notes, you still probably don't know which files are being referenced or, even if you do know which files are being referenced, the files have almost definitely changed since the recording. Again, KT sessions suck.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Solution (is there one?)
&lt;/h3&gt;

&lt;p&gt;In my several years of software development, I haven't really found a good alternative. There are tools like Readme files, but nobody really wants to mess with those. They're just not pretty and not fun. &lt;/p&gt;

&lt;p&gt;After thinking about this for quite some time, I built a new open source tool in the hopes of at least limiting the frequency and duration of these KT sessions. It's called "doclific" and is available as an NPM package. It's essentially a notion-like rich text editor where the docs live in your repo. You can easily reference snippets of code and the snippets update automatically if you make changes to the code. &lt;/p&gt;

&lt;h3&gt;
  
  
  My Blunder
&lt;/h3&gt;

&lt;p&gt;After building what I thought was an awesome tool, I realized limiting or even getting rid of KT sessions is like trying to get the sun not to rise. It's impossible. They're simply a right of passage. Yes, they are horrible, but what better way to understand the new company you're starting for than to listen to the most boring person ever speak in a monotone voice for four hours talking about a codebase you don't even have access to. Here in lies the true genius of the profession we all love.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>career</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Documentation Sucks (I may have made it suck less)</title>
      <dc:creator>Luke</dc:creator>
      <pubDate>Tue, 23 Dec 2025 01:54:17 +0000</pubDate>
      <link>https://forem.com/lukerrr/documentation-sucks-i-may-have-made-it-suck-less-o4f</link>
      <guid>https://forem.com/lukerrr/documentation-sucks-i-may-have-made-it-suck-less-o4f</guid>
      <description>&lt;h2&gt;
  
  
  The Story Behind It
&lt;/h2&gt;

&lt;p&gt;Technical documentation sucks. We all know it. Yet, we all continue to use the same tools over and over again. I recently took a new position, and one of the tasks I have before I leave my current company is essentially documentation hell -- basically document all parts of every project you're on. It's a lot. &lt;/p&gt;

&lt;p&gt;For this type of technical documentation, you generally have three options:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A long a painful video that no one will ever actually listen through fully.&lt;/li&gt;
&lt;li&gt;Adding a bunch of readme's (boring and just as painful).&lt;/li&gt;
&lt;li&gt;Using something like notion and copying over snippets. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I know there are other tools out there, but I haven't found many that really merge the code with the rich text well to create a visually appealing editor and reader. Naturally, I decided to create my own...&lt;/p&gt;

&lt;h2&gt;
  
  
  The Product
&lt;/h2&gt;

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

&lt;p&gt;It didn't take long -- maybe 3-4 weeks total -- but I ended up creating a &lt;em&gt;decent&lt;/em&gt; documentation solution. It's called "Doclific" and is available as an npm package right now. It's free, open source, and a relatively simple codebase to navigate through.&lt;/p&gt;

&lt;p&gt;It's basically what it would look like if Git and Notion had a baby. It's a pretty editor with a hierarchy structure for notes. It has slash commands. It has direct snippet references (no more copying and pasting). It's AI-enabled, just add your provider, model, and key. Best of all, it lives in your codebase -- no additional expense or outside documentation to maintain. &lt;/p&gt;

&lt;h2&gt;
  
  
  My Favorite Features
&lt;/h2&gt;

&lt;p&gt;My favorite feature by far is the code snippet element. You can easily add it with the slash command, then find the specific file you want to reference through the editor, select the lines, and it'll display it right every time. If you change the code in your codebase, it'll reflect the changes next time you load up your Doclific. Additionally, each snippet has an attached link. When readers click the link, it opens a new VS Code window with the file and the cursor on the specified line. It makes finding and navigating through files very easy.&lt;/p&gt;

&lt;p&gt;The AI integration is an AMAZING feature IMO -- and something not offered by other products in the space. Prompt it to generate documentation on a specific workflow and the agent will find the relevant files, select the applicable lines, add descriptions, headers, etc, and add it all to your doc with the code snippets. &lt;/p&gt;

&lt;h2&gt;
  
  
  Thank You's
&lt;/h2&gt;

&lt;p&gt;Huge thanks to the maintainers of Platejs. They have many amazing rich text editor components. &lt;/p&gt;

&lt;h2&gt;
  
  
  Closing Words
&lt;/h2&gt;

&lt;p&gt;Let me know your thoughts on this tool. If you have any suggestions or issues, let me know!&lt;/p&gt;

</description>
      <category>documentation</category>
      <category>cli</category>
      <category>opensource</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
