<?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: Shawon Saha</title>
    <description>The latest articles on DEV Community by Shawon Saha (@shawon).</description>
    <link>https://dev.to/shawon</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F399456%2F87b0cbaa-1502-4945-9e07-aa6ff80420c7.png</url>
      <title>DEV Community: Shawon Saha</title>
      <link>https://dev.to/shawon</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shawon"/>
    <language>en</language>
    <item>
      <title>Meet Ponytail: Putting the "Lazy Senior Dev" Inside Your AI Coding Agent</title>
      <dc:creator>Shawon Saha</dc:creator>
      <pubDate>Wed, 07 Oct 2026 16:27:53 +0000</pubDate>
      <link>https://dev.to/shawon/meet-ponytail-putting-the-lazy-senior-dev-inside-your-ai-coding-agent-occ</link>
      <guid>https://dev.to/shawon/meet-ponytail-putting-the-lazy-senior-dev-inside-your-ai-coding-agent-occ</guid>
      <description>&lt;p&gt;&lt;em&gt;You know him. Long hair tied back, wire-rimmed glasses, terminal background set to &lt;code&gt;#0e0d0b&lt;/code&gt;. He's been at the company longer than git. You bring him fifty lines of shiny architectural boilerplate; he looks at your screen, sighs, deletes forty-nine of them, and leaves one. It runs faster, never breaks, and requires zero maintenance.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Now imagine if your AI coding agent acted like him instead of an eager junior developer trying to impress everyone with Design Patterns™.&lt;/p&gt;

&lt;p&gt;That is the exact philosophy behind &lt;strong&gt;&lt;a href="https://ponytail.dev" rel="noopener noreferrer"&gt;Ponytail&lt;/a&gt;&lt;/strong&gt; (&lt;code&gt;DietrichGebert/ponytail&lt;/code&gt;), a ruleset and agent skill designed to stop LLMs from drowning codebases in unnecessary abstractions.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. The AI Over-Engineering Epidemic
&lt;/h2&gt;

&lt;p&gt;AI coding assistants are undeniably powerful, but they have a chronic habit: &lt;strong&gt;they love to write code&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;When you ask an agent to implement in-memory caching, what does it do?&lt;br&gt;
It builds a &lt;code&gt;CacheManager&lt;/code&gt; singleton with threading locks, TTL eviction queues, custom invalidation hooks, and a custom test suite. Fifty lines of code you now have to review, debug, and maintain forever.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# What typical agents write: 50 lines of boilerplate
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CacheManager&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ttl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;maxsize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_store&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_lock&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Lock&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_ttl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ttl&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="bp"&gt;...&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="bp"&gt;...&lt;/span&gt;
    &lt;span class="c1"&gt;# ...45 more lines you now own for life
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What did the task actually need?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# What Ponytail writes:
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;functools&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;lru_cache&lt;/span&gt;

&lt;span class="nd"&gt;@lru_cache&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;maxsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fetch_user_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="bp"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One line. Same behavior. Zero bugs in code that doesn't exist.&lt;/p&gt;

&lt;p&gt;Because LLMs are trained to maximize helpfulness and output tokens, they defaults to &lt;em&gt;creating&lt;/em&gt; rather than &lt;em&gt;conserving&lt;/em&gt;. Every line of code added is future tech debt, another surface area for regressions, and more tokens burned per interaction.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. The Core Philosophy: "The Ladder of Simplicity"
&lt;/h2&gt;

&lt;p&gt;Ponytail forces the agent through a strict decision tree before it types a single character:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[1] Does this need to exist? (Speculative need? Skip it. YAGNI.)
     ↓ No
[2] Already in this codebase? (Reuse existing utils &amp;amp; helpers.)
     ↓ No
[3] Does the standard library do it? (stdlib first: functools, pathlib, os, crypto.)
     ↓ No
[4] Does a native platform feature cover it? (&amp;lt;input type="date"&amp;gt; over a 10MB npm package.)
     ↓ No
[5] Does an already-installed dependency solve it? (Don't npm install another one.)
     ↓ No
[6] Can it be one line? (One line.)
     ↓ No
[7] Minimum code that works. (Never cut security, validation, or accessibility.)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ponytail stops at the &lt;strong&gt;first rung that holds&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Real Benchmarks: Less Code, Fewer Tokens, Same Safety
&lt;/h2&gt;

&lt;p&gt;Ponytail isn't just an aesthetic stance—the benchmark numbers across real-world FastAPI + React benchmark tasks speak for themselves:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Impact&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Lines of Code Written&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;-54%&lt;/strong&gt; (up to -94% on certain refactorings)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Token Consumption&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;-22%&lt;/strong&gt; fewer tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;API Cost&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;-20%&lt;/strong&gt; cheaper per session&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Generation Speed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;+27%&lt;/strong&gt; faster turnaround&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Safety Kept&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;100%&lt;/strong&gt; (Validation, error handling, security, and a11y are never cut)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Ponytail doesn't sacrifice security or edge-case handling. Input validation, error states, and accessibility remain intact—it simply refuses to construct speculative scaffolding.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Pick Your Laziness: Intensity Modes
&lt;/h2&gt;

&lt;p&gt;Ponytail comes with three distinct operational modes depending on how aggressive you want it to be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/ponytail lite | full | ultra | off
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;lite&lt;/code&gt;&lt;/strong&gt;: Builds what you asked for, but appends a single line pointing out the simpler, lazier alternative so you can choose.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;full&lt;/code&gt; (Default)&lt;/strong&gt;: Enforces the ladder strictly. Standard library and native features first, minimal diffs, zero speculative abstractions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;ultra&lt;/code&gt;&lt;/strong&gt;: &lt;em&gt;YAGNI extremist mode.&lt;/em&gt; Ships the absolute one-liner and openly questions why the ticket even exists in the first place. Use this when a codebase has wronged you personally.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  5. Built-In Workflow Commands
&lt;/h2&gt;

&lt;p&gt;Ponytail is more than a passive system prompt—it ships with a complete toolset for reviewing and auditing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/ponytail-review&lt;/code&gt;&lt;/strong&gt;: Runs a targeted code review on your git diff, hunting exclusively for bloat: unneeded dependencies, reinvented standard library functions, and dead flexibility.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/ponytail-audit&lt;/code&gt;&lt;/strong&gt;: Scans the entire repository to produce a ranked list of things to delete or replace with native alternatives.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/ponytail-debt&lt;/code&gt;&lt;/strong&gt;: Scans your codebase for all &lt;code&gt;# ponytail:&lt;/code&gt; deferral comments and compiles them into a tracked debt ledger so shortcuts don't get lost in the void.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/ponytail-gain&lt;/code&gt;&lt;/strong&gt;: Displays your aggregate benchmark impact scoreboard (tokens saved, diff reductions).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  6. How to Install Ponytail
&lt;/h2&gt;

&lt;p&gt;Ponytail works across &lt;strong&gt;20+ AI developer environments&lt;/strong&gt;:&lt;/p&gt;

&lt;h3&gt;
  
  
  Claude Code
&lt;/h3&gt;

&lt;p&gt;Run these two prompts in your session:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/plugin marketplace add DietrichGebert/ponytail
/plugin &lt;span class="nb"&gt;install &lt;/span&gt;ponytail@ponytail
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Gemini CLI / Antigravity CLI (&lt;code&gt;agy&lt;/code&gt;)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Gemini CLI&lt;/span&gt;
gemini extensions &lt;span class="nb"&gt;install &lt;/span&gt;https://github.com/DietrichGebert/ponytail

&lt;span class="c"&gt;# Antigravity CLI (agy)&lt;/span&gt;
agy plugin &lt;span class="nb"&gt;install &lt;/span&gt;https://github.com/DietrichGebert/ponytail
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  GitHub Copilot CLI &amp;amp; Codex
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# GitHub Copilot&lt;/span&gt;
copilot plugin marketplace add DietrichGebert/ponytail
copilot plugin &lt;span class="nb"&gt;install &lt;/span&gt;ponytail@ponytail

&lt;span class="c"&gt;# Codex&lt;/span&gt;
codex plugin marketplace add DietrichGebert/ponytail
codex plugin add ponytail@ponytail
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Cursor, Windsurf, OpenCode &amp;amp; Generic Agents
&lt;/h3&gt;

&lt;p&gt;Simply copy &lt;a href="https://github.com/DietrichGebert/ponytail/blob/main/AGENTS.md" rel="noopener noreferrer"&gt;&lt;code&gt;AGENTS.md&lt;/code&gt;&lt;/a&gt; or &lt;a href="https://github.com/DietrichGebert/ponytail/blob/main/skills/ponytail/SKILL.md" rel="noopener noreferrer"&gt;&lt;code&gt;skills/ponytail/SKILL.md&lt;/code&gt;&lt;/a&gt; into your repository's &lt;code&gt;.agents/rules/&lt;/code&gt; or rules directory.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts: The Best Code is the Code Never Written
&lt;/h2&gt;

&lt;p&gt;In an era where AI models can generate 500 lines of code in seconds, developer skill is no longer measured by how much code you can produce. It’s measured by your restraint—how much unnecessary complexity you can keep &lt;em&gt;out&lt;/em&gt; of your production systems.&lt;/p&gt;

&lt;p&gt;Give your AI agent a ponytail. It will say less, write less, and save your team from 3:00 AM on-call pages.&lt;/p&gt;

</description>
      <category>agentskills</category>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>How to Push and Sync Every Local Git Branch in a Single Terminal Command</title>
      <dc:creator>Shawon Saha</dc:creator>
      <pubDate>Tue, 06 Oct 2026 15:33:42 +0000</pubDate>
      <link>https://dev.to/shawon/how-to-push-and-sync-every-local-git-branch-in-a-single-terminal-command-7hc</link>
      <guid>https://dev.to/shawon/how-to-push-and-sync-every-local-git-branch-in-a-single-terminal-command-7hc</guid>
      <description>&lt;p&gt;When juggling multiple feature experiments, prototype branches, and quick hotfixes across a complex project, you often end up with a dozen local branches that haven't been pushed to GitHub. &lt;/p&gt;

&lt;p&gt;Running &lt;code&gt;git checkout &amp;lt;branch&amp;gt;&lt;/code&gt; followed by &lt;code&gt;git push -u origin &amp;lt;branch&amp;gt;&lt;/code&gt; for ten different branches is tedious and error-prone.&lt;/p&gt;

&lt;p&gt;Here is the exact &lt;strong&gt;one-line command&lt;/strong&gt; to sync every local branch, commit pending work, and set up upstream tracking automatically.&lt;/p&gt;




&lt;h2&gt;
  
  
  The TL;DR: The One-Liner
&lt;/h2&gt;

&lt;p&gt;If you just want the magic command to run in your terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git push &lt;span class="nt"&gt;--all&lt;/span&gt; origin &lt;span class="nt"&gt;-u&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  What This Does:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;git push&lt;/code&gt;&lt;/strong&gt;: Sends commits to the remote repository.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;--all&lt;/code&gt;&lt;/strong&gt;: Pushes &lt;strong&gt;every local branch&lt;/strong&gt; under &lt;code&gt;refs/heads/&lt;/code&gt;, not just the one currently checked out.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;origin&lt;/code&gt;&lt;/strong&gt;: The target remote repository.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;-u&lt;/code&gt; (or &lt;code&gt;--set-upstream&lt;/code&gt;)&lt;/strong&gt;: Configures each branch so future &lt;code&gt;git pull&lt;/code&gt; and &lt;code&gt;git push&lt;/code&gt; commands know their remote counterpart without extra arguments.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  What If You Have Uncommitted Changes Too?
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;git push --all origin -u&lt;/code&gt; only pushes commits that already exist. If you have uncommitted changes on your active branch and want a single command that &lt;strong&gt;stages, commits, and pushes everything&lt;/strong&gt;, chain it with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add &lt;span class="nt"&gt;-A&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"chore: sync all updates"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; git push &lt;span class="nt"&gt;--all&lt;/span&gt; origin &lt;span class="nt"&gt;-u&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;(If there are no uncommitted changes, the commit step will safely exit with a notice, so you can make it resilient by using &lt;code&gt;git diff-index --quiet HEAD || ...&lt;/code&gt;)&lt;/em&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Ultimate Automation: A Custom Git Alias
&lt;/h2&gt;

&lt;p&gt;Remembering long bash strings or typing them out repeatedly slows you down. Turn this into a native Git command by adding an alias:&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Add the Alias to Your Global Git Config
&lt;/h3&gt;

&lt;p&gt;Run this once in your terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git config &lt;span class="nt"&gt;--global&lt;/span&gt; alias.sync-all &lt;span class="s1"&gt;'!f() { \
  if ! git diff-index --quiet HEAD --; then \
    echo "Staging &amp;amp; committing local changes..."; \
    git add -A &amp;amp;&amp;amp; git commit -m "${1:-chore: sync all updates}"; \
  fi; \
  echo "Pushing all local branches and setting upstream..."; \
  git push --all origin -u; \
}; f'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Use It Anytime
&lt;/h3&gt;

&lt;p&gt;From any Git repository on your machine, simply run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git sync-all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or pass a custom commit message:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git sync-all &lt;span class="s2"&gt;"feat: sync experiments and docs"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  How It Works Under the Hood
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;code&gt;git push --all&lt;/code&gt; vs. standard &lt;code&gt;git push&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Standard &lt;code&gt;git push&lt;/code&gt; operates based on your &lt;code&gt;push.default&lt;/code&gt; setting (usually &lt;code&gt;simple&lt;/code&gt;), which only pushes the active branch. &lt;/p&gt;

&lt;p&gt;Using &lt;code&gt;--all&lt;/code&gt; instructs Git to match all local refs in &lt;code&gt;.git/refs/heads/&lt;/code&gt; and mirror them to the remote server under the same name:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;refs/heads/feature-a&lt;/code&gt; ➔ &lt;code&gt;refs/remotes/origin/feature-a&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;refs/heads/hotfix&lt;/code&gt; ➔ &lt;code&gt;refs/remotes/origin/hotfix&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Upstream Tracking (&lt;code&gt;-u&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;Without &lt;code&gt;-u&lt;/code&gt;, branches pushed via &lt;code&gt;--all&lt;/code&gt; may be pushed to GitHub, but your local repository might not associate them with &lt;code&gt;origin/&amp;lt;branch&amp;gt;&lt;/code&gt;. Adding &lt;code&gt;-u&lt;/code&gt; writes entries into &lt;code&gt;.git/config&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[branch "main-optimized-v2.1"]&lt;/span&gt;
    &lt;span class="py"&gt;remote&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;origin&lt;/span&gt;
    &lt;span class="py"&gt;merge&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;refs/heads/main-optimized-v2.1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This guarantees that running &lt;code&gt;git status&lt;/code&gt; on any branch will immediately show whether you are ahead or behind the remote.&lt;/p&gt;




&lt;h2&gt;
  
  
  Pro Tip: Pushing Tags Too
&lt;/h2&gt;

&lt;p&gt;If your workflow also relies on local git tags (such as release versions or milestones), &lt;code&gt;git push --all&lt;/code&gt; deliberately ignores tags. To push both branches and tags in one shot:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git push &lt;span class="nt"&gt;--all&lt;/span&gt; origin &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; git push &lt;span class="nt"&gt;--tags&lt;/span&gt; origin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Summary Cheat Sheet
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Push all local branches + link upstream&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;git push --all origin -u&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Commit active edits + push all branches&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;git add -A &amp;amp;&amp;amp; git commit -m "sync" &amp;amp;&amp;amp; git push --all origin -u&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Push everything including tags&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;git push --all origin -u &amp;amp;&amp;amp; git push --tags origin&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Permanent 1-word shortcut&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;git sync-all&lt;/code&gt; &lt;em&gt;(after configuring alias)&lt;/em&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>git</category>
      <category>github</category>
      <category>gitlab</category>
    </item>
    <item>
      <title>How to Generate Ultra-High-Resolution Video Contact Sheets with vcsi</title>
      <dc:creator>Shawon Saha</dc:creator>
      <pubDate>Tue, 29 Sep 2026 09:39:40 +0000</pubDate>
      <link>https://dev.to/shawon/how-to-generate-ultra-high-resolution-video-contact-sheets-with-vcsi-4731</link>
      <guid>https://dev.to/shawon/how-to-generate-ultra-high-resolution-video-contact-sheets-with-vcsi-4731</guid>
      <description>&lt;p&gt;Video contact sheets—also known as thumbnail preview grids—are the fastest way to inspect footage, catalog archival video libraries, or share visual overviews without streaming or transferring multi-gigabyte media files. While media players like VLC or MPC-HC can generate basic thumbnail sheets, they often output heavily compressed, low-resolution files where small details, motion blur, and sharp subtitles turn into muddy artifacts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;vcsi&lt;/strong&gt; (Video Contact Sheet Instruction) is a lightweight CLI utility powered by Python and FFmpeg that solves this issue. It allows you to produce crystal-clear, custom-dimensioned, publication-ready contact sheets directly from the command line.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Installation and Prerequisites
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;vcsi&lt;/code&gt; acts as a wrapper around FFmpeg and the Pillow imaging library. To run it on macOS or Linux, ensure you have FFmpeg and Python installed.&lt;/p&gt;

&lt;p&gt;On macOS using Homebrew:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install FFmpeg&lt;/span&gt;
brew &lt;span class="nb"&gt;install &lt;/span&gt;ffmpeg

&lt;span class="c"&gt;# Install vcsi via pip&lt;/span&gt;
pip3 &lt;span class="nb"&gt;install &lt;/span&gt;vcsi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On Ubuntu or Debian:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;ffmpeg python3-pip
pip3 &lt;span class="nb"&gt;install &lt;/span&gt;vcsi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once installed, verify the setup by running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vcsi &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  2. Generating Ultra-High-Resolution Sheets
&lt;/h2&gt;

&lt;p&gt;By default, &lt;code&gt;vcsi&lt;/code&gt; restricts image output to a fixed width of 1500 pixels. Across a 4×4 grid of a 4K file, each individual frame shrinks to roughly 375 pixels wide, losing fine textures. You can override this using either custom canvas scaling or true 1:1 pixel rendering.&lt;/p&gt;

&lt;h3&gt;
  
  
  Method A: Fixed 4K or 8K Canvas Output
&lt;/h3&gt;

&lt;p&gt;If you need uniform file dimensions for web uploads, image hosting, or documentation, explicitly specify the canvas width using &lt;code&gt;-w&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 4K preview sheet (3840px wide)&lt;/span&gt;
vcsi &lt;span class="s2"&gt;"source_video.mp4"&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; 4x4 &lt;span class="nt"&gt;-w&lt;/span&gt; 3840 &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="nt"&gt;--quality&lt;/span&gt; 100 &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="s2"&gt;"preview_4k.jpg"&lt;/span&gt;

&lt;span class="c"&gt;# 8K preview sheet (7680px wide)&lt;/span&gt;
vcsi &lt;span class="s2"&gt;"source_video.mp4"&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; 4x4 &lt;span class="nt"&gt;-w&lt;/span&gt; 7680 &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="nt"&gt;--quality&lt;/span&gt; 100 &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="s2"&gt;"preview_8k.jpg"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;-g 4x4&lt;/code&gt;&lt;/strong&gt;: Generates a grid with 4 columns and 4 rows (16 captures total).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;-w 3840&lt;/code&gt;&lt;/strong&gt;: Forces the horizontal canvas width to 3840 pixels while maintaining aspect ratio.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;-a&lt;/code&gt; / &lt;code&gt;--accurate&lt;/code&gt;&lt;/strong&gt;: Forces FFmpeg to decode exact target timestamps rather than snapping to the nearest I-frame, eliminating gray blocks and decoding artifacts on modern HEVC/AV1 footage.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;--quality 100&lt;/code&gt;&lt;/strong&gt;: Disables aggressive JPEG compression.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Method B: Native 1:1 Source Resolution
&lt;/h3&gt;

&lt;p&gt;For master archives, studio delivery, or high-fidelity technical reviews, use the &lt;code&gt;-S&lt;/code&gt; flag to bypass all scaling:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vcsi &lt;span class="s2"&gt;"source_video.mp4"&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; 3x4 &lt;span class="nt"&gt;-S&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; png &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="s2"&gt;"preview_native.png"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;-S&lt;/code&gt; / &lt;code&gt;--actual-size&lt;/code&gt;&lt;/strong&gt;: Each thumbnail inside the sheet renders at the native pixel resolution of the source video. A 3×4 grid of a 1080p source outputs an uncompressed composite over 5,700 pixels wide.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;-f png&lt;/code&gt;&lt;/strong&gt;: Employs lossless PNG output rather than lossy JPEG compression.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. Formatting Typography for Hi-DPI Displays
&lt;/h2&gt;

&lt;p&gt;When scaling canvas dimensions up to 4K or 8K, default headers and timestamp overlays will appear microscopic. &lt;code&gt;vcsi&lt;/code&gt; allows you to scale metadata typography independently to match higher resolutions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vcsi &lt;span class="s2"&gt;"source_video.mp4"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-g&lt;/span&gt; 4x4 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-w&lt;/span&gt; 3840 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--metadata-font-size&lt;/span&gt; 28 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--timestamp-font-size&lt;/span&gt; 22 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--timestamp-border-size&lt;/span&gt; 2 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--grid-spacing&lt;/span&gt; 12 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="s2"&gt;"preview_styled.jpg"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;--metadata-font-size&lt;/code&gt;&lt;/strong&gt;: Scales the top header block containing the filename, duration, audio/video codecs, and container details.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;--timestamp-font-size&lt;/code&gt;&lt;/strong&gt;: Enlarges the timecode stamped into the lower corner of each frame.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;--grid-spacing&lt;/code&gt;&lt;/strong&gt;: Adds padding (in pixels) between grid tiles to prevent adjacent frames from visually running together.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. Automating Batch Processing Across a Directory
&lt;/h2&gt;

&lt;p&gt;Generating contact sheets for an entire folder of video files takes just a standard shell loop:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/usr/bin/env bash&lt;/span&gt;

&lt;span class="c"&gt;# Loop through all MP4 and MKV files in the current folder&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;file &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt;.&lt;span class="o"&gt;{&lt;/span&gt;mp4,mkv&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="c"&gt;# Skip loop if no matching files exist&lt;/span&gt;
  &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$file&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="k"&gt;continue

  &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Processing: &lt;/span&gt;&lt;span class="nv"&gt;$file&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  vcsi &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$file&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-g&lt;/span&gt; 4x4 &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-w&lt;/span&gt; 3840 &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--metadata-font-size&lt;/span&gt; 26 &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--timestamp-font-size&lt;/span&gt; 20 &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;file&lt;/span&gt;&lt;span class="p"&gt;%.*&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;_contact_sheet.jpg"&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pairing &lt;code&gt;vcsi&lt;/code&gt; with FFmpeg delivers total control over video preview workflows, from single-frame precision to pixel-perfect high-DPI sheets that look razor-sharp on any monitor.&lt;/p&gt;

</description>
      <category>cli</category>
      <category>python</category>
      <category>tools</category>
    </item>
    <item>
      <title>How to Truly Full-Screen Window in macOS Stage Manager (Even with an External Keyboard!)</title>
      <dc:creator>Shawon Saha</dc:creator>
      <pubDate>Sat, 19 Sep 2026 09:20:30 +0000</pubDate>
      <link>https://dev.to/shawon/how-to-truly-full-screen-window-in-macos-stage-manager-even-with-an-external-keyboard-49d0</link>
      <guid>https://dev.to/shawon/how-to-truly-full-screen-window-in-macos-stage-manager-even-with-an-external-keyboard-49d0</guid>
      <description>&lt;p&gt;Have you ever settled in to work on your Mac, turned on Apple’s &lt;strong&gt;Stage Manager&lt;/strong&gt; to keep your desktop organized, and tried to maximize a window—only to watch macOS stubbornly leave a giant empty strip on the left side of your screen?&lt;/p&gt;

&lt;p&gt;If you use window-snapping apps like &lt;strong&gt;Rectangle&lt;/strong&gt;, you’ve likely noticed the problem: hitting your maximize shortcut expands the window, but it stops short by about 15% to 20%, reserving precious real estate for Stage Manager’s app thumbnails.&lt;/p&gt;

&lt;p&gt;Even worse, when you finally discover macOS’s built-in &lt;strong&gt;"Fill"&lt;/strong&gt; shortcut (&lt;code&gt;Fn + Control + F&lt;/code&gt;), it works like a dream on your MacBook keyboard—until you plug in a Bluetooth keyboard like the &lt;strong&gt;Logitech Pebble&lt;/strong&gt;, and suddenly &lt;strong&gt;nothing happens at all.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here is what is happening behind the scenes, why your external keyboard refuses to cooperate, and how to fix it in under two minutes.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. The Real Issue: "Full Screen" vs. "Fill"
&lt;/h2&gt;

&lt;p&gt;Before fixing the shortcut, it helps to understand how modern macOS treats window sizes:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;What It Does&lt;/th&gt;
&lt;th&gt;Stage Manager Impact&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Green Button / Full Screen&lt;/strong&gt; (&lt;code&gt;Control + Cmd + F&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Flings the app into a completely separate "Space" screen&lt;/td&gt;
&lt;td&gt;Hides Stage Manager and your other apps entirely&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Rectangle App Maximize&lt;/strong&gt; (Default)&lt;/td&gt;
&lt;td&gt;Expands the window within visible boundaries&lt;/td&gt;
&lt;td&gt;Leaves a 20% empty shelf on the side&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;macOS Native "Fill"&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Stretches the window &lt;strong&gt;edge-to-edge&lt;/strong&gt; on your current desktop&lt;/td&gt;
&lt;td&gt;Keeps Stage Manager active and auto-hides the shelf until you hover over it&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The &lt;strong&gt;Fill&lt;/strong&gt; command is what most people actually want: maximum screen space on the active desktop without isolating the app into its own virtual monitor space.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. The Mystery: Why &lt;code&gt;Fn + Control + F&lt;/code&gt; Breaks on External Keyboards
&lt;/h2&gt;

&lt;p&gt;On your MacBook’s built-in keyboard, pressing &lt;strong&gt;&lt;code&gt;Fn + Control + F&lt;/code&gt;&lt;/strong&gt; immediately triggers "Fill."&lt;/p&gt;

&lt;p&gt;So why does it fail on external keyboards like the Logitech Pebble (K380, Pebble Keys 2, or standard mechanical keyboards)?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;On a Mac keyboard:&lt;/strong&gt; The &lt;code&gt;Fn&lt;/code&gt; key is a native modifier recognized directly by macOS (acting as both &lt;code&gt;Fn&lt;/code&gt; and the Globe key).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;On third-party keyboards:&lt;/strong&gt; The &lt;code&gt;Fn&lt;/code&gt; key is usually processed &lt;strong&gt;inside the keyboard itself&lt;/strong&gt; to control hardware features like media volume, screen brightness, or device switching.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because the keyboard never actually sends an &lt;code&gt;Fn&lt;/code&gt; signal to macOS, your Mac only receives &lt;code&gt;Control + F&lt;/code&gt;—and ignores the command.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. The 2-Minute Fix: Make "Fill" Work Everywhere
&lt;/h2&gt;

&lt;p&gt;You don't need to buy an Apple Magic Keyboard to fix this. You just need to assign the "Fill" command to a shortcut that doesn't use the &lt;code&gt;Fn&lt;/code&gt; key.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Open System Settings
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Click the &lt;strong&gt;Apple logo ()&lt;/strong&gt; in the top-left corner of your screen.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;System Settings&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;In the sidebar, scroll down and click &lt;strong&gt;Keyboard&lt;/strong&gt;, then click the &lt;strong&gt;Keyboard Shortcuts…&lt;/strong&gt; button.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 2: Create a Custom Shortcut for "Fill"
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;In the window that pops up, select &lt;strong&gt;App Shortcuts&lt;/strong&gt; on the left.&lt;/li&gt;
&lt;li&gt;Click the &lt;strong&gt;&lt;code&gt;+&lt;/code&gt;&lt;/strong&gt; (plus) button at the bottom of the list.&lt;/li&gt;
&lt;li&gt;Keep &lt;em&gt;Application&lt;/em&gt; set to &lt;strong&gt;All Applications&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;In the &lt;strong&gt;Menu Title&lt;/strong&gt; field, type &lt;strong&gt;&lt;code&gt;Fill&lt;/code&gt;&lt;/strong&gt; exactly as shown (capital "F", no punctuation—it must match Apple’s menu bar item).&lt;/li&gt;
&lt;li&gt;In the &lt;strong&gt;Keyboard Shortcut&lt;/strong&gt; field, press a combination of standard modifier keys, such as:&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;Control + Option + F&lt;/code&gt;&lt;/strong&gt; &lt;em&gt;(Recommended)&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click &lt;strong&gt;Done&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 3: Put Your Logitech Pebble in "Mac Mode"
&lt;/h3&gt;

&lt;p&gt;External keyboards often share layouts between Windows and macOS. To ensure the keys align correctly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Press and hold &lt;strong&gt;&lt;code&gt;Fn + O&lt;/code&gt;&lt;/strong&gt; on your Logitech keyboard for &lt;strong&gt;3 seconds&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;The Bluetooth LED will flash, confirming the keyboard is now mapped to Apple modifier keys (&lt;code&gt;Control&lt;/code&gt;, &lt;code&gt;Option&lt;/code&gt;, and &lt;code&gt;Command&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Test it out:&lt;/strong&gt; Select any app window and press &lt;code&gt;Control + Option + F&lt;/code&gt; on your Pebble keyboard. The window will immediately snap edge-to-edge, hiding the Stage Manager rail until your cursor touches the side of the display!&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Bonus: Love the Rectangle App? Remove the Gap Permanently
&lt;/h2&gt;

&lt;p&gt;If you already have strong muscle memory for Rectangle’s maximize shortcut, you don't even have to leave it behind. You can tell Rectangle to stop reserving space for Stage Manager:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click the &lt;strong&gt;Rectangle icon&lt;/strong&gt; in your menu bar and select &lt;strong&gt;Quit Rectangle&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Press &lt;code&gt;Command + Space&lt;/code&gt;, type &lt;strong&gt;Terminal&lt;/strong&gt;, and press &lt;code&gt;Enter&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Copy and paste the following line, then press &lt;code&gt;Enter&lt;/code&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;defaults write com.knollsoft.Rectangle stageSize &lt;span class="nt"&gt;-float&lt;/span&gt; 0

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Re-open &lt;strong&gt;Rectangle&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now, when you hit your usual Rectangle shortcut, your window will stretch across 100% of your screen width automatically.&lt;/p&gt;

</description>
      <category>hardware</category>
      <category>productivity</category>
      <category>tools</category>
    </item>
    <item>
      <title>Set Up Lightning-Fast Codebase Indexing in Zoo Code / Roo Code / Cline with Ollama (BGE-M3) and Qdrant</title>
      <dc:creator>Shawon Saha</dc:creator>
      <pubDate>Thu, 17 Sep 2026 07:18:12 +0000</pubDate>
      <link>https://dev.to/shawon/set-up-lightning-fast-codebase-indexing-in-zoo-code-roo-code-cline-with-ollama-bge-m3-and-44g5</link>
      <guid>https://dev.to/shawon/set-up-lightning-fast-codebase-indexing-in-zoo-code-roo-code-cline-with-ollama-bge-m3-and-44g5</guid>
      <description>&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvszu39p8hya0c597o07j.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvszu39p8hya0c597o07j.png" alt=" " width="714" height="1340"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nothing kills developer momentum quite like watching Roo Code freeze at &lt;code&gt;60 / 3483 blocks&lt;/code&gt; because a cloud API slapped you with an &lt;strong&gt;HTTP 429: Too Many Requests&lt;/strong&gt; error.&lt;/p&gt;

&lt;p&gt;Cloud-based embedding models like Gemini or OpenAI are convenient to set up, but when indexing an entire codebase, they quickly introduce rate limits, slow exponential backoffs, recurring token costs, and privacy concerns regarding proprietary code leaving your local machine.&lt;/p&gt;

&lt;p&gt;The fix? &lt;strong&gt;A local, zero-cost, privacy-first semantic search pipeline&lt;/strong&gt; using &lt;strong&gt;Ollama&lt;/strong&gt;, the high-performance &lt;strong&gt;BAAI/bge-m3&lt;/strong&gt; embedding model, and &lt;strong&gt;Qdrant&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Here is a complete, step-by-step guide to setting up instantaneous codebase indexing in Roo Code.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why the BGE-M3 + Qdrant Stack Wins
&lt;/h2&gt;

&lt;p&gt;Semantic search in an IDE agent requires more than standard string matching (&lt;code&gt;grep&lt;/code&gt;). It chunks functions, hooks, and types into high-dimensional vector representations so the LLM can resolve abstract natural-language requests—like &lt;em&gt;"where do we handle session refresh tokens?"&lt;/em&gt;—into concrete file locations.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Cloud APIs (Gemini Free / OpenAI)&lt;/th&gt;
&lt;th&gt;Local Ollama (&lt;code&gt;bge-m3&lt;/code&gt;)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Indexing Speed (~1,000 blocks)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;15–20 minutes (rate-limit stalls)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;15–30 seconds&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Rate Limits&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Stalls every 60 blocks (HTTP 429)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Zero (completely local)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Context Window&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2,048 tokens&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;8,192 tokens&lt;/strong&gt; (full components &amp;amp; files)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cost &amp;amp; Privacy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Pay-per-token; code leaves machine&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;100% free, offline, and private&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Vector Storage&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Ephemeral or remote cloud&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Persistent, low-latency Qdrant index&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  What Makes BGE-M3 Special?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Massive 8,192-Token Context Window:&lt;/strong&gt; Lightweight embedding models (like &lt;code&gt;all-MiniLM-L6-v2&lt;/code&gt;) truncate inputs after 256 or 512 tokens, slicing large functions and interfaces in half. &lt;code&gt;bge-m3&lt;/code&gt; embeds extensive React components, API routes, and type schemas in a single cohesive vector.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;1024-Dimension Semantic Resolution:&lt;/strong&gt; Trained on massive multilingual and technical corpora, &lt;code&gt;bge-m3&lt;/code&gt; understands code semantics and structural syntax with exceptional accuracy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CPU and GPU Efficient:&lt;/strong&gt; Despite its 567M parameter density, it indexes repositories in seconds even on mid-tier modern processors.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before getting started, ensure you have:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;VS Code&lt;/strong&gt; with the &lt;strong&gt;Roo Code&lt;/strong&gt; extension installed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ollama&lt;/strong&gt; installed and running on your system (&lt;a href="https://ollama.com/" rel="noopener noreferrer"&gt;Download Ollama&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;An active &lt;strong&gt;Qdrant&lt;/strong&gt; instance (either a free &lt;a href="https://cloud.qdrant.io/" rel="noopener noreferrer"&gt;Qdrant Cloud&lt;/a&gt; cluster or a local Docker instance running on &lt;code&gt;localhost:6333&lt;/code&gt;).&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Step 1: Pull the BGE-M3 Model in Ollama
&lt;/h2&gt;

&lt;p&gt;Open your terminal and download the &lt;code&gt;bge-m3&lt;/code&gt; model:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama pull bge-m3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify that the model downloaded successfully and Ollama's local server is responding:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama list
curl http://localhost:11434/api/tags
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see &lt;code&gt;bge-m3&lt;/code&gt; (~1.2 GB) in your list of local models.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 2: Prevent Index Bloat with a &lt;code&gt;.rooignore&lt;/code&gt; File
&lt;/h2&gt;

&lt;p&gt;By default, Roo Code scans build outputs, cache directories, and package lockfiles. A single &lt;code&gt;package-lock.json&lt;/code&gt; or &lt;code&gt;pnpm-lock.yaml&lt;/code&gt; can contain tens of thousands of lines of metadata, bloating your index by thousands of unnecessary blocks and slowing down search.&lt;/p&gt;

&lt;p&gt;Create a &lt;code&gt;.rooignore&lt;/code&gt; file in your project's root directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Package Managers &amp;amp; Dependencies
node_modules/
package-lock.json
pnpm-lock.yaml
yarn.lock
bun.lockb

# Build Outputs &amp;amp; Framework Caches
.next/
out/
build/
dist/
.vercel/
.turbo/

# Static Assets &amp;amp; Media
public/
*.svg
*.png
*.jpg
*.jpeg
*.webp
*.ico

# Version Control &amp;amp; Secrets
.git/
.env*
*.log

# Types &amp;amp; Caches
*.tsbuildinfo
next-env.d.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; Adding this file typically cuts a standard Next.js or React repository from &lt;strong&gt;3,500+ blocks down to 300–800 blocks&lt;/strong&gt; of actual application logic.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Step 3: Clear Stale Vector Data (Crucial Step!)
&lt;/h2&gt;

&lt;p&gt;If you previously started indexing using Gemini (3072 dimensions) or OpenAI (1536 dimensions), your existing Qdrant collection is locked to that vector size. Pushing 1024-dimension vectors from &lt;code&gt;bge-m3&lt;/code&gt; without wiping will cause dimension mismatch errors.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open VS Code and open the Roo Code panel.&lt;/li&gt;
&lt;li&gt;Navigate to the &lt;strong&gt;Codebase Indexing&lt;/strong&gt; configuration screen.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Stop Indexing&lt;/strong&gt; if a previous run is frozen.&lt;/li&gt;
&lt;li&gt;Expand &lt;strong&gt;Advanced Configuration&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Clear Index Data&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This cleanly purges the old collection and resets the indexing status.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4: Configure Roo Code Settings
&lt;/h2&gt;

&lt;p&gt;In the &lt;strong&gt;Codebase Indexing&lt;/strong&gt; settings pane, enter the following parameters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Embedder Provider:&lt;/strong&gt; &lt;code&gt;Ollama&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ollama Base URL:&lt;/strong&gt; &lt;code&gt;http://localhost:11434&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model:&lt;/strong&gt; &lt;code&gt;bge-m3&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model Dimension:&lt;/strong&gt; &lt;code&gt;1024&lt;/code&gt; &lt;em&gt;(Make sure this is set to 1024, not 1536 or 3072)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Qdrant URL:&lt;/strong&gt; Your Qdrant endpoint (e.g., &lt;code&gt;https://xxxx.eu-west-1-0.aws.cloud.qdrant.io:6333&lt;/code&gt; or &lt;code&gt;http://localhost:6333&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Qdrant API Key:&lt;/strong&gt; Your Qdrant authentication token (leave blank if running local unauthenticated Qdrant)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 5: Save and Start Indexing
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Check the box for &lt;strong&gt;Enable Codebase Indexing&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Save&lt;/strong&gt; in the bottom-right corner.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Watch the progress bar: instead of stalling every 60 blocks, the counter will continuously progress from &lt;code&gt;0 / 840&lt;/code&gt; to completion in 15 to 30 seconds.&lt;/p&gt;

&lt;p&gt;Once complete, the status indicator turns green:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Status:&lt;/strong&gt; &lt;code&gt;Indexed - File watcher started.&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  What Happens Next?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Automatic Incremental Indexing:&lt;/strong&gt; The active file watcher monitors your workspace. When you write new code or edit existing files, Roo Code re-indexes only the modified files through Ollama in milliseconds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instant Context for Roo Code:&lt;/strong&gt; When you ask Roo Code questions like &lt;em&gt;"where do we handle payment webhooks?"&lt;/em&gt; or &lt;em&gt;"refactor the authentication middleware"&lt;/em&gt;, it queries Qdrant using vector similarity to retrieve the exact files needed before generating code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero Monthly Bills:&lt;/strong&gt; You get infinite embeddings and searches without consuming API credits or depending on cloud connectivity.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>vectordatabase</category>
      <category>vscode</category>
      <category>agents</category>
      <category>ai</category>
    </item>
    <item>
      <title>The Ultimate Guide to Downloading Videos Like a Pro (Plus an Easy No-Terminal Alternative)</title>
      <dc:creator>Shawon Saha</dc:creator>
      <pubDate>Wed, 26 Aug 2026 06:50:05 +0000</pubDate>
      <link>https://dev.to/shawon/the-ultimate-guide-to-downloading-videos-like-a-pro-plus-an-easy-no-terminal-alternative-18kj</link>
      <guid>https://dev.to/shawon/the-ultimate-guide-to-downloading-videos-like-a-pro-plus-an-easy-no-terminal-alternative-18kj</guid>
      <description>&lt;p&gt;If you’ve ever tried downloading videos from the internet, you’ve probably run into limitations—low quality, watermarks, or sketchy websites. That’s where &lt;strong&gt;yt-dlp&lt;/strong&gt; comes in.&lt;/p&gt;

&lt;p&gt;yt-dlp is one of the most powerful, flexible, and reliable tools for downloading videos and audio from thousands of websites. It’s open-source, actively maintained, and supports 1700+ platforms.&lt;/p&gt;

&lt;p&gt;But there’s a catch: it’s a &lt;strong&gt;command-line tool&lt;/strong&gt;. That scares a lot of people.&lt;/p&gt;

&lt;p&gt;Don’t worry. In this guide, I’ll walk you through:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What yt-dlp is
&lt;/li&gt;
&lt;li&gt;How to use it step by step
&lt;/li&gt;
&lt;li&gt;Practical commands you’ll actually use
&lt;/li&gt;
&lt;li&gt;And a &lt;strong&gt;bonus no-terminal solution&lt;/strong&gt; for beginners
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What is yt-dlp?
&lt;/h2&gt;

&lt;p&gt;yt-dlp is a command-line program that lets you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Download videos in the best available quality
&lt;/li&gt;
&lt;li&gt;Extract audio (MP3, FLAC, etc.)
&lt;/li&gt;
&lt;li&gt;Download playlists and channels
&lt;/li&gt;
&lt;li&gt;Add subtitles, metadata, thumbnails, and more
&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Download multiple audio tracks (different languages / dubs)&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s essentially a more advanced and actively maintained version of youtube-dl.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Use yt-dlp?
&lt;/h2&gt;

&lt;p&gt;Here’s why power users love it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🎯 Maximum quality downloads (4K, 8K, HDR)
&lt;/li&gt;
&lt;li&gt;⚡ Fast and reliable
&lt;/li&gt;
&lt;li&gt;🌍 Supports thousands of sites
&lt;/li&gt;
&lt;li&gt;🔧 Fully customizable
&lt;/li&gt;
&lt;li&gt;🧠 Smart format selection
&lt;/li&gt;
&lt;li&gt;🌐 &lt;strong&gt;Multi-audio &amp;amp; dubbed version support&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔥 Standout Feature: Multiple Audio &amp;amp; Dubbed Versions
&lt;/h2&gt;

&lt;p&gt;One of the most underrated features of yt-dlp is the ability to download &lt;strong&gt;multiple audio streams from the same video&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Many platforms (like YouTube, Netflix-style streams, or anime sites) provide:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Different &lt;strong&gt;languages (English, Hindi, Japanese, etc.)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Different &lt;strong&gt;dubbed versions&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Multiple &lt;strong&gt;audio quality tracks&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;yt-dlp lets you access and download them.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔍 List available audio tracks
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yt-dlp &lt;span class="nt"&gt;-F&lt;/span&gt; &lt;span class="s2"&gt;"URL"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You’ll see multiple audio formats like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;audio-eng&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;audio-hin&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;audio-jpn&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🎧 Download a specific language
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yt-dlp &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"ba[language=en]"&lt;/span&gt; &lt;span class="s2"&gt;"URL"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  🌍 Download multiple audio tracks together
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yt-dlp &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"ba[language=en]+ba[language=hi]"&lt;/span&gt; &lt;span class="s2"&gt;"URL"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  🎬 Download video with specific dubbed audio
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yt-dlp &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"bv+ba[language=ja]"&lt;/span&gt; &lt;span class="s2"&gt;"URL"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  📦 Embed multiple audio tracks into one file (MKV)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yt-dlp &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"bv+ba[language=en]+ba[language=hi]"&lt;/span&gt; &lt;span class="nt"&gt;--merge-output-format&lt;/span&gt; mkv &lt;span class="s2"&gt;"URL"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This creates a single video file where you can switch audio tracks in your media player.&lt;/p&gt;

&lt;p&gt;💡 Perfect for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Watching anime with multiple dubs
&lt;/li&gt;
&lt;li&gt;Keeping original + dubbed versions
&lt;/li&gt;
&lt;li&gt;Family use (different language preferences)
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Getting Started (Basic Usage)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Open your terminal
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Windows → Command Prompt / PowerShell
&lt;/li&gt;
&lt;li&gt;macOS → Terminal
&lt;/li&gt;
&lt;li&gt;Linux → Terminal
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Run your first command
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yt-dlp &lt;span class="s2"&gt;"VIDEO_URL"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That’s it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Most Useful yt-dlp Commands
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🎬 Download best quality
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yt-dlp &lt;span class="s2"&gt;"URL"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🎵 Extract audio (MP3)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yt-dlp &lt;span class="nt"&gt;-x&lt;/span&gt; &lt;span class="nt"&gt;--audio-format&lt;/span&gt; mp3 &lt;span class="s2"&gt;"URL"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  📺 Download specific quality (e.g. 1080p)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yt-dlp &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"best[height&amp;lt;=1080]"&lt;/span&gt; &lt;span class="s2"&gt;"URL"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  📋 Download a full playlist
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yt-dlp &lt;span class="nt"&gt;--yes-playlist&lt;/span&gt; &lt;span class="s2"&gt;"PLAYLIST_URL"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  📝 Download subtitles
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yt-dlp &lt;span class="nt"&gt;--write-subs&lt;/span&gt; &lt;span class="nt"&gt;--embed-subs&lt;/span&gt; &lt;span class="s2"&gt;"URL"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  The Problem: Not Everyone Likes the Terminal
&lt;/h2&gt;

&lt;p&gt;Let’s be honest.&lt;/p&gt;

&lt;p&gt;Typing long commands isn’t for everyone.&lt;/p&gt;

&lt;p&gt;If you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Don’t want to install tools
&lt;/li&gt;
&lt;li&gt;Don’t like command lines
&lt;/li&gt;
&lt;li&gt;Just want quick downloads
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then you need something simpler.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⭐ Bonus: No-Terminal Alternative
&lt;/h2&gt;

&lt;p&gt;👉 &lt;a href="https://ytdlp.online/" rel="noopener noreferrer"&gt;https://ytdlp.online/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This tool gives you the &lt;strong&gt;power of yt-dlp without the setup&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why it’s useful:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;🖱️ No installation required
&lt;/li&gt;
&lt;li&gt;🧩 No commands to memorize
&lt;/li&gt;
&lt;li&gt;⚙️ Visual interface
&lt;/li&gt;
&lt;li&gt;🚀 Runs in your browser
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Paste a URL
&lt;/li&gt;
&lt;li&gt;Choose quality
&lt;/li&gt;
&lt;li&gt;Select audio languages
&lt;/li&gt;
&lt;li&gt;Generate commands automatically
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;yt-dlp is more than just a downloader—it’s a &lt;strong&gt;complete media control tool&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And features like &lt;strong&gt;multi-audio and dubbed downloads&lt;/strong&gt; make it incredibly powerful, especially for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;International users
&lt;/li&gt;
&lt;li&gt;Anime fans
&lt;/li&gt;
&lt;li&gt;Families with different language needs
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Whether you prefer the terminal or a simple web interface, yt-dlp has you covered.&lt;/p&gt;




&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;yt-dlp = powerful open-source downloader
&lt;/li&gt;
&lt;li&gt;Supports video, audio, subtitles, playlists
&lt;/li&gt;
&lt;li&gt;⭐ Can download &lt;strong&gt;multiple audio tracks &amp;amp; dubbed versions&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Simple start:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  yt-dlp &lt;span class="s2"&gt;"URL"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Don’t like terminal? Use &lt;a href="https://ytdlp.online/" rel="noopener noreferrer"&gt;https://ytdlp.online/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>The Ultimate Trick to Change Android Animation Scale with Developer Options DISABLED</title>
      <dc:creator>Shawon Saha</dc:creator>
      <pubDate>Sat, 04 Jul 2026 10:15:26 +0000</pubDate>
      <link>https://dev.to/shawon/the-ultimate-trick-to-change-android-animation-scale-with-developer-options-disabled-26bg</link>
      <guid>https://dev.to/shawon/the-ultimate-trick-to-change-android-animation-scale-with-developer-options-disabled-26bg</guid>
      <description>&lt;p&gt;We’ve all done it: the very first thing you do when you get a new Android phone is unlock Developer Options and drop the animation scales from &lt;code&gt;1.0x&lt;/code&gt; to &lt;code&gt;0.5x&lt;/code&gt;. Instantly, your phone feels twice as fast. Apps snap open, multitasking feels fluid, and that artificial lag is completely gone.&lt;/p&gt;

&lt;p&gt;But then, you try to open your banking app, a high-security crypto wallet, or a sensitive work app, only to be met with a dreaded security warning:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Security Risk Detected: Developer Options are enabled. Please disable them to use this app."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It’s an incredibly frustrating ultimatum. Do you choose a snappier, faster user interface, or do you choose being able to access your money on the go?&lt;/p&gt;

&lt;p&gt;Thankfully, you don't have to choose anymore. In this guide, we’re going to show you a permanent workaround using an open-source tool called &lt;strong&gt;CustomAnimator&lt;/strong&gt; by Ahmet Can Arslan. You will learn how to set a custom animation scale and &lt;strong&gt;completely turn off Developer Options&lt;/strong&gt; while keeping your lightning-fast UI.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Do Banking Apps Care About Developer Options?
&lt;/h2&gt;

&lt;p&gt;To understand why this workaround is so great, you have to understand the security risk. When Developer Options are left enabled, your device leaves the door open for USB Debugging (&lt;code&gt;adb&lt;/code&gt;). In the wrong hands, an authorized computer could sideload malware, extract app data, or simulate touches.&lt;/p&gt;

&lt;p&gt;To protect your financial data, banking apps simply look for the system flag &lt;code&gt;development_settings_enabled&lt;/code&gt;. If it’s on, they lock you out.&lt;/p&gt;

&lt;p&gt;Our goal is to change the animation settings directly inside Android's &lt;code&gt;Secure Settings&lt;/code&gt; layer, grant a tiny open-source app the right to handle it, and then flip that developer flag safely back to &lt;strong&gt;Off&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  What You Need
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;An Android phone.&lt;/li&gt;
&lt;li&gt;A computer (Windows, Mac, or Linux) and a USB cable.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;CustomAnimator&lt;/strong&gt; app installed on your phone. You can grab the APK directly from the &lt;a href="https://github.com/AhmetCanArslan/CustomAnimator" rel="noopener noreferrer"&gt;Official CustomAnimator GitHub Repository&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmif07fmhie6m0yklkqog.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmif07fmhie6m0yklkqog.jpg" alt="Custom Animator App Initial Screen" width="800" height="1516"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1: Prepare Your Android Device
&lt;/h2&gt;

&lt;p&gt;Before we touch the computer, we need to allow it to speak to your phone just this once.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;On your phone, go to &lt;strong&gt;Settings &amp;gt; About Phone&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Find the &lt;strong&gt;Build Number&lt;/strong&gt; and tap it 7 times until it says &lt;em&gt;"You are now a developer!"&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Go back to your main Settings, search for &lt;strong&gt;Developer Options&lt;/strong&gt;, and turn on &lt;strong&gt;USB Debugging&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Connect your phone to your computer using a reliable USB cable.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  ⚠️ Crucial Step for Brand-Specific Phones:
&lt;/h3&gt;

&lt;p&gt;Some manufacturers add extra security layers that block automated permission scripts. If you have one of these devices, change this setting before moving forward:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OnePlus / Oppo / Realme (OxygenOS 16 / ColorOS):&lt;/strong&gt; Scroll to the very bottom of Developer Options and turn &lt;strong&gt;ON&lt;/strong&gt; &lt;strong&gt;"Disable system optimization"&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Xiaomi / Poco / Redmi:&lt;/strong&gt; Turn &lt;strong&gt;ON&lt;/strong&gt; &lt;strong&gt;"USB debugging (Security settings)"&lt;/strong&gt; (right below the main USB debugging switch) and bypass the warning timers.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 2: Install ADB on Your Computer
&lt;/h2&gt;

&lt;p&gt;Choose your computer's operating system below to get Android Platform Tools (ADB) running in seconds.&lt;/p&gt;

&lt;h3&gt;
  
  
  For macOS Users
&lt;/h3&gt;

&lt;p&gt;The fastest way to install ADB on a Mac is via Homebrew. Open your &lt;strong&gt;Terminal&lt;/strong&gt; app and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;android-platform-tools

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;(If you don't use Homebrew, download the official &lt;a href="https://developer.android.com/tools/releases/platform-tools" rel="noopener noreferrer"&gt;SDK Platform-Tools for Mac ZIP&lt;/a&gt;, extract it, and open Terminal inside that folder.)&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  For Windows Users
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Download the official &lt;a href="https://developer.android.com/tools/releases/platform-tools" rel="noopener noreferrer"&gt;SDK Platform-Tools for Windows ZIP&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Extract the folder to an easy-to-find location (like &lt;code&gt;C:\platform-tools&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Click on your Windows start menu, type &lt;strong&gt;CMD&lt;/strong&gt; (Command Prompt), and open it.&lt;/li&gt;
&lt;li&gt;Point the command prompt to your folder by running:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd C:\platform-tools

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  For Linux Users
&lt;/h3&gt;

&lt;p&gt;If you are on Linux, you can install ADB directly from your distribution's native package manager. Open your terminal and type:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ubuntu/Debian:&lt;/strong&gt; &lt;code&gt;sudo apt install adb&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fedora:&lt;/strong&gt; &lt;code&gt;sudo dnf install android-tools&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Arch Linux:&lt;/strong&gt; &lt;code&gt;sudo pacman -S android-tools&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 3: Link Your Computer and Phone
&lt;/h2&gt;

&lt;p&gt;With your terminal or command prompt open, let's verify the connection. Run the following command:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mac &amp;amp; Linux:&lt;/strong&gt; &lt;code&gt;adb devices&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Windows (Command Prompt):&lt;/strong&gt; &lt;code&gt;adb devices&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Windows (PowerShell):&lt;/strong&gt; &lt;code&gt;.\adb devices&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Look at your phone's screen immediately. A popup will ask you to &lt;strong&gt;"Allow USB debugging?"&lt;/strong&gt;. Check the box for &lt;em&gt;Always allow from this computer&lt;/em&gt; and tap &lt;strong&gt;Allow&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;When you run the command a second time, you should see your phone's serial number followed by the word &lt;code&gt;device&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4: Grant the Permanent Secure Permission
&lt;/h2&gt;

&lt;p&gt;Now we are going to use the Android Package Manager (&lt;code&gt;pm&lt;/code&gt;) to grant CustomAnimator the right to modify system animations without root access. Copy and paste the command for your OS:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mac, Linux &amp;amp; Windows CMD:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;adb shell pm grant com.arslan.customanimator android.permission.WRITE_SECURE_SETTINGS

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Windows PowerShell:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;\adb&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;shell&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;grant&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;com.arslan.customanimator&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;android.permission.WRITE_SECURE_SETTINGS&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hit &lt;strong&gt;Enter&lt;/strong&gt;. If the terminal simply jumps down to a blank new line without showing any errors, &lt;strong&gt;it worked perfectly!&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 5: Set Your Animations and Lock the Door!
&lt;/h2&gt;

&lt;p&gt;Now you can disconnect your phone from the computer. The hard work is done.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the &lt;strong&gt;CustomAnimator&lt;/strong&gt; app on your Android device.&lt;/li&gt;
&lt;li&gt;The permission error screen will be gone, replaced by a clean menu. You can now set your Window, Transition, and Animator scales exactly how you like them (e.g., &lt;code&gt;0.5&lt;/code&gt;, &lt;code&gt;0.25&lt;/code&gt;, or even completely custom values like &lt;code&gt;0.35&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Once your phone feels perfectly snappy, go to &lt;strong&gt;Settings &amp;gt; Developer Options&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Toggle the main "Developer Options" switch to OFF.&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;(Note: If you had to toggle "Disable system optimization" or "USB Debugging Security Settings" in Step 1, turning off Developer Options will automatically safely revert those too).&lt;/em&gt;&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fecaz8orouya8mext5pa9.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fecaz8orouya8mext5pa9.jpg" alt="After Successful Setup Custom Animator" width="800" height="1478"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The Result?
&lt;/h3&gt;

&lt;p&gt;Open up your banking app, Google Pay, or your corporate email. They will read the system flag, see that Developer Options are completely disabled, and grant you full access instantly. Meanwhile, your underlying animation scales remain set exactly where CustomAnimator put them.&lt;/p&gt;

&lt;p&gt;You get a faster phone, maximum security, and zero app crashes. It’s the ultimate win-win for Android power users!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Unlock the Hidden Power of Your Mac: Why You Aren't Using the Option Key Enough</title>
      <dc:creator>Shawon Saha</dc:creator>
      <pubDate>Thu, 25 Jun 2026 14:12:05 +0000</pubDate>
      <link>https://dev.to/shawon/unlock-the-hidden-power-of-your-mac-why-you-arent-using-the-option-key-enough-3fla</link>
      <guid>https://dev.to/shawon/unlock-the-hidden-power-of-your-mac-why-you-arent-using-the-option-key-enough-3fla</guid>
      <description>&lt;p&gt;We’ve all been there: you’re working on your Mac, clicking through menus, and thinking, &lt;em&gt;“There has to be a faster way to do this.”&lt;/em&gt; As it turns out, the answer has been sitting right under your fingertips the entire time. The &lt;strong&gt;Option key {⌥}&lt;/strong&gt; is easily one of the most underrated, underutilized tools on a Mac. While it might just look like a modifier key for typing special symbols, it actually unlocks a massive world of hidden features, deep system analytics, and lightning-fast workflows.&lt;/p&gt;

&lt;p&gt;If you want to save time and boost your daily productivity, here are the best hidden Option key shortcuts you need to start using right now.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Next-Level File Management in Finder
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Dynamic "Inspector" Window
&lt;/h3&gt;

&lt;p&gt;Normally, when you want to see a file's details, you right-click and select &lt;strong&gt;Get Info&lt;/strong&gt; (or press &lt;code&gt;Command + I&lt;/code&gt;). But if you select multiple files, your screen instantly gets cluttered with dozens of individual windows.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Upgrade:&lt;/strong&gt; Press &lt;code&gt;Command + Option + I&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Why it’s better:&lt;/strong&gt; This opens a single, dynamic &lt;strong&gt;Inspector window&lt;/strong&gt;. Instead of opening new tabs, the Inspector automatically updates its information in real-time as you click through different files.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Permanent File Deletion
&lt;/h3&gt;

&lt;p&gt;Tired of dragging files to the Trash and having to empty it manually later to free up SSD space?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Upgrade:&lt;/strong&gt; Select your file and press &lt;code&gt;Command + Option + Delete&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Warning:&lt;/strong&gt; This completely bypasses the Trash and &lt;strong&gt;permanently deletes&lt;/strong&gt; the file immediately. Use it with caution, because there is no "undo" button here!&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. Desktop &amp;amp; Window Management Mastery
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Mass-Minimize Windows
&lt;/h3&gt;

&lt;p&gt;When your desktop becomes a chaotic mess of Safari windows, minimizing them one by one is incredibly tedious.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Shortcut:&lt;/strong&gt; Hold &lt;code&gt;Option&lt;/code&gt; while clicking the yellow &lt;strong&gt;minimize button&lt;/strong&gt; on the top-left of a window.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Result:&lt;/strong&gt; Every single open window of that specific app will minimize simultaneously in one quick swoop.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Instant "Focus Mode"
&lt;/h3&gt;

&lt;p&gt;If overlapping apps are distracting you and you need to focus entirely on just one (like the Notes app), you don't have to minimize everything else manually.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Shortcut:&lt;/strong&gt; Click the app you want to use, then press &lt;code&gt;Command + Option + H&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Result:&lt;/strong&gt; This instantly hides every other background application, leaving only your active window visible.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Smart App Quit
&lt;/h3&gt;

&lt;p&gt;When you have dozens of browser tabs open for a massive research project, quitting the app (&lt;code&gt;Command + Q&lt;/code&gt;) usually means losing your spot or hoarding system RAM for days.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Shortcut:&lt;/strong&gt; Use &lt;code&gt;Command + Option + Q&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Result:&lt;/strong&gt; This acts like a "pause" button. It safely shuts down the app to free up your system RAM, but when you reopen it, every single window and tab will restore exactly where you left off.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Bonus Tip:&lt;/strong&gt; Want to maximize a window to fill your screen &lt;em&gt;without&lt;/em&gt; entering Apple's rigid Full Screen mode? Hold &lt;code&gt;Option&lt;/code&gt; while clicking the green &lt;strong&gt;maximize button&lt;/strong&gt; in the top-left corner.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  3. Secret Menu Bar Diagnostis
&lt;/h2&gt;

&lt;p&gt;Your Mac's menu bar holds deep, hidden secrets—all you have to do is hold &lt;code&gt;Option&lt;/code&gt; before you click:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Icon&lt;/th&gt;
&lt;th&gt;Normal Click&lt;/th&gt;
&lt;th&gt;Option + Click&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Wi-Fi Icon&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Shows available networks.&lt;/td&gt;
&lt;td&gt;Displays advanced connection parameters and troubleshooting metrics.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Sound Icon&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Adjusts the volume slider.&lt;/td&gt;
&lt;td&gt;Instantly lists all available audio hardware input and output devices (speakers, headphones, mics).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Apple Logo &lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Opens basic "About This Mac" menu.&lt;/td&gt;
&lt;td&gt;Changes the first option to &lt;strong&gt;System Information&lt;/strong&gt;, taking you straight to deep hardware and spec data.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  4. Micro-Adjustments for Audio and Brightness
&lt;/h2&gt;

&lt;p&gt;If standard volume and brightness steps feel too drastic, the Option key gives you granular control:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Quick Settings Access:&lt;/strong&gt; Pressing &lt;code&gt;Option + Volume Key&lt;/code&gt; instantly opens your Sound System Settings directly, skipping manual navigation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Micro-Stepping:&lt;/strong&gt; Hold &lt;code&gt;Shift + Option&lt;/code&gt; while pressing the &lt;strong&gt;Volume&lt;/strong&gt; or &lt;strong&gt;Brightness keys&lt;/strong&gt;. This adjusts the levels in tiny, precise fractions rather than full blocks, allowing you to perfectly dial in your environment.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  5. High-Speed Text Editing
&lt;/h2&gt;

&lt;p&gt;For anyone editing long documents, articles, or code, navigating text using a mouse is a massive bottleneck. Memorize these shortcuts to move at warp speed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Move by Word:&lt;/strong&gt; Press &lt;code&gt;Option + Left/Right Arrow&lt;/code&gt; to skip the cursor forward or backward one entire word at a time.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Move by Paragraph:&lt;/strong&gt; Press &lt;code&gt;Option + Up/Down Arrow&lt;/code&gt; to jump the cursor up or down by a full line/paragraph.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Speed Selection:&lt;/strong&gt; Combine these with &lt;code&gt;Shift&lt;/code&gt; (&lt;code&gt;Shift + Option + Arrows&lt;/code&gt;) to instantly highlight entire words or full sentences at a time.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  6. The Ultimate Panic Button: Force Quit
&lt;/h2&gt;

&lt;p&gt;When an application completely freezes, your mouse stops responding, and the spinning beachball of death appears, do not panic and do not hard-restart your computer.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Shortcut:&lt;/strong&gt; Press &lt;code&gt;Command + Option + Escape&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Result:&lt;/strong&gt; This immediately fires up the &lt;strong&gt;Force Quit Applications&lt;/strong&gt; window. Simply use your keyboard's arrow keys to highlight the frozen app, hit &lt;code&gt;Enter&lt;/code&gt;, and it will instantly terminate the application without disrupting the rest of your system.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Conclusion: Work Smarter, Not Harder
&lt;/h2&gt;

&lt;p&gt;The Mac ecosystem is packed with subtle engineering choices designed to make power users faster, and the Option key is the gateway to most of them. By integrating just two or three of these habits into your daily routine, you'll cut out hours of tedious clicking over time.&lt;/p&gt;

</description>
      <category>productivity</category>
    </item>
    <item>
      <title>How to Move Git Commits to a New Branch With Updated Timestamps</title>
      <dc:creator>Shawon Saha</dc:creator>
      <pubDate>Wed, 24 Jun 2026 07:56:35 +0000</pubDate>
      <link>https://dev.to/shawon/how-to-move-git-commits-to-a-new-branch-with-updated-timestamps-271n</link>
      <guid>https://dev.to/shawon/how-to-move-git-commits-to-a-new-branch-with-updated-timestamps-271n</guid>
      <description>&lt;p&gt;Ever needed to move a batch of commits from one branch to another — and make them look like they happened right now? Maybe you're cleaning up your Git history before opening a PR, or reorganizing work across branches after the fact.&lt;/p&gt;

&lt;p&gt;Whatever the reason, Git makes this surprisingly doable. Here's how.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Scenario
&lt;/h2&gt;

&lt;p&gt;You're on a branch called &lt;code&gt;feature-branch&lt;/code&gt; and the last 6 commits need to move to a brand new branch called &lt;code&gt;clean-branch&lt;/code&gt;. You also want every commit's timestamp to reflect the current time instead of when you originally wrote the code.&lt;/p&gt;

&lt;p&gt;By the end of this tutorial:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ A new branch will have your commits with fresh timestamps&lt;/li&gt;
&lt;li&gt;✅ The original branch will no longer contain those commits&lt;/li&gt;
&lt;li&gt;✅ All commit messages and file changes stay intact&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 1: Note Your Commit Hashes
&lt;/h2&gt;

&lt;p&gt;First, grab the hashes of the commits you want to move. We'll list them oldest-first so they replay in the right order:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git log &lt;span class="nt"&gt;-6&lt;/span&gt; &lt;span class="nt"&gt;--reverse&lt;/span&gt; &lt;span class="nt"&gt;--pretty&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;format:&lt;span class="s2"&gt;"%h %s"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You'll see something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;a1b2c3d feat: add user settings page
d4e5f6a fix: sidebar alignment on mobile
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 2: Create the New Branch
&lt;/h2&gt;

&lt;p&gt;Create your new branch starting from the point &lt;em&gt;before&lt;/em&gt; those 6 commits:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git checkout &lt;span class="nt"&gt;-b&lt;/span&gt; clean-branch HEAD~6
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This puts you on &lt;code&gt;clean-branch&lt;/code&gt;, which currently has everything your original branch had &lt;em&gt;except&lt;/em&gt; the last 6 commits.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What does &lt;code&gt;HEAD~6&lt;/code&gt; mean?&lt;/strong&gt;&lt;br&gt;
It means "the commit that is 6 steps before the current one." So the new branch starts right where those 6 commits began.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Step 3: Cherry-Pick With New Timestamps
&lt;/h2&gt;

&lt;p&gt;Now replay each commit onto the new branch, but override the timestamp. Replace the hashes below with your actual ones from Step 1:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;NOW&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"2026-06-24T02:50:33+06:00"&lt;/span&gt;

&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="nb"&gt;hash &lt;/span&gt;&lt;span class="k"&gt;in &lt;/span&gt;a1b2c3d d4e5f6a g7h8i9j k0l1m2n o3p4q5r s6t7u8v&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  &lt;/span&gt;&lt;span class="nv"&gt;GIT_AUTHOR_DATE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$NOW&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nv"&gt;GIT_COMMITTER_DATE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$NOW&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; git cherry-pick &lt;span class="nt"&gt;--no-edit&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$hash&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace the &lt;code&gt;NOW&lt;/code&gt; value with your desired timestamp, or use the current time dynamically:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;NOW&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt; &lt;span class="nt"&gt;-Iseconds&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Wait — Git has &lt;em&gt;two&lt;/em&gt; dates?
&lt;/h3&gt;

&lt;p&gt;Yes! Every commit stores two timestamps:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;What it means&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Author date&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;When the change was originally written&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Committer date&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;When the commit was last applied (rebased, cherry-picked, amended)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Tools like GitHub show the author date by default. The &lt;code&gt;GIT_AUTHOR_DATE&lt;/code&gt; and &lt;code&gt;GIT_COMMITTER_DATE&lt;/code&gt; environment variables let you override both.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4: Verify the Timestamps
&lt;/h2&gt;

&lt;p&gt;Confirm that both dates were updated:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git log &lt;span class="nt"&gt;-6&lt;/span&gt; &lt;span class="nt"&gt;--pretty&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;format:&lt;span class="s2"&gt;"%h | %s | Author: %ad | Committer: %cd"&lt;/span&gt; &lt;span class="nt"&gt;--date&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;iso
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every commit should now show your chosen timestamp for both fields.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 5: Remove the Commits From the Original Branch
&lt;/h2&gt;

&lt;p&gt;The commits still exist on your original branch. To "move" them (not just copy), reset that branch back:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git branch &lt;span class="nt"&gt;-f&lt;/span&gt; feature-branch feature-branch~6
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This rewrites the &lt;code&gt;feature-branch&lt;/code&gt; pointer to exclude the last 6 commits. Since you've already got them on &lt;code&gt;clean-branch&lt;/code&gt;, nothing is lost.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Quick Version
&lt;/h2&gt;

&lt;p&gt;If you want the whole thing as a copy-paste script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Config — edit these&lt;/span&gt;
&lt;span class="nv"&gt;SOURCE_BRANCH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"feature-branch"&lt;/span&gt;
&lt;span class="nv"&gt;NEW_BRANCH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"clean-branch"&lt;/span&gt;
&lt;span class="nv"&gt;NUM_COMMITS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;6
&lt;span class="nv"&gt;NOW&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt; &lt;span class="nt"&gt;-Iseconds&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# 1. Get commit hashes (oldest first)&lt;/span&gt;
&lt;span class="nv"&gt;HASHES&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;git log -&lt;span class="nv"&gt;$NUM_COMMITS&lt;/span&gt; &lt;span class="nt"&gt;--reverse&lt;/span&gt; &lt;span class="nt"&gt;--pretty&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;format:&lt;span class="s2"&gt;"%h"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# 2. Create new branch from before those commits&lt;/span&gt;
git checkout &lt;span class="nt"&gt;-b&lt;/span&gt; &lt;span class="nv"&gt;$NEW_BRANCH&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;SOURCE_BRANCH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;~&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;NUM_COMMITS&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;# 3. Cherry-pick with updated timestamps&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="nb"&gt;hash &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nv"&gt;$HASHES&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  &lt;/span&gt;&lt;span class="nv"&gt;GIT_AUTHOR_DATE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$NOW&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nv"&gt;GIT_COMMITTER_DATE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$NOW&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; git cherry-pick &lt;span class="nt"&gt;--no-edit&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$hash&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;

&lt;span class="c"&gt;# 4. Remove commits from original branch&lt;/span&gt;
git branch &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="nv"&gt;$SOURCE_BRANCH&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;SOURCE_BRANCH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;~&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;NUM_COMMITS&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;# 5. Verify&lt;/span&gt;
git log -&lt;span class="nv"&gt;$NUM_COMMITS&lt;/span&gt; &lt;span class="nt"&gt;--pretty&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;format:&lt;span class="s2"&gt;"%h | %ad | %s"&lt;/span&gt; &lt;span class="nt"&gt;--date&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;iso
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Good to Know
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;This rewrites history.&lt;/strong&gt; The new commits will have different hashes. If the original branch was already pushed, you'll need to force-push (&lt;code&gt;git push --force&lt;/code&gt;) — coordinate with your team first.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cherry-pick preserves authorship.&lt;/strong&gt; The commit author name and email stay the same; only the dates change.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conflicts are possible.&lt;/strong&gt; If the commits depend on each other in tricky ways, cherry-pick will pause and ask you to resolve conflicts, just like a rebase would.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Want different timestamps per commit?&lt;/strong&gt; Instead of a single &lt;code&gt;$NOW&lt;/code&gt;, you can set a unique date inside the loop for each cherry-pick.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;That's it — six commits, new branch, clean timestamps. Happy rebasing! 🎉&lt;/p&gt;

</description>
      <category>github</category>
      <category>git</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Dev Hack: How to Stop TypeScript (.ts) Files From Ruining Your macOS Smart Folders</title>
      <dc:creator>Shawon Saha</dc:creator>
      <pubDate>Wed, 24 Jun 2026 07:36:33 +0000</pubDate>
      <link>https://dev.to/shawon/dev-hack-how-to-stop-typescript-ts-files-from-ruining-your-macos-smart-folders-3f4h</link>
      <guid>https://dev.to/shawon/dev-hack-how-to-stop-typescript-ts-files-from-ruining-your-macos-smart-folders-3f4h</guid>
      <description>&lt;p&gt;If you are a web developer who also happens to keep a movie collection or video assets on your Mac, you’ve probably run into a deeply frustrating macOS quirk.&lt;/p&gt;

&lt;p&gt;You decide to set up a Finder &lt;strong&gt;Smart Folder&lt;/strong&gt; to track your recent video files or movies. You set the criteria to &lt;code&gt;Kind is Movie&lt;/code&gt;, look at the results, and instead of a clean list of MP4s and MKVs, your folder is absolutely flooded with thousands of &lt;code&gt;.ts&lt;/code&gt; files from your local development projects.&lt;/p&gt;

&lt;p&gt;Here’s why this happens and how to permanently banish TypeScript files from your media filters without breaking Finder’s search scope.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem: macOS Thinks You’re an MPEG-2 Enthusiast
&lt;/h2&gt;

&lt;p&gt;By default, macOS recognizes the &lt;code&gt;.ts&lt;/code&gt; file extension as an &lt;strong&gt;MPEG-2 Transport Stream&lt;/strong&gt;—a video container format used for broadcast streaming and DVDs.&lt;/p&gt;

&lt;p&gt;Finder has absolutely no idea that you are a modern JavaScript developer building applications. It just sees thousands of &lt;code&gt;.ts&lt;/code&gt; source files in your &lt;code&gt;node_modules&lt;/code&gt; or project directories and proudly flags them as "Movies."&lt;/p&gt;

&lt;p&gt;If you try to fix this by typing &lt;code&gt;-extension:ts&lt;/code&gt; directly into the Finder search bar, it often resets the search scope, causing your Smart Folder to completely break and return zero results.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Fix: Using Advanced "Raw Query" Rows
&lt;/h2&gt;

&lt;p&gt;To filter out TypeScript code without breaking your global search scope, you need to use Finder's hidden advanced boolean logic. Here is how to set it up step-by-step:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Set Up Your Base Media Filters
&lt;/h3&gt;

&lt;p&gt;Open Finder, press &lt;code&gt;Cmd + Option + N&lt;/code&gt; to create a new Smart Folder, and set up your initial include parameters using the standard &lt;code&gt;+&lt;/code&gt; button. For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Kind&lt;/strong&gt; is &lt;code&gt;Movie&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Last opened date&lt;/strong&gt; is within the last &lt;code&gt;365&lt;/code&gt; days&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Reveal the Hidden Boolean Menu
&lt;/h3&gt;

&lt;p&gt;Do not touch the search bar. Instead, hold down the &lt;strong&gt;Option (⌥)&lt;/strong&gt; key on your keyboard. You will notice that the &lt;code&gt;+&lt;/code&gt; buttons on the right side of your rules instantly transform into &lt;strong&gt;&lt;code&gt;...&lt;/code&gt; (Ellipsis)&lt;/strong&gt; icons.&lt;/p&gt;

&lt;p&gt;Click the &lt;strong&gt;&lt;code&gt;...&lt;/code&gt;&lt;/strong&gt; button on your bottom row. This spawns a nested sub-rule block.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Target the &lt;code&gt;.ts&lt;/code&gt; Extension Exclusively
&lt;/h3&gt;

&lt;p&gt;Configure your new nested rule block to strictly target and exclude the file extension:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Change the main dropdown of this nested block from &lt;em&gt;Any&lt;/em&gt; or &lt;em&gt;All&lt;/em&gt; to &lt;strong&gt;None&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Click the first dropdown in the sub-row underneath it and select &lt;strong&gt;Other...&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Search for &lt;strong&gt;"File extension"&lt;/strong&gt;, check the box next to it to enable it, and click &lt;strong&gt;OK&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Set the row to: &lt;strong&gt;File extension&lt;/strong&gt; | &lt;strong&gt;is&lt;/strong&gt; | &lt;strong&gt;&lt;code&gt;ts&lt;/code&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Your smart folder rules should now look exactly like this:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(Note: Replace with your screenshot if publishing!)&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Kind] is [Movie]
[Last opened date] is within last [365] [days]
└── [None] of the following are true:
    └── [File extension] is [ts]

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2ow9dm72q5ajnfngsaj8.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2ow9dm72q5ajnfngsaj8.png" alt=" " width="800" height="503"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Save and Forget
&lt;/h3&gt;

&lt;p&gt;Click the &lt;strong&gt;Save&lt;/strong&gt; button in the upper right corner, name your folder (e.g., &lt;em&gt;"Recent Movies"&lt;/em&gt;), and keep &lt;strong&gt;"Add to Sidebar"&lt;/strong&gt; checked.&lt;/p&gt;

&lt;p&gt;Finder will now perfectly index your entire drive for actual video files while completely ignoring your development workspace. No more digging through a sea of TypeScript components just to find a video file.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>tutorial</category>
      <category>typescript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Blocked by Mac Security? How to Fix “Apple Could Not Verify” Errors in Seconds</title>
      <dc:creator>Shawon Saha</dc:creator>
      <pubDate>Wed, 27 May 2026 06:53:48 +0000</pubDate>
      <link>https://dev.to/shawon/blocked-by-mac-security-how-to-fix-apple-could-not-verify-errors-in-seconds-4hmj</link>
      <guid>https://dev.to/shawon/blocked-by-mac-security-how-to-fix-apple-could-not-verify-errors-in-seconds-4hmj</guid>
      <description>&lt;p&gt;Getting the "Apple could not verify this app is free of malware" error on macOS? Learn 3 quick ways to bypass Gatekeeper and open blocked Mac apps safely.&lt;/p&gt;




&lt;p&gt;We’ve all been there. You download a perfectly safe, trusted app from a developer’s website, try to open it, and macOS immediately throws a security tantrum.&lt;/p&gt;

&lt;p&gt;The dreaded popup reads: &lt;strong&gt;"[App Name] Not Opened. Apple could not verify this app is free of malware..."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is macOS Gatekeeper doing its job a little &lt;em&gt;too&lt;/em&gt; well. If you’re 100% sure the app is safe, you don't need to throw it in the trash. Here is how to override the block and launch your app in seconds.&lt;/p&gt;




&lt;h2&gt;
  
  
  Method 1: Override via System Settings
&lt;/h2&gt;

&lt;p&gt;If the shortcut doesn't work, you can manually grant permission through your Mac's security settings.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click the &lt;strong&gt;Apple logo&lt;/strong&gt; in the top left and open &lt;strong&gt;System Settings&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Navigate to &lt;strong&gt;Privacy &amp;amp; Security&lt;/strong&gt; in the left sidebar.&lt;/li&gt;
&lt;li&gt;Scroll down to the &lt;strong&gt;Security&lt;/strong&gt; section.&lt;/li&gt;
&lt;li&gt;You will see a notification stating your app was blocked. Click the &lt;strong&gt;Open Anyway&lt;/strong&gt; button.&lt;/li&gt;
&lt;li&gt;Enter your Mac login password or use Touch ID to confirm.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Method 2: The Terminal Nuclear Option (For Stubborn Apps)
&lt;/h2&gt;

&lt;p&gt;If the app still refuses to open, macOS may have aggressively quarantined the file. You can strip the quarantine flag using a simple Terminal command.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the &lt;strong&gt;Terminal&lt;/strong&gt; app (Press &lt;code&gt;Cmd + Space&lt;/code&gt; and search for Terminal).&lt;/li&gt;
&lt;li&gt;Copy and paste the following command, adding a &lt;strong&gt;space&lt;/strong&gt; at the very end:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;xattr &lt;span class="nt"&gt;-rd&lt;/span&gt; com.apple.quarantine 

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Drag and drop the blocked app icon from your &lt;strong&gt;Applications&lt;/strong&gt; folder directly into the Terminal window (this automatically inputs the exact file path).&lt;/li&gt;
&lt;li&gt;Hit &lt;strong&gt;Enter&lt;/strong&gt;, type your Mac's admin password (no characters will show, just type and hit Enter), and try opening the app again.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Method 3: The Right-Click Shortcut (Fastest Fix)
&lt;/h2&gt;

&lt;p&gt;The absolute quickest way to bypass the macOS unidentified developer block is the secret right-click trick.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;strong&gt;Finder&lt;/strong&gt; and go to your &lt;strong&gt;Applications&lt;/strong&gt; folder.&lt;/li&gt;
&lt;li&gt;Locate the blocked app.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Right-click&lt;/strong&gt; (or hold &lt;code&gt;Control&lt;/code&gt; and click) the app icon, then select &lt;strong&gt;Open&lt;/strong&gt; from the menu.&lt;/li&gt;
&lt;li&gt;A new dialogue box will appear, but this time, it will include an &lt;strong&gt;Open&lt;/strong&gt; button. Click it, and macOS will permanently whitelist the app.&lt;/li&gt;
&lt;/ol&gt;




&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;A Quick Safety Reminder:&lt;/strong&gt; macOS Gatekeeper exists to protect your system. Only use these bypass methods if you downloaded the app from an official, trusted source. If you aren't sure where the app came from, it’s safer to delete it.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>beginners</category>
      <category>productivity</category>
      <category>security</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Fix the Notch: How to Stop macOS Hiding Your Menu Bar Icons</title>
      <dc:creator>Shawon Saha</dc:creator>
      <pubDate>Sun, 24 May 2026 11:56:54 +0000</pubDate>
      <link>https://dev.to/shawon/fix-the-notch-how-to-stop-macos-hiding-your-menu-bar-icons-69n</link>
      <guid>https://dev.to/shawon/fix-the-notch-how-to-stop-macos-hiding-your-menu-bar-icons-69n</guid>
      <description>&lt;p&gt;The notch on modern MacBooks gives us beautiful, near-borderless displays. But for heavy multitaskers, it introduces a frustrating design flaw: &lt;strong&gt;macOS hides menu bar icons behind the notch when you run out of space.&lt;/strong&gt; Because Apple provides no native overflow menu, essential utility apps simply disappear into a digital black hole. You shouldn't have to force-quit applications just to access your status icons.&lt;/p&gt;

&lt;p&gt;Here is how to quickly reclaim your MacBook menu bar real estate.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Condense Everything with "Only Switch" (Free &amp;amp; Open Source)
&lt;/h2&gt;

&lt;p&gt;If your menu bar is cluttered with individual icons for Dark Mode, Keep Awake, Bluetooth, and Night Shift, you are wasting prime real estate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Only Switch&lt;/strong&gt; is a powerful, open-source utility that consolidates dozens of settings into a single menu bar icon. Clicking it reveals a clean dropdown panel of customizable toggles. By replacing five or six separate app icons with just one, you instantly clear massive space so other apps never get pushed behind the notch.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bonus Feature:&lt;/strong&gt; Only Switch includes a "Hide Notch" toggle that turns the menu bar background pure black, blending the notch seamlessly into the display bezel.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. Hide Clutter with a Menu Bar Manager
&lt;/h2&gt;

&lt;p&gt;If you have a large collection of apps that &lt;em&gt;need&lt;/em&gt; to stay running, use a dedicated manager to collapse them into a hidden drawer.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ice (Free &amp;amp; Open Source):&lt;/strong&gt; A modern, lightweight app designed specifically for macOS that lets you hide or show icons with a simple toggle arrow.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hidden Bar (Free):&lt;/strong&gt; An ultra-minimalist "collapsible drawer" tool. Hold &lt;code&gt;Command (⌘)&lt;/code&gt; and drag low-priority icons behind the separator bar to tuck them out of sight.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bartender (Paid):&lt;/strong&gt; The gold standard. It creates a secondary "bar" completely underneath the main menu bar when you hover your mouse, ensuring zero icons are ever lost.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. Tighten Icon Spacing via Terminal (No Apps Required)
&lt;/h2&gt;

&lt;p&gt;Apple quietly increased the horizontal padding between menu bar icons in recent macOS versions, wasting valuable screen width. You can force macOS to tighten this spacing using two quick Terminal commands:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;strong&gt;Terminal&lt;/strong&gt; (&lt;code&gt;Cmd + Space&lt;/code&gt; and type Terminal).&lt;/li&gt;
&lt;li&gt;Paste this command and press &lt;strong&gt;Enter&lt;/strong&gt; to shrink the icon containers:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;defaults write com.apple.controlcenter &lt;span class="s2"&gt;"NSStatusItem2ExtensionMinPadding"&lt;/span&gt; &lt;span class="nt"&gt;-int&lt;/span&gt; 6

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Paste this command and press &lt;strong&gt;Enter&lt;/strong&gt; to reduce the gap between icons:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;defaults write com.apple.controlcenter &lt;span class="s2"&gt;"NSStatusItemSpacing"&lt;/span&gt; &lt;span class="nt"&gt;-int&lt;/span&gt; 6

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Apply the changes by restarting the control center:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;killall ControlCenter

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;To revert to Apple's default airy spacing, run the same commands but change &lt;code&gt;-int 6&lt;/code&gt; to &lt;code&gt;-int 12&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The 5-Second Emergency Fix
&lt;/h2&gt;

&lt;p&gt;If an icon you desperately need &lt;em&gt;right now&lt;/em&gt; is hidden behind the notch, don't panic. Go to &lt;strong&gt;System Settings &amp;gt; Displays&lt;/strong&gt; and temporarily select &lt;strong&gt;"More Space"&lt;/strong&gt; as your resolution. This shrinks the UI, expanding the menu bar text and forcing the hidden icons to pop out so you can click them.&lt;/p&gt;




&lt;h3&gt;
  
  
  Summary: What is the best solution?
&lt;/h3&gt;

&lt;p&gt;For the cleanest setup, install &lt;strong&gt;Only Switch&lt;/strong&gt; to consolidate your toggles, or use &lt;strong&gt;Ice&lt;/strong&gt; to hide secondary icons. Combined with the Terminal spacing tweak, your MacBook notch will never block your workflow again.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>productivity</category>
      <category>tooling</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
