<?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: Patrick Organ</title>
    <description>The latest articles on DEV Community by Patrick Organ (@patinthehat).</description>
    <link>https://dev.to/patinthehat</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%2F574818%2Ffb52c03e-03db-4fcc-ab9c-ea76519a2e39.png</url>
      <title>DEV Community: Patrick Organ</title>
      <link>https://dev.to/patinthehat</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/patinthehat"/>
    <language>en</language>
    <item>
      <title>Developer Tooling #008</title>
      <dc:creator>Patrick Organ</dc:creator>
      <pubDate>Thu, 20 Nov 2025 17:35:15 +0000</pubDate>
      <link>https://dev.to/patinthehat/developer-tooling-008-4p1m</link>
      <guid>https://dev.to/patinthehat/developer-tooling-008-4p1m</guid>
      <description>&lt;h1&gt;
  
  
  Developer Tooling #008
&lt;/h1&gt;

&lt;p&gt;Welcome to Developer Tooling #008, a newsletter enhancement for &lt;a href="https://freek.dev" rel="noopener noreferrer"&gt;Freek Van der Herten&lt;/a&gt;'s &lt;a href="https://freek-dev.mailcoach.app/archive" rel="noopener noreferrer"&gt;popular and high-quality newsletter&lt;/a&gt;, geared towards Software Engineering, Laravel, PHP, and other related topics.&lt;/p&gt;

&lt;p&gt;This month we're covering code editors and IDEs.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://github.com/zed-industries/zed" rel="noopener noreferrer"&gt;Zed&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Zed is a free, open source, Rust-native code editor with GPU-accelerated rendering, built-in LSP and Tree-sitter, debugger, Git, remote development, AI assistance, and real-time multiplayer editing.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what we like: very fast native UI; first-class multiplayer collaboration built in; strong integrated AI features (assistant panel, agentic editing, edit prediction, custom models like Zeta, MCP support); solid remote development and multibuffer workflows; modern Rust codebase that feels future proof.&lt;/li&gt;
&lt;li&gt;what we don't like: ecosystem and extension catalog are still small compared to VS Code; some collaboration and AI capabilities depend on Zed cloud services and GitHub sign-in; freemium limits on predictive edits and AI usage; product is evolving quickly, so workflows and UX can shift under you.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://github.com/microsoft/vscode" rel="noopener noreferrer"&gt;Visual Studio Code&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Visual Studio Code (VSCode) is Microsoft’s cross-platform, Electron-based editor with an IDE feel, a huge extension ecosystem, integrated debugger, Git and terminal support, and deep AI integration through GitHub Copilot and related tooling.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what we like: ubiquitous and battle tested; enormous extension marketplace for almost every language and framework; excellent debugging, Git integration, and remote development (SSH, containers, WSL, Codespaces); strong Copilot and AI Toolkit integration; great documentation and community coverage for nearly any stack.&lt;/li&gt;
&lt;li&gt;what we don't like: Electron footprint plus heavy extension setups can make it slow and memory hungry; telemetry and licensing are more complex than a pure FOSS editor; configuration surface area is huge and easy to over customize into fragility; advanced AI features are increasingly tied to paid Microsoft and GitHub offerings.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://antigravity.google/" rel="noopener noreferrer"&gt;Antigravity&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Antigravity is Google’s new agent-first IDE, built as a fork of VS Code and tightly integrated with Gemini 3 Pro and other models. It lets autonomous AI agents plan, edit, run, and verify code directly inside the editor, terminal, and browser, producing verifiable artifacts like task plans, diffs, screenshots, and recordings.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what we like: designed around multi agent workflows from day one, with a Manager view that feels like mission control for your AI workers; clear verification model via artifacts instead of opaque tool call logs; multi model support across Gemini, Claude, and open models; familiar VS Code style editor so existing shortcuts and habits mostly transfer; currently free public preview with generous rate limits, which makes it low friction to evaluate.&lt;/li&gt;
&lt;li&gt;what we don't like: very early preview so there are rough edges, missing integrations, and potential instability; agents with terminal and browser control raise security and governance questions for serious teams; future pricing and licensing are unknown; extension compatibility and long term ecosystem story are not fully clear yet; switching from direct coding to agent management is a nontrivial mindset shift and will not fit every developer.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://github.com/lapce/lapce" rel="noopener noreferrer"&gt;Lapce&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Lapce is a modern, open source code editor written in Rust with a native GPU accelerated UI, built-in LSP, Tree-sitter based syntax highlighting, remote development, Vim style modal editing, and a WASI based plugin system.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what we like: very fast native experience with snappy startup and input; GPU rendering and Rust core give it good performance headroom; remote development is built in and can be paired with the Lapdev platform; first class Vim like modal editing with no plugins required; WASI plugin architecture allows writing extensions in any language that compiles to WASI; open source and community driven.&lt;/li&gt;
&lt;li&gt;what we don't like: plugin ecosystem is still relatively small compared to VS Code; UI and UX are more minimal and can feel less polished; some workflows require manual configuration and lack a smooth out of the box experience; smaller community means fewer guides and integrations for niche stacks.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://github.com/pulsar-edit/pulsar" rel="noopener noreferrer"&gt;Pulsar&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Pulsar is a community led, hyper hackable text editor that continues the Atom lineage, with cross platform support, a built-in package manager, and IDE like language server integrations.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what we like: essentially keeps the Atom experience alive with active community maintenance; leverages a large existing ecosystem of Atom and Pulsar packages and themes; very customizable through familiar web technologies like JavaScript, HTML, and CSS; solid Git integration, multi pane layout, and file tree make it a comfortable general purpose editor.&lt;/li&gt;
&lt;li&gt;what we don't like: Electron base means higher resource usage and slower performance on very large projects; AI and agentic workflows are mostly add ons through third party packages rather than a core focus; roadmap and sustainability depend on volunteer community capacity; some older Atom era packages are unmaintained or flaky.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://github.com/cursor/cursor" rel="noopener noreferrer"&gt;Cursor&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Cursor is an AI first IDE forked from VS Code, focused on repo scale understanding, powerful autocomplete, inline edits, and agent like workflows, with features like smart rewrite, project wide refactors, integrated chat, and Bugbot for automated debugging.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what we like: tight AI integration across the editor with multiple levels of autonomy, from small inline edits to large refactors; strong codebase indexing that lets AI operate on the whole repository, not just the current file; good UX for exploratory or vibe coding and for PR review, with integrations into services like GitHub and Slack; Bugbot style automated debugging that can surface subtle logic or security issues; still close enough to VS Code that most keybindings and workflows carry over.&lt;/li&gt;
&lt;li&gt;what we don't like: proprietary and subscription based, with higher costs at heavier usage tiers; heavy reliance on remote services and code indexing that some organizations will reject on security or compliance grounds; AI centric workflow can encourage over reliance on generated code if teams are not disciplined; extension ecosystem is narrower than stock VS Code and tied to Cursor’s release cadence and choices.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>programming</category>
      <category>webdev</category>
      <category>productivity</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Developer Tooling #007</title>
      <dc:creator>Patrick Organ</dc:creator>
      <pubDate>Sat, 18 Oct 2025 00:17:03 +0000</pubDate>
      <link>https://dev.to/patinthehat/developer-tooling-007-5a0p</link>
      <guid>https://dev.to/patinthehat/developer-tooling-007-5a0p</guid>
      <description>&lt;p&gt;Welcome to Developer Tooling #007, a newsletter enhancement for &lt;a href="https://freek.dev" rel="noopener noreferrer"&gt;Freek Van der Herten&lt;/a&gt;'s &lt;a href="https://freek-dev.mailcoach.app/archive" rel="noopener noreferrer"&gt;popular and high-quality newsletter&lt;/a&gt;, geared towards Software Engineering, Laravel, and related topics.&lt;/p&gt;

&lt;p&gt;This edition's theme is &lt;strong&gt;linting&lt;/strong&gt; of all types!&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/hadolint/hadolint" rel="noopener noreferrer"&gt;hadolint&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Dockerfile linter, validate inline bash, written in Haskell.&lt;br&gt;
&lt;strong&gt;What we like&lt;/strong&gt;: Well-maintained over the long term, active development, works very well. A true 12-factor application - can even be configured via environment vars!&lt;br&gt;
&lt;strong&gt;What we don't like&lt;/strong&gt;: No JSON output.&lt;br&gt;
&lt;strong&gt;Extras&lt;/strong&gt;: Lint Dockerfiles &lt;a href="https://hadolint.github.io/hadolint/" rel="noopener noreferrer"&gt;online&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/astral-sh/ruff" rel="noopener noreferrer"&gt;ruff&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: An extremely fast Python linter and code formatter, written in Rust.&lt;br&gt;
&lt;strong&gt;What we like&lt;/strong&gt;: Orders of magnitude faster than other Python linters, very active development.&lt;br&gt;
&lt;strong&gt;What we don't like&lt;/strong&gt;: Still a zero-point release (0.14 as of this article), which allows for breaking changes in minor and patch releases.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/rhysd/actionlint" rel="noopener noreferrer"&gt;actionlint&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Static checker for GitHub Actions workflow files.&lt;br&gt;
&lt;strong&gt;What we like&lt;/strong&gt;: Lints workflow files, an area lacking much tooling. Actively developed.&lt;br&gt;
&lt;strong&gt;What we don't like&lt;/strong&gt;: Docs are a bit outdated.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/dotenv-linter/dotenv-linter" rel="noopener noreferrer"&gt;dotenv-linter&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: ⚡️Lightning-fast linter for .env files. Written in Rust.&lt;br&gt;
&lt;strong&gt;What we like&lt;/strong&gt;: Highly active development. Stable. &lt;br&gt;
&lt;strong&gt;What we don't like&lt;/strong&gt;: Documentation leaves something to be desired.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.tocrate-ci/typos"&gt;typos&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Check source code for typos.&lt;br&gt;
&lt;strong&gt;What we like&lt;/strong&gt;: Make sure your source code doesn't have  typographical errors.&lt;br&gt;
&lt;strong&gt;What we don't like&lt;/strong&gt;: Doesn't have an option for custom dictionaries.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>webdev</category>
      <category>github</category>
      <category>opensource</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Developer Tooling #006</title>
      <dc:creator>Patrick Organ</dc:creator>
      <pubDate>Sat, 13 Sep 2025 08:53:05 +0000</pubDate>
      <link>https://dev.to/patinthehat/developer-tooling-006-4g55</link>
      <guid>https://dev.to/patinthehat/developer-tooling-006-4g55</guid>
      <description>&lt;p&gt;Welcome to Developer Tooling #006, a newsletter enhancement for &lt;a href="https://freek.dev" rel="noopener noreferrer"&gt;Freek Van der Herten&lt;/a&gt;'s &lt;a href="https://freek-dev.mailcoach.app/archive" rel="noopener noreferrer"&gt;popular and high-quality newsletter&lt;/a&gt;, geared towards Software Engineering and related fields. If you haven't checked out his newsletter, take the time to now. It's worth it.&lt;br&gt;
For this edition, we're experimenting with a themed approach for all of the showcased tools. Please let us know if you prefer it (or not!)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Theme&lt;/strong&gt;: ECMAScript/TypeScript native-binary bundlers &amp;amp; compilers (built with Go, Rust, etc.)&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/web-infra-dev/rspack" rel="noopener noreferrer"&gt;rspack&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: A modern, rust-based javascript compiler that replaces webpack.&lt;br&gt;
&lt;strong&gt;What we like&lt;/strong&gt;: Rich feature set that attempts to have feature parity with webpack; it's part of a growing ecosystem that appears well-maintained.&lt;br&gt;
&lt;strong&gt;What we don't like&lt;/strong&gt;: It supports similar complexity in its configuration due to feature parity with webpack&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/evanw/esbuild" rel="noopener noreferrer"&gt;esbuild&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: a Javascript/TypeScript/React compiler written in Go.&lt;br&gt;
&lt;strong&gt;What we like&lt;/strong&gt;: It's the OG compiler/bundler for JS/TS. It was orders of magnitude faster than anything else before it was cool.&lt;br&gt;
&lt;strong&gt;What we don't like&lt;/strong&gt;: It's lost some ground to tools such as bun.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/oven-sh/bun" rel="noopener noreferrer"&gt;bun&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: A feature-rich, extremely fast bundler, compiler, and package manager all in one.&lt;br&gt;
&lt;strong&gt;What we like&lt;/strong&gt;: it's incredibly fast not only when bundling, but also as an NPM replacement - it's working on feature parity with the npm cli and API; &lt;code&gt;bun install&lt;/code&gt; is so much faster than npm it's hard to believe.&lt;br&gt;
&lt;strong&gt;What we don't like&lt;/strong&gt;: It's written in Zig, which may have been a poor choice for long-term maintainability.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/rolldown/rolldown" rel="noopener noreferrer"&gt;rolldown&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: A rust-based tool that aims to replace rollup.&lt;br&gt;
&lt;strong&gt;What we like&lt;/strong&gt;: Highly active development. Aims to replace rollup, which is too slow.&lt;br&gt;
&lt;strong&gt;What we don't like&lt;/strong&gt;: Documentation leaves something to be desired (it's not bad, but it could be better)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/farm-fe/farm" rel="noopener noreferrer"&gt;farm&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Another rust-based bundler&lt;br&gt;
&lt;strong&gt;What we like&lt;/strong&gt;: Excellent documentation; has been under active development for quite some time; if its history is a reliable indicator, it will (hopefully) be reliably maintained for years to come.&lt;br&gt;
&lt;strong&gt;What we don't like&lt;/strong&gt;: The speed comparisons on their website feel dishonest - we don't like that it claims to be faster than everything but doesn't offer direct comparisons for tools like bun. (Note: we're not commenting on the accuracy of their comparisons - only noting that the comparisons aren't presented in the best light)&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>webdev</category>
      <category>opensource</category>
      <category>github</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Developer Tooling #005</title>
      <dc:creator>Patrick Organ</dc:creator>
      <pubDate>Tue, 19 Aug 2025 18:20:31 +0000</pubDate>
      <link>https://dev.to/patinthehat/developer-tooling-005-880</link>
      <guid>https://dev.to/patinthehat/developer-tooling-005-880</guid>
      <description>&lt;p&gt;Welcome to Developer Tooling #005, a newsletter enhancement for &lt;a href="https://freek.dev" rel="noopener noreferrer"&gt;Freek Van der Herten&lt;/a&gt;'s &lt;a href="https://freek-dev.mailcoach.app/archive" rel="noopener noreferrer"&gt;popular and high-quality newsletter&lt;/a&gt;, geared towards Software Engineering and related fields. If you haven't checked out his newsletter, take the time to now. It's worth it.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/openreplay/openreplay" rel="noopener noreferrer"&gt;openreplay&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Session replay, cobrowsing and product analytics&lt;br&gt;
&lt;strong&gt;What we like&lt;/strong&gt;: Rich feature set, maintained, and excellent documentation&lt;br&gt;
&lt;strong&gt;What we don't like&lt;/strong&gt;: Infrequent releases&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/Wilfred/difftastic" rel="noopener noreferrer"&gt;difftastic&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: a structural diff that understands syntax&lt;br&gt;
&lt;strong&gt;What we like&lt;/strong&gt;: simple and strightforward, integrates with git&lt;br&gt;
&lt;strong&gt;What we don't like&lt;/strong&gt;: Currently has zero-point versions, allowing breaking changes between versions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/go-task/task" rel="noopener noreferrer"&gt;task&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: A task runner / simpler Make alternative written in Go&lt;br&gt;
&lt;strong&gt;What we like&lt;/strong&gt;: it "just works", in our experience&lt;br&gt;
&lt;strong&gt;What we don't like&lt;/strong&gt;: Task definitions can get long and difficult to read&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/trufflesecurity/trufflehog" rel="noopener noreferrer"&gt;TruffleHog&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Find, verify, and analyze leaked credentials&lt;br&gt;
&lt;strong&gt;What we like&lt;/strong&gt;: Plenty of features; frequent releases&lt;br&gt;
&lt;strong&gt;What we don't like&lt;/strong&gt;: PRs and issues on GH aren't always reviewed in a timely manner.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/Schniz/fnm" rel="noopener noreferrer"&gt;fnm&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Fast and simple Node.js version manager, built in Rust&lt;br&gt;
&lt;strong&gt;What we like&lt;/strong&gt;: faster and easier to use than &lt;code&gt;nvm&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;What we don't like&lt;/strong&gt;: Repository readme could be more extensive.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>webdev</category>
      <category>opensource</category>
      <category>github</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Developer Tooling #004</title>
      <dc:creator>Patrick Organ</dc:creator>
      <pubDate>Thu, 24 Jul 2025 07:21:16 +0000</pubDate>
      <link>https://dev.to/patinthehat/developer-tooling-004-4jki</link>
      <guid>https://dev.to/patinthehat/developer-tooling-004-4jki</guid>
      <description>&lt;p&gt;Welcome to the fourth edition of Developer Tooling, a newsletter enhancement for &lt;a href="https://freek.dev" rel="noopener noreferrer"&gt;Freek Van der Herten&lt;/a&gt;'s &lt;a href="https://freek-dev.mailcoach.app/archive" rel="noopener noreferrer"&gt;popular and high-quality newsletter&lt;/a&gt;, geared towards Software Engineering and related fields.&lt;/p&gt;

&lt;p&gt;ots | &lt;a href="https://github.com/sniptt-official/ots" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it does&lt;/strong&gt;: Share end-to-end encrypted secrets with others via a one-time URL.&lt;br&gt;
&lt;strong&gt;What we like&lt;/strong&gt;: Feature-complete, secure.&lt;br&gt;
&lt;strong&gt;What we don't like&lt;/strong&gt;: no GUI option.&lt;/p&gt;

&lt;p&gt;yazi | &lt;a href="https://github.com/sxyazi/yazi" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it does&lt;/strong&gt;: Blazing fast terminal file manager written in Rust, based on async I/O.&lt;br&gt;
&lt;strong&gt;What we like&lt;/strong&gt;: Feature-complete, regular commits.&lt;br&gt;
&lt;strong&gt;What we don't like&lt;/strong&gt;: Some features seem to be overkill for a terminal-based file manager.&lt;/p&gt;

&lt;p&gt;dive | &lt;a href="https://github.com/wagoodman/dive" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it does&lt;/strong&gt;: A tool for exploring each layer in a docker image.&lt;br&gt;
&lt;strong&gt;What we like&lt;/strong&gt;: Extremely useful for reducing docker image sizes; easy to use.&lt;br&gt;
&lt;strong&gt;What we don't like&lt;/strong&gt;: no command-line arguments to automatically analyze the images (must be done using the TUI).&lt;/p&gt;

&lt;p&gt;aider | &lt;a href="https://github.com/Aider-AI/aider" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it does&lt;/strong&gt;: AI code assistant in your terminal.&lt;br&gt;
&lt;strong&gt;What we like&lt;/strong&gt;: Works well, can connect to most hosted models via API, and supports the top models by default.&lt;br&gt;
&lt;strong&gt;What we don't like&lt;/strong&gt;: Under heavy development (over 12k commits), zero-point release means breaking changes are possible.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>opensource</category>
      <category>github</category>
      <category>programming</category>
    </item>
    <item>
      <title>Developer Tooling #003</title>
      <dc:creator>Patrick Organ</dc:creator>
      <pubDate>Tue, 24 Jun 2025 16:27:21 +0000</pubDate>
      <link>https://dev.to/patinthehat/developer-tooling-003-4fg1</link>
      <guid>https://dev.to/patinthehat/developer-tooling-003-4fg1</guid>
      <description>&lt;p&gt;Welcome to the third edition of Developer Tooling, a newsletter enhancement for &lt;a href="https://freek.dev" rel="noopener noreferrer"&gt;Freek Van der Herten&lt;/a&gt;'s &lt;a href="https://freek-dev.mailcoach.app/archive" rel="noopener noreferrer"&gt;popular and high-quality newsletter&lt;/a&gt;, geared towards Software Engineering and related fields.&lt;/p&gt;

&lt;p&gt;delta | &lt;a href="https://github.com/dandavison/delta" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it does&lt;/strong&gt;: A syntax-highlighting pager for git, diff, grep, and blame output&lt;br&gt;
&lt;strong&gt;What we like&lt;/strong&gt;: Feature-complete, highly customizable.&lt;br&gt;
&lt;strong&gt;What we don't like&lt;/strong&gt;: Appears to be in maintainance mode instead of active development.&lt;/p&gt;

&lt;p&gt;act | &lt;a href="https://github.com/nektos/act" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it does&lt;/strong&gt;: Run your GitHub Actions locally.&lt;br&gt;
&lt;strong&gt;What we like&lt;/strong&gt;: Test your GitHub workflows locally.&lt;br&gt;
&lt;strong&gt;What we don't like&lt;/strong&gt;: Still a zero-point release, so breaking changes are possible for any release.&lt;/p&gt;

&lt;p&gt;actionlint | &lt;a href="https://github.com/rhysd/actionlint" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it does&lt;/strong&gt;: Static checking for GitHub workflows.&lt;br&gt;
&lt;strong&gt;What we like&lt;/strong&gt;: Lint your workflow files.&lt;br&gt;
&lt;strong&gt;What we don't like&lt;/strong&gt;: Last release was 6 months ago.&lt;/p&gt;

&lt;p&gt;dotenv-linter | &lt;a href="https://github.com/dotenv-linter/dotenv-linter" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it does&lt;/strong&gt;: Lints .env files.&lt;br&gt;
&lt;strong&gt;What we like&lt;/strong&gt;: Fast.&lt;br&gt;
&lt;strong&gt;What we don't like&lt;/strong&gt;: Appears to not longer be under development, last release was 3 years ago.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>productivity</category>
      <category>opensource</category>
      <category>github</category>
    </item>
    <item>
      <title>Developer Tooling #002</title>
      <dc:creator>Patrick Organ</dc:creator>
      <pubDate>Thu, 22 May 2025 23:45:06 +0000</pubDate>
      <link>https://dev.to/patinthehat/developer-tooling-002-19l7</link>
      <guid>https://dev.to/patinthehat/developer-tooling-002-19l7</guid>
      <description>&lt;p&gt;Welcome to Developer Tooling #002! Each month, we provide a few tooling links geared towards modern, advanced developers and engineers.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/jondot/hygen" rel="noopener noreferrer"&gt;hygen&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: simple, fast, scalable code generator&lt;br&gt;
&lt;strong&gt;What we like&lt;/strong&gt;: easily scaffold custom projects&lt;br&gt;
&lt;strong&gt;What we don't like&lt;/strong&gt;: seems to be in maintenance mode without new updates or features.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/johannesjo/super-productivity" rel="noopener noreferrer"&gt;super-productivity&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: simple time/task tracker&lt;br&gt;
&lt;strong&gt;What we like&lt;/strong&gt;: simple and strightforward, has a web client&lt;br&gt;
&lt;strong&gt;What we don't like&lt;/strong&gt;: the UX needs work.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/joshbeckman/thecolorapi" rel="noopener noreferrer"&gt;thecolorapi&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: fast, modern, swiss army knife for color&lt;br&gt;
&lt;strong&gt;What we like&lt;/strong&gt;: easily work with colors and palettes&lt;br&gt;
&lt;strong&gt;What we don't like&lt;/strong&gt;: neat features, but the UX is lacking.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/nitrojs/nitro" rel="noopener noreferrer"&gt;nitro&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: Next generation server toolkit&lt;br&gt;
&lt;strong&gt;What we like&lt;/strong&gt;: easily build http servers&lt;br&gt;
&lt;strong&gt;What we don't like&lt;/strong&gt;: PRs and issues on GH aren't managed in a timely manner.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/sniptt-official/ots" rel="noopener noreferrer"&gt;ots&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Description&lt;/strong&gt;: share secrets with one-time links&lt;br&gt;
&lt;strong&gt;What we like&lt;/strong&gt;: easily &amp;amp; securely share passwords&lt;br&gt;
&lt;strong&gt;What we don't like&lt;/strong&gt;: Repository readme is lacking.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Developer Tooling #001</title>
      <dc:creator>Patrick Organ</dc:creator>
      <pubDate>Fri, 25 Apr 2025 13:46:35 +0000</pubDate>
      <link>https://dev.to/patinthehat/developer-tooling-001-3c2g</link>
      <guid>https://dev.to/patinthehat/developer-tooling-001-3c2g</guid>
      <description>&lt;p&gt;Welcome to the first edition of Developer Tooling, a newsletter enhancement for &lt;a href="https://freek.dev" rel="noopener noreferrer"&gt;Freek Van der Herten&lt;/a&gt;'s &lt;a href="https://freek-dev.mailcoach.app/archive" rel="noopener noreferrer"&gt;popular and high-quality newsletter&lt;/a&gt;, geared towards Software Engineering and related fields.&lt;/p&gt;

&lt;p&gt;TerraCognita | &lt;a href="https://github.com/cycloidio/terracognita" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it does&lt;/strong&gt;: Generate infra-as-code for Terraform based on your existing cloud configuration and services.&lt;br&gt;
&lt;strong&gt;What we like&lt;/strong&gt;: Supports the most popular providers: AWS, Azure, and GCP.&lt;br&gt;
&lt;strong&gt;What we don't like&lt;/strong&gt;: Lower activity based on git history - perhaps this is a great project to fork!&lt;/p&gt;

&lt;p&gt;frp | &lt;a href="https://github.com/fatedier/frp" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it does&lt;/strong&gt;: Provides a feature-complete reverse proxy.&lt;br&gt;
&lt;strong&gt;What we like&lt;/strong&gt;: Supports TCP, UDP, and HTTP/S protocols.&lt;br&gt;
&lt;strong&gt;What we don't like&lt;/strong&gt;: Appears to require extensive configuration due to the number of features and options.&lt;/p&gt;

&lt;p&gt;LlamaOCR | &lt;a href="https://github.com/Nutlope/llama-ocr" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it does&lt;/strong&gt;: Converts text in images to markdown documents using Llama 3.2.&lt;br&gt;
&lt;strong&gt;What we like&lt;/strong&gt;: OCR for receipts? Yes, please! &lt;br&gt;
&lt;strong&gt;What we don't like&lt;/strong&gt;: Limited commit history, not under heavy/active development.&lt;/p&gt;

&lt;p&gt;fnm | &lt;a href="https://github.com/Schniz/fnm" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it does&lt;/strong&gt;: Like nvm, but written in Rust; manages your installed node.js versions.&lt;br&gt;
&lt;strong&gt;What we like&lt;/strong&gt;: Significant speed compared to nvm.&lt;br&gt;
&lt;strong&gt;What we don't like&lt;/strong&gt;: Documentation is a bit lacking.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>tooling</category>
      <category>productivity</category>
      <category>opensource</category>
    </item>
    <item>
      <title>From Contributor to Maintainer: Lessons from Open Source Software</title>
      <dc:creator>Patrick Organ</dc:creator>
      <pubDate>Mon, 24 Jun 2024 06:12:54 +0000</pubDate>
      <link>https://dev.to/patinthehat/from-contributor-to-maintainer-lessons-from-open-source-software-3mog</link>
      <guid>https://dev.to/patinthehat/from-contributor-to-maintainer-lessons-from-open-source-software-3mog</guid>
      <description>&lt;p&gt;Since I started focusing on contributions to open-source projects a few years ago, I’ve opened and had merged hundreds of Pull Requests. This article outlines some of the lessons I've learned from contributing to, authoring, and maintaining popular open-source projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating Open Source Projects
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Avoid creating projects that you cannot or will not maintain.&lt;/em&gt; Open-source projects require ongoing attention to address issues, update dependencies, and incorporate new features. If you do not have the capacity or commitment to maintain a project, it is better not to release it to the public. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Your code should be easily understood and be maintainable by others.&lt;/em&gt; Clear documentation, consistent coding standards, and well-organized codebases are essential when introducing an open source project. This not only facilitates collaboration but also ensures that others can step in to help with maintenance or contribute new features.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Avoid creating packages that are too specific.&lt;/em&gt; The more generalized and flexible your project, the broader its appeal and utility to the community. By focusing on creating versatile and widely applicable projects, you can attract a larger base of users and contributors.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Automate everything.&lt;/em&gt; To streamline the maintenance and management of your projects, use of GitHub workflows and features like Dependabot whenever you can. Automating processes such as merging Dependabot PRs, running test suites, marking issues as stale, and updating the changelog can significantly reduce the manual workload. These tools ensure that your project remains up-to-date and stable without constant manual intervention.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contributing to Open Source Projects
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Target projects that you use frequently.&lt;/em&gt; Familiarity with the functionality and nuances of it puts you in a position to provide meaningful features or fixes. Whether squashing bugs that you’ve discovered or implementing features you have use cases for, your contributions will likely address needs that others have also encountered.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Your contributions are public and are a reflection on you as an engineer.&lt;/em&gt; Remember that potential employers may look at your previous work. It's important to think carefully about the quality and thoroughness of your contributions; each pull request you make is a demonstration of your abilities and your understanding of software development. By consistently contributing well-structured, tested, and documented code, you not only support the projects you care about but also build a strong professional reputation that can open doors to future opportunities.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Open thoughtful pull requests.&lt;/em&gt; The clarity and thoroughness of your PR descriptions make a significant difference in whether or not it gets merged quickly, slowly, or at all. Start by summarizing what the pull request does in a few sentences, then drill down into the important points below. This approach not only helps maintainers understand the scope and purpose of your changes quickly, but also facilitates a timely, smooth review process.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Keep your pull requests small and focused.&lt;/em&gt; Each PR should add a single feature or fix a single bug. This streamlines the review process for maintainers, enabling them to review and merge your code more quickly. Likewise, it’s also easier to address any requested changes promptly. A small, well-defined PR is less likely to introduce unintended side effects and is generally easier to test and validate.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Include unit tests.&lt;/em&gt; Responsible maintainers will rarely merge code without appropriate tests, as they help ensure that new changes do not break existing functionality. By including unit tests with your Pull Request, you’re respecting the maintainers' time and reduce the back-and-forth that can occur when tests are missing. Even if your PR seems trivial or is already covered by existing tests, demonstrating that you've thought about testing can expedite the merge process and reflect positively on your contributions.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Update documentation when you make API changes.&lt;/em&gt; If the project you’re contributing to has existing documentation, remember that someone took the time to write it; respect this effort on their part and make sure you update it accordingly, including using a similar tone and style. This ensures that other developers can understand and effectively use the new or modified features you have implemented. Neglecting this step can lead to confusion, undermining the usability and reliability of the project.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Respect the time and effort of maintainers and contributors.&lt;/em&gt; You’re a user of the project and have benefited from the time and effort of others. Acknowledge the hard work and dedication when you can. Demonstrating appreciation and respect allows you to receive it in return. Always be considerate and courteous.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Respect existing code and writing styles.&lt;/em&gt; Remember that this isn’t your project - it’s someone’s, though, and their preferences matter. Whether it’s two spaces for indentation instead of four (or even - &lt;em&gt;gasp&lt;/em&gt; - tabs),  or the writing style of the documentation, show the original author the respect of using their style preferences.&lt;/p&gt;

&lt;h2&gt;
  
  
  Maintaining Open Source Projects
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;It’s a privilege, not a right.&lt;/em&gt; Being a maintainer and having the ability to triage issues, review and merge Pull Requests and release new versions is a privilege, not a right. This role comes with significant responsibility and trust, and should be approached seriously. Your actions as a maintainer can directly impact the quality and reliability of a project; they will also affect the experience of the project’s users.  Likewise, your actions can impact the reputation of others, such as the original project author. Be mindful of this.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Get input from others.&lt;/em&gt; When uncertain about how to address an issue or handle a pull request, don’t hesitate to seek input from other maintainers. Collaboration and communication are key to making well-informed decisions that benefit the project and its community. Leveraging the collective knowledge and experience of others helps ensure that the best possible solutions are used.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Be appreciative.&lt;/em&gt; A simple thank you to a contributor or author of a bug report can go a long way. Recognizing the efforts of others not only strengthens open source community but also motivates continued contributions and engagement in the project.&lt;/p&gt;

&lt;p&gt;If you're interested, check out some of my open source contributions in my &lt;a href="https://github.com/permafrost-dev" rel="noopener noreferrer"&gt;GitHub Organization&lt;/a&gt; or my &lt;a href="https://github.com/patinthehat" rel="noopener noreferrer"&gt;GitHub profile&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Follow-up edit&lt;/strong&gt; - See this &lt;a href="https://gummibeer.dev/blog/2024/lessons-from-open-source-software" rel="noopener noreferrer"&gt;fantastic response article&lt;/a&gt; by &lt;a href="https://github.com/Gummibeer" rel="noopener noreferrer"&gt;Tom Herrmann&lt;/a&gt;. It's very well written and reasoned out, and it's worth a read. Thanks, Tom!&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>webdev</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
    <item>
      <title>Mastering NPM Library Creation: Bundling with Vite</title>
      <dc:creator>Patrick Organ</dc:creator>
      <pubDate>Sun, 03 Mar 2024 00:21:53 +0000</pubDate>
      <link>https://dev.to/patinthehat/mastering-npm-library-creation-bundling-with-vite-e5d</link>
      <guid>https://dev.to/patinthehat/mastering-npm-library-creation-bundling-with-vite-e5d</guid>
      <description>&lt;p&gt;If you're writing a library to publish on NPM, there are several options for bundling (building) the library files. The number of options can be confusing, so this article will cover a popular choice for advanced library bundling, Vite.&lt;/p&gt;

&lt;p&gt;I won't be covering use of the CLI for bundling, instead we'll cover more complex build configurations using a NodeJS build script that leverages the API provided by Vite.&lt;/p&gt;

&lt;p&gt;We'll be bundling a new version of one of my NPM libraries, &lt;a href="https://github.com/permafrost-dev/node-ray" rel="noopener noreferrer"&gt;node-ray&lt;/a&gt;.  It's written in TypeScript, has two entry points (one for NodeJS and one for browser use), and builds six library files: ESM and CommonJS format for the two entry point files, as well as a "standalone" version that bundles all of the dependencies to allow importing it into a webpage via a CDN (the standard builds exclude all dependencies in the final bundles).&lt;/p&gt;

&lt;h2&gt;
  
  
  Building with Vite
&lt;/h2&gt;

&lt;p&gt;Vite is a modern build tool that provides a great development experience with features like ultra-fast build times (thanks to ESBuild) and Hot Module Reloading (HMR). While HMR might not be a necessity for library development, it's a boon for projects such as React component libraries, enhancing the development flow.&lt;/p&gt;

&lt;p&gt;First, install the &lt;code&gt;vite&lt;/code&gt; package into your project's development dependencies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;vite &lt;span class="nt"&gt;-D&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's go through each section of the build script individually.&lt;/p&gt;

&lt;p&gt;Imports: not much to say here.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;readFile&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node:fs/promises&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;resolve&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node:path&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;fileURLToPath&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node:url&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;defineConfig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;build&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;viteBuild&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;vite&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Following the imports, we introduce a global configuration object, a central location for all configurable aspects of the build environment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;globalConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;libraryName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Ray&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;outDir&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;dirname&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;fileURLToPath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../dist&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;basePath&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;dirname&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;fileURLToPath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;..&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;builds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;src/Ray.ts&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;outfile&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;web.cjs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;browser&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;src/Ray.ts&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;outfile&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;web.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;browser&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;src/RayNode.ts&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;outfile&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;index.cjs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;src/RayNode.ts&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;outfile&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;index.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;src/Ray.ts&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;outfile&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;standalone.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;browser&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;src/Ray.ts&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;outfile&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;standalone.min.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;browser&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="cm"&gt;/** @type Record&amp;lt;string, any&amp;gt;|null */&lt;/span&gt;
    &lt;span class="na"&gt;pkg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// assigned in init()&lt;/span&gt;
    &lt;span class="nf"&gt;getDependencies&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;standalone&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="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;standalone&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="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pkg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dependencies&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;concat&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
            &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node:fs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node:fs/promises&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node:os&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node:path&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node:process&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pkg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;readFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;basePath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;package.json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;

        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;builds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;builds&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;entry&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;globalConfig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;basePath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;minify&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;outfile&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.min.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;standalone&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;outfile&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;standalone&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;format&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;outfile&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;endsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;es&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;cjs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;standalone&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;format&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;iife&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;

            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This object encompasses everything from the library name to output directories and build configurations. The &lt;code&gt;libraryName&lt;/code&gt; sets the identity for the library being built. The &lt;code&gt;outDir&lt;/code&gt; and &lt;code&gt;basePath&lt;/code&gt; properties, derived from the current file &lt;em&gt;(the build script, &lt;code&gt;build.js&lt;/code&gt;)&lt;/em&gt;, establish the path used for the output and project root directories. &lt;/p&gt;

&lt;p&gt;The &lt;code&gt;builds&lt;/code&gt; array is a collection of build configurations, each tailored to a specific target, such as the browser or NodeJS. The &lt;code&gt;outfile&lt;/code&gt; extension, &lt;code&gt;.js&lt;/code&gt; or &lt;code&gt;.cjs&lt;/code&gt;, dictates whether the output format is ESM or CommonJS, respectively.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;pkg&lt;/code&gt; property, once initialized, holds the parsed contents of &lt;code&gt;package.json&lt;/code&gt;, providing access to project dependencies.  This is necessary so we can tell Vite to not include them in the final bundles, with the exception of the standalone build. The standard bundles will be installed via an NPM package, so their dependencies will automatically be installed, making them unnecessary to include in the bundles.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;getDependencies&lt;/code&gt; and &lt;code&gt;init&lt;/code&gt; methods are where the global configuration object shines. &lt;code&gt;getDependencies&lt;/code&gt; dynamically determines external dependencies, essential for configuring our bundling process, since we're also building a "standalone" bundle ("iife" format) in addition to the ESM and CJS builds. &lt;/p&gt;

&lt;p&gt;The &lt;code&gt;init&lt;/code&gt; method initializes the global configuration by reading and parsing &lt;code&gt;package.json&lt;/code&gt;, then refining the build configurations for use later by Vite's build API.&lt;/p&gt;

&lt;p&gt;Now on to the build function itself, which uses the Vite API to perform a build asynchronously:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;buildWithVite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;viteBuild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;defineConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;lib&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="na"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;globalConfig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;libraryName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;formats&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;format&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                &lt;span class="na"&gt;fileName&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="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;outfile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="na"&gt;emptyOutDir&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;outDir&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;globalConfig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;outDir&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;minify&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;minify&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="na"&gt;sourcemap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;rollupOptions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="na"&gt;external&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;globalConfig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getDependencies&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;standalone&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                &lt;span class="c1"&gt;// don't eliminate any "unused" code, since it's a library:&lt;/span&gt;
                &lt;span class="na"&gt;treeshake&lt;/span&gt;&lt;span class="p"&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="na"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;browser&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;chrome70&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node18&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="na"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;extensions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.ts&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="na"&gt;alias&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;globalConfig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;basePath&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/src`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="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;This function is a testament to the power and flexibility of Vite. It leverages &lt;code&gt;viteBuild&lt;/code&gt; and &lt;code&gt;defineConfig&lt;/code&gt; to orchestrate the build process, tailoring it to each configuration defined in our global setup. Through asynchronous execution, it processes each build configuration, taking into account settings such as entry points, output formats, and targets.&lt;/p&gt;

&lt;p&gt;Lastly, we define and call a &lt;code&gt;main()&lt;/code&gt; function that initializes the global configuration, then calls the &lt;code&gt;buildWithVite()&lt;/code&gt; function above for each build configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;globalConfig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;globalConfig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;builds&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;buildWithVite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;

    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;All builds completed&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By leveraging the asynchronous functionality of NodeJS, our build script concurrently processes all six configurations, streamlining the build process:&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%2Fhpecrojd9dzvivru0ptr.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%2Fhpecrojd9dzvivru0ptr.png" alt=" " width="800" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There you have it — a comprehensive, ~100 line, asynchronous build script for multiple library outputs - all built in 1 second - thanks to the power of Vite. This approach not only simplifies the build process but also eliminates the need for multiple configuration files and CLI runs, offering an efficient solution for library development.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>tutorial</category>
      <category>node</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Essential Command Line Tools for Developers</title>
      <dc:creator>Patrick Organ</dc:creator>
      <pubDate>Mon, 15 Jan 2024 13:18:52 +0000</pubDate>
      <link>https://dev.to/permafrost/essential-command-line-tools-for-developers-4838</link>
      <guid>https://dev.to/permafrost/essential-command-line-tools-for-developers-4838</guid>
      <description>&lt;p&gt;As a software developer, having a selection of great command line tools at your disposal is essential.  Once you've harnessed the power of the command line, you're more productive; you have the tools necessary to quickly complete common tasks.&lt;/p&gt;

&lt;p&gt;The following is a list of command line tools I've cultivated over the years in my career as a Software Engineer; most of which I use on a daily basis, and all of which enable me to be highly efficient and productive.&lt;/p&gt;

&lt;p&gt;This list only includes projects that provide native binaries - npm packages such as &lt;code&gt;eslint&lt;/code&gt; or &lt;code&gt;prettier&lt;/code&gt;, while incredibly useful, aren't included.&lt;/p&gt;

&lt;h2&gt;
  
  
  General Utilities
&lt;/h2&gt;

&lt;h4&gt;
  
  
  zyedidia/eget
&lt;/h4&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/zyedidia" rel="noopener noreferrer"&gt;
        zyedidia
      &lt;/a&gt; / &lt;a href="https://github.com/zyedidia/eget" rel="noopener noreferrer"&gt;
        eget
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Easily install prebuilt binaries from GitHub.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Eget: easy pre-built binary installation&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://goreportcard.com/report/github.com/zyedidia/eget" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/9625372daca671780325b135ca38c247daaecc920879a41d1090d99aeccc56a7/68747470733a2f2f676f7265706f7274636172642e636f6d2f62616467652f6769746875622e636f6d2f7a796564696469612f65676574" alt="Go Report Card"&gt;&lt;/a&gt;
&lt;a href="https://github.com/zyedidia/eget/releases" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/3a97fccddd90dfab14c7fba1999d2d053870ecc8c2a11e141e7b154867cbd457/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f72656c656173652f7a796564696469612f656765742e7376673f6c6162656c3d52656c65617365" alt="Release"&gt;&lt;/a&gt;
&lt;a href="https://github.com/zyedidia/eget/blob/master/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/6581c31c16c1b13ddc2efb92e2ad69a93ddc4a92fd871ff15d401c4c6c9155a4/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d626c75652e737667" alt="MIT License"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Eget&lt;/strong&gt; is the best way to easily get pre-built binaries for your favorite
tools. It downloads and extracts pre-built binaries from releases on GitHub. To
use it, provide a repository and Eget will search through the assets from the
latest release in an attempt to find a suitable prebuilt binary for your
system. If one is found, the asset will be downloaded and Eget will extract the
binary to the current directory. Eget should only be used for installing
simple, static prebuilt binaries, where the extracted binary is all that is
needed for installation. For more complex installation, you may use the
&lt;code&gt;--download-only&lt;/code&gt; option, and perform extraction manually.&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/zyedidia/blobs/blob/master/eget-demo.gif"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fzyedidia%2Fblobs%2Fraw%2Fmaster%2Feget-demo.gif" alt="Eget Demo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;For software maintainers, if you provide prebuilt binaries on GitHub, you can
list &lt;code&gt;eget&lt;/code&gt; as a one-line method for users to install your software.&lt;/p&gt;
&lt;p&gt;Eget has a number of detection mechanisms and should work out-of-the-box with
most…&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/zyedidia/eget" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h4&gt;
  
  
  zyedidia/micro
&lt;/h4&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/zyedidia" rel="noopener noreferrer"&gt;
        zyedidia
      &lt;/a&gt; / &lt;a href="https://github.com/zyedidia/micro" rel="noopener noreferrer"&gt;
        micro
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A modern and intuitive terminal-based text editor
    &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 rel="noopener noreferrer" href="https://github.com/zyedidia/micro/./assets/micro-logo-drop.svg"&gt;&lt;img alt="micro logo" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fzyedidia%2Fmicro%2F.%2Fassets%2Fmicro-logo-drop.svg" width="500px"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/zyedidia/micro/actions/workflows/test.yaml/badge.svg"&gt;&lt;img src="https://github.com/zyedidia/micro/actions/workflows/test.yaml/badge.svg" alt="Test Workflow"&gt;&lt;/a&gt;
&lt;a href="https://goreportcard.com/report/github.com/zyedidia/micro/v2" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/fbb98bcab296ec5c0c9e1b78c720814ef127643a0bb01ba3b6f973452987274c/68747470733a2f2f676f7265706f7274636172642e636f6d2f62616467652f6769746875622e636f6d2f7a796564696469612f6d6963726f2f7632" alt="Go Report Card"&gt;&lt;/a&gt;
&lt;a href="https://github.com/zyedidia/micro/releases" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/0b074d53e130cb3bddfceb5c51c72ad6c86d812ae77b362fb2ce84567d8bab75/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f72656c656173652f7a796564696469612f6d6963726f2e7376673f6c6162656c3d52656c65617365" alt="Release"&gt;&lt;/a&gt;
&lt;a href="https://github.com/zyedidia/micro/blob/master/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/6581c31c16c1b13ddc2efb92e2ad69a93ddc4a92fd871ff15d401c4c6c9155a4/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d626c75652e737667" alt="MIT License"&gt;&lt;/a&gt;
&lt;a href="https://gitter.im/zyedidia/micro?utm_source=badge&amp;amp;utm_medium=badge&amp;amp;utm_campaign=pr-badge&amp;amp;utm_content=badge" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/32fbefefe528f99e30cf48aa3a391e8d5f812f30070f122fc73eeaf5cb18be00/68747470733a2f2f6261646765732e6769747465722e696d2f7a796564696469612f6d6963726f2e737667" alt="Join the chat at https://gitter.im/zyedidia/micro"&gt;&lt;/a&gt;
&lt;a href="https://snapcraft.io/micro" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/eb5b98ef27870f515920fe59533b2d489d57e459d3c347bb047687c46b37c7f6/68747470733a2f2f736e617063726166742e696f2f6d6963726f2f62616467652e737667" alt="Snap Status"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;micro&lt;/strong&gt; is a terminal-based text editor that aims to be easy to use and intuitive, while also taking advantage of the capabilities
of modern terminals. It comes as a single, batteries-included, static binary with no dependencies; you can download and use it right now!&lt;/p&gt;
&lt;p&gt;As its name indicates, micro aims to be somewhat of a successor to the nano editor by being easy to install and use
It strives to be enjoyable as a full-time editor for people who prefer to work in a terminal, or those who regularly edit files over SSH.&lt;/p&gt;
&lt;p&gt;Here is a picture of micro editing its source code.&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/zyedidia/micro/./assets/micro-solarized.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fzyedidia%2Fmicro%2F.%2Fassets%2Fmicro-solarized.png" alt="Screenshot"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;To see more screenshots of micro, showcasing some of the default color schemes, see &lt;a href="https://micro-editor.github.io" rel="nofollow noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You can also check out the website for Micro at &lt;a href="https://micro-editor.github.io" rel="nofollow noopener noreferrer"&gt;https://micro-editor.github.io&lt;/a&gt;.&lt;/p&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;Easy to use and install.&lt;/li&gt;
&lt;li&gt;No dependencies or external files are needed — just the binary you can…&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/zyedidia/micro" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h4&gt;
  
  
  stedolan/jq
&lt;/h4&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/jqlang" rel="noopener noreferrer"&gt;
        jqlang
      &lt;/a&gt; / &lt;a href="https://github.com/jqlang/jq" rel="noopener noreferrer"&gt;
        jq
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Command-line JSON processor
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;jq&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;jq&lt;/code&gt; is a lightweight and flexible command-line JSON processor akin to &lt;code&gt;sed&lt;/code&gt;,&lt;code&gt;awk&lt;/code&gt;,&lt;code&gt;grep&lt;/code&gt;, and friends for JSON data. It's written in portable C and has zero runtime dependencies, allowing you to easily slice, filter, map, and transform structured data.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Documentation&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Official Documentation&lt;/strong&gt;: &lt;a href="https://jqlang.org" rel="nofollow noopener noreferrer"&gt;jqlang.org&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Try jq Online&lt;/strong&gt;: &lt;a href="https://play.jqlang.org" rel="nofollow noopener noreferrer"&gt;play.jqlang.org&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Installation&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Prebuilt Binaries&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Download the latest releases from the &lt;a href="https://github.com/jqlang/jq/releases" rel="noopener noreferrer"&gt;GitHub release page&lt;/a&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Docker Image&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Pull the &lt;a href="https://github.com/jqlang/jq/pkgs/container/jq" rel="noopener noreferrer"&gt;jq image&lt;/a&gt; to start quickly with Docker.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h4 class="heading-element"&gt;Run with Docker&lt;/h4&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h5 class="heading-element"&gt;Example: Extracting the version from a &lt;code&gt;package.json&lt;/code&gt; file&lt;/h5&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;docker run --rm -i ghcr.io/jqlang/jq:latest &lt;span class="pl-k"&gt;&amp;lt;&lt;/span&gt; package.json &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;'&lt;/span&gt;.version&lt;span class="pl-pds"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h5 class="heading-element"&gt;Example: Extracting the version from a &lt;code&gt;package.json&lt;/code&gt; file with a mounted volume&lt;/h5&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;docker run --rm -i -v &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;span class="pl-smi"&gt;$PWD&lt;/span&gt;:&lt;span class="pl-smi"&gt;$PWD&lt;/span&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt; -w &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;span class="pl-smi"&gt;$PWD&lt;/span&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt; ghcr.io/jqlang/jq:latest &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;'&lt;/span&gt;.version&lt;span class="pl-pds"&gt;'&lt;/span&gt;&lt;/span&gt; package.json&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Building from source&lt;/h3&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h4 class="heading-element"&gt;Dependencies&lt;/h4&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;libtool&lt;/li&gt;
&lt;li&gt;make&lt;/li&gt;
&lt;li&gt;automake&lt;/li&gt;
&lt;li&gt;autoconf&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h4 class="heading-element"&gt;Instructions&lt;/h4&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-text-shell-session notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c1"&gt;git submodule update --init    # if building from git to get&lt;/span&gt;&lt;/pre&gt;…
&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/jqlang/jq" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h4&gt;
  
  
  ggreer/the_silver_searcher (ag)
&lt;/h4&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/ggreer" rel="noopener noreferrer"&gt;
        ggreer
      &lt;/a&gt; / &lt;a href="https://github.com/ggreer/the_silver_searcher" rel="noopener noreferrer"&gt;
        the_silver_searcher
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A code-searching tool similar to ack, but faster.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;The Silver Searcher&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A code searching tool similar to &lt;code&gt;ack&lt;/code&gt;, with a focus on speed.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://travis-ci.org/ggreer/the_silver_searcher" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/671f3263dd37e4bbb7daebf518702e6b8775b20e8b30f63fae4afd1e32533701/68747470733a2f2f7472617669732d63692e6f72672f6767726565722f7468655f73696c7665725f73656172636865722e7376673f6272616e63683d6d6173746572" alt="Build Status"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://floobits.com/ggreer/ag/redirect" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/d353692add0eaa781dc6e485b8d7e93d79fa2d31ad24c369860cd9b8417f6dfd/68747470733a2f2f666c6f6f626974732e636f6d2f6767726565722f61672e737667" alt="Floobits Status"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://webchat.freenode.net/?channels=ag" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/4924da7e25e5cb4c53e5c0b9a4a140090b0b445d3c0db6354e96dfb1fca0e29f/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f467265656e6f64652d25323361672d627269676874677265656e2e737667" alt="#ag on Freenode"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Do you know C? Want to improve ag? &lt;a href="http://geoff.greer.fm/2014/10/13/help-me-get-to-ag-10/" rel="nofollow noopener noreferrer"&gt;I invite you to pair with me&lt;/a&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What's so great about Ag?&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;It is an order of magnitude faster than &lt;code&gt;ack&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;It ignores file patterns from your &lt;code&gt;.gitignore&lt;/code&gt; and &lt;code&gt;.hgignore&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;If there are files in your source repo you don't want to search, just add their patterns to a &lt;code&gt;.ignore&lt;/code&gt; file. (*cough* &lt;code&gt;*.min.js&lt;/code&gt; *cough*)&lt;/li&gt;
&lt;li&gt;The command name is 33% shorter than &lt;code&gt;ack&lt;/code&gt;, and all keys are on the home row!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ag is quite stable now. Most changes are new features, minor bug fixes, or performance improvements. It's much faster than Ack in my benchmarks:&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;ack test_blah ~/code/  104.66s user 4.82s system 99% cpu 1:50.03 total

ag test_blah ~/code/  4.67s user 4.58s system 286% cpu 3.227 total
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ack and Ag found the same…&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/ggreer/the_silver_searcher" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h4&gt;
  
  
  chmln/sd
&lt;/h4&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/chmln" rel="noopener noreferrer"&gt;
        chmln
      &lt;/a&gt; / &lt;a href="https://github.com/chmln/sd" rel="noopener noreferrer"&gt;
        sd
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Intuitive find &amp;amp; replace CLI (sed alternative)
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;sd - &lt;code&gt;s&lt;/code&gt;earch &amp;amp; &lt;code&gt;d&lt;/code&gt;isplace&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;sd&lt;/code&gt; is an intuitive find &amp;amp; replace CLI.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;The Pitch&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Why use it over any existing tools?&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Painless regular expressions.&lt;/em&gt;   &lt;code&gt;sd&lt;/code&gt; uses regex syntax that you already know from JavaScript and Python. Forget about dealing with quirks of &lt;code&gt;sed&lt;/code&gt; or &lt;code&gt;awk&lt;/code&gt; - get productive immediately.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;String-literal mode.&lt;/em&gt;   Non-regex find &amp;amp; replace. No more backslashes or remembering which characters are special and need to be escaped.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Easy to read, easy to write.&lt;/em&gt;   Find &amp;amp; replace expressions are split up, which makes them easy to read and write. No more messing with unclosed and escaped slashes.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Smart, common-sense defaults.&lt;/em&gt;   Defaults follow common sense and are tailored for typical daily use.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Comparison to sed&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;While sed does a whole lot more, sd focuses on doing just one thing and doing it well. Here are some cherry-picked examples where sd shines.&lt;/p&gt;
&lt;p&gt;Simpler syntax for replacing all occurrences:&lt;/p&gt;
&lt;ul&gt;&lt;li&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/chmln/sd" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h4&gt;
  
  
  sharkdp/bat
&lt;/h4&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/sharkdp" rel="noopener noreferrer"&gt;
        sharkdp
      &lt;/a&gt; / &lt;a href="https://github.com/sharkdp/bat" rel="noopener noreferrer"&gt;
        bat
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A cat(1) clone with wings.
    &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 rel="noopener noreferrer" href="https://github.com/sharkdp/bat/doc/logo-header.svg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fsharkdp%2Fbat%2Fdoc%2Flogo-header.svg" alt="bat - a cat clone with wings"&gt;&lt;/a&gt;&lt;br&gt;
  &lt;a href="https://github.com/sharkdp/bat/actions?query=workflow%3ACICD" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/sharkdp/bat/workflows/CICD/badge.svg" alt="Build Status"&gt;&lt;/a&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/b98ad4c1ad5d45c3db1f6c9c7cf661697d40ead67b2edc6f00580da600d38099/68747470733a2f2f696d672e736869656c64732e696f2f6372617465732f6c2f6261742e737667"&gt;&lt;img src="https://camo.githubusercontent.com/b98ad4c1ad5d45c3db1f6c9c7cf661697d40ead67b2edc6f00580da600d38099/68747470733a2f2f696d672e736869656c64732e696f2f6372617465732f6c2f6261742e737667" alt="license"&gt;&lt;/a&gt;
  &lt;a href="https://crates.io/crates/bat" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/f1890bc7fd1e2c8b70eb84883757888d5844bd76a01d2d135ee4799338d437db/68747470733a2f2f696d672e736869656c64732e696f2f6372617465732f762f6261742e7376673f636f6c6f72423d333139653863" alt="Version info"&gt;&lt;/a&gt;&lt;br&gt;
  A &lt;i&gt;cat(1)&lt;/i&gt; clone with syntax highlighting and Git integration
&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://github.com/sharkdp/bat#syntax-highlighting" rel="noopener noreferrer"&gt;Key Features&lt;/a&gt; •
  &lt;a href="https://github.com/sharkdp/bat#how-to-use" rel="noopener noreferrer"&gt;How To Use&lt;/a&gt; •
  &lt;a href="https://github.com/sharkdp/bat#installation" rel="noopener noreferrer"&gt;Installation&lt;/a&gt; •
  &lt;a href="https://github.com/sharkdp/bat#customization" rel="noopener noreferrer"&gt;Customization&lt;/a&gt; •
  &lt;a href="https://github.com/sharkdp/bat#project-goals-and-alternatives" rel="noopener noreferrer"&gt;Project goals, alternatives&lt;/a&gt;&lt;br&gt;
  [English]
  [&lt;a href="https://github.com/sharkdp/bat/doc/README-zh.md" rel="noopener noreferrer"&gt;中文&lt;/a&gt;]
  [&lt;a href="https://github.com/sharkdp/bat/doc/README-ja.md" rel="noopener noreferrer"&gt;日本語&lt;/a&gt;]
  [&lt;a href="https://github.com/sharkdp/bat/doc/README-ko.md" rel="noopener noreferrer"&gt;한국어&lt;/a&gt;]
  [&lt;a href="https://github.com/sharkdp/bat/doc/README-ru.md" rel="noopener noreferrer"&gt;Русский&lt;/a&gt;]
&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Sponsors&lt;/h3&gt;
&lt;/div&gt;

&lt;p&gt;A special &lt;em&gt;thank you&lt;/em&gt; goes to our biggest &lt;a href="https://github.com/sharkdp/bat/doc/sponsors.md" rel="noopener noreferrer"&gt;sponsors&lt;/a&gt;:&lt;br&gt;&lt;/p&gt;

&lt;p&gt;
&lt;a href="https://www.warp.dev/bat" rel="nofollow 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%2Fgithub.com%2Fsharkdp%2Fbat%2Fdoc%2Fsponsors%2Fwarp-logo.png" width="200" alt="Warp"&gt;
  &lt;br&gt;
  &lt;strong&gt;Warp, the intelligent terminal&lt;/strong&gt;
  &lt;br&gt;
  Available on MacOS, Linux, Windows
&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;a href="https://graphite.dev/?utm_source=github&amp;amp;utm_medium=repo&amp;amp;utm_campaign=bat" rel="nofollow 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%2Fgithub.com%2Fsharkdp%2Fbat%2Fdoc%2Fsponsors%2Fgraphite-logo.jpeg" width="200" alt="Graphite"&gt;
  &lt;br&gt;
  &lt;strong&gt;Graphite is the AI developer productivity platform helping&lt;br&gt;teams on GitHub ship higher quality software, faster&lt;/strong&gt;
&lt;/a&gt;
&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Syntax highlighting&lt;/h3&gt;
&lt;/div&gt;

&lt;p&gt;&lt;code&gt;bat&lt;/code&gt; supports syntax highlighting for a large number of programming and markup
languages:&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/a9789c5200bdb0a22602643d7bf85f0f424ddd4259e763abc865609010c5e228/68747470733a2f2f696d6775722e636f6d2f724773646e44652e706e67"&gt;&lt;img src="https://camo.githubusercontent.com/a9789c5200bdb0a22602643d7bf85f0f424ddd4259e763abc865609010c5e228/68747470733a2f2f696d6775722e636f6d2f724773646e44652e706e67" alt="Syntax highlighting example"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Git integration&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;&lt;code&gt;bat&lt;/code&gt; communicates with &lt;code&gt;git&lt;/code&gt; to show modifications with respect to the index
(see left side bar):&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/43e40bf9c20d5ceda8fa67f1d95b5c66548b2f6f8dca8403e08129991cc32966/68747470733a2f2f692e696d6775722e636f6d2f326c53573452452e706e67"&gt;&lt;img src="https://camo.githubusercontent.com/43e40bf9c20d5ceda8fa67f1d95b5c66548b2f6f8dca8403e08129991cc32966/68747470733a2f2f692e696d6775722e636f6d2f326c53573452452e706e67" alt="Git integration example"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Show non-printable characters&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;You can use the &lt;code&gt;-A&lt;/code&gt;/&lt;code&gt;--show-all&lt;/code&gt; option to show and highlight non-printable
characters:&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/53fa5d4d298aafad2d5baf2312865d0fe5fb2a130bdc8e21d7f534f39f76e29b/68747470733a2f2f692e696d6775722e636f6d2f576e64477039482e706e67"&gt;&lt;img src="https://camo.githubusercontent.com/53fa5d4d298aafad2d5baf2312865d0fe5fb2a130bdc8e21d7f534f39f76e29b/68747470733a2f2f692e696d6775722e636f6d2f576e64477039482e706e67" alt="Non-printable character example"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Automatic paging&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;By default, &lt;code&gt;bat&lt;/code&gt; pipes its own output to a pager (e.g. &lt;code&gt;less&lt;/code&gt;) if the output is too large for one screen
If you would rather …&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/sharkdp/bat" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h4&gt;
  
  
  charmbracelet/mods
&lt;/h4&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/charmbracelet" rel="noopener noreferrer"&gt;
        charmbracelet
      &lt;/a&gt; / &lt;a href="https://github.com/charmbracelet/mods" rel="noopener noreferrer"&gt;
        mods
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      AI on the command line
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Mods&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;
    &lt;a rel="noopener noreferrer" href="https://private-user-images.githubusercontent.com/25087/237975607-5442bf46-b908-47af-bf4e-60f7c38951c4.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NjI1ODY1NjEsIm5iZiI6MTc2MjU4NjI2MSwicGF0aCI6Ii8yNTA4Ny8yMzc5NzU2MDctNTQ0MmJmNDYtYjkwOC00N2FmLWJmNGUtNjBmN2MzODk1MWM0LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTExMDglMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUxMTA4VDA3MTc0MVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTFiOTExNWFkZDEwZDczZWZmMDNiMGU2ZDA5OThkMGY2YzVjNjBmYTcwNTY1ZTA2MzMxNTA3ZjZjYmVjYWQ5NGQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.lBNwKgD3jURjHARlD619MVmm2DqpsrhG1d6MXEpn4lU"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprivate-user-images.githubusercontent.com%2F25087%2F237975607-5442bf46-b908-47af-bf4e-60f7c38951c4.png%3Fjwt%3DeyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NjI1ODY1NjEsIm5iZiI6MTc2MjU4NjI2MSwicGF0aCI6Ii8yNTA4Ny8yMzc5NzU2MDctNTQ0MmJmNDYtYjkwOC00N2FmLWJmNGUtNjBmN2MzODk1MWM0LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTExMDglMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUxMTA4VDA3MTc0MVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTFiOTExNWFkZDEwZDczZWZmMDNiMGU2ZDA5OThkMGY2YzVjNjBmYTcwNTY1ZTA2MzMxNTA3ZjZjYmVjYWQ5NGQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.lBNwKgD3jURjHARlD619MVmm2DqpsrhG1d6MXEpn4lU" width="630" alt="Mods product art and type treatment"&gt;&lt;/a&gt;
    &lt;br&gt;
    &lt;a href="https://github.com/charmbracelet/mods/releases" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/bfeaf67dac6e6a332598ab45010f238651dcf97a6315d462196294f6e01ac777/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f72656c656173652f636861726d62726163656c65742f6d6f64732e737667" alt="Latest Release"&gt;&lt;/a&gt;
    &lt;a href="https://github.com/charmbracelet/mods/actions" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/charmbracelet/mods/workflows/build/badge.svg" alt="Build Status"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;AI for the command line, built for pipelines.&lt;/p&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/f821f433e5d8643967ce22ad541c8959a8b6bd0f74f529c8a29da7263b18181e/68747470733a2f2f7668732e636861726d2e73682f7668732d3555796a305536486c7169314c5649495279594b4d352e676966"&gt;&lt;img src="https://camo.githubusercontent.com/f821f433e5d8643967ce22ad541c8959a8b6bd0f74f529c8a29da7263b18181e/68747470733a2f2f7668732e636861726d2e73682f7668732d3555796a305536486c7169314c5649495279594b4d352e676966" width="900" alt="a GIF of mods running"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Large Language Models (LLM) based AI is useful to ingest command output and
format results in Markdown, JSON, and other text based formats. Mods is a
tool to add a sprinkle of AI in your command line and make your pipelines
artificially intelligent.&lt;/p&gt;
&lt;p&gt;It works great with LLMs running locally through &lt;a href="https://github.com/go-skynet/LocalAI" rel="noopener noreferrer"&gt;LocalAI&lt;/a&gt;. You can also use
&lt;a href="https://platform.openai.com/account/api-keys" rel="nofollow noopener noreferrer"&gt;OpenAI&lt;/a&gt;, &lt;a href="https://dashboard.cohere.com/api-keys" rel="nofollow noopener noreferrer"&gt;Cohere&lt;/a&gt;, &lt;a href="https://console.groq.com/keys" rel="nofollow noopener noreferrer"&gt;Groq&lt;/a&gt;, or &lt;a href="https://azure.microsoft.com/en-us/products/cognitive-services/openai-service" rel="nofollow noopener noreferrer"&gt;Azure OpenAI&lt;/a&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Installation&lt;/h3&gt;
&lt;/div&gt;
&lt;p&gt;Use a package manager:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; macOS or Linux&lt;/span&gt;
brew install charmbracelet/tap/mods

&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Windows (with Winget)&lt;/span&gt;
winget install charmbracelet.mods

&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Arch Linux (btw)&lt;/span&gt;
yay -S mods

&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Nix&lt;/span&gt;
nix-shell -p mods&lt;/pre&gt;

&lt;/div&gt;

Debian/Ubuntu
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://repo.charm.sh/apt/gpg.key &lt;span class="pl-k"&gt;|&lt;/span&gt; sudo gpg --dearmor -o /etc/apt/keyrings/charm.gpg
&lt;span class="pl-c1"&gt;echo&lt;/span&gt; &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;deb [signed-by=/etc/apt/keyrings/charm.gpg] https://repo.charm.sh/apt/ * *&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt; &lt;span class="pl-k"&gt;|&lt;/span&gt; sudo tee /etc/apt/sources.list.d/charm.list
sudo apt update &lt;span class="pl-k"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo apt install mods&lt;/pre&gt;

&lt;/div&gt;


Fedora/RHEL
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c1"&gt;echo&lt;/span&gt; &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;'&lt;/span&gt;[charm]&lt;/span&gt;
&lt;span class="pl-s"&gt;name=Charm&lt;/span&gt;
&lt;span class="pl-s"&gt;baseurl=https://repo.charm.sh/yum/&lt;/span&gt;
&lt;span class="pl-s"&gt;enabled=1&lt;/span&gt;
&lt;span class="pl-s"&gt;gpgcheck=1&lt;/span&gt;
&lt;span class="pl-s"&gt;gpgkey=https://repo.charm.sh/yum/gpg.key&lt;/span&gt;&lt;/pre&gt;…
&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/charmbracelet/mods" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Development
&lt;/h2&gt;

&lt;h4&gt;
  
  
  go-task/task
&lt;/h4&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/go-task" rel="noopener noreferrer"&gt;
        go-task
      &lt;/a&gt; / &lt;a href="https://github.com/go-task/task" rel="noopener noreferrer"&gt;
        task
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A task runner / simpler Make alternative written in Go
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div&gt;
  &lt;a href="https://taskfile.dev" rel="nofollow 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%2Fgithub.com%2Fgo-task%2Ftask%2Fwebsite%2Fsrc%2Fpublic%2Fimg%2Flogo.svg" width="200px" height="200px"&gt;
  &lt;/a&gt;
  &lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Task&lt;/h1&gt;

&lt;/div&gt;
  &lt;p&gt;
    Task is a task runner / build tool that aims to be simpler and easier to use than, for example, &lt;a href="https://www.gnu.org/software/make/" rel="nofollow noopener noreferrer"&gt;GNU Make&lt;/a&gt;.
  &lt;/p&gt;
  &lt;p&gt;
    &lt;a href="https://taskfile.dev/installation/" rel="nofollow noopener noreferrer"&gt;Installation&lt;/a&gt; | &lt;a href="https://taskfile.dev/usage/" rel="nofollow noopener noreferrer"&gt;Documentation&lt;/a&gt; | &lt;a href="https://twitter.com/taskfiledev" rel="nofollow noopener noreferrer"&gt;Twitter&lt;/a&gt; | &lt;a href="https://bsky.app/profile/taskfile.dev" rel="nofollow noopener noreferrer"&gt;Bluesky&lt;/a&gt; | &lt;a href="https://fosstodon.org/@task" rel="nofollow noopener noreferrer"&gt;Mastodon&lt;/a&gt; | &lt;a href="https://discord.gg/6TY36E39UK" rel="nofollow noopener noreferrer"&gt;Discord&lt;/a&gt;
  &lt;/p&gt;
  &lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Gold Sponsors&lt;/h1&gt;

&lt;/div&gt;
  &lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
    &lt;tbody&gt;
&lt;tr&gt;
      &lt;td&gt;
        &lt;a href="https://devowl.io" rel="nofollow 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%2Fgithub.com%2Fgo-task%2Ftask%2Fwebsite%2Fsrc%2Fpublic%2Fimg%2Fdevowl.io.svg" height="100px" width="200px" title="devowl.io"&gt;
        &lt;/a&gt;
      &lt;/td&gt;
      &lt;td&gt;
        &lt;a href="https://magic.dev/" rel="nofollow 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%2Fgithub.com%2Fgo-task%2Ftask%2Fwebsite%2Fsrc%2Fpublic%2Fimg%2Fmagic.png" height="100px" width="200px" title="Magic"&gt;
        &lt;/a&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/go-task/task" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;h4&gt;
  
  
  cli/cli
&lt;/h4&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/cli" rel="noopener noreferrer"&gt;
        cli
      &lt;/a&gt; / &lt;a href="https://github.com/cli/cli" rel="noopener noreferrer"&gt;
        cli
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      GitHub’s official command line tool
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;GitHub CLI&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;gh&lt;/code&gt; is GitHub on the command line. It brings pull requests, issues, and other GitHub concepts to the terminal next to where you are already working with &lt;code&gt;git&lt;/code&gt; and your code.&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://user-images.githubusercontent.com/98482/84171218-327e7a80-aa40-11ea-8cd1-5177fc2d0e72.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F98482%2F84171218-327e7a80-aa40-11ea-8cd1-5177fc2d0e72.png" alt="screenshot of gh pr status"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;GitHub CLI is supported for users on GitHub.com, GitHub Enterprise Cloud, and GitHub Enterprise Server 2.20+ with support for macOS, Windows, and Linux.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Documentation&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;For &lt;a href="https://github.com/cli/cli#installation" rel="noopener noreferrer"&gt;installation options see below&lt;/a&gt;, for usage instructions &lt;a href="https://cli.github.com/manual/" rel="noopener noreferrer"&gt;see the manual&lt;/a&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Contributing&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;If anything feels off or if you feel that some functionality is missing, please check out the &lt;a href="https://github.com/cli/cli/.github/CONTRIBUTING.md" rel="noopener noreferrer"&gt;contributing page&lt;/a&gt;. There you will find instructions for sharing your feedback, building the tool locally, and submitting pull requests to the project.&lt;/p&gt;
&lt;p&gt;If you are a hubber and are interested in shipping new commands for the CLI, check out our &lt;a href="https://github.com/cli/cli/docs/working-with-us.md" rel="noopener noreferrer"&gt;doc on internal contributions&lt;/a&gt;&lt;/p&gt;

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

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;&lt;a href="https://github.com/cli/cli/docs/install_macos.md" rel="noopener noreferrer"&gt;macOS&lt;/a&gt;&lt;/h3&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/cli/cli/docs/install_macos.md#homebrew" rel="noopener noreferrer"&gt;Homebrew&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/cli/cli/docs/install_macos.md#precompiled-binaries" rel="noopener noreferrer"&gt;Precompiled binaries&lt;/a&gt; on &lt;a href="https://github.com/cli/cli/releases/latest" rel="noopener noreferrer"&gt;releases page&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For additional macOS packages and installers, see &lt;a href="https://github.com/cli/cli/docs/install_macos.md#community-unofficial" rel="noopener noreferrer"&gt;community-supported docs&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;…&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/cli/cli" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h4&gt;
  
  
  boyter/scc
&lt;/h4&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/boyter" rel="noopener noreferrer"&gt;
        boyter
      &lt;/a&gt; / &lt;a href="https://github.com/boyter/scc" rel="noopener noreferrer"&gt;
        scc
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Sloc, Cloc and Code: scc is a very fast accurate code counter with complexity calculations and COCOMO estimates written in pure Go
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Sloc Cloc and Code (scc)&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/boyter/scc/./scc.jpg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fboyter%2Fscc%2F.%2Fscc.jpg" alt="SCC illustration"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A tool similar to cloc, sloccount and tokei. For counting the lines of code, blank lines, comment lines, and physical lines of source code in many programming languages.&lt;/p&gt;
&lt;p&gt;Goal is to be the fastest code counter possible, but also perform COCOMO calculation like sloccount, estimate code complexity similar to cyclomatic complexity calculators and produce unique lines of code or DRYness metrics. In short one tool to rule them all.&lt;/p&gt;
&lt;p&gt;Also it has a very short name which is easy to type &lt;code&gt;scc&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;If you don't like sloc cloc and code feel free to use the name &lt;code&gt;Succinct Code Counter&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/boyter/scc/actions/workflows/go.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/boyter/scc/actions/workflows/go.yml/badge.svg" alt="Go"&gt;&lt;/a&gt;
&lt;a href="https://goreportcard.com/report/github.com/boyter/scc" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/84fc1d58753029f812f5f4c86927720614233f8343b825691f93c44cf3d613f8/68747470733a2f2f676f7265706f7274636172642e636f6d2f62616467652f6769746875622e636f6d2f626f797465722f736363" alt="Go Report Card"&gt;&lt;/a&gt;
&lt;a href="https://coveralls.io/github/boyter/scc?branch=master" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/2ea2a40c233de03a1bd1ad386f785baf91f3dc23adc5364d4b769a60bb9d3e25/68747470733a2f2f636f766572616c6c732e696f2f7265706f732f6769746875622f626f797465722f7363632f62616467652e7376673f6272616e63683d6d6173746572" alt="Coverage Status"&gt;&lt;/a&gt;
&lt;a href="https://github.com/boyter/scc/" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/3dcd70ecff41ed21fcec0cecbc0f5a59d439324da9b709a68fcdee1564500078/68747470733a2f2f736c6f632e78797a2f6769746875622f626f797465722f7363632f" alt="Scc Count Badge"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/eb039c12ad6201e7193aff59675291e5d0fdc82a8d14f03ebc392c44e726d04a/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f646f776e6c6f6164732f626f797465722f7363632f746f74616c3f6c6162656c3d646f776e6c6f6164732532302532384748253239"&gt;&lt;img src="https://camo.githubusercontent.com/eb039c12ad6201e7193aff59675291e5d0fdc82a8d14f03ebc392c44e726d04a/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f646f776e6c6f6164732f626f797465722f7363632f746f74616c3f6c6162656c3d646f776e6c6f6164732532302532384748253239" alt="Scc count downloads"&gt;&lt;/a&gt;
&lt;a href="https://github.com/avelino/awesome-go" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/d8b2bde4796b67266f07c7a619f554c926ca4750d5d8861b4b740baaddc3fd1e/68747470733a2f2f617765736f6d652e72652f6d656e74696f6e65642d62616467652e737667" alt="Mentioned in Awesome Go"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Licensed under MIT licence.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Table of Contents&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/boyter/scc#install" rel="noopener noreferrer"&gt;Install&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/boyter/scc#background" rel="noopener noreferrer"&gt;Background&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/boyter/scc#pitch" rel="noopener noreferrer"&gt;Pitch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/boyter/scc#usage" rel="noopener noreferrer"&gt;Usage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/boyter/scc#complexity-estimates" rel="noopener noreferrer"&gt;Complexity Estimates&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/boyter/scc#unique-lines-of-code-uloc" rel="noopener noreferrer"&gt;Unique Lines of Code (ULOC)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/boyter/scc#cocomo" rel="noopener noreferrer"&gt;COCOMO&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/boyter/scc#output-formats" rel="noopener noreferrer"&gt;Output Formats&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/boyter/scc#performance" rel="noopener noreferrer"&gt;Performance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/boyter/scc#development" rel="noopener noreferrer"&gt;Development&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/boyter/scc#addingmodifying-languages" rel="noopener noreferrer"&gt;Adding/Modifying Languages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/boyter/scc#issues" rel="noopener noreferrer"&gt;Issues&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/boyter/scc#badges-beta" rel="noopener noreferrer"&gt;Badges (beta)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/boyter/scc/LANGUAGES.md" rel="noopener noreferrer"&gt;Language Support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/boyter/scc#citation" rel="noopener noreferrer"&gt;Citation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;scc for Teams &amp;amp; Enterprise&lt;/h3&gt;
&lt;/div&gt;
&lt;p&gt;While scc will always be a free and…&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/boyter/scc" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h4&gt;
  
  
  dandavison/delta
&lt;/h4&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/dandavison" rel="noopener noreferrer"&gt;
        dandavison
      &lt;/a&gt; / &lt;a href="https://github.com/dandavison/delta" rel="noopener noreferrer"&gt;
        delta
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A syntax-highlighting pager for git, diff, grep, and blame output
    &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 rel="noopener noreferrer nofollow" href="https://user-images.githubusercontent.com/52205/147996902-9829bd3f-cd33-466e-833e-49a6f3ebd623.png"&gt;&lt;img width="400px" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F52205%2F147996902-9829bd3f-cd33-466e-833e-49a6f3ebd623.png" alt="image"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://github.com/dandavison/delta/actions" rel="noopener noreferrer"&gt;
    &lt;img src="https://github.com/dandavison/delta/workflows/Continuous%20Integration/badge.svg" alt="CI"&gt;
  &lt;/a&gt;
  &lt;a href="https://coveralls.io/github/dandavison/delta?branch=main" rel="nofollow noopener noreferrer"&gt;
    &lt;img src="https://camo.githubusercontent.com/e8785ac8ede00f6ec8ad672e5031d27eb6eb5a599d56b232a469b9824f76753c/68747470733a2f2f636f766572616c6c732e696f2f7265706f732f6769746875622f64616e64617669736f6e2f64656c74612f62616467652e7376673f6272616e63683d6d61696e" alt="Coverage Status"&gt;
  &lt;/a&gt;
  &lt;a href="https://gitter.im/dandavison-delta/community?utm_source=badge&amp;amp;utm_medium=badge&amp;amp;utm_campaign=pr-badge" rel="nofollow noopener noreferrer"&gt;
    &lt;img src="https://camo.githubusercontent.com/6c92914f6e39c859372cd85d6c7676c73d524f994663f1ae0e2b0b566a0e1361/68747470733a2f2f6261646765732e6769747465722e696d2f64616e64617669736f6e2d64656c74612f636f6d6d756e6974792e737667" alt="Gitter"&gt;
  &lt;/a&gt;
&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://dandavison.github.io/delta/installation.html" rel="nofollow noopener noreferrer"&gt;Install it&lt;/a&gt; (the package is called "git-delta" in most package managers, but the executable is just &lt;code&gt;delta&lt;/code&gt;) and add this to your &lt;code&gt;~/.gitconfig&lt;/code&gt;:&lt;/p&gt;

&lt;div class="highlight highlight-source-gitconfig notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;[&lt;span class="pl-e"&gt;core&lt;/span&gt;]
    &lt;span class="pl-v"&gt;pager&lt;/span&gt; &lt;span class="pl-k"&gt;=&lt;/span&gt; &lt;span class="pl-s"&gt;delta&lt;/span&gt;

[&lt;span class="pl-e"&gt;interactive&lt;/span&gt;]
    &lt;span class="pl-v"&gt;diffFilter&lt;/span&gt; &lt;span class="pl-k"&gt;=&lt;/span&gt; &lt;span class="pl-s"&gt;delta&lt;/span&gt; &lt;span class="pl-s"&gt;--color-only&lt;/span&gt;

[&lt;span class="pl-e"&gt;delta&lt;/span&gt;]
    &lt;span class="pl-v"&gt;navigate&lt;/span&gt; &lt;span class="pl-k"&gt;=&lt;/span&gt; &lt;span class="pl-c1"&gt;true&lt;/span&gt;  &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; use n and N to move between diff sections&lt;/span&gt;
    &lt;span class="pl-v"&gt;dark&lt;/span&gt; &lt;span class="pl-k"&gt;=&lt;/span&gt; &lt;span class="pl-c1"&gt;true&lt;/span&gt;      &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; or light = true, or omit for auto-detection&lt;/span&gt;

[&lt;span class="pl-e"&gt;merge&lt;/span&gt;]
    &lt;span class="pl-v"&gt;conflictStyle&lt;/span&gt; &lt;span class="pl-k"&gt;=&lt;/span&gt; &lt;span class="pl-s"&gt;zdiff3&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Or run:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;git config --global core.pager delta
git config --global interactive.diffFilter &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;'&lt;/span&gt;delta --color-only&lt;span class="pl-pds"&gt;'&lt;/span&gt;&lt;/span&gt;
git config --global delta.navigate &lt;span class="pl-c1"&gt;true&lt;/span&gt;
git config --global merge.conflictStyle zdiff3&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Delta has many features and is very customizable; please see &lt;code&gt;delta -h&lt;/code&gt; (short help) or &lt;code&gt;delta --help&lt;/code&gt; (full manual), or the &lt;a href="https://dandavison.github.io/delta/" rel="nofollow noopener noreferrer"&gt;online user manual&lt;/a&gt;.&lt;/p&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;Language syntax highlighting with the same syntax-highlighting themes as &lt;a href="https://github.com/sharkdp/bat#readme" rel="noopener noreferrer"&gt;bat&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Word-level diff highlighting using a Levenshtein edit inference algorithm&lt;/li&gt;
&lt;li&gt;Side-by-side view with line-wrapping&lt;/li&gt;
&lt;li&gt;Line numbering&lt;/li&gt;
&lt;li&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/dandavison/delta" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h4&gt;
  
  
  nektos/act
&lt;/h4&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/nektos" rel="noopener noreferrer"&gt;
        nektos
      &lt;/a&gt; / &lt;a href="https://github.com/nektos/act" rel="noopener noreferrer"&gt;
        act
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Run your GitHub Actions locally 🚀
    &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 rel="noopener noreferrer nofollow" href="https://raw.githubusercontent.com/wiki/nektos/act/img/logo-150.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fwiki%2Fnektos%2Fact%2Fimg%2Flogo-150.png" alt="act-logo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Overview &lt;a href="https://github.com/nektos/act/actions" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/nektos/act/workflows/push/badge.svg?branch=master&amp;amp;event=push" alt="push"&gt;&lt;/a&gt; &lt;a href="https://goreportcard.com/report/github.com/nektos/act" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/85c19cff19fdfc01ef44040d70d947337c6951389cf37b80ebffb57da41295fb/68747470733a2f2f676f7265706f7274636172642e636f6d2f62616467652f6769746875622e636f6d2f6e656b746f732f616374" alt="Go Report Card"&gt;&lt;/a&gt; &lt;a href="https://github.com/jonico/awesome-runners" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/7e9d420a1f5da7c99ba3ca9120d4c58bb231036904bcfd89dab61f6f5c4514b1/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c69737465642532306f6e2d617765736f6d652d2d72756e6e6572732d626c75652e737667" alt="awesome-runners"&gt;&lt;/a&gt;
&lt;/h1&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;"Think globally, &lt;code&gt;act&lt;/code&gt; locally"&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Run your &lt;a href="https://developer.github.com/actions/" rel="noopener noreferrer"&gt;GitHub Actions&lt;/a&gt; locally! Why would you want to do this? Two reasons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fast Feedback&lt;/strong&gt; - Rather than having to commit/push every time you want to test out the changes you are making to your &lt;code&gt;.github/workflows/&lt;/code&gt; files (or for any changes to embedded GitHub actions), you can use &lt;code&gt;act&lt;/code&gt; to run the actions locally. The &lt;a href="https://help.github.com/en/actions/configuring-and-managing-workflows/using-environment-variables#default-environment-variables" rel="noopener noreferrer"&gt;environment variables&lt;/a&gt; and &lt;a href="https://help.github.com/en/actions/reference/virtual-environments-for-github-hosted-runners#filesystems-on-github-hosted-runners" rel="noopener noreferrer"&gt;filesystem&lt;/a&gt; are all configured to match what GitHub provides.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local Task Runner&lt;/strong&gt; - I love &lt;a href="https://en.wikipedia.org/wiki/Make_(software)" rel="nofollow noopener noreferrer"&gt;make&lt;/a&gt;. However, I also hate repeating myself. With &lt;code&gt;act&lt;/code&gt;, you can use the GitHub Actions defined in your &lt;code&gt;.github/workflows/&lt;/code&gt; to replace your &lt;code&gt;Makefile&lt;/code&gt;!&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-alert markdown-alert-tip"&gt;
&lt;p class="markdown-alert-title"&gt;Tip&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Now Manage and Run Act Directly From VS Code!&lt;/strong&gt;&lt;br&gt;
Check out the &lt;a href="https://sanjulaganepola.github.io/github-local-actions-docs/" rel="nofollow noopener noreferrer"&gt;GitHub Local Actions&lt;/a&gt; Visual Studio Code extension which allows you to leverage the power of &lt;code&gt;act&lt;/code&gt; to run and test workflows locally without leaving your editor.&lt;/p&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;How Does It Work?&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;When you…&lt;/p&gt;
&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/nektos/act" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;h4&gt;
  
  
  caarlos0/svu
&lt;/h4&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/caarlos0" rel="noopener noreferrer"&gt;
        caarlos0
      &lt;/a&gt; / &lt;a href="https://github.com/caarlos0/svu" rel="noopener noreferrer"&gt;
        svu
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      semantic version utility
    &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 rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/2b570f337a8af3f768459cf08cc7d23f78a5412c5c70a89bf02c439f4cf4bfad/68747470733a2f2f6265636b65722e736f6674776172652f7376752e706e67"&gt;&lt;img alt="svu Logo" src="https://camo.githubusercontent.com/2b570f337a8af3f768459cf08cc7d23f78a5412c5c70a89bf02c439f4cf4bfad/68747470733a2f2f6265636b65722e736f6674776172652f7376752e706e67" height="300"&gt;&lt;/a&gt;
  &lt;/p&gt;
&lt;p&gt;semantic version utility&lt;/p&gt;

&lt;p&gt;
&lt;a href="https://github.com/caarlos0/svu/releases/latest" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/019281cbfeb606b4879a78bfb4c47f9fe6a433be8f34d6865adec0ac9214fed3/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f72656c656173652f636161726c6f73302f7376752e7376673f7374796c653d666f722d7468652d6261646765" alt="Release"&gt;&lt;/a&gt;
&lt;a href="https://github.com/LICENSE.md" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/717657d9145eb10a5f11359aa64ff599bb3bf4d04802ca06b3ee8f49d020411a/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d627269676874677265656e2e7376673f7374796c653d666f722d7468652d6261646765" alt="Software License"&gt;&lt;/a&gt;
&lt;a href="https://github.com/caarlos0/svu/actions?workflow=build" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/5147020b90529ede62aee345675bd341757e5116968dad1534d06d5098b8b806/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f636161726c6f73302f7376752f6275696c642e796d6c3f7374796c653d666f722d7468652d6261646765266272616e63683d6d61696e" alt="Build status"&gt;&lt;/a&gt;
&lt;a href="http://godoc.org/github.com/caarlos0/svu/v3" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/20f1b468c3fd4ff7b538e4833f3d04e658b3a71882c501291ea8b18035502686/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f676f646f632d7265666572656e63652d626c75652e7376673f7374796c653d666f722d7468652d6261646765" alt="Go Doc"&gt;&lt;/a&gt;
&lt;a href="https://goreportcard.com/report/github.com/caarlos0/svu/v3" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/11c5e77e9df8b3c7089ad4a6f5a39b099726f12ccfa304d38111137ba1125325/68747470733a2f2f676f7265706f7274636172642e636f6d2f62616467652f6769746875622e636f6d2f636161726c6f73302f7376752f76333f7374796c653d666f722d7468652d6261646765" alt="GoReportCard"&gt;&lt;/a&gt;
&lt;a href="https://conventionalcommits.org" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/006fb2214bbcfbd1c249d7a62fe5f740b6dcdffcab8643f94dbff0e0237c2d6a/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f436f6e76656e74696f6e616c253230436f6d6d6974732d312e302e302d79656c6c6f772e7376673f7374796c653d666f722d7468652d6261646765" alt="Conventional Commits"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;semantic version utility (svu) is a small helper for release scripts and workflows.&lt;/p&gt;

&lt;p&gt;It provides utility commands and functions to increase specific portions of the version
It can also figure the next version out automatically by looking through the git history.&lt;/p&gt;
&lt;div class="markdown-alert markdown-alert-tip"&gt;
&lt;p class="markdown-alert-title"&gt;Tip&lt;/p&gt;
&lt;p&gt;Read &lt;a href="https://semver.org" rel="nofollow noopener noreferrer"&gt;the spec&lt;/a&gt; for more information.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;usage&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Check &lt;code&gt;svu --help&lt;/code&gt; for the list of sub-commands and flags.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;
&lt;code&gt;next&lt;/code&gt;, &lt;code&gt;n&lt;/code&gt;
&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;This is probably the command you'll use the most.&lt;/p&gt;
&lt;p&gt;It checks your &lt;code&gt;git log&lt;/code&gt;, and automatically increases and returns the new
version based on this table:&lt;/p&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Commit message&lt;/th&gt;
&lt;th&gt;Tag increase&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;chore: foo&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Nothing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fix: fixed something&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Patch&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;feat: added new button to do X&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Minor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;fix: fixed thing xyz&lt;/code&gt;&lt;br&gt;&lt;br&gt;&lt;code&gt;BREAKING CHANGE: this will break users because of blah&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Major&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fix!: fixed something&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Major&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;feat!: added blah&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Major&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div class="markdown-alert markdown-alert-tip"&gt;
&lt;p class="markdown-alert-title"&gt;Tip&lt;/p&gt;
&lt;p&gt;You can create an alias to create tags automatically:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c1"&gt;alias&lt;/span&gt; gtn=&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;'&lt;/span&gt;git tag $(svu next)&lt;/span&gt;&lt;/pre&gt;…
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/caarlos0/svu" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h4&gt;
  
  
  permafrost-dev/stackup
&lt;/h4&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/permafrost-dev" rel="noopener noreferrer"&gt;
        permafrost-dev
      &lt;/a&gt; / &lt;a href="https://github.com/permafrost-dev/stackup" rel="noopener noreferrer"&gt;
        stackup
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      a single application to spin up your entire dev stack.
    &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 rel="noopener noreferrer" href="https://github.com/permafrost-dev/stackup/assets/stackup-app-512px.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fpermafrost-dev%2Fstackup%2Fassets%2Fstackup-app-512px.png" alt="logo" height="150"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;StackUp&lt;/h1&gt;
&lt;/div&gt;




&lt;p&gt;Spin up your entire dev stack with one command.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;StackUp&lt;/code&gt; offers many features and advanced functionality. Here are some of the highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Define tasks that run on startup, shutdown, or on a schedule.&lt;/li&gt;
&lt;li&gt;Customize tasks and preconditions using javascript.&lt;/li&gt;
&lt;li&gt;Run tasks on a cron schedule, i.e. running &lt;code&gt;php artisan schedule:run&lt;/code&gt; once every minute.&lt;/li&gt;
&lt;li&gt;Load remote configurations via http or S3.&lt;/li&gt;
&lt;li&gt;Fast in-memory cache skips http requests when possible.&lt;/li&gt;
&lt;li&gt;Http request gateway prevents unwanted access to remote urls, domains and content types.&lt;/li&gt;
&lt;li&gt;Send notifications with Telegram and Slack integrations.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Table of Contents&lt;/h2&gt;
&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/permafrost-dev/stackup#stackup" rel="noopener noreferrer"&gt;StackUp&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/permafrost-dev/stackup#table-of-contents" rel="noopener noreferrer"&gt;Table of Contents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/permafrost-dev/stackup#about" rel="noopener noreferrer"&gt;About&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/permafrost-dev/stackup#running-stackup" rel="noopener noreferrer"&gt;Running StackUp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/permafrost-dev/stackup#configuration" rel="noopener noreferrer"&gt;Configuration&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/permafrost-dev/stackup#configuration-settings" rel="noopener noreferrer"&gt;Configuration: Settings&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/permafrost-dev/stackup#configuration-settings-gateway" rel="noopener noreferrer"&gt;Configuration: Settings: Gateway&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/permafrost-dev/stackup#configuration-settings-domains" rel="noopener noreferrer"&gt;Configuration: Settings: Domains&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/permafrost-dev/stackup#configuration-settings-notifications" rel="noopener noreferrer"&gt;Configuration: Settings: Notifications&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/permafrost-dev/stackup#configuration-settings-notifications-telegram" rel="noopener noreferrer"&gt;Configuration: Settings: Notifications: Telegram&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/permafrost-dev/stackup#configuration-settings-notifications-slack" rel="noopener noreferrer"&gt;Configuration: Settings: Notifications: Slack&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;a href="https://github.com/permafrost-dev/stackup#configuration-environment-variables" rel="noopener noreferrer"&gt;Configuration: Environment Variables&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href="https://github.com/permafrost-dev/stackup#configuration-includes" rel="noopener noreferrer"&gt;Configuration: Includes&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href="https://github.com/permafrost-dev/stackup#configuration-preconditions" rel="noopener noreferrer"&gt;Configuration: Preconditions&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href="https://github.com/permafrost-dev/stackup#configuration-tasks" rel="noopener noreferrer"&gt;Configuration: Tasks&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href="https://github.com/permafrost-dev/stackup#configuration-startup--shutdown" rel="noopener noreferrer"&gt;Configuration: Startup &amp;amp; Shutdown&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href="https://github.com/permafrost-dev/stackup#configuration-servers" rel="noopener noreferrer"&gt;Configuration: Servers&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href="https://github.com/permafrost-dev/stackup#configuration-scheduler" rel="noopener noreferrer"&gt;Configuration: Scheduler&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href="https://github.com/permafrost-dev/stackup#example-configurations" rel="noopener noreferrer"&gt;Example Configurations&lt;/a&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;

&lt;a href="https://github.com/permafrost-dev/stackup#integrations" rel="noopener noreferrer"&gt;Integrations&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/permafrost-dev/stackup#integration-dotenv-vault" rel="noopener noreferrer"&gt;Integration: dotenv-vault&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/permafrost-dev/stackup#integration-telegram-notifications" rel="noopener noreferrer"&gt;Integration: Telegram Notifications&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/permafrost-dev/stackup#integration-slack-notifications" rel="noopener noreferrer"&gt;Integration: Slack Notifications&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/permafrost-dev/stackup#integration-desktop-notifications" rel="noopener noreferrer"&gt;Integration: Desktop Notifications&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;…&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;/ul&gt;
&lt;/div&gt;
&lt;br&gt;
  &lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/permafrost-dev/stackup" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;h4&gt;
  
  
  google/yamlfmt
&lt;/h4&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/google" rel="noopener noreferrer"&gt;
        google
      &lt;/a&gt; / &lt;a href="https://github.com/google/yamlfmt" rel="noopener noreferrer"&gt;
        yamlfmt
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      An extensible command line tool or library to format yaml files.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;yamlfmt&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code&gt;yamlfmt&lt;/code&gt; is an extensible command line tool or library to format yaml files.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Goals&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Create a command line yaml formatting tool that is easy to distribute (single binary)&lt;/li&gt;
&lt;li&gt;Make it simple to extend with new custom formatters&lt;/li&gt;
&lt;li&gt;Enable alternative use as a library, providing a foundation for users to create a tool that meets specific needs&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Maintainers&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;This tool is not yet officially supported by Google. It is currently maintained solely by @braydonk, and unless something changes primarily in spare time.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Blog&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;I'm going to use these links to GitHub Discussions as a blog of sorts, until I can set up something more proper:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;yamlfmt's recent slow development &lt;a href="https://github.com/google/yamlfmt/discussions/149" rel="noopener noreferrer"&gt;#149&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Issues related to the yaml.v3 library &lt;a href="https://github.com/google/yamlfmt/discussions/148" rel="noopener noreferrer"&gt;#148&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Installation&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;To download the &lt;code&gt;yamlfmt&lt;/code&gt; command, you can download the desired binary from releases or install the module directly:&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;go install github.com/google/yamlfmt/cmd/yamlfmt@latest
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This currently requires Go version 1.21 or greater.&lt;/p&gt;
&lt;p&gt;NOTE: Recommended setup…&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/google/yamlfmt" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h4&gt;
  
  
  watchexec/watchexec
&lt;/h4&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/watchexec" rel="noopener noreferrer"&gt;
        watchexec
      &lt;/a&gt; / &lt;a href="https://github.com/watchexec/watchexec" rel="noopener noreferrer"&gt;
        watchexec
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Executes commands in response to file modifications
    &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://github.com/watchexec/watchexec/actions/workflows/tests.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/watchexec/watchexec/actions/workflows/tests.yml/badge.svg" alt="CI status on main branch"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Watchexec&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Software development often involves running the same commands over and over. Boring!&lt;/p&gt;
&lt;p&gt;&lt;code&gt;watchexec&lt;/code&gt; is a simple, standalone tool that watches a path and runs a command whenever it detects modifications.&lt;/p&gt;
&lt;p&gt;Example use cases:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Automatically run unit tests&lt;/li&gt;
&lt;li&gt;Run linters/syntax checkers&lt;/li&gt;
&lt;li&gt;Rebuild artifacts&lt;/li&gt;
&lt;/ul&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;Simple invocation and use, does not require a cryptic command line involving &lt;code&gt;xargs&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Runs on OS X, Linux, and Windows&lt;/li&gt;
&lt;li&gt;Monitors current directory and all subdirectories for changes&lt;/li&gt;
&lt;li&gt;Coalesces multiple filesystem events into one, for editors that use swap/backup files during saving&lt;/li&gt;
&lt;li&gt;Loads &lt;code&gt;.gitignore&lt;/code&gt; and &lt;code&gt;.ignore&lt;/code&gt; files&lt;/li&gt;
&lt;li&gt;Uses process groups to keep hold of forking programs&lt;/li&gt;
&lt;li&gt;Provides the paths that changed in environment variables or STDIN&lt;/li&gt;
&lt;li&gt;Does not require a language runtime, not tied to any particular language or ecosystem&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/watchexec/watchexec/./crates/cli/#features" rel="noopener noreferrer"&gt;And more!&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Quick start&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Watch all JavaScript, CSS and HTML files in the current directory and all subdirectories for changes, running &lt;code&gt;npm run build&lt;/code&gt; when a…&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/watchexec/watchexec" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Linting
&lt;/h2&gt;

&lt;h4&gt;
  
  
  golangci/golangci-lint
&lt;/h4&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/golangci" rel="noopener noreferrer"&gt;
        golangci
      &lt;/a&gt; / &lt;a href="https://github.com/golangci/golangci-lint" rel="noopener noreferrer"&gt;
        golangci-lint
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Fast linters runner for Go
    &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 rel="noopener noreferrer" href="https://github.com/golangci/golangci-lint/assets/go.png"&gt;&lt;img alt="golangci-lint logo" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fgolangci%2Fgolangci-lint%2Fassets%2Fgo.png" height="150"&gt;&lt;/a&gt;
  &lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;golangci-lint&lt;/h3&gt;

&lt;/div&gt;
  &lt;p&gt;Fast linters runner for Go&lt;/p&gt;


&lt;p&gt;&lt;code&gt;golangci-lint&lt;/code&gt; is a fast Go linters runner.&lt;/p&gt;
&lt;p&gt;It runs linters in parallel, uses caching, supports YAML configuration,
integrates with all major IDEs, and includes over a hundred linters.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Install &lt;code&gt;golangci-lint&lt;/code&gt;
&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://golangci-lint.run/docs/welcome/install/#local-installation" rel="nofollow noopener noreferrer"&gt;On my machine&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://golangci-lint.run/docs/welcome/install/#ci-installation" rel="nofollow noopener noreferrer"&gt;On CI/CD systems&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Documentation&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Documentation is hosted at &lt;a href="https://golangci-lint.run" rel="nofollow noopener noreferrer"&gt;https://golangci-lint.run&lt;/a&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Social Networks&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;&lt;a href="https://gophers.slack.com/archives/CS0TBRKPC" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/a55b84f7a65fb9fe2e7fccae0f33aaa0d5b306dde2d2d196e45aa806a8f114e1/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f536c61636b2d3432383546343f6c6f676f3d736c61636b266c6f676f436f6c6f723d7768697465" alt="Join Slack"&gt;&lt;/a&gt;
&lt;a href="https://fosstodon.org/@golangcilint" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/e92dd473985f15c4648cbc519763b58e67f9ea91721f4b6ab07918c66ae4e5b8/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4d6173746f646f6e2d3633363446463f6c6f676f3d6d6173746f646f6e266c6f676f436f6c6f723d7768697465" alt="Follow on Mastodon"&gt;&lt;/a&gt;
&lt;a href="https://bsky.app/profile/golangci-lint.run" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/1b397d66fda76dae5f92255b8fce85dfeedc5bd7a4a5b3ddca0ba5c8b9e27049/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f426c7565736b792d3061376166663f6c6f676f3d626c7565736b79266c6f676f436f6c6f723d7768697465" alt="Follow on Bluesky"&gt;&lt;/a&gt;
&lt;a href="https://twitter.com/golangci" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/6f470bafa5924e79d4ef13306cc4587647afcfbb8a21d1be263c667a5984624d/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f547769747465722d3144413146323f6c6f676f3d78266c6f676f436f6c6f723d7768697465" alt="Follow on Twitter"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Support Us&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;&lt;code&gt;golangci-lint&lt;/code&gt; is a free and open-source project built by volunteers.&lt;/p&gt;
&lt;p&gt;If you value it, consider supporting us, we appreciate it! ❤️&lt;/p&gt;
&lt;p&gt;&lt;a href="https://donate.golangci.org" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/a498d9b0881f7ad7b02feaee6b3b08dbb54c9909e145584407275b05f534f92c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f537570706f72742d676f6c616e6763695f6c696e742d626c75653f7374796c653d666f722d7468652d6261646765" alt="Golangci-lint"&gt;&lt;/a&gt;
&lt;a href="https://golangci-lint.run/docs/product/thanks/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/984dd9203e7111b28d13e72b20c4a2b79d17205a9f65ca9f0d43625cfe80e382/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f537570706f72742d4c696e7465725f417574686f72732d626c75653f7374796c653d666f722d7468652d6261646765" alt="Linter Authors"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Badges&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/golangci/golangci-lint/workflows/CI/badge.svg"&gt;&lt;img src="https://github.com/golangci/golangci-lint/workflows/CI/badge.svg" alt="Build Status"&gt;&lt;/a&gt;
&lt;a href="https://github.com/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/5a7a50da2f45d6f05afe8f30ac6d783052ac440063ea624af77b84a65874ab9a/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f676f6c616e6763692f676f6c616e6763692d6c696e74" alt="License"&gt;&lt;/a&gt;
&lt;a href="https://github.com/golangci/golangci-lint/releases/latest" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/7a5a96f73cc6e68524ce19802889b3f3c8e940bbdf0144e139656332def25a69/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f72656c656173652f676f6c616e6763692f676f6c616e6763692d6c696e742e737667" alt="Release"&gt;&lt;/a&gt;
&lt;a href="https://hub.docker.com/r/golangci/golangci-lint" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/135e1db289ec077caad6c1b6260725aa43d6f44a662fb1763868845529859e03/68747470733a2f2f696d672e736869656c64732e696f2f646f636b65722f70756c6c732f676f6c616e6763692f676f6c616e6763692d6c696e74" alt="Docker"&gt;&lt;/a&gt;
&lt;a href="https://somsubhra.github.io/github-release-stats/?username=golangci&amp;amp;repository=golangci-lint" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/d2dfe3c95da9c137650ffc91baaa7ae516aa7bd58a8a72086603afbc6c95a88f/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f646f776e6c6f6164732f676f6c616e6763692f676f6c616e6763692d6c696e742f746f74616c2e7376673f6c6f676f3d676974687562" alt="GitHub Releases Stats of golangci-lint"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Contributors&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;This project exists thanks to all the people who contribute. &lt;a href="https://golangci-lint.run/docs/contributing/" rel="nofollow noopener noreferrer"&gt;How to contribute&lt;/a&gt;.&lt;/p&gt;
&lt;a href="https://github.com/golangci/golangci-lint/graphs/contributors" rel="noopener noreferrer"&gt;
  &lt;img src="https://camo.githubusercontent.com/2faf49759399515512d98b105947a800200cac9ecf4dead0aad48be909b1c06c/68747470733a2f2f6f70656e636f6c6c6563746976652e636f6d2f676f6c616e6763692d6c696e742f636f6e7472696275746f72732e7376673f77696474683d38393026627574746f6e3d66616c736526736b69703d676f6c616e6763696465762c434c41617373697374616e742c72656e6f766174652c666f737361626f742c676f6c616e676369626f742c6b6f7274736368616b2c676f6c616e6763692d72656c65617365722c646570656e6461626f74253542626f74253544"&gt;
&lt;/a&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Sponsors&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;
  &lt;a href="https://www.jetbrains.com/go/?utm_source=OSS&amp;amp;utm_medium=referral&amp;amp;utm_campaign=golangci" rel="nofollow noopener noreferrer"&gt;
    
      
      
      &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fgolangci%2Fgolangci-lint%2Fassets%2Fgoland.svg" class="article-body-image-wrapper"&gt;&lt;img alt="The complete IDE crafted for professional Go developers." src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fgolangci%2Fgolangci-lint%2Fassets%2Fgoland.svg" width="150"&gt;&lt;/a&gt;
    
  &lt;/a&gt;
&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Stargazers over time&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;&lt;a href="https://starchart.cc/golangci/golangci-lint" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/518c2abde9fff46362caab95af34e396af03e00fe5a0feda3c7a77772494281a/68747470733a2f2f7374617263686172742e63632f676f6c616e6763692f676f6c616e6763692d6c696e742e7376673f76617269616e743d6164617074697665" alt="Stargazers over time"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;/div&gt;
&lt;br&gt;
&lt;br&gt;
  &lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/golangci/golangci-lint" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;h4&gt;
  
  
  dotenv-linter/dotenv-linter
&lt;/h4&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/dotenv-linter" rel="noopener noreferrer"&gt;
        dotenv-linter
      &lt;/a&gt; / &lt;a href="https://github.com/dotenv-linter/dotenv-linter" rel="noopener noreferrer"&gt;
        dotenv-linter
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      ⚡️Lightning-fast linter for .env files. Written in Rust 🦀
    &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://github.com/dotenv-linter/dotenv-linter" rel="noopener noreferrer"&gt;
    &lt;img alt="dotenv-linter" width="350" height="192" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fdotenv-linter%2Fdotenv-linter%2Fmaster%2Flogo.svg%3Fsanitize%3Dtrue"&gt;
  &lt;/a&gt;
&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;
⚡️Lightning-fast linter for &lt;code&gt;.env&lt;/code&gt; files. Written in Rust 🦀
&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;
  &lt;a href="https://github.com/dotenv-linter/dotenv-linter/actions" rel="noopener noreferrer"&gt;
    &lt;img alt="GitHub Actions" src="https://github.com/dotenv-linter/dotenv-linter/workflows/CI/badge.svg"&gt;
  &lt;/a&gt;
  &lt;a href="https://codecov.io/gh/dotenv-linter/dotenv-linter" rel="nofollow noopener noreferrer"&gt;
    &lt;img alt="Coverage Status" src="https://camo.githubusercontent.com/0bab21e2b15631531def0daba9b26302ef6b76da003d58caa6b6c8d57edf09de/68747470733a2f2f636f6465636f762e696f2f67682f646f74656e762d6c696e7465722f646f74656e762d6c696e7465722f6272616e63682f6d61737465722f67726170682f62616467652e737667"&gt;
  &lt;/a&gt;
  &lt;a href="https://github.com/dotenv-linter/dotenv-linter/blob/master/LICENSE" rel="noopener noreferrer"&gt;
    &lt;img alt="License" src="https://camo.githubusercontent.com/92eb5b6a616c0e1cba2ed214b3fd9eed0213723b0bfe6496f5aac2d4c52b4f48/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f646f74656e762d6c696e7465722f646f74656e762d6c696e746572"&gt;
  &lt;/a&gt;
  &lt;a href="https://github.com/dotenv-linter/dotenv-linter/releases" rel="noopener noreferrer"&gt;
    &lt;img alt="Releases" src="https://camo.githubusercontent.com/fb7c0658744a0515c73f4aa11786b1bc89d61c958773301a4603af7a99ada362/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f72656c656173652f646f74656e762d6c696e7465722f646f74656e762d6c696e746572"&gt;
  &lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;dotenv-linter&lt;/code&gt; can &lt;strong&gt;&lt;a href="https://github.com/dotenv-linter/dotenv-linter#-check" rel="noopener noreferrer"&gt;check&lt;/a&gt;&lt;/strong&gt; / &lt;strong&gt;&lt;a href="https://github.com/dotenv-linter/dotenv-linter#-fix" rel="noopener noreferrer"&gt;fix&lt;/a&gt;&lt;/strong&gt; / &lt;strong&gt;&lt;a href="https://github.com/dotenv-linter/dotenv-linter#-diff" rel="noopener noreferrer"&gt;diff&lt;/a&gt;&lt;/strong&gt; &lt;code&gt;.env&lt;/code&gt; files for problems that may
cause the application to malfunction.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Available checks&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;
    ✅ &lt;a href="https://dotenv-linter.github.io/#/checks/duplicated_key" rel="nofollow noopener noreferrer"&gt;Duplicated key&lt;/a&gt;&lt;br&gt;
    ✅ &lt;a href="https://dotenv-linter.github.io/#/checks/ending_blank_line" rel="nofollow noopener noreferrer"&gt;Ending blank line&lt;/a&gt;&lt;br&gt;
    ✅ &lt;a href="https://dotenv-linter.github.io/#/checks/extra_blank_line" rel="nofollow noopener noreferrer"&gt;Extra blank line&lt;/a&gt;&lt;br&gt;
    ✅ &lt;a href="https://dotenv-linter.github.io/#/checks/incorrect_delimiter" rel="nofollow noopener noreferrer"&gt;Incorrect delimiter&lt;/a&gt;&lt;br&gt;
    ✅ &lt;a href="https://dotenv-linter.github.io/#/checks/key_without_value" rel="nofollow noopener noreferrer"&gt;Key without value&lt;/a&gt;&lt;br&gt;
    ✅ &lt;a href="https://dotenv-linter.github.io/#/checks/leading_character" rel="nofollow noopener noreferrer"&gt;Leading character&lt;/a&gt;&lt;br&gt;
    ✅ &lt;a href="https://dotenv-linter.github.io/#/checks/lowercase_key" rel="nofollow noopener noreferrer"&gt;Lowercase key&lt;/a&gt;&lt;br&gt;
    ✅ &lt;a href="https://dotenv-linter.github.io/#/checks/quote_character" rel="nofollow noopener noreferrer"&gt;Quote character&lt;/a&gt;&lt;br&gt;
    ✅ &lt;a href="https://dotenv-linter.github.io/#/checks/schema_violation" rel="nofollow noopener noreferrer"&gt;Schema violation&lt;/a&gt;&lt;br&gt;
    ✅ &lt;a href="https://dotenv-linter.github.io/#/checks/space_character" rel="nofollow noopener noreferrer"&gt;Space character&lt;/a&gt;&lt;br&gt;
    ✅ &lt;a href="https://dotenv-linter.github.io/#/checks/substitution_key" rel="nofollow noopener noreferrer"&gt;Substitution key&lt;/a&gt;&lt;br&gt;
    ✅ &lt;a href="https://dotenv-linter.github.io/#/checks/trailing_whitespace" rel="nofollow noopener noreferrer"&gt;Trailing whitespace&lt;/a&gt;&lt;br&gt;
    ✅ &lt;a href="https://dotenv-linter.github.io/#/checks/unordered_key" rel="nofollow noopener noreferrer"&gt;Unordered key&lt;/a&gt;&lt;br&gt;
    ✅ &lt;a href="https://dotenv-linter.github.io/#/checks/value_without_quotes" rel="nofollow noopener noreferrer"&gt;Value without quotes&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is a &lt;code&gt;.env&lt;/code&gt; file?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;
    💡 A &lt;code&gt;.env&lt;/code&gt; file or &lt;code&gt;dotenv&lt;/code&gt; file is a simple text file containing all the environment variables of a project.&lt;br&gt;     Storing &lt;a href="https://12factor.net/config" rel="nofollow noopener noreferrer"&gt;configuration in the environment variables&lt;/a&gt; is one of the tenets of the &lt;a href="https://12factor.net" rel="nofollow noopener noreferrer"&gt;Manifesto of Twelve-Factor App&lt;/a&gt;.&lt;br&gt;
    The &lt;code&gt;.env&lt;/code&gt; file has a simple key-value format, for example: &lt;code&gt;FOO=BAR&lt;/code&gt;.&lt;br&gt;
    More information you can find in articles in &lt;a href="https://evrone.com/dotenv-linter?utm_source=github&amp;amp;utm_campaign=dotenv-linter" rel="nofollow noopener noreferrer"&gt;English&lt;/a&gt; and &lt;a href="https://www.mgrachev.com/2020/04/20/dotenv-linter" rel="nofollow noopener noreferrer"&gt;Russian&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The key features&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;
    ⚡️ Lightning-fast because…&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/dotenv-linter/dotenv-linter" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h4&gt;
  
  
  rhysd/actionlint
&lt;/h4&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/rhysd" rel="noopener noreferrer"&gt;
        rhysd
      &lt;/a&gt; / &lt;a href="https://github.com/rhysd/actionlint" rel="noopener noreferrer"&gt;
        actionlint
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      :octocat: Static checker for GitHub Actions workflow files
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;actionlint&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://github.com/rhysd/actionlint/actions/workflows/ci.yaml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/rhysd/actionlint/actions/workflows/ci.yaml/badge.svg" alt="CI Status"&gt;&lt;/a&gt;
&lt;a href="https://pkg.go.dev/github.com/rhysd/actionlint" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/b51a57e73eda1a088b2711ed98685b8b9b6427b2eaf8f57ca271917d239d6006/68747470733a2f2f706b672e676f2e6465762f62616467652f6769746875622e636f6d2f72687973642f616374696f6e6c696e742e737667" alt="API Document"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/rhysd/actionlint" rel="noopener noreferrer"&gt;actionlint&lt;/a&gt; is a static checker for GitHub Actions workflow files. &lt;a href="https://rhysd.github.io/actionlint/" rel="nofollow noopener noreferrer"&gt;Try it online!&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Syntax check for workflow files&lt;/strong&gt; to check unexpected or missing keys following &lt;a href="https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions" rel="noopener noreferrer"&gt;workflow syntax&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strong type check for &lt;code&gt;${{ }}&lt;/code&gt; expressions&lt;/strong&gt; to catch several semantic errors like access to not existing property
type mismatches, ...&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Actions usage check&lt;/strong&gt; to check that inputs at &lt;code&gt;with:&lt;/code&gt; and outputs in &lt;code&gt;steps.{id}.outputs&lt;/code&gt; are correct&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reusable workflow check&lt;/strong&gt; to check inputs/outputs/secrets of reusable workflows and workflow calls&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/koalaman/shellcheck" rel="noopener noreferrer"&gt;shellcheck&lt;/a&gt; and &lt;a href="https://github.com/PyCQA/pyflakes" rel="noopener noreferrer"&gt;pyflakes&lt;/a&gt; integrations&lt;/strong&gt; for scripts at &lt;code&gt;run:&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security checks&lt;/strong&gt;; &lt;a href="https://docs.github.com/en/actions/reference/security/secure-use#good-practices-for-mitigating-script-injection-attacks" rel="noopener noreferrer"&gt;script injection&lt;/a&gt; by untrusted inputs, hard-coded credentials&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Other several useful checks&lt;/strong&gt;; &lt;a href="https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#filter-pattern-cheat-sheet" rel="noopener noreferrer"&gt;glob syntax&lt;/a&gt; validation, dependencies check for &lt;code&gt;needs:&lt;/code&gt;
runner label validation, cron syntax validation, ...&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;See the &lt;a href="https://github.com/rhysd/actionlint/blob/v1.7.8/docs/checks.md" rel="noopener noreferrer"&gt;full list&lt;/a&gt; of checks done by actionlint.&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/rhysd/ss/blob/master/actionlint/main.gif?raw=true"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Frhysd%2Fss%2Fraw%2Fmaster%2Factionlint%2Fmain.gif%3Fraw%3Dtrue" alt="actionlint reports 7 errors" width="806" height="492"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example of broken workflow:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight highlight-source-yaml notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-ent"&gt;on&lt;/span&gt;
  &lt;span class="pl-ent"&gt;push&lt;/span&gt;:
    &lt;span class="pl-ent"&gt;branch&lt;/span&gt;: &lt;span class="pl-s"&gt;main&lt;/span&gt;
    &lt;span class="pl-ent"&gt;tags&lt;/span&gt;:
      - &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;'&lt;/span&gt;v\d+&lt;span class="pl-pds"&gt;'&lt;/span&gt;&lt;/span&gt;
&lt;span class="pl-ent"&gt;jobs&lt;/span&gt;:
  &lt;span class="pl-ent"&gt;test&lt;/span&gt;:
    &lt;span class="pl-ent"&gt;strategy&lt;/span&gt;:
      &lt;span class="pl-ent"&gt;matrix&lt;/span&gt;:
        &lt;span class="pl-ent"&gt;os&lt;/span&gt;&lt;/pre&gt;…
&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/rhysd/actionlint" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h4&gt;
  
  
  hadolint/hadolint
&lt;/h4&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/hadolint" rel="noopener noreferrer"&gt;
        hadolint
      &lt;/a&gt; / &lt;a href="https://github.com/hadolint/hadolint" rel="noopener noreferrer"&gt;
        hadolint
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Dockerfile linter, validate inline bash, written in Haskell
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Haskell Dockerfile Linter&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://github.com/hadolint/hadolint/actions/workflows/haskell.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/hadolint/hadolint/actions/workflows/haskell.yml/badge.svg?branch=master" alt="Build Status"&gt;&lt;/a&gt;
&lt;a href="https://tldrlegal.com/l/gpl-3.0" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/b1c578d9e9305f0a9252eec8c26b3a9b027ba06640909fdb1a9f8c6ef9e20526/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d47504c2d2d332d626c75652e737667" alt="GPL-3 licensed"&gt;&lt;/a&gt;
&lt;a href="https://github.com/hadolint/hadolint/releases/latest" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/1459d7b7c9185abe5da0ff59d4fa3e0c5b3b0bd928792cdfb9f57c45309e277f/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f72656c656173652f6861646f6c696e742f6861646f6c696e742e737667" alt="GitHub release"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/b8f069af3c55cd01ef6cbf9f35b63e005cbd344d7be073c4e2e958fb57dd1ccb/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f646f776e6c6f6164732f6861646f6c696e742f6861646f6c696e742f746f74616c2e737667"&gt;&lt;img src="https://camo.githubusercontent.com/b8f069af3c55cd01ef6cbf9f35b63e005cbd344d7be073c4e2e958fb57dd1ccb/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f646f776e6c6f6164732f6861646f6c696e742f6861646f6c696e742f746f74616c2e737667" alt="GitHub downloads"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/398112f6d324eee5db0a0aee2606619188383195a2fd28a636e7162512db805b/68747470733a2f2f6861646f6c696e742e6769746875622e696f2f6861646f6c696e742f696d672f6361745f636f6e7461696e65722e706e67"&gt;&lt;img alt="pipecat" width="150" src="https://camo.githubusercontent.com/398112f6d324eee5db0a0aee2606619188383195a2fd28a636e7162512db805b/68747470733a2f2f6861646f6c696e742e6769746875622e696f2f6861646f6c696e742f696d672f6361745f636f6e7461696e65722e706e67"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A smarter Dockerfile linter that helps you build &lt;a href="https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices" rel="nofollow noopener noreferrer"&gt;best practice&lt;/a&gt; Docker
images. The linter parses the Dockerfile into an AST and performs rules on
top of the AST. It stands on the shoulders of &lt;a href="https://github.com/koalaman/shellcheck" rel="noopener noreferrer"&gt;ShellCheck&lt;/a&gt; to lint
the Bash code inside &lt;code&gt;RUN&lt;/code&gt; instructions.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://hadolint.github.io/hadolint" rel="nofollow noopener noreferrer"&gt;🌐 &lt;strong&gt;Check the online version on
hadolint.github.io/hadolint&lt;/strong&gt;&lt;/a&gt;
&lt;a href="https://hadolint.github.io/hadolint" rel="nofollow 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%2Fgithub.com%2Fhadolint%2Fhadolint%2Fscreenshot.png" alt="Screenshot"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Table of Contents&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/hadolint/hadolint#how-to-use" rel="noopener noreferrer"&gt;How to use&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/hadolint/hadolint#install" rel="noopener noreferrer"&gt;Install&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/hadolint/hadolint#cli" rel="noopener noreferrer"&gt;CLI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/hadolint/hadolint#configure" rel="noopener noreferrer"&gt;Configure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/hadolint/hadolint#non-posix-shells" rel="noopener noreferrer"&gt;Non-Posix Shells&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/hadolint/hadolint#ignoring-rules" rel="noopener noreferrer"&gt;Ignoring Rules&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/hadolint/hadolint#inline-ignores" rel="noopener noreferrer"&gt;Inline ignores&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/hadolint/hadolint#global-ignores" rel="noopener noreferrer"&gt;Global ignores&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/hadolint/hadolint#linting-labels" rel="noopener noreferrer"&gt;Linting Labels&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/hadolint/hadolint#note-on-dealing-with-variables-in-labels" rel="noopener noreferrer"&gt;Note on dealing with variables in labels&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/hadolint/hadolint#integrations" rel="noopener noreferrer"&gt;Integrations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/hadolint/hadolint#rules" rel="noopener noreferrer"&gt;Rules&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/hadolint/hadolint#develop" rel="noopener noreferrer"&gt;Develop&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/hadolint/hadolint#setup" rel="noopener noreferrer"&gt;Setup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/hadolint/hadolint#repl" rel="noopener noreferrer"&gt;REPL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/hadolint/hadolint#tests" rel="noopener noreferrer"&gt;Tests&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/hadolint/hadolint#ast" rel="noopener noreferrer"&gt;AST&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/hadolint/hadolint#building-against-custom-libraries" rel="noopener noreferrer"&gt;Building against custom libraries&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/hadolint/hadolint#alternatives" rel="noopener noreferrer"&gt;Alternatives&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;How to use&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;You can run &lt;code&gt;hadolint&lt;/code&gt; locally to lint your Dockerfile.&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;hadolint &lt;span class="pl-k"&gt;&amp;lt;&lt;/span&gt;Dockerfile&lt;span class="pl-k"&gt;&amp;gt;&lt;/span&gt;
hadolint --ignore DL3003 --ignore DL3006 &lt;span class="pl-k"&gt;&amp;lt;&lt;/span&gt;Dockerfile&lt;span class="pl-k"&gt;&amp;gt;&lt;/span&gt; &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; exclude specific rules&lt;/span&gt;
hadolint --trusted-registry my-company.com:500 &lt;span class="pl-k"&gt;&amp;lt;&lt;/span&gt;Dockerfile&lt;span class="pl-k"&gt;&amp;gt;&lt;/span&gt; &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Warn when using untrusted FROM images&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Docker comes to the rescue, providing an easy way how to run &lt;code&gt;hadolint&lt;/code&gt; on most
platforms
Just pipe…&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/hadolint/hadolint" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h4&gt;
  
  
  biomejs/biome
&lt;/h4&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/biomejs" rel="noopener noreferrer"&gt;
        biomejs
      &lt;/a&gt; / &lt;a href="https://github.com/biomejs/biome" rel="noopener noreferrer"&gt;
        biome
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A toolchain for web projects, aimed to provide functionalities to maintain them. Biome offers formatter and linter, usable via CLI and LSP.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div&gt;
  
    
    
    &lt;img alt="Shows the banner of Biome, with its logo and the phrase 'Biome - Toolchain of the web'." src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fbiomejs%2Fresources%2Fmain%2Fsvg%2Fslogan-light-transparent.svg" width="700"&gt;
  
  &lt;br&gt;
  &lt;br&gt;
&lt;p&gt;&lt;a href="https://github.com/biomejs/biome/actions/workflows/main.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/biomejs/biome/actions/workflows/main.yml/badge.svg" alt="CI on main"&gt;&lt;/a&gt;
&lt;a href="https://biomejs.dev/chat" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/69d77b38e9f28eaac176809aa47ae3e6c3f4154f6e37a8b240a785196612ccb1/68747470733a2f2f62616467656e2e6e65742f646973636f72642f6f6e6c696e652d6d656d626572732f427970573339673659633f69636f6e3d646973636f7264266c6162656c3d646973636f726426636f6c6f723d363061356661" alt="Discord chat"&gt;&lt;/a&gt;
&lt;a href="https://www.npmjs.com/package/@biomejs/biome/v/latest" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/0a82ad483c2dad0d12b254f3e7d52fd483f5ed9c608929f38fa7cd09007a8a5e/68747470733a2f2f62616467656e2e6e65742f6e706d2f762f4062696f6d656a732f62696f6d653f69636f6e3d6e706d26636f6c6f723d363061356661266c6162656c3d25343062696f6d656a7325324662696f6d65" alt="npm version"&gt;&lt;/a&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=biomejs.biome" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/385bb597419f613eac055f2ad2fe79f99553b1577f0c1c0e44018b2f43634b1c/68747470733a2f2f696d672e736869656c64732e696f2f76697375616c2d73747564696f2d6d61726b6574706c6163652f762f62696f6d656a732e62696f6d653f6c6162656c3d56697375616c25323053747564696f2532304d61726b6574706c616365266c6162656c436f6c6f723d33373431353126636f6c6f723d363061356661" alt="VSCode version"&gt;&lt;/a&gt;
&lt;a href="https://open-vsx.org/extension/biomejs/biome" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/a7431d2b726d7be95776f51c8673d75f8fb82e496671efd97b14590f9d230234/68747470733a2f2f696d672e736869656c64732e696f2f76697375616c2d73747564696f2d6d61726b6574706c6163652f762f62696f6d656a732e62696f6d653f6c6162656c3d4f70656e2532305653582532305265676973747279266c6f676f3d646174613a696d6167652f7376672b786d6c3b6261736536342c5044393462577767646d567963326c76626a30694d5334774969426c626d4e765a476c755a7a30696458526d4c546769507a344b50484e325a79423261575633516d3934505349304c6a59674e5341354e693479494445794d6934334969423462577875637a30696148523063446f764c336433647935334d793576636d63764d6a41774d43397a646d636950676f67494478775958526f49475139496b307a4d4341304e433479544455794c6a59674e5567334c6a4e36545451754e6941344f433431614451314c6a4e4d4d6a63754d6941304f533430656d30314d534177624449794c6a59674d7a6b754d6941794d6934324c544d354c6a4a364969426d615778735053496a597a45324d47566d4969382b4369416750484268644767675a443069545455794c6a59674e55777a4d4341304e433479614451314c6a4a36545449334c6a49674e446b754e4777794d69343349444d354c6a45674d6a49754e69307a4f533478656d30314d534177544455314c6a59674f4467754e5767304e533479656949675a6d6c7362443069493245324d47566c4e53497650676f384c334e325a7a343d266c6162656c436f6c6f723d33373431353126636f6c6f723d363061356661" alt="Open VSX version"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/biomejs/biome/blob/main/packages/%40biomejs/biome/README.hi.md" rel="noopener noreferrer"&gt;हिन्दी&lt;/a&gt; | English | &lt;a href="https://github.com/biomejs/biome/blob/main/packages/%40biomejs/biome/README.es.md" rel="noopener noreferrer"&gt;Español&lt;/a&gt; | &lt;a href="https://github.com/biomejs/biome/blob/main/packages/%40biomejs/biome/README.fr.md" rel="noopener noreferrer"&gt;Français&lt;/a&gt; | &lt;a href="https://github.com/biomejs/biome/blob/main/packages/%40biomejs/biome/README.zh-TW.md" rel="noopener noreferrer"&gt;繁體中文&lt;/a&gt; | &lt;a href="https://github.com/biomejs/biome/blob/main/packages/%40biomejs/biome/README.zh-CN.md" rel="noopener noreferrer"&gt;简体中文&lt;/a&gt; | &lt;a href="https://github.com/biomejs/biome/blob/main/packages/%40biomejs/biome/README.ja.md" rel="noopener noreferrer"&gt;日本語&lt;/a&gt; | &lt;a href="https://github.com/biomejs/biome/blob/main/packages/%40biomejs/biome/README.pl.md" rel="noopener noreferrer"&gt;Polski&lt;/a&gt; | &lt;a href="https://github.com/biomejs/biome/blob/main/packages/%40biomejs/biome/README.pt-BR.md" rel="noopener noreferrer"&gt;Português do Brasil&lt;/a&gt; | &lt;a href="https://github.com/biomejs/biome/blob/main/packages/%40biomejs/biome/README.kr.md" rel="noopener noreferrer"&gt;한국어&lt;/a&gt; | &lt;a href="https://github.com/biomejs/biome/blob/main/packages/%40biomejs/biome/README.ru.md" rel="noopener noreferrer"&gt;Русский&lt;/a&gt; | &lt;a href="https://github.com/biomejs/biome/blob/main/packages/%40biomejs/biome/README.uk.md" rel="noopener noreferrer"&gt;Українська&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;p&gt;&lt;strong&gt;Biome&lt;/strong&gt; is a performant toolchain for web projects, it aims to provide developer tools to maintain the health of said projects.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Biome is a &lt;a href="https://github.com/biomejs/biome/./benchmark#formatting" rel="noopener noreferrer"&gt;fast formatter&lt;/a&gt;&lt;/strong&gt; for &lt;em&gt;JavaScript&lt;/em&gt;, &lt;em&gt;TypeScript&lt;/em&gt;, &lt;em&gt;JSX&lt;/em&gt;, &lt;em&gt;JSON&lt;/em&gt;, &lt;em&gt;CSS&lt;/em&gt; and &lt;em&gt;GraphQL&lt;/em&gt; that scores &lt;strong&gt;&lt;a href="https://console.algora.io/challenges/prettier" rel="nofollow noopener noreferrer"&gt;97% compatibility with &lt;em&gt;Prettier&lt;/em&gt;&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Biome is a &lt;a href="https://github.com/biomejs/biome/tree/main/benchmark#linting" rel="noopener noreferrer"&gt;performant linter&lt;/a&gt;&lt;/strong&gt; for &lt;em&gt;JavaScript&lt;/em&gt;, &lt;em&gt;TypeScript&lt;/em&gt;, &lt;em&gt;JSX&lt;/em&gt;, &lt;em&gt;JSON&lt;/em&gt;, &lt;em&gt;CSS&lt;/em&gt;, and &lt;em&gt;GraphQL&lt;/em&gt; that features &lt;strong&gt;&lt;a href="https://biomejs.dev/linter/javascript/rules/" rel="nofollow noopener noreferrer"&gt;more than 340 rules&lt;/a&gt;&lt;/strong&gt; from ESLint, typescript-eslint, and &lt;a href="https://github.com/biomejs/biome/discussions/3" rel="noopener noreferrer"&gt;other sources&lt;/a&gt;
It &lt;strong&gt;outputs detailed and contextualized diagnostics&lt;/strong&gt; that help you to improve your code and become a better programmer!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Biome&lt;/strong&gt; is designed from the start to be used &lt;a href="https://biomejs.dev/guides/editors/first-party-extensions/" rel="nofollow noopener noreferrer"&gt;interactively within an editor&lt;/a&gt;
It can format and lint malformed code as you are writing it.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Installation&lt;/h3&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;npm install --save-dev --save-exact&lt;/pre&gt;…
&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/biomejs/biome" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


</description>
      <category>opensource</category>
      <category>productivity</category>
      <category>tooling</category>
      <category>github</category>
    </item>
    <item>
      <title>Navigating the Labyrinth: The Art of Reviewing Complex Codebases with tooling &amp; Generative AI</title>
      <dc:creator>Patrick Organ</dc:creator>
      <pubDate>Sun, 24 Sep 2023 17:44:11 +0000</pubDate>
      <link>https://dev.to/patinthehat/navigating-the-labyrinth-the-art-of-reviewing-large-complex-codebases-5ccf</link>
      <guid>https://dev.to/patinthehat/navigating-the-labyrinth-the-art-of-reviewing-large-complex-codebases-5ccf</guid>
      <description>&lt;p&gt;In the intricate world of software engineering, there's a unique challenge that often feels like deciphering an ancient manuscript: reviewing a colossal codebase. &lt;/p&gt;

&lt;p&gt;Imagine being handed the digital equivalent of Tolstoy's "War and Peace" and being told, "Find any inconsistencies or problems with this text; and by the way, it's written in the original Russian." A monumental task for sure, but with the right tools and techniques, it becomes an engaging puzzle waiting to be solved.&lt;/p&gt;

&lt;p&gt;Among the modern tools that have transformed this process is ChatGPT by OpenAI. This article will guide you through the multi-faceted journey of dissecting a vast codebase, and how ChatGPT, combined with manual efforts, can enhance your productivity to produce a professional, high-quality analysis report.&lt;/p&gt;

&lt;h2&gt;
  
  
  Diving Deep: The Manual Review
&lt;/h2&gt;

&lt;p&gt;Every great journey begins with a single step. In the case of codebase review, it starts with a manual examination. This is the phase where engineers immerse themselves in the code, line by line, understanding its structure, logic, and nuances. It's akin to reading a novel, where you get to know the characters (variables), follow the plot (logic), and occasionally stumble upon a twist (bugs).&lt;/p&gt;

&lt;h2&gt;
  
  
  Harnessing Code Search Tools with the magic of Predictive Analysis
&lt;/h2&gt;

&lt;p&gt;Once familiar with the general landscape, it's time to bring in the heavy machinery. Tools like &lt;code&gt;the silver searcher&lt;/code&gt; (or &lt;code&gt;ag&lt;/code&gt;) act as the magnifying glass, helping engineers zoom into specific sections, patterns, or anomalies in the code. Think of it as having a superpower that lets you instantly find any word or phrase in a vast library. It streamlines the process, making it more efficient and less prone to human oversight.&lt;/p&gt;

&lt;p&gt;One of the most intriguing ways ChatGPT was harnessed during the review process was in predictive analysis for code search. Instead of relying solely on traditional methods of searching for known issues or patterns, we used ChatGPT to generate potential strings or patterns that might yield interesting results. By feeding ChatGPT with context about the codebase, its purpose, and known vulnerabilities in similar projects, we were provided with a series of unique search strings that did indeed result in discovery of relevant issues.&lt;/p&gt;

&lt;p&gt;These AI-generated strings often led to discovering unconventional patterns, hidden redundancies, or even overlooked vulnerabilities. It was like having a seasoned detective whispering clues in the ear of an investigator, guiding them towards leads they might not have considered. This proactive approach, powered by ChatGPT, added an extra layer of depth to the review and made the experience much more enjoyable. &lt;/p&gt;

&lt;h2&gt;
  
  
  The Guardian at the Gates: Static Analysis with Snyk
&lt;/h2&gt;

&lt;p&gt;After the manual and search-assisted analysis, the code userwent a static analysis using Snyk's CLI. This is the secondary phase where the code is statically analyzed for vulnerabilities, security breaches, and potential threats. &lt;/p&gt;

&lt;p&gt;It's like having a sentinel that watches over a fortress, ensuring no intruders can breach the walls. Snyk's CLI provides a comprehensive report, highlighting areas that need attention and offering solutions to fortify the code.  It didn't catch everything, but when used in conjunction with other methods, it is a powerful tool in your code-review tool belt.&lt;/p&gt;

&lt;h2&gt;
  
  
  Crafting the Magnum Opus: Writing the Analysis Report
&lt;/h2&gt;

&lt;p&gt;Now, with a plethora of information and insights gathered, it's time to compile it all into a cohesive report. This is where ChatGPT shines. By feeding the model with our raw notes from the first round of analysis and our subsequent findings, it can generate a draft report in a coherent and structured manner. We utilized multi-shot prompting to refine the draft to match the desired tone and general content.&lt;/p&gt;

&lt;p&gt;However, the magic truly happens when the experience of a seasoned engineer meets the efficiency of AI. We refined the draft manually - adding insights, details, and expertise. &lt;/p&gt;

&lt;p&gt;The result? A comprehensive analysis report that's both precise and accessible, while striking the right tone based on the content of the report (scary and stern, professional and matter-of-fact, or professional-but-with-good-news).&lt;/p&gt;

&lt;p&gt;The synergy between ChatGPT and manual additions and edits ensures that the report is not just a bland collection of findings, but a well-crafted document that tells the story of the codebase, its strengths, its vulnerabilities, and remediation steps.  The important thing to note is that everything generated by AI is reviewed and re-reviewed by an engineer to ensure accuracy and appropriateness for the goal of the review.  Nothing written was allowed into the report unchecked.&lt;/p&gt;

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

&lt;p&gt;Reviewing a mammoth codebase is no small feat. It requires patience, expertise, and the right tools. While manual reviews lay the foundation, tools like 'the silver searcher' and Snyk's CLI enhance the process. &lt;/p&gt;

&lt;p&gt;When it comes to presenting the findings, the collaboration between ChatGPT and human expertise creates a report that's both insightful and engaging. In this modern age, the fusion of human intelligence and AI is truly revolutionizing the way we approach challenges in software engineering.&lt;/p&gt;

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

&lt;p&gt;Here are a few slightly modified prompts I used for the report generation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Read the following notes from a ruby application code audit 
that focuses on security, and write a report using a formal,
 serious, scary tone that can be presented to a client:
 &amp;lt;raw notes here&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;write a brief report in a few paragraphs that explains why 
the use of (technology) for (something) is a security risk,
 and expect that it will be provided to someone with limited
 technical knowledge; however, the report should sound
 serious enough to scare them appropriately as this is a
 serious matter. it should also include specifics, and some
 technical information as well.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;that was excellent. in exactly the same tone and style, 
add a section to the previous response that informs the
 client (the reader) that the source code also contains 
(a serious security issue), and why it is such an extreme
 security risk.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>tutorial</category>
      <category>codereview</category>
      <category>ai</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
