<?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: Akira Hayashi (rin)</title>
    <description>The latest articles on DEV Community by Akira Hayashi (rin) (@rindrics).</description>
    <link>https://dev.to/rindrics</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2563301%2F8c5fd0dd-d079-4be3-9f73-8c6ed4dca9de.png</url>
      <title>DEV Community: Akira Hayashi (rin)</title>
      <link>https://dev.to/rindrics</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rindrics"/>
    <language>en</language>
    <item>
      <title>Building a GitHub Action for Recurring Project Items</title>
      <dc:creator>Akira Hayashi (rin)</dc:creator>
      <pubDate>Sun, 09 Nov 2025 17:32:51 +0000</pubDate>
      <link>https://dev.to/rindrics/building-a-github-action-for-recurring-project-items-ba</link>
      <guid>https://dev.to/rindrics/building-a-github-action-for-recurring-project-items-ba</guid>
      <description>&lt;p&gt;Quick notes on building an automation tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;GitHub Action "&lt;a href="https://github.com/marketplace/actions/recurring-backlog-item-creator" rel="noopener noreferrer"&gt;recurring-backlog-item-creator&lt;/a&gt;"&lt;/p&gt;

&lt;p&gt;The YAML config tells the whole story:&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;defaults&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;project_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;PVT_kwHOAOKHl84BHgin"&lt;/span&gt;
  &lt;span class="na"&gt;target_repo&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Rindrics/recurring-backlog-item-creator"&lt;/span&gt;
&lt;span class="na"&gt;issues&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Wash&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;My&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Cat"&lt;/span&gt;
    &lt;span class="na"&gt;template_file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;.github/ISSUE_TEMPLATE/wash_my_cat.md"&lt;/span&gt;
    &lt;span class="na"&gt;creation_months&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;3&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;5&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;7&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;9&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;title_suffix&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{YearMonth}}"&lt;/span&gt;
    &lt;span class="na"&gt;fields&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;Priority&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;P1"&lt;/span&gt;
      &lt;span class="na"&gt;Status&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Ready"&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Buy&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;New&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Shoes"&lt;/span&gt;
    &lt;span class="na"&gt;template_file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;.github/ISSUE_TEMPLATE/buy_shoes.md"&lt;/span&gt;
    &lt;span class="na"&gt;title_prefix&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[{{Year}}]"&lt;/span&gt;
    &lt;span class="na"&gt;title_suffix&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;({{Month}})"&lt;/span&gt;
    &lt;span class="na"&gt;creation_months&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;3&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;11&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;12&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;fields&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;Priority&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;P2"&lt;/span&gt;
      &lt;span class="na"&gt;Status&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Backlog"&lt;/span&gt;
    &lt;span class="na"&gt;project_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;PVT_XXXXX"&lt;/span&gt;  &lt;span class="c1"&gt;# you can override the default project_id&lt;/span&gt;
    &lt;span class="na"&gt;target_repo&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Rindrics/other-repo"&lt;/span&gt;  &lt;span class="c1"&gt;# you can override the default target_repo&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The link below will also helpful to understand this action:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;execution result (GitHub project board): &lt;a href="https://github.com/users/Rindrics/projects/41" rel="noopener noreferrer"&gt;https://github.com/users/Rindrics/projects/41&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;user workflow example: &lt;a href="https://github.com/Rindrics/recurring-backlog-item-creator/blob/main/.github/workflows/test-workflow.yml" rel="noopener noreferrer"&gt;https://github.com/Rindrics/recurring-backlog-item-creator/blob/main/.github/workflows/test-workflow.yml&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Background and Reflection
&lt;/h2&gt;

&lt;p&gt;Creating issues periodically from templates is a common use case.&lt;br&gt;
However, GitHub's existing features become cumbersome when you need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Different creation intervals for each issue&lt;/li&gt;
&lt;li&gt;Dynamic prefixes/suffixes like &lt;code&gt;[yyyy-MM]&lt;/code&gt; in titles&lt;/li&gt;
&lt;li&gt;Adding issues to projects while setting custom field values&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For these requirements, &lt;a href="https://github.com/Rindrics/recurring-backlog-item-creator/blob/main/config-template.yml" rel="noopener noreferrer"&gt;a config file like this&lt;/a&gt; solves the problem.&lt;/p&gt;

&lt;p&gt;In this action, the core functionality became filtering and validation of the config file&lt;br&gt;
because GitHub GraphQL API enables easy issue creation and project registration.&lt;/p&gt;

&lt;p&gt;So I built &lt;a href="https://github.com/Rindrics/recurring-backlog-item-creator/tree/main/gh-issue-config-filter" rel="noopener noreferrer"&gt;a tool focused on filtering and validation&lt;/a&gt;, implemented in Go.&lt;/p&gt;
&lt;h3&gt;
  
  
  What Went Well
&lt;/h3&gt;

&lt;p&gt;Validation ensures the action fails if you specify non-existent fields or values in the target project.&lt;br&gt;
This makes it safe to use with confidence.&lt;/p&gt;

&lt;p&gt;The config file being self-documenting is also a subtle advantage --- you can see what it does at a glance.&lt;/p&gt;

&lt;p&gt;Also, &lt;a href="https://github.com/Songmu/tagpr" rel="noopener noreferrer"&gt;tagpr&lt;/a&gt; - thank you as always!&lt;/p&gt;
&lt;h3&gt;
  
  
  What Could Be Better
&lt;/h3&gt;

&lt;p&gt;I initially organized the code by role within a single &lt;code&gt;main&lt;/code&gt; package, thinking it wouldn't grow much.&lt;br&gt;
Even at this scale, changes scattered across multiple files made it somewhat difficult to work with.&lt;/p&gt;

&lt;p&gt;To improve cohesion, I only know approaches like port-adapter architecture, which feels like overkill for a tool of this size.&lt;br&gt;
I still don't have a good intuition for the right balance.&lt;/p&gt;

&lt;p&gt;The downsides of a single-package structure were minimal.&lt;br&gt;
The simplicity seemed to outweigh any drawbacks.&lt;/p&gt;
&lt;h3&gt;
  
  
  Where I Got Stuck
&lt;/h3&gt;

&lt;p&gt;Accessing user GitHub projects requires a PAT...!&lt;/p&gt;

&lt;p&gt;Until I realized this, I was using a GitHub App token with &lt;code&gt;Project.write&lt;/code&gt; repository permission.&lt;br&gt;
This permission likely belongs to the deprecated projects (classic) feature&lt;sup id="fnref1"&gt;1&lt;/sup&gt;, and I burned about 3 hours on this...&lt;/p&gt;
&lt;h2&gt;
  
  
  Future Plans
&lt;/h2&gt;

&lt;p&gt;At &lt;code&gt;v1.0&lt;/code&gt;, the filter condition is "month" only, but it could be extended to support "year," "day," and "day of week."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt; &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Wash&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;My&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Cat"&lt;/span&gt;
    &lt;span class="na"&gt;template_file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;.github/ISSUE_TEMPLATE/wash_my_cat.md"&lt;/span&gt;
    &lt;span class="na"&gt;creation_months&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;3&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;5&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;7&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;9&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;11&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;creation_day&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;10&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;20&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;30&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;creation_day_of_week&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Mon"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With this config, issues would be created on odd-numbered months, on days ending in 0, if they fall on Monday.&lt;br&gt;
For such granular conditions, you'd probably set the cron to run daily.&lt;/p&gt;




&lt;ol&gt;

&lt;li id="fn1"&gt;
&lt;p&gt;Probably. Reading &lt;a href="https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens#creating-a-fine-grained-personal-access-token" rel="noopener noreferrer"&gt;here&lt;/a&gt; and &lt;a href="https://docs.github.com/en/rest/projects/projects?apiVersion=2022-11-28#get-project-for-user" rel="noopener noreferrer"&gt;here&lt;/a&gt; suggests so. ↩&lt;/p&gt;
&lt;/li&gt;

&lt;/ol&gt;

</description>
      <category>githubactions</category>
      <category>backlog</category>
      <category>automation</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Think Like a Detective: Why Hypothesis Testing Beats Raw Coding Skills</title>
      <dc:creator>Akira Hayashi (rin)</dc:creator>
      <pubDate>Mon, 17 Feb 2025 15:34:30 +0000</pubDate>
      <link>https://dev.to/rindrics/think-like-a-detective-why-hypothesis-testing-beats-raw-coding-skills-28bf</link>
      <guid>https://dev.to/rindrics/think-like-a-detective-why-hypothesis-testing-beats-raw-coding-skills-28bf</guid>
      <description>&lt;p&gt;Your code isn't working... what do you do?&lt;br&gt;
You might think, "I need to improve my coding skills... what books should I read?"&lt;br&gt;
However, what you actually need is a problem-solving approach, particularly hypothesis testing thinking.&lt;/p&gt;

&lt;h2&gt;
  
  
  Coding Skills are Secondary
&lt;/h2&gt;

&lt;p&gt;Writing programs requires two main abilities:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Coding skills: writing code that follows proper syntax and function usage&lt;/li&gt;
&lt;li&gt;Problem-solving ability: constructing logical pathways to solve the problems at hand&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For programming beginners, coding feels very much like "real programming," making it the most visible target for improvement.&lt;br&gt;
This often leads newcomers to attribute their problems to insufficient coding skills ── but here lies a major pitfall.&lt;/p&gt;

&lt;p&gt;While coding ability is related to "knowledge volume," the programming world is so vast and deep that you'll rarely feel you have sufficient knowledge for the task at hand.&lt;br&gt;
Problem-solving ability, on the other hand, lets you acquire necessary knowledge on the spot and move forward, even when your knowledge is incomplete.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Mistakes Beginners Make When Facing Errors
&lt;/h2&gt;

&lt;p&gt;From my experience working with programming beginners, here are the most common patterns I've observed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pattern 1: Not noticing upstream errors and getting stuck on downstream issues 😢&lt;/li&gt;
&lt;li&gt;Pattern 2: Complete mental shutdown at the sight of an error without reading the message 😢&lt;/li&gt;
&lt;li&gt;Pattern 3: "Imagining" the problem based on a few keywords in the error message and making changes based on that imagination 😢&lt;/li&gt;
&lt;li&gt;Pattern 4: Understanding the error message but attempting fixes without identifying the root cause 😢&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are arranged from most to least problematic, not by frequency.&lt;br&gt;
Pattern 1 is the worst but relatively rare.&lt;/p&gt;

&lt;p&gt;Pattern 2 is common among absolute beginners and usually evolves into Pattern 3 with experience.&lt;br&gt;
Both can be addressed by "reading the error message carefully," but it often takes time for beginners to realize that error messages are allies, not enemies, in problem-solving.&lt;/p&gt;

&lt;p&gt;Pattern 3 might occasionally lead to successful fixes by trial and error, but it's important to recognize these as lucky accidents rather than proper problem-solving.&lt;/p&gt;

&lt;p&gt;Pattern 4 might seem reasonable and often works, but skipping root cause analysis can lead to deep trouble in complex situations. Even experienced programmers sometimes fall into this pattern.&lt;/p&gt;

&lt;h2&gt;
  
  
  Basic Steps of Problem Solving
&lt;/h2&gt;

&lt;p&gt;Here's the systematic approach to solving any programming problem:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Problem Identification ✅

&lt;ul&gt;
&lt;li&gt;Verify the current state of the system and environment&lt;/li&gt;
&lt;li&gt;Clearly define what's going wrong&lt;/li&gt;
&lt;li&gt;Sometimes includes hypothesis testing to confirm problem identification&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Hypothesis Formation ✅

&lt;ul&gt;
&lt;li&gt;Theorize what changes might solve the problem&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Hypothesis Testing ✅

&lt;ul&gt;
&lt;li&gt;Verify if the changes actually solved the problem&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;While some steps might be abbreviated depending on the situation, this is the fundamental flow to follow.&lt;/p&gt;

&lt;p&gt;When unexpected results occur, even in seemingly simple problems, it's worth returning to earlier steps for careful verification.&lt;/p&gt;

&lt;p&gt;If your hypothesis in step 2 proves wrong, that's not a failure: it's progress!&lt;br&gt;
You've eliminated one possibility and gained knowledge for forming your next hypothesis.&lt;/p&gt;

&lt;h2&gt;
  
  
  Thought Experiment: Would Outsourcing the Coding Help?
&lt;/h2&gt;

&lt;p&gt;Consider this: what if you could delegate all coding to a super-programmer?&lt;br&gt;
Even with technical implementation concerns removed, without problem-solving skills, you couldn't even specify what needs to be investigated to understand the current situation.&lt;/p&gt;

&lt;p&gt;You might be able to request code changes directly (bad "Pattern 4"), but without proper problem analysis, these requests could be completely off-target.&lt;br&gt;
Superior coding ability alone doesn't help here.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The most crucial element in programming problem-solving isn't technical coding ability: it's the capacity to systematically understand problems and test hypotheses.&lt;/p&gt;

&lt;p&gt;This skill extends far beyond programming ── it's vital for any professional work, and arguably, for steering your own life course.&lt;br&gt;
But you probably knew that already 👍&lt;/p&gt;

</description>
      <category>programming</category>
      <category>debug</category>
      <category>thinking</category>
      <category>coding</category>
    </item>
    <item>
      <title>Lightweight, Transparent, Animated: Get All of Them by WebP Format</title>
      <dc:creator>Akira Hayashi (rin)</dc:creator>
      <pubDate>Mon, 16 Dec 2024 17:21:46 +0000</pubDate>
      <link>https://dev.to/rindrics/lightweight-transparent-animated-get-all-of-them-by-webp-format-58c6</link>
      <guid>https://dev.to/rindrics/lightweight-transparent-animated-get-all-of-them-by-webp-format-58c6</guid>
      <description>&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;Image optimization remains one of the most effective strategies for web performance optimization. WebP, developed by Google as a successor to JPEG and PNG, is an innovative image format that significantly reduces file size while maintaining visual quality. Let's dive into why you might want to consider WebP for your next project.&lt;/p&gt;

&lt;h1&gt;
  
  
  What is WebP?
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;WebP is an image file format based on the Resource Interchange File Format (RIFF) that supports lossless and lossy compression as well as alpha (transparency) and animation. ────RFC 9649&lt;sup id="fnref1"&gt;1&lt;/sup&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Developed by Google in 2010&lt;sup id="fnref2"&gt;2&lt;/sup&gt;, it's designed to deliver superior compression for images on the web.&lt;br&gt;
Here's what makes it special:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Supports both lossless and lossy compression&lt;/li&gt;
&lt;li&gt;Handles alpha channel transparency&lt;/li&gt;
&lt;li&gt;Supports animation sequences&lt;/li&gt;
&lt;li&gt;Delivers superior compression (25-34% smaller files compared to JPEG on average)&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;
  
  
  Real-world Benefits
&lt;/h1&gt;
&lt;h2&gt;
  
  
  1. Performance Boost
&lt;/h2&gt;

&lt;p&gt;While we often focus on code optimization, images typically constitute the largest portion of a web page's total size.&lt;br&gt;
WebP addresses this directly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Faster page load times&lt;/li&gt;
&lt;li&gt;Reduced bandwidth consumption&lt;/li&gt;
&lt;li&gt;Lower data usage for mobile users (your users will thank you!)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  2. Quality-Size Sweet Spot
&lt;/h2&gt;

&lt;p&gt;One of WebP's most impressive features is its ability to maintain high image quality while significantly reducing file size:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Delivers equal or better quality than JPEG at smaller sizes&lt;/li&gt;
&lt;li&gt;Works well for both photographs and illustrations&lt;/li&gt;
&lt;li&gt;Particularly effective for large, high-quality images&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  3. Format Consolidation
&lt;/h2&gt;

&lt;p&gt;WebP can potentially replace multiple legacy formats:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Combines the best of PNG (transparency) and JPEG (photo compression)&lt;/li&gt;
&lt;li&gt;Can replace animated GIFs with much smaller file sizes&lt;/li&gt;
&lt;li&gt;Reduces complexity in image management workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Considering these benefits, WebP is particularly valuable for&lt;br&gt;
situations below:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;E-commerce sites with numerous product images&lt;/li&gt;
&lt;li&gt;Global web applications where bandwidth varies&lt;/li&gt;
&lt;li&gt;Content-heavy sites with significant image usage&lt;/li&gt;
&lt;li&gt;Mobile-first applications&lt;/li&gt;
&lt;li&gt;Performance-critical web applications&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;
  
  
  Example Usage on Command Line
&lt;/h1&gt;

&lt;p&gt;The cwebp command makes it easy to perform the conversion to &lt;code&gt;.webp&lt;/code&gt; format as follows&lt;sup id="fnref3"&gt;3&lt;/sup&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Lossy conversion with quality maintained at 80%&lt;/span&gt;
cwebp input.jpg &lt;span class="nt"&gt;-q&lt;/span&gt; 80 &lt;span class="nt"&gt;-o&lt;/span&gt; output.webp

&lt;span class="c"&gt;# Lossless conversion (best for screenshots/diagrams)&lt;/span&gt;
cwebp input.png &lt;span class="nt"&gt;-lossless&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; output.webp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Adoption Challenges
&lt;/h1&gt;

&lt;p&gt;Despite its benefits, WebP hasn't achieved universal adoption yet. There may be the possible reasons:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Browser Support Evolution&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;While major modern browsers now support WebP, ~legacy browser~ IE support requires fallback images&lt;sup id="fnref4"&gt;4&lt;/sup&gt;
&lt;/li&gt;
&lt;li&gt;Safari (iOS) only added support in 2020&lt;/li&gt;
&lt;li&gt;Some older enterprise systems may still use incompatible browsers&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Awareness Gap&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Many developers still default to familiar formats like JPEG and PNG (I didn't know either 🫣)&lt;/li&gt;
&lt;li&gt;Limited support in popular image editing software&lt;/li&gt;
&lt;li&gt;Learning curve for implementation and tooling&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Implementation Overhead&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Requires converting existing image assets&lt;/li&gt;
&lt;li&gt;Need to set up build processes for automatic conversion&lt;/li&gt;
&lt;li&gt;Additional complexity in serving fallback images&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  Moving Forward: Implementation Strategy
&lt;/h1&gt;

&lt;p&gt;Ready to implement WebP? Here's a practical approach:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Start with New Projects&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Implement WebP in new projects where you have full control&lt;/li&gt;
&lt;li&gt;Set up automated conversion in your build pipeline&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Gradual Migration for Existing Projects&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Begin with high-impact images (large, frequently accessed)&lt;/li&gt;
&lt;li&gt;Use progressive enhancement with fallbacks&lt;/li&gt;
&lt;li&gt;Monitor bandwidth savings and user experience metrics&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;WebP represents a significant step forward in web image optimization. With broad browser support now available and clear performance benefits, it's becoming an increasingly attractive option for modern web development.&lt;/p&gt;

&lt;p&gt;As web performance continues to impact user experience and SEO rankings, adopting WebP can give your applications a competitive edge. The initial setup effort is justified by the long-term benefits in performance and user experience.&lt;/p&gt;




&lt;ol&gt;

&lt;li id="fn1"&gt;
&lt;p&gt;&lt;a href="https://datatracker.ietf.org/doc/rfc9649/" rel="noopener noreferrer"&gt;RFC9649&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn2"&gt;
&lt;p&gt;Today, this information can only be accessed by using &lt;a href="https://web.archive.org/web/20101004134848/http://code.google.com/intl/no/speed/webp/docs/c_study.html" rel="noopener noreferrer"&gt;a web archive&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn3"&gt;
&lt;p&gt;&lt;a href="https://developers.google.com/speed/webp/docs/using" rel="noopener noreferrer"&gt;Document by Google&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;

&lt;li id="fn4"&gt;
&lt;p&gt;&lt;a href="https://caniuse.com/?search=webp" rel="noopener noreferrer"&gt;Browser support&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;

&lt;/ol&gt;

</description>
      <category>webperf</category>
      <category>extensions</category>
      <category>image</category>
      <category>compression</category>
    </item>
  </channel>
</rss>
