<?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 (@vic_makes_ai).</description>
    <link>https://dev.to/vic_makes_ai</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F309030%2Ff7abc9fb-cf14-4570-9d69-2cbf8abfc130.jpeg</url>
      <title>DEV Community: Vic Shóstak</title>
      <link>https://dev.to/vic_makes_ai</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vic_makes_ai"/>
    <language>en</language>
    <item>
      <title>DeepSeek Raises $7.4B — Valuation Could Hit $74B</title>
      <dc:creator>Vic Shóstak</dc:creator>
      <pubDate>Thu, 27 Aug 2026 14:17:36 +0000</pubDate>
      <link>https://dev.to/vic_makes_ai/deepseek-raises-74b-valuation-could-hit-74b-mm9</link>
      <guid>https://dev.to/vic_makes_ai/deepseek-raises-74b-valuation-could-hit-74b-mm9</guid>
      <description>&lt;p&gt;DeepSeek, a Chinese AI startup, announced a new fundraising round worth &lt;strong&gt;$7.4 billion&lt;/strong&gt; to fuel research, development, and computational infrastructure expansion. According to &lt;em&gt;The Wall Street Journal&lt;/em&gt;, this round could push the company's valuation up to &lt;strong&gt;$74 billion&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"In early June, DeepSeek attracted a record $7 billion at a $50 billion valuation, with participation from Tencent, CATL, and the National Artificial Intelligence Industry Investment Fund," the press reports.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;These funds will accelerate the rollout of new AI models, expand cloud services, and support the company's upcoming Shanghai IPO, likely slated for next year.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why It Matters
&lt;/h2&gt;

&lt;p&gt;From my perspective, this massive capital injection signals growing investor confidence in domestic AI capabilities. The AI market is heating up globally, and DeepSeek's trajectory shows that Chinese startups are no longer playing catch-up — they are setting the pace.&lt;/p&gt;

&lt;p&gt;Russian enterprises should keep a close eye on partnership opportunities with DeepSeek. Leveraging cutting-edge technology from companies like this could be a game-changer for businesses looking to integrate AI at scale.&lt;/p&gt;

&lt;p&gt;The combination of a $74B valuation target and an imminent IPO suggests that DeepSeek is not just building technology — it is building an ecosystem. For engineers and founders alike, this is a signal worth paying attention to.&lt;/p&gt;




&lt;p&gt;...and I'd like to remind you that if you need to design, build, and launch an AI solution for business automation or personal use, feel free to reach out to me: &lt;a href="https://t.me/koddr" rel="noopener noreferrer"&gt;https://t.me/koddr&lt;/a&gt; 😎&lt;/p&gt;

&lt;p&gt;💡 Found this useful? Subscribe to me on all platforms so you don't miss new posts 👉 &lt;a href="https://t.me/vic_makes_ai" rel="noopener noreferrer"&gt;Telegram&lt;/a&gt;, &lt;a href="https://vk.ru/vic_makes_ai" rel="noopener noreferrer"&gt;VK&lt;/a&gt;, &lt;a href="https://tenchat.ru/vic_makes_ai" rel="noopener noreferrer"&gt;TenChat&lt;/a&gt;, &lt;a href="https://dzen.ru/vic_makes_ai" rel="noopener noreferrer"&gt;Dzen&lt;/a&gt;, &lt;a href="https://dev.to/vic_makes_ai"&gt;Dev.to&lt;/a&gt; or &lt;a href="https://vc.ru/id6063554" rel="noopener noreferrer"&gt;vc.ru&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>deepseek</category>
      <category>investment</category>
      <category>startup</category>
    </item>
    <item>
      <title>✨ So... real tests of the local Qwen 3.8 27B model</title>
      <dc:creator>Vic Shóstak</dc:creator>
      <pubDate>Tue, 25 Aug 2026 17:49:00 +0000</pubDate>
      <link>https://dev.to/vic_makes_ai/so-real-tests-of-the-local-qwen-38-27b-model-145m</link>
      <guid>https://dev.to/vic_makes_ai/so-real-tests-of-the-local-qwen-38-27b-model-145m</guid>
      <description>&lt;p&gt;I came across an interesting discussion in several AI-related communities about &lt;a href="https://www.reddit.com/r/LocalLLaMA/comments/1vu0u2v/qwen_38_27b_pi_agent_vs_opencode/" rel="noopener noreferrer"&gt;this Reddit post&lt;/a&gt;: &lt;strong&gt;one user decided to test how the local Qwen 3.8 27B model behaves in two different agent shells — PI Agent and OpenCode&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;From his observations, PI Agent delivers higher-quality results, uses fewer tokens, runs faster and more stably, and most importantly — it doesn’t have a hard 32k output limit.  &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;What impressed me most was context compression: in OpenCode it starts kicking in at around 67k (with a total context window of 100k), while in PI Agent the model “holds up” until 90k, even if you set output to 64k and above.&lt;/p&gt;

&lt;p&gt;For those who want to reproduce this locally — even an RTX 3090 is enough, plus a small fine-tune of the model itself (you can find that in the original post).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;At the same time, one of the commenters already staged a “duel” between local Qwen paired with PI Agent and Claude Code. The results were very close, and after a small refinement, the PI version even slightly outperformed Claude.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;☝️ &lt;strong&gt;The main takeaway&lt;/strong&gt;: with the same model, final quality depends heavily on the “wrapper” — the environment, context engineering, planning mode, overall agent-system setup, and so on...&lt;/p&gt;

&lt;p&gt;That’s exactly what I’ve been saying for a long time across all my platforms — &lt;strong&gt;without a skilled AI engineer and a properly built agent system&lt;/strong&gt;, nothing will work well out of the box. Sad but true.&lt;/p&gt;

&lt;p&gt;And yes, &lt;a href="https://t.me/koddr" rel="noopener noreferrer"&gt;DM me&lt;/a&gt; if you need AI solutions tailored to your tasks 😎&lt;/p&gt;

&lt;h1&gt;
  
  
  ai #aiagents #qwen
&lt;/h1&gt;

&lt;p&gt;💬 Found this useful? Follow me on all platforms so you don’t miss new posts 👉 &lt;a href="https://t.me/vic_makes_ai" rel="noopener noreferrer"&gt;Telegram&lt;/a&gt;, &lt;a href="https://vk.ru/vic_makes_ai" rel="noopener noreferrer"&gt;VK&lt;/a&gt;, &lt;a href="https://tenchat.ru/vic_makes_ai" rel="noopener noreferrer"&gt;TenChat&lt;/a&gt;, &lt;a href="https://dzen.ru/vic_makes_ai" rel="noopener noreferrer"&gt;Dzen&lt;/a&gt;, &lt;a href="https://teletype.in/@vic_makes_ai" rel="noopener noreferrer"&gt;Teletype&lt;/a&gt;, or &lt;a href="https://vc.ru/id6063554" rel="noopener noreferrer"&gt;vc.ru&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
      <category>opensource</category>
    </item>
    <item>
      <title>⚡️ xAI is rolling out Grok Build — an open-source terminal AI agent written in Rust</title>
      <dc:creator>Vic Shóstak</dc:creator>
      <pubDate>Fri, 21 Aug 2026 13:12:02 +0000</pubDate>
      <link>https://dev.to/vic_makes_ai/xai-is-rolling-out-grok-build-an-open-source-terminal-ai-agent-written-in-rust-3i2</link>
      <guid>https://dev.to/vic_makes_ai/xai-is-rolling-out-grok-build-an-open-source-terminal-ai-agent-written-in-rust-3i2</guid>
      <description>&lt;p&gt;Here’s how it works: &lt;em&gt;first it builds a plan, then it can launch up to eight sub-agents in parallel in separate Git worktrees&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;✨ The tool works both in interactive mode and in headless mode for CI/CD. And under the hood, the Grok model gives it up to 500,000 tokens of context and a focus on long-running agent tasks.&lt;/p&gt;

&lt;p&gt;It’s now also available on the web and in mobile apps: just describe a game, website, or dashboard — and the AI will assemble a prototype that you can then publish on grok.me, push to GitHub, or keep refining via API. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Yep, this is Elon Musk’s answer to Claude Code and Codex — that’s right 😉&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Let’s see how &lt;a href="https://www.basenor.com/blogs/news/xai-launches-grok-build-an-agentic-cli-that-runs-your-computer" rel="noopener noreferrer"&gt;Grok Build&lt;/a&gt; performs on real-world tasks, but what’s happening in this market right now is exciting. The race among AI giants for our subscriptions continues!&lt;/p&gt;

&lt;p&gt;☝️ But it’s important to remember: even the newest/coolest/most popular vibe-coding tools and agent systems don’t work 100% on their own.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Like in all of IT, without strong AI engineers and a well-designed agent system, they quickly start just “eating tokens” without delivering much value for a specific project task or for the business as a whole.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;...so if you need to design and launch an agent system to automate your business processes or for personal use, &lt;a href="https://t.me/koddr" rel="noopener noreferrer"&gt;feel free to DM me&lt;/a&gt; 😌&lt;/p&gt;

&lt;h1&gt;
  
  
  ai #aiagents #grok #xai
&lt;/h1&gt;

&lt;p&gt;💬 &lt;strong&gt;Like the way I write?&lt;/strong&gt; Follow me on all platforms so you don’t miss new posts 👉 &lt;a href="https://t.me/vic_makes_ai" rel="noopener noreferrer"&gt;Telegram&lt;/a&gt;, &lt;a href="https://vk.ru/vic_makes_ai" rel="noopener noreferrer"&gt;VK&lt;/a&gt;, &lt;a href="https://tenchat.ru/vic_makes_ai" rel="noopener noreferrer"&gt;TenChat&lt;/a&gt;, &lt;a href="https://dzen.ru/vic_makes_ai" rel="noopener noreferrer"&gt;Dzen&lt;/a&gt;, &lt;a href="https://teletype.in/@vic_makes_ai" rel="noopener noreferrer"&gt;Teletype&lt;/a&gt;, or &lt;a href="https://vc.ru/id6063554" rel="noopener noreferrer"&gt;vc.ru&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
      <category>opensource</category>
    </item>
    <item>
      <title>🤖 I Built 2 Telegram Bots with Qwen3.8-Max — and the Results Were Seriously Impressive</title>
      <dc:creator>Vic Shóstak</dc:creator>
      <pubDate>Sun, 16 Aug 2026 18:20:52 +0000</pubDate>
      <link>https://dev.to/vic_makes_ai/i-built-2-telegram-bots-with-qwen38-max-and-the-results-were-seriously-impressive-4ceg</link>
      <guid>https://dev.to/vic_makes_ai/i-built-2-telegram-bots-with-qwen38-max-and-the-results-were-seriously-impressive-4ceg</guid>
      <description>&lt;p&gt;💬 Following up on the &lt;a href="https://t.me/vic_makes_ai/1082" rel="noopener noreferrer"&gt;story about the release of Qwen3.8-Max&lt;/a&gt;, I finally tried it on real-world tasks.&lt;/p&gt;

&lt;p&gt;Specifically, for building &lt;strong&gt;AI consultants for text channels&lt;/strong&gt; (messengers) in my favorite programming language — &lt;strong&gt;Go&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Spoiler: &lt;strong&gt;it’s really good, especially for such a low price per 1M tokens&lt;/strong&gt;! 😍&lt;/p&gt;

&lt;p&gt;As a result, I built 2 demo Telegram bots, where &lt;strong&gt;GPT-4.1-mini&lt;/strong&gt; acts as the brains 👇&lt;/p&gt;

&lt;p&gt;1️⃣ &lt;a href="https://t.me/shostak_dev_demo_autoservice_bot" rel="noopener noreferrer"&gt;A bot for qualifying a customer and booking a car repair appointment&lt;/a&gt;, which asks for details about the vehicle and the issue, answers questions about service pricing, and schedules a convenient visit time.&lt;/p&gt;

&lt;p&gt;2️⃣ &lt;a href="https://t.me/shostak_dev_demo_kitchen_bot" rel="noopener noreferrer"&gt;A bot for calculating kitchen pricing for furniture companies&lt;/a&gt;, which уточняет kitchen parameters through guiding questions, calculates the cost, sends the final estimate, and books the client at the company office for a detailed design session.&lt;/p&gt;

&lt;p&gt;Before implementation, of course, I wrote a detailed spec for each of these bots and connected MCP Context7.&lt;/p&gt;

&lt;p&gt;I also had to make 1–2 corrective prompts for code style and some business-logic details... but otherwise, Qwen3.8-Max worked fully autonomously in the engineering loop (questioning itself at every stage and adjusting its own reasoning and code).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Token usage (input + output) totaled &lt;strong&gt;~12.8 million&lt;/strong&gt;, across about 400 API requests to the Chinese model. That’s seriously impressive! For comparison, I ran the same task through DeepSeek V4 Flash Latest: with similar output results, it used over &lt;strong&gt;15 million&lt;/strong&gt; tokens.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;By the way, the whole development process was done in the next-gen &lt;a href="https://kodik.ru/signup?ref=TVAF2JRH" rel="noopener noreferrer"&gt;AI IDE Kodik&lt;/a&gt;, by our local guys — &lt;strong&gt;ArchiTech AI&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Highly recommend downloading and trying it. Not an Ad! I’ve been using it for over a month now, and it’s truly a very high-quality product, especially in the era of account bans from Anthropic and OpenAI 😏&lt;/p&gt;

&lt;p&gt;...and soon, a local model called &lt;strong&gt;Qwen3.8-27b&lt;/strong&gt; is also expected to drop, which Alibaba has promised to release any day now... that’s definitely something that can make the big AI model vendors nervous!&lt;/p&gt;

&lt;p&gt;😉 &lt;em&gt;And if you need to design, build, and launch an AI solution for you and/or automate your business processes, feel free to DM me: &lt;a href="https://t.me/koddr" rel="noopener noreferrer"&gt;t.me/koddr&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;💡 &lt;strong&gt;Interesting to read?&lt;/strong&gt; Follow me on all platforms so you don’t miss new posts 👉 &lt;a href="https://t.me/vic_makes_ai" rel="noopener noreferrer"&gt;Telegram&lt;/a&gt;, &lt;a href="https://vk.ru/vic_makes_ai" rel="noopener noreferrer"&gt;VK&lt;/a&gt;, &lt;a href="https://tenchat.ru/vic_makes_ai" rel="noopener noreferrer"&gt;TenChat&lt;/a&gt;, &lt;a href="https://dzen.ru/vic_makes_ai" rel="noopener noreferrer"&gt;Dzen&lt;/a&gt;, &lt;a href="https://teletype.in/@vic_makes_ai" rel="noopener noreferrer"&gt;Teletype&lt;/a&gt;, or &lt;a href="https://vc.ru/id6063554" rel="noopener noreferrer"&gt;vc.ru&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>nocode</category>
      <category>productivity</category>
    </item>
    <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/vic_makes_ai/finally-official-launch-of-the-gowebly-project-on-producthunt-3o4g</link>
      <guid>https://dev.to/vic_makes_ai/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 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/vic_makes_ai/gowebly-cli-now-supports-the-pocketbase-framework-bi6</link>
      <guid>https://dev.to/vic_makes_ai/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://assets.dev.to/assets/github-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/88eb829869c142aadf8c2136b677c437358dfb80ea4793a642d25cfd15058beb/68747470733a2f2f692e696d6775722e636f6d2f614342626a4b782e706e67" 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/b0fa5e7668b4b750677fd0e5d7b66bab148ac2e01b9d3d0fa4197314cf15c3ff/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/25f853007a96bcbe9d36ef990d7ace8dcc07fcd82f9b93fa55ad360cd074bb1f/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 width="868" 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" 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/vic_makes_ai/preline-ui-gowebly-cli--2928</link>
      <guid>https://dev.to/vic_makes_ai/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://assets.dev.to/assets/github-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/4b6c3cdcc63f56a8db36908a0641e4a61b07e21bd3fcf1acccefde27a3ce2889/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/116cd3c9d3ed2ba6944986660d2a2abb7a8fd2d3576affb7bfd25a1db1039c2e/68747470733a2f2f7072656c696e652e636f2f7072656c696e652d6c6f676f2e737667" alt="Preline UI logo" width="200" height="auto"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Preline UI is an open-source Tailwind CSS UI component library for building modern websites and apps. It includes UI blocks, templates, plugins, a Figma design system, and more.&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/fdf2982b9f5d7489dcf44570e714e3a15fce6253e0cc6b5aa61a075aac2ff71b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d79656c6c6f772e737667" alt="License: MIT"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;✨ About Preline&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Preline helps teams build modern websites and web apps faster with reusable &lt;a href="https://preline.co/docs/" rel="nofollow noopener noreferrer"&gt;Tailwind CSS components&lt;/a&gt;, interactive &lt;a href="https://preline.co/plugins/" rel="nofollow noopener noreferrer"&gt;headless Tailwind CSS plugins&lt;/a&gt;, &lt;a href="https://preline.co/templates/" rel="nofollow noopener noreferrer"&gt;Tailwind CSS templates&lt;/a&gt;, and production-ready &lt;a href="https://preline.co/blocks/" rel="nofollow noopener noreferrer"&gt;Tailwind CSS examples&lt;/a&gt;. It is designed for developers who want flexible markup, scalable design systems, and polished UI patterns without rebuilding everything from scratch.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://preline.co/blocks/" rel="nofollow noopener noreferrer"&gt;204 free Tailwind CSS blocks and sections&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://preline.co/templates/" rel="nofollow noopener noreferrer"&gt;5 free Tailwind CSS templates&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://preline.co/plugins/" rel="nofollow noopener noreferrer"&gt;27 headless Tailwind CSS plugins&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://preline.co/docs/" rel="nofollow noopener noreferrer"&gt;Full documentation&lt;/a&gt;, &lt;a href="https://preline.co/figma/" rel="nofollow noopener noreferrer"&gt;Figma&lt;/a&gt;, &lt;a href="https://preline.co/docs/themes.html" rel="nofollow noopener noreferrer"&gt;themes&lt;/a&gt;, and &lt;a href="https://preline.co/docs/agent-skills.html" rel="nofollow noopener noreferrer"&gt;agent skills&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;⚡ Getting Started&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Start with any working &lt;a href="https://tailwindcss.com/" rel="nofollow noopener noreferrer"&gt;Tailwind CSS&lt;/a&gt; project and make sure &lt;a href="https://nodejs.org/en/" rel="nofollow noopener noreferrer"&gt;Node.js&lt;/a&gt; and &lt;a href="https://www.npmjs.com/" rel="nofollow noopener noreferrer"&gt;npm&lt;/a&gt; are installed.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Install via npm&lt;/h3&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Install &lt;code&gt;preline&lt;/code&gt;:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;npm i preline&lt;/pre&gt;

&lt;/div&gt;
&lt;ol start="2"&gt;
&lt;li&gt;Import the Preline CSS variants file into your Tailwind CSS file after…&lt;/li&gt;
&lt;/ol&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="481"&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 width="868" 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" 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/vic_makes_ai/my-top-3-go-packages-that-i-wish-id-known-about-earlier-3j10</link>
      <guid>https://dev.to/vic_makes_ai/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://assets.dev.to/assets/github-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://assets.dev.to/assets/github-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 caching library 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="448"&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://assets.dev.to/assets/github-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 width="868" 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" 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/vic_makes_ai/the-gowebly-cli-has-grown-to-v200-d1c</link>
      <guid>https://dev.to/vic_makes_ai/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://assets.dev.to/assets/github-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/8333505af626fc01d485a6d927dd831d5f28f2fe87f36358d77de097a514e9d2/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f476f2d312e32362b2d3030414444383f7374796c653d666f722d7468652d6261646765266c6f676f3d676f" 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/113868bf8bb961c9dfb3d376594eaa7b4f87eddc63b441432edaca39a9ab67a2/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/7a2e34fda59715f6b95aed21da2c086f2f090fa0e0dc44d5e21e9bb443c469bf/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4170616368655f322e302d7265643f7374796c653d666f722d7468652d6261646765266c6f676f3d6e6f6e65" alt="License"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;↘&amp;nbsp;&amp;nbsp;The official Gowebly CLI documentation&amp;nbsp;&amp;nbsp;↙&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;↘&amp;nbsp;&amp;nbsp;Share the project's link to your friends&amp;nbsp;&amp;nbsp;↙&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/5709db0b4083137fd6075da046691e5683d8b9650f9e2f84e8f95b472e5728f0/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/af39bf6492f5a021184260c809232e2c50f5736fa4456f118369484766de8d51/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/8282e0e7e86e9d61af49c3bcc495b11f5f6f9a9e87bd0813ec7aa93b1519af6a/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/c4724b105eb3099bf6fc60c0e1fcbb87dcb0ded247a46d24e9ab21f822da0159/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 width="868" 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" 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/vic_makes_ai/big-frontend-update-the-gowebly-cli-now-supports-bootstrap-and-bulma-1c45</link>
      <guid>https://dev.to/vic_makes_ai/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://assets.dev.to/assets/github-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://assets.dev.to/assets/github-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 width="868" 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" 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/vic_makes_ai/frontend-update-the-gowebly-cli-now-supports-daisyui-components-library-3dmn</link>
      <guid>https://dev.to/vic_makes_ai/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://assets.dev.to/assets/github-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="512"&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 width="868" 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" 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/vic_makes_ai/big-update-the-gowebly-cli-now-supports-templ-3gog</link>
      <guid>https://dev.to/vic_makes_ai/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://assets.dev.to/assets/github-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
│&amp;nbsp;&amp;nbsp; └── styles.css
├── static
│&amp;nbsp;&amp;nbsp; ├── favicons
│&amp;nbsp;&amp;nbsp; │&amp;nbsp;&amp;nbsp; ├── apple-touch-icon.png
│&amp;nbsp;&amp;nbsp; │&amp;nbsp;&amp;nbsp; ├── favicon.ico
│&amp;nbsp;&amp;nbsp; │&amp;nbsp;&amp;nbsp; ├── favicon.png
│&amp;nbsp;&amp;nbsp; │&amp;nbsp;&amp;nbsp; ├── favicon.svg
│&amp;nbsp;&amp;nbsp; │&amp;nbsp;&amp;nbsp; ├── manifest-desktop-screenshot.jpeg
│&amp;nbsp;&amp;nbsp; │&amp;nbsp;&amp;nbsp; ├── manifest-mobile-screenshot.jpeg
│&amp;nbsp;&amp;nbsp; │&amp;nbsp;&amp;nbsp; └── manifest-touch-icon.svg
│&amp;nbsp;&amp;nbsp; ├── images
│&amp;nbsp;&amp;nbsp; │&amp;nbsp;&amp;nbsp; └── logo.svg
│&amp;nbsp;&amp;nbsp; ├── htmx.min.js
│&amp;nbsp;&amp;nbsp; ├── hyperscript.min.js
│&amp;nbsp;&amp;nbsp; ├── manifest.json
│&amp;nbsp;&amp;nbsp; └── styles.css
├── templates
│&amp;nbsp;&amp;nbsp; ├── pages
&lt;span class="gd"&gt;-&amp;nbsp;&amp;nbsp; │&amp;nbsp;&amp;nbsp; ├── index.html
&lt;/span&gt;&lt;span class="gi"&gt;+&amp;nbsp;&amp;nbsp; │&amp;nbsp;&amp;nbsp; ├── index.templ
+&amp;nbsp;&amp;nbsp; │&amp;nbsp;&amp;nbsp; └── index_templ.go
&lt;/span&gt;&lt;span class="gd"&gt;-&amp;nbsp;&amp;nbsp; ├── main.html
&lt;/span&gt;&lt;span class="gi"&gt;+&amp;nbsp;&amp;nbsp; ├── main.templ
+&amp;nbsp;&amp;nbsp; └── 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 width="868" 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" 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>
  </channel>
</rss>
