<?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: Luu Vinh Loc</title>
    <description>The latest articles on DEV Community by Luu Vinh Loc (@loclv).</description>
    <link>https://dev.to/loclv</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%2F442163%2Ff9920cfc-5e1b-4e89-a856-971d508dc73c.jpeg</url>
      <title>DEV Community: Luu Vinh Loc</title>
      <link>https://dev.to/loclv</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/loclv"/>
    <language>en</language>
    <item>
      <title>Use the latest version of Node.js with fnm</title>
      <dc:creator>Luu Vinh Loc</dc:creator>
      <pubDate>Sun, 08 Mar 2026 12:46:29 +0000</pubDate>
      <link>https://dev.to/loclv/to-use-the-latest-version-of-nodejs-with-fnm-36o5</link>
      <guid>https://dev.to/loclv/to-use-the-latest-version-of-nodejs-with-fnm-36o5</guid>
      <description>&lt;p&gt;To install the latest Node.js version using fnm (Fast Node Manager) - &lt;a href="https://github.com/Schniz/fnm" rel="noopener noreferrer"&gt;https://github.com/Schniz/fnm&lt;/a&gt;, use the command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;fnm &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;span class="c"&gt;# fnm 1.39.0&lt;/span&gt;

&lt;span class="c"&gt;# install latest version&lt;/span&gt;
fnm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--latest&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For example, output is "Installing Node v25.8.0 (arm64)...".&lt;br&gt;
Switch to version: &lt;code&gt;fnm use &amp;lt;version&amp;gt;&lt;/code&gt;.&lt;br&gt;
Set default: &lt;code&gt;fnm default &amp;lt;version&amp;gt;&lt;/code&gt;.&lt;/p&gt;

</description>
      <category>fnm</category>
      <category>node</category>
    </item>
    <item>
      <title>sync-skills.sh - Bash script to sync .agents/skills/ to all agent folders</title>
      <dc:creator>Luu Vinh Loc</dc:creator>
      <pubDate>Thu, 05 Mar 2026 16:23:06 +0000</pubDate>
      <link>https://dev.to/loclv/sync-skillssh-bash-script-to-sync-agentsskills-to-all-agent-folders-1np1</link>
      <guid>https://dev.to/loclv/sync-skillssh-bash-script-to-sync-agentsskills-to-all-agent-folders-1np1</guid>
      <description>&lt;p&gt;scripts/sync-skills.sh - Bash script to sync &lt;code&gt;.agents/skills/&lt;/code&gt; to all agent folders. Skills are stored in &lt;code&gt;.agents/skills/&lt;/code&gt; and synced to all agent folders (&lt;code&gt;.agent/&lt;/code&gt;, &lt;code&gt;.claude/&lt;/code&gt;, &lt;code&gt;.windsurf/&lt;/code&gt;, etc.).&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;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;# Sync skills from .agents/skills to all agent folders&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=== Start syncing skills... ==="&lt;/span&gt;

&lt;span class="nv"&gt;AGENTS&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;&lt;span class="s2"&gt;"agent"&lt;/span&gt; &lt;span class="s2"&gt;"claude"&lt;/span&gt; &lt;span class="s2"&gt;"codex"&lt;/span&gt; &lt;span class="s2"&gt;"cursor"&lt;/span&gt; &lt;span class="s2"&gt;"gemini"&lt;/span&gt; &lt;span class="s2"&gt;"opencode"&lt;/span&gt; &lt;span class="s2"&gt;"qwen"&lt;/span&gt; &lt;span class="s2"&gt;"windsurf"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="nb"&gt;dir &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;AGENTS&lt;/span&gt;&lt;span class="p"&gt;[@]&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"- Syncing .agents/skills/ -&amp;gt; .&lt;/span&gt;&lt;span class="nv"&gt;$dir&lt;/span&gt;&lt;span class="s2"&gt;/skills/"&lt;/span&gt;
  rsync &lt;span class="nt"&gt;-av&lt;/span&gt; &lt;span class="nt"&gt;--delete&lt;/span&gt; .agents/skills/ &lt;span class="s2"&gt;".&lt;/span&gt;&lt;span class="nv"&gt;$dir&lt;/span&gt;&lt;span class="s2"&gt;/skills/"&lt;/span&gt;
&lt;span class="k"&gt;done

&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"✅ Sync skills complete!"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To sync skills after adding/updating SKILL files:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bash scripts/sync-skills.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>ai</category>
      <category>skill</category>
      <category>bash</category>
    </item>
    <item>
      <title>Introducing llm-lean-log: Token-Efficient Chat Logging for AI Agents</title>
      <dc:creator>Luu Vinh Loc</dc:creator>
      <pubDate>Wed, 04 Mar 2026 16:29:58 +0000</pubDate>
      <link>https://dev.to/loclv/introducing-llm-lean-log-token-efficient-chat-logging-for-ai-agents-neh</link>
      <guid>https://dev.to/loclv/introducing-llm-lean-log-token-efficient-chat-logging-for-ai-agents-neh</guid>
      <description>&lt;p&gt;If you've ever worked with AI coding agents like Cursor, Windsurf, Claude Code, or OpenCode, you know how quickly conversations pile up. After weeks or months of back-and-forth with an AI assistant, you end up with thousands of lines of chat history—and trying to find that one solution from three weeks ago becomes a nightmare.&lt;/p&gt;

&lt;p&gt;That's exactly the problem llm-lean-log was built to solve.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem with Current Approaches
&lt;/h2&gt;

&lt;p&gt;Let me paint a familiar picture: You've been working on a project with an AI coding assistant for months. You've got hundreds of sessions logged, each containing problem descriptions, solutions, code changes, and explanations. Now you need to find that one bug fix from back when you were working on authentication.&lt;/p&gt;

&lt;p&gt;What are your options?&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Scroll through endless chat history - Painfully slow, and good luck finding the right context&lt;/li&gt;
&lt;li&gt;Search the entire conversation - Works sometimes, but you're still wading through irrelevant messages&lt;/li&gt;
&lt;li&gt;Export to Markdown/JSON - Creates massive files that cost a fortune in tokens when you feed them back to the AI&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The core issue? Most logging tools were designed for humans to read, not for AI agents to process is great efficiently. Markdown for people but not good for token budgets. JSON is machine-readable but equally bloated.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enter llm-lean-log
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;llm-lean-log&lt;/code&gt; takes a fundamentally different approach. Instead of logging everything, it captures only what matters—in a format that's optimized for both storage and AI consumption.&lt;/p&gt;

&lt;p&gt;Github: &lt;a href="https://github.com/loclv/llm-lean-log" rel="noopener noreferrer"&gt;https://github.com/loclv/llm-lean-log&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The Secret Sauce: CSV with Cause-Effect Relationships
&lt;/h3&gt;

&lt;p&gt;The key insight behind llm-lean-log is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;structured tabular data is more token-efficient than free-form text&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here's what a typical log entry looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;id,name,tags,problem,solution,action,files,tech-stack,causeIds,created-at
auth-error-001,API Authentication Error,"error,api,auth",Users unable to login due to JWT token expiration,Added token refresh logic with refresh endpoint,"Updated auth.ts middleware and added refresh endpoint","src/middleware/auth.ts","typescript,express,jwt",,2026-01-13T14:52:58Z
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each field is intentional:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;id - Unique identifier for linking cause-effect relationships&lt;/li&gt;
&lt;li&gt;name - Short summary (what happened)&lt;/li&gt;
&lt;li&gt;tags - Categorization for filtering&lt;/li&gt;
&lt;li&gt;problem - What went wrong&lt;/li&gt;
&lt;li&gt;solution - How it was fixed&lt;/li&gt;
&lt;li&gt;action - Commands or steps taken&lt;/li&gt;
&lt;li&gt;files - What was modified&lt;/li&gt;
&lt;li&gt;tech-stack - Technologies involved&lt;/li&gt;
&lt;li&gt;causeIds/effectIds - Link to related logs (this is the game-changer!)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Cause-Effect Graph
&lt;/h3&gt;

&lt;p&gt;The most powerful feature is the ability to link logs together. Each entry can reference &lt;code&gt;causeIds&lt;/code&gt; (what led to this problem) and &lt;code&gt;effectIds&lt;/code&gt; (what resulted from it). This creates a directed graph of your project history—perfect for understanding the context behind any change.&lt;/p&gt;

&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;h3&gt;
  
  
  For AI Agents
&lt;/h3&gt;

&lt;p&gt;The workflow is designed to be seamless for AI agents:&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;# Save a log entry&lt;/span&gt;
l-log add ./logs/chat.csv &lt;span class="s2"&gt;"Fix JWT token expiration"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--tags&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"bug,auth,security"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--problem&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Users getting logged out randomly"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--solution&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Implemented token refresh with exponential backoff"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--files&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"src/middleware/auth.ts"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--tech-stack&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"typescript,express,jwt"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Retrieve the last entry (efficient for AI)&lt;/span&gt;
l-log view ./logs/chat.csv &lt;span class="nt"&gt;--last&lt;/span&gt;

&lt;span class="c"&gt;# Search across all logs&lt;/span&gt;
l-log search ./logs/chat.csv &lt;span class="s2"&gt;"authentication"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  For Humans
&lt;/h3&gt;

&lt;p&gt;When you need to actually read the logs, there's a beautiful CLI and web visualizer:&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;# Human-friendly output with colors&lt;/span&gt;
l-log list ./logs/chat.csv &lt;span class="nt"&gt;--human&lt;/span&gt;

&lt;span class="c"&gt;# Web-based graph visualization&lt;/span&gt;
l-log-vis ./logs/chat.csv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;h3&gt;
  
  
  Token Efficiency
&lt;/h3&gt;

&lt;p&gt;The same information in llm-lean-log CSV format? Often much less. That means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Faster AI responses&lt;/li&gt;
&lt;li&gt;Lower API costs&lt;/li&gt;
&lt;li&gt;More context window for actual problem-solving&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Local-First
&lt;/h3&gt;

&lt;p&gt;Your logs live in your project, not in some cloud service. No vendor lock-in, full control over your data.&lt;/p&gt;

&lt;h3&gt;
  
  
  Built for AI Agents
&lt;/h3&gt;

&lt;p&gt;The tool was designed from the ground up to be used by AI agents. The CLI is simple enough that you can instruct your favorite AI assistant to log its work automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install the CLI&lt;/span&gt;
bun add &lt;span class="nt"&gt;-g&lt;/span&gt; llm-lean-log-cli
&lt;span class="c"&gt;# or with bun enviroment:&lt;/span&gt;
bun add &lt;span class="nt"&gt;-g&lt;/span&gt; bl-log
&lt;span class="c"&gt;# expected: installed bl-log@0.2.11 with binaries:&lt;/span&gt;
&lt;span class="c"&gt;#  - l-log (this means it is ready to use by `l-log` command, not package name)&lt;/span&gt;

&lt;span class="c"&gt;# Add to your agent configuration (example for Cursor/Windsurf)&lt;/span&gt;
&lt;span class="c"&gt;# In your .agent/rules/common.md:&lt;/span&gt;
&lt;span class="c"&gt;# Whenever you finish a task, run:&lt;/span&gt;
&lt;span class="c"&gt;# l-log add ./logs/chat.csv "&amp;lt;Task Name&amp;gt;" --tags="&amp;lt;tags&amp;gt;" --problem="&amp;lt;problem&amp;gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The Bigger Vision
&lt;/h2&gt;

&lt;p&gt;llm-lean-log is more than just a logging tool—it's the beginning of a new way to track software development history. By capturing solutions (not just conversations) in a structured format, you're building a knowledge base that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Helps future AI agents understand your project's evolution&lt;/li&gt;
&lt;li&gt;Makes onboarding to new projects faster&lt;/li&gt;
&lt;li&gt;Creates a searchable archive of solutions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The cause-effect linking is particularly powerful. Imagine being able to ask: "What authentication problems have we had, and what were their downstream effects?" That's now possible with this graph-based approach.&lt;/p&gt;

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

&lt;p&gt;If you're serious about working with AI coding assistants, you need a way to capture and retrieve knowledge efficiently. llm-lean-log provides exactly that—a lean, mean, token-efficient logging machine that plays nicely with both AI agents and human developers.&lt;/p&gt;

&lt;p&gt;Give it a try. Your future self will thank you when you're trying to remember why you made that change six months ago with multiple AI agents (claude, cursor, windsurf, opencode, kilocode, etc.).&lt;/p&gt;




&lt;p&gt;&lt;em&gt;llm-lean-log: Logging for LLMs, but we cut the fat.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>logger</category>
    </item>
    <item>
      <title>ziglint - Static Analysis</title>
      <dc:creator>Luu Vinh Loc</dc:creator>
      <pubDate>Thu, 26 Feb 2026 15:42:40 +0000</pubDate>
      <link>https://dev.to/loclv/ziglint-static-analysis-mik</link>
      <guid>https://dev.to/loclv/ziglint-static-analysis-mik</guid>
      <description>&lt;p&gt;Linter for Zig source code, enforcing coding standards.&lt;/p&gt;

&lt;p&gt;Build and install from source:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone git@github.com:rockorager/ziglint.git
&lt;span class="nb"&gt;cd &lt;/span&gt;ziglint
zig build &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-Doptimize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ReleaseFast &lt;span class="nt"&gt;--prefix&lt;/span&gt; &lt;span class="nv"&gt;$HOME&lt;/span&gt;/.local
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Executable file: &lt;code&gt;ziglint&lt;/code&gt; built at &lt;code&gt;$HOME/.local/bin/ziglint&lt;/code&gt;. So it automatically added to the PATH, which is set in &lt;code&gt;~/.zshrc&lt;/code&gt;. We can run &lt;code&gt;ziglint&lt;/code&gt; directly from the terminal from now on.&lt;/p&gt;

&lt;p&gt;Usage:&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;# lint current directory (uses .ziglint.zon if present)&lt;/span&gt;
ziglint
&lt;span class="c"&gt;# lint specific paths&lt;/span&gt;
ziglint src build.zig
&lt;span class="c"&gt;# suppress specific rule&lt;/span&gt;
ziglint &lt;span class="nt"&gt;--ignore&lt;/span&gt; Z001
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Configuration (&lt;code&gt;.ziglint.zon&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight zig"&gt;&lt;code&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;paths&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s"&gt;"src"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"build.zig"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;rules&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Z001&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;enabled&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Z024&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;max_length&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;80&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;Inline suppression:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight zig"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;MyBadName&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt; &lt;span class="c"&gt;// ziglint-ignore: Z001&lt;/span&gt;

&lt;span class="c"&gt;// ziglint-ignore: Z001&lt;/span&gt;
&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;AnotherBadName&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rules:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Z001: Function names should be camelCase&lt;/li&gt;
&lt;li&gt;Z002: Unused variable that has a value&lt;/li&gt;
&lt;li&gt;Z003: Parse error&lt;/li&gt;
&lt;li&gt;Z004: Prefer &lt;code&gt;const x: T = .{}&lt;/code&gt; over &lt;code&gt;const x = T{}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Z005: Type function names should be PascalCase&lt;/li&gt;
&lt;li&gt;Z006: Variable names should be snake_case&lt;/li&gt;
&lt;li&gt;Z007: Duplicate import&lt;/li&gt;
&lt;li&gt;Z009: Files with top-level fields should be PascalCase&lt;/li&gt;
&lt;li&gt;Z010: Redundant type specifier; prefer &lt;code&gt;.value&lt;/code&gt; over explicit type&lt;/li&gt;
&lt;li&gt;Z011: Deprecated method call&lt;/li&gt;
&lt;li&gt;Z012: Public function exposes private type&lt;/li&gt;
&lt;li&gt;Z013: Unused import&lt;/li&gt;
&lt;li&gt;Z014: Error set names should be PascalCase&lt;/li&gt;
&lt;li&gt;Z015: Public function exposes private error set&lt;/li&gt;
&lt;li&gt;Z016: Split compound assert: &lt;code&gt;assert(a and b)&lt;/code&gt; -&amp;gt; &lt;code&gt;assert(a); assert(b);&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Z017: Redundant try in return: &lt;code&gt;return try expr&lt;/code&gt; -&amp;gt; &lt;code&gt;return expr&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Z018: Redundant &lt;code&gt;@as&lt;/code&gt; when type is already known from context&lt;/li&gt;
&lt;li&gt;Z019: &lt;code&gt;@This()&lt;/code&gt; in named struct; use the type name instead&lt;/li&gt;
&lt;li&gt;Z020: Inline &lt;code&gt;@This()&lt;/code&gt;; assign to a constant first&lt;/li&gt;
&lt;li&gt;Z021: File-struct &lt;code&gt;@This()&lt;/code&gt; alias should match filename&lt;/li&gt;
&lt;li&gt;Z022: &lt;code&gt;@This()&lt;/code&gt; alias in anonymous/local struct should be Self&lt;/li&gt;
&lt;li&gt;Z023: Parameter order: comptime before runtime, pointers before values&lt;/li&gt;
&lt;li&gt;Z024: Line exceeds maximum length (default: 120)&lt;/li&gt;
&lt;li&gt;Z025: Redundant &lt;code&gt;catch&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Z026: Empty catch block suppresses errors&lt;/li&gt;
&lt;li&gt;Z027: Access declaration through type instead of instance&lt;/li&gt;
&lt;li&gt;Z028: Inline &lt;code&gt;@import&lt;/code&gt;; assign to a top-level const&lt;/li&gt;
&lt;li&gt;Z029: Redundant &lt;code&gt;@as&lt;/code&gt; cast; type already known from context&lt;/li&gt;
&lt;li&gt;Z030: &lt;code&gt;deinit&lt;/code&gt; should set &lt;code&gt;self.* = undefined&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Z031: Avoid underscore prefix in identifiers&lt;/li&gt;
&lt;li&gt;Z032: Acronyms should use standard casing&lt;/li&gt;
&lt;li&gt;Z033: Avoid redundant words in identifiers (disabled by default)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;ziglint: &lt;a href="https://github.com/rockorager/ziglint" rel="noopener noreferrer"&gt;https://github.com/rockorager/ziglint&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>zig</category>
      <category>ziglint</category>
    </item>
    <item>
      <title>Write a git diff command result to file to manage the big changes and ignore the lock files</title>
      <dc:creator>Luu Vinh Loc</dc:creator>
      <pubDate>Thu, 26 Feb 2026 15:04:26 +0000</pubDate>
      <link>https://dev.to/loclv/write-a-git-diff-command-result-to-file-to-manage-the-big-changes-and-ignore-the-lock-files-ndl</link>
      <guid>https://dev.to/loclv/write-a-git-diff-command-result-to-file-to-manage-the-big-changes-and-ignore-the-lock-files-ndl</guid>
      <description>&lt;p&gt;Write the result of a git diff command to a file to manage large changes and ignore lock files.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git diff branch-name-0..branch-name-1 &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;':(exclude)*.lock'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; git.diff
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When ignoring multiple files:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git diff branch-name-0..branch-name-1 &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;':(exclude)*.lock'&lt;/span&gt; &lt;span class="s1"&gt;':(exclude)*.yaml'&lt;/span&gt; &lt;span class="s1"&gt;':(exclude)*.yml'&lt;/span&gt; &lt;span class="s1"&gt;':(exclude)*.json'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; git.diff
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>bash</category>
      <category>cli</category>
      <category>git</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Useful command when moving source code to a new folder or repository - sync files</title>
      <dc:creator>Luu Vinh Loc</dc:creator>
      <pubDate>Thu, 26 Feb 2026 08:08:29 +0000</pubDate>
      <link>https://dev.to/loclv/useful-command-when-moving-source-code-to-a-new-folder-or-repository-k4g</link>
      <guid>https://dev.to/loclv/useful-command-when-moving-source-code-to-a-new-folder-or-repository-k4g</guid>
      <description>&lt;h1&gt;
  
  
  Useful command when moving source code to a new folder or repository
&lt;/h1&gt;

&lt;p&gt;rsync (remote sync) is a fast, versatile command-line utility for Unix-like systems, used to synchronize files and directories locally or across networked computers.&lt;br&gt;
It can update, create, and delete files.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rsync &lt;span class="nt"&gt;-av&lt;/span&gt; &lt;span class="nt"&gt;--exclude&lt;/span&gt;&lt;span class="o"&gt;={&lt;/span&gt;&lt;span class="s1"&gt;'node_modules'&lt;/span&gt;,&lt;span class="s1"&gt;'.git'&lt;/span&gt;,&lt;span class="s1"&gt;'logs'&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="nt"&gt;--exclude-from&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'.gitignore'&lt;/span&gt; ./ /path/to/destination/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Explain
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;rsync&lt;/code&gt;: sync files from one folder to another&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--exclude={'node_modules','.git','logs'}&lt;/code&gt;: exclude some folders&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--exclude-from='.gitignore'&lt;/code&gt;: exclude files in &lt;code&gt;.gitignore&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-a&lt;/code&gt; (archive): Preserves permissions, symlinks, and timestamps (crucial for backups).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-v&lt;/code&gt; (verbose): Shows detailed output.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-z&lt;/code&gt; (compress): Compresses data during transfer.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--delete&lt;/code&gt;: Deletes files in the destination that are not present in the source.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-n&lt;/code&gt; or &lt;code&gt;--dry-run&lt;/code&gt;: Simulates the action without actually copying or deleting files.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;./&lt;/code&gt;: current folder&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/path/to/destination&lt;/code&gt;: destination folder&lt;/li&gt;
&lt;li&gt;Note: A trailing slash (/) on the source directory means "copy the contents of this directory," while omitting it means "copy the directory itself".&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>bash</category>
      <category>command</category>
      <category>copy</category>
    </item>
  </channel>
</rss>
