<?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: Vic Shóstak</title>
    <description>The latest articles on DEV Community by Vic Shóstak (@koddr).</description>
    <link>https://dev.to/koddr</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%2F309030%2F2ae4e868-fb82-4b7a-8204-b2dc51c852ad.jpg</url>
      <title>DEV Community: Vic Shóstak</title>
      <link>https://dev.to/koddr</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/koddr"/>
    <language>en</language>
    <item>
      <title>🎉 Finally! Official launch of the Gowebly project on ProductHunt</title>
      <dc:creator>Vic Shóstak</dc:creator>
      <pubDate>Fri, 19 Jul 2024 12:18:41 +0000</pubDate>
      <link>https://dev.to/koddr/finally-official-launch-of-the-gowebly-project-on-producthunt-3o4g</link>
      <guid>https://dev.to/koddr/finally-official-launch-of-the-gowebly-project-on-producthunt-3o4g</guid>
      <description>&lt;p&gt;Hello, DEV friends! 😘&lt;/p&gt;

&lt;p&gt;I'm pleased to present you the &lt;a href="https://github.com/gowebly/gowebly" rel="noopener noreferrer"&gt;Gowebly&lt;/a&gt; project launch page on &lt;a href="https://www.producthunt.com/posts/gowebly" rel="noopener noreferrer"&gt;ProductHunt&lt;/a&gt; 👇&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://www.producthunt.com/posts/gowebly?embed=true&amp;amp;utm_source=badge-featured&amp;amp;utm_medium=badge&amp;amp;utm_souce=badge-gowebly" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fapi.producthunt.com%2Fwidgets%2Fembed-image%2Fv1%2Ffeatured.svg%3Fpost_id%3D471907%26theme%3Dlight" alt="Gowebly - A next-generation CLI tool that makes it easy to create amazing web applications with Go on the backend, using htmx, hyperscript or Alpine.js and the most popular CSS frameworks on the frontend | Product Hunt" width="250" height="54"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Yes, I know that many people have already tried using this CLI in their daily tasks. Therefore, I ask you to take the time and &lt;strong&gt;write a small&lt;/strong&gt; (or large) review on the project page &lt;a href="https://www.producthunt.com/posts/gowebly" rel="noopener noreferrer"&gt;here&lt;/a&gt;. This will help me move on and improve &lt;strong&gt;Gowebly&lt;/strong&gt; CLI every day! 😌&lt;/p&gt;

&lt;p&gt;And for those who have just heard about &lt;a href="https://gowebly.org/" rel="noopener noreferrer"&gt;Gowebly&lt;/a&gt;, here is a short reference 👇&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The &lt;strong&gt;Gowebly&lt;/strong&gt; CLI performs the same function as &lt;code&gt;create-react-app&lt;/code&gt; (or similar) to start a new project without wasting time. Also, this project serves as a guide to the world of full-stack development on &lt;strong&gt;Go&lt;/strong&gt; using the &lt;strong&gt;htmx&lt;/strong&gt; library, &lt;strong&gt;hyperscript&lt;/strong&gt; or &lt;strong&gt;Alpine.js&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Thank you for staying with me! 🔥 Together we can do more.&lt;/p&gt;

&lt;p&gt;– Vic Shóstak aka &lt;a href="https://github.com/koddr" rel="noopener noreferrer"&gt;@koddr&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>go</category>
      <category>news</category>
      <category>showdev</category>
    </item>
    <item>
      <title>⚡️ Gowebly CLI now supports the PocketBase framework</title>
      <dc:creator>Vic Shóstak</dc:creator>
      <pubDate>Fri, 10 May 2024 08:12:25 +0000</pubDate>
      <link>https://dev.to/koddr/gowebly-cli-now-supports-the-pocketbase-framework-bi6</link>
      <guid>https://dev.to/koddr/gowebly-cli-now-supports-the-pocketbase-framework-bi6</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Hello, DEV people! 👋&lt;/p&gt;

&lt;p&gt;Now, I've released the &lt;a href="https://github.com/gowebly/gowebly" rel="noopener noreferrer"&gt;Gowebly CLI&lt;/a&gt; &lt;code&gt;v2.5.0&lt;/code&gt; which includes &lt;a href="https://pocketbase.io" rel="noopener noreferrer"&gt;PocketBase&lt;/a&gt; framework/backend support.&lt;/p&gt;

&lt;p&gt;Okay, let's get started 😉&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  📝 Table of contents
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;What is PocketBase?&lt;/li&gt;
&lt;li&gt;How to use PocketBase with Gowebly CLI?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is PocketBase?
&lt;/h2&gt;

&lt;p&gt;PocketBase is an open source ready-to-use framework/backend for your next SaaS and mobile application in a single file.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/pocketbase" rel="noopener noreferrer"&gt;
        pocketbase
      &lt;/a&gt; / &lt;a href="https://github.com/pocketbase/pocketbase" rel="noopener noreferrer"&gt;
        pocketbase
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Open Source realtime backend in 1 file
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;
    &lt;a href="https://pocketbase.io" rel="nofollow noopener noreferrer"&gt;
        &lt;img src="https://camo.githubusercontent.com/3b198a3ea92b78b9f56f6ec7c2eea0d81ee57ec8b4e2420cde3e1fecedcbc2c7/68747470733a2f2f692e696d6775722e636f6d2f3571696d6e6d352e706e67" alt="PocketBase - open source backend in 1 file"&gt;
    &lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
    &lt;a href="https://github.com/pocketbase/pocketbase/actions/workflows/release.yaml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/pocketbase/pocketbase/actions/workflows/release.yaml/badge.svg" alt="build"&gt;&lt;/a&gt;
    &lt;a href="https://github.com/pocketbase/pocketbase/releases" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/67104e4d332b59803d41f86ab7c182def2d3b30c862519d18cf4cdb43ad39c97/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f72656c656173652f706f636b6574626173652f706f636b6574626173652e737667" alt="Latest releases"&gt;&lt;/a&gt;
    &lt;a href="https://pkg.go.dev/github.com/pocketbase/pocketbase" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/119fbc17b49b4daa7b4b12f4f5961fe6bf1c453d65ab465b3949bdf98e6a2ef8/68747470733a2f2f676f646f632e6f72672f6769746875622e636f6d2f706f636b6574626173652f706f636b6574626173653f7374617475732e737667" alt="Go package documentation"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://pocketbase.io" rel="nofollow noopener noreferrer"&gt;PocketBase&lt;/a&gt; is an open source Go backend that includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;embedded database (&lt;em&gt;SQLite&lt;/em&gt;) with &lt;strong&gt;realtime subscriptions&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;built-in &lt;strong&gt;files and users management&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;convenient &lt;strong&gt;Admin dashboard UI&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;and simple &lt;strong&gt;REST-ish API&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;For documentation and examples, please visit &lt;a href="https://pocketbase.io/docs" rel="nofollow noopener noreferrer"&gt;https://pocketbase.io/docs&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;div class="markdown-alert markdown-alert-warning"&gt;
&lt;p class="markdown-alert-title"&gt;Warning&lt;/p&gt;
&lt;p&gt;Please keep in mind that PocketBase is still under active development
and therefore full backward compatibility is not guaranteed before reaching v1.0.0.&lt;/p&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;API SDK clients&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;The easiest way to interact with the PocketBase Web APIs is to use one of the official SDK clients:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;JavaScript - &lt;a href="https://github.com/pocketbase/js-sdk" rel="noopener noreferrer"&gt;pocketbase/js-sdk&lt;/a&gt;&lt;/strong&gt; (&lt;em&gt;Browser, Node.js, React Native&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dart - &lt;a href="https://github.com/pocketbase/dart-sdk" rel="noopener noreferrer"&gt;pocketbase/dart-sdk&lt;/a&gt;&lt;/strong&gt; (&lt;em&gt;Web, Mobile, Desktop, CLI&lt;/em&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You could also check the recommendations in &lt;a href="https://pocketbase.io/docs/how-to-use/" rel="nofollow noopener noreferrer"&gt;https://pocketbase.io/docs/how-to-use/&lt;/a&gt;.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Overview&lt;/h2&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Use as standalone app&lt;/h3&gt;
&lt;/div&gt;

&lt;p&gt;You could download the prebuilt executable for your platform from the &lt;a href="https://github.com/pocketbase/pocketbase/releases" rel="noopener noreferrer"&gt;Releases page&lt;/a&gt;.
Once downloaded, extract the archive and run &lt;code&gt;./pocketbase serve&lt;/code&gt; in the extracted directory.&lt;/p&gt;
&lt;p&gt;The prebuilt executables are based on the &lt;a href="https://github.com/pocketbase/pocketbase/blob/master/examples/base/main.go" rel="noopener noreferrer"&gt;&lt;code&gt;examples/base/main.go&lt;/code&gt;&lt;/a&gt;…&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/pocketbase/pocketbase" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Main features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Realtime database&lt;/strong&gt;. Embedded performant database with schema builder, data validations, realtime subscriptions and easy to use REST api.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authentication&lt;/strong&gt;. Manage your app users and handle email/password and OAuth2 sign-ups (Google, Facebook, GitHub, GitLab and more) without the hassle.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;File storage&lt;/strong&gt;. Sanely store files locally or in a S3 storage. Easily attach media to your database records and generate thumbs on the fly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extendable&lt;/strong&gt;. Use as a standalone app OR as a framework, that you can extend via Go and JavaScript hooks to create your own custom portable backend.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;↑ Table of contents&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How to use PocketBase with Gowebly CLI?
&lt;/h2&gt;

&lt;p&gt;The first thing you should do is verify that you are using Gowebly CLI version &lt;code&gt;v2.5.0&lt;/code&gt; or higher. &lt;/p&gt;

&lt;p&gt;Next, when you start creating a new project, just switch the &lt;code&gt;Go framework&lt;/code&gt; selector to the &lt;code&gt;PocketBase&lt;/code&gt; option:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;gowebly create
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And &lt;a href="https://github.com/gowebly/gowebly" rel="noopener noreferrer"&gt;Gowebly CLI&lt;/a&gt; created a new project with the &lt;strong&gt;PocketBase&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Yeah, it's just working! 🎉&lt;/p&gt;

&lt;p&gt;↑ Table of contents&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Photos and videos by
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Vic Shóstak &lt;a href="https://github.com/koddr" rel="noopener noreferrer"&gt;https://github.com/koddr&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;PocketBase authors &lt;a href="https://pocketbase.io" rel="noopener noreferrer"&gt;https://pocketbase.io&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  P.S.
&lt;/h2&gt;

&lt;p&gt;If you want more articles (like this) on this blog, then post a comment below and subscribe to me. Thanks! 😻&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;❗️ You can support me on &lt;a href="https://boosty.to/koddr" rel="noopener noreferrer"&gt;Boosty&lt;/a&gt;, both on a &lt;em&gt;permanent&lt;/em&gt; and on a &lt;em&gt;one-time&lt;/em&gt; basis. All proceeds from this way will go to &lt;strong&gt;support&lt;/strong&gt; my OSS projects and will energize me to &lt;strong&gt;create&lt;/strong&gt; new products and articles for the community.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://boosty.to/koddr/donate" rel="noopener noreferrer"&gt;&lt;img alt="support me on Boosty" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fkoddr%2F.github%2Fmain%2Fimages%2Fboosty-badge.svg" width="868" height="330"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And of course, you can help me make developers' lives even better! Just connect to one of my projects as a contributor. It's easy!&lt;/p&gt;

&lt;p&gt;My main projects that need your help (and stars) 👇&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔥 &lt;a href="https://github.com/gowebly/gowebly" rel="noopener noreferrer"&gt;gowebly&lt;/a&gt;: A next-generation CLI tool that makes it easy to create amazing web applications with Go on the backend, using htmx, hyperscript or Alpine.js and the most popular CSS frameworks on the frontend.&lt;/li&gt;
&lt;li&gt;✨ &lt;a href="https://github.com/create-go-app" rel="noopener noreferrer"&gt;create-go-app&lt;/a&gt;: Create a new production-ready project with Go backend, frontend and deploy automation by running one CLI command.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Other my small projects: &lt;a href="https://github.com/koddr/yatr" rel="noopener noreferrer"&gt;yatr&lt;/a&gt;, &lt;a href="https://github.com/koddr/gosl" rel="noopener noreferrer"&gt;gosl&lt;/a&gt;, &lt;a href="https://github.com/koddr/json2csv" rel="noopener noreferrer"&gt;json2csv&lt;/a&gt;, &lt;a href="https://github.com/koddr/csv2api" rel="noopener noreferrer"&gt;csv2api&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>go</category>
      <category>webdev</category>
      <category>news</category>
      <category>sql</category>
    </item>
    <item>
      <title>Preline UI + Gowebly CLI = ❤️</title>
      <dc:creator>Vic Shóstak</dc:creator>
      <pubDate>Thu, 25 Apr 2024 14:13:20 +0000</pubDate>
      <link>https://dev.to/koddr/preline-ui-gowebly-cli--2928</link>
      <guid>https://dev.to/koddr/preline-ui-gowebly-cli--2928</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Hey, DEV friends! 👋&lt;/p&gt;

&lt;p&gt;Today, I've released the &lt;a href="https://github.com/gowebly/gowebly" rel="noopener noreferrer"&gt;Gowebly CLI&lt;/a&gt; &lt;code&gt;v2.4.0&lt;/code&gt; which includes &lt;a href="https://preline.co" rel="noopener noreferrer"&gt;Preline UI&lt;/a&gt; components library support for the frontend.&lt;/p&gt;

&lt;p&gt;Yep, let's take a closer look 👇&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  📝 Table of contents
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;What is Preline UI?&lt;/li&gt;
&lt;li&gt;How to use Preline UI with Gowebly CLI?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Preline UI?
&lt;/h2&gt;

&lt;p&gt;Preline UI is an open-source set of prebuilt UI components based on the utility-first Tailwind CSS framework.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/htmlstreamofficial" rel="noopener noreferrer"&gt;
        htmlstreamofficial
      &lt;/a&gt; / &lt;a href="https://github.com/htmlstreamofficial/preline" rel="noopener noreferrer"&gt;
        preline
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Preline UI is an open-source set of prebuilt UI components based on the utility-first Tailwind CSS framework.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;&lt;a href="https://preline.co" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/09170d31c7b6516f0018a402ee959022028855cc9a77d64348e4a0f1dd9a2da4/68747470733a2f2f7072656c696e652e636f2f6865726f2d696d6167652d322e6a7067" alt="Hero Image"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://preline.co" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/64608be325ea1147c5b3a989a711730bfa8baa4a4872a6294e7cd98a684d2ca0/68747470733a2f2f7072656c696e652e636f2f7072656c696e652d6c6f676f2e737667" alt="Logo" width="200" height="auto"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Preline UI is an open-source set of prebuilt UI components based on the utility-first Tailwind CSS framework.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://opensource.org/licenses/MIT" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/6cd0120cc4c5ac11d28b2c60f76033b52db98dac641de3b2644bb054b449d60c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d79656c6c6f772e737667" alt="License: MIT"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why use Preline UI?&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Based on the Tailwind CSS utility classes, Preline UI's prebuilt components and UI elements help you quickly design and customize responsive mobile-first websites with the components a website needs, including buttons, dropdowns, navigation bars, modals, and more.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What's in the box?&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Components are grouped by visual usability criteria (components, navigation, forms, etc.) and styled directly on top of Tailwind CSS, making them easy to extend and customize. This is a lifesaver for developers looking to create a unique and eye-catching design system without the hassle of creating each component by hand.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Getting Started&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Quick Setup&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;This guide will help you get started with Preline UI, including how to run, customize, update, and integrate your project!&lt;/p&gt;
&lt;p&gt;First, you need to make sure that you have a working &lt;a href="https://tailwindcss.com/" rel="nofollow noopener noreferrer"&gt;Tailwind CSS&lt;/a&gt; project…&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/htmlstreamofficial/preline" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Most awesome features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;750+ Free Components &amp;amp; Examples&lt;/strong&gt;. Hundreds of component examples for all your website needs that meet accessibility criteria.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Universal Framework Compatibility&lt;/strong&gt;. Preline UI is fully compatible wherever Tailwind CSS is in action, from React to Vue and beyond.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tailwind CSS Plugins&lt;/strong&gt;. Completely unstyled, fully accessible UI plugins for popular features that for one reason or another don't belong in core.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dark Mode&lt;/strong&gt;. All components include a dark variant that lets you style your site differently when dark mode is enabled.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;World's largest free Figma design system&lt;/strong&gt;. Preline UI Figma is the largest free design system for Figma, crafted with Tailwind CSS styles and Preline UI components with extra top-notch additions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bring your ideas to life in no time&lt;/strong&gt;. Preline UI provides all the essential components you need to convert your vision into thriving start-ups.&lt;/li&gt;
&lt;/ul&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%2Ftf4dwhiicascjty92qsy.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%2Ftf4dwhiicascjty92qsy.png" alt="preline ui" width="800" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;↑ Table of contents&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How to use Preline UI with Gowebly CLI?
&lt;/h2&gt;

&lt;p&gt;The first thing you should do is verify that you are using Gowebly CLI version &lt;code&gt;v2.4.0&lt;/code&gt; or higher. &lt;/p&gt;

&lt;p&gt;Next, when you start creating a new project, just switch the &lt;code&gt;CSS framework&lt;/code&gt; selector to the &lt;code&gt;Tailwind CSS with Preline UI components&lt;/code&gt; option:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;gowebly create
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And &lt;a href="https://github.com/gowebly/gowebly" rel="noopener noreferrer"&gt;Gowebly CLI&lt;/a&gt; created a new project with the &lt;strong&gt;Preline UI&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Yeah, it's just working! 🎉&lt;/p&gt;

&lt;p&gt;↑ Table of contents&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Photos and videos by
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Vic Shóstak &lt;a href="https://github.com/koddr" rel="noopener noreferrer"&gt;https://github.com/koddr&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Preline UI authors &lt;a href="https://preline.co" rel="noopener noreferrer"&gt;https://preline.co&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  P.S.
&lt;/h2&gt;

&lt;p&gt;If you want more articles (like this) on this blog, then post a comment below and subscribe to me. Thanks! 😻&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;❗️ You can support me on &lt;a href="https://boosty.to/koddr" rel="noopener noreferrer"&gt;Boosty&lt;/a&gt;, both on a &lt;em&gt;permanent&lt;/em&gt; and on a &lt;em&gt;one-time&lt;/em&gt; basis. All proceeds from this way will go to &lt;strong&gt;support&lt;/strong&gt; my OSS projects and will energize me to &lt;strong&gt;create&lt;/strong&gt; new products and articles for the community.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://boosty.to/koddr/donate" rel="noopener noreferrer"&gt;&lt;img alt="support me on Boosty" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fkoddr%2F.github%2Fmain%2Fimages%2Fboosty-badge.svg" width="868" height="330"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And of course, you can help me make developers' lives even better! Just connect to one of my projects as a contributor. It's easy!&lt;/p&gt;

&lt;p&gt;My main projects that need your help (and stars) 👇&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔥 &lt;a href="https://github.com/gowebly/gowebly" rel="noopener noreferrer"&gt;gowebly&lt;/a&gt;: A next-generation CLI tool that makes it easy to create amazing web applications with Go on the backend, using htmx, hyperscript or Alpine.js and the most popular CSS frameworks on the frontend.&lt;/li&gt;
&lt;li&gt;✨ &lt;a href="https://github.com/create-go-app" rel="noopener noreferrer"&gt;create-go-app&lt;/a&gt;: Create a new production-ready project with Go backend, frontend and deploy automation by running one CLI command.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Other my small projects: &lt;a href="https://github.com/koddr/yatr" rel="noopener noreferrer"&gt;yatr&lt;/a&gt;, &lt;a href="https://github.com/koddr/gosl" rel="noopener noreferrer"&gt;gosl&lt;/a&gt;, &lt;a href="https://github.com/koddr/json2csv" rel="noopener noreferrer"&gt;json2csv&lt;/a&gt;, &lt;a href="https://github.com/koddr/csv2api" rel="noopener noreferrer"&gt;csv2api&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>css</category>
      <category>webdev</category>
      <category>go</category>
      <category>news</category>
    </item>
    <item>
      <title>🤓 My top 3 Go packages that I wish I'd known about earlier</title>
      <dc:creator>Vic Shóstak</dc:creator>
      <pubDate>Fri, 01 Mar 2024 11:36:24 +0000</pubDate>
      <link>https://dev.to/koddr/my-top-3-go-packages-that-i-wish-id-known-about-earlier-3j10</link>
      <guid>https://dev.to/koddr/my-top-3-go-packages-that-i-wish-id-known-about-earlier-3j10</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Hello, my DEV friends! 🙌&lt;/p&gt;

&lt;p&gt;Today, I'd like to travel back in time, find myself at the very beginning of planning my current project, and advise myself to familiarize myself with these wonderful Go packages…&lt;/p&gt;

&lt;p&gt;Unfortunately, I can't do that! But I can introduce you to them. Here we go 👇&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  📝 Table of contents
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Templ&lt;/li&gt;
&lt;li&gt;Otter&lt;/li&gt;
&lt;li&gt;River&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Templ
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/a-h" rel="noopener noreferrer"&gt;
        a-h
      &lt;/a&gt; / &lt;a href="https://github.com/a-h/templ" rel="noopener noreferrer"&gt;
        templ
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A language for writing HTML user interfaces in Go.
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;h3&gt;
  
  
  A language for writing HTML UI in Go
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;✨ In recent months, I have been developing web projects using &lt;strong&gt;GOTTHA&lt;/strong&gt; stack: &lt;a href="https://go.dev" rel="noopener noreferrer"&gt;Go&lt;/a&gt; + &lt;a href="https://templ.guide" rel="noopener noreferrer"&gt;Templ&lt;/a&gt; + &lt;a href="https://tailwindcss.com" rel="noopener noreferrer"&gt;Tailwind CSS&lt;/a&gt; + &lt;a href="https://htmx.org" rel="noopener noreferrer"&gt;htmx&lt;/a&gt; + &lt;a href="https://alpinejs.dev" rel="noopener noreferrer"&gt;Alpine.js&lt;/a&gt;. As soon as I'm ready to talk about all the subtleties and pitfalls, I'll post it on my social networks. &lt;/p&gt;

&lt;p&gt;By the way, you can subscribe! All links are here 👉 &lt;a href="https://shostak.dev" rel="noopener noreferrer"&gt;https://shostak.dev&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Perhaps my favorite Go package in my entire practice of working with this programming language! The authors managed to combine two huge worlds at once:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The world of the frontend, which consists almost entirely of JSX-like web frameworks, such as &lt;strong&gt;React.js&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;The world of the backend, where we are free to use our familiar Go principles and packages as usual.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Together with &lt;strong&gt;Templ&lt;/strong&gt; we can write the following code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// index.templ&lt;/span&gt;

&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="n"&gt;templ&lt;/span&gt; &lt;span class="n"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;"Виктор"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;Привет&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Виктор&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="n"&gt;Как&lt;/span&gt; &lt;span class="n"&gt;твои&lt;/span&gt; &lt;span class="n"&gt;дела&lt;/span&gt; &lt;span class="n"&gt;сегодня&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;Hello&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;templ&lt;/span&gt; &lt;span class="n"&gt;greeting&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;person&lt;/span&gt; &lt;span class="n"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;div&lt;/span&gt; &lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"greeting"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;person&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// ...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Next, you just need to start the process of generating all &lt;code&gt;*.templ&lt;/code&gt; files:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go run github.com/a-h/templ/cmd/templ@latest generate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Which will be converted into a regular Go function and ready for use on your backend. For example, like this:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// main.go&lt;/span&gt;

&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="c"&gt;// ...&lt;/span&gt;

&lt;span class="c"&gt;// Simple user struct.&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Person&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;// Create a new user with name.&lt;/span&gt;
    &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"John"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c"&gt;// Create Templ handler.&lt;/span&gt;
    &lt;span class="n"&gt;handler&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;templ&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;greeting&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

    &lt;span class="c"&gt;// Serve Templ handler with HTTP server.&lt;/span&gt;
    &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Handle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c"&gt;// Start simple HTTP server.&lt;/span&gt;
    &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ListenAndServe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;":3000"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Open browser on &lt;code&gt;http://localhost:3000&lt;/code&gt; and see the result.&lt;/p&gt;

&lt;p&gt;Yes, it's that simple! 😉&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🔥 &lt;strong&gt;Templ&lt;/strong&gt; authors have taken care of supporting popular &lt;a href="https://templ.guide/commands-and-tools/ide-support" rel="noopener noreferrer"&gt;IDE&lt;/a&gt; and special mode for &lt;a href="https://templ.guide/commands-and-tools/hot-reload" rel="noopener noreferrer"&gt;hot-reload&lt;/a&gt; your &lt;code&gt;*.templ&lt;/code&gt; files.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you have never tried &lt;strong&gt;Templ&lt;/strong&gt; in your code practice, then &lt;strong&gt;I strongly recommend&lt;/strong&gt; doing it right now! It's really worth it.&lt;/p&gt;

&lt;p&gt;↑ Table of contents&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Otter
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/maypok86" rel="noopener noreferrer"&gt;
        maypok86
      &lt;/a&gt; / &lt;a href="https://github.com/maypok86/otter" rel="noopener noreferrer"&gt;
        otter
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A high performance cache for Go
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;h3&gt;
  
  
  High performance in-memory cache
&lt;/h3&gt;

&lt;p&gt;I believe that the most important features of &lt;strong&gt;Otter&lt;/strong&gt; are extremely simple API and autoconfiguration. And it works perfectly!&lt;/p&gt;

&lt;p&gt;Just set the parameters you want in the builder and enjoy. &lt;strong&gt;Otter&lt;/strong&gt; is automatically configured based on the parallelism of your application.&lt;/p&gt;

&lt;p&gt;Just write like this to create a new cache instance:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// cache/new.go&lt;/span&gt;

&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;cache&lt;/span&gt;

&lt;span class="c"&gt;// ...&lt;/span&gt;

&lt;span class="c"&gt;// Cache struct contains all caches.&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Cache&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;People&lt;/span&gt; &lt;span class="n"&gt;otter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CacheWithVariableTTL&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="n"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;New&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Cache&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;// Create a new cache instance for people.&lt;/span&gt;
    &lt;span class="n"&gt;peopleCache&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;otter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MustBuilder&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="n"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="m"&gt;100&lt;/span&gt;&lt;span class="n"&gt;_000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithVariableTTL&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Build&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;Cache&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;People&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;peopleCache&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;And now, you can use it on your app, like this:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// main.go&lt;/span&gt;

&lt;span class="c"&gt;// ...&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;// ...&lt;/span&gt;

    &lt;span class="c"&gt;// Get people from database.&lt;/span&gt;
    &lt;span class="n"&gt;people&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;dbexecutor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SelectPeople&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Background&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="s"&gt;"postgres://..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"SELECT * FROM people"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;slog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"can't select people from DB"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"details"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c"&gt;// Create a new cache instance.&lt;/span&gt;
    &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;cache&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;New&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c"&gt;// don't forget to check errors!&lt;/span&gt;

    &lt;span class="c"&gt;// Save people to the cache with TTL=180m.&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;People&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"people"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;people&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;180&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Minute&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;slog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"people are successfully saved to the in-memory cache"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c"&gt;// ...&lt;/span&gt;

    &lt;span class="c"&gt;// Get people from the cache.&lt;/span&gt;
    &lt;span class="n"&gt;cachedPeople&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;isCached&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;People&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"people"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c"&gt;// Check, if data is cached.&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;isCached&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c"&gt;// Your logic with cached data in cachedPeople here...&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;I would also like to point out such advantages as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Generics&lt;/strong&gt;: yes, you can safely use any comparable types as keys and any types as values;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TTL&lt;/strong&gt;: expired values will be automatically deleted from the cache;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost-based eviction&lt;/strong&gt;: supports eviction based on the cost of each item;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Excellent throughput&lt;/strong&gt;: currently, &lt;strong&gt;Otter&lt;/strong&gt; is the fastest cache library, with a huge lead over the competition;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Great hit ratio&lt;/strong&gt;: new S3-FIFO algorithm is used, which shows excellent results.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And benchmark, of course! 😊 &lt;/p&gt;

&lt;p&gt;In this benchmark 8 threads concurrently read from a cache configured with a maximum size:&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%2Fe0b4ci467al2mj0an42l.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%2Fe0b4ci467al2mj0an42l.png" alt="otter benchmark" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;👋 You can find all benchmarks &lt;a href="https://github.com/maypok86/benchmarks" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;↑ Table of contents&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  River
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/riverqueue" rel="noopener noreferrer"&gt;
        riverqueue
      &lt;/a&gt; / &lt;a href="https://github.com/riverqueue/river" rel="noopener noreferrer"&gt;
        river
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Fast and reliable background jobs in Go
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;h3&gt;
  
  
  Fast and reliable background jobs in Go
&lt;/h3&gt;

&lt;p&gt;I'm a big fan of all the new stuff that the Go programmer community is developing. &lt;strong&gt;River&lt;/strong&gt; is one of them.&lt;/p&gt;

&lt;p&gt;It represents a combination of modern Go practices and ease of use, even if you have never worked with similar tools before.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🔥 Atomic, transaction-safe, robust job queueing for Go applications. Backed by PostgreSQL and built to scale.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And yet, this package has one of the best documentation on the market. Just read how the authors &lt;a href="https://riverqueue.com/docs/reliable-workers" rel="noopener noreferrer"&gt;describe&lt;/a&gt; writing of reliable workers' principle! Love it 😘&lt;/p&gt;

&lt;p&gt;Start with add a simple job that sorts a slice of strings:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// jobs/sort.go&lt;/span&gt;

&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;jobs&lt;/span&gt;

&lt;span class="c"&gt;// ...&lt;/span&gt;

&lt;span class="c"&gt;// sortArgs is a struct that contains a slice of strings to sort.&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;sortArgs&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;// Strings is a slice of strings to sort.&lt;/span&gt;
    &lt;span class="n"&gt;Strings&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="s"&gt;`json:"strings"`&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// Kind returns the kind of the job.&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sortArgs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Kind&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"sort"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// SortWorker is a worker that sorts a slice of strings.&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;SortWorker&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;river&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WorkerDefaults&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;sortArgs&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// Work sorts a slice of strings.&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;SortWorker&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Work&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;job&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;river&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Job&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;sortArgs&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;slices&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;job&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Strings&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Sorted strings: %+v&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;job&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Strings&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// ...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, let's create a new &lt;strong&gt;River&lt;/strong&gt; queue with workers pool:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// queue/new.go&lt;/span&gt;

&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt;

&lt;span class="c"&gt;// ...&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;pool&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;river&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Workers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;// Create a new River instance.&lt;/span&gt;
    &lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;river&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewWorkers&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="c"&gt;// Add workers to River.&lt;/span&gt;
    &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;river&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddWorkerSafely&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;jobs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SortWorker&lt;/span&gt;&lt;span class="p"&gt;{})&lt;/span&gt; &lt;span class="c"&gt;// don't forget to check errors!&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;New&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;river&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;pgx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Tx&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;// Create workers pool.&lt;/span&gt;
    &lt;span class="n"&gt;workers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;pool&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c"&gt;// don't forget to check errors!&lt;/span&gt;

    &lt;span class="c"&gt;// Create and return a new River client&lt;/span&gt;
    &lt;span class="c"&gt;// (for PostgreSQL over pgx/v5, by the way).&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;river&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;riverpgxv5&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;New&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;river&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Config&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Queues&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="n"&gt;river&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;QueueConfig&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;river&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;QueueDefault&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;MaxWorkers&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="n"&gt;Workers&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;workers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And now, you can use it on your app, like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// main.go&lt;/span&gt;

&lt;span class="c"&gt;// ...&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;// ...&lt;/span&gt;

    &lt;span class="c"&gt;// Create a sample data to sort.&lt;/span&gt;
    &lt;span class="n"&gt;str&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"foo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"baz"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"bar"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c"&gt;// Create a new River instance.&lt;/span&gt;
    &lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;New&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c"&gt;// don't forget to check errors!&lt;/span&gt;

    &lt;span class="c"&gt;// Set job to queue.&lt;/span&gt;
    &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Background&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;jobs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SortArgs&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;Strings&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;slog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"can't insert job to River queue"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"details"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's all you have to do! 💥 You can create arbitrarily complex background jobs that &lt;strong&gt;River&lt;/strong&gt; can easily complete for you.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;River&lt;/strong&gt; is still under rapid development, but I recommend trying it now!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;↑ Table of contents&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  And what do you use?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Tell us about it in the comments&lt;/strong&gt;! It will be very interesting to find new Go packages and tools for yourself.&lt;/p&gt;

&lt;p&gt;Peace to all and a successful code! ❤️&lt;/p&gt;

&lt;p&gt;↑ Table of contents&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Photos and videos by
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Vic Shóstak &lt;a href="https://github.com/koddr" rel="noopener noreferrer"&gt;https://github.com/koddr&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  P.S.
&lt;/h2&gt;

&lt;p&gt;If you want more articles (like this) on this blog, then post a comment below and subscribe to me. Thanks! 😻&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;❗️ You can support me on &lt;a href="https://boosty.to/koddr" rel="noopener noreferrer"&gt;Boosty&lt;/a&gt;, both on a &lt;em&gt;permanent&lt;/em&gt; and on a &lt;em&gt;one-time&lt;/em&gt; basis. All proceeds from this way will go to &lt;strong&gt;support&lt;/strong&gt; my OSS projects and will energize me to &lt;strong&gt;create&lt;/strong&gt; new products and articles for the community.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://boosty.to/koddr/donate" rel="noopener noreferrer"&gt;&lt;img alt="support me on Boosty" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fkoddr%2F.github%2Fmain%2Fimages%2Fboosty-badge.svg" width="868" height="330"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And of course, you can help me make developers' lives even better! Just connect to one of my projects as a contributor. It's easy!&lt;/p&gt;

&lt;p&gt;My main projects that need your help (and stars) 👇&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔥 &lt;a href="https://github.com/gowebly/gowebly" rel="noopener noreferrer"&gt;gowebly&lt;/a&gt;: A next-generation CLI tool that makes it easy to create amazing web applications with Go on the backend, using htmx, hyperscript or Alpine.js and the most popular CSS frameworks on the frontend.&lt;/li&gt;
&lt;li&gt;✨ &lt;a href="https://github.com/create-go-app" rel="noopener noreferrer"&gt;create-go-app&lt;/a&gt;: Create a new production-ready project with Go backend, frontend and deploy automation by running one CLI command.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Other my small projects: &lt;a href="https://github.com/koddr/yatr" rel="noopener noreferrer"&gt;yatr&lt;/a&gt;, &lt;a href="https://github.com/koddr/gosl" rel="noopener noreferrer"&gt;gosl&lt;/a&gt;, &lt;a href="https://github.com/koddr/json2csv" rel="noopener noreferrer"&gt;json2csv&lt;/a&gt;, &lt;a href="https://github.com/koddr/csv2api" rel="noopener noreferrer"&gt;csv2api&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>go</category>
      <category>programming</category>
      <category>beginners</category>
      <category>news</category>
    </item>
    <item>
      <title>🎉 The Gowebly CLI has grown to v2.0.0</title>
      <dc:creator>Vic Shóstak</dc:creator>
      <pubDate>Thu, 11 Jan 2024 07:45:29 +0000</pubDate>
      <link>https://dev.to/koddr/the-gowebly-cli-has-grown-to-v200-d1c</link>
      <guid>https://dev.to/koddr/the-gowebly-cli-has-grown-to-v200-d1c</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Happy New Year, my DEV friends! 🎊&lt;/p&gt;

&lt;p&gt;While everyone was relaxing and thinking about Christmas, I was hard at work in my studio to prepare a massive update for the &lt;a href="https://github.com/gowebly/gowebly" rel="noopener noreferrer"&gt;Gowebly&lt;/a&gt; CLI number &lt;code&gt;v2&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I don't like to drag out the intro, so here we go! 😉&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  📝 Table of contents
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;What is Gowebly?&lt;/li&gt;
&lt;li&gt;Breaking changes&lt;/li&gt;
&lt;li&gt;Live reload mode on code updates&lt;/li&gt;
&lt;li&gt;Other notable improvements&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Gowebly?
&lt;/h2&gt;

&lt;p&gt;A next-generation CLI tool that makes it easy to create amazing web applications with &lt;strong&gt;Go&lt;/strong&gt; on the backend, using &lt;strong&gt;htmx&lt;/strong&gt; &amp;amp; &lt;strong&gt;hyperscript&lt;/strong&gt; and the most popular &lt;strong&gt;CSS frameworks&lt;/strong&gt; on the frontend.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/gowebly" rel="noopener noreferrer"&gt;
        gowebly
      &lt;/a&gt; / &lt;a href="https://github.com/gowebly/gowebly" rel="noopener noreferrer"&gt;
        gowebly
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      🔥 A next-generation CLI tool that makes it easy to create amazing web applications with Go on the backend, using htmx, hyperscript or Alpine.js, and the most popular CSS frameworks on the frontend.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div&gt;
&lt;p&gt;&lt;a href="https://gowebly.org" title="Go to the Gowebly CLI website" rel="nofollow noopener noreferrer"&gt;&lt;img width="196px" alt="gowebly logo" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fgowebly%2F.github%2Fmain%2Fimages%2Fgowebly-logo.svg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;The Gowebly CLI&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A next-generation CLI tool that makes it easy to create amazing web applications&lt;br&gt;with &lt;strong&gt;Go&lt;/strong&gt; on the backend, using &lt;strong&gt;htmx&lt;/strong&gt;, &lt;strong&gt;hyperscript&lt;/strong&gt; or &lt;strong&gt;Alpine.js&lt;/strong&gt;,&lt;br&gt;and the most popular &lt;strong&gt;CSS&lt;/strong&gt; frameworks on the frontend.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://pkg.go.dev/github.com/gowebly/gowebly/v3" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/810c78d5949643d0df1dbc7ed9e6d4bd2f7b1060bc1ea7c08089c05c02855dc8/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f476f2d312e32342b2d3030414444383f7374796c653d666f722d7468652d6261646765266c6f676f3d676f" alt="Go version"&gt;&lt;/a&gt;
&lt;a href="https://goreportcard.com/report/github.com/gowebly/gowebly/v3" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/250563aeb9141430c29e2ea9bf28d8fd3e27efb46e10267bda2b7ab1820c282f/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f476f5f7265706f72742d412b2d737563636573733f7374796c653d666f722d7468652d6261646765266c6f676f3d6e6f6e65" alt="Go report"&gt;&lt;/a&gt;
&lt;a href="https://github.com/gowebly/gowebly/blob/main/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/670ff230d0b782181dc383b0b85a684ca7a629406c837bf1596eacbc0176d464/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4170616368655f322e302d7265643f7374796c653d666f722d7468652d6261646765266c6f676f3d6e6f6e65" alt="License"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;↘  The official Gowebly CLI documentation  ↙&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://gowebly.org" rel="nofollow noopener noreferrer"&gt;English&lt;/a&gt; · &lt;a href="https://gowebly.org/ru/" rel="nofollow noopener noreferrer"&gt;Русский&lt;/a&gt; · &lt;a href="https://gowebly.org/zh_HK/" rel="nofollow noopener noreferrer"&gt;简体中文&lt;/a&gt; · &lt;a href="https://gowebly.org/es/" rel="nofollow noopener noreferrer"&gt;Español&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;↘  Share the project's link to your friends  ↙&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://x.com/intent/tweet?hashtags=gowebly%2Cgo%2Chtmx&amp;amp;text=A%20next-generation%20CLI%20tool%20to%20easily%20build%20amazing%20web%20applications%20with%20Go%20on%20the%20backend%2C%20using%20htmx%20%26%20hyperscript%20and%20the%20most%20popular%20CSS%20frameworks%20on%20the%20frontend.&amp;amp;url=https%3A%2F%2Fgowebly.org" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/faa76318bf60a2882bb8a75610175d785c83d606e82c662acdd135062df53876/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f785f2874776974746572292d626c61636b3f7374796c653d666f722d7468652d6261646765266c6f676f3d78" alt="Share on X"&gt;&lt;/a&gt;
&lt;a href="https://t.me/share/url?text=A%20next-generation%20CLI%20tool%20to%20easily%20build%20amazing%20web%20applications%20with%20Go%20on%20the%20backend%2C%20using%20htmx%20%26%20hyperscript%20and%20the%20most%20popular%20CSS%20frameworks%20on%20the%20frontend.%20%23gowebly%20%23go%20%23htmx&amp;amp;url=https%3A%2F%2Fgowebly.org" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/8aa63c93a7d7c9b8993a8b98d8a73b8e2bc84474e15df0c1ea4f28995d9dee63/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f74656c656772616d2d626c61636b3f7374796c653d666f722d7468652d6261646765266c6f676f3d74656c656772616d" alt="Share on Telegram"&gt;&lt;/a&gt;
&lt;a href="https://api.whatsapp.com/send?text=A%20next-generation%20CLI%20tool%20to%20easily%20build%20amazing%20web%20applications%20with%20Go%20on%20the%20backend%2C%20using%20htmx%20%26%20hyperscript%20and%20the%20most%20popular%20CSS%20frameworks%20on%20the%20frontend.%20https%3A%2F%2Fgowebly.org" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/361e7d81c2375596863e580f9a07fa4a9fc60ff03bb663c057f69f73186a027c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f77686174736170702d626c61636b3f7374796c653d666f722d7468652d6261646765266c6f676f3d7768617473617070" alt="Share on WhatsApp"&gt;&lt;/a&gt;
&lt;a href="https://www.reddit.com/submit?title=A%20next-generation%20CLI%20tool%20to%20easily%20build%20amazing%20web%20applications%20with%20Go%20on%20the%20backend%2C%20using%20htmx%20%26%20hyperscript%20and%20the%20most%20popular%20CSS%20frameworks%20on%20the%20frontend.%20%23gowebly%20%23go%20%23htmx&amp;amp;url=https%3A%2F%2Fgowebly.org" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/845fbb4fafbcb8dfe4fcc2ad7254907c67dbf46bc6ac784cf4d75e4c89f0b57a/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f7265646469742d626c61636b3f7374796c653d666f722d7468652d6261646765266c6f676f3d726564646974" alt="Share on Reddit"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://gowebly.org" title="Go to the Gowebly CLI website" rel="nofollow noopener noreferrer"&gt;&lt;img width="99%" alt="gowebly create command" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fgowebly%2F.github%2Fmain%2Fimages%2Fgowebly_create.gif"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;✨ Features&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;100% &lt;strong&gt;free&lt;/strong&gt; and &lt;strong&gt;open source&lt;/strong&gt; under the &lt;a href="https://github.com/gowebly/gowebly/blob/main/LICENSE" rel="noopener noreferrer"&gt;Apache 2.0&lt;/a&gt; license.&lt;/li&gt;
&lt;li&gt;For &lt;strong&gt;any&lt;/strong&gt; developer's level of knowledge and technical expertise, as the intelligent CLI does most of the routine project setup for you, creates an understandable structure, and prepares code for use and deployment in production.&lt;/li&gt;
&lt;li&gt;Cross-platform and multi-architecture allows &lt;strong&gt;successful running&lt;/strong&gt; on any GNU/Linux distros, Microsoft Windows (including WSL) and Apple macOS.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://gowebly.org" rel="nofollow noopener noreferrer"&gt;&lt;strong&gt;Well-documented&lt;/strong&gt;&lt;/a&gt;, includes translations in &lt;strong&gt;many other languages&lt;/strong&gt; (&lt;a href="https://gowebly.org/ru/" rel="nofollow noopener noreferrer"&gt;Русский&lt;/a&gt;, &lt;a href="https://gowebly.org/zh_HK/" rel="nofollow noopener noreferrer"&gt;简体中文&lt;/a&gt;, &lt;a href="https://gowebly.org/es/" rel="nofollow noopener noreferrer"&gt;Español&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Enables you to &lt;strong&gt;start a new project faster&lt;/strong&gt; with &lt;a href="https://go.dev" rel="nofollow noopener noreferrer"&gt;Go&lt;/a&gt;…&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/gowebly/gowebly" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;↑ Table of contents&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Breaking changes
&lt;/h2&gt;

&lt;p&gt;After gathering the opinion of the most active users and based on the experience of my other successful CLI project &lt;a href="https://github.com/create-go-app" rel="noopener noreferrer"&gt;Create Go App&lt;/a&gt;, I decided to &lt;strong&gt;remove&lt;/strong&gt; the possibility of configuring with a YAML file.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;✨ Yes, &lt;code&gt;.gowebly.yml&lt;/code&gt; is no longer needed!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The handy and incredibly beautiful &lt;a href="https://github.com/charmbracelet/huh" rel="noopener noreferrer"&gt;huh&lt;/a&gt; library from the &lt;a href="https://charm.sh/" rel="noopener noreferrer"&gt;Charm&lt;/a&gt; team is now in charge of that. Just upgrade to the latest version of the Gowebly and type the familiar command in the terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gowebly create
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And just look at this:&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%2Fzt2qatnt3s5u2ks2qhkk.gif" 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%2Fzt2qatnt3s5u2ks2qhkk.gif" alt="new gowebly create" width="600" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The same thing happened with the unknown and the &lt;code&gt;doctor&lt;/code&gt; commands, which now look (and feel) completely different:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gowebly doctor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2F0muxcjo87jw2ukffc27x.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%2F0muxcjo87jw2ukffc27x.png" alt="new gowebly doctor" width="800" height="485"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;↑ Table of contents&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Live reload mode on code updates
&lt;/h2&gt;

&lt;p&gt;It was highly anticipated, and I decided not to delay and make it as soon as possible. Since version &lt;code&gt;v2.0.0&lt;/code&gt;, the Gowebly CLI supports reloading a project running in development mode if changes are made to it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go code;&lt;/li&gt;
&lt;li&gt;Templ or HTML templates;&lt;/li&gt;
&lt;li&gt;SASS/CSS styles;&lt;/li&gt;
&lt;li&gt;TypeScript/JavaScript files;&lt;/li&gt;
&lt;li&gt;Frontend part settings (JSON).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is made possible thanks to the &lt;a href="https://github.com/cosmtrek/air" rel="noopener noreferrer"&gt;Air&lt;/a&gt; tool, which now comes with every project you create. The configuration is as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="c"&gt;# .air.toml&lt;/span&gt;

&lt;span class="py"&gt;root&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"."&lt;/span&gt;
&lt;span class="py"&gt;tmp_dir&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"tmp"&lt;/span&gt;

&lt;span class="nn"&gt;[build]&lt;/span&gt;
&lt;span class="py"&gt;pre_cmd&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"bun run build"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="py"&gt;cmd&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"templ generate &amp;amp;&amp;amp; go build -o ./tmp/gowebly_default ."&lt;/span&gt;
&lt;span class="py"&gt;bin&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"tmp/gowebly_default"&lt;/span&gt;
&lt;span class="py"&gt;include_ext&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"go"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"templ"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"html"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"js"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"ts"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"css"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"scss"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="py"&gt;exclude_dir&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;".parcel-cache"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"bin"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"dist"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"node_modules"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"static"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"tmp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"tests"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"vendor"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="py"&gt;exclude_regex&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"_test&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s"&gt;.go"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"_templ&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s"&gt;.go"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="py"&gt;exclude_unchanged&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;span class="py"&gt;follow_symlink&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;span class="py"&gt;log&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"build-errors-air.log"&lt;/span&gt;
&lt;span class="py"&gt;poll&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;span class="py"&gt;poll_interval&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;
&lt;span class="py"&gt;delay&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;
&lt;span class="py"&gt;stop_on_error&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="py"&gt;send_interrupt&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;span class="py"&gt;kill_delay&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;
&lt;span class="py"&gt;rerun&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;span class="py"&gt;rerun_delay&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;

&lt;span class="c"&gt;# ...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you don't want to use &lt;strong&gt;Air&lt;/strong&gt;, when creating a new project, select &lt;em&gt;"No"&lt;/em&gt; when the CLI prompts you to use the tool. In this case, this &lt;a href="https://github.com/gowebly/gowebly/blob/main/internal/attachments/templates/misc/Makefile.gotmpl" rel="noopener noreferrer"&gt;Makefile&lt;/a&gt; will be created.&lt;/p&gt;

&lt;p&gt;↑ Table of contents&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Other notable improvements
&lt;/h2&gt;

&lt;p&gt;The backend has been completely reimagined:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Repetitive elements in templates have been removed;&lt;/li&gt;
&lt;li&gt;The configs for creating a Docker container have been simplified;&lt;/li&gt;
&lt;li&gt;Add the &lt;a href="https://github.com/angelofallars/htmx-go" rel="noopener noreferrer"&gt;htmx-go&lt;/a&gt; package to simplify the &lt;a href="https://htmx.org" rel="noopener noreferrer"&gt;htmx&lt;/a&gt; handling at the server layer of the application.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The frontend part has received the following refresh:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Repetitive elements in templates have been removed;&lt;/li&gt;
&lt;li&gt;Add a &lt;code&gt;./assets/scripts.js&lt;/code&gt; file for your reactive logic;&lt;/li&gt;
&lt;li&gt;Add the &lt;a href="https://flowbite.com" rel="noopener noreferrer"&gt;Flowbite&lt;/a&gt; components library for the Tailwind CSS;&lt;/li&gt;
&lt;li&gt;Add the &lt;a href="https://prettier.io" rel="noopener noreferrer"&gt;Prettier&lt;/a&gt; for code formatting.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And not only that! 😊 Keep an eye out for updates and new releases on the project's &lt;a href="https://github.com/gowebly/gowebly/releases" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; page and &lt;a href="https://gowebly.org" rel="noopener noreferrer"&gt;official documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;↑ Table of contents&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Photos and videos by
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Vic Shóstak &lt;a href="https://github.com/koddr" rel="noopener noreferrer"&gt;https://github.com/koddr&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  P.S.
&lt;/h2&gt;

&lt;p&gt;If you want more articles (like this) on this blog, then post a comment below and subscribe to me. Thanks! 😻&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;❗️ You can support me on &lt;a href="https://boosty.to/koddr" rel="noopener noreferrer"&gt;Boosty&lt;/a&gt;, both on a &lt;em&gt;permanent&lt;/em&gt; and on a &lt;em&gt;one-time&lt;/em&gt; basis. All proceeds from this way will go to &lt;strong&gt;support&lt;/strong&gt; my OSS projects and will energize me to &lt;strong&gt;create&lt;/strong&gt; new products and articles for the community.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://boosty.to/koddr/donate" rel="noopener noreferrer"&gt;&lt;img alt="support me on Boosty" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fkoddr%2F.github%2Fmain%2Fimages%2Fboosty-badge.svg" width="868" height="330"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And of course, you can help me make developers' lives even better! Just connect to one of my projects as a contributor. It's easy!&lt;/p&gt;

&lt;p&gt;My main projects that need your help (and stars) 👇&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔥 &lt;a href="https://github.com/gowebly/gowebly" rel="noopener noreferrer"&gt;gowebly&lt;/a&gt;: A next-generation CLI tool that makes it easy to create amazing web applications with Go on the backend, using htmx, hyperscript or Alpine.js and the most popular CSS frameworks on the frontend.&lt;/li&gt;
&lt;li&gt;✨ &lt;a href="https://github.com/create-go-app" rel="noopener noreferrer"&gt;create-go-app&lt;/a&gt;: Create a new production-ready project with Go backend, frontend and deploy automation by running one CLI command.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Other my small projects: &lt;a href="https://github.com/koddr/yatr" rel="noopener noreferrer"&gt;yatr&lt;/a&gt;, &lt;a href="https://github.com/koddr/gosl" rel="noopener noreferrer"&gt;gosl&lt;/a&gt;, &lt;a href="https://github.com/koddr/json2csv" rel="noopener noreferrer"&gt;json2csv&lt;/a&gt;, &lt;a href="https://github.com/koddr/csv2api" rel="noopener noreferrer"&gt;csv2api&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>go</category>
      <category>webdev</category>
      <category>news</category>
    </item>
    <item>
      <title>🔥 Big frontend update: the Gowebly CLI now supports Bootstrap and Bulma</title>
      <dc:creator>Vic Shóstak</dc:creator>
      <pubDate>Tue, 19 Dec 2023 11:17:51 +0000</pubDate>
      <link>https://dev.to/koddr/big-frontend-update-the-gowebly-cli-now-supports-bootstrap-and-bulma-1c45</link>
      <guid>https://dev.to/koddr/big-frontend-update-the-gowebly-cli-now-supports-bootstrap-and-bulma-1c45</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Hey, DEV friends! 😉&lt;/p&gt;

&lt;p&gt;Since &lt;code&gt;v1.9.0&lt;/code&gt; release, the &lt;a href="https://github.com/gowebly/gowebly" rel="noopener noreferrer"&gt;Gowebly&lt;/a&gt; CLI includes support for &lt;a href="https://getbootstrap.com" rel="noopener noreferrer"&gt;Bootstrap&lt;/a&gt; and &lt;a href="https://bulma.io" rel="noopener noreferrer"&gt;Bulma&lt;/a&gt; CSS frameworks.&lt;/p&gt;

&lt;p&gt;Let's take a closer look.&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  📝 Table of contents
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;What is Bootstrap?&lt;/li&gt;
&lt;li&gt;What is Bulma?&lt;/li&gt;
&lt;li&gt;How to use new CSS frameworks with Gowebly CLI?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Bootstrap?
&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%2Fgetbootstrap.com%2Fdocs%2F5.3%2Fassets%2Fbrand%2Fbootstrap-logo-shadow.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%2Fgetbootstrap.com%2Fdocs%2F5.3%2Fassets%2Fbrand%2Fbootstrap-logo-shadow.png" alt="[bootstrap](https://getbootstrap.com/)" width="200" height="165"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Powerful, extensible, and feature-packed frontend toolkit. Build and customize with Sass, utilize prebuilt grid system and components, and bring projects to life with powerful JavaScript plugins.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/twbs" rel="noopener noreferrer"&gt;
        twbs
      &lt;/a&gt; / &lt;a href="https://github.com/twbs/bootstrap" rel="noopener noreferrer"&gt;
        bootstrap
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      The most popular HTML, CSS, and JavaScript framework for developing responsive, mobile first projects on the web.
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;↑ Table of contents&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Bulma?
&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%2Fbulma.io%2Fimages%2Fbulma-logo.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%2Fbulma.io%2Fimages%2Fbulma-logo.png" alt="[bulma](https://bulma.io/)" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The modern CSS framework that just works. Free &amp;amp; open source framework that provides ready-to-use frontend components that you can easily combine to build responsive web interfaces. No CSS knowledge required.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/jgthms" rel="noopener noreferrer"&gt;
        jgthms
      &lt;/a&gt; / &lt;a href="https://github.com/jgthms/bulma" rel="noopener noreferrer"&gt;
        bulma
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Modern CSS framework based on Flexbox
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;↑ Table of contents&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How to use new CSS frameworks with Gowebly CLI?
&lt;/h2&gt;

&lt;p&gt;The first thing you should do is verify that you are using Gowebly CLI version &lt;code&gt;v1.9.0&lt;/code&gt; or higher.&lt;/p&gt;

&lt;p&gt;Next, start creating the configuration file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;gowebly init
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The CLI will generate a &lt;code&gt;.gowebly.yml&lt;/code&gt; file with the following config:&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;backend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;module_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;project&lt;/span&gt;
  &lt;span class="na"&gt;go_framework&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;default&lt;/span&gt;
  &lt;span class="na"&gt;template_engine&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;default&lt;/span&gt;
  &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;7000&lt;/span&gt;
  &lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;read&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;
    &lt;span class="na"&gt;write&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;

&lt;span class="na"&gt;frontend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;package_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;project&lt;/span&gt;
  &lt;span class="na"&gt;css_framework&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;default&lt;/span&gt;
  &lt;span class="na"&gt;runtime_environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;default&lt;/span&gt;
  &lt;span class="na"&gt;htmx&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;latest&lt;/span&gt;
  &lt;span class="na"&gt;hyperscript&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;latest&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, just switch the &lt;code&gt;css_framework&lt;/code&gt; option in the &lt;code&gt;frontend&lt;/code&gt; block to &lt;code&gt;bootstrap&lt;/code&gt; or &lt;code&gt;bulma&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Now, start creating a project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;gowebly create
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And &lt;a href="https://github.com/gowebly/gowebly" rel="noopener noreferrer"&gt;Gowebly CLI&lt;/a&gt; create a new project with the &lt;strong&gt;selected CSS framework&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It works! 💥&lt;/p&gt;

&lt;p&gt;↑ Table of contents&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Photos and videos by
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Vic Shóstak &lt;a href="https://github.com/koddr" rel="noopener noreferrer"&gt;https://github.com/koddr&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Bootstrap &lt;a href="https://getbootstrap.com" rel="noopener noreferrer"&gt;https://getbootstrap.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Bulma &lt;a href="https://bulma.io" rel="noopener noreferrer"&gt;https://bulma.io&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  P.S.
&lt;/h2&gt;

&lt;p&gt;If you want more articles (like this) on this blog, then post a comment below and subscribe to me. Thanks! 😻&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;❗️ You can support me on &lt;a href="https://boosty.to/koddr" rel="noopener noreferrer"&gt;Boosty&lt;/a&gt;, both on a &lt;em&gt;permanent&lt;/em&gt; and on a &lt;em&gt;one-time&lt;/em&gt; basis. All proceeds from this way will go to &lt;strong&gt;support&lt;/strong&gt; my OSS projects and will energize me to &lt;strong&gt;create&lt;/strong&gt; new products and articles for the community.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://boosty.to/koddr/donate" rel="noopener noreferrer"&gt;&lt;img alt="support me on Boosty" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fkoddr%2F.github%2Fmain%2Fimages%2Fboosty-badge.svg" width="868" height="330"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And of course, you can help me make developers' lives even better! Just connect to one of my projects as a contributor. It's easy!&lt;/p&gt;

&lt;p&gt;My main projects that need your help (and stars) 👇&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔥 &lt;a href="https://github.com/gowebly/gowebly" rel="noopener noreferrer"&gt;gowebly&lt;/a&gt;: A next-generation CLI tool that makes it easy to create amazing web applications with Go on the backend, using htmx, hyperscript or Alpine.js and the most popular CSS frameworks on the frontend.&lt;/li&gt;
&lt;li&gt;✨ &lt;a href="https://github.com/create-go-app" rel="noopener noreferrer"&gt;create-go-app&lt;/a&gt;: Create a new production-ready project with Go backend, frontend and deploy automation by running one CLI command.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Other my small projects: &lt;a href="https://github.com/koddr/yatr" rel="noopener noreferrer"&gt;yatr&lt;/a&gt;, &lt;a href="https://github.com/koddr/gosl" rel="noopener noreferrer"&gt;gosl&lt;/a&gt;, &lt;a href="https://github.com/koddr/json2csv" rel="noopener noreferrer"&gt;json2csv&lt;/a&gt;, &lt;a href="https://github.com/koddr/csv2api" rel="noopener noreferrer"&gt;csv2api&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>go</category>
      <category>css</category>
      <category>webdev</category>
      <category>news</category>
    </item>
    <item>
      <title>🔥 Frontend update: the Gowebly CLI now supports daisyUI components library</title>
      <dc:creator>Vic Shóstak</dc:creator>
      <pubDate>Tue, 21 Nov 2023 11:50:35 +0000</pubDate>
      <link>https://dev.to/koddr/frontend-update-the-gowebly-cli-now-supports-daisyui-components-library-3dmn</link>
      <guid>https://dev.to/koddr/frontend-update-the-gowebly-cli-now-supports-daisyui-components-library-3dmn</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Hello, DEV Community! 😉&lt;/p&gt;

&lt;p&gt;I've released the &lt;a href="https://github.com/gowebly/gowebly" rel="noopener noreferrer"&gt;Gowebly&lt;/a&gt; &lt;code&gt;v1.8.0&lt;/code&gt; which includes &lt;a href="https://daisyui.com" rel="noopener noreferrer"&gt;daisyUI&lt;/a&gt; components library support for the frontend.&lt;/p&gt;

&lt;p&gt;But let's not get ahead of ourselves, let's take a closer look.&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  📝 Table of contents
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;What is daisyUI?&lt;/li&gt;
&lt;li&gt;How to use daisyUI with Gowebly CLI?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is daisyUI?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;daisyUI&lt;/strong&gt; is the most popular, free and open-source component library for Tailwind CSS. This library adds component class names to Tailwind CSS, so you can make beautiful websites faster than ever.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/saadeghi" rel="noopener noreferrer"&gt;
        saadeghi
      &lt;/a&gt; / &lt;a href="https://github.com/saadeghi/daisyui" rel="noopener noreferrer"&gt;
        daisyui
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      🌼 🌼 🌼 🌼 🌼  The most popular, free and open-source Tailwind CSS component library
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;h3&gt;
  
  
  Take Tailwind CSS to the next level
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;daisyUI&lt;/strong&gt; adds class names to Tailwind CSS for all common UI components, like &lt;code&gt;btn&lt;/code&gt;, &lt;code&gt;card&lt;/code&gt;, &lt;code&gt;toggle&lt;/code&gt; and many more. This allows us to focus on important things instead of styling basic elements for every project.&lt;/p&gt;

&lt;h3&gt;
  
  
  Instead of writing 100 class names...
&lt;/h3&gt;

&lt;p&gt;Use semantic class names! It's descriptive, faster, cleaner and easier to maintain.&lt;/p&gt;

&lt;h3&gt;
  
  
  No more ugly HTML
&lt;/h3&gt;

&lt;p&gt;Write fewer class names, use component class names, modify them using Tailwind CSS utilities. For example, daisyUI can convert this HTML code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"w-80 rounded-2xl bg-gray-100"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"flex flex-col gap-2 p-8"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"Email"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"w-full rounded-lg border border-gray-300 bg-white px-4 py-3 focus:outline-none focus:ring-2 focus:ring-gray-700 focus:ring-offset-2 focus:ring-offset-gray-100"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"flex cursor-pointer items-center justify-between p-1"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      Accept terms of use
      &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"relative inline-block"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"checkbox"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"peer h-6 w-12 cursor-pointer appearance-none rounded-full border border-gray-300 bg-white checked:border-gray-900 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-gray-900 focus-visible:ring-offset-2"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"pointer-events-none absolute start-1 top-1 block h-4 w-4 rounded-full bg-gray-400 transition-all duration-200 peer-checked:start-7 peer-checked:bg-gray-900"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"flex cursor-pointer items-center justify-between p-1"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      Submit to newsletter
      &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"relative inline-block"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"checkbox"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"peer h-6 w-12 cursor-pointer appearance-none rounded-full border border-gray-300 bg-white checked:border-gray-900 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-gray-900 focus-visible:ring-offset-2"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"pointer-events-none absolute start-1 top-1 block h-4 w-4 rounded-full bg-gray-400 transition-all duration-200 peer-checked:start-7 peer-checked:bg-gray-900"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"inline-block cursor-pointer rounded-md bg-gray-700 px-4 py-3.5 text-center text-sm font-semibold uppercase text-white transition duration-200 ease-in-out hover:bg-gray-800 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-gray-700 focus-visible:ring-offset-2 active:scale-95"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Save&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"card bg-base-200 w-80"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"card-body"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"Email"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"input input-bordered"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"label cursor-pointer"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      Accept terms of use
      &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"checkbox"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"toggle"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"label cursor-pointer"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      Submit to newsletter
      &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"checkbox"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"toggle"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"btn btn-neutral"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Save&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Fewer class names, faster development, smaller file size
&lt;/h3&gt;

&lt;p&gt;With &lt;strong&gt;daisyUI&lt;/strong&gt;, you write &lt;strong&gt;80%&lt;/strong&gt; fewer class names and your HTML size will be about &lt;strong&gt;70%&lt;/strong&gt; smaller.&lt;/p&gt;

&lt;h3&gt;
  
  
  Highly customizable
&lt;/h3&gt;

&lt;p&gt;Powered by Tailwind CSS utility classes. &lt;strong&gt;daisyUI&lt;/strong&gt; is built on top of Tailwind CSS, so you can customize everything using utility classes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pure CSS, framework-agnostic, works everywhere!
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;daisyUI&lt;/strong&gt; is a plugin for Tailwind CSS. It works on all JS frameworks and doesn't need a JS bundle file. Install &lt;strong&gt;daisyUI&lt;/strong&gt; as a dev dependency and use the class names just like any other Tailwind CSS class name.&lt;/p&gt;

&lt;p&gt;↑ Table of contents&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%2Fktx1l5mk30hknf6sfnd2.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%2Fktx1l5mk30hknf6sfnd2.png" alt="daisyUI" width="800" height="511"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How to use daisyUI with Gowebly CLI?
&lt;/h2&gt;

&lt;p&gt;The first thing you should do is verify that you are using Gowebly CLI version &lt;code&gt;v1.8.0&lt;/code&gt; or higher.&lt;/p&gt;

&lt;p&gt;Next, start creating the configuration file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;gowebly init
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The CLI will generate a &lt;code&gt;.gowebly.yml&lt;/code&gt; file with the following config:&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;backend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;module_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;project&lt;/span&gt;
  &lt;span class="na"&gt;go_framework&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;default&lt;/span&gt;
  &lt;span class="na"&gt;template_engine&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;default&lt;/span&gt;
  &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;7000&lt;/span&gt;
  &lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;read&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;
    &lt;span class="na"&gt;write&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;

&lt;span class="na"&gt;frontend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;package_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;project&lt;/span&gt;
  &lt;span class="na"&gt;css_framework&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;default&lt;/span&gt;
  &lt;span class="na"&gt;runtime_environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;default&lt;/span&gt;
  &lt;span class="na"&gt;hyperscript&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;latest&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Yes, you're right! ✨ Just switch the &lt;code&gt;css_framework&lt;/code&gt; option in the &lt;code&gt;frontend&lt;/code&gt; block to &lt;code&gt;daisyui&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Now, start creating a project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;gowebly create
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And &lt;a href="https://github.com/gowebly/gowebly" rel="noopener noreferrer"&gt;Gowebly CLI&lt;/a&gt; created a new project with the &lt;strong&gt;daisyUI&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Yeah, it's just working! 🎉&lt;/p&gt;

&lt;p&gt;↑ Table of contents&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Photos and videos by
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Vic Shóstak &lt;a href="https://github.com/koddr" rel="noopener noreferrer"&gt;https://github.com/koddr&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;daisyUI authors &lt;a href="https://daisyui.com" rel="noopener noreferrer"&gt;https://daisyui.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  P.S.
&lt;/h2&gt;

&lt;p&gt;If you want more articles (like this) on this blog, then post a comment below and subscribe to me. Thanks! 😻&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;❗️ You can support me on &lt;a href="https://boosty.to/koddr" rel="noopener noreferrer"&gt;Boosty&lt;/a&gt;, both on a &lt;em&gt;permanent&lt;/em&gt; and on a &lt;em&gt;one-time&lt;/em&gt; basis. All proceeds from this way will go to &lt;strong&gt;support&lt;/strong&gt; my OSS projects and will energize me to &lt;strong&gt;create&lt;/strong&gt; new products and articles for the community.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://boosty.to/koddr/donate" rel="noopener noreferrer"&gt;&lt;img alt="support me on Boosty" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fkoddr%2F.github%2Fmain%2Fimages%2Fboosty-badge.svg" width="868" height="330"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And of course, you can help me make developers' lives even better! Just connect to one of my projects as a contributor. It's easy!&lt;/p&gt;

&lt;p&gt;My main projects that need your help (and stars) 👇&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔥 &lt;a href="https://github.com/gowebly/gowebly" rel="noopener noreferrer"&gt;gowebly&lt;/a&gt;: A next-generation CLI tool that makes it easy to create amazing web applications with Go on the backend, using htmx, hyperscript or Alpine.js and the most popular CSS frameworks on the frontend.&lt;/li&gt;
&lt;li&gt;✨ &lt;a href="https://github.com/create-go-app" rel="noopener noreferrer"&gt;create-go-app&lt;/a&gt;: Create a new production-ready project with Go backend, frontend and deploy automation by running one CLI command.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Other my small projects: &lt;a href="https://github.com/koddr/yatr" rel="noopener noreferrer"&gt;yatr&lt;/a&gt;, &lt;a href="https://github.com/koddr/gosl" rel="noopener noreferrer"&gt;gosl&lt;/a&gt;, &lt;a href="https://github.com/koddr/json2csv" rel="noopener noreferrer"&gt;json2csv&lt;/a&gt;, &lt;a href="https://github.com/koddr/csv2api" rel="noopener noreferrer"&gt;csv2api&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>go</category>
      <category>webdev</category>
      <category>beginners</category>
      <category>opensource</category>
    </item>
    <item>
      <title>🔥 Big update: the Gowebly CLI now supports Templ</title>
      <dc:creator>Vic Shóstak</dc:creator>
      <pubDate>Wed, 01 Nov 2023 11:39:41 +0000</pubDate>
      <link>https://dev.to/koddr/big-update-the-gowebly-cli-now-supports-templ-3gog</link>
      <guid>https://dev.to/koddr/big-update-the-gowebly-cli-now-supports-templ-3gog</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Hello, everyone! 🙌&lt;/p&gt;

&lt;p&gt;I've released a big update to the &lt;a href="https://github.com/gowebly/gowebly" rel="noopener noreferrer"&gt;Gowebly&lt;/a&gt; CLI project in &lt;code&gt;v1.5.0&lt;/code&gt; which includes &lt;a href="https://github.com/a-h/templ" rel="noopener noreferrer"&gt;Templ&lt;/a&gt; support for built-in &lt;strong&gt;net/http&lt;/strong&gt; and all Go web frameworks: &lt;strong&gt;Fiber&lt;/strong&gt;, &lt;strong&gt;go-chi&lt;/strong&gt; and &lt;strong&gt;echo&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;But let's not get ahead of ourselves, let's take a closer look.&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  📝 Table of contents
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;What is Templ?&lt;/li&gt;
&lt;li&gt;How to use Templ with Gowebly CLI?&lt;/li&gt;
&lt;li&gt;Templates content&lt;/li&gt;
&lt;li&gt;Backend handler changes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Templ?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Templ&lt;/strong&gt; is a language for writing HTML user interfaces in Go. &lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/a-h" rel="noopener noreferrer"&gt;
        a-h
      &lt;/a&gt; / &lt;a href="https://github.com/a-h/templ" rel="noopener noreferrer"&gt;
        templ
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A language for writing HTML user interfaces in Go.
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;You can use it to write code like this, which will be compiled into native Go functions to generate HTML:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// hello.templ&lt;/span&gt;

&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="n"&gt;templ&lt;/span&gt; &lt;span class="n"&gt;Hello&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;Hello&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;templ&lt;/span&gt; &lt;span class="n"&gt;Greeting&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;person&lt;/span&gt; &lt;span class="n"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;div&lt;/span&gt; &lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"greeting"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;Hello&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;person&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;💡 Note: A complete user guide is here: &lt;a href="https://templ.guide/" rel="noopener noreferrer"&gt;https://templ.guide/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Create components that render fragments of HTML and compose them to create screens, pages, documents, or apps.&lt;/p&gt;

&lt;p&gt;TOP features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Server-side rendering: Deploy as a serverless function, Docker container, or standard Go program.&lt;/li&gt;
&lt;li&gt;Static rendering: Create static HTML files to deploy however you choose.&lt;/li&gt;
&lt;li&gt;Compiled code: Components are compiled into performant Go code.&lt;/li&gt;
&lt;li&gt;Use Go: Call any Go code, and use standard if, switch, and for statements.&lt;/li&gt;
&lt;li&gt;No JavaScript: Does not require any client or server-side JavaScript.&lt;/li&gt;
&lt;li&gt;Great developer experience: Ships with IDE autocompletion.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Yes, Templ has plugins for most popular IDEs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Visual Studio Code: &lt;a href="https://marketplace.visualstudio.com/items?itemName=a-h.templ" rel="noopener noreferrer"&gt;https://marketplace.visualstudio.com/items?itemName=a-h.templ&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;VSCodium: &lt;a href="https://open-vsx.org/extension/a-h/templ" rel="noopener noreferrer"&gt;https://open-vsx.org/extension/a-h/templ&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Vim / Neovim: &lt;a href="https://github.com/Joe-Davidson1802/templ.vim" rel="noopener noreferrer"&gt;https://github.com/Joe-Davidson1802/templ.vim&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Helix: &lt;a href="https://helix-editor.com/" rel="noopener noreferrer"&gt;https://helix-editor.com/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 Note: Settings and useful tips you can read &lt;a href="https://templ.guide/commands-and-tools/ide-support" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;↑ Table of contents&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How to use Templ with Gowebly CLI?
&lt;/h2&gt;

&lt;p&gt;The first thing you should do is verify that you are using Gowebly CLI version &lt;code&gt;v1.5.0&lt;/code&gt; or higher.&lt;/p&gt;

&lt;p&gt;Next, start creating the configuration file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;gowebly init
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The CLI will generate a &lt;code&gt;.gowebly.yml&lt;/code&gt; file with the following config:&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;backend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
   &lt;span class="na"&gt;module_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;project&lt;/span&gt; &lt;span class="c1"&gt;# (string) option can be any name of your Go module (for example, 'github.com/user/project')&lt;/span&gt;
   &lt;span class="na"&gt;go_framework&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;default&lt;/span&gt; &lt;span class="c1"&gt;# (string) option can be one of the values: 'fiber', 'echo', 'chi', or 'default'&lt;/span&gt;
   &lt;span class="na"&gt;template_engine&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;default&lt;/span&gt; &lt;span class="c1"&gt;# (string) option can be one of the values: 'templ', or 'default'&lt;/span&gt;
   &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5000&lt;/span&gt; &lt;span class="c1"&gt;# (int) option can be any port that is not taken up on your system&lt;/span&gt;
   &lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;read&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt; &lt;span class="c1"&gt;# (int) option can be any number of seconds, 5 is recommended&lt;/span&gt;
      &lt;span class="na"&gt;write&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt; &lt;span class="c1"&gt;# (int) option can be any number of seconds, 10 is recommended&lt;/span&gt;

&lt;span class="na"&gt;frontend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
   &lt;span class="na"&gt;package_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;project&lt;/span&gt; &lt;span class="c1"&gt;# (string) option can be any name of your package.json (for example, 'project')&lt;/span&gt;
   &lt;span class="na"&gt;css_framework&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;default&lt;/span&gt; &lt;span class="c1"&gt;# (string) option can be one of the values: 'tailwindcss', 'unocss', or 'default'&lt;/span&gt;
   &lt;span class="na"&gt;runtime_environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;default&lt;/span&gt; &lt;span class="c1"&gt;# (string) option can be one of the values: 'bun', or 'default'&lt;/span&gt;
   &lt;span class="na"&gt;htmx&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;latest&lt;/span&gt; &lt;span class="c1"&gt;# (string) option can be any existing version&lt;/span&gt;
   &lt;span class="na"&gt;hyperscript&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;latest&lt;/span&gt; &lt;span class="c1"&gt;# (string) option can be any existing version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Yes, you're right! ✨ There is a new option &lt;code&gt;template_engine&lt;/code&gt; in the &lt;code&gt;backend&lt;/code&gt; block, which can take (so far) two values:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;default&lt;/code&gt; to create a new project without a template engine;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;templ&lt;/code&gt; to create a new project using &lt;strong&gt;Templ&lt;/strong&gt;;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now, change the value of this setting to &lt;code&gt;templ&lt;/code&gt; and start creating a project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;gowebly create
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And CLI created a new project with the following structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;.
├── assets
│   └── styles.css
├── static
│   ├── favicons
│   │   ├── apple-touch-icon.png
│   │   ├── favicon.ico
│   │   ├── favicon.png
│   │   ├── favicon.svg
│   │   ├── manifest-desktop-screenshot.jpeg
│   │   ├── manifest-mobile-screenshot.jpeg
│   │   └── manifest-touch-icon.svg
│   ├── images
│   │   └── logo.svg
│   ├── htmx.min.js
│   ├── hyperscript.min.js
│   ├── manifest.json
│   └── styles.css
├── templates
│   ├── pages
&lt;span class="gd"&gt;-   │   ├── index.html
&lt;/span&gt;&lt;span class="gi"&gt;+   │   ├── index.templ
+   │   └── index_templ.go
&lt;/span&gt;&lt;span class="gd"&gt;-   ├── main.html
&lt;/span&gt;&lt;span class="gi"&gt;+   ├── main.templ
+   └── main_templ.go
&lt;/span&gt;├── go.mod
├── go.sum
├── handlers.go
├── main.go
├── package-lock.json
├── package.json
└── server.go
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Files with the extension &lt;code&gt;*.templ&lt;/code&gt; are our working files, and those with &lt;code&gt;*_templ.go&lt;/code&gt; in the name are automatically generated for us with Templ.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;❗️ Attention: Do not edit the &lt;code&gt;*_templ.go&lt;/code&gt; Go files in any way. &lt;strong&gt;They will be generated automatically&lt;/strong&gt;. Work only with &lt;code&gt;*.templ&lt;/code&gt; files.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;↑ Table of contents&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Templates content
&lt;/h2&gt;

&lt;p&gt;Okay, now let's take a look at the template files.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;./templates/main.templ&lt;/code&gt; template contains the basic layout for the web application and can be modified as you wish:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// ./templates/main.templ&lt;/span&gt;

&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;templates&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="s"&gt;"project/templates/pages"&lt;/span&gt;

&lt;span class="c"&gt;// Define a secure policy for Content-Security-Policy header.&lt;/span&gt;
&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;metaContentSecurePolicy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"default-src 'self'; style-src 'self' 'unsafe-inline'; script-src 'self' https://unpkg.com 'unsafe-inline' 'unsafe-eval';"&lt;/span&gt;

&lt;span class="n"&gt;templ&lt;/span&gt; &lt;span class="n"&gt;Layout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;metaTags&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bodyContent&lt;/span&gt; &lt;span class="n"&gt;templ&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;!&lt;/span&gt;&lt;span class="n"&gt;DOCTYPE&lt;/span&gt; &lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt; &lt;span class="n"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;meta&lt;/span&gt; &lt;span class="n"&gt;charset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"UTF-8"&lt;/span&gt;&lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;meta&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"viewport"&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"width=device-width, initial-scale=1.0"&lt;/span&gt;&lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;meta&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;equiv&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"X-UA-Compatible"&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"ie=edge"&lt;/span&gt;&lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;meta&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;equiv&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Content-Security-Policy"&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;metaContentSecurePolicy&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;meta&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"theme-color"&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"#FEFEF5"&lt;/span&gt;&lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="n"&gt;metaTags&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="n"&gt;rel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"manifest"&lt;/span&gt; &lt;span class="n"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"/static/manifest.json"&lt;/span&gt;&lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="n"&gt;rel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"apple-touch-icon"&lt;/span&gt; &lt;span class="n"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"/static/favicons/apple-touch-icon.png"&lt;/span&gt;&lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="n"&gt;rel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"shortcut icon"&lt;/span&gt; &lt;span class="n"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"/static/favicons/favicon.ico"&lt;/span&gt; &lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"image/x-icon"&lt;/span&gt;&lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="n"&gt;rel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"icon"&lt;/span&gt; &lt;span class="n"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"/static/favicons/favicon.svg"&lt;/span&gt; &lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"image/svg+xml"&lt;/span&gt;&lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="n"&gt;rel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"icon"&lt;/span&gt; &lt;span class="n"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"/static/favicons/favicon.png"&lt;/span&gt; &lt;span class="n"&gt;sizes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"any"&lt;/span&gt;&lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="n"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"/static/styles.css"&lt;/span&gt; &lt;span class="n"&gt;rel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt;&lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="n"&gt;onload&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;pages&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BodyScripts&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="n"&gt;bodyContent&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;script&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"/static/htmx.min.js"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;script&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;script&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"/static/hyperscript.min.js"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;script&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And the &lt;code&gt;./templates/pages/index.templ&lt;/code&gt; template will contain the content of the home page (accessible at &lt;code&gt;/&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// ./templates/pages/index.templ&lt;/span&gt;

&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;pages&lt;/span&gt;

&lt;span class="c"&gt;// MetaTags defines meta tags.&lt;/span&gt;

&lt;span class="n"&gt;templ&lt;/span&gt; &lt;span class="n"&gt;MetaTags&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;keywords&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;meta&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"keywords"&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;keywords&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;meta&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"description"&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// styledTextStyles defines CSS styles for component.&lt;/span&gt;

&lt;span class="n"&gt;css&lt;/span&gt; &lt;span class="n"&gt;styledTextStyles&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;margin&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="n"&gt;rem&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// BodyContent defines HTML content.&lt;/span&gt;

&lt;span class="n"&gt;templ&lt;/span&gt; &lt;span class="n"&gt;BodyContent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;img&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"224px"&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"/static/images/logo.svg"&lt;/span&gt; &lt;span class="n"&gt;alt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"logo"&lt;/span&gt;&lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;h1&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;styledTextStyles&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="n"&gt;Hello&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;strong&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;templ&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;strong&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;!&lt;/span&gt;
                    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;br&lt;/span&gt;&lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
                    &lt;span class="n"&gt;Edit&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt; &lt;span class="n"&gt;styled&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="o"&gt;./&lt;/span&gt;&lt;span class="n"&gt;templates&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;pages&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;templ&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
                &lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"https://gowebly.org"&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"_blank"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;Documentation&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"https://github.com/gowebly/gowebly"&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"_blank"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;GitHub&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;button&lt;/span&gt; &lt;span class="n"&gt;hx&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"/api/show"&lt;/span&gt; &lt;span class="n"&gt;hx&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"#htmx-result"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;Show&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;div&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"htmx-result"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// BodyScripts defines JavaScript code.&lt;/span&gt;

&lt;span class="n"&gt;script&lt;/span&gt; &lt;span class="n"&gt;BodyScripts&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;console&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello from templ!"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Edit this JavaScript code in the './templates/pages/index.templ' file."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The code in the templates is as &lt;strong&gt;readable&lt;/strong&gt; and &lt;strong&gt;easy to understand&lt;/strong&gt; as possible for &lt;strong&gt;any&lt;/strong&gt; developer who has ever made sites in HTML and understands Go.&lt;/p&gt;

&lt;p&gt;↑ Table of contents&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Backend handler changes
&lt;/h2&gt;

&lt;p&gt;If it is clear with the templates themselves, here are the changes that &lt;code&gt;handlers.go&lt;/code&gt; has undergone:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// handlers.go&lt;/span&gt;

&lt;span class="c"&gt;// ...&lt;/span&gt;

&lt;span class="c"&gt;// indexViewHandler handles a view for the index page.&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;indexViewHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ResponseWriter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;// Check, if the current URL is '/'.&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;URL&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Path&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s"&gt;"/"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c"&gt;// If not, return HTTP 404 error.&lt;/span&gt;
        &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NotFound&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;slog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"render page"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"method"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Method&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StatusNotFound&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;URL&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c"&gt;// Define template functions.&lt;/span&gt;
    &lt;span class="n"&gt;metaTags&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;pages&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MetaTags&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s"&gt;"gowebly, htmx example page, go with htmx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;               &lt;span class="c"&gt;// define meta keywords&lt;/span&gt;
        &lt;span class="s"&gt;"Welcome to example! You're here because it worked out."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c"&gt;// define meta description&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;bodyContent&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;pages&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BodyContent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s"&gt;"Welcome to example!"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                &lt;span class="c"&gt;// define h1 text&lt;/span&gt;
        &lt;span class="s"&gt;"You're here because it worked out."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c"&gt;// define p text&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c"&gt;// Define template layout.&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;templates&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Layout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s"&gt;"Welcome to example!"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c"&gt;// define title text&lt;/span&gt;
        &lt;span class="n"&gt;metaTags&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bodyContent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c"&gt;// Send HTTP 500 error with log.&lt;/span&gt;
        &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteHeader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StatusInternalServerError&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;slog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"render template"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"method"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Method&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StatusInternalServerError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;URL&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c"&gt;// Send log message.&lt;/span&gt;
    &lt;span class="n"&gt;slog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"render page"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"method"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Method&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StatusOK&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;URL&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// ...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;templates.Layout()&lt;/code&gt; Go function is the Templ function from the &lt;code&gt;./templates/main.templ&lt;/code&gt; template, which was kindly generated automatically when the project was created.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 Note: The &lt;a href="https://github.com/gowebly/gowebly" rel="noopener noreferrer"&gt;Gowebly CLI&lt;/a&gt; knows that your project contains a Templ templer and will generate code from the &lt;code&gt;*.templ&lt;/code&gt; templates every time it changes (hot-reload).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Let's run your project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;gowebly run
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2F53xdfzq9gbcke9mspksf.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%2F53xdfzq9gbcke9mspksf.png" alt="gowebly screenshot" width="800" height="534"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Yeah, it's just working! 🎉&lt;/p&gt;

&lt;p&gt;↑ Table of contents&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Photos and videos by
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Vic Shóstak &lt;a href="https://github.com/koddr" rel="noopener noreferrer"&gt;https://github.com/koddr&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Templ authors &lt;a href="https://github.com/a-h/templ" rel="noopener noreferrer"&gt;https://github.com/a-h/templ&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  P.S.
&lt;/h2&gt;

&lt;p&gt;If you want more articles (like this) on this blog, then post a comment below and subscribe to me. Thanks! 😻&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;❗️ You can support me on &lt;a href="https://boosty.to/koddr" rel="noopener noreferrer"&gt;Boosty&lt;/a&gt;, both on a &lt;em&gt;permanent&lt;/em&gt; and on a &lt;em&gt;one-time&lt;/em&gt; basis. All proceeds from this way will go to &lt;strong&gt;support&lt;/strong&gt; my OSS projects and will energize me to &lt;strong&gt;create&lt;/strong&gt; new products and articles for the community.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://boosty.to/koddr/donate" rel="noopener noreferrer"&gt;&lt;img alt="support me on Boosty" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fkoddr%2F.github%2Fmain%2Fimages%2Fboosty-badge.svg" width="868" height="330"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And of course, you can help me make developers' lives even better! Just connect to one of my projects as a contributor. It's easy!&lt;/p&gt;

&lt;p&gt;My main projects that need your help (and stars) 👇&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔥 &lt;a href="https://github.com/gowebly/gowebly" rel="noopener noreferrer"&gt;gowebly&lt;/a&gt;: A next-generation CLI tool that makes it easy to create amazing web applications with Go on the backend, using htmx, hyperscript or Alpine.js and the most popular CSS frameworks on the frontend.&lt;/li&gt;
&lt;li&gt;✨ &lt;a href="https://github.com/create-go-app" rel="noopener noreferrer"&gt;create-go-app&lt;/a&gt;: Create a new production-ready project with Go backend, frontend and deploy automation by running one CLI command.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Other my small projects: &lt;a href="https://github.com/koddr/yatr" rel="noopener noreferrer"&gt;yatr&lt;/a&gt;, &lt;a href="https://github.com/koddr/gosl" rel="noopener noreferrer"&gt;gosl&lt;/a&gt;, &lt;a href="https://github.com/koddr/json2csv" rel="noopener noreferrer"&gt;json2csv&lt;/a&gt;, &lt;a href="https://github.com/koddr/csv2api" rel="noopener noreferrer"&gt;csv2api&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>go</category>
      <category>webdev</category>
      <category>beginners</category>
      <category>opensource</category>
    </item>
    <item>
      <title>💡 An important addition on deploying a Go application in Docker, if net/http is used</title>
      <dc:creator>Vic Shóstak</dc:creator>
      <pubDate>Tue, 17 Oct 2023 05:41:48 +0000</pubDate>
      <link>https://dev.to/koddr/an-important-addition-on-deploying-a-go-application-in-docker-if-nethttp-is-used-4mjd</link>
      <guid>https://dev.to/koddr/an-important-addition-on-deploying-a-go-application-in-docker-if-nethttp-is-used-4mjd</guid>
      <description>&lt;p&gt;Hey, everybody! 🙌&lt;/p&gt;

&lt;p&gt;This is a short note article that I can't help but share with the community, as I ran into this problem myself in my latest &lt;a href="https://github.com/koddr/wonderful-readme-stats" rel="noopener noreferrer"&gt;wonderful-readme-stats&lt;/a&gt; project.&lt;/p&gt;

&lt;p&gt;So, this will be a very short post, but so important for anyone who wants to deploy a Go application that uses the built-in net/http package, in a Docker container.&lt;/p&gt;

&lt;p&gt;OK, here we go!&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  📝 Table of contents
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Description of the problem&lt;/li&gt;
&lt;li&gt;Useful links for explanation&lt;/li&gt;
&lt;li&gt;Solving the problem&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Description of the problem
&lt;/h2&gt;

&lt;p&gt;I have a helper in my Go project that helps me make a request to the GitHub API and return a response. It is absolutely simple, but saves time as it is used in many places in the code (DRY):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// customHTTPClient makes an HTTP request to download the image from the given URL and returns the response.&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;customHTTPClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;uri&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;// Check, if the URL is valid.&lt;/span&gt;
    &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;uri&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c"&gt;// Create a new HTTP client with options.&lt;/span&gt;
    &lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Timeout&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;15&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Second&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;Transport&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Transport&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;TLSHandshakeTimeout&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;   &lt;span class="m"&gt;10&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Second&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;ResponseHeaderTimeout&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Second&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;ExpectContinueTimeout&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Second&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c"&gt;// Make an HTTP request to download the image from the given URL.&lt;/span&gt;
    &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewRequest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MethodGet&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;uri&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NoBody&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;defer&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Body&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="c"&gt;// Set authorization header.&lt;/span&gt;
    &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Header&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Authorization"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Sprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Bearer %s"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"GITHUB_TOKEN"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

    &lt;span class="c"&gt;// Send the request to the HTTP server.&lt;/span&gt;
    &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Do&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You may have noticed that I use strictly defined options to create a custom HTTP client. This is done for a reason! For more information, see this Cloudflare &lt;a href="https://blog.cloudflare.com/the-complete-guide-to-golang-net-http-timeouts/" rel="noopener noreferrer"&gt;blog post&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;📝 Note: Building the project for the Docker image is done automatically with &lt;a href="https://goreleaser.com/intro/" rel="noopener noreferrer"&gt;GoReleaser&lt;/a&gt;. Therefore, I will not cover &lt;code&gt;Dockerfile&lt;/code&gt; in detail.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Next, I run the finished image as always with this command on the remote server (Ubuntu 22.04):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 9876:9876 koddr/wonderful-readme-stats:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But in the logs, I see the following error when trying to make a request from &lt;code&gt;http.Client&lt;/code&gt; to the GitHub API:  &lt;code&gt;tls: failed to verify certificate: x509: certificate signed by unknown authority&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Wait a minute, why is that? 🤔&lt;/p&gt;

&lt;p&gt;↑ Table of contents&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Useful links for explanation
&lt;/h2&gt;

&lt;p&gt;Here are some useful links that helped me understand the cause of the problem and solve it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Certificate_authority" rel="noopener noreferrer"&gt;https://en.wikipedia.org/wiki/Certificate_authority&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/a/76309552" rel="noopener noreferrer"&gt;https://stackoverflow.com/a/76309552&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://support.hashicorp.com/hc/en-us/articles/8107320508947-x509-certificate-signed-by-unknown-authority-" rel="noopener noreferrer"&gt;https://support.hashicorp.com/hc/en-us/articles/8107320508947-x509-certificate-signed-by-unknown-authority-&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Feel free to post your own in the comments.&lt;/p&gt;

&lt;p&gt;↑ Table of contents&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Solving the problem
&lt;/h2&gt;

&lt;p&gt;The solution was so simple that I didn't even believe it! &lt;/p&gt;

&lt;p&gt;It was enough to add a Docker volume pointing to the directory of the server containing the certificates (&lt;code&gt;/etc/ssl/certs&lt;/code&gt;) when starting the container to make it work:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="p"&gt;docker run -d \
&lt;/span&gt;  -p 9876:9876 \
&lt;span class="gi"&gt;+  -v /etc/ssl/certs:/etc/ssl/certs:ro \
&lt;/span&gt;  koddr/wonderful-readme-stats:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;❗️ Important: Don't forget to add Docker volume in read-only mode (&lt;code&gt;:ro&lt;/code&gt;).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And now the container works without errors and displays awesome statistics about the defined repository! 🎉&lt;/p&gt;

&lt;p&gt;↑ Table of contents&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Photos and videos by
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Vic Shóstak &lt;a href="https://github.com/koddr" rel="noopener noreferrer"&gt;https://github.com/koddr&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  P.S.
&lt;/h2&gt;

&lt;p&gt;If you want more articles (like this) on this blog, then post a comment below and subscribe to me. Thanks! 😻&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;❗️ You can support me on &lt;a href="https://boosty.to/koddr" rel="noopener noreferrer"&gt;Boosty&lt;/a&gt;, both on a &lt;em&gt;permanent&lt;/em&gt; and on a &lt;em&gt;one-time&lt;/em&gt; basis. All proceeds from this way will go to &lt;strong&gt;support&lt;/strong&gt; my OSS projects and will energize me to &lt;strong&gt;create&lt;/strong&gt; new products and articles for the community.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://boosty.to/koddr/donate" rel="noopener noreferrer"&gt;&lt;img alt="support me on Boosty" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fkoddr%2F.github%2Fmain%2Fimages%2Fboosty-badge.svg" width="868" height="330"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And of course, you can help me make developers' lives even better! Just connect to one of my projects as a contributor. It's easy!&lt;/p&gt;

&lt;p&gt;My main projects that need your help (and stars) 👇&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔥 &lt;a href="https://github.com/gowebly/gowebly" rel="noopener noreferrer"&gt;gowebly&lt;/a&gt;: A next-generation CLI tool that makes it easy to create amazing web applications with Go on the backend, using htmx, hyperscript or Alpine.js and the most popular CSS frameworks on the frontend.&lt;/li&gt;
&lt;li&gt;✨ &lt;a href="https://github.com/create-go-app" rel="noopener noreferrer"&gt;create-go-app&lt;/a&gt;: Create a new production-ready project with Go backend, frontend and deploy automation by running one CLI command.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Other my small projects: &lt;a href="https://github.com/koddr/yatr" rel="noopener noreferrer"&gt;yatr&lt;/a&gt;, &lt;a href="https://github.com/koddr/gosl" rel="noopener noreferrer"&gt;gosl&lt;/a&gt;, &lt;a href="https://github.com/koddr/json2csv" rel="noopener noreferrer"&gt;json2csv&lt;/a&gt;, &lt;a href="https://github.com/koddr/csv2api" rel="noopener noreferrer"&gt;csv2api&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>go</category>
      <category>docker</category>
      <category>beginners</category>
      <category>devops</category>
    </item>
    <item>
      <title>🔥 A next-generation CLI tool for building amazing web apps in Go using htmx &amp; hyperscript</title>
      <dc:creator>Vic Shóstak</dc:creator>
      <pubDate>Sat, 30 Sep 2023 11:11:57 +0000</pubDate>
      <link>https://dev.to/koddr/a-next-generation-cli-tool-for-building-amazing-web-apps-in-go-using-htmx-hyperscript-336d</link>
      <guid>https://dev.to/koddr/a-next-generation-cli-tool-for-building-amazing-web-apps-in-go-using-htmx-hyperscript-336d</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Hey, my DEV friends! 👋 &lt;/p&gt;

&lt;p&gt;It's been a while since I've been here, hasn't it? Sorry I've been missing, but there was a good reason... one of which I'm going to talk about in this article.&lt;/p&gt;

&lt;p&gt;So, here is a new CLI tool that I have named &lt;a href="https://github.com/gowebly/gowebly" rel="noopener noreferrer"&gt;&lt;strong&gt;gowebly&lt;/strong&gt;&lt;/a&gt; 👇&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  📝 Table of contents
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;What is gowebly?&lt;/li&gt;
&lt;li&gt;What is the enjoyment of using it?&lt;/li&gt;
&lt;li&gt;Motivation in CLI creation&lt;/li&gt;
&lt;li&gt;Mutually beneficial cooperation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is gowebly?
&lt;/h2&gt;

&lt;p&gt;It's a next-generation CLI tool that makes it easy to create amazing web applications using Go on the backend (&lt;strong&gt;net/http&lt;/strong&gt;, &lt;strong&gt;Fiber&lt;/strong&gt;, &lt;strong&gt;Echo&lt;/strong&gt;, &lt;strong&gt;chi&lt;/strong&gt;, etc.), &lt;strong&gt;htmx&lt;/strong&gt; and &lt;strong&gt;hyperscript&lt;/strong&gt;, and the most popular atomic/utility-first &lt;strong&gt;CSS frameworks&lt;/strong&gt; (&lt;strong&gt;Tailwind CSS&lt;/strong&gt;, &lt;strong&gt;UnoCSS&lt;/strong&gt;, etc.) on the frontend.&lt;/p&gt;

&lt;p&gt;Fully configured &lt;strong&gt;Docker&lt;/strong&gt; files, as well, are included in your project.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/gowebly" rel="noopener noreferrer"&gt;
        gowebly
      &lt;/a&gt; / &lt;a href="https://github.com/gowebly/gowebly" rel="noopener noreferrer"&gt;
        gowebly
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      🔥 A next-generation CLI tool that makes it easy to create amazing web applications with Go on the backend, using htmx, hyperscript or Alpine.js, and the most popular CSS frameworks on the frontend.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div&gt;
&lt;p&gt;&lt;a href="https://gowebly.org" title="Go to the Gowebly CLI website" rel="nofollow noopener noreferrer"&gt;&lt;img width="196px" alt="gowebly logo" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fgowebly%2F.github%2Fmain%2Fimages%2Fgowebly-logo.svg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;The Gowebly CLI&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A next-generation CLI tool that makes it easy to create amazing web applications&lt;br&gt;with &lt;strong&gt;Go&lt;/strong&gt; on the backend, using &lt;strong&gt;htmx&lt;/strong&gt;, &lt;strong&gt;hyperscript&lt;/strong&gt; or &lt;strong&gt;Alpine.js&lt;/strong&gt;,&lt;br&gt;and the most popular &lt;strong&gt;CSS&lt;/strong&gt; frameworks on the frontend.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://pkg.go.dev/github.com/gowebly/gowebly/v3" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/810c78d5949643d0df1dbc7ed9e6d4bd2f7b1060bc1ea7c08089c05c02855dc8/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f476f2d312e32342b2d3030414444383f7374796c653d666f722d7468652d6261646765266c6f676f3d676f" alt="Go version"&gt;&lt;/a&gt;
&lt;a href="https://goreportcard.com/report/github.com/gowebly/gowebly/v3" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/250563aeb9141430c29e2ea9bf28d8fd3e27efb46e10267bda2b7ab1820c282f/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f476f5f7265706f72742d412b2d737563636573733f7374796c653d666f722d7468652d6261646765266c6f676f3d6e6f6e65" alt="Go report"&gt;&lt;/a&gt;
&lt;a href="https://github.com/gowebly/gowebly/blob/main/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/670ff230d0b782181dc383b0b85a684ca7a629406c837bf1596eacbc0176d464/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4170616368655f322e302d7265643f7374796c653d666f722d7468652d6261646765266c6f676f3d6e6f6e65" alt="License"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;↘  The official Gowebly CLI documentation  ↙&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://gowebly.org" rel="nofollow noopener noreferrer"&gt;English&lt;/a&gt; · &lt;a href="https://gowebly.org/ru/" rel="nofollow noopener noreferrer"&gt;Русский&lt;/a&gt; · &lt;a href="https://gowebly.org/zh_HK/" rel="nofollow noopener noreferrer"&gt;简体中文&lt;/a&gt; · &lt;a href="https://gowebly.org/es/" rel="nofollow noopener noreferrer"&gt;Español&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;↘  Share the project's link to your friends  ↙&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://x.com/intent/tweet?hashtags=gowebly%2Cgo%2Chtmx&amp;amp;text=A%20next-generation%20CLI%20tool%20to%20easily%20build%20amazing%20web%20applications%20with%20Go%20on%20the%20backend%2C%20using%20htmx%20%26%20hyperscript%20and%20the%20most%20popular%20CSS%20frameworks%20on%20the%20frontend.&amp;amp;url=https%3A%2F%2Fgowebly.org" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/faa76318bf60a2882bb8a75610175d785c83d606e82c662acdd135062df53876/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f785f2874776974746572292d626c61636b3f7374796c653d666f722d7468652d6261646765266c6f676f3d78" alt="Share on X"&gt;&lt;/a&gt;
&lt;a href="https://t.me/share/url?text=A%20next-generation%20CLI%20tool%20to%20easily%20build%20amazing%20web%20applications%20with%20Go%20on%20the%20backend%2C%20using%20htmx%20%26%20hyperscript%20and%20the%20most%20popular%20CSS%20frameworks%20on%20the%20frontend.%20%23gowebly%20%23go%20%23htmx&amp;amp;url=https%3A%2F%2Fgowebly.org" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/8aa63c93a7d7c9b8993a8b98d8a73b8e2bc84474e15df0c1ea4f28995d9dee63/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f74656c656772616d2d626c61636b3f7374796c653d666f722d7468652d6261646765266c6f676f3d74656c656772616d" alt="Share on Telegram"&gt;&lt;/a&gt;
&lt;a href="https://api.whatsapp.com/send?text=A%20next-generation%20CLI%20tool%20to%20easily%20build%20amazing%20web%20applications%20with%20Go%20on%20the%20backend%2C%20using%20htmx%20%26%20hyperscript%20and%20the%20most%20popular%20CSS%20frameworks%20on%20the%20frontend.%20https%3A%2F%2Fgowebly.org" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/361e7d81c2375596863e580f9a07fa4a9fc60ff03bb663c057f69f73186a027c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f77686174736170702d626c61636b3f7374796c653d666f722d7468652d6261646765266c6f676f3d7768617473617070" alt="Share on WhatsApp"&gt;&lt;/a&gt;
&lt;a href="https://www.reddit.com/submit?title=A%20next-generation%20CLI%20tool%20to%20easily%20build%20amazing%20web%20applications%20with%20Go%20on%20the%20backend%2C%20using%20htmx%20%26%20hyperscript%20and%20the%20most%20popular%20CSS%20frameworks%20on%20the%20frontend.%20%23gowebly%20%23go%20%23htmx&amp;amp;url=https%3A%2F%2Fgowebly.org" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/845fbb4fafbcb8dfe4fcc2ad7254907c67dbf46bc6ac784cf4d75e4c89f0b57a/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f7265646469742d626c61636b3f7374796c653d666f722d7468652d6261646765266c6f676f3d726564646974" alt="Share on Reddit"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://gowebly.org" title="Go to the Gowebly CLI website" rel="nofollow noopener noreferrer"&gt;&lt;img width="99%" alt="gowebly create command" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fgowebly%2F.github%2Fmain%2Fimages%2Fgowebly_create.gif"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;✨ Features&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;100% &lt;strong&gt;free&lt;/strong&gt; and &lt;strong&gt;open source&lt;/strong&gt; under the &lt;a href="https://github.com/gowebly/gowebly/blob/main/LICENSE" rel="noopener noreferrer"&gt;Apache 2.0&lt;/a&gt; license.&lt;/li&gt;
&lt;li&gt;For &lt;strong&gt;any&lt;/strong&gt; developer's level of knowledge and technical expertise, as the intelligent CLI does most of the routine project setup for you, creates an understandable structure, and prepares code for use and deployment in production.&lt;/li&gt;
&lt;li&gt;Cross-platform and multi-architecture allows &lt;strong&gt;successful running&lt;/strong&gt; on any GNU/Linux distros, Microsoft Windows (including WSL) and Apple macOS.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://gowebly.org" rel="nofollow noopener noreferrer"&gt;&lt;strong&gt;Well-documented&lt;/strong&gt;&lt;/a&gt;, includes translations in &lt;strong&gt;many other languages&lt;/strong&gt; (&lt;a href="https://gowebly.org/ru/" rel="nofollow noopener noreferrer"&gt;Русский&lt;/a&gt;, &lt;a href="https://gowebly.org/zh_HK/" rel="nofollow noopener noreferrer"&gt;简体中文&lt;/a&gt;, &lt;a href="https://gowebly.org/es/" rel="nofollow noopener noreferrer"&gt;Español&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Enables you to &lt;strong&gt;start a new project faster&lt;/strong&gt; with &lt;a href="https://go.dev" rel="nofollow noopener noreferrer"&gt;Go&lt;/a&gt;…&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/gowebly/gowebly" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;↑ Table of contents&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is the enjoyment of using it?
&lt;/h2&gt;

&lt;p&gt;The main purpose of &lt;code&gt;gowebly&lt;/code&gt; CLI is to make it easier to create a new project. And it does this very well! But it's better to see it once than to hear it a hundred times:&lt;/p&gt;

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

&lt;p&gt;The first thing you need to do is to install it. This can be done via: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Homebrew (for GNU/Linux and Apple macOS users);&lt;/li&gt;
&lt;li&gt;Native Go installation (any platforms);&lt;/li&gt;
&lt;li&gt;Docker image (any platforms);&lt;/li&gt;
&lt;li&gt;Downloading a ready-made executable (any platforms).&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 Note: No matter how exactly you want to install the &lt;code&gt;gowebly&lt;/code&gt; CLI, it will work fine either way.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Once the &lt;code&gt;gowebly&lt;/code&gt; CLI is installed on your system, the following commands are available to you: &lt;code&gt;init&lt;/code&gt;, &lt;code&gt;create&lt;/code&gt;, &lt;code&gt;run&lt;/code&gt;, and &lt;code&gt;build&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;Let's take a closer look at them 😊&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 Note: Also, keep in mind that the documentation of the &lt;code&gt;gowebly&lt;/code&gt; project has &lt;strong&gt;already been&lt;/strong&gt; translated to: &lt;a href="https://github.com/gowebly/gowebly/blob/main/README_RU.md" rel="noopener noreferrer"&gt;Русский&lt;/a&gt;, &lt;a href="https://github.com/gowebly/gowebly/blob/main/README_CN.md" rel="noopener noreferrer"&gt;中文&lt;/a&gt; and &lt;a href="https://github.com/gowebly/gowebly/blob/main/README_ES.md" rel="noopener noreferrer"&gt;Español&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;And the original language, of course, &lt;a href="https://github.com/gowebly/gowebly" rel="noopener noreferrer"&gt;English&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;init&lt;/code&gt; command
&lt;/h3&gt;

&lt;p&gt;Command to create a &lt;strong&gt;default&lt;/strong&gt; config file (&lt;a href="https://github.com/gowebly/gowebly/blob/main/internal/attachments/configs/default.yml" rel="noopener noreferrer"&gt;&lt;code&gt;.gowebly.yml&lt;/code&gt;&lt;/a&gt;) in the current folder.&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%2Fgithub.com%2Fgowebly%2Fgowebly%2Fassets%2F11155743%2F679dd0e1-ecd6-4cfb-b145-c9f551ab2d9c" class="article-body-image-wrapper"&gt;&lt;img alt="gowebly init" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fgowebly%2Fgowebly%2Fassets%2F11155743%2F679dd0e1-ecd6-4cfb-b145-c9f551ab2d9c" width="1796" height="904"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every time you make &lt;code&gt;gowebly init&lt;/code&gt; command in the empty folder:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;CLI validates the current folder;&lt;/li&gt;
&lt;li&gt;CLI creates a default &lt;code&gt;.gowebly.yml&lt;/code&gt; config file.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Typically, a created config file contains the following options:&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;backend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
   &lt;span class="na"&gt;module_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;project&lt;/span&gt; &lt;span class="c1"&gt;# (string) option can be any name of your Go module (for example, 'github.com/user/project')&lt;/span&gt;
   &lt;span class="na"&gt;go_framework&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;default&lt;/span&gt; &lt;span class="c1"&gt;# (string) option can be one of the values: 'fiber', 'echo', 'chi', or 'default'&lt;/span&gt;
   &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5000&lt;/span&gt; &lt;span class="c1"&gt;# (int) option can be any port that is not taken up on your system&lt;/span&gt;
   &lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;read&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt; &lt;span class="c1"&gt;# (int) option can be any number of seconds, 5 is recommended&lt;/span&gt;
      &lt;span class="na"&gt;write&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt; &lt;span class="c1"&gt;# (int) option can be any number of seconds, 10 is recommended&lt;/span&gt;

&lt;span class="na"&gt;frontend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
   &lt;span class="na"&gt;package_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;project&lt;/span&gt; &lt;span class="c1"&gt;# (string) option can be any name of your package.json (for example, 'project')&lt;/span&gt;
   &lt;span class="na"&gt;css_framework&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;default&lt;/span&gt; &lt;span class="c1"&gt;# (string) option can be one of the values: 'tailwindcss', 'unocss', or 'default'&lt;/span&gt;
   &lt;span class="na"&gt;runtime_environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;default&lt;/span&gt; &lt;span class="c1"&gt;# (string) option can be one of the values: 'bun', or 'default'&lt;/span&gt;
   &lt;span class="na"&gt;htmx&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;latest&lt;/span&gt; &lt;span class="c1"&gt;# (string) option can be any existing version&lt;/span&gt;
   &lt;span class="na"&gt;hyperscript&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;latest&lt;/span&gt; &lt;span class="c1"&gt;# (string) option can be any existing version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can choose any &lt;strong&gt;Go framework&lt;/strong&gt; for your project's backend:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Go framework&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;default&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Don't use any Go framework (only built-in &lt;a href="https://pkg.go.dev/net/http" rel="noopener noreferrer"&gt;net/http&lt;/a&gt; package)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fiber&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Use a Go backend with the &lt;a href="https://github.com/gofiber/fiber" rel="noopener noreferrer"&gt;Fiber&lt;/a&gt; web framework&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;echo&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Use a Go backend with the &lt;a href="https://github.com/labstack/echo" rel="noopener noreferrer"&gt;Echo&lt;/a&gt; web framework&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;chi&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Use a Go backend with the &lt;a href="https://github.com/go-chi/chi" rel="noopener noreferrer"&gt;chi&lt;/a&gt; composable router&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In additional, you can choose versions of the &lt;strong&gt;htmx&lt;/strong&gt;, &lt;strong&gt;hyperscript&lt;/strong&gt;, and one of the most popular atomic/utility-first &lt;strong&gt;CSS framework&lt;/strong&gt; to your project:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;CSS framework&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;default&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Don't use any CSS framework (only default styles for the code example)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tailwindcss&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Use the &lt;a href="https://tailwindcss.com" rel="noopener noreferrer"&gt;Tailwind CSS&lt;/a&gt; as a CSS framework&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;unocss&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Use the &lt;a href="https://unocss.dev" rel="noopener noreferrer"&gt;UnoCSS&lt;/a&gt; as a CSS framework&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Also, you can set one of the JavaScript runtime environment for your frontend part:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;JavaScript runtime&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;default&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Use the &lt;a href="https://nodejs.org" rel="noopener noreferrer"&gt;Node.js&lt;/a&gt; as a JavaScript runtime environment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;bun&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Use the &lt;a href="https://bun.sh" rel="noopener noreferrer"&gt;Bun&lt;/a&gt; as a JavaScript runtime environment&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;create&lt;/code&gt; command
&lt;/h3&gt;

&lt;p&gt;Command to create a new project with the &lt;strong&gt;Go&lt;/strong&gt; backend, &lt;strong&gt;htmx&lt;/strong&gt; &amp;amp; &lt;strong&gt;hyperscript&lt;/strong&gt;, and (&lt;em&gt;optionally&lt;/em&gt;) atomic/utility-first &lt;strong&gt;CSS framework&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 Note: If you don't run &lt;code&gt;init&lt;/code&gt; command to create a config file (&lt;code&gt;.gowebly.yml&lt;/code&gt;), the &lt;code&gt;gowebly&lt;/code&gt; CLI creates a new project with a &lt;a href="https://github.com/gowebly/gowebly/blob/main/internal/attachments/configs/default.yml" rel="noopener noreferrer"&gt;default&lt;/a&gt; configuration.&lt;/p&gt;
&lt;/blockquote&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%2Fgithub.com%2Fgowebly%2Fgowebly%2Fassets%2F11155743%2F35b15677-4991-406d-b666-dfbc40beb1ce" class="article-body-image-wrapper"&gt;&lt;img alt="gowebly create" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fgowebly%2Fgowebly%2Fassets%2F11155743%2F35b15677-4991-406d-b666-dfbc40beb1ce" width="1796" height="1346"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every time you make &lt;code&gt;gowebly create&lt;/code&gt; command for your project:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;CLI validates the config and applies all settings to the current project;&lt;/li&gt;
&lt;li&gt;CLI prepares the backend part of your project (generates the project structure and needed utility files, runs &lt;code&gt;go mod tidy&lt;/code&gt;);&lt;/li&gt;
&lt;li&gt;CLI prepares the frontend part of your project (generates the needed utility files, runs &lt;code&gt;npm|bun install&lt;/code&gt; and &lt;code&gt;npm|bun run build:dev&lt;/code&gt; for the first time);&lt;/li&gt;
&lt;li&gt;CLI downloads minimized versions of &lt;strong&gt;htmx&lt;/strong&gt; and &lt;strong&gt;hyperscript&lt;/strong&gt; (from official and trusted &lt;a href="https://unpkg.com" rel="noopener noreferrer"&gt;unpkg.com&lt;/a&gt; CDN) to the &lt;code&gt;./static&lt;/code&gt; folder and places them as separated &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tags (at the bottom of the &lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt; tag) in the Go HTML template &lt;a href="https://github.com/gowebly/gowebly/blob/main/internal/attachments/templates/frontend/main.html" rel="noopener noreferrer"&gt;&lt;code&gt;templates/main.html&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Typically, a created project contains the following files and folders:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="c"&gt;.
&lt;/span&gt;&lt;span class="go"&gt;├── assets
│   └── styles.css
├── static
│   ├── favicon.ico
│   ├── htmx.min.js
│   ├── hyperscript.min.js
│   └── styles.css
├── templates
│   ├── pages
│   │   └── index.html
│   └── main.html
├── .gitignore
├── go.mod
├── go.sum
├── handlers.go
├── main.go
├── package-lock.json
├── package.json
└── server.go
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;run&lt;/code&gt; command
&lt;/h3&gt;

&lt;p&gt;Command to run your project in a &lt;strong&gt;development&lt;/strong&gt; (non-production) mode.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 Note: If you don't run &lt;code&gt;init&lt;/code&gt; command to create a config file (&lt;code&gt;.gowebly.yml&lt;/code&gt;), the &lt;code&gt;gowebly&lt;/code&gt; CLI runs your project with a &lt;a href="https://github.com/gowebly/gowebly/blob/main/internal/attachments/configs/default.yml" rel="noopener noreferrer"&gt;default&lt;/a&gt; configuration.&lt;/p&gt;
&lt;/blockquote&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%2Fgithub.com%2Fgowebly%2Fgowebly%2Fassets%2F11155743%2F51c05652-4601-4f8b-8722-20401d0099d1" class="article-body-image-wrapper"&gt;&lt;img alt="gowebly run" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fgowebly%2Fgowebly%2Fassets%2F11155743%2F51c05652-4601-4f8b-8722-20401d0099d1" width="1796" height="1312"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every time you make &lt;code&gt;gowebly run&lt;/code&gt; command for your project:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;CLI validates the config and applies all settings to the current project;&lt;/li&gt;
&lt;li&gt;CLI prepares the frontend part of your project (runs &lt;code&gt;npm|bun run build:dev&lt;/code&gt;);&lt;/li&gt;
&lt;li&gt;CLI prepares a development (non-production) version of the selected &lt;strong&gt;CSS framework&lt;/strong&gt; to the &lt;code&gt;./static&lt;/code&gt; folder and places it as a &lt;code&gt;&amp;lt;link&amp;gt;&lt;/code&gt; tag (at the bottom of the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; tag) in the Go HTML template &lt;a href="https://github.com/gowebly/gowebly/blob/main/internal/attachments/templates/frontend/main.html" rel="noopener noreferrer"&gt;&lt;code&gt;templates/main.html&lt;/code&gt;&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;CLI starts a project's backend with settings from the default configuration (or from the &lt;code&gt;.gowebly.yml&lt;/code&gt; config file) by a simple &lt;code&gt;go run&lt;/code&gt; command.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;build&lt;/code&gt; command
&lt;/h3&gt;

&lt;p&gt;Command to build your project for &lt;strong&gt;production&lt;/strong&gt; and prepare Docker files for deploy.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 Note: If you don't run &lt;code&gt;init&lt;/code&gt; command to create a config file (&lt;code&gt;.gowebly.yml&lt;/code&gt;), the &lt;code&gt;gowebly&lt;/code&gt; CLI builds your project with a &lt;a href="https://github.com/gowebly/gowebly/blob/main/internal/attachments/configs/default.yml" rel="noopener noreferrer"&gt;default&lt;/a&gt; configuration.&lt;/p&gt;
&lt;/blockquote&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%2Fgithub.com%2Fgowebly%2Fgowebly%2Fassets%2F11155743%2Fac35b01f-0596-4d33-832e-1618709497d3" class="article-body-image-wrapper"&gt;&lt;img alt="gowebly build" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fgowebly%2Fgowebly%2Fassets%2F11155743%2Fac35b01f-0596-4d33-832e-1618709497d3" width="1796" height="1176"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You might add the following options:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Option&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Required?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--skip-docker&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Skip generation process for the Docker files (it's helpful if you've your own)&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Every time you make &lt;code&gt;gowebly build&lt;/code&gt; command for your project:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;CLI validates the config and applies all settings to the current project;&lt;/li&gt;
&lt;li&gt;CLI downloads minimized versions of &lt;strong&gt;htmx&lt;/strong&gt; and &lt;strong&gt;hyperscript&lt;/strong&gt; (from official and trusted &lt;a href="https://unpkg.com" rel="noopener noreferrer"&gt;unpkg.com&lt;/a&gt; CDN) to the &lt;code&gt;./static&lt;/code&gt; folder and places them as separated &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tags (at the bottom of the &lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt; tag) in the Go HTML template &lt;a href="https://github.com/gowebly/gowebly/blob/main/internal/attachments/templates/frontend/main.html" rel="noopener noreferrer"&gt;&lt;code&gt;templates/main.html&lt;/code&gt;&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;CLI prepares a production version of the selected &lt;strong&gt;CSS framework&lt;/strong&gt; and places it as a &lt;code&gt;&amp;lt;link&amp;gt;&lt;/code&gt; tag (at the bottom of the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; tag) in the Go HTML template &lt;a href="https://github.com/gowebly/gowebly/blob/main/internal/attachments/templates/frontend/main.html" rel="noopener noreferrer"&gt;&lt;code&gt;templates/main.html&lt;/code&gt;&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;If the &lt;code&gt;--skip-docker&lt;/code&gt; option is not set, CLI generate a clear and well-documented Docker files (&lt;code&gt;.dockerignore&lt;/code&gt;, &lt;code&gt;Dockerfile&lt;/code&gt;, &lt;code&gt;docker-compose.yml&lt;/code&gt;) in the root of the project folder to deploy it in isolated containers via &lt;a href="https://docs.portainer.io" rel="noopener noreferrer"&gt;Portainer&lt;/a&gt; (&lt;em&gt;recommended&lt;/em&gt;), or manually, to your remote server.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;↑ Table of contents&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%2F3xe08xv1v6wlm4lihlql.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%2F3xe08xv1v6wlm4lihlql.png" alt="gowebly logo" width="800" height="100"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Motivation in CLI creation
&lt;/h2&gt;

&lt;p&gt;Tell me, how often have you had to start a new project from scratch and had to make painful manual configurations? 🤔 Especially, when you are just getting acquainted with a new technology or stack, where everything is new to you.&lt;/p&gt;

&lt;p&gt;For many developers, &lt;em&gt;including me&lt;/em&gt;, this process is as tedious and even depressing as possible, and doesn't carry any useful workload. It is a &lt;strong&gt;very&lt;/strong&gt; frustrating process that can push any developer away from technology a lot.&lt;/p&gt;

&lt;p&gt;Why not just give all that awful manual work to machines? Let them do all the hard work for us, and we will just create awesome web products and not have to think about build and deploy.&lt;/p&gt;

&lt;p&gt;That's why I created the &lt;a href="https://github.com/gowebly/gowebly" rel="noopener noreferrer"&gt;gowebly CLI&lt;/a&gt; and &lt;a href="https://github.com/gowebly/helpers" rel="noopener noreferrer"&gt;its helpers' library&lt;/a&gt;, which helps you start an amazing web applications in &lt;strong&gt;Go&lt;/strong&gt; using &lt;strong&gt;htmx&lt;/strong&gt;, &lt;strong&gt;hyperscript&lt;/strong&gt; and popular atomic/utility-first &lt;strong&gt;CSS frameworks&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I am here to save you (&lt;em&gt;and myself&lt;/em&gt;) from this routine pain! ✨&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Earlier, I have already saved the world once, it was &lt;a href="https://github.com/create-go-app" rel="noopener noreferrer"&gt;Create Go App&lt;/a&gt; (yep, that's my project too). The &lt;a href="https://github.com/create-go-app/cli/stargazers" rel="noopener noreferrer"&gt;GitHub stars&lt;/a&gt; statistics of this project can't lie: more than &lt;strong&gt;2.2k&lt;/strong&gt; developers of any level and different countries start a new project through this CLI tool.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;↑ Table of contents&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Mutually beneficial cooperation
&lt;/h2&gt;

&lt;p&gt;And now, I invite you to participate in this project! Let's work &lt;strong&gt;together&lt;/strong&gt; to create the &lt;strong&gt;most useful&lt;/strong&gt; tool for developers on the web today.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/gowebly/gowebly/issues" rel="noopener noreferrer"&gt;Issues&lt;/a&gt;: ask questions and submit your features.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/gowebly/gowebly/pulls" rel="noopener noreferrer"&gt;Pull requests&lt;/a&gt;: send your improvements to the current.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your PRs &amp;amp; issues are welcome! Thank you 😘&lt;/p&gt;

&lt;p&gt;↑ Table of contents&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Photos and videos by
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Vic Shóstak &lt;a href="https://github.com/koddr" rel="noopener noreferrer"&gt;https://github.com/koddr&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  P.S.
&lt;/h2&gt;

&lt;p&gt;If you want more articles (like this) on this blog, then post a comment below and subscribe to me. Thanks! 😻&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;❗️ You can support me on &lt;a href="https://boosty.to/koddr" rel="noopener noreferrer"&gt;Boosty&lt;/a&gt;, both on a &lt;em&gt;permanent&lt;/em&gt; and on a &lt;em&gt;one-time&lt;/em&gt; basis. All proceeds from this way will go to &lt;strong&gt;support&lt;/strong&gt; my OSS projects and will energize me to &lt;strong&gt;create&lt;/strong&gt; new products and articles for the community.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://boosty.to/koddr/donate" rel="noopener noreferrer"&gt;&lt;img alt="support me on Boosty" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fkoddr%2F.github%2Fmain%2Fimages%2Fboosty-badge.svg" width="868" height="330"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And of course, you can help me make developers' lives even better! Just connect to one of my projects as a contributor. It's easy!&lt;/p&gt;

&lt;p&gt;My main projects that need your help (and stars) 👇&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔥 &lt;a href="https://github.com/gowebly/gowebly" rel="noopener noreferrer"&gt;gowebly&lt;/a&gt;: A next-generation CLI tool that makes it easy to create amazing web applications with Go on the backend, using htmx, hyperscript or Alpine.js and the most popular CSS frameworks on the frontend.&lt;/li&gt;
&lt;li&gt;✨ &lt;a href="https://github.com/create-go-app" rel="noopener noreferrer"&gt;create-go-app&lt;/a&gt;: Create a new production-ready project with Go backend, frontend and deploy automation by running one CLI command.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Other my small projects: &lt;a href="https://github.com/koddr/yatr" rel="noopener noreferrer"&gt;yatr&lt;/a&gt;, &lt;a href="https://github.com/koddr/gosl" rel="noopener noreferrer"&gt;gosl&lt;/a&gt;, &lt;a href="https://github.com/koddr/json2csv" rel="noopener noreferrer"&gt;json2csv&lt;/a&gt;, &lt;a href="https://github.com/koddr/csv2api" rel="noopener noreferrer"&gt;csv2api&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>go</category>
      <category>htmx</category>
      <category>beginners</category>
      <category>opensource</category>
    </item>
    <item>
      <title>⚡️ Speed up development? The handy library of most used snippets for Go apps</title>
      <dc:creator>Vic Shóstak</dc:creator>
      <pubDate>Sat, 13 May 2023 10:13:00 +0000</pubDate>
      <link>https://dev.to/koddr/speed-up-development-the-handy-library-of-most-used-snippets-for-go-apps-1c1h</link>
      <guid>https://dev.to/koddr/speed-up-development-the-handy-library-of-most-used-snippets-for-go-apps-1c1h</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Well, hello, my DEV friends! 👋 &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It's been a long time since I had the time, and then the opportunity, to write this blog. But thank you, anyway, for staying with me and asking questions! &lt;/p&gt;

&lt;p&gt;I really appreciate it. Love you people! 😘&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Today I'm going to tell you about my personal little project, which I put out to the public quite recently. But it helped me all these years to write Go programs as fast as possible and in full compliance with the DRY (Don't Repeat Yourself) principle.&lt;/p&gt;

&lt;p&gt;Intrigued? Then welcome, it will be interesting! 👇&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  📝 Table of contents
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Motivation in library creation&lt;/li&gt;
&lt;li&gt;Basic use of the library&lt;/li&gt;
&lt;li&gt;Regular snippets&lt;/li&gt;
&lt;li&gt;Universal snippets&lt;/li&gt;
&lt;li&gt;Benchmarks&lt;/li&gt;
&lt;li&gt;A win-win cooperation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Motivation in library creation
&lt;/h2&gt;

&lt;p&gt;As you already know from my &lt;a href="https://dev.to/koddr/series/4440"&gt;previous articles&lt;/a&gt;, I take an approach to software development that makes the developer's life totally easy.&lt;/p&gt;

&lt;p&gt;Why repeat the same snippet, for example, to translate a byte slice to a string, if you can add the most efficient solution to the library once and import it where you need it? Exactly right! It's an unnecessary cognitive load for those who will read your code in the future (and for you as well).&lt;/p&gt;

&lt;p&gt;It is for these reasons that &lt;a href="https://github.com/koddr/gosl" rel="noopener noreferrer"&gt;The Go Snippet Library&lt;/a&gt; (or &lt;code&gt;gosl&lt;/code&gt; for a short) provides snippets collection for working with routine operations in your Go programs with a super user-friendly API and the most efficient &lt;a href="https://github.com/koddr/gosl#%EF%B8%8F-benchmarks" rel="noopener noreferrer"&gt;performance&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;↑ Table of contents&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Basic use of the library
&lt;/h2&gt;

&lt;p&gt;Yes, simply add &lt;code&gt;gosl&lt;/code&gt; to your project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go get github.com/koddr/gosl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add the needed snippet to your code, like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
   &lt;span class="n"&gt;fmt&lt;/span&gt;
   &lt;span class="n"&gt;log&lt;/span&gt;

   &lt;span class="s"&gt;"github.com/koddr/gosl"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello, World!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;gosl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c"&gt;// convert byte slice to string&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fatal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or like this to have access to snippets as embedded struct:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;App&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;// ...&lt;/span&gt;

    &lt;span class="n"&gt;utils&lt;/span&gt;    &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;gosl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Utility&lt;/span&gt;                         &lt;span class="c"&gt;// add regular snippets&lt;/span&gt;
    &lt;span class="n"&gt;genUtils&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;gosl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GenericUtility&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;any&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;comparable&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c"&gt;// add generic snippets&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;App&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;handleSomething&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;// ...&lt;/span&gt;

    &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;utils&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c"&gt;// convert byte slice to string&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c"&gt;// ...&lt;/span&gt;

    &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;genUtils&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Unmarshal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c"&gt;// unmarshal JSON data to struct&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And you are already saving your time and energy. Trust me ✌️&lt;/p&gt;

&lt;p&gt;↑ Table of contents&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%2F752crte5p5c23cu67y8b.jpg" 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%2F752crte5p5c23cu67y8b.jpg" alt="gosl saving your time and energy" width="800" height="1027"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Regular snippets
&lt;/h2&gt;

&lt;p&gt;The regular snippets of the &lt;a href="https://github.com/koddr/gosl" rel="noopener noreferrer"&gt;&lt;code&gt;gosl&lt;/code&gt;&lt;/a&gt; package are aimed at solving one single task with the smallest possible allocation of your machine's resources.&lt;/p&gt;

&lt;h3&gt;
  
  
  Concat
&lt;/h3&gt;

&lt;p&gt;Concatenate strings &lt;code&gt;s&lt;/code&gt; to the one string:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;s1&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="s"&gt;"this "&lt;/span&gt;
&lt;span class="n"&gt;s2&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="s"&gt;"is "&lt;/span&gt;
&lt;span class="n"&gt;s3&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="s"&gt;"my string"&lt;/span&gt;

&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;gosl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Concat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ContainsCaseInsensitive
&lt;/h3&gt;

&lt;p&gt;Report if string &lt;code&gt;substr&lt;/code&gt; is within string &lt;code&gt;s&lt;/code&gt; (case-insensitive by default):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="s"&gt;"Hello, WORLD!"&lt;/span&gt;
&lt;span class="n"&gt;substr&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="s"&gt;"r"&lt;/span&gt;

&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;gosl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ContainsCaseInsensitive&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;substr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  RandomString
&lt;/h3&gt;

&lt;p&gt;Generates a (&lt;strong&gt;really&lt;/strong&gt;) random string with a given size:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;8&lt;/span&gt;

&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;gosl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RandomString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fatal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ToString
&lt;/h3&gt;

&lt;p&gt;Convert byte slice &lt;code&gt;b&lt;/code&gt; to string or error:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello, World!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;gosl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fatal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ToBytes
&lt;/h3&gt;

&lt;p&gt;Convert string &lt;code&gt;s&lt;/code&gt; to byte slice or error:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="s"&gt;"Hello, World!"&lt;/span&gt;

&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;gosl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ToBytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fatal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;↑ Table of contents&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Universal snippets
&lt;/h2&gt;

&lt;p&gt;The universal (or &lt;em&gt;generic&lt;/em&gt;) snippets of the &lt;a href="https://github.com/koddr/gosl" rel="noopener noreferrer"&gt;&lt;code&gt;gosl&lt;/code&gt;&lt;/a&gt; package are aimed at solving one particular task with the smallest possible allocation of your machine's resources, but can be applied to a huge number of user types.&lt;/p&gt;

&lt;h3&gt;
  
  
  ContainsInSlice
&lt;/h3&gt;

&lt;p&gt;Report if value &lt;code&gt;v&lt;/code&gt; is within slice &lt;code&gt;s&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"one"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"two"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"three"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="s"&gt;"two"&lt;/span&gt;

&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;gosl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ContainsInSlice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ContainsInMap
&lt;/h3&gt;

&lt;p&gt;Report if key &lt;code&gt;k&lt;/code&gt; is within map &lt;code&gt;m&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"one"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"two"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"three"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="s"&gt;"two"&lt;/span&gt;

&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;gosl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ContainsInMap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Marshal
&lt;/h3&gt;

&lt;p&gt;Marshal struct &lt;code&gt;user&lt;/code&gt; to JSON data &lt;code&gt;j&lt;/code&gt; (byte slice) or error:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;ID&lt;/span&gt;   &lt;span class="kt"&gt;int&lt;/span&gt;    &lt;span class="s"&gt;`json:"id"`&lt;/span&gt;
    &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="s"&gt;`json:"name"`&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;gosl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Marshal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fatal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;💡 This snippet is a 100% compatible drop-in replacement for the standard &lt;code&gt;encoding/json&lt;/code&gt; library.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Unmarshal
&lt;/h3&gt;

&lt;p&gt;Unmarshal JSON data &lt;code&gt;j&lt;/code&gt; (byte slice) to struct &lt;code&gt;user&lt;/code&gt; or error:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;ID&lt;/span&gt;   &lt;span class="kt"&gt;int&lt;/span&gt;    &lt;span class="s"&gt;`json:"id"`&lt;/span&gt;
    &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="s"&gt;`json:"name"`&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;`{"id":1,"name":"Viktor"}`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;gosl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Unmarshal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fatal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;💡 This snippet (also) is a 100% compatible drop-in replacement for the standard &lt;code&gt;encoding/json&lt;/code&gt; library.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;↑ Table of contents&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Benchmarks
&lt;/h2&gt;

&lt;p&gt;My results for all snippets in the &lt;a href="https://github.com/koddr/gosl" rel="noopener noreferrer"&gt;library&lt;/a&gt; (the test stand is Apple MacBook Air M1, 16 GB RAM, macOS 13.3.1):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;BenchmarkConcat_String2-8                           58663996            20.06 ns/op       32 B/op          1 allocs/op
BenchmarkConcat_String8-8                           26829356            44.16 ns/op      128 B/op          1 allocs/op
BenchmarkConcat_String32-8                           9321133           127.8 ns/op       448 B/op          1 allocs/op

BenchmarkToString_HelloWorld-8                      100000000           10.56 ns/op       16 B/op          1 allocs/op

BenchmarkToBytes_HelloWorld-8                       1000000000           0.6288 ns/op      0 B/op          0 allocs/op

BenchmarkRandomString_Size1-8                        3488678           344.6 ns/op         6 B/op          3 allocs/op
BenchmarkRandomString_Size8-8                        3394548           353.3 ns/op        24 B/op          3 allocs/op
BenchmarkRandomString_Size64-8                       2313856           517.9 ns/op       160 B/op          3 allocs/op
BenchmarkRandomString_Size512-8                      1423572           838.9 ns/op      1280 B/op          3 allocs/op
BenchmarkRandomString_Size4096-8                      185337          6350 ns/op       10240 B/op          3 allocs/op

BenchmarkMarshal_StructField_4-8                     8584442           139.9 ns/op        48 B/op          3 allocs/op
BenchmarkMarshal_StructField_16-8                    2838062           420.8 ns/op       192 B/op          3 allocs/op

BenchmarkUnmarshal_StructField_4-8                   6960462           169.3 ns/op        32 B/op          3 allocs/op
BenchmarkUnmarshal_StructField_16-8                   764182          1553 ns/op         864 B/op         45 allocs/op

BenchmarkContainsCaseInsensitive_HelloWorld-8       24856041            48.46 ns/op       16 B/op          1 allocs/op
BenchmarkContainsCaseInsensitive_LoremIpsum-8        1797150           695.9 ns/op       448 B/op          1 allocs/op

BenchmarkContainsInSlice-8                          122999034            9.758 ns/op       0 B/op          0 allocs/op

BenchmarkContainsInMap-8                            19123504            62.61 ns/op        0 B/op          0 allocs/op
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;↑ Table of contents&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A win-win cooperation
&lt;/h2&gt;

&lt;p&gt;I invite every user of Dev.to (and my lowly blog, certainly) to participate in this project! Let's work &lt;em&gt;together&lt;/em&gt; to create the largest and most useful library of snippets for Go programs on the web today.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ask questions and submit your features to the &lt;a href="https://github.com/koddr/gosl/issues" rel="noopener noreferrer"&gt;Issues&lt;/a&gt; section.&lt;/li&gt;
&lt;li&gt;Send your snippets or improvements to the current to the &lt;a href="https://github.com/koddr/gosl/pulls" rel="noopener noreferrer"&gt;Pull requests&lt;/a&gt; section.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your PRs &amp;amp; issues are welcome! Thanks 😉&lt;/p&gt;

&lt;p&gt;↑ Table of contents&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Photos and videos by
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Marc Sendra Martorell &lt;a href="https://unsplash.com/photos/-Vqn2WrfxTQ" rel="noopener noreferrer"&gt;https://unsplash.com/photos/-Vqn2WrfxTQ&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Vic Shóstak &lt;a href="https://github.com/koddr" rel="noopener noreferrer"&gt;https://github.com/koddr&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  P.S.
&lt;/h2&gt;

&lt;p&gt;If you want more articles (like this) on this blog, then post a comment below and subscribe to me. Thanks! 😻&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;❗️ You can support me on &lt;a href="https://boosty.to/koddr" rel="noopener noreferrer"&gt;Boosty&lt;/a&gt;, both on a &lt;em&gt;permanent&lt;/em&gt; and on a &lt;em&gt;one-time&lt;/em&gt; basis. All proceeds from this way will go to &lt;strong&gt;support&lt;/strong&gt; my OSS projects and will energize me to &lt;strong&gt;create&lt;/strong&gt; new products and articles for the community.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://boosty.to/koddr/donate" rel="noopener noreferrer"&gt;&lt;img alt="support me on Boosty" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fkoddr%2F.github%2Fmain%2Fimages%2Fboosty-badge.svg" width="868" height="330"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And of course, you can help me make developers' lives even better! Just connect to one of my projects as a contributor. It's easy!&lt;/p&gt;

&lt;p&gt;My main projects that need your help (and stars) 👇&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔥 &lt;a href="https://github.com/gowebly/gowebly" rel="noopener noreferrer"&gt;gowebly&lt;/a&gt;: A next-generation CLI tool that makes it easy to create amazing web applications with Go on the backend, using htmx, hyperscript or Alpine.js and the most popular CSS frameworks on the frontend.&lt;/li&gt;
&lt;li&gt;✨ &lt;a href="https://github.com/create-go-app" rel="noopener noreferrer"&gt;create-go-app&lt;/a&gt;: Create a new production-ready project with Go backend, frontend and deploy automation by running one CLI command.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Other my small projects: &lt;a href="https://github.com/koddr/yatr" rel="noopener noreferrer"&gt;yatr&lt;/a&gt;, &lt;a href="https://github.com/koddr/gosl" rel="noopener noreferrer"&gt;gosl&lt;/a&gt;, &lt;a href="https://github.com/koddr/json2csv" rel="noopener noreferrer"&gt;json2csv&lt;/a&gt;, &lt;a href="https://github.com/koddr/csv2api" rel="noopener noreferrer"&gt;csv2api&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>go</category>
      <category>showdev</category>
      <category>productivity</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Kotlin short recipes: Generating a chessboard for a console game</title>
      <dc:creator>Vic Shóstak</dc:creator>
      <pubDate>Wed, 29 Dec 2021 09:35:54 +0000</pubDate>
      <link>https://dev.to/koddr/kotlin-short-recipes-generating-a-chessboard-for-a-console-game-3a98</link>
      <guid>https://dev.to/koddr/kotlin-short-recipes-generating-a-chessboard-for-a-console-game-3a98</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Hello, DEV friends! 👋&lt;/p&gt;

&lt;p&gt;This series of a really short (&lt;em&gt;but useful&lt;/em&gt;) articles will aim at a general demonstration of how the &lt;a href="https://kotlinlang.org/docs/getting-started.html" rel="noopener noreferrer"&gt;Kotlin&lt;/a&gt; language can elegantly solve many of the (&lt;em&gt;non-&lt;/em&gt;)trivial problems.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🔥 Disclaimer: The purpose of this article is to show the essence of the solution, not to dive into the subject in detail. For a deeper dive, links to the Kotlin documentation pages will be left.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Yes, let's do it! 👇&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  📝 Table of contents
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The result of our efforts&lt;/li&gt;
&lt;li&gt;Project structure&lt;/li&gt;
&lt;li&gt;Create the UI package&lt;/li&gt;
&lt;li&gt;Create the entry point&lt;/li&gt;
&lt;li&gt;Learn Kotlin&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The result of our efforts
&lt;/h2&gt;

&lt;p&gt;Let's go backwards. This will help you better understand what we will be trying to get out of this. &lt;/p&gt;

&lt;p&gt;I chose a game of chess to show you how to work with repetitive elements and draw a console UI for your projects (or even games). This is what the result of our program will look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;Let's play Chess!
+---+---+---+---+---+---+---+---+
|   |   |   |   |   |   |   |   | 8
+---+---+---+---+---+---+---+---+
|   |   |   |   |   |   |   |   | 7
+---+---+---+---+---+---+---+---+
|   |   |   |   |   |   |   |   | 6
+---+---+---+---+---+---+---+---+
|   |   |   |   |   |   |   |   | 5
+---+---+---+---+---+---+---+---+
|   |   |   |   |   |   |   |   | 4
+---+---+---+---+---+---+---+---+
|   |   |   |   |   |   |   |   | 3
+---+---+---+---+---+---+---+---+
|   |   |   |   |   |   |   |   | 2
+---+---+---+---+---+---+---+---+
|   |   |   |   |   |   |   |   | 1
+---+---+---+---+---+---+---+---+
  a   b   c   d   e   f   g   h
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As you may notice, the numbers are on the right, not on the left, as many people have used to. This is because it is much easier to position elements in a line-by-line printout. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;☝️ If you don't like it that much, you can always change just one line of code (&lt;em&gt;which I'll show below&lt;/em&gt;). That will be your homework! That's it, yeah.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;↑ Table of contents&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Project structure
&lt;/h2&gt;

&lt;p&gt;The structure of the project (game) will be as Kotlin &lt;a href="https://kotlinlang.org/docs/idioms.html" rel="noopener noreferrer"&gt;idiomatic&lt;/a&gt; as possible. &lt;/p&gt;

&lt;p&gt;As always, the entry point will be in &lt;code&gt;Main.kt&lt;/code&gt;. All UI elements and the drawing class itself in the &lt;code&gt;ui&lt;/code&gt; package:&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%2Faibm4u2ng3bz484z8sfy.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%2Faibm4u2ng3bz484z8sfy.png" alt="project structure" width="664" height="277"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;↑ Table of contents&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Create the UI package
&lt;/h2&gt;

&lt;p&gt;To improve reusability, let's immediately put some UI elements into the Kotlin's built-in &lt;a href="https://kotlinlang.org/docs/enum-classes.html" rel="noopener noreferrer"&gt;enum class&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ./src/main/kotlin/ui/Element.kt&lt;/span&gt;

&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;ui&lt;/span&gt;

&lt;span class="k"&gt;enum&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Element&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;view&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;EMPTY_CELL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;" "&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nc"&gt;DIVIDER&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"+---+---+---+---+---+---+---+---+"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nc"&gt;ALPHABETICAL_INDEXES&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"a   b   c   d   e   f   g   h"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Okay, move on to the rendering engine itself. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;😉 By the way, I'll use a wonderful Kotlin &lt;a href="https://kotlinlang.org/docs/data-classes.html" rel="noopener noreferrer"&gt;data classes&lt;/a&gt; for it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So, let's create an array-structure with the given number of rows and cells and display the entire assembled UI via &lt;code&gt;println()&lt;/code&gt; in our &lt;code&gt;draw()&lt;/code&gt; method.&lt;/p&gt;

&lt;p&gt;Sounds like a plan, let's do it! 👇&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ./src/main/kotlin/ui/Board.kt&lt;/span&gt;

&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;ui&lt;/span&gt;

&lt;span class="kd"&gt;data class&lt;/span&gt; &lt;span class="nc"&gt;Board&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Array for building the board:&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;board&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nc"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nc"&gt;Element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;EMPTY_CELL&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Function for forming and drawing the board with&lt;/span&gt;
    &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// 1️⃣&lt;/span&gt;
        &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;boardAsString&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;board&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mapIndexed&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt;
            &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;cells&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;joinToString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;" | "&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="s"&gt;"| $cells | ${index + 1}\n${Element.DIVIDER}"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// print game's title&lt;/span&gt;
        &lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DIVIDER&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// print starting divider&lt;/span&gt;

        &lt;span class="c1"&gt;// 2️⃣&lt;/span&gt;
        &lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;boardAsString&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reversed&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;joinToString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"\n"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

        &lt;span class="c1"&gt;// print ending string with left padding&lt;/span&gt;
        &lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"  ${Element.ALPHABETICAL_INDEXES}"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;1️⃣ : To simplify, we will expand our array with the function &lt;a href="https://kotlinlang.org/docs/collection-transformations.html#map" rel="noopener noreferrer"&gt;mapIndexed()&lt;/a&gt;, where each element will be a string with an already prepared UI.&lt;/p&gt;

&lt;p&gt;2️⃣ : To display line numbering reverse, we use Kotlin's built-in &lt;a href="https://kotlinlang.org/docs/collection-ordering.html#reverse-order" rel="noopener noreferrer"&gt;reversed()&lt;/a&gt; function. And then just output the result using the &lt;a href="https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.sequences/join-to-string.html" rel="noopener noreferrer"&gt;joinToString()&lt;/a&gt; function, which specifies the string translation (&lt;code&gt;\n&lt;/code&gt;), as an element separator.&lt;/p&gt;

&lt;p&gt;↑ Table of contents&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Create the entry point
&lt;/h2&gt;

&lt;p&gt;And, finally, let's create an entry point of our console game (&lt;code&gt;Main.kt&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ./src/main/kotlin/Main.kt&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;ui.Board&lt;/span&gt;

&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;board&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Board&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Let's play Chess!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;board&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;💡 You can give your playing field any name you want. Just add it to the primary constructor of the &lt;code&gt;Board&lt;/code&gt; data class.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Run our program (Shift + Ctrl + R) and 💥 BOOM 💥 everything works the way we wanted it to:&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%2Fquf5uhy4u022hcxr9ezc.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%2Fquf5uhy4u022hcxr9ezc.png" alt="result" width="800" height="432"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;↑ Table of contents&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Learn Kotlin
&lt;/h2&gt;

&lt;p&gt;Do you want to learn Kotlin? 👩‍🎓 👨‍🎓&lt;/p&gt;

&lt;p&gt;Then come to &lt;a href="https://hyperskill.org/join/9e07b927f" rel="noopener noreferrer"&gt;JetBrains Academy&lt;/a&gt;, where there is a free basic course in this language for free! There you will find both theoretical part and many practical tasks of any level of complexity.&lt;/p&gt;

&lt;p&gt;↑ Table of contents&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Photos and videos by
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Kotlin mascot authors &lt;a href="https://kotlinlang.org/docs/kotlin-mascot.html" rel="noopener noreferrer"&gt;https://kotlinlang.org/docs/kotlin-mascot.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Vic Shóstak &lt;a href="https://github.com/koddr" rel="noopener noreferrer"&gt;https://github.com/koddr&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  P.S.
&lt;/h2&gt;

&lt;p&gt;If you want more articles (like this) on this blog, then post a comment below and subscribe to me. Thanks! 😻&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;❗️ You can support me on &lt;a href="https://boosty.to/koddr" rel="noopener noreferrer"&gt;Boosty&lt;/a&gt;, both on a &lt;em&gt;permanent&lt;/em&gt; and on a &lt;em&gt;one-time&lt;/em&gt; basis. All proceeds from this way will go to &lt;strong&gt;support&lt;/strong&gt; my OSS projects and will energize me to &lt;strong&gt;create&lt;/strong&gt; new products and articles for the community.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://boosty.to/koddr/donate" rel="noopener noreferrer"&gt;&lt;img alt="support me on Boosty" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fkoddr%2F.github%2Fmain%2Fimages%2Fboosty-badge.svg" width="868" height="330"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And of course, you can help me make developers' lives even better! Just connect to one of my projects as a contributor. It's easy!&lt;/p&gt;

&lt;p&gt;My main projects that need your help (and stars) 👇&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔥 &lt;a href="https://github.com/gowebly/gowebly" rel="noopener noreferrer"&gt;gowebly&lt;/a&gt;: A next-generation CLI tool that makes it easy to create amazing web applications with Go on the backend, using htmx, hyperscript or Alpine.js and the most popular CSS frameworks on the frontend.&lt;/li&gt;
&lt;li&gt;✨ &lt;a href="https://github.com/create-go-app" rel="noopener noreferrer"&gt;create-go-app&lt;/a&gt;: Create a new production-ready project with Go backend, frontend and deploy automation by running one CLI command.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Other my small projects: &lt;a href="https://github.com/koddr/yatr" rel="noopener noreferrer"&gt;yatr&lt;/a&gt;, &lt;a href="https://github.com/koddr/gosl" rel="noopener noreferrer"&gt;gosl&lt;/a&gt;, &lt;a href="https://github.com/koddr/json2csv" rel="noopener noreferrer"&gt;json2csv&lt;/a&gt;, &lt;a href="https://github.com/koddr/csv2api" rel="noopener noreferrer"&gt;csv2api&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>kotlin</category>
      <category>gamedev</category>
      <category>showdev</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
