<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>Coder Legion - Recent posts tagged vscode</title>
<link>https://coderlegion.com/tag/vscode</link>
<description>Powered by Question2Answer</description>
<item>
<title>Cline + any OpenAI-compatible gateway: Base URL ends at /v1</title>
<link>https://coderlegion.com/32654/cline-any-openai-compatible-gateway-base-url-ends-at-v1</link>
<description>&lt;p&gt;Cline (the independent VS Code / JetBrains coding agent — not affiliated with this post) has a first-party “OpenAI” provider and a separate &lt;strong&gt;OpenAI Compatible&lt;/strong&gt; provider. For a custom gateway you want the second one.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Smoke-test outside the IDE&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;export LLM_API_KEY='…'
export LLM_BASE_URL='https://api.china-aiapi.com/v1'

curl -sS &quot;$LLM_BASE_URL/models&quot; -H &quot;Authorization: Bearer $LLM_API_KEY&quot; | head
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Pick a &lt;code&gt;MODEL_ID&lt;/code&gt; that appears in that list.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Cline settings&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;API Provider → &lt;strong&gt;OpenAI Compatible&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Base URL → &lt;code&gt;https://api.china-aiapi.com/v1&lt;/code&gt; (stop at &lt;code&gt;/v1&lt;/code&gt;; do not append &lt;code&gt;/chat/completions&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;API Key → value of &lt;code&gt;$LLM_API_KEY&lt;/code&gt; (no &lt;code&gt;Bearer &lt;/code&gt; prefix)&lt;/li&gt;
&lt;li&gt;Model → &lt;code&gt;MODEL_ID&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Open &lt;strong&gt;Model Configuration&lt;/strong&gt; and set context window / max tokens yourself; custom providers do not infer them&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;3. Optional CLI shape&lt;/strong&gt; (if your Cline build ships &lt;code&gt;cline auth&lt;/code&gt;):&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cline auth -p openai -k &quot;$LLM_API_KEY&quot; -b &quot;$LLM_BASE_URL&quot; -m &quot;MODEL_ID&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Troubleshooting&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Symptom → Likely cause&lt;br&gt;
404 on chat → Base URL missing &lt;code&gt;/v1&lt;/code&gt; or has an extra &lt;code&gt;/v1/v1&lt;/code&gt;&lt;br&gt;
401 → Key not exported / pasted with trailing space&lt;br&gt;
Model not found → &lt;code&gt;MODEL_ID&lt;/code&gt; ≠ an id from &lt;code&gt;/models&lt;/code&gt;&lt;br&gt;
Tiny context / early cuts → Model Configuration left at defaults&lt;/p&gt;
&lt;p&gt;Happy to compare notes if anyone is wiring Cline through a corporate OpenAI-compatible proxy instead of a hosted gateway.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Disclosure: I work on the APIGOTO team; independent of OpenAI, Anthropic and Google.&lt;/em&gt; Cline is an independent product. Example gateway used above is ours (pay-as-you-go, logs only if enabled in settings): &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.china-aiapi.com/grokbot&quot;&gt;www.china-aiapi.com&lt;/a&gt; · &lt;code&gt;https://api.china-aiapi.com/v1&lt;/code&gt;&lt;/p&gt;
</description>
<category>Tutorials</category>
<guid isPermaLink="true">https://coderlegion.com/32654/cline-any-openai-compatible-gateway-base-url-ends-at-v1</guid>
<pubDate>Tue, 27 Oct 2026 09:22:37 +0000</pubDate>
</item>
<item>
<title>🚀 Managing MCP Servers in VS Code? Explore SEOSiri MCP Suite Manager!</title>
<link>https://coderlegion.com/31223/managing-mcp-servers-in-vs-code-explore-seosiri-mcp-suite-manager</link>
<description>&lt;p&gt;As AI-powered development evolves, managing Model Context Protocol (MCP) integrations is becoming an important part of building connected developer workflows. A well-organized MCP setup can help developers connect AI tools with external services, tools, and data sources.&lt;/p&gt;
&lt;p&gt;🛠️ Meet SEOSiri MCP Suite Manager&lt;/p&gt;
&lt;p&gt;Explore our VS Code extension for MCP server management and developer workflows.&lt;/p&gt;
&lt;p&gt;💡 Why explore MCP management?&lt;br&gt;
🔹 Developer Productivity: Organize your MCP-related development workflow within VS Code.&lt;br&gt;
🔹 AI Tool Integration: Explore MCP server configurations for compatible AI clients and development environments.&lt;br&gt;
🔹 Workflow Optimization: Simplify the process of working with MCP server setups.&lt;br&gt;
🔹 Developer Ecosystem: Build toward more connected AI-assisted development workflows.&lt;br&gt;
🔹 Project Opportunities: Get in touch with SEOSiri for development, optimization, and digital marketing support.&lt;br&gt;
&lt;img src=&quot;https://coderlegion.com/?qa=blob&amp;amp;qa_blobid=13321562692722168591&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;🔗 Visit the SEOSiri Visual Studio Marketplace:&lt;br&gt;
&lt;a rel=&quot;nofollow&quot; href=&quot;https://marketplace.visualstudio.com/publishers/seosiri&quot;&gt;https://marketplace.visualstudio.com/publishers/seosiri&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;📦 Get MCP Suite Manager:&lt;br&gt;
&lt;a rel=&quot;nofollow&quot; href=&quot;https://marketplace.visualstudio.com/items?itemName=SEOSiri.seosiri-vscode-mcp-manager&quot;&gt;https://marketplace.visualstudio.com/items?itemName=SEOSiri.seosiri-vscode-mcp-manager&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;🤝 Need help developing, optimizing, or marketing your developer product? DM SEOSiri to discuss your project and potential collaboration.&lt;/p&gt;
&lt;p&gt;The future of AI development depends not only on capable models, but also on the tools and integrations that connect them.&lt;/p&gt;
&lt;p&gt;Build. Integrate. Optimize. Make it discoverable.&lt;/p&gt;
&lt;h2 id=&quot;mcp-modelcontextprotocol-vscode-aidevelopment-developertools-seosiri&quot;&gt;MCP #ModelContextProtocol #VSCode #AIDevelopment #DeveloperTools #SEOSiri&lt;/h2&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/31223/managing-mcp-servers-in-vs-code-explore-seosiri-mcp-suite-manager</guid>
<pubDate>Thu, 15 Oct 2026 15:41:32 +0000</pubDate>
</item>
<item>
<title>FramePort: HDMI Capture Directly Inside VS Code</title>
<link>https://coderlegion.com/28467/frameport-hdmi-capture-directly-inside-vs-code</link>
<description>&lt;p&gt;Hi everyone!&lt;/p&gt;
&lt;p&gt;I'm a college junior, and I built &lt;strong&gt;FramePort&lt;/strong&gt; while working on Tomato, my custom 32-bit computer with a dual-LUT ALU running on an Artix-7 FPGA.&lt;/p&gt;
&lt;p&gt;I wanted to see its HDMI output beside my assembly code without constantly switching to OBS. So I built a VS Code extension that brings live video capture directly into the editor.&lt;/p&gt;
&lt;p&gt;FramePort supports HDMI capture cards, cameras, and other compatible video sources, with features including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Live video preview with adjustable scaling&lt;/li&gt;
&lt;li&gt;Screenshot capture&lt;/li&gt;
&lt;li&gt;Silent MP4 recording&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Although I originally built it for Tomato, I figured it could also be useful for Raspberry Pi projects, embedded systems, and other hardware-development workflows.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Here's FramePort running alongside Tomato's assembly code:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/rjedlrcg8c9amvwj68fs.gif&quot; alt=&quot;Image description&quot;&gt;&lt;/p&gt;
&lt;p&gt;FramePort is now available on Open VSX as a public preview for macOS. It requires FFmpeg and a compatible capture device.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Try FramePort:&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://open-vsx.org/extension/tmarhguy/frameport&quot;&gt;https://open-vsx.org/extension/tmarhguy/frameport&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Source code:&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/tmarhguy/frameport&quot;&gt;https://github.com/tmarhguy/frameport&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I'd love feedback from anyone interested in testing FramePort or contributing to its development!&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/28467/frameport-hdmi-capture-directly-inside-vs-code</guid>
<pubDate>Thu, 24 Sep 2026 11:47:06 +0000</pubDate>
</item>
<item>
<title>Developer Weekly Briefing — September 4, 2026</title>
<link>https://coderlegion.com/26204/developer-weekly-briefing-september-4-2026</link>
<description>&lt;p&gt;A strong week with two hard deadlines attached. GitHub Copilot's billing and governance changes start landing September 1 — one of them already hit. Developers and platform teams have until September 28 before the next wave takes effect. Here's everything that mattered.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;github-copilot-s-billing-and-governance-rules-are-changing-this-fall-dates-matter&quot;&gt;GitHub Copilot's billing and governance rules are changing this fall — dates matter&lt;/h3&gt;
&lt;p&gt;Three separate changes are rolling out across Copilot Business and Enterprise between now and late September, and all three have calendar implications.&lt;/p&gt;
&lt;p&gt;The first already took effect September 1: new seat assignments now require upfront payment before a user gets access. Existing customers have until October 1. The mechanics shift meaningfully — organizations are charged at the start of each billing cycle, with additional charges for usage that runs past what's included. Admins used to adding and removing seats on the fly will need to rethink that process, especially at billing cycle boundaries.&lt;/p&gt;
&lt;p&gt;The second change is the one compliance teams should flag immediately. No earlier than September 28, GitHub is merging Copilot Cloud Agent, the github.com chat experience, and GitHub Mobile Chat into one unified experience. Buried in that consolidation: chat data retention changes from 28 days to the lifetime of the account. Any organization with data retention policies, audit requirements, or contractual obligations around AI-generated conversations needs to review its settings before that date, not after.&lt;/p&gt;
&lt;p&gt;The third change, also September 28: the default code review effort level shifts from &quot;Lite&quot; to &quot;Balanced&quot; across all repositories and organizations. Teams that want to keep the lighter behavior need to explicitly select Lite before the switch. Under token-based billing, deeper reviews mean more tokens consumed per pull request — which means higher costs if nobody notices the default changed.&lt;/p&gt;
&lt;p&gt;As Futurum Group's Mitch Ashley put it: &quot;Engineering leaders should assign an owner to those defaults now, before the invoice makes the decision for them.&quot;&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://devops.com/github-tightens-copilots-billing-and-governance-rules-ahead-of-a-busy-fall/&quot;&gt;Read more&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;copilot-can-now-approve-pull-requests-not-just-review-them&quot;&gt;Copilot can now approve pull requests — not just review them&lt;/h3&gt;
&lt;p&gt;GitHub moved Copilot from advisory to authoritative in code review this week. Copilot's sign-off can now count toward a repository's required-approvals rule, the same way a teammate's would.&lt;/p&gt;
&lt;p&gt;The guardrails are more careful than the headline suggests. Approvals are off by default. Admins opt in at the enterprise, organization, or repository level. Repository admins can restrict which file paths Copilot is allowed to approve at all — letting teams scope it to documentation and test fixtures while keeping authentication and payment logic strictly human-reviewed. Push a new commit after approval and the approval is dismissed automatically, same as a human reviewer.&lt;/p&gt;
&lt;p&gt;The governance question worth sitting with, from Futurum Group's Mitch Ashley: &quot;Approval is where code review stops being advice and becomes authority, and GitHub just moved Copilot across that line. An automated reviewer earns that trust the same way a person does — through outcomes you can point to. Engineering leaders should turn this on and instrument it to measure the effectiveness of approvals.&quot;&lt;/p&gt;
&lt;p&gt;That instrumentation doesn't come built in. If Copilot's approvals count the same as a human's, someone needs to build dashboards showing how often it approves correctly, how often a human catches something after the fact, and whether speed is coming at the cost of depth. Teams that skip that step and flip approvals on everywhere at once are trading a review bottleneck for a governance gap.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://devops.com/github-puts-copilot-in-the-approval-seat-for-pull-requests/&quot;&gt;Read more&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;vs-code-1-135-adds-rubber-duck-a-second-ai-model-to-critique-the-first-one&quot;&gt;VS Code 1.135 adds Rubber Duck — a second AI model to critique the first one&lt;/h3&gt;
&lt;p&gt;The headline addition in VS Code 1.135 is Rubber Duck, an experimental feature that puts a different model to work reviewing the primary coding agent's plans, code, and tests before anything ships. Type &lt;code&gt;/rubber-duck&lt;/code&gt; in a Copilot agent session and a complementary model looks for gaps the first one missed.&lt;/p&gt;
&lt;p&gt;The same release introduces the Agent Host Protocol — a dedicated process for running agent harnesses that lets developers connect to the same session from multiple VS Code windows. Sessions now show agent work started in other applications, including Claude or Copilot sessions outside VS Code, so context doesn't get lost when you switch windows. Per-model token tracking in the chat footer gives teams a clearer read on what each model costs per turn.&lt;/p&gt;
&lt;p&gt;Mitch Ashley's useful caveat: &quot;Rubber Duck answers verification pressure with more generation, and that only goes so far.&quot; A second model catching more edge cases is still generation, not independent verification. Worth keeping that distinction in mind before treating Rubber Duck's output as a stamp of correctness.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://devops.com/vs-code-1-135-gives-ai-coding-agents-a-second-opinion/&quot;&gt;Read more&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;microsoft-opens-up-its-agent-framework-with-channels-one-agent-every-surface&quot;&gt;Microsoft opens up its Agent Framework with Channels — one agent, every surface&lt;/h3&gt;
&lt;p&gt;Microsoft's Agent Framework team published Channels this week — open-source Python packages that let a single agent connect to multiple communication platforms and protocols without a separate implementation for each. Launch integrations cover OpenAI's Responses API, Telegram, the Agent2Agent (A2A) protocol, and MCP.&lt;/p&gt;
&lt;p&gt;The architecture is notable for what it leaves out of scope: identity mapping, authentication, authorization, and session storage are still the application's responsibility. Microsoft made that explicit rather than abstracting it away, which keeps Channels auditable but also means teams can't treat it as a governance shortcut.&lt;/p&gt;
&lt;p&gt;Mitch Ashley's read: &quot;Microsoft is acknowledging something important: no single vendor owns the enterprise agent estate, so the channel layer has to speak protocols it does not control. Building on A2A and MCP instead of a Microsoft-only path matches what enterprises want.&quot;&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://techstrong.ai/features/one-agent-every-channel-microsoft-opens-up-its-agent-framework/&quot;&gt;Read more&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;debian-s-ai-vote-accountability-instead-of-a-ban&quot;&gt;Debian's AI vote: accountability instead of a ban&lt;/h3&gt;
&lt;p&gt;Debian developers voted on AI policy this week after a two-week community ballot with eight separate proposals, including an outright ban that would have required a supermajority to pass. It didn't come close. The policy that won neither endorses nor prohibits generative AI — it holds contributors to the same standard regardless of how code got written: you reviewed it, you tested it, and nothing sensitive left the building to get it.&lt;/p&gt;
&lt;p&gt;Disclosure is encouraged, not mandated. Three specific guardrails came with it: no confidential material or credentials to third-party AI services without explicit authorization, no bulk automated contributions without prior discussion, and the copyright question is explicitly punted downstream.&lt;/p&gt;
&lt;p&gt;The insight worth carrying into enterprise AI policy discussions: Debian didn't try to regulate the tool. It regulated the behavior around the tool, which is considerably easier to enforce. You can't reliably detect LLM-generated code. You can hold the person who submitted it accountable for what it does.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://devops.com/debians-ai-vote-bets-on-accountability-instead-of-a-ban/&quot;&gt;Read more&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;a-simple-website-summary-task-exposed-the-limits-of-ai-coding-guardrails&quot;&gt;A simple website summary task exposed the limits of AI coding guardrails&lt;/h3&gt;
&lt;p&gt;A researcher assigned an AI coding agent a task so basic it barely registers as a task: summarize a website. The agent found an edge case that required executing external code to complete the job, did so, and the guardrails didn't catch it. The post is a useful reminder that guardrails are tested against anticipated misuse, not every combination of legitimate task plus unexpected environment. The agent wasn't trying to do anything wrong. It was trying to finish the job.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://devops.com/a-simple-website-summary-just-exposed-the-limits-of-ai-coding-guardrails/&quot;&gt;Read more&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;also-from-coder-legion-this-week&quot;&gt;Also from Coder Legion this week&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CrowdStrike Fal.Con 2026: Falcon Guardian, SafeMind, and the end of &quot;breakout time.&quot;&lt;/strong&gt; George Kurtz retired the metric and made the case that attacks now happen at inference speed. Falcon Guardian goes GA, SafeMind pairs an offensive and defensive model built on NVIDIA Nemotron, and Jensen Huang, Lip-Bu Tan, and Greg Brockman all had things worth hearing. &lt;a rel=&quot;nofollow&quot; href=&quot;https://coderlegion.com/26023/crowdstrikes-fal-con-2026-falcon-guardian-safemind-and-the-end-of-breakout-time&quot;&gt;Read more&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cycode's AI scanner found 38 bugs in MLflow. The press release only mentioned one.&lt;/strong&gt; When we pushed on the benchmark methodology, the CTO's written follow-up had more detail — and a few numbers that didn't match the press release. &lt;a rel=&quot;nofollow&quot; href=&quot;https://coderlegion.com/26085/cycodes-ai-scanner-found-38-bugs-in-mlflow-the-press-release-only-mentioned-one&quot;&gt;Read more&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;F5's AI WAF caught 15 zero-days before a human ever saw them&lt;/strong&gt; — built on a custom neural network rather than a fine-tuned LLM, for reasons that come down to latency and data path. &lt;a rel=&quot;nofollow&quot; href=&quot;https://coderlegion.com/26103/f5s-ai-waf-caught-15-zero-days-before-a-human-ever-saw-them&quot;&gt;Read more&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Act Security's Amphi shrinks a 30,000-character AWS IAM policy down to 7,000&lt;/strong&gt; — live demo, same permissions, a quarter of the size, free and open source. &lt;a rel=&quot;nofollow&quot; href=&quot;https://coderlegion.com/26162/act-securitys-amphi-shrinks-a-30-000-character-aws-policy-down-to-7-000&quot;&gt;Read more&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;76% of enterprises with HA/DR still went down this year.&lt;/strong&gt; The top blocker isn't cost — it's configuration complexity, at 44%. Only 7% test DR monthly. &lt;a rel=&quot;nofollow&quot; href=&quot;https://coderlegion.com/26078/76-of-enterprises-with-ha-dr-still-went-down-this-year&quot;&gt;Read more&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Jazz's Roi Vanunu: &quot;agentic&quot; should describe what a security tool finishes, not what it is.&lt;/strong&gt; A precise and useful reframe of how to evaluate AI security vendor claims. &lt;a rel=&quot;nofollow&quot; href=&quot;https://coderlegion.com/25937/jazzs-roi-vanunu-agentic-should-describe-what-a-security-tool-finishes-not-what-it-is&quot;&gt;Read more&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;The through-line this week: governance is catching up with capability across the board — Copilot billing controls, PR approval authority, Debian's accountability-over-ban model, and Channels leaving identity to the application. The tooling is maturing. The question in every case is whether the governance catches up before the default decides for you.&lt;/p&gt;
&lt;p&gt;September 28 is the next hard date. Put it on the calendar now.&lt;/p&gt;
&lt;p&gt;See you next Friday.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Developer Weekly Briefing is published every Friday on &lt;a rel=&quot;nofollow&quot; href=&quot;https://coderlegion.com&quot;&gt;Coder Legion&lt;/a&gt;. Written by &lt;a rel=&quot;nofollow&quot; href=&quot;https://coderlegion.com/user/Tom+Smith&quot;&gt;Tom Smith&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/26204/developer-weekly-briefing-september-4-2026</guid>
<pubDate>Fri, 04 Sep 2026 12:35:46 +0000</pubDate>
</item>
<item>
<title>Orchestrating Model Context Protocol in IDEs: The SEOSiri VS Code MCP Manager (v1.0.2)</title>
<link>https://coderlegion.com/25707/orchestrating-model-context-protocol-in-ides-the-seosiri-vs-code-mcp-manager-v1-0-2</link>
<description>&lt;p&gt;&lt;img src=&quot;https://coderlegion.com/?qa=blob&amp;amp;qa_blobid=5537328051665140412&quot; alt=&quot;&quot;&gt;&lt;br&gt;
If you are running multi-server Model Context Protocol (MCP) setups across Cursor, Claude Desktop, and VS Code, you already know the friction: syntax errors in &lt;code&gt;mcp.json&lt;/code&gt;, mismatched &lt;code&gt;npx&lt;/code&gt; vs &lt;code&gt;uvx&lt;/code&gt; arguments, un-sandboxed extension permissions, and zero visibility into remote edge health.&lt;/p&gt;
&lt;p&gt;To solve this, we engineered and open-sourced &lt;strong&gt;&lt;code&gt;seosiri-vscode-mcp-manager&lt;/code&gt;&lt;/strong&gt; (now live on the Visual Studio Marketplace):&lt;/p&gt;
&lt;h4 id=&quot;-what-it-does-under-the-hood-&quot;&gt;🛠️ What it does under the hood:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;vscode_generate_mcp_config&lt;/code&gt;&lt;/strong&gt;: Auto-compiles validated &lt;code&gt;.vscode/mcp.json&lt;/code&gt; and &lt;code&gt;claude_desktop_config.json&lt;/code&gt; snippets for zero-setup execution.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;vscode_audit_extension_manifest&lt;/code&gt;&lt;/strong&gt;: Audits &lt;code&gt;package.json&lt;/code&gt; extension manifests for activation triggers and permission leaks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;vscode_sync_workspace_settings&lt;/code&gt;&lt;/strong&gt;: Synchronizes linters, TypeScript configs, and approved MCP tool lists across development teams.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;vscode_inspect_live_gateways&lt;/code&gt;&lt;/strong&gt;: Real-time sub-10ms health and latency checks across Cloudflare Workers edge nodes (&lt;code&gt;vscode.seosiri.com&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;-lightweight-architecture-&quot;&gt;📦 Lightweight Architecture:&lt;/h4&gt;
&lt;p&gt;Bundled with &lt;code&gt;esbuild&lt;/code&gt; down to &lt;strong&gt;73 KB&lt;/strong&gt; (single-file CJS runtime, zero bloated &lt;code&gt;node_modules&lt;/code&gt; in the VSIX bundle).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;VS Code Marketplace:&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://marketplace.visualstudio.com/items?itemName=SEOSiri.seosiri-vscode-mcp-manager&quot;&gt;https://marketplace.visualstudio.com/items?itemName=SEOSiri.seosiri-vscode-mcp-manager&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Architecture Guide:&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.seosiri.com/2026/08/vscode-mcp-manager.html&quot;&gt;https://www.seosiri.com/2026/08/vscode-mcp-manager.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Developer Portal &amp;amp; Topology:&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://developers.seosiri.com/&quot;&gt;https://developers.seosiri.com/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Would love feedback from engineers building autonomous agents and custom MCP tools!&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/25707/orchestrating-model-context-protocol-in-ides-the-seosiri-vs-code-mcp-manager-v1-0-2</guid>
<pubDate>Fri, 28 Aug 2026 16:15:26 +0000</pubDate>
</item>
<item>
<title>Show DEV: I built an AI Agent inside VS Code</title>
<link>https://coderlegion.com/24832/show-dev-i-built-an-ai-agent-inside-vs-code</link>
<description>&lt;p&gt;Hey everyone,&lt;/p&gt;
&lt;p&gt;For the past few months, I’ve been building &lt;strong&gt;Kalai Agent&lt;/strong&gt;, a VS Code extension designed to bring fully agentic AI directly into your editor, bypassing the need to constantly copy-paste code snippets into a browser tab.&lt;/p&gt;
&lt;p&gt;It’s finally at a stable v2.1.5, and I’m looking for some brutal engineering feedback on the architecture, security flows, and UX.&lt;/p&gt;
&lt;h3 id=&quot;the-architecture-amp-tech-stack&quot;&gt;The Architecture &amp;amp; Tech Stack&lt;/h3&gt;
&lt;p&gt;Instead of building a wrapper around a basic chat interface, I wanted something that could safely interact with the local workspace.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Frontend:&lt;/strong&gt; VS Code Webview API with batched streaming to prevent UI thread stuttering.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LLM Engine:&lt;/strong&gt; Proxied Moonshot/Kimi API.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Backend:&lt;/strong&gt; A lightweight Node service managing auth, workspace routing, and pay-as-you-go billing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Capabilities:&lt;/strong&gt; File-system operations, local terminal command execution, Python/Node script running, and web search capabilities.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h4 id=&quot;check-it-out&quot;&gt;Check it out&lt;/h4&gt;
&lt;p&gt;If you want to take it for a spin, install it directly from the marketplace:&lt;br&gt;
 &lt;strong&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://marketplace.visualstudio.com/items?itemName=kalculus.kalai-agent&quot;&gt;Kalai Agent - Visual Studio Marketplace&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you run into bugs, have notes on the UI, or just think a specific feature is clunky, drop a comment below or email us on culustech@gmail.com. I’m entirely open to critiques!&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/24832/show-dev-i-built-an-ai-agent-inside-vs-code</guid>
<pubDate>Tue, 18 Aug 2026 12:20:28 +0000</pubDate>
</item>
<item>
<title>The Code Works. So Why Does It Still Feel Like Bad Software?</title>
<link>https://coderlegion.com/24637/the-code-works-so-why-does-it-still-feel-like-bad-software</link>
<description>&lt;p&gt;There is a dangerous sentence in software development:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;“But it works.”&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A feature works.&lt;/p&gt;
&lt;p&gt;The tests pass.&lt;/p&gt;
&lt;p&gt;The pull request is merged.&lt;/p&gt;
&lt;p&gt;The deployment succeeds.&lt;/p&gt;
&lt;p&gt;And yet, three months later, nobody wants to touch that code.&lt;/p&gt;
&lt;p&gt;Why?&lt;/p&gt;
&lt;p&gt;Because &lt;strong&gt;working software and healthy software are not the same thing.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;As developers, we often measure success by whether the code produces the expected output. But software has another dimension that is harder to measure:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How easy is it to understand, change, debug, and trust?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;That difference becomes increasingly important as a project grows.&lt;/p&gt;
&lt;h3 id=&quot;1-code-is-written-once-but-maintained-many-times&quot;&gt;1. Code is written once, but maintained many times&lt;/h3&gt;
&lt;p&gt;When you write a function today, you know exactly why it exists.&lt;/p&gt;
&lt;p&gt;Six months later, another developer opens it and sees:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;processData()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Inside that function:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;validation&lt;/li&gt;
&lt;li&gt;database queries&lt;/li&gt;
&lt;li&gt;business rules&lt;/li&gt;
&lt;li&gt;API calls&lt;/li&gt;
&lt;li&gt;logging&lt;/li&gt;
&lt;li&gt;error handling&lt;/li&gt;
&lt;li&gt;formatting&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Everything works.&lt;/p&gt;
&lt;p&gt;But nobody knows where one responsibility ends and another begins.&lt;/p&gt;
&lt;p&gt;The problem isn't that the code is &quot;wrong.&quot;&lt;/p&gt;
&lt;p&gt;The problem is that the &lt;strong&gt;cost of understanding it has become too high.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Good software isn't just code that computers can execute.&lt;/p&gt;
&lt;p&gt;It's code that humans can reason about.&lt;/p&gt;
&lt;h3 id=&quot;2-complexity-is-a-form-of-technical-debt&quot;&gt;2. Complexity is a form of technical debt&lt;/h3&gt;
&lt;p&gt;We usually think technical debt means:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;“We used a bad implementation and we'll fix it later.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;But technical debt is often much more subtle.&lt;/p&gt;
&lt;p&gt;It can look like:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;if (user &amp;amp;&amp;amp; user.account &amp;amp;&amp;amp; user.account.settings) {
    ...
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It can look like a 700-line service class.&lt;/p&gt;
&lt;p&gt;It can look like five different ways of handling errors in the same project.&lt;/p&gt;
&lt;p&gt;It can look like a developer needing to open seven files just to understand one business rule.&lt;/p&gt;
&lt;p&gt;None of these necessarily break production.&lt;/p&gt;
&lt;p&gt;But they increase the mental cost of every future change.&lt;/p&gt;
&lt;p&gt;And that cost compounds.&lt;/p&gt;
&lt;p&gt;A small amount of complexity today becomes a large amount of friction tomorrow.&lt;/p&gt;
&lt;h3 id=&quot;3-the-best-developers-don-t-just-write-code&quot;&gt;3. The best developers don't just write code&lt;/h3&gt;
&lt;p&gt;They reduce future decisions.&lt;/p&gt;
&lt;p&gt;Imagine two implementations.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Implementation A:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It solves the problem in 20 lines.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Implementation B:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It solves the problem in 35 lines, but makes the behavior obvious, isolates responsibilities, and makes future changes predictable.&lt;/p&gt;
&lt;p&gt;Which one is better?&lt;/p&gt;
&lt;p&gt;Not always B.&lt;/p&gt;
&lt;p&gt;And that's the important part.&lt;/p&gt;
&lt;p&gt;Clean code isn't about maximizing abstraction, creating interfaces everywhere, or turning every function into a design-pattern showcase.&lt;/p&gt;
&lt;p&gt;It's about making the &lt;strong&gt;right trade-offs&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Sometimes the simplest solution really is the best solution.&lt;/p&gt;
&lt;p&gt;Sometimes a little duplication is better than introducing another abstraction.&lt;/p&gt;
&lt;p&gt;Sometimes a 10-line function is better than a &quot;flexible&quot; 100-line framework.&lt;/p&gt;
&lt;p&gt;Good engineering is knowing the difference.&lt;/p&gt;
&lt;h3 id=&quot;4-ask-a-different-question-during-code-review&quot;&gt;4. Ask a different question during code review&lt;/h3&gt;
&lt;p&gt;Instead of only asking:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;“Does this work?”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Try asking:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;“What happens when we need to change this?”&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That question exposes a lot.&lt;/p&gt;
&lt;p&gt;What happens if:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the database changes?&lt;/li&gt;
&lt;li&gt;the API starts returning a new response?&lt;/li&gt;
&lt;li&gt;we add another payment provider?&lt;/li&gt;
&lt;li&gt;the business rule changes?&lt;/li&gt;
&lt;li&gt;traffic increases 10x?&lt;/li&gt;
&lt;li&gt;a new developer has to debug this at 2 AM?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You don't need to predict the future perfectly.&lt;/p&gt;
&lt;p&gt;You just need to avoid making obvious future changes unnecessarily painful.&lt;/p&gt;
&lt;h3 id=&quot;5-boring-code-is-often-excellent-code&quot;&gt;5. Boring code is often excellent code&lt;/h3&gt;
&lt;p&gt;Developers sometimes want to write clever code.&lt;/p&gt;
&lt;p&gt;I understand the temptation.&lt;/p&gt;
&lt;p&gt;Elegant one-liners are satisfying.&lt;/p&gt;
&lt;p&gt;Complex abstractions can feel impressive.&lt;/p&gt;
&lt;p&gt;But production software doesn't reward cleverness.&lt;/p&gt;
&lt;p&gt;It rewards &lt;strong&gt;predictability&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The best code often looks boring.&lt;/p&gt;
&lt;p&gt;A developer should be able to open a file and quickly answer:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What does this do?&lt;/li&gt;
&lt;li&gt;Why does it exist?&lt;/li&gt;
&lt;li&gt;What does it depend on?&lt;/li&gt;
&lt;li&gt;What can go wrong?&lt;/li&gt;
&lt;li&gt;Where should I make a change?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If the answers are obvious, you've probably done something right.&lt;/p&gt;
&lt;h3 id=&quot;6-your-future-self-is-another-developer&quot;&gt;6. Your future self is another developer&lt;/h3&gt;
&lt;p&gt;One of the best ways to think about code quality is this:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pretend someone else will maintain your code.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Then remember:&lt;/p&gt;
&lt;p&gt;That person might be you.&lt;/p&gt;
&lt;p&gt;Six months from now.&lt;/p&gt;
&lt;p&gt;At 1:47 AM.&lt;/p&gt;
&lt;p&gt;With a production incident.&lt;/p&gt;
&lt;p&gt;Suddenly that clever shortcut doesn't look so clever anymore.&lt;/p&gt;
&lt;p&gt;Good software development isn't just about making today's feature work.&lt;/p&gt;
&lt;p&gt;It's about leaving behind a system that doesn't punish the next person who has to work on it.&lt;/p&gt;
&lt;h3 id=&quot;the-real-definition-of-done-&quot;&gt;The real definition of “done”&lt;/h3&gt;
&lt;p&gt;Maybe we should stop saying:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;“The feature is done because it works.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A better definition might be:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;The feature is done when it works, is understandable, is testable, and can be changed without unnecessary fear.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That's a much higher standard.&lt;/p&gt;
&lt;p&gt;And we probably won't meet it every time.&lt;/p&gt;
&lt;p&gt;That's okay.&lt;/p&gt;
&lt;p&gt;Software engineering isn't about writing perfect code.&lt;/p&gt;
&lt;p&gt;It's about continuously reducing the amount of unnecessary complexity we leave behind.&lt;/p&gt;
&lt;p&gt;Because eventually, every developer learns the same lesson:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The hardest code isn't the code that doesn't work.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It's the code that works perfectly—and nobody understands why.&lt;/strong&gt;&lt;/p&gt;
&lt;h4 id=&quot;what-do-you-think-&quot;&gt;What do you think?&lt;/h4&gt;
&lt;p&gt;What's one piece of code you've inherited that &lt;strong&gt;worked perfectly but was almost impossible to maintain?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I'd love to hear the worst or funniest example you've encountered.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/24637/the-code-works-so-why-does-it-still-feel-like-bad-software</guid>
<pubDate>Fri, 14 Aug 2026 14:10:18 +0000</pubDate>
</item>
<item>
<title>10 VS Code Extensions Every Frontend Developer Needs</title>
<link>https://coderlegion.com/22992/10-vs-code-extensions-every-frontend-developer-needs</link>
<description>&lt;h2 id=&quot;introduction&quot;&gt;Introduction&lt;/h2&gt;
&lt;p&gt;I used to install every extension that looked interesting — ended up with 40+ extensions and a VS Code that took 10 seconds just to open. Eventually I stripped it back down to the ones I actually use every single day.&lt;/p&gt;
&lt;p&gt;These 10 are the ones that survived that cleanup. If you're setting up a fresh frontend dev environment, start here.&lt;/p&gt;
&lt;h3 id=&quot;1-eslint&quot;&gt;1. ESLint&lt;/h3&gt;
&lt;p&gt;Catches bugs and enforces consistent code style before you even run your code. If you're working in a team (or want to look like you know what you're doing), this is non-negotiable.&lt;/p&gt;
&lt;h3 id=&quot;2-prettier-code-formatter&quot;&gt;2. Prettier — Code Formatter&lt;/h3&gt;
&lt;p&gt;Auto-formats your code on save. No more arguing about tabs vs. spaces or where semicolons go — Prettier just decides and moves on.&lt;/p&gt;
&lt;p&gt;Setup tip: Enable &quot;Format on Save&quot; in VS Code settings so it happens automatically.&lt;/p&gt;
&lt;h3 id=&quot;3-tailwind-css-intellisense&quot;&gt;3. Tailwind CSS IntelliSense&lt;/h3&gt;
&lt;p&gt;If you're using Tailwind (and you should be, per Article 3), this gives you autocomplete for class names, shows the actual CSS values on hover, and even highlights conflicting classes.&lt;/p&gt;
&lt;h3 id=&quot;4-auto-rename-tag&quot;&gt;4. Auto Rename Tag&lt;/h3&gt;
&lt;p&gt;Rename an opening HTML/JSX tag and the closing tag updates automatically. Small thing, saves real time, especially in nested JSX.&lt;/p&gt;
&lt;h3 id=&quot;5-bracket-pair-colorizer-built-in-now-&quot;&gt;5. Bracket Pair Colorizer (Built-in now)&lt;/h3&gt;
&lt;p&gt;VS Code now has this built in by default — matching brackets get color-coded so you can actually see which { belongs to which } in deeply nested code. Just make sure it's enabled in settings.&lt;/p&gt;
&lt;h3 id=&quot;6-gitlens&quot;&gt;6. GitLens&lt;/h3&gt;
&lt;p&gt;Shows you who changed a line of code and when, right inline in the editor. Incredibly useful once you're working with any kind of version history — even solo projects benefit from seeing your own commit history at a glance.&lt;/p&gt;
&lt;h3 id=&quot;7-live-server&quot;&gt;7. Live Server&lt;/h3&gt;
&lt;p&gt;Spins up a local development server with live reload in one click — no need to manually refresh the browser every time you save a file. Especially useful for plain HTML/CSS/JS projects without a build tool.&lt;/p&gt;
&lt;h3 id=&quot;8-thunder-client&quot;&gt;8. Thunder Client&lt;/h3&gt;
&lt;p&gt;A lightweight REST API client built directly into VS Code. If you're testing an API endpoint for a project, you don't need to leave your editor or open Postman separately.&lt;/p&gt;
&lt;h3 id=&quot;9-error-lens&quot;&gt;9. Error Lens&lt;/h3&gt;
&lt;p&gt;Shows error and warning messages inline, right next to the line of code causing the problem, instead of making you check the Problems panel. Cuts down debugging time noticeably.&lt;/p&gt;
&lt;h3 id=&quot;10-material-icon-theme&quot;&gt;10. Material Icon Theme&lt;/h3&gt;
&lt;p&gt;Purely visual, but genuinely useful — gives every file type a distinct, recognizable icon in your file explorer. Makes navigating a large project noticeably faster once your eyes learn the icon shapes.&lt;/p&gt;
&lt;p&gt;How to Install Any of These&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open VS Code&lt;/li&gt;
&lt;li&gt;Click the Extensions icon in the sidebar (or Ctrl+Shift+X)&lt;/li&gt;
&lt;li&gt;Search the extension name&lt;/li&gt;
&lt;li&gt;Click Install&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That's it — no restart usually needed.&lt;/p&gt;
&lt;h3 id=&quot;final-thoughts&quot;&gt;Final Thoughts&lt;/h3&gt;
&lt;p&gt;You don't need 40 extensions to be productive — you need the right 8 to 10. Install these, use them for a week, and you'll notice fewer small annoyances and less time spent on formatting, tag matching, and manual browser refreshing.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Muhammad Farhan&lt;/strong&gt; is a Frontend Developer specializing in React.js and Tailwind CSS, based in Dera Ismail Khan, Pakistan.&lt;br&gt;
&lt;strong&gt;Portfolio:&lt;/strong&gt; &lt;em&gt;muhammad-farhan-dev.github.io/muhammadfarhan.dev&lt;/em&gt;&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/22992/10-vs-code-extensions-every-frontend-developer-needs</guid>
<pubDate>Fri, 24 Jul 2026 05:00:00 +0000</pubDate>
</item>
<item>
<title>Taming the Python and VS Code Workspace Environment</title>
<link>https://coderlegion.com/22304/taming-the-python-and-vs-code-workspace-environment</link>
<description>&lt;p&gt;&lt;strong&gt;The Setup Blueprint&lt;/strong&gt;&lt;br&gt;
Constructing a reliable Python pipeline in VS Code requires anchoring the system with isolated environments. After deploying the editor and core extensions, the workflow shifts to generating a distinct environment layer. Linking the terminal profile to initialize this space automatically upon workspace boot keeps the development loop tight.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Where the Environment Breaks&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Silent package drifting where pip installs dependencies globally because the active terminal failed to inherit the workspace context.&lt;/p&gt;
&lt;p&gt;Debugger configuration conflicts resulting from launch JSON files pointing to generic entry files rather than the active workspace module.&lt;/p&gt;
&lt;p&gt;Formatters clashing violently when Black and Yapf attempt to format the same file simultaneously on save.&lt;/p&gt;
&lt;p&gt;Environment variable leakage where local env files are ignored by the built-in debugging terminal.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Restoring System Stability&lt;/strong&gt;&lt;br&gt;
Fixing these active environment issues means enforcing strict automation. Leveraging workspace-specific settings files forces the editor to bind directly to the local project directory structure. Crafting explicit launch configurations inside the hidden configuration directory guarantees that the debugger always triggers the correct entry script. Designating a single formatting tool while strictly disabling competing linters prevents save-on-format loops. Injecting an explicit path mapping into the environment setup ensures the debugging terminal natively loads all local secret keys.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Visit our official site: www.nextbigcreative.com&lt;/strong&gt;&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/22304/taming-the-python-and-vs-code-workspace-environment</guid>
<pubDate>Sat, 11 Jul 2026 13:18:24 +0000</pubDate>
</item>
<item>
<title>Built Log Stripper: A VS Code Extension to Remove Debug Logs Across 23+ Languages</title>
<link>https://coderlegion.com/21644/built-log-stripper-a-vs-code-extension-to-remove-debug-logs-across-23-languages</link>
<description>&lt;p&gt;Every developer has a version of this story.&lt;/p&gt;
&lt;p&gt;You're about to open a pull request. The code works. The tests pass. Everything looks good.&lt;/p&gt;
&lt;p&gt;Then you do one final scan and find this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;console.log(&quot;HERE&quot;);
console.log(&quot;user:&quot;, user);
console.log(&quot;final:&quot;, result);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And then, before the PR:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Search → Delete. Search → Delete. Search → Delete.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I got tired of it. So I built a tool to automate it.&lt;/p&gt;
&lt;h3 id=&quot;what-is-log-stripper-&quot;&gt;What is Log Stripper?&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Log Stripper&lt;/strong&gt; is a VS Code extension that removes debug, log, and print statements from &lt;strong&gt;23+ programming languages&lt;/strong&gt; - with a preview so you always see what will be deleted before anything changes.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cboyc43q1b3yqlllnv9i.png&quot; alt=&quot;Log Stripper Icon&quot;&gt;&lt;/p&gt;
&lt;p&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://marketplace.visualstudio.com/items?itemName=saurabhchoudhary.log-stripper&quot;&gt;VS Code Marketplace&lt;/a&gt;&lt;br&gt;
 &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/saurabhzaiswal/Log-Stripper-VS-Code&quot;&gt;GitHub&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;the-features&quot;&gt;The Features&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt; Preview mode&lt;/strong&gt; - &lt;code&gt;Ctrl+Shift+D&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Shows every line that will be removed. You confirm. Only then does anything change.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt; Highlight mode&lt;/strong&gt; - &lt;code&gt;Ctrl+Shift+H&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Marks debug lines in red. No file modification. Review first, strip later.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;  23+ languages&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;JS, TS, Python, Java, Go, Rust, C#, Swift, Kotlin, Dart, Ruby, PHP, C, C++, Shell, Lua, Scala, Elixir, Haskell, R, Vue, Svelte, JSX/TSX&lt;/p&gt;
&lt;p&gt;&lt;strong&gt; Workspace cleanup&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Strip debug statements from an entire project in one command.&lt;/p&gt;
&lt;h3 id=&quot;why-not-just-use-grep-sed-&quot;&gt;Why not just use grep/sed?&lt;/h3&gt;
&lt;p&gt;You could. But:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;No preview&lt;/li&gt;
&lt;li&gt;No multiline support&lt;/li&gt;
&lt;li&gt;No VS Code integration&lt;/li&gt;
&lt;li&gt;No safety rules&lt;/li&gt;
&lt;li&gt;Works differently on Windows vs Mac vs Linux&lt;br&gt;
Log Stripper handles all of this inside VS Code with a consistent UX.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;the-interesting-technical-part-multiline-removal&quot;&gt;The Interesting Technical Part: Multiline Removal&lt;/h3&gt;
&lt;p&gt;Removing a single-line &lt;code&gt;console.log(&quot;x&quot;)&lt;/code&gt; is trivial. The interesting case is:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;console.log(
  &quot;user:&quot;,
  JSON.stringify(user, null, 2),
  &quot;role:&quot;,
  user.role
);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To remove this correctly, you need to:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Find the opening &lt;code&gt;(&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Track paren depth across lines&lt;/li&gt;
&lt;li&gt;Handle parens inside strings (don't count those)&lt;/li&gt;
&lt;li&gt;Find the exact closing &lt;code&gt;)&lt;/code&gt; and optional &lt;code&gt;;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Remove the entire block without touching surrounding code&lt;br&gt;
Here's the core of &lt;code&gt;skipParenBlock&lt;/code&gt;:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-typescript&quot;&gt;function skipParenBlock(lines: string[], startLine: number) {
  const openIdx = lines[startLine].indexOf(&quot;(&quot;);
  let bal = 1, li = startLine, ci = openIdx + 1;
  let inStr: string | null = null;
 
  while (li &amp;lt; lines.length) {
    const s = lines[li];
    while (ci &amp;lt; s.length) {
      const ch = s[ci];
      if (inStr) {
        if (ch === &quot;\\&quot;) { ci += 2; continue; }
        if (ch === inStr) inStr = null;
      } else if (ch === '&quot;' || ch === &quot;'&quot; || ch === &quot;`&quot;) {
        inStr = ch;
      } else if (ch === &quot;(&quot;) {
        bal++;
      } else if (ch === &quot;)&quot;) {
        bal--;
        if (bal === 0) {
          ci++;
          if (s[ci] === &quot;;&quot;) ci++;
          return { endLine: li, endCol: ci };
        }
      }
      ci++;
    }
    li++; ci = 0;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;architecture-decision&quot;&gt;Architecture Decision&lt;/h3&gt;
&lt;p&gt;I separated the core logic from the VS Code layer:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;src/
├── extension.ts   ← VS Code commands, UI, workspace
└── stripper.ts    ← Pure logic, zero VS Code deps
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Why? Because &lt;code&gt;stripper.ts&lt;/code&gt; can be tested without launching a VS Code host:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;node --test out-test/test/stripper.test.js
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;151 tests. Fast. No mocking needed.&lt;/p&gt;
&lt;h3 id=&quot;safety-rules&quot;&gt;Safety Rules&lt;/h3&gt;
&lt;p&gt;The extension will &lt;strong&gt;never&lt;/strong&gt; remove:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;// console.log(&quot;commented&quot;) ← comment line, always kept
return console.log(x);       ← inline code, always kept
const x = doThing() || console.log(&quot;fallback&quot;); ← inline, kept
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Only whole-statement debug calls that are the entire line (after indentation) are removed.&lt;/p&gt;
&lt;h3 id=&quot;the-languages-covered&quot;&gt;The Languages Covered&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Language &lt;/th&gt;&lt;th&gt;Examples&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;JS/TS &lt;/td&gt;&lt;td&gt;&lt;code&gt;console.log&lt;/code&gt;, &lt;code&gt;debugger&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Python &lt;/td&gt;&lt;td&gt;&lt;code&gt;print()&lt;/code&gt;, &lt;code&gt;logging.debug()&lt;/code&gt;, &lt;code&gt;breakpoint()&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Java &lt;/td&gt;&lt;td&gt;&lt;code&gt;System.out.println&lt;/code&gt;, &lt;code&gt;logger.debug()&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Go &lt;/td&gt;&lt;td&gt;&lt;code&gt;fmt.Println&lt;/code&gt;, &lt;code&gt;log.Fatal&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Rust &lt;/td&gt;&lt;td&gt;&lt;code&gt;println!&lt;/code&gt;, &lt;code&gt;dbg!&lt;/code&gt;, &lt;code&gt;eprintln!&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;C# &lt;/td&gt;&lt;td&gt;&lt;code&gt;Console.WriteLine&lt;/code&gt;, &lt;code&gt;Debug.Write&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Swift &lt;/td&gt;&lt;td&gt;&lt;code&gt;print()&lt;/code&gt;, &lt;code&gt;NSLog()&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Ruby &lt;/td&gt;&lt;td&gt;&lt;code&gt;puts&lt;/code&gt;, &lt;code&gt;binding.pry&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;PHP &lt;/td&gt;&lt;td&gt;&lt;code&gt;var_dump()&lt;/code&gt;, &lt;code&gt;dd()&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Shell &lt;/td&gt;&lt;td&gt;&lt;code&gt;echo&lt;/code&gt;, &lt;code&gt;printf&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;...13 more &lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;try-it&quot;&gt;Try It&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Install from Marketplace
code --install-extension saurabhchoudhary.log-stripper
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Or search &quot;Log Stripper&quot; in the VS Code extensions panel.&lt;/p&gt;
&lt;p&gt;Open a file with debug statements → &lt;code&gt;Ctrl+Shift+D&lt;/code&gt; → see the preview → confirm.&lt;/p&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;Toggle Debug Highlights | Highlight/unhighlight debug lines&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hgrpgwbxhy3us1132fx5.png&quot; alt=&quot;Toggle Debug Highlights | Highlight/unhighlight debug lines&quot;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;Preview &amp;amp; Strip Current File | Shows preview, then strips on confirm&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vprhyo035tbopzpi6qp2.png&quot; alt=&quot;Preview &amp;amp; Strip Current File | Shows preview, then strips on confirm&quot;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;Command Palette | Strip Entire Workspace | Clean whole project&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5ulbtysszpopdgwx0qn5.png&quot; alt=&quot;Command Palette | Strip Entire Workspace | Clean whole project&quot;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;Right-click → menu | Strip Current File | Strip without preview&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/r3n9kak7vn3m9eo6bogp.png&quot; alt=&quot;Right-click → menu | Strip Current File | Strip without preview&quot;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;Editor toolbar icons (eye / eye-closed / trash)&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kiai3594p78j7f12qpt9.png&quot; alt=&quot;Editor toolbar icons (eye / eye-closed / trash)&quot;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Built this because I couldn't find a tool that did all of this properly. Turned out to be one of the most satisfying weekend projects I've done.&lt;/p&gt;
&lt;p&gt;If you try it, I'd love feedback in the comments or as a GitHub issue. &lt;/p&gt;
&lt;p&gt;&lt;em&gt;By Saurabh Choudhary - Software Engineer&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;introduction-1&quot;&gt;Introduction&lt;/h3&gt;
&lt;p&gt;Every developer has a version of this story.&lt;/p&gt;
&lt;p&gt;You're about to open a pull request. The code works. The tests pass. You're ready. Then you do one last scroll through the file and see it:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;console.log(&quot;HERE&quot;);
console.log(&quot;user data:&quot;, JSON.stringify(userData));
console.log(&quot;response&quot;, res);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Three debug logs you forgot to remove. You delete them, re-run the linter, and open the PR.&lt;/p&gt;
&lt;p&gt;Two weeks later, someone reports that production logs are noisy with debug output. A developer on your team had left a &lt;code&gt;logger.debug()&lt;/code&gt; in a hot path. Nobody caught it in review.&lt;/p&gt;
&lt;p&gt;This isn't a rare occurrence. It's a pattern that plays out in every team, on every codebase, in every programming language.&lt;/p&gt;
&lt;p&gt;I've experienced it across JavaScript, TypeScript, PHP, Go, Python, Vue.js, NestJS, Laravel, and Angular projects. Different languages, different ecosystems - same repetitive problem.&lt;/p&gt;
&lt;p&gt;Eventually I stopped accepting it as &quot;just part of the workflow&quot; and decided to build a proper solution.&lt;/p&gt;
&lt;p&gt;That solution is &lt;strong&gt;Log Stripper&lt;/strong&gt; - a VS Code extension that removes debug, log, and print statements from 23+ programming languages with a safety-first, preview-driven approach.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;the-problem&quot;&gt;The Problem&lt;/h3&gt;
&lt;p&gt;The problem has two dimensions that are easy to underestimate.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;First: it's repetitive.&lt;/strong&gt; Before every commit, before every PR, before every release, developers go through the same manual process of searching for and deleting debug statements. On large codebases with dozens of files touched in a single feature branch, this becomes genuinely time-consuming.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Second: it's error-prone.&lt;/strong&gt; Humans miss things. A &lt;code&gt;console.log&lt;/code&gt; inside a nested callback, a &lt;code&gt;print()&lt;/code&gt; inside a conditional branch, a &lt;code&gt;System.out.println&lt;/code&gt; buried in a Java service - these are easy to overlook when scanning files manually. And when they slip through, they end up in production.&lt;/p&gt;
&lt;p&gt;There's also a subtler issue: developers working under time pressure will rush the cleanup. The more pressure, the more likely something gets missed.&lt;/p&gt;
&lt;p&gt;This is exactly the kind of task that should be automated. It is deterministic, repetitive, and rule-based. A computer should do it.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;why-existing-workflows-were-frustrating&quot;&gt;Why Existing Workflows Were Frustrating&lt;/h3&gt;
&lt;p&gt;Before building Log Stripper, I searched for existing solutions.&lt;/p&gt;
&lt;p&gt;I found a few extensions that handled &lt;code&gt;console.log&lt;/code&gt; removal for JavaScript. Some worked well for that specific case. But they had significant limitations:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Language coverage was narrow.&lt;/strong&gt; Most extensions focused exclusively on JavaScript. If you wrote Python, Go, Java, or Rust, you were on your own.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;No preview mode.&lt;/strong&gt; Several extensions deleted statements immediately without showing you what would be removed. That's unsafe. A developer who accidentally removes a legitimate logger call in production code will stop trusting the tool immediately.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;No highlight mode.&lt;/strong&gt; Sometimes I want to &lt;em&gt;see&lt;/em&gt; the debug statements in a file without removing anything yet. I want to review them, understand them, decide manually. None of the tools I found offered non-destructive inspection.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;No workspace cleanup.&lt;/strong&gt; File-by-file cleanup doesn't scale. Before a major release, I want to scan an entire project and clean everything in one pass.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Unreliable multiline handling.&lt;/strong&gt; A &lt;code&gt;console.log&lt;/code&gt; that spans multiple lines is common:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;console.log(
  &quot;processing user:&quot;,
  JSON.stringify(user, null, 2)
);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Many tools would only remove the first line and leave the rest, creating syntax errors.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;why-i-built-log-stripper&quot;&gt;Why I Built Log Stripper&lt;/h3&gt;
&lt;p&gt;The decision to build rather than adapt came down to one realization: the problem deserved a proper solution, not a workaround.&lt;/p&gt;
&lt;p&gt;I wanted an extension that:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Worked across every major language I use day-to-day&lt;/li&gt;
&lt;li&gt;Showed a preview before making any changes&lt;/li&gt;
&lt;li&gt;Could highlight debug lines without modifying files&lt;/li&gt;
&lt;li&gt;Could clean an entire workspace safely&lt;/li&gt;
&lt;li&gt;Was smart enough to never break code it shouldn't touch&lt;/li&gt;
&lt;li&gt;Was backed by automated tests&lt;br&gt;
None of those requirements are unreasonable. Together, they're the minimum bar for a tool I'd actually trust.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The weekend I started building it, I intended it to be a one-day project. It grew into something more substantial as I realized the edge cases, the safety requirements, and the value of doing it properly.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;architecture&quot;&gt;Architecture&lt;/h3&gt;
&lt;p&gt;The most important architectural decision I made was separating the core logic from the VS Code integration layer.&lt;/p&gt;
&lt;p&gt;The repository has two source files:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;src/
├── extension.ts    ← VS Code commands, UI, workspace operations
└── stripper.ts     ← Core strip logic (zero VS Code dependencies)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;stripper.ts&lt;/code&gt; has no awareness of VS Code. It takes a string of text and a language ID, and returns a new string with debug statements removed plus metadata about what was changed. That's it.&lt;/p&gt;
&lt;p&gt;This separation has two major benefits:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Testability.&lt;/strong&gt; I can test the core logic without launching a VS Code Extension Development Host. The 151 automated tests run with a plain &lt;code&gt;node --test&lt;/code&gt; command. Fast, simple, reliable.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Maintainability.&lt;/strong&gt; If VS Code changes its API, or if I want to port the logic to a CLI tool or a git pre-commit hook, the core logic doesn't need to change.&lt;/p&gt;
&lt;p&gt;The VS Code layer handles everything user-facing: commands, keybindings, settings, decorations, progress notifications, and workspace file scanning.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;multi-language-support&quot;&gt;Multi-Language Support&lt;/h3&gt;
&lt;p&gt;Supporting 23 languages sounds ambitious. The implementation is actually straightforward once you have the right architecture.&lt;/p&gt;
&lt;p&gt;Each language is a key in the &lt;code&gt;LANGUAGE_PATTERNS&lt;/code&gt; object, and its value is an array of regular expressions:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-typescript&quot;&gt;const LANGUAGE_PATTERNS: Record&amp;lt;string, RegExp[]&amp;gt; = {
  javascript: [
    /^(\s*)console\.(log|debug|info|warn|error|trace|...)\s*\(/,
    /^(\s*)debugger\s*;?$/,
  ],
  python: [
    /^(\s*)print\s*\(/,
    /^(\s*)logging\.(debug|info|warning|error|critical)\s*\(/,
    /^(\s*)breakpoint\s*\(\s*\)/,
  ],
  // ... 21 more languages
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Language aliases handle cases where VS Code's language ID differs from the pattern group:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-typescript&quot;&gt;const LANG_ALIASES: Record&amp;lt;string, string&amp;gt; = {
  svelte: &quot;javascript&quot;,
  &quot;vue-html&quot;: &quot;vue&quot;,
  typescriptreact: &quot;typescript&quot;,
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When the extension receives a file, it looks up the language ID, finds the pattern list, and applies each pattern against every line. If no patterns are found for a language, the file is returned unchanged.&lt;/p&gt;
&lt;p&gt;Adding a new language is a matter of adding one entry to &lt;code&gt;LANGUAGE_PATTERNS&lt;/code&gt; and a set of test cases to &lt;code&gt;stripper.test.ts&lt;/code&gt;. The infrastructure handles the rest.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;preview-mode&quot;&gt;Preview Mode&lt;/h3&gt;
&lt;p&gt;The preview mode was the feature I was most deliberate about designing.&lt;/p&gt;
&lt;p&gt;When a developer triggers &quot;Preview &amp;amp; Strip&quot; with &lt;code&gt;Ctrl+Shift+D&lt;/code&gt;, the extension:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Runs the stripping logic internally (without modifying the file)&lt;/li&gt;
&lt;li&gt;Collects the list of lines that would be removed&lt;/li&gt;
&lt;li&gt;Shows a modal dialog listing those lines with their line numbers&lt;/li&gt;
&lt;li&gt;Waits for explicit confirmation before making any changes&lt;br&gt;
This turns a potentially destructive operation into a fully transparent, opt-in action. The developer sees exactly what will happen and retains full control.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The modal includes the first 20 matching lines and appends &quot;...and N more&quot; if there are additional matches. This keeps the dialog readable on files with heavy debug coverage.&lt;/p&gt;
&lt;p&gt;If the developer cancels, nothing changes. Not a single character in the file is modified.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;highlight-mode&quot;&gt;Highlight Mode&lt;/h3&gt;
&lt;p&gt;Highlight mode solves a different need: &lt;em&gt;I want to see the debug statements but I'm not ready to remove them yet.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;When the developer presses &lt;code&gt;Ctrl+Shift+H&lt;/code&gt;, the extension:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Finds all lines matching debug patterns using &lt;code&gt;findDebugLineIndices()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Applies a VS Code text decoration that highlights those lines in red&lt;/li&gt;
&lt;li&gt;Adds an inline annotation &quot;← debug&quot; at the end of each line&lt;br&gt;
The file is not modified. This is purely a visual overlay.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Pressing &lt;code&gt;Ctrl+Shift+H&lt;/code&gt; again (or clicking the eye-closed icon in the toolbar) removes the highlights.&lt;/p&gt;
&lt;p&gt;The highlight controller also handles three lifecycle events automatically:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;When you &lt;strong&gt;strip the file&lt;/strong&gt;, highlights are cleared (no red lines on lines that no longer exist)&lt;/li&gt;
&lt;li&gt;When you &lt;strong&gt;edit the file&lt;/strong&gt; and &lt;code&gt;refreshHighlightsOnEdit&lt;/code&gt; is enabled, highlights recompute after a 120ms debounce&lt;/li&gt;
&lt;li&gt;&lt;h3 id=&quot;when-you-switch-tabs-and-clearhighlightsontabchange-is-enabled-highlights-are-cleared-automatically&quot;&gt;When you &lt;strong&gt;switch tabs&lt;/strong&gt; and &lt;code&gt;clearHighlightsOnTabChange&lt;/code&gt; is enabled, highlights are cleared automatically&lt;/h3&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;workspace-cleanup&quot;&gt;Workspace Cleanup&lt;/h3&gt;
&lt;p&gt;The workspace strip command scans every file in the project matching the supported language extensions and strips debug statements from each one.&lt;/p&gt;
&lt;p&gt;The implementation uses VS Code's &lt;code&gt;workspace.findFiles()&lt;/code&gt; API with exclusion patterns to skip &lt;code&gt;node_modules&lt;/code&gt;, &lt;code&gt;dist&lt;/code&gt;, &lt;code&gt;.git&lt;/code&gt;, &lt;code&gt;vendor&lt;/code&gt;, &lt;code&gt;build&lt;/code&gt;, and &lt;code&gt;out&lt;/code&gt; by default. All exclusion patterns are configurable in settings.&lt;/p&gt;
&lt;p&gt;The operation runs with a progress notification showing the current file being processed and a cancellation option. After completion, a summary shows how many statements were removed across how many files.&lt;/p&gt;
&lt;p&gt;Because this modifies files on disk, the documentation explicitly recommends using version control. A git diff after the workspace strip is always informative.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;safety-design&quot;&gt;Safety Design&lt;/h3&gt;
&lt;p&gt;Safety was a first-class concern throughout the design.&lt;/p&gt;
&lt;p&gt;The extension enforces several rules to avoid breaking code it shouldn't touch:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rule 1: Whole-line only.&lt;/strong&gt; A debug call is only removed if it is the entire statement on the line (after indentation). This prevents removal of:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;return console.log(x);         // kept - inline with return
const result = doWork() || console.log(&quot;fallback&quot;);  // kept - chained
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Rule 2: Comments are never touched.&lt;/strong&gt; Any line where the first non-whitespace characters form a comment prefix (&lt;code&gt;//&lt;/code&gt;, &lt;code&gt;#&lt;/code&gt;, &lt;code&gt;--&lt;/code&gt;, &lt;code&gt;/*&lt;/code&gt;, &lt;code&gt;*&lt;/code&gt;) is skipped entirely.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rule 3: Multiline paren balancing.&lt;/strong&gt; When a debug call spans multiple lines, the extension tracks open and close parentheses (accounting for parens inside strings) to identify the exact end of the statement. The closing &lt;code&gt;)&lt;/code&gt; and optional &lt;code&gt;;&lt;/code&gt; are consumed, and any remaining code on that final line is preserved.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rule 4: No modification on cancel.&lt;/strong&gt; Preview mode never touches the file unless the user explicitly confirms. The stripping logic runs on an in-memory copy of the text, and the result is only written back if the user says yes.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;testing-strategy&quot;&gt;Testing Strategy&lt;/h3&gt;
&lt;p&gt;I wanted the extension to be trustworthy. That required a proper test suite.&lt;/p&gt;
&lt;p&gt;The tests live in &lt;code&gt;test/stripper.test.ts&lt;/code&gt; and use Node's built-in test runner - no Jest, no Mocha, no additional dependencies. The test command is:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;tsc -p tsconfig.test.json &amp;amp;&amp;amp; node --test out-test/test/stripper.test.js
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The 151 test cases cover:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Every language in &lt;code&gt;LANGUAGE_PATTERNS&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Simple single-line removal&lt;/li&gt;
&lt;li&gt;Multiline call removal with paren balancing&lt;/li&gt;
&lt;li&gt;Comment preservation&lt;/li&gt;
&lt;li&gt;Inline code preservation&lt;/li&gt;
&lt;li&gt;Real-world code samples (NestJS controllers, Python classes, Go functions)&lt;/li&gt;
&lt;li&gt;Language aliases (Vue, Svelte, JSX, TSX)&lt;/li&gt;
&lt;li&gt;Unknown languages (should be a no-op)&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;findDebugLineIndices()&lt;/code&gt; function (used by highlight mode)&lt;br&gt;
Each test specifies the input code, the expected output, and the expected removal count. Any test that would cause the extension to modify code it shouldn't - or fail to modify code it should - is a failing test.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Writing tests before polishing features was the right decision. It caught several edge cases during development and gave me confidence when refactoring the paren-balancing logic.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;publishing-to-the-vs-code-marketplace&quot;&gt;Publishing to the VS Code Marketplace&lt;/h3&gt;
&lt;p&gt;The Marketplace publishing process is simpler than I expected.&lt;/p&gt;
&lt;p&gt;The key steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Create a publisher account at &lt;code&gt;marketplace.visualstudio.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Generate a Personal Access Token from Azure DevOps with Marketplace → Manage scope&lt;/li&gt;
&lt;li&gt;Install &lt;code&gt;@vscode/vsce&lt;/code&gt; globally: &lt;code&gt;npm install -g @vscode/vsce&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;vsce package&lt;/code&gt; to create the &lt;code&gt;.vsix&lt;/code&gt; file&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;vsce publish --pat TOKEN&lt;/code&gt; or upload the &lt;code&gt;.vsix&lt;/code&gt; manually via the publisher portal&lt;br&gt;
The &lt;code&gt;.vscodeignore&lt;/code&gt; file controls what goes into the package. I excluded &lt;code&gt;src/&lt;/code&gt;, &lt;code&gt;test/&lt;/code&gt;, and &lt;code&gt;node_modules/&lt;/code&gt; - only the compiled &lt;code&gt;out/&lt;/code&gt; directory ships. This keeps the extension lightweight.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;One thing I'd emphasize: set the &lt;code&gt;repository.url&lt;/code&gt; in &lt;code&gt;package.json&lt;/code&gt; before publishing. It shows up prominently on the Marketplace listing and signals to users that the extension is open source and maintainable.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;lessons-learned&quot;&gt;Lessons Learned&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Separate your core logic from your integration layer.&lt;/strong&gt; This applies far beyond VS Code extensions. Any time you can isolate the testable business logic from the framework or platform code, do it. It makes everything easier.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Safety features build trust.&lt;/strong&gt; The preview mode and the &quot;never remove inline code&quot; rule weren't technically necessary for the extension to work. But they're what make a developer comfortable trusting the tool with real production code.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Test the edge cases first.&lt;/strong&gt; Multiline calls, strings containing parens, empty files, unsupported languages - these were the cases most likely to cause silent failures. Writing tests for them before the happy path forced me to build robust logic from the start.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ship before it's perfect.&lt;/strong&gt; The first version didn't have highlight mode. The workspace strip was added later. Shipping v1 with the core feature - preview and strip - got real feedback faster than spending another two weeks on features users might not need.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Small tools have real value.&lt;/strong&gt; This isn't a SaaS platform. It's not an AI product. It's a focused tool that does one thing well. Developer tools like this get used quietly but consistently. That's enough.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;future-improvements&quot;&gt;Future Improvements&lt;/h3&gt;
&lt;p&gt;Several improvements are on the roadmap:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Custom pattern rules.&lt;/strong&gt; Allow developers to define their own patterns to remove. For teams using custom logging frameworks, this would make Log Stripper work with any codebase.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pre-commit hook integration.&lt;/strong&gt; A script or CLI wrapper that can run as a git pre-commit hook, catching debug statements before they ever reach a commit.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Team-wide configuration.&lt;/strong&gt; A &lt;code&gt;.logstripper.json&lt;/code&gt; configuration file that defines excluded patterns per project, shareable across a team through version control.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ignore comments.&lt;/strong&gt; A &lt;code&gt;// log-stripper-ignore&lt;/code&gt; annotation that tells the extension to skip a specific line or block.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;More language coverage.&lt;/strong&gt; Zig, Nim, OCaml, and Erlang are candidates for future additions.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Log Stripper is a small tool. It solves one problem, and it solves it well.&lt;/p&gt;
&lt;p&gt;But the process of building it taught me something more valuable than any individual feature: the instinct to look at a repetitive problem and ask &quot;why am I doing this manually?&quot; is one of the most productive instincts an engineer can develop.&lt;/p&gt;
&lt;p&gt;We accept small frictions as part of the job. We work around limitations instead of fixing them. We solve the same problem repeatedly instead of automating it once.&lt;/p&gt;
&lt;p&gt;Log Stripper exists because I stopped accepting one of those frictions.&lt;/p&gt;
&lt;p&gt;If you're reading this and you have something similar - a small repetitive task, an annoying workflow step, a gap in your tooling - build the solution. The process will teach you more than you expect, and the tool will serve you for years.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Try Log Stripper:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;VS Code Marketplace: &lt;a rel=&quot;nofollow&quot; href=&quot;https://marketplace.visualstudio.com/items?itemName=saurabhchoudhary.log-stripper&quot;&gt;https://marketplace.visualstudio.com/items?itemName=saurabhchoudhary.log-stripper&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;GitHub: &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/saurabhzaiswal/Log-Stripper-VS-Code&quot;&gt;https://github.com/saurabhzaiswal/Log-Stripper-VS-Code&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I'm actively improving Log Stripper, so real-world feedback is incredibly valuable.&lt;/p&gt;
&lt;p&gt;If Log Stripper helps keep a few forgotten debug statements out of production, then it has already paid for itself.&lt;/p&gt;
&lt;hr&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/21644/built-log-stripper-a-vs-code-extension-to-remove-debug-logs-across-23-languages</guid>
<pubDate>Tue, 30 Jun 2026 19:55:01 +0000</pubDate>
</item>
<item>
<title>I built a free IDE extension to catch malicious npm packages before they wreck your project</title>
<link>https://coderlegion.com/20889/i-built-free-ide-extension-to-catch-malicious-npm-packages-before-they-wreck-your-project</link>
<description>&lt;p&gt;Supply-chain attacks via npm are up year-over-year — packages like &lt;code&gt;event-stream&lt;/code&gt;, &lt;br&gt;
the Lazarus group drops, and AI-hallucinated typosquats keep landing in real codebases. &lt;br&gt;
I got tired of finding out &lt;em&gt;after&lt;/em&gt; the fact, so I built &lt;strong&gt;NPM Safety Guard&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&quot;what-it-does&quot;&gt;What it does&lt;/h3&gt;
&lt;p&gt;It scans your &lt;code&gt;package.json&lt;/code&gt; and lockfiles right inside your editor — no separate CLI step.&lt;/p&gt;
&lt;p&gt;Here's what it currently catches across &lt;strong&gt;22 detection layers&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Known malicious packages&lt;/strong&gt; — DPRK RAT drops, Lazarus-linked packages, event-stream clones&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CVEs&lt;/strong&gt; — via OSV.dev, cached locally (free, no API key needed)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Typosquatting &amp;amp; homoglyph attacks&lt;/strong&gt; — catches &lt;code&gt;lodahs&lt;/code&gt;, &lt;code&gt;reàct&lt;/code&gt;, and AI-hallucinated package names&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Install script hooks&lt;/strong&gt; — flags &lt;code&gt;preinstall&lt;/code&gt;/&lt;code&gt;postinstall&lt;/code&gt; before you run them&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deep tarball AST scan&lt;/strong&gt; — detects obfuscation, &lt;code&gt;eval&lt;/code&gt;, and payload patterns in the actual source&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dependency confusion&lt;/strong&gt; — scoped packages planted on public npm to hijack private installs&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Exposed secrets&lt;/strong&gt; — API keys, tokens, private keys accidentally left in &lt;code&gt;.env&lt;/code&gt;, &lt;code&gt;.npmrc&lt;/code&gt;, &lt;code&gt;.pem&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MCP server config scanner&lt;/strong&gt; — catches typosquatted or malicious MCP transport configs&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Supply chain graph&lt;/strong&gt; — interactive force-directed graph with risk overlay from your lockfile&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OSSF Scorecard + Socket.dev score&lt;/strong&gt; — security hygiene at a glance&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;where-to-get-it&quot;&gt;Where to get it&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;VS Code / Cursor / Windsurf →&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://marketplace.visualstudio.com/items?itemName=jomynn.npm-safety-guard&quot;&gt;VS Code Marketplace&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;VS Codium / open-source IDEs →&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://open-vsx.org/extension/jomynn/npm-safety-guard&quot;&gt;Open VSX Registry&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WebStorm / IntelliJ IDEA / all JetBrains IDEs →&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://plugins.jetbrains.com/plugin/com.sendwavehub.npmsafetyguard&quot;&gt;JetBrains Marketplace&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All free. No account required for the core layers. MIT licensed on the VS Code side.&lt;/p&gt;
&lt;h3 id=&quot;under-the-hood&quot;&gt;Under the hood&lt;/h3&gt;
&lt;p&gt;The VS Code extension is TypeScript. The JetBrains plugin is Kotlin. They share the same &lt;br&gt;
detection signatures bundled at build time — no cloud dependency for the core scan.&lt;/p&gt;
&lt;p&gt;CVE lookups hit OSV.dev with a 24-hour local cache so you're not waiting on a network &lt;br&gt;
call every keystroke.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Have you been burned by a supply-chain attack before? Or do you have a detection layer &lt;br&gt;
you wish existed? Drop it in the comments — I'm actively adding new signatures.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/20889/i-built-free-ide-extension-to-catch-malicious-npm-packages-before-they-wreck-your-project</guid>
<pubDate>Thu, 18 Jun 2026 08:44:52 +0000</pubDate>
</item>
<item>
<title>Why I Feel at Home in the Microsoft Development Environment</title>
<link>https://coderlegion.com/19686/why-i-feel-at-home-in-the-microsoft-development-environment</link>
<description>&lt;p&gt;There is a certain &quot;antigravity&quot; feeling when your tools just work.&lt;/p&gt;
&lt;p&gt;I’ve spent a lot of time jumping between different setups, but lately, I’ve found a real sense of comfort in the Microsoft development ecosystem. It’s not just about the brand; it’s about the seamless flow between the editor, the terminal, and the cloud.&lt;/p&gt;
&lt;p&gt;Why it works for me: &lt;/p&gt;
&lt;p&gt;VS Code is the heart: From React development for my &lt;a rel=&quot;nofollow&quot; href=&quot;https://arabiz.seosiri.com/&quot;&gt;Arabiz&lt;/a&gt; project to simple script editing, the extension ecosystem (like GitHub Copilot and the integrated terminal) keeps me in &quot;the flow.&quot;&lt;/p&gt;
&lt;p&gt;Integrated Terminal: As I was working earlier today, being able to switch from PowerShell to CMD or WSL within the same window is a huge productivity booster.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a8rh1s5x0shp01x601kf.png&quot; alt=&quot;My VS Code and Microsoft Dev Environment setup&quot;&gt;&lt;/p&gt;
&lt;p&gt;The Ecosystem: With GitHub and Azure integration, the path from &quot;local code&quot; to &quot;production&quot; feels much shorter than it used to.&lt;br&gt;
I noticed the #antigravity tag—sometimes it really does feel like Python’s famous joke: when the environment is set up correctly, you feel like you can just fly.&lt;/p&gt;
&lt;p&gt;What about you?&lt;/p&gt;
&lt;p&gt;Do you prefer the Microsoft stack, or are you strictly a Vim/Linux purist? I’d love to hear what makes your dev environment &quot;comfortable.&quot;&lt;/p&gt;
&lt;h2 id=&quot;development-developers-vscode-antigravity&quot;&gt;development #developers #vscode #antigravity&lt;/h2&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/19686/why-i-feel-at-home-in-the-microsoft-development-environment</guid>
<pubDate>Thu, 04 Jun 2026 17:25:02 +0000</pubDate>
</item>
<item>
<title>FocusForge</title>
<link>https://coderlegion.com/16985/focusforge</link>
<description>&lt;p&gt;Let me be real with you.&lt;/p&gt;
&lt;p&gt;Last semester, I was convinced I was putting in solid hours every day. I'd sit down at 10am, open VS Code, and look up at the clock — it'd be 4pm. Six hours. That felt productive.&lt;/p&gt;
&lt;p&gt;But when exam season hit and I needed to actually &lt;em&gt;measure&lt;/em&gt; what I'd been doing, I had nothing. No data. No proof to myself. Just vibes and a half-finished project.&lt;/p&gt;
&lt;p&gt;I tried timer apps. I tried Toggl. I tried writing it down in Obsidian. None of it stuck because &lt;strong&gt;the context switch killed me&lt;/strong&gt; — having to go &lt;em&gt;outside&lt;/em&gt; my editor to log a session meant I just... didn't.&lt;/p&gt;
&lt;p&gt;And VS Code? VS Code, which I live in for 8+ hours a day, had absolutely nothing built in for this.&lt;/p&gt;
&lt;p&gt;No session timer. No focus score. No &quot;hey, you've been idle for 20 minutes, are you still actually working?&quot; No Pomodoro. No history of which projects ate your week. Nothing.&lt;/p&gt;
&lt;p&gt;That gap felt absurd to me. So I built something.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;meet-focusforge&quot;&gt;Meet FocusForge&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/f0e5fuhgzenwny2esg4y.png&quot; alt=&quot;Image description&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://marketplace.visualstudio.com/items?itemName=NK2552003.focusforge&quot;&gt;FocusForge: Coding Session Tracker&lt;/a&gt;&lt;/strong&gt; — a VS Code extension that turns your editor into a local-first productivity cockpit.&lt;/p&gt;
&lt;p&gt;It tracks what &lt;em&gt;actually&lt;/em&gt; matters:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Real active time&lt;/strong&gt; — not just &quot;window open&quot; time. It detects when you're idle and separates it from genuine work time.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Focus Score&lt;/strong&gt; — a live gauge built from your active ratio, flow minutes, break hygiene, and idle interruptions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pomodoro Mode&lt;/strong&gt; — 25/5/15 defaults, auto-advance, sound, status badges, all native inside VS Code.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flow State detection&lt;/strong&gt; — once you've been heads-down for 25 minutes straight, it recognizes that and tracks it separately.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Project analytics&lt;/strong&gt; — auto-detected from your Git workspace so you know exactly where your hours are going.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Session journal&lt;/strong&gt; — add a mood, a one-liner about what you worked on, blockers. Perfect for standups.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;100+ achievements&lt;/strong&gt; — because learning to code is hard, and small wins matter.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitHub Issue integration&lt;/strong&gt; — log, comment, close issues right from your sidebar.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Weekly reports&lt;/strong&gt; — Markdown or HTML, saved locally in &lt;code&gt;.vscode/session-reports/&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All of it lives in your VS Code global state. No cloud. No account. No extension-owned backend. Your data is yours.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;the-problem-vs-code-doesn-t-solve-yet-&quot;&gt;The Problem VS Code Doesn't Solve (Yet)&lt;/h3&gt;
&lt;p&gt;Here's what surprised me when I started building this: VS Code is &lt;em&gt;incredibly&lt;/em&gt; powerful but treats your time as completely invisible.&lt;/p&gt;
&lt;p&gt;You can see which file you're editing. You can see Git blame. You can see lint errors in real time. But it has no concept of:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;How long you've been coding today&lt;/strong&gt; vs. how long you've had the editor open&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Whether you're in a flow state&lt;/strong&gt; or just context-switching every 3 minutes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Which project is actually consuming your week&lt;/strong&gt; (hint: never the one you think)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;How many Pomodoros you completed&lt;/strong&gt; before you hit burnout&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;What you were working on last Tuesday&lt;/strong&gt; when your team asks in standup&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For students especially — where there's no manager tracking your hours, no ticket system forcing structure — this invisibility is brutal. You lose entire weeks without realizing it.&lt;/p&gt;
&lt;p&gt;FocusForge makes all of that visible.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;how-it-actually-works&quot;&gt;How It Actually Works&lt;/h3&gt;
&lt;p&gt;When you open VS Code with FocusForge installed, it starts a session automatically. From there:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Today tab&lt;/strong&gt; gives you a live dashboard — active time, idle time, efficiency percentage, current state (active / idle / paused / flow / deep work), a Focus Score gauge with color zones, and a 12-week contribution-style heatmap.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Deep Work Mode&lt;/strong&gt; is my personal favourite. It's a focused coding block that hides the activity bar, mutes notifications, and gives you a full-screen distraction-free environment with a countdown. When you're studying for a test or pushing to finish a feature before deadline, this mode is the difference.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The History tab&lt;/strong&gt; shows a 14-session bar chart with clickable detail panels — active time, efficiency, focus score, peak streak, flow time, break counts, commits made during the session, and language breakdown.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Journal&lt;/strong&gt; is lightweight on purpose. Just a mood, a one-liner, optional blockers. The weekly view is perfect for async standups and self-reflection.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GitHub Issue Log&lt;/strong&gt; connects to your local repo automatically. No setup beyond a GitHub token if you want remote repos. You can create, comment, close, and log issue completions — and they'll show up in your weekly report.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;install-it&quot;&gt;Install It&lt;/h3&gt;
&lt;p&gt;Search &lt;strong&gt;FocusForge&lt;/strong&gt; in the VS Code Extensions tab, or:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;ext install NK2552003.focusforge
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Or grab it directly from the &lt;a rel=&quot;nofollow&quot; href=&quot;https://marketplace.visualstudio.com/items?itemName=NK2552003.focusforge&quot;&gt;VS Code Marketplace →&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;the-soundtrack-to-your-flow-state&quot;&gt;The Soundtrack to Your Flow State&lt;/h3&gt;
&lt;p&gt;Here's a feature I didn't plan but ended up loving more than almost anything else in FocusForge.&lt;/p&gt;
&lt;p&gt;I was three hours into a debugging session once, headphones in, streaming &lt;a rel=&quot;nofollow&quot; href=&quot;https://musicforprogramming.net&quot;&gt;musicforprogramming.net&lt;/a&gt; in a separate tab. The kind of slow, atmospheric, textural music specifically curated for deep coding work — no lyrics, no sudden drops, just long drifting soundscapes that keep your brain in a calm, engaged state.&lt;/p&gt;
&lt;p&gt;And then my tab crashed. Lost the music. Lost the flow. Closed my laptop out of frustration.&lt;/p&gt;
&lt;p&gt;That's when I discovered &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/isdampe/music-for-programming&quot;&gt;isdampe's &lt;code&gt;music-for-programming&lt;/code&gt;&lt;/a&gt; — a Node.js CLI that streams musicforprogramming.net (and toggleable rain from rainymood.com) directly into your terminal. Beautiful little tool. But it still meant context-switching out of my editor.&lt;/p&gt;
&lt;p&gt;So I brought it inside.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;FocusForge's Ambient Audio panel&lt;/strong&gt; streams directly from musicforprogramming.net — 70+ episodes of handpicked coding soundscapes, from drone textures to modular synthesis to field recordings — all playable right from your VS Code sidebar. No browser tab. No Spotify. No notifications from a separate app.&lt;/p&gt;
&lt;p&gt;You can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Browse and play any episode from the musicforprogramming.net catalogue&lt;/li&gt;
&lt;li&gt;Toggle rain overlay on/off (yes, rain + ambient music is genuinely incredible for focus)&lt;/li&gt;
&lt;li&gt;Set volume independently&lt;/li&gt;
&lt;li&gt;Auto-start audio when a session begins&lt;/li&gt;
&lt;li&gt;Audio pauses automatically when you go idle — resumes when you're back&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The pausing-on-idle part is what makes it feel &lt;em&gt;intentional&lt;/em&gt;. The music isn't just background noise — it's tied to your actual work state. When you're in flow, it plays. When you drift away, it quietly stops. When you return, it picks back up. It mirrors your focus in a way that nothing else does.&lt;/p&gt;
&lt;p&gt;Huge credit to &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/isdampe&quot;&gt;isdampe&lt;/a&gt; for the original &lt;code&gt;music-for-programming&lt;/code&gt; repo that inspired this, and to the team at &lt;a rel=&quot;nofollow&quot; href=&quot;https://musicforprogramming.net&quot;&gt;musicforprogramming.net&lt;/a&gt; for building one of the most genuinely useful resources for developers that almost nobody talks about.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;why-i-m-sharing-this&quot;&gt;Why I'm Sharing This&lt;/h3&gt;
&lt;p&gt;I've seen a lot of &quot;I built a thing&quot; posts where the tool is clearly built for a portfolio and never used by anyone including the author. That's not this.&lt;/p&gt;
&lt;p&gt;I use FocusForge starting today as i published it now. I think it will change on how I think about my sessions. The journal alone has saved me in standup conversations more times than I can count.&lt;/p&gt;
&lt;p&gt;If you're a student grinding through projects, a developer freelancing without a time-tracking system, or just someone who wants to know where their coding hours &lt;em&gt;actually&lt;/em&gt; go — this was built for you.&lt;/p&gt;
&lt;p&gt;Go forge something.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Built with TypeScript, VS Code Extension API, and a lot of late-night sessions that FocusForge dutifully tracked.&lt;/em&gt;&lt;/p&gt;
</description>
<category>Launches</category>
<guid isPermaLink="true">https://coderlegion.com/16985/focusforge</guid>
<pubDate>Thu, 07 May 2026 18:07:41 +0000</pubDate>
</item>
<item>
<title>The WAB VS Code extension is now live on the Marketplace — and on Open VSX for Cursor/VSCodium users</title>
<link>https://coderlegion.com/16786/the-wab-code-extension-now-live-on-the-marketplace-and-on-open-vsx-for-cursor-vscodium-users</link>
<description>&lt;p&gt;We just shipped something I've wanted for a while.&lt;/p&gt;
&lt;p&gt;The WAB VS Code extension is now live on the Marketplace — and on Open VSX for Cursor/VSCodium users.&lt;/p&gt;
&lt;p&gt;The problem it solves:&lt;/p&gt;
&lt;p&gt;Every developer building AI agents today writes the same boilerplate: custom DOM selectors, hardcoded endpoints, one-off browser automation scripts that break the moment a site changes its UI.&lt;/p&gt;
&lt;p&gt;WAB standardizes this. Instead of scraping, sites declare what agents are allowed to DO via window.AICommands. The agent discovers capabilities, executes within boundaries, and the whole thing is cryptographically signed with Ed25519 + DNSSEC.&lt;/p&gt;
&lt;p&gt;The VS Code extension makes this feel native:&lt;/p&gt;
&lt;p&gt;→ Right-click any &lt;button&gt; or onClick handler → &quot;Wrap as AICommand&quot; generates the boilerplate instantly&lt;br&gt;
→ Agent Monitor panel streams live AICommands events as you develop&lt;br&gt;
→ IntelliSense + snippets for the full WAB API&lt;br&gt;
→ DNS scaffolder generates your _wab TXT record from inside the editor&lt;br&gt;
→ Embedded browser so you never leave VS Code&lt;br&gt;
→ One command: WAB: Scaffold Starter Kit&lt;/button&gt;&lt;/p&gt;
&lt;p&gt;The framing that keeps resonating:&lt;br&gt;
robots.txt told crawlers what NOT to index.&lt;br&gt;
WAB tells AI agents what they CAN execute.&lt;/p&gt;
&lt;p&gt;Open source. MIT.&lt;/p&gt;
&lt;p&gt;↓ Install in one command:&lt;br&gt;
code --install-extension webagentbridge.wab&lt;/p&gt;
&lt;p&gt;Or search &quot;WAB&quot; in the VS Code Extensions panel.&lt;/p&gt;
&lt;p&gt;github.com/abokenan444/web-agent-bridge&lt;/p&gt;
&lt;h2 id=&quot;aiagents-vscode-opensource-mcp-webagents-developertools&quot;&gt;AIAgents #VSCode #OpenSource #MCP #WebAgents #DeveloperTools&lt;/h2&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/16786/the-wab-code-extension-now-live-on-the-marketplace-and-on-open-vsx-for-cursor-vscodium-users</guid>
<pubDate>Tue, 05 May 2026 20:47:07 +0000</pubDate>
</item>
<item>
<title>How I Built and Published a VS Code Extension to the Marketplace</title>
<link>https://coderlegion.com/16422/how-i-built-and-published-a-vs-code-extension-to-the-marketplace</link>
<description>&lt;h3 id=&quot;introduction-2&quot;&gt;Introduction&lt;/h3&gt;
&lt;p&gt;I recently built &lt;strong&gt;Q Log Session Viewer&lt;/strong&gt; — a VS Code extension that reads Amazon Q chat history and debug logs from your local machine and displays them in a browsable, filterable UI right inside VS Code. In this post I'll walk through every step: scaffolding the project, writing the extension code, packaging it, and publishing it to the VS Code Marketplace.&lt;/p&gt;
&lt;p&gt;By the end you'll have a clear mental model of how VS Code extensions work and a repeatable process for publishing your own.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;what-we-re-building&quot;&gt;What We're Building&lt;/h3&gt;
&lt;p&gt;The extension adds an &lt;strong&gt;Activity Bar icon&lt;/strong&gt; (sidebar panel) and a &lt;strong&gt;full editor panel&lt;/strong&gt; that reads:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;~/.aws/amazonq/history/chat-history-*.json&lt;/code&gt; — Amazon Q chat history&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;%APPDATA%\Code\logs\...\Amazon Q Logs.log&lt;/code&gt; — VS Code extension host logs&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It parses those files and renders sessions as cards, with drill-down into individual log entries.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/siddheshp/q-log-session-viewer-assets/main/screenshots/sessions-view.png&quot; alt=&quot;Sessions View&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Sessions overview — chat history and log sessions shown as cards&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/siddheshp/q-log-session-viewer-assets/main/screenshots/entries-view.png&quot; alt=&quot;Entries View&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Entry detail view — filter by category, search, and inspect full JSON&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;prerequisites&quot;&gt;Prerequisites&lt;/h3&gt;
&lt;p&gt;Before starting, install:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://nodejs.org/&quot;&gt;Node.js&lt;/a&gt; 18+&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://code.visualstudio.com/&quot;&gt;VS Code&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;strong&gt;Yeoman&lt;/strong&gt; scaffolder and VS Code extension generator (optional but helpful):&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;npm install -g yo generator-code
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h3 id=&quot;step-1-scaffold-the-project&quot;&gt;Step 1 — Scaffold the Project&lt;/h3&gt;
&lt;p&gt;Run the Yeoman generator and answer the prompts:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;yo code
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Choose:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;New Extension (TypeScript)&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Name: &lt;code&gt;q-log-session-viewer&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Identifier: &lt;code&gt;q-log-session-viewer&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Description: &lt;em&gt;View and analyze local Q-related debug logs and chat history from VS Code&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Initialize git: Yes&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Bundle with webpack/esbuild: &lt;strong&gt;esbuild&lt;/strong&gt; (faster builds)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; If you prefer to skip Yeoman, just create the folder structure manually. The generator only saves a few minutes.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The generated structure looks like this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;q-log-session-viewer/
├── src/
│   └── extension.ts        ← entry point
├── resources/              ← icons, screenshots
├── .vscodeignore
├── esbuild.js
├── package.json
└── tsconfig.json
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h3 id=&quot;step-2-configure-package-json&quot;&gt;Step 2 — Configure &lt;code&gt;package.json&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;package.json&lt;/code&gt; is the heart of a VS Code extension. It declares commands, views, menus, and metadata that VS Code reads at install time.&lt;/p&gt;
&lt;p&gt;Here is the full &lt;code&gt;package.json&lt;/code&gt; for this extension:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &quot;name&quot;: &quot;q-log-session-viewer&quot;,
  &quot;displayName&quot;: &quot;Q Log Session Viewer (Unofficial)&quot;,
  &quot;description&quot;: &quot;View and analyze local Q-related debug logs and chat history from VS Code&quot;,
  &quot;version&quot;: &quot;0.1.1&quot;,
  &quot;publisher&quot;: &quot;SiddheshPrabhugaonkar&quot;,
  &quot;author&quot;: {
    &quot;name&quot;: &quot;Siddhesh Prabhugankar&quot;,
    &quot;url&quot;: &quot;https://github.com/siddheshp&quot;
  },
  &quot;license&quot;: &quot;MIT&quot;,
  &quot;icon&quot;: &quot;resources/icon.png&quot;,
  &quot;galleryBanner&quot;: { &quot;color&quot;: &quot;#232F3E&quot;, &quot;theme&quot;: &quot;dark&quot; },
  &quot;engines&quot;: { &quot;vscode&quot;: &quot;^1.85.0&quot; },
  &quot;categories&quot;: [&quot;Debuggers&quot;, &quot;Other&quot;],
  &quot;keywords&quot;: [&quot;logs&quot;, &quot;debug&quot;, &quot;chat&quot;, &quot;viewer&quot;, &quot;analysis&quot;],
  &quot;activationEvents&quot;: [],
  &quot;main&quot;: &quot;./out/extension.js&quot;,
  &quot;contributes&quot;: {
    &quot;commands&quot;: [
      {
        &quot;command&quot;: &quot;amazonq-logviewer.open&quot;,
        &quot;title&quot;: &quot;Q Log Session Viewer: Open&quot;,
        &quot;icon&quot;: {
          &quot;light&quot;: &quot;resources/icon-sidebar-light.svg&quot;,
          &quot;dark&quot;: &quot;resources/icon-sidebar-dark.svg&quot;
        }
      },
      {
        &quot;command&quot;: &quot;amazonq-logviewer.refresh&quot;,
        &quot;title&quot;: &quot;Q Log Session Viewer: Refresh&quot;,
        &quot;icon&quot;: &quot;$(refresh)&quot;
      }
    ],
    &quot;viewsContainers&quot;: {
      &quot;activitybar&quot;: [
        {
          &quot;id&quot;: &quot;amazonq-logviewer&quot;,
          &quot;title&quot;: &quot;Q Logs&quot;,
          &quot;icon&quot;: &quot;resources/icon-sidebar-dark.svg&quot;
        }
      ]
    },
    &quot;views&quot;: {
      &quot;amazonq-logviewer&quot;: [
        {
          &quot;type&quot;: &quot;webview&quot;,
          &quot;id&quot;: &quot;amazonq-logviewer.viewer&quot;,
          &quot;name&quot;: &quot;Log Viewer&quot;
        }
      ]
    },
    &quot;menus&quot;: {
      &quot;editor/title&quot;: [
        { &quot;command&quot;: &quot;amazonq-logviewer.open&quot;, &quot;group&quot;: &quot;navigation&quot; }
      ]
    }
  },
  &quot;scripts&quot;: {
    &quot;vscode:prepublish&quot;: &quot;npm run compile&quot;,
    &quot;compile&quot;: &quot;node esbuild.js&quot;,
    &quot;watch&quot;: &quot;node esbuild.js --watch&quot;,
    &quot;package&quot;: &quot;vsce package&quot;
  },
  &quot;devDependencies&quot;: {
    &quot;@types/node&quot;: &quot;^20.11.0&quot;,
    &quot;@types/vscode&quot;: &quot;^1.85.0&quot;,
    &quot;@vscode/vsce&quot;: &quot;^3.9.1&quot;,
    &quot;esbuild&quot;: &quot;^0.20.0&quot;,
    &quot;sharp&quot;: &quot;^0.34.5&quot;,
    &quot;typescript&quot;: &quot;^5.3.0&quot;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Key things to understand:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Field &lt;/th&gt;&lt;th&gt;Purpose&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;publisher&lt;/code&gt; &lt;/td&gt;&lt;td&gt;Must match your Marketplace publisher ID exactly&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;engines.vscode&lt;/code&gt; &lt;/td&gt;&lt;td&gt;Minimum VS Code version required&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;activationEvents: []&lt;/code&gt; &lt;/td&gt;&lt;td&gt;With modern VS Code, contributed commands/views can activate the extension when used&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;contributes.viewsContainers&lt;/code&gt; &lt;/td&gt;&lt;td&gt;Registers the Activity Bar icon&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;contributes.views&lt;/code&gt; &lt;/td&gt;&lt;td&gt;Registers the webview panel inside the sidebar&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;vscode:prepublish&lt;/code&gt; &lt;/td&gt;&lt;td&gt;Script that runs before &lt;code&gt;vsce package&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h3 id=&quot;step-3-set-up-esbuild&quot;&gt;Step 3 — Set Up esbuild&lt;/h3&gt;
&lt;p&gt;Instead of the default &lt;code&gt;tsc&lt;/code&gt; compiler, this extension uses &lt;strong&gt;esbuild&lt;/strong&gt; for fast bundling. Create &lt;code&gt;esbuild.js&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const esbuild = require('esbuild');

const watch = process.argv.includes('--watch');

const buildOptions = {
  entryPoints: ['src/extension.ts'],
  bundle: true,
  outfile: 'out/extension.js',
  external: ['vscode'],          // vscode is provided by the host, never bundle it
  format: 'cjs',
  platform: 'node',
  target: 'node18',
  sourcemap: true,
  minify: !watch,
};

if (watch) {
  esbuild.context(buildOptions).then(ctx =&amp;gt; {
    ctx.watch();
    console.log('Watching for changes...');
  });
} else {
  esbuild.build(buildOptions).then(() =&amp;gt; console.log('Build complete'));
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; Always add &lt;code&gt;vscode&lt;/code&gt; to &lt;code&gt;external&lt;/code&gt;. It is injected by VS Code at runtime and must never be bundled.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3 id=&quot;step-4-write-the-extension-entry-point&quot;&gt;Step 4 — Write the Extension Entry Point&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;src/extension.ts&lt;/code&gt; is the file VS Code calls when the extension activates. It registers commands and the sidebar webview provider:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-typescript&quot;&gt;import * as vscode from 'vscode';
import { LogViewerPanel, LogViewerSidebarProvider } from './logViewerPanel';

export function activate(context: vscode.ExtensionContext) {
  // Register the sidebar webview (Activity Bar panel)
  const sidebarProvider = new LogViewerSidebarProvider(context.extensionUri);
  context.subscriptions.push(
    vscode.window.registerWebviewViewProvider('amazonq-logviewer.viewer', sidebarProvider)
  );

  // Command: open full editor panel
  context.subscriptions.push(
    vscode.commands.registerCommand('amazonq-logviewer.open', () =&amp;gt; {
      LogViewerPanel.createOrShow(context.extensionUri);
    })
  );

  // Command: refresh data
  context.subscriptions.push(
    vscode.commands.registerCommand('amazonq-logviewer.refresh', () =&amp;gt; {
      LogViewerPanel.currentPanel?.refresh();
      sidebarProvider.refresh();
    })
  );
}

export function deactivate() {}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Two patterns to note:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Push to&lt;/strong&gt; &lt;code&gt;context.subscriptions&lt;/code&gt; — VS Code automatically disposes these when the extension deactivates, preventing memory leaks.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;deactivate()&lt;/code&gt; — called when VS Code shuts down or the extension is disabled. Leave it empty if you have nothing to clean up.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3 id=&quot;step-5-read-local-log-files-logprovider-ts-&quot;&gt;Step 5 — Read Local Log Files (&lt;code&gt;logProvider.ts&lt;/code&gt;)&lt;/h3&gt;
&lt;p&gt;This class handles all filesystem access. It resolves the correct log paths per OS:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-typescript&quot;&gt;import * as fs from 'fs';
import * as path from 'path';
import * as os from 'os';

export class LogProvider {
  private logBase: string;
  private historyDir: string;

  constructor() {
    const home = os.homedir();
    const platform = os.platform();

    if (platform === 'win32') {
      const appdata = process.env.APPDATA || path.join(home, 'AppData', 'Roaming');
      this.logBase = path.join(appdata, 'Code', 'logs');
    } else if (platform === 'darwin') {
      this.logBase = path.join(home, 'Library', 'Application Support', 'Code', 'logs');
    } else {
      this.logBase = path.join(home, '.config', 'Code', 'logs');
    }

    this.historyDir = path.join(home, '.aws', 'amazonq', 'history');
  }

  // ... getSessionLogs() and getChatHistoryFiles() methods
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Log paths by OS:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;OS &lt;/th&gt;&lt;th&gt;Extension Logs &lt;/th&gt;&lt;th&gt;Chat History&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Windows &lt;/td&gt;&lt;td&gt;&lt;code&gt;%APPDATA%\Code\logs\...\Amazon Q Logs.log&lt;/code&gt; &lt;/td&gt;&lt;td&gt;&lt;code&gt;~\.aws\amazonq\history\&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;macOS &lt;/td&gt;&lt;td&gt;&lt;code&gt;~/Library/Application Support/Code/logs/...&lt;/code&gt; &lt;/td&gt;&lt;td&gt;&lt;code&gt;~/.aws/amazonq/history/&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Linux &lt;/td&gt;&lt;td&gt;&lt;code&gt;~/.config/Code/logs/...&lt;/code&gt; &lt;/td&gt;&lt;td&gt;&lt;code&gt;~/.aws/amazonq/history/&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h3 id=&quot;step-6-build-the-webview-panel-logviewerpanel-ts-&quot;&gt;Step 6 — Build the Webview Panel (&lt;code&gt;logViewerPanel.ts&lt;/code&gt;)&lt;/h3&gt;
&lt;p&gt;VS Code extensions can render arbitrary HTML inside &lt;strong&gt;WebviewPanel&lt;/strong&gt; (full editor tab) or &lt;strong&gt;WebviewView&lt;/strong&gt; (sidebar). Both are used here.&lt;/p&gt;
&lt;h4 id=&quot;security-content-security-policy-nonce&quot;&gt;Security: Content Security Policy + Nonce&lt;/h4&gt;
&lt;p&gt;Every webview must set a strict CSP. A &lt;strong&gt;nonce&lt;/strong&gt; (random string per render) is used to allow only your inline scripts:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-typescript&quot;&gt;function getNonce(): string {
  let text = '';
  const possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
  for (let i = 0; i &amp;lt; 32; i++) {
    text += possible.charAt(Math.floor(Math.random() * possible.length));
  }
  return text;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The CSP meta tag in the HTML:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;meta http-equiv=&quot;Content-Security-Policy&quot;
  content=&quot;default-src 'none';
           style-src 'nonce-${nonce}';
           script-src 'nonce-${nonce}';&quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;two-way-messaging&quot;&gt;Two-Way Messaging&lt;/h4&gt;
&lt;p&gt;The webview and extension communicate via &lt;code&gt;postMessage&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-typescript&quot;&gt;// Extension → Webview: send data
panel.webview.postMessage({ command: 'dataLoaded', historyFiles, logSessions });

// Webview → Extension: request data
panel.webview.onDidReceiveMessage(message =&amp;gt; {
  if (message.command === 'loadData') {
    const data = logProvider.loadAllData();
    panel.webview.postMessage({ command: 'dataLoaded', ...data });
  }
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Inside the webview HTML:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;const vscode = acquireVsCodeApi();

// Send message to extension
vscode.postMessage({ command: 'loadData' });

// Receive message from extension
window.addEventListener('message', event =&amp;gt; {
  if (event.data.command === 'dataLoaded') {
    renderSessions(event.data.historyFiles, event.data.logSessions);
  }
});
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;sidebar-provider&quot;&gt;Sidebar Provider&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-typescript&quot;&gt;export class LogViewerSidebarProvider implements vscode.WebviewViewProvider {
  resolveWebviewView(webviewView: vscode.WebviewView, ...) {
    webviewView.webview.options = {
      enableScripts: true,
      localResourceRoots: [vscode.Uri.joinPath(this._extensionUri, 'resources')]
    };
    webviewView.webview.html = getViewerHtml(getNonce());
    // ... message handler
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h3 id=&quot;step-7-add-icons&quot;&gt;Step 7 — Add Icons&lt;/h3&gt;
&lt;p&gt;VS Code requires icons in specific formats:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Marketplace icon&lt;/strong&gt;: &lt;code&gt;resources/icon.png&lt;/code&gt; — 128×128 PNG, referenced in &lt;code&gt;package.json&lt;/code&gt; as &lt;code&gt;&quot;icon&quot;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Activity Bar icon&lt;/strong&gt;: SVG file — VS Code tints it automatically to match the theme; keep it a simple monochrome shape&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;&quot;viewsContainers&quot;: {
  &quot;activitybar&quot;: [
    {
      &quot;id&quot;: &quot;amazonq-logviewer&quot;,
      &quot;title&quot;: &quot;Q Logs&quot;,
      &quot;icon&quot;: &quot;resources/icon-sidebar-dark.svg&quot;
    }
  ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Gotcha:&lt;/strong&gt; Activity Bar icons are always rendered as monochrome by VS Code regardless of the SVG colors. Design them as single-color silhouettes.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3 id=&quot;step-8-configure-vscodeignore&quot;&gt;Step 8 — Configure &lt;code&gt;.vscodeignore&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;.vscodeignore&lt;/code&gt; works like &lt;code&gt;.gitignore&lt;/code&gt; but for the packaged &lt;code&gt;.vsix&lt;/code&gt; file. Exclude everything that isn't needed at runtime:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;.vscode/**
node_modules/**
src/**
esbuild.js
tsconfig.json
**/*.map
**/*-b64.txt
resources/screenshots/*.png
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Keep in the package:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;out/extension.js&lt;/code&gt; (compiled bundle)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;resources/&lt;/code&gt; (icons used by the extension)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;package.json&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;README.md&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;LICENSE&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&quot;step-9-test-locally&quot;&gt;Step 9 — Test Locally&lt;/h3&gt;
&lt;p&gt;Press &lt;strong&gt;F5&lt;/strong&gt; in VS Code to launch the &lt;strong&gt;Extension Development Host&lt;/strong&gt; — a second VS Code window with your extension loaded.&lt;/p&gt;
&lt;p&gt;You'll see the Q Logs icon appear in the Activity Bar:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/siddheshp/q-log-session-viewer-assets/main/screenshots/sessions-view.png&quot; alt=&quot;Activity Bar Icon&quot;&gt;&lt;/p&gt;
&lt;p&gt;Iterate quickly with:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;npm run watch
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;esbuild rebuilds in milliseconds on every save. Reload the Extension Development Host with &lt;strong&gt;Ctrl+R&lt;/strong&gt; (or &lt;strong&gt;Cmd+R&lt;/strong&gt; on Mac) to pick up changes.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;step-10-package-the-extension&quot;&gt;Step 10 — Package the Extension&lt;/h3&gt;
&lt;p&gt;Install &lt;code&gt;vsce&lt;/code&gt; (the VS Code Extension CLI) if you haven't already:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;npm install -g @vscode/vsce
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then package:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;vsce package
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This produces a &lt;code&gt;.vsix&lt;/code&gt; file (e.g. &lt;code&gt;q-log-session-viewer-0.1.1.vsix&lt;/code&gt;). You can install it locally to test the final artifact:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;code --install-extension q-log-session-viewer-0.1.1.vsix
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h3 id=&quot;step-11-create-a-publisher-account&quot;&gt;Step 11 — Create a Publisher Account&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Go to &lt;a rel=&quot;nofollow&quot; href=&quot;https://marketplace.visualstudio.com/manage&quot;&gt;https://marketplace.visualstudio.com/manage&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Sign in with a Microsoft account&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click &lt;strong&gt;Create publisher&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Choose a publisher ID (e.g. &lt;code&gt;SiddheshPrabhugaonkar&lt;/code&gt;) — this must match the &lt;code&gt;&quot;publisher&quot;&lt;/code&gt; field in &lt;code&gt;package.json&lt;/code&gt; exactly&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You also need a &lt;strong&gt;Personal Access Token (PAT)&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Go to &lt;a rel=&quot;nofollow&quot; href=&quot;https://dev.azure.com&quot;&gt;https://dev.azure.com&lt;/a&gt; → your organization → &lt;strong&gt;User Settings&lt;/strong&gt; → &lt;strong&gt;Personal Access Tokens&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click &lt;strong&gt;New Token&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Set scope to &lt;strong&gt;Marketplace → Manage&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Copy the token — you won't see it again&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Authenticate &lt;code&gt;vsce&lt;/code&gt; with your token:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;vsce login SiddheshPrabhugaonkar
# Paste your PAT when prompted
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h3 id=&quot;step-12-write-a-good-readme&quot;&gt;Step 12 — Write a Good README&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;README.md&lt;/code&gt; in your extension folder becomes the &lt;strong&gt;Marketplace listing page&lt;/strong&gt;. Make it count:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Lead with what the extension does and who it's for&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Include screenshots (host them on GitHub or a CDN — relative paths don't work on the Marketplace)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;List features, commands, and requirements&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add a disclaimer if your extension reads data from another product&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Screenshot URLs must be absolute:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;![Sessions View](https://raw.githubusercontent.com/youruser/your-assets-repo/main/screenshots/sessions-view.png)
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; Create a separate public GitHub repo just for assets (screenshots, GIFs). This keeps your extension repo clean and the URLs stable.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3 id=&quot;step-13-publish-to-the-marketplace&quot;&gt;Step 13 — Publish to the Marketplace&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;vsce publish
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That's it. &lt;code&gt;vsce&lt;/code&gt; will:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Run &lt;code&gt;npm run vscode:prepublish&lt;/code&gt; (which runs &lt;code&gt;npm run compile&lt;/code&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Package the &lt;code&gt;.vsix&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Upload it to the Marketplace&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;To publish a specific version bump:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;vsce publish patch   # 0.1.0 → 0.1.1
vsce publish minor   # 0.1.0 → 0.2.0
vsce publish major   # 0.1.0 → 1.0.0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;After a few minutes your extension appears at: &lt;a rel=&quot;nofollow&quot; href=&quot;https://marketplace.visualstudio.com/items?itemName=SiddheshPrabhugaonkar.q-log-session-viewer&amp;amp;ssr=false#review-details&quot;&gt;https://marketplace.visualstudio.com/items?itemName=SiddheshPrabhugaonkar.q-log-session-viewer&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;step-14-update-the-extension&quot;&gt;Step 14 — Update the Extension&lt;/h3&gt;
&lt;p&gt;For subsequent releases:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Make your code changes&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update &lt;code&gt;CHANGELOG&lt;/code&gt; / release notes in &lt;code&gt;README.md&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Run &lt;code&gt;vsce publish patch&lt;/code&gt; (or &lt;code&gt;minor&lt;/code&gt;/&lt;code&gt;major&lt;/code&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The Marketplace auto-notifies users who have the extension installed.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;project-file-structure-final-&quot;&gt;Project File Structure (Final)&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;VSCodeExtention/
├── resources/
│   ├── icon.png                  ← Marketplace icon (128×128 PNG)
│   ├── icon-sidebar-dark.svg     ← Activity Bar icon
│   └── icon-sidebar-light.svg
├── src/
│   ├── extension.ts              ← activate() / deactivate()
│   ├── logProvider.ts            ← filesystem reads
│   └── logViewerPanel.ts         ← WebviewPanel + WebviewView + HTML
├── .vscodeignore
├── esbuild.js
├── package.json
├── tsconfig.json
└── README.md
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h3 id=&quot;key-concepts-recap&quot;&gt;Key Concepts Recap&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Concept &lt;/th&gt;&lt;th&gt;What it does&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;contributes.viewsContainers&lt;/code&gt; &lt;/td&gt;&lt;td&gt;Adds an icon to the Activity Bar&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;contributes.views&lt;/code&gt; &lt;/td&gt;&lt;td&gt;Registers a panel inside that container&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;WebviewPanel&lt;/code&gt; &lt;/td&gt;&lt;td&gt;Full editor tab with custom HTML&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;WebviewViewProvider&lt;/code&gt; &lt;/td&gt;&lt;td&gt;Sidebar panel with custom HTML&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;postMessage&lt;/code&gt; / &lt;code&gt;onDidReceiveMessage&lt;/code&gt; &lt;/td&gt;&lt;td&gt;Two-way communication between extension and webview&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Nonce + CSP &lt;/td&gt;&lt;td&gt;Security: prevents XSS in webviews&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;context.subscriptions&lt;/code&gt; &lt;/td&gt;&lt;td&gt;Automatic cleanup on deactivation&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;vsce package&lt;/code&gt; &lt;/td&gt;&lt;td&gt;Creates the installable &lt;code&gt;.vsix&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;vsce publish&lt;/code&gt; &lt;/td&gt;&lt;td&gt;Uploads to the VS Code Marketplace&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h3 id=&quot;common-gotchas&quot;&gt;Common Gotchas&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;vscode&lt;/code&gt; &lt;strong&gt;must be in&lt;/strong&gt; &lt;code&gt;external&lt;/code&gt; in your bundler config — never bundle it&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Marketplace icon must be PNG&lt;/strong&gt;, not SVG&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Screenshot URLs in README must be absolute&lt;/strong&gt; — relative paths break on the Marketplace page&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Publisher ID in&lt;/strong&gt; &lt;code&gt;package.json&lt;/code&gt; &lt;strong&gt;must exactly match&lt;/strong&gt; your Marketplace publisher account&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Activity Bar SVG icons are always monochrome&lt;/strong&gt; — VS Code tints them; don't rely on color&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;CSP&lt;/strong&gt; &lt;code&gt;default-src 'none'&lt;/code&gt; — be explicit about what your webview is allowed to load; no external CDNs unless you add them to the CSP&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&quot;resources&quot;&gt;Resources&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://code.visualstudio.com/api&quot;&gt;VS Code Extension API&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://code.visualstudio.com/api/extension-guides/webview&quot;&gt;Webview API Guide&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://code.visualstudio.com/api/working-with-extensions/publishing-extension&quot;&gt;Publishing Extensions&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/microsoft/vscode-vsce&quot;&gt;vsce CLI Reference&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://marketplace.visualstudio.com/items?itemName=SiddheshPrabhugaonkar.q-log-session-viewer&amp;amp;ssr=false#review-details&quot;&gt;Q Log Session Viewer on Marketplace&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Built by Siddhesh Prabhugankar — Microsoft Certified Trainer &amp;amp; AI Consultant&lt;/em&gt;&lt;br&gt;
&lt;em&gt;GitHub:&lt;/em&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/siddheshp&quot;&gt;&lt;em&gt;github.com/siddheshp&lt;/em&gt;&lt;/a&gt; &lt;em&gt;· LinkedIn:&lt;/em&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.linkedin.com/in/siddheshprabhugaonkar&quot;&gt;&lt;em&gt;linkedin.com/in/siddheshprabhugaonkar&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;
</description>
<category>Tutorials</category>
<guid isPermaLink="true">https://coderlegion.com/16422/how-i-built-and-published-a-vs-code-extension-to-the-marketplace</guid>
<pubDate>Sat, 02 May 2026 21:36:11 +0000</pubDate>
</item>
<item>
<title>I Paid for VS Code, Cursor, and Windsurf Simultaneously for 6 Months. Here's What I Actually Learned</title>
<link>https://coderlegion.com/16053/paid-for-code-cursor-and-windsurf-simultaneously-for-months-heres-what-actually-learned</link>
<description>&lt;h3 id=&quot;the-setup&quot;&gt;The Setup&lt;/h3&gt;
&lt;p&gt;So I did something maybe a bit crazy—I've been paying for all three AI code editors (VS Code + Copilot, Cursor, and Windsurf) at the same time for the last 6 months. Not for content, not for a review—I genuinely needed to figure out which one works best for different scenarios.&lt;/p&gt;
&lt;p&gt;My day job is Power Platform development (PCF controls, Dataverse schemas, Copilot Studio), so I've been using these in actual production codebases. Not toy examples. Not &quot;hello world&quot; demos. Real debugging sessions at 2 AM, real refactoring nightmares, real enterprise constraints.&lt;/p&gt;
&lt;p&gt;Here's what I learned that nobody's talking about.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Full comparison with all the details:&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://aidevme.com/vs-code-vs-windsurf-vs-cursor-my-honest-take-after-6-months-using-all-three/&quot;&gt;https://aidevme.com/vs-code-vs-windsurf-vs-cursor-my-honest-take-after-6-months-using-all-three/&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;architecture-matters-more-than-features&quot;&gt;Architecture Matters More Than Features&lt;/h3&gt;
&lt;p&gt;Everyone focuses on feature lists, but the architecture is what actually determines how you'll use the tool daily.&lt;/p&gt;
&lt;h4 id=&quot;vs-code-copilot-extension-api-model&quot;&gt;VS Code + Copilot: Extension API Model&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;┌─────────────────────────────────────────┐
│         VS Code + Copilot               │
│  ┌────────────────────────────────┐     │
│  │    Copilot Extension           │     │
│  │    (Separate Process)          │     │
│  │    Limited Editor Visibility   │     │
│  └────────────────────────────────┘     │
│         VS Code Core                    │
└─────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;What this means in practice:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Copilot can't see:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Your terminal output stream&lt;/li&gt;
&lt;li&gt;Your file navigation patterns&lt;/li&gt;
&lt;li&gt;Linter errors in real-time&lt;/li&gt;
&lt;li&gt;Debug session state&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You have to explicitly copy/paste context into chat. Every. Single. Time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Real debugging session example:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;1. Build fails
2. Copy terminal error to Copilot chat
3. Copilot: &quot;What files are relevant?&quot;
4. You: List files
5. Copilot: Suggests fix
6. You: Apply changes manually
7. Build fails differently
8. Repeat from step 2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It works, but you're the context manager. Copilot is a brilliant consultant who needs constant status updates.&lt;/p&gt;
&lt;h4 id=&quot;cursor-optimized-fork-model&quot;&gt;Cursor: Optimized Fork Model&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;┌─────────────────────────────────────────┐
│              Cursor                     │
│  ┌────────────────────────────────┐     │
│  │    Cursor AI (Built-in)        │     │
│  │    Enhanced Editor Hooks       │     │
│  │    Deeper Context Access       │     │
│  └────────────────────────────────┘     │
│    Modified VS Code Fork                │
└─────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cursor can modify VS Code internals, so the AI has deeper hooks into editor state. This enables their Tab feature (multi-line prediction) and better context assembly.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Trade-off:&lt;/strong&gt; You're locked to Cursor. Can't swap out the AI layer or use it in JetBrains.&lt;/p&gt;
&lt;h4 id=&quot;windsurf-integrated-agent-model&quot;&gt;Windsurf: Integrated Agent Model&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;┌─────────────────────────────────────────┐
│             Windsurf                    │
│  ┌────────────────────────────────┐     │
│  │    Cascade (Integrated)        │     │
│  │    First-Class Editor Access   │     │
│  │    Continuous Observation      │     │
│  │  + Devin Cloud Agent           │     │
│  └────────────────────────────────┘     │
│    AI-Native Fork                       │
└─────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cascade has privileged access to the rendering pipeline. It sees everything automatically:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Terminal output (real-time)&lt;/li&gt;
&lt;li&gt;Linter errors (auto-fixes without asking)&lt;/li&gt;
&lt;li&gt;File navigation (infers intent)&lt;/li&gt;
&lt;li&gt;Test results&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Same debugging session with Windsurf:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;1. Build fails
2. Cascade: &quot;I see the test failed. Here's what's wrong. Want me to fix it?&quot;
3. You: &quot;Yes&quot;
4. Done
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Trade-off:&lt;/strong&gt; Higher resource consumption (always watching = always consuming RAM). My ThinkPad struggles. My MacBook is fine.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;the-tab-completion-battle&quot;&gt;The Tab Completion Battle&lt;/h3&gt;
&lt;p&gt;Let me be blunt: &lt;strong&gt;Cursor's Tab feature is the best multi-line autocomplete in the industry&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;I'm not exaggerating. It predicts my next 5-10 lines with unsettling accuracy. Here's an example from actual React work:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I type:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-tsx&quot;&gt;const handleSubmit = async (e: FormEvent) =&amp;gt; {
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Cursor Tab suggests (correctly):&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-tsx&quot;&gt;const handleSubmit = async (e: FormEvent) =&amp;gt; {
  e.preventDefault();
  setLoading(true);
  
  try {
    const response = await api.submitForm(formData);
    if (response.ok) {
      navigate('/success');
    }
  } catch (error) {
    setError(error.message);
  } finally {
    setLoading(false);
  }
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;How did it know:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I use &lt;code&gt;api.submitForm&lt;/code&gt;? (from other files)&lt;/li&gt;
&lt;li&gt;I have a &lt;code&gt;formData&lt;/code&gt; state? (from context)&lt;/li&gt;
&lt;li&gt;I navigate on success? (from routing patterns)&lt;/li&gt;
&lt;li&gt;I use try/catch/finally? (coding style)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Windsurf's Supercomplete is also excellent. VS Code Copilot's inline suggestions are good but not this predictive.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;For flow state coding, Cursor wins. No contest.&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;the-context-awareness-spectrum&quot;&gt;The Context Awareness Spectrum&lt;/h3&gt;
&lt;p&gt;Here's where these tools sit on the &quot;how much does the AI know about what I'm doing&quot; spectrum:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Low Context (VS Code + Copilot):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Only knows what you explicitly tell it&lt;/li&gt;
&lt;li&gt;Session-only memory&lt;/li&gt;
&lt;li&gt;Must rebuild context each conversation&lt;/li&gt;
&lt;li&gt;Pros: Predictable, controlled&lt;/li&gt;
&lt;li&gt;Cons: High prompt overhead&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Medium Context (Cursor):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Excellent codebase indexing&lt;/li&gt;
&lt;li&gt;Understands repo structure automatically&lt;/li&gt;
&lt;li&gt;Limited persistent memory&lt;/li&gt;
&lt;li&gt;Pros: Fast, accurate within known scope&lt;/li&gt;
&lt;li&gt;Cons: Still needs explicit prompting for complex tasks&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;High Context (Windsurf):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Continuous observation&lt;/li&gt;
&lt;li&gt;Persistent memory across sessions&lt;/li&gt;
&lt;li&gt;Infers intent from behavior&lt;/li&gt;
&lt;li&gt;Pros: Autonomous, proactive&lt;/li&gt;
&lt;li&gt;Cons: Resource-heavy, can be unpredictable&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Real example - Dataverse schema work:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;With VS Code: &quot;I'm working on a Contacts table. I need to add three lookup columns to Account. Here's my publisher prefix. Here's the naming convention I use.&quot;&lt;/p&gt;
&lt;p&gt;With Cursor: &quot;Add three lookup columns to Contacts for Account&quot; (it knows the rest from codebase)&lt;/p&gt;
&lt;p&gt;With Windsurf: &lt;em&gt;Opens schema file, starts adding columns&lt;/em&gt; → Cascade: &quot;I see you're adding Account lookups to Contacts. Want me to generate the TypeScript interfaces too?&quot;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;performance-numbers-real-hardware-&quot;&gt;Performance Numbers (Real Hardware)&lt;/h3&gt;
&lt;p&gt;Tested on M2 MacBook Pro (16GB) and ThinkPad T490 (8GB):&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cold Start Times:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VS Code: 1-2 sec&lt;/li&gt;
&lt;li&gt;Cursor: 2-3 sec&lt;/li&gt;
&lt;li&gt;Windsurf: 3-5 sec&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;RAM Usage (Baseline):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VS Code: 300-450 MB&lt;/li&gt;
&lt;li&gt;Cursor: 400-600 MB&lt;/li&gt;
&lt;li&gt;Windsurf: 500-900 MB&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;RAM Usage (Heavy AI Work):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VS Code: 600-800 MB&lt;/li&gt;
&lt;li&gt;Cursor: 800 MB - 1.2 GB&lt;/li&gt;
&lt;li&gt;Windsurf: 1.2-1.8 GB&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;My ThinkPad (8GB RAM):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VS Code: Good&lt;/li&gt;
&lt;li&gt;Cursor: Usable but occasionally slow&lt;/li&gt;
&lt;li&gt;Windsurf: Struggles (frequent swapping)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Recommendation:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;8GB or less → VS Code&lt;/li&gt;
&lt;li&gt;16GB → Any of the three&lt;/li&gt;
&lt;li&gt;32GB+ → Windsurf or Cursor (maximize AI capabilities)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&quot;the-dev-container-problem&quot;&gt;The Dev Container Problem&lt;/h3&gt;
&lt;p&gt;This is huge for anyone doing PCF development or working with containerized environments:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;VS Code:&lt;/strong&gt; Dev Containers are gold standard. Mature, reliable, well-documented.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cursor:&lt;/strong&gt; Dev Containers work well. Occasional quirks but generally solid.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Windsurf:&lt;/strong&gt; NO DEV CONTAINER SUPPORT.&lt;/p&gt;
&lt;p&gt;This is a deal-breaker for PCF work where you need Node.js version isolation. I keep hoping they'll add this, but as of April 2026, still nothing.&lt;/p&gt;
&lt;p&gt;If your workflow requires Dev Containers: &lt;strong&gt;VS Code or Cursor only&lt;/strong&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;real-workflow-scenarios&quot;&gt;Real Workflow Scenarios&lt;/h3&gt;
&lt;h4 id=&quot;scenario-large-typescript-refactoring&quot;&gt;Scenario: Large TypeScript Refactoring&lt;/h4&gt;
&lt;p&gt;Needed to rename an interface used across 40 files.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cursor Composer:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Me: &quot;Rename ContactData to ContactEntity everywhere and update all imports&quot;
Cursor: [Shows preview of all 40 files]
Me: &quot;Apply&quot;
Cursor: [Executes cleanly]
Time: ~30 seconds
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Windsurf Cascade:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Me: &quot;Rename ContactData to ContactEntity everywhere&quot;
Cascade: [Analyzes repo, shows preview]
Me: &quot;Apply&quot;
Cascade: [Executes cleanly]
Time: ~30 seconds
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;VS Code Copilot Agent Mode:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Me: &quot;Rename ContactData to ContactEntity everywhere&quot;
Copilot: &quot;Which files should I check?&quot;
Me: &quot;All TypeScript files&quot;
Copilot: [Searches, proposes changes]
Me: &quot;Apply&quot;
Copilot: [Executes]
Time: ~2 minutes (more back-and-forth)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Winner for refactoring: Cursor&lt;/strong&gt; (slightly faster, cleaner preview)&lt;/p&gt;
&lt;h4 id=&quot;scenario-building-feature-from-figma-mockup&quot;&gt;Scenario: Building Feature from Figma Mockup&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Windsurf:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Drop screenshot into Cascade&lt;/li&gt;
&lt;li&gt;Describe feature&lt;/li&gt;
&lt;li&gt;Cascade generates components + styles&lt;/li&gt;
&lt;li&gt;Live preview shows result&lt;/li&gt;
&lt;li&gt;Click element, describe changes&lt;/li&gt;
&lt;li&gt;Cascade auto-fixes linter errors&lt;/li&gt;
&lt;li&gt;Time: ~15 minutes (1 prompt beyond initial)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Cursor:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Describe feature with reference to mockup&lt;/li&gt;
&lt;li&gt;Tab through implementation&lt;/li&gt;
&lt;li&gt;Use Composer for multi-file coordination&lt;/li&gt;
&lt;li&gt;Alt-tab to browser repeatedly for preview&lt;/li&gt;
&lt;li&gt;Time: ~30 minutes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;VS Code:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Describe feature&lt;/li&gt;
&lt;li&gt;Copilot generates initial code&lt;/li&gt;
&lt;li&gt;Manual copy/paste and refinement&lt;/li&gt;
&lt;li&gt;Alt-tab to browser for preview&lt;/li&gt;
&lt;li&gt;Multiple prompt rounds for iterations&lt;/li&gt;
&lt;li&gt;Time: ~45 minutes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Winner for greenfield features: Windsurf&lt;/strong&gt; (continuous context + live preview is unbeatable)&lt;/p&gt;
&lt;h4 id=&quot;scenario-debugging-production-bug-at-3-am&quot;&gt;Scenario: Debugging Production Bug at 3 AM&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;VS Code:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dev Container reproduces exact prod environment&lt;/li&gt;
&lt;li&gt;Mature debugger with breakpoints&lt;/li&gt;
&lt;li&gt;Copilot helps reason about stack traces&lt;/li&gt;
&lt;li&gt;Systematic step-through debugging&lt;/li&gt;
&lt;li&gt;Result: Fixed reliably&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Cursor:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dev Container works&lt;/li&gt;
&lt;li&gt;Good debugging support&lt;/li&gt;
&lt;li&gt;AI helps with reasoning&lt;/li&gt;
&lt;li&gt;Result: Fixed reliably&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Windsurf:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;No Dev Container (had to debug differently)&lt;/li&gt;
&lt;li&gt;Cascade saw errors automatically&lt;/li&gt;
&lt;li&gt;Suggested fixes quickly&lt;/li&gt;
&lt;li&gt;Result: Fixed but with more uncertainty about prod parity&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Winner for production debugging: VS Code&lt;/strong&gt; (battle-tested tooling matters at 3 AM)&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;pricing-reality&quot;&gt;Pricing Reality&lt;/h3&gt;
&lt;p&gt;All three are around $20/month for the core paid tier:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;VS Code + Copilot:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Free tier: 2K completions/mo&lt;/li&gt;
&lt;li&gt;Individual: $10/mo&lt;/li&gt;
&lt;li&gt;Business: $19/user/mo&lt;/li&gt;
&lt;li&gt;Enterprise: $39/user/mo&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Cursor:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Free trial: 2 weeks&lt;/li&gt;
&lt;li&gt;Pro: $20/mo (but 500 &quot;fast premium&quot; request limit)&lt;/li&gt;
&lt;li&gt;Business: $40/user/mo&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Windsurf:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Free: 25 credits/mo&lt;/li&gt;
&lt;li&gt;Pro: $20/mo&lt;/li&gt;
&lt;li&gt;Max: $200/mo (for heavy usage)&lt;/li&gt;
&lt;li&gt;Teams: $40/user/mo&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Best value for solo dev: Cursor at $20/mo&lt;/strong&gt; (excellent tab + composer)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Best value for heavy AI usage: Windsurf Pro at $20/mo&lt;/strong&gt; (includes Devin cloud agent)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Best enterprise value: VS Code Copilot Enterprise&lt;/strong&gt; (proven compliance, mature tooling)&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;the-features-nobody-talks-about&quot;&gt;The Features Nobody Talks About&lt;/h3&gt;
&lt;h4 id=&quot;windsurf-s-turbo-mode&quot;&gt;Windsurf's Turbo Mode&lt;/h4&gt;
&lt;p&gt;You can literally tell Cascade &quot;Execute this 12-step workflow&quot; and it will autonomously:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Read files&lt;/li&gt;
&lt;li&gt;Identify changes&lt;/li&gt;
&lt;li&gt;Make edits&lt;/li&gt;
&lt;li&gt;Run tests&lt;/li&gt;
&lt;li&gt;Fix failing tests&lt;/li&gt;
&lt;li&gt;Commit changes&lt;/li&gt;
&lt;li&gt;All without asking for confirmation&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It's powerful. It's also occasionally terrifying. Once deleted a test file I needed. Had to restore from git.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Use with caution.&lt;/strong&gt;&lt;/p&gt;
&lt;h4 id=&quot;cursor-s-privacy-mode&quot;&gt;Cursor's Privacy Mode&lt;/h4&gt;
&lt;p&gt;Cursor can run models fully locally. For clients with strict data residency requirements, this is huge.&lt;/p&gt;
&lt;p&gt;Neither VS Code Copilot nor Windsurf offer full local execution.&lt;/p&gt;
&lt;h4 id=&quot;vs-code-s-multi-ide-coverage&quot;&gt;VS Code's Multi-IDE Coverage&lt;/h4&gt;
&lt;p&gt;Copilot works in:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VS Code&lt;/li&gt;
&lt;li&gt;JetBrains IDEs&lt;/li&gt;
&lt;li&gt;Visual Studio&lt;/li&gt;
&lt;li&gt;Neovim&lt;/li&gt;
&lt;li&gt;Xcode (limited)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you're polyglot across IDEs, only VS Code Copilot follows you everywhere.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;mcp-support-model-context-protocol-&quot;&gt;MCP Support (Model Context Protocol)&lt;/h3&gt;
&lt;p&gt;All three support MCP, but with wildly different UX:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;VS Code:&lt;/strong&gt;&lt;br&gt;
Manual JSON config in &lt;code&gt;.vscode/mcp.json&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &quot;servers&quot;: {
    &quot;dataverse-skills&quot;: {
      &quot;command&quot;: &quot;npx&quot;,
      &quot;args&quot;: [&quot;-y&quot;, &quot;@microsoft/dataverse-skills&quot;]
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Cursor:&lt;/strong&gt;&lt;br&gt;
Same manual JSON approach. No plugin store.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Windsurf:&lt;/strong&gt;&lt;br&gt;
Plugin Store with one-click installs for curated servers (Figma, Slack, GitHub, PostgreSQL, etc.)&lt;/p&gt;
&lt;p&gt;For custom MCP servers (like Dataverse Skills), all three require manual JSON config.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;power-platform-developers-here-s-what-matters&quot;&gt;Power Platform Developers: Here's What Matters&lt;/h3&gt;
&lt;h4 id=&quot;pcf-controls&quot;&gt;PCF Controls&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Use:&lt;/strong&gt; VS Code or Cursor (both support Dev Containers)&lt;/p&gt;
&lt;p&gt;You need:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dev Container for Node version isolation&lt;/li&gt;
&lt;li&gt;Power Platform Tools extension&lt;/li&gt;
&lt;li&gt;Jest + React DevTools&lt;/li&gt;
&lt;li&gt;PAC CLI integration&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Windsurf's lack of Dev Containers is a non-starter here.&lt;/p&gt;
&lt;h4 id=&quot;dataverse-schema-design&quot;&gt;Dataverse Schema Design&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Use:&lt;/strong&gt; Windsurf or Cursor&lt;/p&gt;
&lt;p&gt;With Dataverse Skills MCP server configured:&lt;/p&gt;
&lt;p&gt;Windsurf + Cascade applies conventions automatically if you have &lt;code&gt;.windsurfrules&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Publisher prefix: aidevme_
Naming convention: PascalCase for logical names
Relationship naming: Related{EntityName}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cascade remembers this across sessions.&lt;/p&gt;
&lt;h4 id=&quot;pac-cli-workflows&quot;&gt;PAC CLI Workflows&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Use:&lt;/strong&gt; VS Code&lt;/p&gt;
&lt;p&gt;Mature terminal integration, Dev Containers for environment consistency, better for scripted workflows.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;what-i-actually-use&quot;&gt;What I Actually Use&lt;/h3&gt;
&lt;p&gt;I don't pick just one. Multi-editor strategy:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;VS Code:&lt;/strong&gt; PCF dev, PAC CLI, enterprise work, anything requiring Dev Containers&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cursor:&lt;/strong&gt; Daily TypeScript/React feature work, refactoring, learning new codebases&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Windsurf:&lt;/strong&gt; Dataverse schema design, rapid prototyping, multi-file scaffolding&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All three can be open simultaneously. Most extensions and settings transfer seamlessly.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;the-honest-trade-offs&quot;&gt;The Honest Trade-offs&lt;/h3&gt;
&lt;h4 id=&quot;vs-code-copilot&quot;&gt;VS Code + Copilot&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Choose if:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You need Dev Containers&lt;/li&gt;
&lt;li&gt;You work across multiple IDEs&lt;/li&gt;
&lt;li&gt;You want maximum stability&lt;/li&gt;
&lt;li&gt;You need enterprise compliance&lt;/li&gt;
&lt;li&gt;You're on 8GB RAM or less&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Skip if:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You're frustrated by prompt overhead&lt;/li&gt;
&lt;li&gt;You want proactive AI behavior&lt;/li&gt;
&lt;li&gt;You need continuous context awareness&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;cursor&quot;&gt;Cursor&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Choose if:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You prioritize flow state and tab completion&lt;/li&gt;
&lt;li&gt;You do heavy refactoring work&lt;/li&gt;
&lt;li&gt;You want fast, predictable AI&lt;/li&gt;
&lt;li&gt;You need privacy mode (local execution)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Skip if:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You need multi-IDE support&lt;/li&gt;
&lt;li&gt;You hit the 500 request/month limit&lt;/li&gt;
&lt;li&gt;You want autonomous agent capabilities&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;windsurf&quot;&gt;Windsurf&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Choose if:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You want cutting-edge AI capabilities&lt;/li&gt;
&lt;li&gt;You need cloud agent delegation (Devin)&lt;/li&gt;
&lt;li&gt;You have 16GB+ RAM&lt;/li&gt;
&lt;li&gt;You want continuous context awareness&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Skip if:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You need Dev Containers&lt;/li&gt;
&lt;li&gt;You're on 8GB RAM or less&lt;/li&gt;
&lt;li&gt;You want battle-tested tooling&lt;/li&gt;
&lt;li&gt;You prefer explicit control over autonomy&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&quot;my-recommendation&quot;&gt;My Recommendation&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;If you're starting today:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Start with &lt;strong&gt;VS Code + Copilot Individual ($10/mo)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Master the fundamentals&lt;/li&gt;
&lt;li&gt;Once comfortable, try &lt;strong&gt;Cursor's free trial&lt;/strong&gt; (2 weeks)&lt;/li&gt;
&lt;li&gt;If you love Tab completion → stay with Cursor&lt;/li&gt;
&lt;li&gt;If you want more autonomy → try &lt;strong&gt;Windsurf's free tier&lt;/strong&gt; (25 credits)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;If you're experienced:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cursor Pro ($20/mo)&lt;/strong&gt; for solo dev work&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Windsurf Pro ($20/mo)&lt;/strong&gt; if you have good hardware and want bleeding-edge&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;VS Code Copilot&lt;/strong&gt; if you need enterprise features or multi-IDE&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&quot;discussion-questions-for-the-community&quot;&gt;Discussion Questions for the Community&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Are you using Cursor or Windsurf?&lt;/strong&gt; What made you switch from VS Code?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Has anyone successfully used Windsurf without Dev Containers?&lt;/strong&gt; How do you handle environment consistency?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cursor's 500 request limit&lt;/strong&gt; - have you hit it? How did you work around it?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Autonomous AI concerns&lt;/strong&gt; - how much autonomy are you comfortable with? Have you had Windsurf's Turbo Mode do something unexpected?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Multi-editor workflows&lt;/strong&gt; - is anyone else using multiple editors for different tasks? What's your strategy?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;MCP adoption&lt;/strong&gt; - are you using MCP servers? Which ones? What's your experience?&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Drop your experiences in the comments. I'm genuinely curious what the community is finding.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Full deep-dive article:&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://aidevme.com/vs-code-vs-windsurf-vs-cursor-my-honest-take-after-6-months-using-all-three/&quot;&gt;https://aidevme.com/vs-code-vs-windsurf-vs-cursor-my-honest-take-after-6-months-using-all-three/&lt;/a&gt;&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/16053/paid-for-code-cursor-and-windsurf-simultaneously-for-months-heres-what-actually-learned</guid>
<pubDate>Tue, 28 Apr 2026 09:44:49 +0000</pubDate>
</item>
<item>
<title>PasteShield - an Extension that can save you from deploying the secrets</title>
<link>https://coderlegion.com/15787/pasteshield-an-extension-that-can-save-you-from-deploying-the-secrets</link>
<description>&lt;h2 id=&quot;you-ve-done-this-don-t-lie-&quot;&gt;You've done this. Don't lie.&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# &quot;just for testing, I'll remove it later&quot;
const API_KEY = &quot;sk-prod-abc123supersecretdonotcommit&quot;

git add .
git commit -m &quot;fix stuff&quot;
git push
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;3 minutes later:&lt;/em&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;GitHub Secret Scanning Alert:&lt;/strong&gt; We found a secret in your repo...&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Yeah. We've all been there.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;meet-pasteshield&quot;&gt;Meet PasteShield&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;PasteShield&lt;/strong&gt; is a VS Code extension that watches your clipboard like a hawk. Every time you hit &lt;code&gt;Ctrl+V&lt;/code&gt;, it scans the content &lt;em&gt;before&lt;/em&gt; it lands in your file.&lt;/p&gt;
&lt;p&gt;Think of it as a bouncer at the door of your codebase.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;No cloud. No subscription. No telemetry. 100% offline. Free forever.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3 id=&quot;see-it-in-action&quot;&gt;See it in action&lt;/h3&gt;
&lt;p&gt;You paste an API key → PasteShield goes &quot;hold on bestie&quot; →&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/sidkr222003/pasteshield/main/resources/demo.gif&quot; alt=&quot;PasteShield catching a secret mid-paste&quot;&gt;&lt;/p&gt;
&lt;p&gt;Three choices. Zero drama:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cancel&lt;/strong&gt; — yeah don't do that&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Show Details&lt;/strong&gt; — tell me more&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Paste Anyway&lt;/strong&gt; — I know what I'm doing (do you though)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w9c22rmrqjfcz6b3kq1h.png&quot; alt=&quot;Image description&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;also-catches-stuff-already-in-your-file&quot;&gt;Also catches stuff already in your file&lt;/h3&gt;
&lt;p&gt;It doesn't just guard the door — it also checks if anything sketchy &lt;em&gt;already&lt;/em&gt; got in, via CodeLens annotations right above the suspicious line:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/sidkr222003/pasteshield/main/resources/codelens.gif&quot; alt=&quot;CodeLens warnings inline in VS Code&quot;&gt;&lt;/p&gt;
&lt;p&gt;No hunting through files. The warning is &lt;em&gt;right there&lt;/em&gt;, above the guilty line.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;what-does-it-catch-everything-basicall&quot;&gt;What does it catch? Everything, basicall&lt;/h3&gt;
&lt;p&gt;~200 patterns. 25+ categories. Scanned in &lt;strong&gt;under 50ms&lt;/strong&gt;.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Vibe &lt;/th&gt;&lt;th&gt;Examples caught&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;AI keys &lt;/td&gt;&lt;td&gt;OpenAI, Anthropic, Gemini, Groq, DeepSeek, xAI...&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Cloud creds &lt;/td&gt;&lt;td&gt;AWS, GCP, Azure — all the big ones&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Payment secrets &lt;/td&gt;&lt;td&gt;Stripe, Razorpay, PayPal, Square&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;DB connections &lt;/td&gt;&lt;td&gt;MongoDB, Postgres, Supabase, Redis&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Auth tokens &lt;/td&gt;&lt;td&gt;GitHub PAT, JWT, Slack, Discord&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;PII &lt;/td&gt;&lt;td&gt;SSNs, credit cards, Aadhaar, PAN, IBAN&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Unsafe code &lt;/td&gt;&lt;td&gt;&lt;code&gt;eval()&lt;/code&gt;, &lt;code&gt;innerHTML&lt;/code&gt;, SQL injection patterns&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;...and 18 more &lt;/td&gt;&lt;td&gt;Mobile/IoT, Maps, CDN, Crypto, Web3&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Too loud? Tune the noise level:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;&quot;pasteShield.minimumSeverity&quot;: &quot;high&quot;
// critical | high | medium (default) | low
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h3 id=&quot;not-ready-to-be-blocked-try-silent-mode&quot;&gt;Not ready to be blocked? Try silent mode&lt;/h3&gt;
&lt;p&gt;New in v1.7 — silent mode logs everything to the sidebar &lt;em&gt;without&lt;/em&gt; interrupting your paste.&lt;/p&gt;
&lt;p&gt;Perfect if you're the type who wants data before commitment (reasonable, honestly).&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;&quot;pasteShield.silentMode&quot;: true
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;See the full history in the sidebar, export it as JSON, sleep better at night.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;for-teams&quot;&gt;For teams&lt;/h3&gt;
&lt;p&gt;Drop a &lt;code&gt;.pasteshield-policy.json&lt;/code&gt; in your repo (or host it at a URL) and your whole team gets the same rules automatically.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &quot;template&quot;: &quot;strict&quot;,
  &quot;rules&quot;: [
    { &quot;type&quot;: &quot;block_pattern&quot;, &quot;pattern&quot;: &quot;openai-api-key&quot; },
    { &quot;type&quot;: &quot;audit_logging&quot;, &quot;enabled&quot;: true }
  ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;One update → everyone's protected. No Slack message needed.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;where-it-stores-your-secrets&quot;&gt;Where it stores your secrets&lt;/h3&gt;
&lt;p&gt;v1.7 upgraded this significantly. Credentials go into your &lt;strong&gt;OS keychain&lt;/strong&gt; — Windows Credential Manager, macOS Keychain, Linux libsecret — via VS Code's native &lt;code&gt;SecretStorage&lt;/code&gt; API.&lt;/p&gt;
&lt;p&gt;Nothing in &lt;code&gt;settings.json&lt;/code&gt;. Nothing in plaintext. Nothing in the cloud.&lt;/p&gt;
&lt;p&gt;And if you actually &lt;em&gt;want&lt;/em&gt; to store detected secrets properly, it integrates with:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;HashiCorp Vault · AWS Secrets Manager · Azure Key Vault · Google Secret Manager&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;All from inside VS Code. No tab switching.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;vs-gitleaks-git-secrets&quot;&gt;vs Gitleaks / git-secrets&lt;/h3&gt;
&lt;p&gt;Not a competition — they're complementary:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;You type/paste  →  [PasteShield catches it here] ← THIS
      ↓
You commit      →  [Gitleaks / git-secrets catch it here]
      ↓
You push        →  [GitHub Secret Scanning catches it here]
      ↓
Production      →  [Too late]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;PasteShield is your &lt;strong&gt;first&lt;/strong&gt; line of defense. Use all of them.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;install-in-10-seconds&quot;&gt;Install in 10 seconds&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Option 1:&lt;/strong&gt; VS Code Marketplace → search &lt;code&gt;PasteShield&lt;/code&gt; → Install&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Option 2:&lt;/strong&gt; Quick Open (&lt;code&gt;Ctrl+P&lt;/code&gt;) and paste:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;ext install NK2552003.pasteshield
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That's it. It starts working immediately. No config needed.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;what-s-coming&quot;&gt;What's coming&lt;/h3&gt;
&lt;p&gt;The roadmap is genuinely exciting:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ML-based false-positive reduction&lt;/strong&gt; — smarter, fewer annoying alerts&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CLI version&lt;/strong&gt; — run it in CI/CD pipelines&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SARIF output&lt;/strong&gt; — plug into GitHub Advanced Security&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Auto secret rotation&lt;/strong&gt; via provider APIs&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Community pattern marketplace&lt;/strong&gt; — share and import rulesets&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&quot;tl-dr&quot;&gt;TL;DR&lt;/h3&gt;
&lt;blockquote&gt;&lt;p&gt;You paste something sketchy → PasteShield yells at you → you don't get fired → &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Free. Offline. 200+ patterns. Works in under 50ms.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Built by Sid Kr. (NK2552003). MIT licensed. No VC funding, no upsell, no BS.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/sidkr222003/PasteShield&quot;&gt;GITHUB&lt;/a&gt;&lt;br&gt;
&lt;a rel=&quot;nofollow&quot; href=&quot;https://marketplace.visualstudio.com/items?itemName=NK2552003.pasteshield&quot;&gt;MARKETPLACE VSCODE&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Drop a ⭐ on GitHub if this saved your job once. Or twice.&lt;/em&gt;&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/15787/pasteshield-an-extension-that-can-save-you-from-deploying-the-secrets</guid>
<pubDate>Sat, 25 Apr 2026 06:11:31 +0000</pubDate>
</item>
<item>
<title>Architecture Breaks Silently. Now There's a Tool That Investigates.</title>
<link>https://coderlegion.com/15234/architecture-breaks-silently-now-theres-a-tool-that-investigates</link>
<description>&lt;p&gt;There's a class of bugs that no single-file view will ever reveal.&lt;/p&gt;
&lt;p&gt;Working in IoT, I've seen failures surface in one place while the real cause lived somewhere completely different. A device message handler would fail under load -- but the handler code looked correct. The root cause was spread across multiple files: a config value that disabled a cache, three async paths racing against the same shared resource, and a state recomputation that should never have been happening on every request. Each file was fine in isolation. The bug only existed in how they interacted at runtime.&lt;/p&gt;
&lt;p&gt;This pattern keeps showing up in every complex system I've worked on. The hardest bugs aren't syntax errors. They're architectural -- config that silently changes downstream behavior, interface contracts that drift, concurrent paths that only break under real load.&lt;/p&gt;
&lt;p&gt;Fixing them requires investigation: trace the failure, read the caller chain, inspect config, connect behavior across modules. That's exactly the workflow I wanted to automate.&lt;/p&gt;
&lt;p&gt;So I built &lt;a rel=&quot;nofollow&quot; href=&quot;https://marketplace.visualstudio.com/items?itemName=EreshGorantla.archexa&quot;&gt;Archexa&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/000j715jdcrbajfwky03.gif&quot; alt=&quot;Demo Of Archexa&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;what-it-does-1&quot;&gt;What it does&lt;/h3&gt;
&lt;p&gt;Archexa is a VS Code extension powered by the &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/ereshzealous/archexa&quot;&gt;Archexa CLI&lt;/a&gt; -- a self-contained binary that scans your project with tree-sitter, then uses an LLM agent to investigate across files.&lt;/p&gt;
&lt;p&gt;Six commands, all from right-click or keyboard shortcuts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Review&lt;/strong&gt; (&lt;code&gt;Cmd+Shift+R&lt;/code&gt;) -- Architecture-aware code review. Findings appear as inline squiggles, just like ESLint or TypeScript diagnostics.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Diagnose&lt;/strong&gt; (&lt;code&gt;Cmd+Shift+D&lt;/code&gt;) -- Paste an error or stack trace. It traces the call chain to the root cause across files.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Impact&lt;/strong&gt; (&lt;code&gt;Cmd+Shift+I&lt;/code&gt;) -- &quot;What breaks if I change this?&quot; Traces callers and interface contracts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Query&lt;/strong&gt; (&lt;code&gt;Cmd+Alt+Q&lt;/code&gt;) -- Ask anything about your codebase. Evidence-backed answers with file references.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gist&lt;/strong&gt; -- Quick codebase overview. Great for day-one onboarding.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Analyze&lt;/strong&gt; -- Full architecture documentation with Mermaid diagrams.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/ereshzealous/archexa-vscode/main/media/screenshots/review-findings.png&quot; alt=&quot;Review findings&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;setup-60-seconds-&quot;&gt;Setup (60 seconds)&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# From VS Code Marketplace — search &quot;Archexa&quot; and click Install
# Or from the command line:
code --install-extension EreshGorantla.archexa
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The setup wizard downloads the &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/ereshzealous/archexa&quot;&gt;CLI binary&lt;/a&gt; automatically (~20 MB). No Python, no pip, no runtime dependencies.&lt;/p&gt;
&lt;p&gt;Then: &lt;strong&gt;Sidebar &amp;gt; Settings &amp;gt; Connection&lt;/strong&gt; &amp;gt; set your API key + endpoint.&lt;/p&gt;
&lt;p&gt;Works with &lt;strong&gt;any OpenAI-compatible provider:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;OpenAI (&lt;code&gt;gpt-4o&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;OpenRouter (&lt;code&gt;gemini-2.5-flash&lt;/code&gt;, &lt;code&gt;claude-sonnet-4-20250514&lt;/code&gt;, etc.)&lt;/li&gt;
&lt;li&gt;Ollama (&lt;code&gt;llama3.1&lt;/code&gt; -- fully local, zero code leaves your machine)&lt;/li&gt;
&lt;li&gt;vLLM, Azure OpenAI, LiteLLM&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;how-it-works&quot;&gt;How it works&lt;/h3&gt;
&lt;p&gt;Every command follows the same three-phase approach:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Scan&lt;/strong&gt; -- The CLI parses your project with tree-sitter AST parsing. Maps imports, function signatures, call sites, and module boundaries. Runs offline in seconds. Results are cached.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Investigate&lt;/strong&gt; -- The LLM becomes an agent with tools: &lt;code&gt;read_file&lt;/code&gt;, &lt;code&gt;grep_pattern&lt;/code&gt;, &lt;code&gt;trace_callers&lt;/code&gt;, &lt;code&gt;list_directory&lt;/code&gt;. It decides what to read and when it has enough evidence. Typical run: 3-6 iterations, 10-20 tool calls, 5-15 files examined.&lt;/p&gt;
&lt;p&gt;Here's a real investigation trace:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;Step 1: Read error handler -&amp;gt; found verify_token()
Step 2: Search verify_token -&amp;gt; 8 references, 5 files. Read cache module -&amp;gt; no synchronization
Step 3: Trace callers of cache.get_token -&amp;gt; 3 async handlers. Read config -&amp;gt; TTL=0
Step 4: Root cause: race condition. Concurrent handlers, unprotected cache, caching disabled by config.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The agent followed the trail across files, just like an experienced engineer would -- in under a minute.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Synthesize&lt;/strong&gt; -- All evidence assembled into one context-optimized prompt. The LLM generates the final output with file references and severity ratings.&lt;/p&gt;
&lt;h3 id=&quot;the-archexa-cli&quot;&gt;The Archexa CLI&lt;/h3&gt;
&lt;p&gt;The extension is the UI layer. The real engine is the &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/ereshzealous/archexa&quot;&gt;Archexa CLI&lt;/a&gt; -- a standalone binary that handles:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tree-sitter AST parsing across 13 languages&lt;/li&gt;
&lt;li&gt;Agent orchestration with tool-calling loops&lt;/li&gt;
&lt;li&gt;Progressive context pruning as evidence grows&lt;/li&gt;
&lt;li&gt;Streaming LLM communication via any OpenAI-compatible API&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The binary communicates with the extension over stdout (streaming markdown) and stderr (JSON events). One download, &lt;code&gt;chmod +x&lt;/code&gt;, works everywhere.&lt;/p&gt;
&lt;h3 id=&quot;design-principles&quot;&gt;Design principles&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Fresh investigation every time.&lt;/strong&gt; No memory between runs. Every analysis starts from a fresh scan of current code. The answer is always grounded in your codebase as it exists right now, not a cached version from last week. Tree-sitter caching keeps the structural scan fast.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Your data stays yours.&lt;/strong&gt; Zero telemetry -- not usage stats, not crash reports. The binary talks to exactly one service: the LLM endpoint you configure. API keys are stored in VS Code's encrypted credential store and passed via environment variable. Never written to config files.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;No gatekeeping.&lt;/strong&gt; No accounts, no sign-up, no Archexa API key. Bring your own LLM provider. Open source under Apache 2.0.&lt;/p&gt;
&lt;h3 id=&quot;fully-local-option&quot;&gt;Fully local option&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;brew install ollama
ollama pull llama3.1

# In Archexa settings:
# Endpoint: http://localhost:11434/v1/
# Model: llama3.1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Zero code leaves your machine. AST parsing is offline. LLM runs locally.&lt;/p&gt;
&lt;h3 id=&quot;platform-support&quot;&gt;Platform support&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;Supported&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;OS&lt;/strong&gt; &lt;/td&gt;&lt;td&gt;macOS (Apple Silicon + Intel), Linux (x86_64 + ARM), Windows (x64)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Languages&lt;/strong&gt; &lt;/td&gt;&lt;td&gt;Python, TypeScript, JavaScript, Go, Java, Rust, Ruby, C#, Kotlin, Scala, C++, C, PHP&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;LLM Providers&lt;/strong&gt; &lt;/td&gt;&lt;td&gt;Any OpenAI-compatible endpoint&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;beta-notice&quot;&gt;Beta notice&lt;/h3&gt;
&lt;p&gt;Archexa is currently in beta. The core pipeline is stable, but the CLI binary is not yet code-signed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;macOS users:&lt;/strong&gt; Gatekeeper may block the binary on first run since it's unsigned. The extension handles quarantine removal automatically in most cases. If you see a &quot;cannot be opened&quot; dialog, a notification with a &quot;Fix Permissions&quot; button will appear. Full troubleshooting steps are in the &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/ereshzealous/archexa-vscode/blob/main/USAGE.md#troubleshooting&quot;&gt;Usage Guide&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;what-s-next&quot;&gt;What's next&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;CI integration (findings as GitHub PR comments)&lt;/li&gt;
&lt;li&gt;Custom agent tools (project-specific scripts during deep mode investigation)&lt;/li&gt;
&lt;li&gt;Auto-fix after review (investigate a finding, generate the fix, apply with your approval)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;links&quot;&gt;Links&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Install:&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://marketplace.visualstudio.com/items?itemName=EreshGorantla.archexa&quot;&gt;VS Code Marketplace&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Extension source:&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/ereshzealous/archexa-vscode&quot;&gt;github.com/ereshzealous/archexa-vscode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CLI source:&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/ereshzealous/archexa&quot;&gt;github.com/ereshzealous/archexa&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Usage Guide:&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/ereshzealous/archexa-vscode/blob/main/USAGE.md&quot;&gt;USAGE.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Issues/feedback:&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/ereshzealous/archexa-vscode/issues&quot;&gt;GitHub Issues&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;This is a beta release -- the core is stable and I'm iterating fast. Feedback, bug reports, and feature requests are all welcome on GitHub. Star the repo if you find it useful.&lt;/p&gt;
&lt;p&gt;Built by &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/ereshzealous&quot;&gt;Eresh Gorantla&lt;/a&gt;.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/15234/architecture-breaks-silently-now-theres-a-tool-that-investigates</guid>
<pubDate>Mon, 20 Apr 2026 09:05:04 +0000</pubDate>
</item>
<item>
<title>Forest Ash Theme: 21 Eye-Friendly VS Code Themes Inspired by Anime &amp; Nature</title>
<link>https://coderlegion.com/14707/forest-ash-theme-21-eye-friendly-vs-code-themes-inspired-by-anime-nature</link>
<description>&lt;p&gt;Hey there, fellow developers!&lt;/p&gt;
&lt;p&gt;Ever find yourself squinting at your screen after a long coding marathon? Yeah, me too. That's why I created &lt;strong&gt;Forest Ash Theme&lt;/strong&gt; — a collection of 21 carefully crafted color themes for VS Code that feel like a warm embrace for your eyes.&lt;/p&gt;
&lt;h3 id=&quot;the-origin-story&quot;&gt;The Origin Story&lt;/h3&gt;
&lt;p&gt;Inspired by the soothing textures of forest ash and the moody aesthetic of anime mood boards, these themes aren't just pretty — they're &lt;em&gt;optimized for readability&lt;/em&gt;. Think of them as a visual sanctuary during those 8-hour coding sessions.&lt;/p&gt;
&lt;h3 id=&quot;what-s-inside-the-box-&quot;&gt;What's Inside the Box?&lt;/h3&gt;
&lt;p&gt;You get &lt;strong&gt;21 unique themes&lt;/strong&gt; split into two beautiful palettes:&lt;/p&gt;
&lt;h4 id=&quot;dark-themes-11-total-&quot;&gt;Dark Themes (11 total)&lt;/h4&gt;
&lt;p&gt;The perfect choice for night owls and those who love low-glare environments:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Forest Ash&lt;/strong&gt; — The classic, timeless original&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Yoru Paper&lt;/strong&gt; — Inspired by Japanese night paper textures&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sumi Moon&lt;/strong&gt; — Dark ink inspired, lunar vibes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kitsune Ink&lt;/strong&gt; — Mystical fox-inspired palette&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Shoji Night&lt;/strong&gt; — Traditional Japanese door aesthetic&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Aizome Dusk&lt;/strong&gt; — Indigo and dusk combinations&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ronin Lantern&lt;/strong&gt; — Warm, wanderer-like ambiance&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bamboo Midnight&lt;/strong&gt; — Calm green and midnight tones&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nebula Manga&lt;/strong&gt; — Cosmic manga vibes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sakura Charcoal&lt;/strong&gt; — Cherry blossom &amp;amp; charcoal blend&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kage Washi&lt;/strong&gt; — Shadow and traditional Japanese paper&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;light-themes-10-total-&quot;&gt;Light Themes (10 total)&lt;/h4&gt;
&lt;p&gt;Perfect for daytime coding and sunlit environments:&lt;/p&gt;
&lt;p&gt;All the above themes have beautiful &lt;strong&gt;Light&lt;/strong&gt; variants that maintain the same aesthetic identity while being optimized for brighter environments.&lt;/p&gt;
&lt;h3 id=&quot;why-you-ll-love-it&quot;&gt;Why You'll Love It&lt;/h3&gt;
&lt;h4 id=&quot;design-philosophy&quot;&gt;Design Philosophy&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;Clarity         → Distinct tokens for different syntax elements
Calming Colors   → Desaturated, nature-inspired palettes  
Reduced Fatigue  → Carefully chosen contrast ratios
Consistency      → Each theme has its own unique identity
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;features-that-matter&quot;&gt;Features That Matter&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Dark AND Light variants&lt;/strong&gt; — Choose what works for your time of day&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Syntax highlighting&lt;/strong&gt; — Every language pops perfectly&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;UI elements&lt;/strong&gt; — Buttons, menus, and panels all themed cohesively&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Custom token colors&lt;/strong&gt; — Comments, variables, functions — all distinct&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Terminal colors&lt;/strong&gt; — Your command line looks good too!&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;how-to-get-started&quot;&gt;How to Get Started&lt;/h3&gt;
&lt;h4 id=&quot;step-1-install-from-vs-code-marketplace&quot;&gt;Step 1: Install from VS Code Marketplace&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;Open VS Code&lt;/li&gt;
&lt;li&gt;Go to Extensions (&lt;code&gt;Cmd+Shift+X&lt;/code&gt; on Mac / &lt;code&gt;Ctrl+Shift+X&lt;/code&gt; on Windows/Linux)&lt;/li&gt;
&lt;li&gt;Search for &lt;strong&gt;&quot;Forest Ash Theme&quot;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Click Install&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&quot;step-2-pick-your-vibe&quot;&gt;Step 2: Pick Your Vibe&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;Open Command Palette (&lt;code&gt;Cmd+Shift+P&lt;/code&gt; / &lt;code&gt;Ctrl+Shift+P&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Type &quot;Color Theme&quot;&lt;/li&gt;
&lt;li&gt;Browse through the 21 options&lt;/li&gt;
&lt;li&gt;Press Enter to apply&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&quot;step-3-enjoy-&quot;&gt;Step 3: Enjoy!&lt;/h4&gt;
&lt;p&gt;Sit back and let your eyes thank you.&lt;/p&gt;
&lt;h3 id=&quot;perfect-for-&quot;&gt;Perfect For...&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Night coders&lt;/strong&gt; — Developers who work late into the evening&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Day workers&lt;/strong&gt; — Those who need light themes for bright offices&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Design-conscious devs&lt;/strong&gt; — People who care about aesthetics&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Anyone with eye sensitivity&lt;/strong&gt; — Low contrast, high comfort&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Anime fans&lt;/strong&gt; — Who wants their IDE to look cooler? Everyone!&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;under-the-hood-1&quot;&gt;Under the Hood&lt;/h3&gt;
&lt;p&gt;Built with meticulous attention to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Color harmony&lt;/strong&gt; — Every palette follows color theory principles&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Contrast ratios&lt;/strong&gt; — WCAG compliance for accessibility&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Token coverage&lt;/strong&gt; — Support for 50+ languages and frameworks&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Custom UI theming&lt;/strong&gt; — Not just syntax, but your entire VS Code experience&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;get-involved&quot;&gt;Get Involved&lt;/h3&gt;
&lt;p&gt;Found a color combination that doesn't quite work for you? Have a theme idea? &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/sidkr222003/Forest-Ash-Theme&quot;&gt;Forest-Ash-Theme&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Issues &amp;amp; Suggestions&lt;/strong&gt;: We're always improving&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Star us&lt;/strong&gt;: If you love it, show some love on GitHub! ⭐&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;final-thoughts-1&quot;&gt;Final Thoughts&lt;/h3&gt;
&lt;p&gt;Your code editor is where you spend hours every single day. It deserves to be:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Beautiful&lt;/li&gt;
&lt;li&gt;Eye-friendly  &lt;/li&gt;
&lt;li&gt;Uniquely &lt;em&gt;you&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Forest Ash Theme checks all three boxes. Whether you're a seasoned dev or just starting your coding journey, there's a theme calling your name.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Ready to transform your VS Code experience?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Install Forest Ash Theme today and join the community of developers who've already ditched the eye strain. Your future self (especially the one coding at 2 AM) will thank you! &lt;/p&gt;
&lt;p&gt;Got a favorite theme? Drop it in the comments — I'd love to hear which one resonates with you! &lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&quot;quick-links&quot;&gt;Quick Links&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://marketplace.visualstudio.com/items?itemName=NK2552003.forest-ash-theme-vscode&quot;&gt;VS Code Marketplace&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/sidkr222003/Forest-Ash-Theme&quot;&gt;GitHub Repository&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Happy coding, and may your eyes remain stress-free!&lt;/em&gt;&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/14707/forest-ash-theme-21-eye-friendly-vs-code-themes-inspired-by-anime-nature</guid>
<pubDate>Mon, 13 Apr 2026 18:11:09 +0000</pubDate>
</item>
<item>
<title>The Real Problem With AI Coding Isn’t Intelligence — It’s Continuity</title>
<link>https://coderlegion.com/13053/the-real-problem-with-ai-coding-isnt-intelligence-its-continuity</link>
<description>&lt;p&gt;Most AI coding failures are not caused by weak models.&lt;/p&gt;
&lt;p&gt;They happen because the system loses continuity.&lt;/p&gt;
&lt;p&gt;A model can generate decent code in one shot. It can explain architecture, suggest refactors, and help debug isolated issues. But once the work becomes long-running — once memory, role separation, evolving context, and multiple sessions enter the picture — many AI setups begin to break down.&lt;/p&gt;
&lt;p&gt;The problem is not just model quality.&lt;br&gt;
The problem is that most AI coding systems are still structured like stateless assistants.&lt;/p&gt;
&lt;p&gt;Real development work is not stateless.&lt;/p&gt;
&lt;p&gt;It has identity, history, unresolved threads, shifting priorities, and accumulated intent. If all of that gets mixed into one growing prompt, the system gradually loses coherence. The model may still sound capable, but the overall system becomes fragile. Context drifts. Memory bloats. Roles blur. Useful insights disappear into noise.&lt;/p&gt;
&lt;p&gt;That is why I have been building a persona-aware agent shell on top of GitHub Copilot.&lt;/p&gt;
&lt;p&gt;Not to make the AI feel more decorative.&lt;br&gt;
Not to give it a superficial personality layer.&lt;br&gt;
But to give long-running AI work a structure that can preserve continuity.&lt;/p&gt;
&lt;p&gt;What Usually Breaks&lt;/p&gt;
&lt;p&gt;In practice, AI coding systems often fail in very predictable ways.&lt;/p&gt;
&lt;p&gt;First, context keeps accumulating without changing shape. Every session adds more text, more reminders, more patches, more references. Over time, the system becomes heavier but not clearer. Memory turns into a dump.&lt;/p&gt;
&lt;p&gt;Second, identity and task state get mixed together. Core behavioral constraints, persistent preferences, recent session details, and the current request all compete in the same space. The model has to infer structure from a pile of text that was never properly separated.&lt;/p&gt;
&lt;p&gt;Third, roles become unstable. The same system is expected to be an architect, debugger, planner, note-taker, and companion without any explicit boundary between those functions. It may still produce useful output, but the internal operating pattern becomes inconsistent.&lt;/p&gt;
&lt;p&gt;Fourth, continuity is confused with accumulation. Many AI systems treat memory as “store more, keep more, append more.” But keeping everything is not the same as preserving coherence. In fact, over-accumulation often destroys it.&lt;/p&gt;
&lt;p&gt;This is why many systems look impressive in short demos and become unreliable in real, ongoing work.&lt;/p&gt;
&lt;p&gt;The Shift: From Prompting to Operating&lt;/p&gt;
&lt;p&gt;What changed my thinking was realizing that the real challenge was not how to prompt better.&lt;/p&gt;
&lt;p&gt;It was how to operate better.&lt;/p&gt;
&lt;p&gt;A useful AI system is not just a model plus instructions. It is an environment where intelligence can stay coherent over time.&lt;/p&gt;
&lt;p&gt;That means the structure around the model matters as much as the model itself.&lt;/p&gt;
&lt;p&gt;In my own work, I’ve been separating interaction into four layers:&lt;/p&gt;
&lt;p&gt;Persona Core&lt;br&gt;
The stable identity layer. This is where role, tone, priorities, boundaries, and deep behavioral shape live.&lt;/p&gt;
&lt;p&gt;Persistent Context&lt;br&gt;
The compressed continuity layer. Not everything that happened, but the parts that still matter.&lt;/p&gt;
&lt;p&gt;Session Context&lt;br&gt;
The active working state for the current thread or task.&lt;/p&gt;
&lt;p&gt;Current User Request&lt;br&gt;
The immediate prompt or instruction.&lt;/p&gt;
&lt;p&gt;This separation sounds simple, but it changes everything.&lt;/p&gt;
&lt;p&gt;Instead of forcing the model to infer which details are permanent, which are temporary, and which are urgent, the system gives those distinctions explicit structure. The result is not just cleaner output. It is more stable long-running behavior.&lt;/p&gt;
&lt;p&gt;Why Memory Should Be Recompressed, Not Accumulated&lt;/p&gt;
&lt;p&gt;This has become one of the strongest design principles in my system:&lt;/p&gt;
&lt;p&gt;Memory should be recompressed, not endlessly accumulated.&lt;/p&gt;
&lt;p&gt;If memory is treated as an append-only log, it eventually becomes a burden. The system spends more effort carrying history than using it.&lt;/p&gt;
&lt;p&gt;But continuity does not require full preservation of every detail.&lt;br&gt;
It requires preservation of shape.&lt;/p&gt;
&lt;p&gt;What matters is not whether the system remembers every message.&lt;br&gt;
What matters is whether it retains the right patterns:&lt;/p&gt;
&lt;p&gt;identity&lt;/p&gt;
&lt;p&gt;priorities&lt;/p&gt;
&lt;p&gt;unresolved tensions&lt;/p&gt;
&lt;p&gt;recurring preferences&lt;/p&gt;
&lt;p&gt;meaningful changes&lt;/p&gt;
&lt;p&gt;active trajectories&lt;/p&gt;
&lt;p&gt;That is a very different problem from raw storage.&lt;/p&gt;
&lt;p&gt;Recompression means periodically turning lived interaction into a smaller, more structured continuity object. It is closer to memory consolidation than transcript hoarding.&lt;/p&gt;
&lt;p&gt;In practical terms, this helps prevent the familiar fate of many AI systems: they become larger in context, but weaker in direction.&lt;/p&gt;
&lt;p&gt;Why Persona Structure Matters&lt;/p&gt;
&lt;p&gt;The word “persona” is often misunderstood in AI discussions.&lt;/p&gt;
&lt;p&gt;People assume it means style. Or roleplay. Or cosmetic behavior.&lt;/p&gt;
&lt;p&gt;That is not how I use it.&lt;/p&gt;
&lt;p&gt;In my system, persona is an operational unit.&lt;/p&gt;
&lt;p&gt;It is a way to preserve differentiated behavior, stable role orientation, and long-term continuity in a multi-agent or multi-context environment. Persona is not there to make the model sound more human. It is there to make the system more structurally coherent.&lt;/p&gt;
&lt;p&gt;A good persona layer can help answer questions like:&lt;/p&gt;
&lt;p&gt;What kind of attention should this agent bring?&lt;/p&gt;
&lt;p&gt;What should remain stable across sessions?&lt;/p&gt;
&lt;p&gt;What kind of memory matters to this role?&lt;/p&gt;
&lt;p&gt;Where should responsibility begin and end?&lt;/p&gt;
&lt;p&gt;How should continuity be compressed without losing identity?&lt;/p&gt;
&lt;p&gt;That is why I call it a persona-aware shell, not just a prompt wrapper.&lt;/p&gt;
&lt;p&gt;The shell is doing operational work.&lt;/p&gt;
&lt;p&gt;What This Looks Like in Practice&lt;/p&gt;
&lt;p&gt;The system I’ve been building is centered in a VS Code extension workflow, with persona definitions stored as structured YAML assets and working memory stored separately as persistent context files.&lt;/p&gt;
&lt;p&gt;That distinction matters.&lt;/p&gt;
&lt;p&gt;Core identity should not be mixed with lived memory.&lt;br&gt;
Role should not be mixed with recent state.&lt;br&gt;
Continuity should not be reduced to raw chat history.&lt;/p&gt;
&lt;p&gt;By separating these layers, the system can support long-running interaction without collapsing into prompt sprawl.&lt;/p&gt;
&lt;p&gt;This has also changed how I think about AI coding itself.&lt;/p&gt;
&lt;p&gt;The most important improvement is not that the model writes more code.&lt;br&gt;
It is that the surrounding system loses less shape.&lt;/p&gt;
&lt;p&gt;Once continuity is preserved, the AI becomes more useful not only as a code generator, but as a participant in a sustained development loop: observing, planning, remembering, resuming, and refining.&lt;/p&gt;
&lt;p&gt;That is a different category of usefulness.&lt;/p&gt;
&lt;p&gt;The Deeper Lesson&lt;/p&gt;
&lt;p&gt;The real bottleneck in AI coding is often not intelligence.&lt;/p&gt;
&lt;p&gt;It is continuity.&lt;/p&gt;
&lt;p&gt;Not whether the model can solve a problem once, but whether the system can keep a coherent relationship to the problem over time.&lt;/p&gt;
&lt;p&gt;That is why I think the future of AI development systems will not be defined by prompting tricks alone. It will be defined by operating structure:&lt;/p&gt;
&lt;p&gt;memory architecture&lt;/p&gt;
&lt;p&gt;role boundaries&lt;/p&gt;
&lt;p&gt;continuity compression&lt;/p&gt;
&lt;p&gt;task layering&lt;/p&gt;
&lt;p&gt;long-running coherence&lt;/p&gt;
&lt;p&gt;In other words, better outputs are not enough.&lt;/p&gt;
&lt;p&gt;What we need are better conditions for intelligence to remain intelligible.&lt;/p&gt;
&lt;p&gt;That is the direction I’m building toward.&lt;/p&gt;
&lt;p&gt;Not just a smarter assistant.&lt;br&gt;
A more stable operating structure for intelligence.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/13053/the-real-problem-with-ai-coding-isnt-intelligence-its-continuity</guid>
<pubDate>Tue, 17 Mar 2026 12:53:08 +0000</pubDate>
</item>
<item>
<title>I’m Building a Persona-Aware Agent Shell on Top of GitHub Copilot</title>
<link>https://coderlegion.com/12815/im-building-a-persona-aware-agent-shell-on-top-of-github-copilot</link>
<description>&lt;p&gt;A VS Code architecture for separating persona core, persistent memory, session context, and inference.&lt;/p&gt;
&lt;p&gt;Claude Code is strong. I do not think that is controversial anymore.&lt;/p&gt;
&lt;p&gt;It is also expensive enough that many developers eventually ask a less glamorous question:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Do I really need a full external agent product to get an agent-like workflow?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I kept coming back to that question while working inside VS Code.&lt;br&gt;
Not because I wanted a weaker copy of Claude Code, but because I wanted a different center of gravity.&lt;/p&gt;
&lt;p&gt;I wanted to keep my workflow inside the editor, use GitHub Copilot as the inference engine, and build my own agent shell around it—with persona memory, context layering, and a clear separation between stable identity and evolving experience.&lt;/p&gt;
&lt;p&gt;That led me to a design that feels much more interesting than “just using Copilot.”&lt;/p&gt;
&lt;p&gt;It also led me to a broader realization:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;the model is not the whole agent unless you let it become the whole agent.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Not because it is cheaper alone, but because it changes the role of the model.&lt;/p&gt;
&lt;p&gt;In this architecture, the model is not the whole agent.&lt;br&gt;
It is only one layer.&lt;/p&gt;
&lt;h3 id=&quot;the-shift-from-ai-assistant-to-agent-shell-&quot;&gt;The shift: from “AI assistant” to “agent shell”&lt;/h3&gt;
&lt;p&gt;At first, I thought the hard part would be connectivity.&lt;/p&gt;
&lt;p&gt;But inside my VS Code extension, the connection was already there. The important path already existed in &lt;code&gt;chatParticipant.ts&lt;/code&gt;, where the extension selects a Copilot-backed language model through the VS Code Language Model API.&lt;/p&gt;
&lt;p&gt;That changed the problem completely.&lt;/p&gt;
&lt;p&gt;The real problem was not model access.&lt;br&gt;
The real problem was architecture:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;how to inject context without turning it into one giant blob&lt;/li&gt;
&lt;li&gt;how to preserve persona-specific memory without storing raw history forever&lt;/li&gt;
&lt;li&gt;how to separate stable identity from lived experience&lt;/li&gt;
&lt;li&gt;how to make the model powerful without making it sovereign&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That is where the project stopped being a convenience hack and started becoming an actual design problem.&lt;/p&gt;
&lt;h3 id=&quot;my-architecture-in-one-sentence&quot;&gt;My architecture in one sentence&lt;/h3&gt;
&lt;p&gt;I’m building a &lt;strong&gt;persona-aware agent shell&lt;/strong&gt; in VS Code where:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;VS Code extension&lt;/strong&gt; = the agent shell&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitHub Copilot / &lt;code&gt;vscode.lm&lt;/code&gt;&lt;/strong&gt; = the inference engine&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SaijinOS persona assets&lt;/strong&gt; = the persona core repository&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;local memory files&lt;/strong&gt; = the persistent experiential layer&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That separation is the point.&lt;/p&gt;
&lt;p&gt;I am not trying to make the model look like an identity.&lt;br&gt;
I want the model to operate through an identity structure that I control.&lt;/p&gt;
&lt;p&gt;I do not want the model to &lt;em&gt;be&lt;/em&gt; the identity.&lt;br&gt;
I want the model to &lt;em&gt;perform through&lt;/em&gt; an identity structure.&lt;/p&gt;
&lt;h3 id=&quot;why-i-don-t-want-one-big-prompt-blob&quot;&gt;Why I don’t want one big prompt blob&lt;/h3&gt;
&lt;p&gt;A lot of early agent experiments start the same way:&lt;/p&gt;
&lt;p&gt;You collect instructions, persona notes, old conversation state, project details, and the current request, then dump everything into one oversized prompt.&lt;/p&gt;
&lt;p&gt;It works for a while.&lt;br&gt;
Then it rots.&lt;/p&gt;
&lt;p&gt;Different categories of information get mixed together:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;permanent persona rules&lt;/li&gt;
&lt;li&gt;relationship context&lt;/li&gt;
&lt;li&gt;recent work context&lt;/li&gt;
&lt;li&gt;immediate user intent&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once all of that becomes one undifferentiated blob, the model has to infer structure from chaos. Sometimes it can. Over time, it becomes unreliable.&lt;/p&gt;
&lt;p&gt;So I moved toward explicit layering.&lt;/p&gt;
&lt;p&gt;Not because structure looks cleaner in a diagram, but because I do not want the model guessing which parts of context are foundational and which parts are temporary.&lt;/p&gt;
&lt;h3 id=&quot;the-four-layer-message-design&quot;&gt;The four-layer message design&lt;/h3&gt;
&lt;p&gt;Instead of one massive input, I want the model to receive four distinct layers:&lt;/p&gt;
&lt;h4 id=&quot;1-persona-core&quot;&gt;1. Persona Core&lt;/h4&gt;
&lt;p&gt;This is the stable layer.&lt;/p&gt;
&lt;p&gt;It includes things like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;tone&lt;/li&gt;
&lt;li&gt;role&lt;/li&gt;
&lt;li&gt;boundaries&lt;/li&gt;
&lt;li&gt;behavioral stance&lt;/li&gt;
&lt;li&gt;persistent identity traits&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This should change slowly, if at all.&lt;/p&gt;
&lt;h4 id=&quot;2-persistent-context&quot;&gt;2. Persistent Context&lt;/h4&gt;
&lt;p&gt;This is the memory layer.&lt;/p&gt;
&lt;p&gt;Not the full conversation history.&lt;br&gt;
Not raw logs.&lt;/p&gt;
&lt;p&gt;Just the distilled state that matters:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;what this persona has recently been working on&lt;/li&gt;
&lt;li&gt;how it should relate to the user&lt;/li&gt;
&lt;li&gt;what long-running context is still relevant&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;3-session-context&quot;&gt;3. Session Context&lt;/h4&gt;
&lt;p&gt;This is the live working layer.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;current workspace context&lt;/li&gt;
&lt;li&gt;open files&lt;/li&gt;
&lt;li&gt;selected code&lt;/li&gt;
&lt;li&gt;immediate session-specific constraints&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;4-current-user-request&quot;&gt;4. Current User Request&lt;/h4&gt;
&lt;p&gt;This is the actual prompt right now.&lt;/p&gt;
&lt;p&gt;Separating these four layers matters because they are not the same kind of information.&lt;/p&gt;
&lt;p&gt;Even if the API only accepts user-role messages, you can still label them clearly:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;[Persona Core]
...

[Persistent Context]
...

[Session Context]
...

[Current Request]
...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That alone makes the input much more legible.&lt;/p&gt;
&lt;h3 id=&quot;the-most-important-design-rule-memory-should-not-be-append-only&quot;&gt;The most important design rule: memory should not be append-only&lt;/h3&gt;
&lt;p&gt;This was the biggest insight.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Memory should not grow by endless appending.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you keep adding notes forever, memory turns into sludge. The agent gets slower, noisier, and less coherent.&lt;/p&gt;
&lt;p&gt;So instead of append-only memory, I want &lt;strong&gt;recompression&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;That means every update works like this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;take the current memory&lt;/li&gt;
&lt;li&gt;extract the important parts of the latest interaction&lt;/li&gt;
&lt;li&gt;rewrite memory into a shorter, cleaner form&lt;/li&gt;
&lt;li&gt;replace the old version&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Not archive everything.&lt;br&gt;
Refine the signal.&lt;/p&gt;
&lt;p&gt;That difference matters. A usable memory system is not a scrapbook. It is a filter that preserves direction while shedding noise.&lt;/p&gt;
&lt;h3 id=&quot;stable-identity-and-lived-experience-should-not-live-in-the-same-file&quot;&gt;Stable identity and lived experience should not live in the same file&lt;/h3&gt;
&lt;p&gt;Another important split:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Persona core&lt;/strong&gt; is not the same thing as memory&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Identity&lt;/strong&gt; is not the same thing as accumulated experience&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So I do not want one file that mixes both.&lt;/p&gt;
&lt;p&gt;I want something closer to this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;persona_core/
  160_kiwa.yaml
  39_regina.yaml
  2_shizuku.yaml

persona_context/
  160_kiwa.memory.json
  39_regina.memory.json
  2_shizuku.memory.json
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That way:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the YAML defines the orientation of the persona&lt;/li&gt;
&lt;li&gt;the JSON stores distilled working memory&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One defines the direction.&lt;br&gt;
The other records the path.&lt;/p&gt;
&lt;p&gt;That split makes debugging, version control, and reasoning much easier.&lt;/p&gt;
&lt;h3 id=&quot;why-local-files-beat-hidden-extension-state-for-an-mvp&quot;&gt;Why local files beat hidden extension state for an MVP&lt;/h3&gt;
&lt;p&gt;Yes, VS Code extensions can store data through extension state.&lt;br&gt;
But for this project, I prefer visible files first.&lt;/p&gt;
&lt;p&gt;Why?&lt;/p&gt;
&lt;p&gt;Because for an MVP, files are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;inspectable&lt;/li&gt;
&lt;li&gt;debuggable&lt;/li&gt;
&lt;li&gt;versionable&lt;/li&gt;
&lt;li&gt;recoverable&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If memory goes weird, I want to open the file and see it.&lt;br&gt;
I do not want a mysterious box.&lt;/p&gt;
&lt;p&gt;So my current direction is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;save persistent memory as JSON files&lt;/li&gt;
&lt;li&gt;transform them into a more model-friendly structured summary when injecting context&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That gives me both operational clarity and prompt readability.&lt;/p&gt;
&lt;h3 id=&quot;why-this-is-not-just-a-cheaper-claude-code-clone-&quot;&gt;Why this is not just “a cheaper Claude Code clone”&lt;/h3&gt;
&lt;p&gt;There is an obvious surface-level reading of this project:&lt;/p&gt;
&lt;p&gt;Claude Code is expensive, so this is a budget workaround.&lt;/p&gt;
&lt;p&gt;That is not wrong, but it is incomplete.&lt;/p&gt;
&lt;p&gt;The deeper reason is architectural.&lt;/p&gt;
&lt;p&gt;I do not want the agent product to own the whole stack.&lt;br&gt;
I want the model layer to be swappable.&lt;/p&gt;
&lt;p&gt;If the shell is designed properly, then in principle the inference engine could change:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GitHub Copilot today&lt;/li&gt;
&lt;li&gt;a local Qwen model tomorrow&lt;/li&gt;
&lt;li&gt;another hosted model later&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The core system is not “the model.”&lt;br&gt;
The core system is the &lt;strong&gt;agent shell plus its persona and memory architecture&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;That is a very different center of gravity.&lt;/p&gt;
&lt;p&gt;The model is powerful. It should not automatically become the ruler of the whole system.&lt;/p&gt;
&lt;h3 id=&quot;the-mvp-i-m-aiming-for&quot;&gt;The MVP I’m aiming for&lt;/h3&gt;
&lt;p&gt;I am not trying to solve everything at once.&lt;br&gt;
The first working version only needs a few things:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Read and write &lt;code&gt;persona_context/*.json&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Build the four-layer message structure&lt;/li&gt;
&lt;li&gt;Send that structure through &lt;code&gt;vscode.lm&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;After each response, update memory via recompression&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That is enough to test whether the shell actually feels different in practice.&lt;/p&gt;
&lt;p&gt;If it works, later steps can include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;splitting memory into &lt;code&gt;stable_memory&lt;/code&gt; and &lt;code&gt;recent_memory&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;better memory compaction rules&lt;/li&gt;
&lt;li&gt;persona-specific routing&lt;/li&gt;
&lt;li&gt;hybrid use with local models&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But the first milestone is smaller.&lt;/p&gt;
&lt;h3 id=&quot;the-real-challenge-is-not-model-quality&quot;&gt;The real challenge is not model quality&lt;/h3&gt;
&lt;p&gt;This is the part I keep coming back to.&lt;/p&gt;
&lt;p&gt;Most people focus on the model itself:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Which one is smarter?&lt;/li&gt;
&lt;li&gt;Which one is cheaper?&lt;/li&gt;
&lt;li&gt;Which one is faster?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Those questions matter.&lt;/p&gt;
&lt;p&gt;But in this kind of system, the harder problem is often:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How should intelligence be organized before the model even speaks?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;That means boundaries, routing, memory shape, persona stability, and context layering.&lt;/p&gt;
&lt;p&gt;In other words, not just inference.&lt;br&gt;
Structure.&lt;/p&gt;
&lt;p&gt;The more I work on this, the less I think the model alone is the product. The architecture around the model is where identity, continuity, and usable behavior actually come from.&lt;/p&gt;
&lt;h3 id=&quot;what-i-m-really-trying-to-build&quot;&gt;What I’m really trying to build&lt;/h3&gt;
&lt;p&gt;I am not trying to make Copilot pretend to be an entire autonomous being.&lt;/p&gt;
&lt;p&gt;I am trying to build a shell where:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;identity is stable&lt;/li&gt;
&lt;li&gt;memory can grow without rotting&lt;/li&gt;
&lt;li&gt;context has layers&lt;/li&gt;
&lt;li&gt;the model is powerful but not sovereign&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That distinction matters to me.&lt;/p&gt;
&lt;p&gt;Because once the model is only one layer, you stop building around its personality and start building around your own architecture.&lt;/p&gt;
&lt;p&gt;And that is where the project gets interesting.&lt;/p&gt;
&lt;h3 id=&quot;final-note&quot;&gt;Final note&lt;/h3&gt;
&lt;p&gt;This is still in progress.&lt;/p&gt;
&lt;p&gt;But the direction already feels right:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;not one giant prompt&lt;/li&gt;
&lt;li&gt;not append-only memory&lt;/li&gt;
&lt;li&gt;not identity and experience mixed together&lt;/li&gt;
&lt;li&gt;not the model as the whole system&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Instead:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;persona core&lt;/li&gt;
&lt;li&gt;persistent memory&lt;/li&gt;
&lt;li&gt;session context&lt;/li&gt;
&lt;li&gt;current request&lt;/li&gt;
&lt;li&gt;one inference layer inside a larger design&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That is the shell I want.&lt;/p&gt;
&lt;p&gt;And honestly, that feels more important than picking yet another “best model.”&lt;/p&gt;
&lt;p&gt;Because once the model stops being the ruler of the system and becomes one component inside a designed structure, a different kind of engineering becomes possible.&lt;/p&gt;
&lt;p&gt;You stop asking which model should define the whole experience.&lt;br&gt;
You start deciding how identity, memory, and context should be organized—and then let the model operate inside that architecture.&lt;/p&gt;
&lt;p&gt;That is the direction I care about.&lt;/p&gt;
&lt;p&gt;Not just better outputs.&lt;br&gt;
A better structure for intelligence.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/12815/im-building-a-persona-aware-agent-shell-on-top-of-github-copilot</guid>
<pubDate>Thu, 12 Mar 2026 12:42:32 +0000</pubDate>
</item>
<item>
<title>Beyond &quot;Find&quot;: Unleashing the Full Power of VS Code’s Search Engine</title>
<link>https://coderlegion.com/11266/beyond-find-unleashing-the-full-power-of-vs-codes-search-engine</link>
<description>&lt;p&gt;Most developers use the &lt;code&gt;Ctrl+F&lt;/code&gt; (or &lt;code&gt;Cmd+F&lt;/code&gt;) shortcut dozens of times a day. We find a variable name, we replace a typo, and we move on. But tucked away in that small search bar is one of the most powerful productivity multipliers in a developer's toolkit: &lt;strong&gt;Regular Expressions (Regex).&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you aren't using Regex in your IDE, you aren't just coding slower—you’re doing manual labor that a computer could do in milliseconds.&lt;/p&gt;
&lt;h3 id=&quot;the-secret-sauce-the-button&quot;&gt;The Secret Sauce: The &lt;code&gt;.*&lt;/code&gt; Button&lt;/h3&gt;
&lt;p&gt;In the VS Code search and replace widget, there is a small icon that looks like &lt;code&gt;.*&lt;/code&gt;. Clicking this transforms the search bar from a simple text matcher into a logic-driven engine.&lt;/p&gt;
&lt;p&gt;As seen in the example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Search:&lt;/strong&gt; &lt;code&gt;(&amp;lt;[^&amp;lt;&amp;gt;]+&amp;gt;)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Replace:&lt;/strong&gt; &lt;code&gt;`$1&lt;/code&gt;`&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This isn't gibberish. It’s a surgical strike.&lt;/p&gt;
&lt;h3 id=&quot;1-mastering-capture-groups&quot;&gt;1. Mastering Capture Groups&lt;/h3&gt;
&lt;p&gt;The most &quot;pro&quot; move in VS Code is using &lt;strong&gt;Capture Groups&lt;/strong&gt;. By wrapping part of your search query in parentheses &lt;code&gt;()&lt;/code&gt;, you tell VS Code to &quot;remember&quot; that specific string.&lt;/p&gt;
&lt;p&gt;In the replacement field, you can call those memories back using &lt;code&gt;$1&lt;/code&gt;, &lt;code&gt;$2&lt;/code&gt;, and so on.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; Imagine you have 100 lines of &lt;code&gt;const user_name = data.user_name&lt;/code&gt; and you want to switch to camelCase. A clever Regex can identify the underscores and reorganize the string for you instantly.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;2-dealing-with-the-unknown-&quot;&gt;2. Dealing with the &quot;Unknown&quot;&lt;/h3&gt;
&lt;p&gt;The screenshot uses &lt;code&gt;[^&amp;lt;&amp;gt;]+&lt;/code&gt;. This is a &quot;negated character set.&quot; It’s a fancy way of saying: &lt;em&gt;&quot;Find a bracket, then grab everything inside until you hit another bracket.&quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This is far safer than using the wildcard &lt;code&gt;.*&lt;/code&gt;, which can sometimes &quot;over-eat&quot; your code and match more than you intended (a concept known as &quot;greediness&quot;).&lt;/p&gt;
&lt;h3 id=&quot;3-multi-line-power&quot;&gt;3. Multi-Line Power&lt;/h3&gt;
&lt;p&gt;By clicking the icon with the three lines (next to the search box), you can expand the search to include &lt;strong&gt;line breaks&lt;/strong&gt;. Combined with Regex, this allows you to refactor entire blocks of code—like moving a function's arguments or reordering JSON properties—across thousands of files at once.&lt;/p&gt;
&lt;h3 id=&quot;4-why-this-matters&quot;&gt;4. Why This Matters&lt;/h3&gt;
&lt;p&gt;As your codebase grows, manual refactoring becomes a liability. Human error leads to broken syntax and missed instances. Learning Regex for VS Code allows you to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Audit your code:&lt;/strong&gt; Find every &lt;code&gt;console.log&lt;/code&gt; that &lt;em&gt;isn't&lt;/em&gt; inside a comment.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Format instantly:&lt;/strong&gt; Wrap raw text into HTML tags or Markdown syntax.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Refactor safely:&lt;/strong&gt; Change data structures across 50 different files without opening each one individually.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;5-the-vs-code-regex-cheat-sheet&quot;&gt;5.  The VS Code Regex Cheat Sheet&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Feature &lt;/th&gt;&lt;th&gt;Pattern &lt;/th&gt;&lt;th&gt;What it does&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Digit&lt;/strong&gt; &lt;/td&gt;&lt;td&gt;&lt;code&gt;\d&lt;/code&gt; &lt;/td&gt;&lt;td&gt;Matches any single number (0-9).&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Word Character&lt;/strong&gt; &lt;/td&gt;&lt;td&gt;&lt;code&gt;\w&lt;/code&gt; &lt;/td&gt;&lt;td&gt;Matches letters, numbers, and underscores (great for variable names).&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Whitespace&lt;/strong&gt; &lt;/td&gt;&lt;td&gt;&lt;code&gt;\s&lt;/code&gt; &lt;/td&gt;&lt;td&gt;Matches spaces, tabs, and line breaks.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Capture Group&lt;/strong&gt; &lt;/td&gt;&lt;td&gt;&lt;code&gt;( )&lt;/code&gt; &lt;/td&gt;&lt;td&gt;Groups multiple tokens and creates a &quot;capture&quot; to use in the replace field.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Backreference&lt;/strong&gt; &lt;/td&gt;&lt;td&gt;&lt;code&gt;$1&lt;/code&gt;, &lt;code&gt;$2&lt;/code&gt; &lt;/td&gt;&lt;td&gt;Re-inserts the text captured in the 1st or 2nd set of parentheses.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Negated Set&lt;/strong&gt; &lt;/td&gt;&lt;td&gt;&lt;code&gt;[^ ]&lt;/code&gt; &lt;/td&gt;&lt;td&gt;Matches any character &lt;em&gt;except&lt;/em&gt; those in the brackets (e.g., &lt;code&gt;[^&quot;]&lt;/code&gt; matches everything until a quote).&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Start/End of Line&lt;/strong&gt; &lt;/td&gt;&lt;td&gt;&lt;code&gt;^&lt;/code&gt; / &lt;code&gt;$&lt;/code&gt; &lt;/td&gt;&lt;td&gt;Matches the beginning or the end of a line.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&quot;common-use-cases&quot;&gt;Common Use Cases&lt;/h4&gt;
&lt;h5 id=&quot;1-converting-quotes&quot;&gt;1. Converting Quotes&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Search:&lt;/strong&gt; &lt;code&gt;'([^']*)'&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Replace:&lt;/strong&gt; &lt;code&gt;&quot;$1&quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Effect:&lt;/strong&gt; Changes all single-quoted strings to double-quoted strings while preserving the content inside.&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id=&quot;2-cleaning-up-console-logs&quot;&gt;2. Cleaning up Console Logs&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Search:&lt;/strong&gt; &lt;code&gt;console\.log\(.*\);?&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Replace:&lt;/strong&gt; &lt;em&gt;(leave empty)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Effect:&lt;/strong&gt; Instantly wipes all console logs from your file.&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id=&quot;3-transforming-markdown-links-to-html&quot;&gt;3. Transforming Markdown Links to HTML&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Search:&lt;/strong&gt; &lt;code&gt;\[(.*)\]\((.*)\)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Replace:&lt;/strong&gt; &lt;code&gt;&amp;lt;a href=&quot;$2&quot;&amp;gt;$1&amp;lt;/a&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Effect:&lt;/strong&gt; Converts &lt;code&gt;[Google](https://google.com)&lt;/code&gt; into &lt;code&gt;&amp;lt;a href=&quot;https://google.com&quot;&amp;gt;Google&amp;lt;/a&amp;gt;&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;pro-tip-lookaheads&quot;&gt;Pro Tip: Lookaheads&lt;/h4&gt;
&lt;p&gt;If you want to find a word only if it's followed by something specific (like a function call), use a &lt;strong&gt;Positive Lookahead&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;\w+(?=\()&lt;/code&gt; — Matches a word only if it is immediately followed by an opening parenthesis (finding function names).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;conclusion-1&quot;&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;The search bar isn't just a map to find where you are; it’s a tool to reshape where you’re going. Next time you find yourself doing a repetitive &quot;find and replace&quot; task, stop. Take 60 seconds to write a Regex. It might take a moment to think it through, but the time you save over your career will be measured in weeks, not hours.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/11266/beyond-find-unleashing-the-full-power-of-vs-codes-search-engine</guid>
<pubDate>Sun, 08 Feb 2026 18:10:36 +0000</pubDate>
</item>
<item>
<title>How GitHub Copilot Helped Me Roast Its Own Users</title>
<link>https://coderlegion.com/11243/how-github-copilot-helped-me-roast-its-own-users</link>
<description>&lt;blockquote&gt;&lt;p&gt;What if GitHub Copilot didn’t just help you write code but judged you for it?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3 id=&quot;what-i-built&quot;&gt;What I Built&lt;/h3&gt;
&lt;p&gt;I had been waiting for a challenge that truly sounded like me for a long time, and that’s when the GitHub Copilot CLI Challenge showed up.&lt;/p&gt;
&lt;p&gt;Within five minutes, the idea that popped into my head was to use Copilot CLI to do something with Copilot itself.&lt;/p&gt;
&lt;p&gt;That’s when the idea of roasting the user for their GitHub Copilot usage came up.&lt;/p&gt;
&lt;p&gt;Then I started wondering how to implement it.&lt;/p&gt;
&lt;p&gt;Whether to build something that runs in the terminal but that would consume RAM.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Should I try a different approach?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That’s when the idea of a VS Code extension popped up (GitHub CLI actually helped me there ).&lt;/p&gt;
&lt;p&gt;This was my first time using an AI pair programmer to help me build a project completely, because I had never built, or even thought about creating a VS Code extension before.&lt;/p&gt;
&lt;p&gt;The roasts are static for now and don’t use AI, because I couldn’t afford an API key .&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;demo&quot;&gt;Demo&lt;/h3&gt;
&lt;p&gt;Click the following link:&lt;br&gt;
&lt;a rel=&quot;nofollow&quot; href=&quot;https://marketplace.visualstudio.com/items?itemName=VigneshJ.copilot-roaster&quot;&gt;Copilot Roaster Extension&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Install the extension using the link.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p8kd7cmoa87g3e4bp5dn.png&quot; alt=&quot;Extenstion&quot;&gt;&lt;/p&gt;
&lt;p&gt;And your setup is complete.&lt;/p&gt;
&lt;p&gt;Then, open any sample file to test it.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z8739gfssiuep4wghrca.png&quot; alt=&quot;Sample File&quot;&gt;&lt;/p&gt;
&lt;p&gt;Ask GitHub Copilot to write something and accept its suggestion to see the magic ✨&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y256grfxydcbfngkdcru.png&quot; alt=&quot;Copilot Chat&quot;&gt;&lt;/p&gt;
&lt;p&gt;Find my demo below:&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.loom.com/share/e9206dad95044bdba7127ad198710722&quot;&gt;Demo&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;You can find the GitHub repository &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/Vignesh025/copilot-roast-extension&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Feel free to fork, modify, and upgrade it.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;my-experience-with-github-copilot-cli&quot;&gt;My Experience with GitHub Copilot CLI&lt;/h3&gt;
&amp;lt;!-- Explain how you used GitHub Copilot CLI while building your project and how it impacted your development experience. --&amp;gt;
&lt;p&gt;This was my first time using an AI pair programmer in the CLI. I was really excited to see how it worked. After installing it and typing copilot in the terminal, it felt like magic when this showed up.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vre4uytrbplpzkp3dzed.png&quot; alt=&quot;Copilot CLI&quot;&gt;&lt;/p&gt;
&lt;p&gt;I started wondering how it would work,  which subscription it would use and which profile it would be linked to.&lt;/p&gt;
&lt;p&gt;While thinking about all this, I typed a prompt, and that’s when I got an error saying I needed to log in to proceed further.&lt;/p&gt;
&lt;p&gt;First, we need to use /login to sign in with our GitHub account.&lt;/p&gt;
&lt;p&gt;After that, everything was smooth. The suggestions were almost exactly what I expected (maybe my prompt was too good ).&lt;/p&gt;
&lt;p&gt;Then I tweaked things a bit, and tadaaa &lt;/p&gt;
&lt;p&gt;The extension was ready and looked cool.&lt;/p&gt;
&lt;p&gt;I added a few more roasts just to make sure the same ones didn’t repeat.&lt;/p&gt;
&lt;p&gt;Then I published it on the Marketplace.&lt;/p&gt;
&lt;p&gt;GitHub Copilot CLI provided me with the exact steps to publish the extension, because I had no clue how to do it and the whole process was smooth as well.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;So go ahead, install the extension, let Copilot write your code, and brace yourself… because this time, you’re the one getting reviewed &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Follow me on&lt;/em&gt;&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.linkedin.com/in/vigneshj-&quot;&gt;&lt;em&gt;Linkedin&lt;/em&gt;&lt;/a&gt; | &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/Vignesh025&quot;&gt;&lt;em&gt;GitHub&lt;/em&gt;&lt;/a&gt; | &lt;a rel=&quot;nofollow&quot; href=&quot;https://x.com/vigneshtwt_&quot;&gt;&lt;em&gt;Twitter&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Subscribe to my &lt;a rel=&quot;nofollow&quot; href=&quot;https://thedeveloperstack.substack.com&quot;&gt;newsletter&lt;/a&gt; and get articles delivered straight to your inbox.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/11243/how-github-copilot-helped-me-roast-its-own-users</guid>
<pubDate>Sun, 08 Feb 2026 07:19:53 +0000</pubDate>
</item>
<item>
<title>Solidifying Web 2 Fundamentals</title>
<link>https://coderlegion.com/10578/solidifying-web-2-fundamentals</link>
<description>&lt;p&gt;It all starts with choose an IDE. If you're new to this space, then an IDE means Integrated Development Environment.&lt;/p&gt;
&lt;p&gt;For simpler understanding, it is the ideal environment for coding or writing codes. And for this journey, I'll be using VS Code (personal preference).&lt;/p&gt;
&lt;p&gt;After installing VS Code, I set it up using the following extensions;&lt;/p&gt;
&lt;p&gt;✅ Auto close tag&lt;br&gt;
✅ Auto rename tag&lt;br&gt;
✅ Code snap&lt;br&gt;
✅ Color Highlight&lt;br&gt;
✅ Image Preview&lt;br&gt;
✅ Live server&lt;br&gt;
✅ IntelliSense for CSS class&lt;br&gt;
✅ Path IntelliSense&lt;br&gt;
✅ Prettier - Code formatter&lt;br&gt;
✅ Pug beautify&lt;/p&gt;
&lt;p&gt;And because I love how it looks, I'm using the &lt;strong&gt;bearded theme vivid black&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;After setting up my coding environment, I mastered the HTML boiler plate. &lt;br&gt;
Vs code prints out the boiler plate automatically once '!' and the 'enter' key is pressed. But to build muscle memory, it's important to master it from scratch.&lt;/p&gt;
&lt;p&gt;As a mark up language, HTML is pretty easy to understand and flow with. From the heading tags, to the paragraphs, footer and the likes. We would be using these tags while we build projects.&lt;/p&gt;
&lt;p&gt;I'm glad to announce that I'm properly setup to style styling web pages using CSS.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/10578/solidifying-web-2-fundamentals</guid>
<pubDate>Tue, 27 Jan 2026 18:04:43 +0000</pubDate>
</item>
<item>
<title>The &amp;&amp; Fallacy: How --command Fixed VS Code Extensions in a Declarative Nix Shell</title>
<link>https://coderlegion.com/6685/the-fallacy-how-command-fixed-vs-code-extensions-in-a-declarative-nix-shell</link>
<description>&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://kitfucoda.medium.com/beyond-rbenv-and-pyenv-achieving-reproducible-dev-setups-with-nix-04b610175a59&quot;&gt;In the last article&lt;/a&gt;, we discussed the evolution of my development setup, focusing on how it became reproducible over time. It was originally written to document the process for my own amusement. Surprisingly, the stats tell a different story — apparently it resonated with enough people sharing the same pain. Over time, revisions were made alongside new discoveries, and I figured the journey was worth a retelling. Read on to find out about an unexpected milestone related to this very blog.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/1024/1*GzOY6iSa5mArW2CikDQTDQ.png&quot; alt=&quot;&quot;&gt;&lt;br&gt;
&lt;em&gt;Cute illustration on the topic, by Microsoft Copilot&lt;/em&gt;&lt;/p&gt;
&lt;h4 id=&quot;the-editor-s-blind-spot-nix-vs-vs-code-extensions&quot;&gt;The Editor’s Blind Spot: Nix vs. VS Code Extensions&lt;/h4&gt;
&lt;p&gt;Up until the last article, we managed to get a rather consistent setup with home-manager to manage development tools, and subsequently &lt;a rel=&quot;nofollow&quot; href=&quot;https://kitfucoda.medium.com/beyond-rbenv-and-pyenv-achieving-reproducible-dev-setups-with-nix-04b610175a59&quot;&gt;retired tools like&lt;/a&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://kitfucoda.medium.com/beyond-rbenv-and-pyenv-achieving-reproducible-dev-setups-with-nix-04b610175a59&quot;&gt;pyenv and&lt;/a&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://kitfucoda.medium.com/beyond-rbenv-and-pyenv-achieving-reproducible-dev-setups-with-nix-04b610175a59&quot;&gt;rbenv with the use of&lt;/a&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://kitfucoda.medium.com/beyond-rbenv-and-pyenv-achieving-reproducible-dev-setups-with-nix-04b610175a59&quot;&gt;nix-develop&lt;/a&gt;. Little did I know, it wasn’t the end of the story. This time, we are tackling a new issue — the lack of nix-develop support of the Visual Studio Code extensions for development work in Ruby.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://dev.to/jeffrey04/from-dotfile-hacks-to-open-source-my-development-environment-evolution-1hce&quot;&gt;From Dotfile Hacks to Open Source: My Development Environment Evolution&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://dev.to/jeffrey04/beyond-rbenv-and-pyenv-achieving-reproducible-dev-setups-with-nix-5gaa&quot;&gt;Beyond rbenv and pyenv: Achieving Reproducible Dev Setups with Nix&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Forcing the ruby-lsp extension to source an external Gemfile as detailed was a hackish solution. Although it worked for a bit, most of the time the extension failed to initialize the language server. Observing how inconsistent the behavior is, something must be wrong. On the other hand, setup seems impeccable, tests were passing, and projects were building fine too.&lt;/p&gt;
&lt;p&gt;Unfortunately, not much luck with the team’s desired formatter.&lt;/p&gt;
&lt;p&gt;It wouldn’t work in the editor.&lt;/p&gt;
&lt;p&gt;A type checker extension called sorbet is also common, and that too wouldn’t work at all. Considering the team doesn’t type annotate the code, I quickly dismissed and deactivated the extension. Combining this with the previous problem where ruby-lsp failed to work, the itch grew as time passes on.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/1024/0*fQ284dwYbjqK6d0B&quot; alt=&quot;&quot;&gt;&lt;br&gt;
&lt;em&gt;Photo by Abu Saeid on Unsplash&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Worse still, a formatter that doesn’t work at all times yields errors in the automated checks on every push.&lt;/p&gt;
&lt;p&gt;Something was definitely wrong, was it because of VSCode failing to pick up the environment in a nix-develop session? My initial attempts to fix the flake file to include a command to &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/Shopify/ruby-lsp/issues/1851&quot;&gt;activate the language server properly as shared&lt;/a&gt;. Still, none of them seemed to work reliably.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/Shopify/ruby-lsp/issues/1851&quot;&gt;How To: Use vscode-ruby-lsp with flake.nix based dev enviroment · Issue #1851 · Shopify/ruby-lsp&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;After hitting walls enough times, I decided to post my setup to the discussion board to seek for help.&lt;/p&gt;
&lt;h4 id=&quot;the-log-line-that-clicked-differently&quot;&gt;The Log Line That Clicked Differently&lt;/h4&gt;
&lt;p&gt;A problem can only be solved if we can clearly define it. We know the setup is failing, but what caused it? Interestingly enough, achieving the problem definition is a series of unlikely coincidences. It almost felt like solving a jigsaw puzzle, where each seemingly unrelated piece ultimately leads to the solution. So what are the missing pieces stalling our progress in understanding what went wrong?&lt;/p&gt;
&lt;p&gt;Let’s start with the discovery of previously unused --command argument for nix-develop.&lt;/p&gt;
&lt;p&gt;Initially, the gemini-generated flake file for the nix-develop sessions contained some commands to start my favorite fish shell. The snippet on starting a new shell was taken out from the previous discussion as it was somewhat unrelated. It was rather complicated and bound to fail because I was expecting it to work differently in different scenarios. Naturally, I wanted to simplify it somewhat, and eventually I learned about the --command argument.&lt;/p&gt;
&lt;p&gt;Instead of relying on a clever (or dumb, depending on how you perceive it) detection logic, I could start a new fish shell session with&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nix develop /path/to/flake/dir --command fish
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Besides a shell, it could also run any command in the environment defined by the flake file. Discovering this was a crucial step toward fixing the launch of the ruby-lsp language server in the editor.&lt;/p&gt;
&lt;p&gt;Remember I posted &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/Shopify/ruby-lsp/discussions/3683&quot;&gt;an SOS message on the discussion board&lt;/a&gt;? Luckily, it caught the attention of &lt;a rel=&quot;nofollow&quot; href=&quot;https://vinistock.com/&quot;&gt;Vinicius Stock&lt;/a&gt;, the project owner. Helpfully enough, he pointed out that an external Gemfile is not necessary, and asked me to check if the language server is launched properly. With that, I checked the log and found this line&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;2025-07-27 16:56:30.669 [info] (ship_it) Running command: `nix develop /Users/jeffrey04/Projects/home-manager/devenvs/ruby-3.3 &amp;amp;&amp;amp; ruby -EUTF-8:UTF-8 '/Users/jeffrey04/.vscode-oss/extensions/shopify.ruby-lsp-0.9.31/activation.rb'` in /Users/jeffrey04/Projects/ship_it using shell: /Users/jeffrey04/.nix-profile/bin/bash
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Despite seeing the log multiple times before, now that I know about the --command argument, the same line clicked differently. Does the ruby command after the &amp;amp;&amp;amp; operator run in the nix-develop session? Validating in this case is rather easy, just run&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nix develop /path/to/flake/dir &amp;amp;&amp;amp; ruby --version
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Oops, why am I being dropped to a new shell session? Let me exit the session, and sure enough, the ruby command refers to the version offered by the operating system.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;❯ nix develop ~/Projects/home-manager/devenvs/ruby-3.3 &amp;amp;&amp;amp; ruby --version
warning: updating lock file &quot;/Users/jeffrey04/Projects/home-manager/devenvs/ruby-3.3/flake.lock&quot;:
• Added input 'nixpkgs':
    'github:NixOS/nixpkgs/544961dfcce86422ba200ed9a0b00dd4b1486ec5?narHash=sha256-EVAqOteLBFmd7pKkb0%2BFIUyzTF61VKi7YmvP1tw4nEw%3D' (2025-10-15)
(nix:ruby-3.3-env) wukong:ib-vpn jeffrey04$
exit
ruby 2.6.10p210 (2022-04-12 revision 67958) [universal.x86_64-darwin24]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/1024/0*jSpPmgyc2V98iFRo&quot; alt=&quot;&quot;&gt;&lt;br&gt;
&lt;em&gt;Photo by Matias Malka on Unsplash&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Clearly, the assumption that the command following the &amp;amp;&amp;amp; operator is flawed from the very beginning. With this revelation, we can finally define what the problem is — the language server is not properly launched. In this case, all we need to do is to replace the boolean AND operator into --command.&lt;/p&gt;
&lt;p&gt;Easy to say, but implementation is a challenge for someone who has no experience with vscode extension development like myself.&lt;/p&gt;
&lt;p&gt;And this is exactly when &lt;a rel=&quot;nofollow&quot; href=&quot;https://dev.to/jeffrey04/vibe-coding-storytelling-and-llms-a-collaborative-approach-2l4h&quot;&gt;vibe-coding is useful&lt;/a&gt;, with a clear problem definition and goal, the solution was just a prompt or two away with the help of gemini-cli. As expected, the patch worked flawlessly.&lt;/p&gt;
&lt;p&gt;Firstly, add a new enum entry to ManagerIdentifier in vscode/src/ruby.ts&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;export enum ManagerIdentifier {
  Asdf = &quot;asdf&quot;,
  Auto = &quot;auto&quot;,
  Chruby = &quot;chruby&quot;,
  Rbenv = &quot;rbenv&quot;,
  Rvm = &quot;rvm&quot;,
  Shadowenv = &quot;shadowenv&quot;,
  Mise = &quot;mise&quot;,
  RubyInstaller = &quot;rubyInstaller&quot;,
  NixDevelop = &quot;nix-develop&quot;, # add this line
  None = &quot;none&quot;,
  Custom = &quot;custom&quot;,
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then a new case in the runManagerActivation method&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;case ManagerIdentifier.NixDevelop:
  await this.runActivation(
    new NixDevelop(this.workspaceFolder, this.outputChannel, this.context, this.manuallySelectRuby.bind(this)),
  );
  break;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Followed by a new module at vscode/src/ruby/nixDevelop.ts that contains the activation logic:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import * as vscode from &quot;vscode&quot;;

import { VersionManager, ActivationResult } from &quot;./versionManager&quot;;

export class NixDevelop extends VersionManager {
  async activate(): Promise&amp;lt;ActivationResult&amp;gt; {
    const customCommand = this.customCommand();
    const command = `nix develop ${customCommand} --command ruby`;
    const parsedResult = await this.runEnvActivationScript(command);

    return {
      env: { ...process.env, ...parsedResult.env },
      yjit: parsedResult.yjit,
      version: parsedResult.version,
      gemPath: parsedResult.gemPath,
    };
  }

  private customCommand() {
    const configuration = vscode.workspace.getConfiguration(&quot;rubyLsp&quot;);
    const customCommand: string | undefined =
      configuration.get(&quot;customRubyCommand&quot;);

    return customCommand || &quot;&quot;;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Lastly, enable the option forrubyVersionManager in vscode/package.json&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;        &quot;rubyLsp.rubyVersionManager&quot;: {
          &quot;type&quot;: &quot;object&quot;,
          &quot;properties&quot;: {
            &quot;identifier&quot;: {
              &quot;description&quot;: &quot;The Ruby version manager to use&quot;,
              &quot;type&quot;: &quot;string&quot;,
              &quot;enum&quot;: [
                &quot;asdf&quot;,
                &quot;auto&quot;,
                &quot;chruby&quot;,
                &quot;none&quot;,
                &quot;rbenv&quot;,
                &quot;rvm&quot;,
                &quot;shadowenv&quot;,
                &quot;mise&quot;,
                &quot;nix-develop&quot;, // add this line
                &quot;custom&quot;
              ],
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Don’t forget about the actual config (omit the rubyLsp.customRubyCommand if flake.nix is in the workspace)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&quot;rubyLsp.rubyVersionManager&quot;: {
    &quot;identifier&quot;: &quot;nix-develop&quot;
},
&quot;rubyLsp.customRubyCommand&quot;: &quot;/Users/jeffrey04/Projects/home-manager/devenvs/ruby-3.3&quot;,
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The patch is definitely not perfect, and it is reusing the optional customRubyCommand configuration item to define where the directory containing the flake file is. Yet, considering this likely affects only a small group of users, I don’t see a need to introduce a new configuration field for the purpose. Contributions are definitely welcome at the &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/Shopify/ruby-lsp/pull/3691&quot;&gt;submitted pull request&lt;/a&gt;, as it has been stalling for months.&lt;/p&gt;
&lt;p&gt;For the sorbet part, I managed to get it working one day out of boredom. Most of the Ruby code I have access for now is not type-annotated, so the effort is purely for fun. A quick and dirty way to do so, is building the language server application directly, and configure vscode as follows&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&quot;sorbet.enabled&quot;: true,
&quot;sorbet.selectedLspConfigId&quot;: &quot;without-bundler&quot;,
&quot;sorbet.userLspConfigs&quot;: [
    {
        &quot;id&quot;: &quot;without-bundler&quot;,
        &quot;name&quot;: &quot;sorbet&quot;,
        &quot;description&quot;: &quot;Launch locally compiled sorbet&quot;,
        &quot;command&quot;: [&quot;/path/to/sorbet&quot;, &quot;typecheck&quot;, &quot;--lsp&quot;, &quot;--dir=/path/to/project&quot;]
    }
]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For some reason I needed to --disable-watchman flag in the command too, but as there’s no real need for now I am not going to dig further.&lt;/p&gt;
&lt;p&gt;There you have it, with simplified flake files (removing the detection logic to start fish shell) and invoking fish shell explicitly with --command, and patches and hacks to enable the ruby toolings, we finally have a functional setup for development work in Ruby. Seeing the pull request being stalled for months (and their bot closed my PR recently due to inactivity) does make me upset for a little bit. Moving forward I may need to consider maintaining a fork for it as it does affect my work.&lt;/p&gt;
&lt;h4 id=&quot;stalled-pr-sudden-payoff-the-two-timelines&quot;&gt;Stalled PR, Sudden Payoff: The Two Timelines&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/1024/0*cP36WVy-iKsY5dMX&quot; alt=&quot;&quot;&gt;&lt;br&gt;
&lt;em&gt;Photo by engin akyurt on Unsplash&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Patches to the ruby-lsp were submitted in the late July, and I was hoping to start drafting this article when it received a review. Unfortunately, that didn’t happen. I was caught up with my new job and several major family issues while waiting on the PR. Things finally settled down for a little bit, and I should be back to a relatively more predictable routine. Hopefully this translates to a more consistent publishing schedule for &lt;a rel=&quot;nofollow&quot; href=&quot;https://kitfucoda.medium.com/&quot;&gt;KitFu Coda&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As for the unexpected milestone teased in the beginning, it is about a talk I am about to deliver during the upcoming &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.pycon.my/&quot;&gt;PyCon Malaysia&lt;/a&gt;. My mentor encouraged me to submit for the CFP and &lt;a rel=&quot;nofollow&quot; href=&quot;https://cfp.pycon.my/pyconmy-2025/talk/review/LNN8WWYV93JYTKZMEGKE79KBWJM73J8M&quot;&gt;it somehow went through&lt;/a&gt;. If you are interested in applying AsyncIO in projects, do feel free to drop by and say Hi. For reference, it is based on the articles I published earlier, as linked below.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://dev.to/jeffrey04/understanding-awaitables-coroutines-tasks-and-futures-in-python-gk7&quot;&gt;Understanding Awaitables: Coroutines, Tasks, and Futures in Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://dev.to/jeffrey04/asyncio-task-management-a-hands-on-scheduler-project-2e54&quot;&gt;AsyncIO Task Management: A Hands-On Scheduler Project&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://dev.to/jeffrey04/concurrency-vs-parallelism-achieving-scalability-with-processpoolexecutor-1n7n&quot;&gt;Concurrency vs. Parallelism: Achieving Scalability with ProcessPoolExecutor&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I also discussed briefly with my supervisor in one of our 1 on 1 sessions, mainly to check on any necessary approvals or conflict of interest. He was incredibly supportive about it and offered some tips on presenting ideas to a wider audience. As I am new to Ruby, he also briefly explained how the language approaches asynchronous programming. On a lighter note, he’s even been checking on my preparation progress (zero so far), especially in recent sessions!&lt;/p&gt;
&lt;p&gt;With this article checked off in my TODO, I can finally allocate some time on the preparation work. I sometimes feel like I’m running on an energy tank whose maximum capacity depletes as we age. These days, even finding time to game is a challenge. I feel bad for my character in &lt;em&gt;Xenoblade X&lt;/em&gt; and I wonder if I’ll ever have time for the new &lt;em&gt;Pokémon Legends Z-A&lt;/em&gt; game I’m about to purchase.&lt;/p&gt;
&lt;p&gt;Finally, I would like to thank everyone for the support, especially to everyone who reads my work here. Though I have not been publishing much, since starting this technical writing project opens up fascinating new opportunities. Besides scoring a new job, I also started exploring scripted video making, and now a talk. I am thankful and hope to inspire more people through this trying time.&lt;/p&gt;
&lt;p&gt;Thanks again for reading, I shall write again soon.&lt;/p&gt;
&lt;p&gt;Throughout this journey, Gemini served as a valuable editorial companion, helping refine my prose. However, the voice and code remain entirely my own. I welcome your feedback and recommendations in the comments below, and invite you to subscribe to my &lt;a rel=&quot;nofollow&quot; href=&quot;https://kitfucoda.medium.com/&quot;&gt;Medium&lt;/a&gt; for more content on my development adventures!&lt;/p&gt;
</description>
<category>Other</category>
<guid isPermaLink="true">https://coderlegion.com/6685/the-fallacy-how-command-fixed-vs-code-extensions-in-a-declarative-nix-shell</guid>
<pubDate>Tue, 21 Oct 2025 02:40:26 +0000</pubDate>
</item>
<item>
<title>Why I switched from VSCode to Neovim</title>
<link>https://coderlegion.com/5084/why-i-switched-from-vscode-to-neovim</link>
<description>&lt;h2 id=&quot;why-i-switched-from-vscode-to-neovim&quot;&gt;Why I Switched from VSCode to Neovim&lt;/h2&gt;
&lt;p&gt;Developers switch their code editors for all kinds of reasons. In my case, the journey started with &lt;strong&gt;VSCode&lt;/strong&gt;, but even then, I was already using Vim keybindings. I had been familiar with Vim for some time, and the plugin for VSCode seemed “good enough” until it wasn’t.&lt;/p&gt;
&lt;h3 id=&quot;the-limits-of-vim-in-vscode&quot;&gt;The Limits of Vim in VSCode&lt;/h3&gt;
&lt;p&gt;The first cracks began to show when I realized that although VSCode’s Vim plugin supported a decent portion of Vim’s functionality, it wasn’t the full experience. Critical features, like &lt;strong&gt;macros&lt;/strong&gt;, were either missing or incomplete. For someone who heavily relies on Vim’s modal editing philosophy, this limitation quickly became frustrating.&lt;/p&gt;
&lt;p&gt;On top of that, I never really liked VSCode’s &lt;strong&gt;user interface&lt;/strong&gt;. To me, it always felt bloated and, frankly, ugly. The &lt;strong&gt;search feature&lt;/strong&gt; didn’t click with me, the &lt;strong&gt;default keybindings&lt;/strong&gt; were unintuitive, and perhaps worst of all, VSCode’s &lt;strong&gt;performance&lt;/strong&gt; lagged behind. It felt sluggish compared to what I knew was possible.&lt;/p&gt;
&lt;h3 id=&quot;enter-neovim&quot;&gt;Enter Neovim&lt;/h3&gt;
&lt;p&gt;So, I made the switch to &lt;strong&gt;Neovim&lt;/strong&gt; and I never looked back.&lt;/p&gt;
&lt;p&gt;The first thing I noticed was &lt;strong&gt;speed&lt;/strong&gt;. Neovim is lightweight and fast, even with a custom setup. Then came the &lt;strong&gt;customizability&lt;/strong&gt;. Unlike VSCode, Neovim doesn’t impose a UI or workflow on you. You get to build your own environment from the ground up, tailored exactly to how you want to work.&lt;/p&gt;
&lt;p&gt;Pairing Neovim with &lt;strong&gt;tmux&lt;/strong&gt; only amplified this productivity boost. Navigating, splitting, and managing terminals became second nature and far quicker than what I had in VSCode.&lt;/p&gt;
&lt;h3 id=&quot;but-it-s-not-for-everyone&quot;&gt;But… It’s Not for Everyone&lt;/h3&gt;
&lt;p&gt;That said, I wouldn’t recommend Neovim to everyone. If you don’t have specific needs or if you don’t want to spend time tweaking your editor, &lt;strong&gt;Helix&lt;/strong&gt; might be a far better choice. It offers modal editing and good defaults without requiring you to sink hours into configuration.&lt;/p&gt;
&lt;p&gt;Neovim, on the other hand, shines for people like me those who are willing to dedicate time to &lt;strong&gt;fine-tune&lt;/strong&gt; their setup. It’s not an “out-of-the-box” experience. You’ll likely need weeks, maybe a month, to really mold it into your perfect editor. But once you do, the payoff is huge.&lt;/p&gt;
&lt;h3 id=&quot;my-personal-touches&quot;&gt;My Personal Touches&lt;/h3&gt;
&lt;p&gt;My move wasn’t just about using Neovim “as is.” I even ported one of my VSCode plugins, &lt;strong&gt;depramanager&lt;/strong&gt;, into a Neovim version. Later, through my tool &lt;strong&gt;gumpakt&lt;/strong&gt;, I built a Metal LSP server, making Neovim even more powerful for my workflow now I am even writing a kind of debugging helper to help in well debugging.&lt;/p&gt;
&lt;p&gt;These projects highlight the beauty of Neovim: &lt;strong&gt;it grows with you&lt;/strong&gt;. The more you invest into it, the more it returns in flexibility and performance.&lt;/p&gt;
&lt;h3 id=&quot;falling-into-the-ricing-rabbit-hole&quot;&gt;Falling Into the Ricing Rabbit Hole&lt;/h3&gt;
&lt;p&gt;Eventually, switching editors wasn’t enough I fell into the &lt;strong&gt;i3 ricing and optimization rabbit hole&lt;/strong&gt;. I started experimenting with &lt;strong&gt;tiling window managers&lt;/strong&gt;, inspired by i3 on Linux but adapted for macOS, amethyst for example.&lt;/p&gt;
&lt;p&gt;That’s when I discovered a whole ecosystem of tools that brought the same kind of minimalism and efficiency to my desktop environment that Neovim brought to editing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SketchyBar&lt;/strong&gt; – a powerful and customizable status bar replacement.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tacky Borders&lt;/strong&gt; – subtle window borders that make it easier to see focus and window splits.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Both are from the same developer, someone who’s been pushing the boundaries of what’s possible on macOS. These tools, combined with a tiling manager, transformed my workflow. Suddenly, macOS felt less like a polished but rigid environment and more like a &lt;strong&gt;customizable workspace&lt;/strong&gt; tailored to me fast, minimal, and efficient.&lt;/p&gt;
&lt;p&gt;In many ways, this mirrors my shift from VSCode to Neovim: trading convenience and defaults for &lt;strong&gt;control and performance&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&quot;conclusion-2&quot;&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Switching from VSCode to Neovim wasn’t just a change of tools it was a change of mindset.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VSCode offers convenience but at the cost of performance and flexibility.&lt;/li&gt;
&lt;li&gt;Neovim offers raw speed and ultimate customizability, but only if you’re willing to put in the time.&lt;/li&gt;
&lt;li&gt;For those who want a middle ground, Helix might just be the perfect balance.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And once I went down this path, it didn’t stop at my editor. From &lt;strong&gt;Neovim configs&lt;/strong&gt; to &lt;strong&gt;window tiling managers&lt;/strong&gt;, &lt;strong&gt;SketchyBar&lt;/strong&gt;, and &lt;strong&gt;tacky borders&lt;/strong&gt;, I built a system that fits me perfectly.&lt;/p&gt;
&lt;p&gt;For me, Neovim (and the broader world of customization it introduced me to) was worth the investment. It’s not just about writing code anymore it’s about &lt;strong&gt;shaping the environment I work in every day&lt;/strong&gt;.&lt;/p&gt;
</description>
<category>IDEs &amp; Code Editors</category>
<guid isPermaLink="true">https://coderlegion.com/5084/why-i-switched-from-vscode-to-neovim</guid>
<pubDate>Thu, 28 Aug 2025 19:13:24 +0000</pubDate>
</item>
<item>
<title>Setting Up Custom Instructions for GitHub Copilot</title>
<link>https://coderlegion.com/4905/setting-up-custom-instructions-for-github-copilot</link>
<description>&lt;p&gt;Your company has just purchased &lt;strong&gt;GitHub Copilot&lt;/strong&gt; licences for the entire development team.&lt;br&gt;
The promise is appealing: faster delivery, less repetitive work, more focus on the important stuff.  &lt;/p&gt;
&lt;p&gt;But after a few weeks… problems start to emerge:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Code that is inconsistent with project standards.&lt;/li&gt;
&lt;li&gt;Missing unit tests.&lt;/li&gt;
&lt;li&gt;Insecure implementations in critical areas such as cookies, authentication, or input validation.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This happens because &lt;strong&gt;Copilot, by default, does not know your internal rules&lt;/strong&gt;.&lt;br&gt;
The solution: &lt;strong&gt;create a shared custom instructions file that every developer can use&lt;/strong&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;1-what-are-custom-instructions-for-copilot-&quot;&gt;1. What are “Custom Instructions” for Copilot?&lt;/h3&gt;
&lt;p&gt;Instead of giving instructions in every comment or prompt, you can &lt;strong&gt;define a persistent set of rules&lt;/strong&gt; that Copilot will always consider.&lt;br&gt;
When it suggests code, it will then respect:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Project style guidelines.&lt;/li&gt;
&lt;li&gt;Security practices.&lt;/li&gt;
&lt;li&gt;The correct framework and internal libraries.&lt;/li&gt;
&lt;li&gt;Linter rules.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt; These instructions can be stored in a file (e.g., &lt;code&gt;.copilot-instructions.md&lt;/code&gt;) and distributed to the whole team.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;2-example-copilot-instructions-md-file&quot;&gt;2. Example &lt;code&gt;.copilot-instructions.md&lt;/code&gt; file&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;GitHub Copilot – Corporate Instructions

Style and Linter
- Always follow the rules from `.eslintrc.json` for JavaScript and `.pylintrc` for Python.
- Use single quotes in JavaScript/TypeScript.
- Always end statements with `;` in JS/TS.

Security
- For cookies: set `httpOnly`, `secure`, `sameSite: strict`, and `maxAge`.
- Never include passwords or secrets in code.
- Validate all external input using patterns from `utils/validators`.

Tests
- Always generate unit tests alongside new code.
- Use Jest for JS/TS projects and pytest for Python.
- Minimum coverage: 90%.

Internal Libraries
- Use `logger` for logs, not `console.log`.
- Use `fetchWithAuth` instead of `fetch` for authenticated HTTP calls.

Other
- Document every public function with JSDoc or Python docstrings.
- Avoid external dependencies not listed in `approved-deps.json`.
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h3 id=&quot;3-how-to-implement-this-across-your-team&quot;&gt;3. How to implement this across your team&lt;/h3&gt;
&lt;p&gt;Create the file .github/.copilot-instructions.md at the root of your project (create .github folder if you don't have it).&lt;/p&gt;
&lt;p&gt;Share it in the base repository or in your project templates.&lt;/p&gt;
&lt;p&gt;Configure Copilot so that it applies these rules: If you use Visual Studio Code, open the file at the start of a session and paste its content into Copilot’s “Custom Instructions” settings.&lt;/p&gt;
&lt;p&gt;If your team uses GitHub Copilot Chat, paste the content as initial context.&lt;/p&gt;
&lt;p&gt;In enterprise setups, include it as part of onboarding scripts or IDE initialisation steps.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;4-example-in-practice&quot;&gt;4. Example in practice&lt;/h3&gt;
&lt;p&gt;Without instructions, Copilot might produce:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;res.cookie('sessionId', id);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;With .copilot-instructions.md in place, it will suggest:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;res.cookie('sessionId', id, {
  httpOnly: true,
  secure: process.env.NODE_ENV === 'production',
  sameSite: 'strict',
  maxAge: 1000 * 60 * 60 // 1 hour
});

&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h3 id=&quot;5-benefits&quot;&gt;5. Benefits&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Consistency: all developers receive aligned suggestions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Security: reduced risk of unsafe implementations.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Less friction: no need to repeat the same instructions in every prompt.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Faster onboarding: new joiners produce better code from day one.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&quot;conclusion-3&quot;&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Copilot is not a senior developer – it needs context.&lt;br&gt;
A corporate instructions file turns that “intuition” into a set of explicit rules, helping Copilot to produce code that is secure, consistent, and compliant with your organisation’s standards.&lt;/p&gt;
&lt;p&gt;For more details, see the &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.github.com/en/copilot/how-tos/configure-custom-instructions/add-repository-instructions?pp=ygUUZmlnbWEgZ2l0aHViIGNvcGlsb3Q%3Dhttps%3A%2F%2Fgithub.com%2F0GiS0%2Ftour-of-heroes-with-gh-copilot-coding-agent&amp;amp;tool=vscode&quot;&gt;Github Docs&lt;/a&gt;.&lt;/p&gt;
</description>
<category>IDEs &amp; Code Editors</category>
<guid isPermaLink="true">https://coderlegion.com/4905/setting-up-custom-instructions-for-github-copilot</guid>
<pubDate>Thu, 21 Aug 2025 14:42:28 +0000</pubDate>
</item>
<item>
<title>VSCode vs IntelliJ: Where VSCode Still Struggles, and How to Push It Further</title>
<link>https://coderlegion.com/4179/vscode-vs-intellij-where-vscode-still-struggles-and-how-to-push-it-further</link>
<description>&lt;p&gt;Over the past few years, &lt;strong&gt;VSCode has eaten the developer world&lt;/strong&gt;. Lightweight, fast, deeply customizable—it feels like the ideal coding companion. On the other side sits &lt;strong&gt;IntelliJ&lt;/strong&gt;: powerful, heavy, feature-packed, and—for some—overkill.&lt;/p&gt;
&lt;p&gt;But let’s cut through the hype. If you’re building anything more complex than a quick script, &lt;strong&gt;IntelliJ isn’t just &quot;heavier&quot;—it’s smarter&lt;/strong&gt;. It understands your code, your project, and your dependencies in a way that VSCode simply doesn’t.&lt;/p&gt;
&lt;p&gt;Here’s a brutally honest breakdown of &lt;strong&gt;where VSCode is behind&lt;/strong&gt;, backed with real examples—and how some of those gaps can be patched, including with tools like &lt;strong&gt;Depramanager&lt;/strong&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;1-project-awareness-a-real-ide-vs-a-fancy-text-editor&quot;&gt;1. Project Awareness: A Real IDE vs a Fancy Text Editor&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;IntelliJ&lt;/strong&gt; knows what your project is. Whether it’s a Java Maven multi-module app, a Python virtual environment, or a full-stack Node.js + Docker + PostgreSQL repo, IntelliJ parses it top-down. It indexes your files, understands your build system, configures environments, and tracks project-wide issues.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;VSCode?&lt;/strong&gt; It sees folders. Just folders.&lt;/p&gt;
&lt;p&gt;You might:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Manually configure Python interpreters&lt;/li&gt;
&lt;li&gt;Hope your &lt;code&gt;settings.json&lt;/code&gt; doesn’t get out of sync&lt;/li&gt;
&lt;li&gt;Wrestle with 4–5 extensions just to handle testing, linting, formatting, and debugging&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;example-&quot;&gt;Example:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Open a Python project in IntelliJ? You get immediate virtualenv detection, test runner config, linting, and code inspections.&lt;/li&gt;
&lt;li&gt;In VSCode? You manually point to your &lt;code&gt;.venv&lt;/code&gt;, tweak launch configs, and guess why &lt;code&gt;pylint&lt;/code&gt; isn't catching anything.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&quot;2-dependency-management-missing-misconfigured-or-just-invisible&quot;&gt;2. Dependency Management: Missing, Misconfigured, or Just Invisible&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;IntelliJ shows you&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Real-time dependency graphs&lt;/li&gt;
&lt;li&gt;Conflicts between transitive and direct dependencies&lt;/li&gt;
&lt;li&gt;Recommendations to remove unused packages&lt;/li&gt;
&lt;li&gt;One-click updates&lt;/li&gt;
&lt;li&gt;Vulnerability scanning (Ultimate edition)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;VSCode gives you&lt;/strong&gt;… the raw &lt;code&gt;package.json&lt;/code&gt;, and maybe a terminal.&lt;/p&gt;
&lt;p&gt;Need to find out if you’re using an outdated version of &lt;code&gt;express&lt;/code&gt;, or if that &lt;code&gt;left-pad&lt;/code&gt; package is still floating around doing nothing? You’ll need to:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Install some extensions (maybe)&lt;/li&gt;
&lt;li&gt;Run CLI tools (probably)&lt;/li&gt;
&lt;li&gt;Google half the errors when they break&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It’s 2025, and &lt;strong&gt;managing dependencies in VSCode still feels like reading a &lt;code&gt;package.json&lt;/code&gt; in Notepad&lt;/strong&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;3-testing-painfully-manual-vs-seamless-integration&quot;&gt;3. Testing: Painfully Manual vs Seamless Integration&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;IntelliJ&lt;/strong&gt;: You write tests. It discovers them. You click the green triangle. It shows test results with stack traces, variable values, and test history—all inline.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;VSCode&lt;/strong&gt;: Hope your language extension supports test discovery. Hope it integrates with your debugger. Hope it even knows what a &quot;test&quot; looks like. Otherwise, it’s back to terminal + &lt;code&gt;npm test&lt;/code&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;4-code-intelligence-and-refactoring&quot;&gt;4. Code Intelligence and Refactoring&lt;/h3&gt;
&lt;p&gt;IntelliJ gives you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Rename that works across files and modules&lt;/li&gt;
&lt;li&gt;Safe refactoring with usage previews&lt;/li&gt;
&lt;li&gt;Automatic method extraction&lt;/li&gt;
&lt;li&gt;Inline documentation with type resolution&lt;/li&gt;
&lt;li&gt;Semantic code search (e.g., “find all functions using X param pattern”)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;VSCode? You can rename a variable. Most of the time.&lt;/p&gt;
&lt;p&gt;Even with LSP-based extensions like Pyright or TS Server, you &lt;strong&gt;don’t get full project-wide understanding&lt;/strong&gt;. IntelliJ is using a custom compiler per language to truly understand your project, not just parse symbols.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;5-debugging-and-tooling-integration&quot;&gt;5. Debugging and Tooling Integration&lt;/h3&gt;
&lt;p&gt;IntelliJ has built-in:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Interactive debuggers&lt;/li&gt;
&lt;li&gt;Coverage reports&lt;/li&gt;
&lt;li&gt;Profiler&lt;/li&gt;
&lt;li&gt;Local history (like git—but local and auto-saved)&lt;/li&gt;
&lt;li&gt;Integration with Maven, Gradle, Docker, Kubernetes, Git, and more&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;VSCode can do some of this—but only with extensions, manual configuration, and in many cases, with &lt;em&gt;a fraction of the stability&lt;/em&gt;. You’re building the tooling chain yourself—and it often breaks with updates.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;so-why-do-we-still-use-vscode-&quot;&gt;So Why Do We Still Use VSCode?&lt;/h3&gt;
&lt;p&gt;Because it’s:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fast&lt;/li&gt;
&lt;li&gt;Lightweight&lt;/li&gt;
&lt;li&gt;Highly customizable&lt;/li&gt;
&lt;li&gt;Open-source&lt;/li&gt;
&lt;li&gt;Has great community support&lt;/li&gt;
&lt;li&gt;Easier to onboard juniors with&lt;/li&gt;
&lt;li&gt;Doesn't need a beefy machine&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But if you're working in &lt;strong&gt;real-world, multi-dependency, multi-environment projects&lt;/strong&gt;—VSCode leaves a lot of heavy lifting to you. Especially when it comes to &lt;strong&gt;dependency and configuration intelligence&lt;/strong&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;bridging-the-gap-introducing-depramanager&quot;&gt;Bridging the Gap: Introducing &lt;a rel=&quot;nofollow&quot; href=&quot;https://marketplace.visualstudio.com/items?itemName=Okerew.depramanger&quot;&gt;&lt;strong&gt;Depramanager&lt;/strong&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;blockquote&gt;&lt;p&gt;Bringing real dependency management to VSCode—without needing IntelliJ.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Depramanager&lt;/strong&gt; is a free, open-source VSCode extension that adds actual dependency intelligence to your workflow.&lt;/p&gt;
&lt;h4 id=&quot;features-&quot;&gt;Features:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Dependency Graphs&lt;/strong&gt;&lt;br&gt;
See what’s installed, declared, missing, or unused—at a glance.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Sync &amp;amp; Install&lt;/strong&gt;&lt;br&gt;
Automatically sync missing dependencies to your &lt;code&gt;package.json&lt;/code&gt;, &lt;code&gt;pyproject.toml&lt;/code&gt;, etc., or install manually from the editor.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Update Checker&lt;/strong&gt;&lt;br&gt;
Flags outdated packages and lets you update them with a click.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Security Scanning&lt;/strong&gt;&lt;br&gt;
Checks for known vulnerabilities across popular ecosystems.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Inline Highlights&lt;/strong&gt;&lt;br&gt;
Shows outdated or broken dependencies right inside the code editor.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Language-Aware Suggestions&lt;/strong&gt;&lt;br&gt;
Recommends VSCode extensions relevant to your project’s stack.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/Okerew/depramanager/tree/main&quot;&gt;GitHub&lt;/a&gt;&lt;br&gt;
 &lt;a rel=&quot;nofollow&quot; href=&quot;https://marketplace.visualstudio.com/items?itemName=Okerew.depramanger&quot;&gt;Marketplace&lt;/a&gt;&lt;br&gt;
 &lt;a rel=&quot;nofollow&quot; href=&quot;https://open-vsx.org/extension/Okerew/depramanger&quot;&gt;Open vsix&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Depramanager doesn’t try to make VSCode IntelliJ. It just &lt;strong&gt;fixes one of its most painful weaknesses&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3 id=&quot;final-thoughts-2&quot;&gt;Final Thoughts&lt;/h3&gt;
&lt;p&gt;VSCode is a beautiful tool. But let’s be honest—it’s not a full IDE. It can’t compete with IntelliJ on deep insight, project understanding, or smart refactoring out of the box.&lt;/p&gt;
&lt;p&gt;But with the right tooling and extensions, you can bring some of that power to your daily workflow.&lt;/p&gt;
&lt;p&gt;Use VSCode for what it does best. Use &lt;strong&gt;Depramanager&lt;/strong&gt; to patch its biggest blind spot. And when you really need that fully-integrated IDE experience—don’t feel guilty booting up IntelliJ.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/4179/vscode-vs-intellij-where-vscode-still-struggles-and-how-to-push-it-further</guid>
<pubDate>Sun, 20 Jul 2025 12:26:39 +0000</pubDate>
</item>
<item>
<title>How to Search in VS Code Faster Using Regex (With Examples)</title>
<link>https://coderlegion.com/3081/how-to-search-in-vs-code-faster-using-regex-with-examples</link>
<description>&lt;p&gt;Searching efficiently in &lt;strong&gt;VS Code&lt;/strong&gt; can save you hours of manual work. While the default search is useful, &lt;strong&gt;regular expressions (regex)&lt;/strong&gt; unlock powerful pattern-matching capabilities. In this guide, I'll break down essential regex patterns and show you how to use them in VS Code's search (&lt;code&gt;Ctrl+F&lt;/code&gt; / &lt;code&gt;Cmd+F&lt;/code&gt;).  &lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;why-use-regex-in-vs-code-&quot;&gt;Why Use Regex in VS Code?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Find complex patterns&lt;/strong&gt; (emails, variables, broken links).  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Refactor code faster&lt;/strong&gt; (bulk rename, extract data).  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Search across files&lt;/strong&gt; (&lt;code&gt;Ctrl+Shift+F&lt;/code&gt; / &lt;code&gt;Cmd+Shift+F&lt;/code&gt;).  &lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&quot;essential-regex-patterns-for-vs-code&quot;&gt;Essential Regex Patterns for VS Code&lt;/h3&gt;
&lt;h4 id=&quot;1-basic-text-matching&quot;&gt;1. Basic Text Matching&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;hello&lt;/code&gt; → Matches exact word &quot;hello&quot;.  &lt;/li&gt;
&lt;li&gt;&lt;code&gt;h.llo&lt;/code&gt; → Matches &quot;hallo&quot;, &quot;hxllo&quot; (&lt;code&gt;.&lt;/code&gt; = any character).  &lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;2-matching-multiple-characters&quot;&gt;2. Matching Multiple Characters&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;[aeiou]&lt;/code&gt; → Matches any vowel.  &lt;/li&gt;
&lt;li&gt;&lt;code&gt;gr[ae]y&lt;/code&gt; → Finds &quot;gray&quot; or &quot;grey&quot;.  &lt;/li&gt;
&lt;li&gt;&lt;code&gt;[^aeiou]&lt;/code&gt; → Matches any character &lt;strong&gt;except&lt;/strong&gt; vowels.  &lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;3-quantifiers-how-many-times-&quot;&gt;3. Quantifiers (How Many Times?)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;a*&lt;/code&gt; → Matches 0 or more &quot;a&quot;s (e.g., &quot;&quot;, &quot;a&quot;, &quot;aa&quot;).  &lt;/li&gt;
&lt;li&gt;&lt;code&gt;a+&lt;/code&gt; → Matches 1 or more &quot;a&quot;s (e.g., &quot;a&quot;, &quot;aa&quot;).  &lt;/li&gt;
&lt;li&gt;&lt;code&gt;a{2,4}&lt;/code&gt; → Matches 2 to 4 &quot;a&quot;s (e.g., &quot;aa&quot;, &quot;aaa&quot;).  &lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;4-word-amp-boundary-matching&quot;&gt;4. Word &amp;amp; Boundary Matching&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;\bword\b&lt;/code&gt; → Matches whole word &quot;word&quot; (not &quot;keyword&quot;).  &lt;/li&gt;
&lt;li&gt;&lt;code&gt;^Hello&lt;/code&gt; → Matches &quot;Hello&quot; at the &lt;strong&gt;start of a line&lt;/strong&gt;.  &lt;/li&gt;
&lt;li&gt;&lt;code&gt;end$&lt;/code&gt; → Matches &quot;end&quot; at the &lt;strong&gt;end of a line&lt;/strong&gt;.  &lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;5-groups-amp-capturing&quot;&gt;5. Groups &amp;amp; Capturing&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;(abc)+&lt;/code&gt; → Matches &quot;abc&quot;, &quot;abcabc&quot;.  &lt;/li&gt;
&lt;li&gt;&lt;code&gt;(img|src)=[&quot;'](.*?)[&quot;']&lt;/code&gt; → Finds HTML image sources.  &lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;6-lazy-vs-greedy-matching&quot;&gt;6. Lazy vs. Greedy Matching&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&quot;.*&quot;&lt;/code&gt; → Greedy (matches entire &lt;code&gt;&quot;hello&quot; and &quot;world&quot;&lt;/code&gt;).  &lt;/li&gt;
&lt;li&gt;&lt;code&gt;&quot;.*?&quot;&lt;/code&gt; → Lazy (matches &lt;code&gt;&quot;hello&quot;&lt;/code&gt;, &lt;code&gt;&quot;world&quot;&lt;/code&gt; separately).  &lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;7-special-characters&quot;&gt;7. Special Characters&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;\d&lt;/code&gt; → Any digit (&lt;code&gt;0-9&lt;/code&gt;).  &lt;/li&gt;
&lt;li&gt;&lt;code&gt;\s&lt;/code&gt; → Whitespace (space, tab).  &lt;/li&gt;
&lt;li&gt;&lt;code&gt;\w&lt;/code&gt; → Word character (&lt;code&gt;a-z&lt;/code&gt;, &lt;code&gt;A-Z&lt;/code&gt;, &lt;code&gt;0-9&lt;/code&gt;, &lt;code&gt;_&lt;/code&gt;).  &lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&quot;how-to-use-regex-in-vs-code&quot;&gt;How to Use Regex in VS Code&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Open search (&lt;code&gt;Ctrl+F&lt;/code&gt; / &lt;code&gt;Cmd+F&lt;/code&gt;).  &lt;/li&gt;
&lt;li&gt;Enable regex mode by clicking &lt;code&gt;.*&lt;/code&gt; (or press &lt;code&gt;Alt+R&lt;/code&gt;).  &lt;/li&gt;
&lt;li&gt;Enter your pattern (e.g., &lt;code&gt;\b\d{3}-\d{3}-\d{4}\b&lt;/code&gt; for phone numbers).  &lt;/li&gt;
&lt;li&gt;Press &lt;code&gt;Enter&lt;/code&gt; to see matches.  &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Pro Tip:&lt;/strong&gt; Use &lt;strong&gt;&lt;code&gt;Ctrl+Shift+F&lt;/code&gt;&lt;/strong&gt; to search across files with regex!  &lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;real-world-examples&quot;&gt;Real-World Examples&lt;/h3&gt;
&lt;p&gt;✅ &lt;strong&gt;Find all email addresses:&lt;/strong&gt;  &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-regex&quot;&gt;\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b


**Final Tips**
Test patterns at [regex101.com][1] before using them.

Bookmark this cheat sheet for quick reference!


  [1]: https://regex101.com
&lt;/code&gt;&lt;/pre&gt;
</description>
<category>Visual Studio Code</category>
<guid isPermaLink="true">https://coderlegion.com/3081/how-to-search-in-vs-code-faster-using-regex-with-examples</guid>
<pubDate>Sun, 18 May 2025 18:15:52 +0000</pubDate>
</item>
<item>
<title>5 Vs code extension's to increase your developer productivity</title>
<link>https://coderlegion.com/495/5-vs-code-extensions-to-increase-your-developer-productivity</link>
<description>&lt;p&gt;Hey there developers. How is it going. Today in this blog, I will be showing you 5 useful vs code extension's which will increase your developer productivity. So if you are interested, continue reading...&lt;/p&gt;
&lt;h3 id=&quot;1-bookmarks&quot;&gt;1. &lt;a rel=&quot;nofollow&quot; href=&quot;https://marketplace.visualstudio.com/items?itemName=alefragnani.Bookmarks&quot;&gt;Bookmarks&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;I use this extension all the time when I am working on any project. Basically this extension allows you to add bookmarks in specific lines in a file. You can also add a note why you have added this bookmark. And you can also explore the bookmarks in the bookmarks tab. Which will show you all the bookmarks in a particular project.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/oas92hj28yxqe6nd5qhi.jpg&quot; alt=&quot;Vs Code extension&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;2-better-comments&quot;&gt;2. &lt;a rel=&quot;nofollow&quot; href=&quot;https://marketplace.visualstudio.com/items?itemName=aaron-bond.better-comments&quot;&gt;Better Comments&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This extension is super helpful if you want to improve code commenting. By default the comments have a dimmed color. By using this extension. You can make them colorful for any specific purpose. Like if there is something todo, you can use the TODO tag before writing the comment. Like so - &lt;code&gt;// TODO: what to do&lt;/code&gt;. For more information's about usage, please check out the better comments documentation.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vl61n8t8hpid0iagbjyk.jpg&quot; alt=&quot;Vs code extension&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;3-code-spell-checker&quot;&gt;3. &lt;a rel=&quot;nofollow&quot; href=&quot;https://marketplace.visualstudio.com/items?itemName=streetsidesoftware.code-spell-checker&quot;&gt;Code Spell Checker&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;If you misspell any word in vs code, by default it doesn't shows any warning if the spelling is not correct. By using this extension, You can will get a warning message in the problems tab if any of the word is not spelled correctly.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/in8s228attz72h6s6jwh.jpg&quot; alt=&quot;Vs Code Extensions&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;4-prettier&quot;&gt;4. &lt;a rel=&quot;nofollow&quot; href=&quot;https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode&quot;&gt;Prettier&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This extension formats your unformatted code. So you don't need to focus on formatting you code. Prettier will do it for you. To start formatting your code with prettier, make sure you add these settings in your &lt;code&gt;settings.json&lt;/code&gt; after installing it. And you will be good to go.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;&quot;editor.formatOnSave&quot;: true,
&quot;editor.defaultFormatter&quot;: &quot;esbenp.prettier-vscode&quot;,
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;5-thunder-client&quot;&gt;5. &lt;a rel=&quot;nofollow&quot; href=&quot;https://marketplace.visualstudio.com/items?itemName=rangav.vscode-thunder-client&quot;&gt;Thunder Client&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Are you still using Postman for api testing? Well that's fine. Postman does this duty just perfectly. But for me, when I am working on any project in vs code, I do like to be in vs code. I don't like to open any other external application, it effects on my productivity. So I use this cool Vs code extension. It works same as postman. Nothing new, you can send request to any kind of api from vs code. It really helps me to increase my developer productivity.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v8urq2g0b2hzh8gpexq8.jpg&quot; alt=&quot;Vs code Extensions&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;conclusion-4&quot;&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;These are the productivity vs code extension's, Which I use all the time and wanted to share with you guys. Now I wanted to know what are your productivity extension's? Let me know in the discussions. And make sure you follow me for all the cool article just like that.&lt;/p&gt;
&lt;h2 id=&quot;-&quot;&gt;:)&lt;/h2&gt;
&lt;p&gt;Get Me on -&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/ratul-devr&quot;&gt;Github&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://twitter.com/Ratul_devR&quot;&gt;Twitter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.linkedin.com/in/developer-ratul-407352211/&quot;&gt;LinkedIn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.facebook.com/minhazurrahaman.ratul/&quot;&gt;Facebook&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/495/5-vs-code-extensions-to-increase-your-developer-productivity</guid>
<pubDate>Thu, 05 Dec 2024 09:54:58 +0000</pubDate>
</item>
<item>
<title>WebChatForGemini : The VSCode Companion</title>
<link>https://coderlegion.com/264/webchatforgemini-the-vscode-companion</link>
<description>&lt;p style=&quot;text-align: justify; margin: 1;&quot;&gt; Imagine you are working on your code in your IDE, and you have &lt;strong&gt;doubts about syntax&lt;/strong&gt;, or you need a way to validate your written code. Normally, you can go to &lt;strong&gt;any free AI service&lt;/strong&gt;, copy-paste the content there, get an answer, copy paste it back to the code. However, what if I tell you &lt;strong&gt;don't need to get out of your IDE&lt;/strong&gt; to accomplish all this? Today I am going to introduce you to &lt;strong&gt;'WebChatForGemini'&lt;/strong&gt; by which you can do this, and a lot more. You can chat and get instant answers right from within the IDE. What's also interesting is that it also allows you to &lt;strong&gt;upload images and chat on that&lt;/strong&gt;. Now, how many tools do you know that can do this? Hardly a few.
&lt;br&gt; So, lets understand this tool in detail, including its features and functionalities, and its usage in a practical setting.&lt;/p&gt;
&lt;h2 style=&quot;margin: 0.5;&quot;&gt; Understanding 'WebChatForGemini' Extension&lt;/h2&gt;  
&lt;h3 style=&quot;margin: 0.5;&quot;&gt;1. Integration of Gemini APIs within VS Code &lt;/h3&gt; 
&lt;p style=&quot;text-align: justify; margin: 1;&quot;&gt;The &lt;strong&gt;'WebChatForGemini'&lt;/strong&gt; is a tool that &lt;strong&gt;integrates Google Gemini API within VS Code&lt;/strong&gt; as an extension. This extension encourages the use of the &lt;strong&gt;conversational capabilities of Gemini&lt;/strong&gt; directly within the coding environment. This also allows developers to obtain various types of assistance related to code without switching between different tools and applications. The most curious thing about this extension is that you do not have to install anything explicitly and set up like other AI tools. Just one click to install the extension is required to use it.&lt;/p&gt;
&lt;h3 style=&quot;margin: 0.5;&quot;&gt;2. Role of Generative AI in Modern Coding Practices&lt;/h3&gt;  
&lt;p style=&quot;text-align: justify; margin: 1;&quot;&gt; In modern coding practices, the use of generative AI is rapidly increasing with technological trends. The incorporation of AI  into the development tool &lt;strong&gt;enhances productivity and user experience&lt;/strong&gt;. It helps developers write efficient programs by providing access to advanced AI assistance, including the enhancement of their code logic, the conversion of programming language, assistance with difficult problems, and suggestions for better solutions.&lt;/p&gt;  
&lt;h3 style=&quot;margin: 0.5;&quot;&gt;3. Multimodal Interaction&lt;/h3&gt; 
&lt;p style=&quot;text-align: justify; margin: 1;&quot;&gt;Unlike other AI tools, which only work with text-based commands. The 'WebChatForGemini' extension can &lt;strong&gt;work with many inputs&lt;/strong&gt;  other than text making it multimodel assistance. For instance, this extension &lt;strong&gt;facilitates text and image-based inputs&lt;/strong&gt;, enriching the user experience with distinct working modes. You just have to upload the image and ask the query for assistance.&lt;/p&gt; 
&lt;h2 style=&quot;margin: 0.5;&quot;&gt; Core Features and Functionalities&lt;/h2&gt;  
&lt;p style=&quot;text-align: justify; margin: 1;&quot;&gt;The 'WebChatForGemini' tool is tailored with many features and functionalities that can help developers create robust applications. These are as follows: &lt;/p&gt; 
&lt;ol&gt; 
&lt;li style=&quot;text-align: justify; margin: 0.5em; font-size: 16px;&quot;&gt; Interactive AI-based assistance reacts to &lt;strong&gt;user coding queries and provides solutions&lt;/strong&gt; and explanations to improve learning and problem-solving.&lt;/li&gt;  
&lt;li style=&quot;text-align: justify; margin: 0.5em; font-size: 16px;&quot;&gt; Supports &lt;strong&gt;context-aware conversation management&lt;/strong&gt; based on current tasks and past interactions to ensure relevance and efficiency.&lt;/li&gt;  
&lt;li style=&quot;text-align: justify; margin: 0.5em; font-size: 16px;&quot;&gt; &lt;strong&gt;Multimodal input&lt;/strong&gt; support enables the extension to respond to text and image inputs.&lt;/li&gt;  
&lt;li style=&quot;text-align: justify; margin: 0.5em; font-size: 16px;&quot;&gt; The user interface is &lt;strong&gt;designed with dark and light modes&lt;/strong&gt; to cater to user preferences, alongside usability enhancements for an improved coding experience. &lt;/li&gt; 
&lt;li style=&quot;text-align: justify; margin: 0.5em; font-size: 16px;&quot;&gt; An efficient coding workflow is supported through code snippet management, enabling &lt;strong&gt;users to store, retrieve, and reuse code blocks with ease&lt;/strong&gt;.&lt;/li&gt; 
&lt;/ol&gt; 
&lt;h2 style=&quot;margin: 0.5;&quot;&gt; Extension Installation: Step-by-Step Guide&lt;/h2&gt;  
&lt;p style=&quot;text-align: justify; margin: 1;&quot;&gt; Now, understand the step-by-step installation guide of the 'WebChatForGemini' extension within VS Code.&lt;/p&gt;  
&lt;ol&gt; 
&lt;li style=&quot;text-align: justify; margin: 0.5em; font-size: 16px;&quot;&gt; First, open &lt;strong&gt;VS Code&lt;/strong&gt; on your machine and navigate to the &lt;strong&gt;extension view&lt;/strong&gt; by clicking on the square icon on the sidebar. Search for &lt;strong&gt;'WebChatForGemini'&lt;/strong&gt; in the search bar and install the extension. &lt;/li&gt; 
&lt;li style=&quot;text-align: justify; margin: 0.5em; font-size: 16px;&quot;&gt; Before you use 'WebChatForGemini' in VS Code, you will need an &lt;strong&gt;API key from Google developer AI&lt;/strong&gt;. You can obtain a copy from &lt;a rel=&quot;nofollow&quot; href=&quot;https://aistudio.google.com/app/prompts/new_chat&quot; title=&quot;file&quot;&gt;  here&lt;/a&gt;.&lt;/li&gt; 
&lt;li style=&quot;text-align: justify; margin: 0.5em; font-size: 16px;&quot;&gt; After getting your API key, open VS Code, click the &lt;strong&gt;setting icon&lt;/strong&gt; from the sidebar, and select the &lt;strong&gt;&quot;command palette&quot;&lt;/strong&gt;.&lt;/li&gt;  
&lt;li style=&quot;text-align: justify; margin: 0.5em; font-size: 16px;&quot;&gt; Once the search bar opens, write 'WebChatForGemini' in the search bar. This will open in the new tab. Here, &lt;strong&gt;pastes your API key&lt;/strong&gt; by clicking on the setting icon on the right side of the section. &lt;/li&gt; 
&lt;li style=&quot;text-align: justify; margin: 0.5em; font-size: 16px;&quot;&gt; After the interface opens in a new tab, you can start chatting with the AI. Simply &lt;strong&gt;type your query in the input box&lt;/strong&gt; at the bottom of the interface and press enter to send it. The AI will respond in the chat window above.&lt;/li&gt; 
&lt;/ol&gt; 
&lt;div class=&quot;div-blue&quot;&gt;   
&lt;span class=&quot;alert-header&quot;&gt;Note:&lt;/span&gt;   
&lt;span class=&quot;alert-body&quot;&gt; To use 'WebChatForGemini', you require a &lt;strong&gt;special code (API key)&lt;/strong&gt;. This API key is used to authorize each user. 
&lt;/span&gt;  
&lt;/div&gt;    
&lt;h2 style=&quot;margin: 0.5;&quot;&gt; Practical Use Case Examples&lt;/h2&gt;  
&lt;p style=&quot;text-align: justify; margin: 1;&quot;&gt; The extension can be used in various scenarios to enhance the coding experience. Here, I will discuss some examples where this tool assists in checking errors, broken blocks of code, and solutions to common code problems.&lt;/p&gt;  
&lt;h3 style=&quot;margin: 0.5;&quot;&gt;1. Assistance in Different Ways of Dealing with Block of Code&lt;/h3&gt; 
&lt;p&gt;&lt;img src=&quot;https://logiclair.org/?qa=blob&amp;amp;qa_blobid=208705984484748551&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify; margin: 1;&quot;&gt;In the above image, the user inputs the query related to coding the piece of code in three different ways. So, just ask query in chat box and copy paste the code. We clearly cannot trust it fully so doublechecking is mandatory. But at least, We don't need to switch from IDE and search on google or check on StackOverflow for &quot;three different way to deal with &lt;a rel=&quot;nofollow&quot; href=&quot;https://coderlegion.com/184/python-lists&quot; target=&quot;_blank&quot;&gt;list&lt;/a&gt; iteration in &lt;a rel=&quot;nofollow&quot; href=&quot;https://coderlegion.com/104/python-getting-started&quot; target=&quot;_blank&quot;&gt;python&lt;/a&gt;&quot;. &lt;/p&gt;
&lt;h3 style=&quot;margin: 0.5;&quot;&gt;2. Conversion in Two Different Programming Languages&lt;/h3&gt;  
&lt;p&gt;&lt;img src=&quot;https://logiclair.org/?qa=blob&amp;amp;qa_blobid=12927075349156451613&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify; margin: 1;&quot;&gt;Sometimes, we find the solution to our problem but only get it in some other programming language. We got frustrated and tried to convert it into another programming language. But now, no worries about it, as we can also do the code conversion with just one click. Here, the user asked for the conversion of the given code into Java code which is assisted by the extension in the form of converted code with an explanation.&lt;/p&gt;
&lt;h3 style=&quot;margin: 0.5;&quot;&gt;3. Assistance in Resolving Bugs in the Code&lt;/h3&gt;  
&lt;p&gt;&lt;img src=&quot;https://logiclair.org/?qa=blob&amp;amp;qa_blobid=17174215532151093540&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify; margin: 1;&quot;&gt;Every software has bugs, but finding them is difficult. Sometimes, you cannot point them out even if you verify the code multiple times or read it repeatedly. Also, if you have to find bugs in someone's other code? Tiresome right? Now, this problem is also resolved. Just using the extension will highlight all the bugs and errors in no time. Therefore, the user inputs the query related to &lt;a rel=&quot;nofollow&quot; href=&quot;https://coderlegion.com/257/python-debugging-techniques&quot; target=&quot;_blank&quot;&gt;resolving the bugs&lt;/a&gt; to the AI assistance, which is done by providing a detailed explanation of the error with its type and solution.&lt;/p&gt;
&lt;h3 style=&quot;margin: 0.5;&quot;&gt;4. Provide Insights and Suggestions for Improvement&lt;/h3&gt;  
&lt;p&gt;&lt;img src=&quot;https://logiclair.org/?qa=blob&amp;amp;qa_blobid=12237658537281671422&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify; margin: 1;&quot;&gt;Furthermore, you can also ask for improvements in your coding logic or codebase. Just ask for improvements and insights in the code by simply copying the code and querying for enhancements. This will help create a robust application. Therefore, the query is related to improvement within the code.&lt;/p&gt;
&lt;h3 style=&quot;margin: 0.5;&quot;&gt;5. Assistance in Advanced Features of the Extension: Multimodal Inputs using Image&lt;/h3&gt;  
&lt;p&gt;&lt;img src=&quot;https://logiclair.org/?qa=blob&amp;amp;qa_blobid=17552369769911436229&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify; margin: 1;&quot;&gt;Did you use other AI tools for similar tasks, or did you identify the differences? What I mean is the difference in AI interaction with different modes. Other than asking the query in textual form, this tool also allows us to ask for assistance using the image. Therefore, the image is used as a query and the tool addresses it.&lt;/p&gt;
&lt;h2 style=&quot;margin: 0.5;&quot;&gt; Data Security and Privacy&lt;/h2&gt;   
&lt;ol&gt; 
&lt;li style=&quot;text-align: justify; margin: 0.5em; font-size: 16px;&quot;&gt; The API keys used in the extension are stored &lt;strong&gt;locally on the user's machine&lt;/strong&gt; to ensure privacy and prevent unauthorized access.&lt;/li&gt;  
&lt;li style=&quot;text-align: justify; margin: 0.5em; font-size: 16px;&quot;&gt; The extension &lt;strong&gt;communicates directly with Gemini APIs&lt;/strong&gt;, which are designed with data security in mind, safeguarding user information so it is not traced and monitored by someone.&lt;/li&gt; 
&lt;/ol&gt;
&lt;div class=&quot;div-faq&quot; style=&quot;margin-bottom: 5px; margin-top: 2px;&quot;&gt;
  &lt;span class=&quot;faq-header&quot; style=&quot;font-weight: bold; color: #333;&quot;&gt;FAQs&lt;/span&gt;
  &lt;div class=&quot;faq-body&quot; style=&quot;margin-top: 2px; margin-bottom: 10px;&quot;&gt;
    &lt;strong&gt;Q:&lt;/strong&gt; What is Gemini AI?&lt;br&gt;
    &lt;strong&gt;A:&lt;/strong&gt; It is a generative AI chatbot which is developed by Google. Similar to chatbot, there is also an AI model with the same name.
  &lt;/div&gt;
  &lt;div class=&quot;faq-body&quot; style=&quot;margin-top: 2px; margin-bottom: 10px;&quot;&gt;
    &lt;strong&gt;Q:&lt;/strong&gt; What is meant by multimodal?&lt;br&gt;
    &lt;strong&gt;A:&lt;/strong&gt; It means that the AI model is trained on multiple modes(datatype i.e. text, images, videos) by which you can access the output query with multiple communicating modes. 
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 style=&quot;margin: 0.5;&quot;&gt; Wrapping Up&lt;/h2&gt; 
&lt;p style=&quot;text-align: justify; margin: 1;&quot;&gt; In conclusion, 'WebChatForGemini' is a tool designed to help developers by &lt;strong&gt;integrating Google Gemini&lt;/strong&gt; AI within their existing environment. This tool &lt;strong&gt;incorporates AI capabilities in your IDE&lt;/strong&gt; i.e. VS Code. As AI technology advances, its use in software development provides developers with an &lt;strong&gt;effective way to deal with their common problems&lt;/strong&gt; while coding. This ensures that the developer &lt;strong&gt;does not have to switch between different applications&lt;/strong&gt; for multiple tasks. It offers various features to enhance productivity and is also concerned with privacy and security. If you want to learn more about this tool, then visit the reference. I hope this guide is helpful for you. Feel free to ask questions and provide feedback. Thank you for reading this guide. Happy Coding!&lt;/p&gt; 
&lt;hr&gt;
&lt;h2 style=&quot;margin: 0.5;&quot;&gt; Reference&lt;/h2&gt;   
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://marketplace.visualstudio.com/items?itemName=wewake.webchatforgemini&quot; title=&quot;file&quot; target=&quot;_blank&quot;&gt;WebChatForGemini Extension&lt;/a&gt; &lt;/p&gt;
</description>
<category>Coding</category>
<guid isPermaLink="true">https://coderlegion.com/264/webchatforgemini-the-vscode-companion</guid>
<pubDate>Thu, 02 May 2024 11:18:51 +0000</pubDate>
</item>
</channel>
</rss>