<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Antonio</title>
    <description>The latest articles on Forem by Antonio (@antoniodem).</description>
    <link>https://forem.com/antoniodem</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3542398%2F6fa33c65-8aab-4c95-a9e7-c955fc77a40a.jpeg</url>
      <title>Forem: Antonio</title>
      <link>https://forem.com/antoniodem</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/antoniodem"/>
    <language>en</language>
    <item>
      <title># TRAE.ai with Memory: No More Re-briefing, 98% Time Saved</title>
      <dc:creator>Antonio</dc:creator>
      <pubDate>Tue, 14 Oct 2025 17:57:41 +0000</pubDate>
      <link>https://forem.com/antoniodem/-traeai-with-memory-no-more-re-briefing-98-time-saved-1mkg</link>
      <guid>https://forem.com/antoniodem/-traeai-with-memory-no-more-re-briefing-98-time-saved-1mkg</guid>
      <description>&lt;p&gt;&lt;em&gt;Or: how I went from 8 minutes of "re-briefing" to 10 seconds with a continuity system for **TRAE IDE&lt;/em&gt;**&lt;/p&gt;




&lt;p&gt;If you've ever used an &lt;strong&gt;AI assistant&lt;/strong&gt; for programming, you know this frustration. You work for two hours on a project, maybe implement some features, write tests, make architectural decisions. Then you close the chat and go to sleep. The next day, you open a new conversation and the AI greets you with a cheerful "Hi! How can I help you?"&lt;/p&gt;

&lt;p&gt;And you think: what do you mean, we worked together for hours yesterday!&lt;/p&gt;

&lt;p&gt;So you start over. "&lt;em&gt;So, I'm developing a CLI in Python. The structure is this. I use these patterns. The decisions we made are these.&lt;/em&gt;" Eight minutes later you're back to the starting point, ready to continue working. But the flow is broken, concentration lost, and you wonder if it has to be this way.&lt;/p&gt;

&lt;p&gt;Spoiler: it doesn't. And I just finished testing a system that proves it.&lt;/p&gt;

&lt;p&gt;I recently discovered the &lt;code&gt;coding assistant&lt;/code&gt; &lt;a href="https://www.trae.ai/?utm_source=ads&amp;amp;utm_medium=gg_sem_dl_pur&amp;amp;utm_campaign=190778939692_23030561513_brand_simple_broadmatch_p33/p34_de/gb/it_en_&amp;amp;gad_source=1&amp;amp;gad_campaignid=23030561513&amp;amp;gbraid=0AAAAArENyFXxvNkMZ1BSkuZmYnyfzhMlp&amp;amp;gclid=Cj0KCQjw6bfHBhDNARIsAIGsqLiYbTPF1xLNR3NrwNSSgz7Jf7qVdno_R-qR7NRh2QO-q6W1TUj_I0QaAmFoEALw_wcB" rel="noopener noreferrer"&gt;&lt;strong&gt;TRAE.ai&lt;/strong&gt;&lt;/a&gt;. I downloaded the free version and after a few days I decided to purchase a monthly subscription, so I could do further testing and understand its potential. After these steps and discovering the existence of &lt;code&gt;user_rules.md&lt;/code&gt; and &lt;code&gt;project_rules.md&lt;/code&gt; files, I thought: Why not test these files by creating custom commands?&lt;/p&gt;

&lt;h2&gt;
  
  
  The Basic Idea
&lt;/h2&gt;

&lt;p&gt;The concept is simple: instead of re-explaining everything every time, why not create a file where everything you do is automatically documented? I'm not talking about a &lt;strong&gt;README&lt;/strong&gt; or code comments - the AI already reads those. I mean &lt;em&gt;a real work session log&lt;/em&gt; that updates itself and contains everything: the changes made, the files touched, the decisions taken, what remains to be done.&lt;/p&gt;

&lt;p&gt;At the beginning of each new session, just one command - &lt;code&gt;LOADAGG&lt;/code&gt; - and the AI reads this log. In ten seconds it has loaded all the context and can continue as if it were the same conversation from yesterday.&lt;/p&gt;

&lt;p&gt;Sounds too good to be true? I was skeptical too. That's why I decided to test it seriously before talking about it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Test of Truth
&lt;/h2&gt;

&lt;p&gt;Before explaining how the system works, I want to show you proof that it really works. Because it's one thing to claim "&lt;em&gt;the AI remembers everything&lt;/em&gt;", another to prove it.&lt;/p&gt;

&lt;p&gt;I opened a new chat in &lt;strong&gt;TRAE&lt;/strong&gt;, typed &lt;code&gt;LOADAGG&lt;/code&gt; and waited ten seconds while the AI loaded the log file. Then, without giving any additional context, I asked four technical questions about the project.&lt;/p&gt;

&lt;p&gt;First question: "&lt;em&gt;How is the TODO object structured in the JSON file?&lt;/em&gt;"&lt;/p&gt;

&lt;p&gt;The answer came immediately and precisely. The AI explained that the structure is &lt;code&gt;{id, title, done, created}&lt;/code&gt;, described the type of each field, and even told me where in the code this structure is defined - all without asking "&lt;em&gt;which project?&lt;/em&gt;" or "&lt;em&gt;what are we talking about?&lt;/em&gt;".&lt;/p&gt;

&lt;p&gt;Second question: "How do we handle persistence?"&lt;/p&gt;

&lt;p&gt;Again, immediate answer. It told me that TODOs are saved in &lt;code&gt;todos.json&lt;/code&gt; in the project root, formatted with &lt;code&gt;indent=2&lt;/code&gt;, managed by specific functions in the &lt;code&gt;todo.py&lt;/code&gt; file, and that the JSON file is excluded from versioning. All technical details it couldn't know if it hadn't loaded the complete context.&lt;/p&gt;

&lt;p&gt;Third question: "&lt;em&gt;What dependencies does the project use?&lt;/em&gt;"&lt;/p&gt;

&lt;p&gt;It answered that the only dependency is &lt;code&gt;pytest&lt;/code&gt; for tests, and there are no runtime dependencies - the project only uses Python's standard library.&lt;/p&gt;

&lt;p&gt;Fourth question: "&lt;em&gt;How many tests do we have and which ones?&lt;/em&gt;"&lt;/p&gt;

&lt;p&gt;The AI listed all eight tests present in the project, naming them one by one. Not "about eight tests" or "some tests" - it named them all with the exact function names.&lt;/p&gt;

&lt;p&gt;Four questions, four perfect answers, zero clarification requests. This isn't "it seems the AI remembers something". This is "it has completely memorized the context from a Markdown file and can work as if it were the continuation of yesterday's conversation".&lt;/p&gt;

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

&lt;p&gt;The system runs on &lt;strong&gt;TRAE IDE&lt;/strong&gt;, which is an interesting coding assistant because it natively supports "&lt;em&gt;rules files&lt;/em&gt;" - Markdown files that define how the AI should behave in that specific project. I leveraged this functionality to implement a continuity system based on three main files.&lt;/p&gt;

&lt;p&gt;The first file, &lt;code&gt;UPDATE_PR.md&lt;/code&gt;, is the heart of the system. It's the session log I mentioned before. Every time you finish working, you type &lt;code&gt;SAVEAGG&lt;/code&gt; and the AI automatically generates a chapter in this file. The chapter contains everything: a summary of what you did, which files you modified or created, the technical decisions made, the current project status, what remains to be done. You don't have to write anything by hand - the AI analyzes the conversation and extracts all this information.&lt;/p&gt;

&lt;p&gt;The second file, &lt;code&gt;PROMPT.md&lt;/code&gt;, is a library of reusable prompts. If you have a type of request you make often - like "scan the project for possible optimizations" - you can save that prompt here and reuse it in new chats without having to rewrite it every time.&lt;/p&gt;

&lt;p&gt;The third file, &lt;code&gt;STRUTTURA_PROGETTO.md&lt;/code&gt;, is technical documentation that updates automatically. When you make important changes to the architecture or add relevant features, the &lt;code&gt;DOCUPDATE&lt;/code&gt; command updates this file. At the end of the project you end up with complete documentation without having dedicated explicit time to writing it.&lt;/p&gt;

&lt;p&gt;There are four commands in total:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;When&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;SAVEAGG&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;End of session&lt;/td&gt;
&lt;td&gt;Saves everything in UPDATE_PR.md&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;LOADAGG&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Start of session&lt;/td&gt;
&lt;td&gt;Loads context in 10 seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DOCUPDATE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;After important changes&lt;/td&gt;
&lt;td&gt;Updates STRUTTURA_PROGETTO.md&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SAVETEST&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;System validation&lt;/td&gt;
&lt;td&gt;Documents if commands work&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;SAVEAGG&lt;/code&gt; saves the state at the end of a session. &lt;code&gt;LOADAGG&lt;/code&gt; loads the context at the beginning of the next session. &lt;code&gt;DOCUPDATE&lt;/code&gt; updates the technical documentation when needed. And &lt;code&gt;SAVETEST&lt;/code&gt; I used during testing to document whether the commands were working correctly.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Test Project
&lt;/h2&gt;

&lt;p&gt;To test the system I used a real project, not a toy example. I developed a terminal &lt;em&gt;TODO manager&lt;/em&gt; in Python - simple enough to complete in a week, complex enough to require multiple work sessions and architectural decisions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Project Specifications
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CLI Commands&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;add&lt;/code&gt;, &lt;code&gt;list&lt;/code&gt;, &lt;code&gt;done&lt;/code&gt;, &lt;code&gt;delete&lt;/code&gt;, &lt;code&gt;clear&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Storage&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;JSON file (local persistence)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tests&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;pytest - 8 total tests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Size&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~150 lines of Python&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Sessions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;5 work sessions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total duration&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~55 minutes pure development&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The project implements five commands: add a TODO, list TODOs, mark a TODO as completed, delete a TODO, and completely clear the list. Data is saved in a JSON file and I wrote eight tests with pytest to verify everything works correctly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Session Timeline
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Session&lt;/th&gt;
&lt;th&gt;Date/Time&lt;/th&gt;
&lt;th&gt;Work Done&lt;/th&gt;
&lt;th&gt;Tests&lt;/th&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;#01&lt;/td&gt;
&lt;td&gt;12 Oct, 08:30&lt;/td&gt;
&lt;td&gt;Setup + &lt;code&gt;add&lt;/code&gt; command&lt;/td&gt;
&lt;td&gt;3/3 ✅&lt;/td&gt;
&lt;td&gt;~15 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;#02&lt;/td&gt;
&lt;td&gt;12 Oct, 09:15&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;list&lt;/code&gt; command (after LOADAGG)&lt;/td&gt;
&lt;td&gt;5/5 ✅&lt;/td&gt;
&lt;td&gt;~12 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;#03&lt;/td&gt;
&lt;td&gt;12 Oct, 10:00&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;done&lt;/code&gt; command&lt;/td&gt;
&lt;td&gt;6/6 ✅&lt;/td&gt;
&lt;td&gt;~10 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;#04&lt;/td&gt;
&lt;td&gt;12 Oct, 14:30&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;delete&lt;/code&gt; + &lt;code&gt;clear&lt;/code&gt; commands&lt;/td&gt;
&lt;td&gt;8/8 ✅&lt;/td&gt;
&lt;td&gt;~10 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;#05&lt;/td&gt;
&lt;td&gt;13 Oct, 09:00&lt;/td&gt;
&lt;td&gt;Cleanup and final validation&lt;/td&gt;
&lt;td&gt;8/8 ✅&lt;/td&gt;
&lt;td&gt;~8 min&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;I divided the work into five sessions. In the first session I created the basic structure and implemented the command to add TODOs. At the end of the session I typed &lt;code&gt;SAVEAGG&lt;/code&gt; and the AI generated the first chapter in &lt;code&gt;UPDATE_PR.md&lt;/code&gt;, documenting everything we had done.&lt;/p&gt;

&lt;p&gt;The second session was the real test. I opened a new chat - so the AI had no memory of the previous session - I typed &lt;code&gt;LOADAGG&lt;/code&gt; and waited ten seconds. Then I simply asked: "&lt;em&gt;Implement the list command&lt;/em&gt;".&lt;/p&gt;

&lt;p&gt;The AI didn't ask me "which project?". It didn't ask me "how is the code structured?". It didn't ask me "where are the files?". It simply implemented the command, following the style of the existing code, using the same conventions, integrating perfectly with the architecture we had established the day before. Because it had loaded all the context from &lt;code&gt;UPDATE_PR.md&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The subsequent sessions followed the same pattern. New chat, &lt;code&gt;LOADAGG&lt;/code&gt;, continue working without wasting time re-explaining. At the end: &lt;code&gt;SAVEAGG&lt;/code&gt;, and the log updates automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Numbers
&lt;/h2&gt;

&lt;p&gt;After five work sessions and about fifty-five total minutes of development, I collected the data.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tested Commands
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Times Used&lt;/th&gt;
&lt;th&gt;Functioning&lt;/th&gt;
&lt;th&gt;Average Time&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SAVEAGG&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;4 times&lt;/td&gt;
&lt;td&gt;✅ 4/4 (100%)&lt;/td&gt;
&lt;td&gt;~5 sec&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;LOADAGG&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;5 times&lt;/td&gt;
&lt;td&gt;✅ 5/5 (100%)&lt;/td&gt;
&lt;td&gt;~10 sec&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DOCUPDATE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;4 times&lt;/td&gt;
&lt;td&gt;✅ 4/4 (100%)&lt;/td&gt;
&lt;td&gt;~3 sec&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SAVETEST&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;6 times&lt;/td&gt;
&lt;td&gt;✅ 6/6 (100%)&lt;/td&gt;
&lt;td&gt;~2 sec&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;All four main commands worked perfectly on all occasions I used them. Zero critical issues, zero errors that blocked the workflow.&lt;/p&gt;

&lt;h3&gt;
  
  
  Memory Test
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Methodology&lt;/strong&gt;: New chat, &lt;code&gt;LOADAGG&lt;/code&gt;, then 4 technical questions without additional context.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;AI Response&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;TODO object schema in JSON&lt;/td&gt;
&lt;td&gt;Complete structure with types and code location&lt;/td&gt;
&lt;td&gt;✅ Correct&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How do we handle persistence&lt;/td&gt;
&lt;td&gt;Details on file, format, functions, .gitignore&lt;/td&gt;
&lt;td&gt;✅ Correct&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What dependencies does the project use&lt;/td&gt;
&lt;td&gt;Precise list: only pytest for tests&lt;/td&gt;
&lt;td&gt;✅ Correct&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How many tests and which ones&lt;/td&gt;
&lt;td&gt;All 8 tests listed by name&lt;/td&gt;
&lt;td&gt;✅ Correct&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Score: 4/4 (100%)&lt;/strong&gt; - The AI answered all questions correctly without asking for clarifications.&lt;/p&gt;

&lt;h3&gt;
  
  
  Time Savings
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Sessions with LOADAGG&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total LOADAGG time&lt;/td&gt;
&lt;td&gt;~50 seconds (10 sec × 5)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Time without system (estimated)&lt;/td&gt;
&lt;td&gt;~40 minutes (8 min × 5)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Net savings&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;39 minutes 10 seconds&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Percentage saved&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;98%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;And the time savings were measured precisely. It's not theory. It's real time saved with a stopwatch.&lt;/p&gt;

&lt;h2&gt;
  
  
  How It Feels in Practice
&lt;/h2&gt;

&lt;p&gt;Numbers are important, but what really matters is how the work experience changes. And here there's a huge difference.&lt;/p&gt;

&lt;p&gt;Before the system, every new session started with a "warm-up" phase. I had to re-explain the context, the AI asked clarifying questions, I provided details, a necessary but frustrating dialogue was created before being able to actually work. It was like having to repeat the same story every day to a person with amnesia.&lt;/p&gt;

&lt;p&gt;With the system, you open the chat, type &lt;code&gt;LOADAGG&lt;/code&gt;, wait ten seconds, and you're already at work. There's no warm-up phase. No clarifying questions. No cognitive friction. It's like picking up a book where you left it.&lt;/p&gt;

&lt;p&gt;Let me give you a concrete example from the fourth test session. I had just implemented the &lt;code&gt;delete&lt;/code&gt; and &lt;code&gt;clear&lt;/code&gt;commands and wanted to update the README with usage examples for these new commands. I simply typed: "Update README with delete/clear examples".&lt;/p&gt;

&lt;p&gt;The AI read the existing README, understood the style we were using, followed the formatting conventions already established, created examples consistent with those of the other commands, and updated the file. Zero questions, zero hesitation. It worked exactly as if it were the continuation of the same conversation, because from its point of view it was - it had the complete context.&lt;/p&gt;

&lt;p&gt;This is the real value of the system. It's not just time savings in a quantitative sense. It's elimination of friction, it's maintenance of workflow, it's the difference between feeling frustrated and feeling productive.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Didn't Test
&lt;/h2&gt;

&lt;p&gt;I want to be honest about the limits. I tested the four main commands and they work. But the system I implemented in the project rules also includes some advanced features I didn't get to try.&lt;/p&gt;

&lt;p&gt;For example, there's a &lt;code&gt;LOADAGG LIST&lt;/code&gt; command that should show a history of all updates in tabular format. There's &lt;code&gt;LOADAGG DIFF&lt;/code&gt; that should allow comparing two different project states. There's &lt;code&gt;LOADAGG #number&lt;/code&gt; to load a specific update instead of the latest. And there's &lt;code&gt;LISTPROMPT&lt;/code&gt; to see all saved prompts.&lt;/p&gt;

&lt;p&gt;These features are defined in the rules and the logic seems solid, but I didn't test them in practice. So I can't guarantee they work. They might even work perfectly, but I simply don't know.&lt;/p&gt;

&lt;p&gt;Another limit: the test project was relatively small, about one hundred fifty lines of code. Does it scale to large projects? I didn't verify. The principle should hold - the more complex the project, the more valuable having a session log becomes - but I don't have empirical data on projects with thousands of lines.&lt;/p&gt;

&lt;p&gt;And obviously this system is specific to TRAE IDE. It works because TRAE natively supports rules files. You could adapt the concepts to other AI assistants, but it wouldn't be as smooth because they don't have this integrated functionality.&lt;/p&gt;

&lt;h2&gt;
  
  
  If I Had to Do It Again
&lt;/h2&gt;

&lt;p&gt;With hindsight, there are a couple of things I would do differently.&lt;/p&gt;

&lt;p&gt;The memory test, the one with the four questions, I did it at the end after completing all development sessions. But in reality it's the most important test - it's the definitive proof that the system works. If I had to start over, I would do it immediately in the second session, to have immediate confirmation that &lt;code&gt;LOADAGG&lt;/code&gt; is really loading the complete context.&lt;/p&gt;

&lt;p&gt;For the test project, one hundred fifty lines were fine, but probably fifty-eighty would have been enough to validate the system. Something even simpler would have allowed focusing exclusively on testing the commands without distractions.&lt;/p&gt;

&lt;p&gt;And I would create a &lt;code&gt;checklist&lt;/code&gt; to follow before each session. Like: "&lt;em&gt;Before continuing, verify that&lt;/em&gt; &lt;code&gt;LOADAGG&lt;/code&gt; &lt;em&gt;worked by asking these four specific questions&lt;/em&gt;". Having a standardized procedure helps ensure the system is working as it should.&lt;/p&gt;

&lt;h2&gt;
  
  
  Perspectives
&lt;/h2&gt;

&lt;p&gt;This is a proof of concept on a small project. But the potential is much bigger.&lt;/p&gt;

&lt;p&gt;Imagine working on a project that lasts weeks or months. Every day you add a chapter to the log. After a month you have a complete chronology of everything that was done, all the decisions made, all the problems solved. You no longer have to ask yourself "&lt;em&gt;why did I make this choice three weeks ago?&lt;/em&gt;" - it's documented.&lt;/p&gt;

&lt;p&gt;Or imagine a team collaborating with AI. Each team member can read &lt;code&gt;UPDATE_PR.md&lt;/code&gt; and see exactly where the project stands, what choices were made, what remains to be done. The knowledge base grows automatically instead of being lost.&lt;/p&gt;

&lt;p&gt;There are many directions this could evolve. Automatic saving every fifteen minutes. Named checkpoints like in Git, to be able to return to specific states. Automatic export of documentation in different formats. Productivity metrics. But for now it's a working system that solves a real problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Package on GitHub
&lt;/h2&gt;

&lt;p&gt;After testing the system, I prepared a complete ready-to-use package. Sixteen files organized in a modular structure: system rules (&lt;strong&gt;12 commands&lt;/strong&gt;), output examples, setup guides and documentation.&lt;/p&gt;

&lt;p&gt;The package is generic, in both Italian and English, works with any project in &lt;strong&gt;TRAE IDE&lt;/strong&gt;. Clone the repository, copy the &lt;code&gt;.trae/&lt;/code&gt; folder to your project root, and you have the system active. Three main commands (&lt;code&gt;SAVEAGG&lt;/code&gt;, &lt;code&gt;LOADAGG&lt;/code&gt;, &lt;code&gt;DOCUPDATE&lt;/code&gt;, &lt;code&gt;SAVETEST&lt;/code&gt; and &lt;code&gt;TESTREPORT&lt;/code&gt;) and you're operational.&lt;/p&gt;

&lt;p&gt;You don't have to understand how it works internally, you don't have to configure anything. It's plug-and-play. The repository also includes real examples of &lt;code&gt;UPDATE_PR.md&lt;/code&gt; from the test project, so you immediately see what the session log looks like in practice.&lt;/p&gt;

&lt;p&gt;Link: &lt;a href="https://github.com/AntonioDEM/TRAE-RULES-PROJECT" rel="noopener noreferrer"&gt;GitHub Repository&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  In Summary
&lt;/h2&gt;

&lt;p&gt;Does it work? Yes, I tested it and the data confirms it. Is it perfect? No, there are features I didn't try and limits to consider. Is it useful? Absolutely yes, at least for how I work.&lt;/p&gt;

&lt;h3&gt;
  
  
  Validation Summary
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Criterion&lt;/th&gt;
&lt;th&gt;Minimum Target&lt;/th&gt;
&lt;th&gt;Result Obtained&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Working commands&lt;/td&gt;
&lt;td&gt;≥ 90%&lt;/td&gt;
&lt;td&gt;4/4 (100%)&lt;/td&gt;
&lt;td&gt;✅ Passed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memory test&lt;/td&gt;
&lt;td&gt;≥ 3/4 (75%)&lt;/td&gt;
&lt;td&gt;4/4 (100%)&lt;/td&gt;
&lt;td&gt;✅ Passed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Time savings&lt;/td&gt;
&lt;td&gt;≥ 80%&lt;/td&gt;
&lt;td&gt;98%&lt;/td&gt;
&lt;td&gt;✅ Passed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Critical issues&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;✅ Confirmed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The numbers say that four out of four commands worked, that the memory test gave four correct answers out of four, and that I saved ninety-eight percent of the time I would have otherwise lost re-explaining the context.&lt;/p&gt;

&lt;p&gt;But numbers aren't everything. The real change is in the workflow. It's going from "damn, I have to re-explain everything" to "LOADAGG, perfect, let's continue". It's working with an AI that remembers instead of one that forgets. It's eliminating that frustrating friction that breaks concentration.&lt;/p&gt;

&lt;p&gt;For me it was worth it. If you work on projects that require multiple sessions and use &lt;strong&gt;TRAE IDE&lt;/strong&gt;, it might be worth it for you too. The system is there, ready to use. Just copy the rules file to your project and start with &lt;code&gt;SAVEAGG&lt;/code&gt; and &lt;code&gt;LOADAGG&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;And if you try it, I'd be curious to know how it goes. The most interesting tests are those on different projects, bigger, more complex. My data covers a specific use case - the real validation comes from replicability on different cases.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Written on October 13, 2025 - by Antonio Demarcus. Tested on TRAE IDE 1.3.0+ with a Python project of ~150 lines developed in 5 sessions. Measured data: 4/4 working commands, 4/4 memory tests, 98% time savings.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>ai</category>
      <category>productivity</category>
      <category>opensource</category>
    </item>
    <item>
      <title>KillPort Advanced v2.0:Evolution of a Port Management Tool for macOS</title>
      <dc:creator>Antonio</dc:creator>
      <pubDate>Mon, 06 Oct 2025 15:41:00 +0000</pubDate>
      <link>https://forem.com/antoniodem/killport-advanced-v20evolution-of-a-port-management-tool-for-macos-2l82</link>
      <guid>https://forem.com/antoniodem/killport-advanced-v20evolution-of-a-port-management-tool-for-macos-2l82</guid>
      <description>&lt;p&gt;During daily development, we've all dealt with the frustration of processes that won't release ports. The classic workflow of &lt;code&gt;lsof -i :8080&lt;/code&gt;, copying the PID, then &lt;code&gt;kill -9&lt;/code&gt; becomes repetitive and tedious.&lt;/p&gt;

&lt;p&gt;An excellent solution already existed: &lt;strong&gt;&lt;a href="https://github.com/jkfran/killport" rel="noopener noreferrer"&gt;killport&lt;/a&gt;&lt;/strong&gt; by &lt;a href="https://github.com/jkfran" rel="noopener noreferrer"&gt;jkfran&lt;/a&gt;, a blazing-fast cross-platform tool written in Rust. I used it for months and it works great. However, for my specific needs on macOS, I wanted something more: integrated monitoring, interactive mode, advanced range management. So I created &lt;strong&gt;KillPort Advanced v2.0&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Start from jkfran's killport?
&lt;/h2&gt;

&lt;p&gt;Before explaining what I built, it's essential to give credit to jkfran. His &lt;a href="https://github.com/jkfran/killport" rel="noopener noreferrer"&gt;killport&lt;/a&gt; is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Blazing fast&lt;/strong&gt;: written in Rust, excellent native performance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-platform&lt;/strong&gt;: works on macOS, Linux, Windows&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Minimal&lt;/strong&gt;: does one thing and does it well&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reliable&lt;/strong&gt;: used by thousands of developers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without this project as a benchmark reference, I wouldn't have had solid comparison parameters. My work was to build &lt;strong&gt;on top&lt;/strong&gt; of these standards, adding specific features for more complex workflows.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Approach: Advanced Shell Script
&lt;/h2&gt;

&lt;p&gt;I chose to write a pure ZSH function for several reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero dependencies&lt;/strong&gt;: no compilation, no binaries&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Native integration&lt;/strong&gt;: blends with the macOS terminal&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Easy to modify&lt;/strong&gt;: just edit a script&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instant installation&lt;/strong&gt;: source and go&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The challenge was maintaining performance comparable to an optimized Rust binary.&lt;/p&gt;

&lt;h2&gt;
  
  
  Extended Features
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Flexible Management
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Single port&lt;/span&gt;
killport 3000

&lt;span class="c"&gt;# Multiple ports&lt;/span&gt;
killport 3000 4000 8080

&lt;span class="c"&gt;# Port range&lt;/span&gt;
killport 8000-8010
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Interactive Mode
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kpi  &lt;span class="c"&gt;# Alias for --interactive&lt;/span&gt;

&lt;span class="c"&gt;# Output:&lt;/span&gt;
&lt;span class="c"&gt;# Listening processes:&lt;/span&gt;
&lt;span class="c"&gt;# #    PORT     PROCESS           PID     &lt;/span&gt;
&lt;span class="c"&gt;# 1    3000     node              1234    &lt;/span&gt;
&lt;span class="c"&gt;# 2    8080     python3           5678    &lt;/span&gt;
&lt;span class="c"&gt;# Select number (or 'q' to quit):&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Integrated Monitoring
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ports      &lt;span class="c"&gt;# List all ports (alias for --list)&lt;/span&gt;
netstats   &lt;span class="c"&gt;# Detailed network statistics (alias for --stats)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Watch Mode
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;killport &lt;span class="nt"&gt;--watch&lt;/span&gt; 3000
&lt;span class="c"&gt;# Continuously monitors and auto-kills&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Security
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Protected ports (22, 80, 443, 3306, 5432) with mandatory confirmation&lt;/li&gt;
&lt;li&gt;Dry-run mode (&lt;code&gt;--dry-run&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Operation history (&lt;code&gt;kph&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Benchmark: Honest Comparison
&lt;/h2&gt;

&lt;p&gt;I wanted to do a serious comparison with jkfran's killport installed via Homebrew. I created a complete benchmark suite that tests 5 different scenarios with detailed statistics.&lt;/p&gt;

&lt;h3&gt;
  
  
  Methodology
&lt;/h3&gt;

&lt;p&gt;For each test I calculated:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Min&lt;/strong&gt; (ms): minimum time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Max&lt;/strong&gt; (ms): maximum time
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Avg&lt;/strong&gt; (ms): average time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;StdDev (σ)&lt;/strong&gt;: standard deviation (consistency)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tests performed:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Kill single port (5 iterations)&lt;/li&gt;
&lt;li&gt;Kill 3 simultaneous ports (5 iterations)&lt;/li&gt;
&lt;li&gt;Kill range of 21 ports (3 iterations)&lt;/li&gt;
&lt;li&gt;List ports - Advanced only&lt;/li&gt;
&lt;li&gt;Network statistics - Advanced only&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Detailed Results
&lt;/h3&gt;

&lt;h4&gt;
  
  
  TEST 1: Kill Single Port
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Min&lt;/th&gt;
&lt;th&gt;Max&lt;/th&gt;
&lt;th&gt;Avg&lt;/th&gt;
&lt;th&gt;StdDev&lt;/th&gt;
&lt;th&gt;Winner&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;killport (brew)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;25ms&lt;/td&gt;
&lt;td&gt;25ms&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;25ms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;±0ms&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;KillPort Advanced&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;27ms&lt;/td&gt;
&lt;td&gt;27ms&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;27ms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;±0ms&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Difference&lt;/strong&gt;: brew faster by 2ms (7%)&lt;/p&gt;

&lt;h4&gt;
  
  
  TEST 2: Kill 3 Simultaneous Ports
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Min&lt;/th&gt;
&lt;th&gt;Max&lt;/th&gt;
&lt;th&gt;Avg&lt;/th&gt;
&lt;th&gt;StdDev&lt;/th&gt;
&lt;th&gt;Winner&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;KillPort Advanced&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;31ms&lt;/td&gt;
&lt;td&gt;31ms&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;31ms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;±0ms&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;killport (brew)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;32ms&lt;/td&gt;
&lt;td&gt;32ms&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;32ms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;±0ms&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Difference&lt;/strong&gt;: Advanced faster by 1ms (3%)&lt;/p&gt;

&lt;h4&gt;
  
  
  TEST 3: Range of 21 Ports (9100-9120)
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Min&lt;/th&gt;
&lt;th&gt;Max&lt;/th&gt;
&lt;th&gt;Avg&lt;/th&gt;
&lt;th&gt;StdDev&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;KillPort Advanced&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;20ms&lt;/td&gt;
&lt;td&gt;20ms&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;20ms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;±0ms&lt;/td&gt;
&lt;td&gt;⚖️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;killport (brew)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;20ms&lt;/td&gt;
&lt;td&gt;20ms&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;20ms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;±0ms&lt;/td&gt;
&lt;td&gt;⚖️&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Result&lt;/strong&gt;: Identical performance&lt;/p&gt;

&lt;h4&gt;
  
  
  TEST 4 &amp;amp; 5: KillPort Advanced Exclusive Features
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--list&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;22ms&lt;/td&gt;
&lt;td&gt;Lists active ports&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--stats&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;22ms&lt;/td&gt;
&lt;td&gt;Network statistics&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Interpretation
&lt;/h3&gt;

&lt;p&gt;Performance is &lt;strong&gt;virtually identical&lt;/strong&gt; - we're talking about 2ms differences that are imperceptible in daily practice. The standard deviation of 0 indicates that both tools are extremely consistent and reliable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;According to BENCHMARK_GUIDE parameters:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ All tests &amp;lt; 30ms = &lt;strong&gt;Excellent&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;✅ σ = 0ms = &lt;strong&gt;Very consistent&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Which One to Choose?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  killport (brew) by jkfran - When to use it
&lt;/h3&gt;

&lt;p&gt;✅ You want the bare minimum essentials&lt;br&gt;&lt;br&gt;
✅ You need cross-platform support (Linux, Windows)&lt;br&gt;&lt;br&gt;
✅ You prefer compiled binaries&lt;br&gt;&lt;br&gt;
✅ Pure performance is top priority  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Installation&lt;/strong&gt;: &lt;code&gt;brew install killport&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  KillPort Advanced v2.0 - When to use it
&lt;/h3&gt;

&lt;p&gt;✅ You work exclusively on macOS&lt;br&gt;&lt;br&gt;
✅ You need integrated monitoring (&lt;code&gt;--list&lt;/code&gt;, &lt;code&gt;--stats&lt;/code&gt;)&lt;br&gt;&lt;br&gt;
✅ You want interactive mode and watch mode&lt;br&gt;&lt;br&gt;
✅ You prefer easily modifiable shell scripts&lt;br&gt;&lt;br&gt;
✅ You need protections for critical ports  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Installation&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/AntonioDEM/killport-advanced.git
&lt;span class="nb"&gt;cd &lt;/span&gt;killport-advanced
bash install_killport.sh
&lt;span class="nb"&gt;source&lt;/span&gt; ~/.zshrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Simplified Installation
&lt;/h2&gt;

&lt;p&gt;The automatic installer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Finds source files&lt;/li&gt;
&lt;li&gt;Configures everything automatically&lt;/li&gt;
&lt;li&gt;Creates convenient aliases (&lt;code&gt;kp&lt;/code&gt;, &lt;code&gt;kpi&lt;/code&gt;, &lt;code&gt;ports&lt;/code&gt;, &lt;code&gt;netstats&lt;/code&gt;, &lt;code&gt;kph&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Includes uninstaller (&lt;code&gt;killport-uninstall&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Practical Examples
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Web Development
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Express server stuck&lt;/span&gt;
killport 3000

&lt;span class="c"&gt;# Multiple services&lt;/span&gt;
killport 3000 4000 8080

&lt;span class="c"&gt;# Complete environment cleanup&lt;/span&gt;
killport 3000-3010
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Debugging
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# What's occupying ports?&lt;/span&gt;
ports

&lt;span class="c"&gt;# Who's using most connections?&lt;/span&gt;
netstats
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Automation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Continuous auto-kill&lt;/span&gt;
killport &lt;span class="nt"&gt;--watch&lt;/span&gt; 3000 &amp;amp;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Reproducible Benchmarks
&lt;/h2&gt;

&lt;p&gt;I included the complete suite to allow anyone to verify the results:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;killport-advanced/benchmark

&lt;span class="c"&gt;# Run benchmark&lt;/span&gt;
./benchmark_original.sh

&lt;span class="c"&gt;# Visualize with ASCII charts&lt;/span&gt;
./benchmark_visualizer_original.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Generated outputs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;benchmark_results_TIMESTAMP.txt&lt;/code&gt; - Detailed report&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;benchmark_results_TIMESTAMP.csv&lt;/code&gt; - Data for analysis&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;benchmark_charts_TIMESTAMP.txt&lt;/code&gt; - ASCII charts (export)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;benchmark_report_TIMESTAMP.md&lt;/code&gt; - Markdown report (export)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Complete guide: &lt;a href="https://github.com/AntonioDEM/killport-advanced/blob/main/benchmark/BENCHMARK_GUIDE.md" rel="noopener noreferrer"&gt;BENCHMARK_GUIDE.md&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Results Transparency
&lt;/h2&gt;

&lt;p&gt;I chose to publish &lt;strong&gt;all&lt;/strong&gt; results, including those where jkfran's killport is faster. Honesty is fundamental: I'm not trying to "beat" the original project, but to offer an alternative with different features for different needs.&lt;/p&gt;

&lt;p&gt;The 2ms difference in TEST 1 is negligible and probably related to the overhead of a shell function vs a compiled binary. But I gain monitoring, interactivity, and flexibility.&lt;/p&gt;

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

&lt;p&gt;This project taught me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Serious benchmarking&lt;/strong&gt;: how to test correctly and honestly&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Advanced shell scripting&lt;/strong&gt;: complex argument and state management&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance tuning&lt;/strong&gt;: optimizing scripts to compete with binaries&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation&lt;/strong&gt;: the importance of clear guides and examples&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Credits and Acknowledgments
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/jkfran" rel="noopener noreferrer"&gt;jkfran&lt;/a&gt;&lt;/strong&gt; for original &lt;a href="https://github.com/jkfran/killport" rel="noopener noreferrer"&gt;killport&lt;/a&gt; - fundamental as reference&lt;/li&gt;
&lt;li&gt;The open source community for feedback and support&lt;/li&gt;
&lt;li&gt;All project contributors&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Useful Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;KillPort Advanced Repository&lt;/strong&gt;: &lt;a href="https://github.com/AntonioDEM/killport-advanced" rel="noopener noreferrer"&gt;github.com/AntonioDEM/killport-advanced&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Original killport Repository&lt;/strong&gt;: &lt;a href="https://github.com/jkfran/killport" rel="noopener noreferrer"&gt;github.com/jkfran/killport&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Complete Benchmark Report&lt;/strong&gt;: &lt;a href="https://github.com/AntonioDEM/killport-advanced/blob/main/benchmark/benchmark_report_20251005_214913.md" rel="noopener noreferrer"&gt;benchmark_report_20251005_214913.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Benchmark Guide&lt;/strong&gt;: &lt;a href="https://github.com/AntonioDEM/killport-advanced/blob/main/benchmark/BENCHMARK_GUIDE.md" rel="noopener noreferrer"&gt;BENCHMARK_GUIDE.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Detailed Comparison&lt;/strong&gt;: &lt;a href="https://github.com/AntonioDEM/killport-advanced/blob/main/Confronto_con_brew.md" rel="noopener noreferrer"&gt;Confronto_con_brew.md&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusions
&lt;/h2&gt;

&lt;p&gt;KillPort Advanced v2.0 doesn't want to replace jkfran's killport - that would be presumptuous. It's a macOS-specific evolution that adds advanced features while maintaining comparable performance.&lt;/p&gt;

&lt;p&gt;If you're looking for a cross-platform, fast, and minimal tool, use jkfran's killport.&lt;br&gt;&lt;br&gt;
If you work on macOS and want monitoring, interactivity, and protections, try KillPort Advanced.&lt;/p&gt;

&lt;p&gt;Both are open source, both work great.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;If you find this project useful, leave a star on GitHub. And if you have suggestions or bugs, PRs are welcome.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devtools</category>
      <category>shell</category>
      <category>opensource</category>
      <category>performance</category>
    </item>
    <item>
      <title>Complete Guide to Git for Multi-Platform Development: From Mac to Windows Without Conflicts</title>
      <dc:creator>Antonio</dc:creator>
      <pubDate>Thu, 02 Oct 2025 07:39:22 +0000</pubDate>
      <link>https://forem.com/antoniodem/complete-guide-to-git-for-multi-platform-development-from-mac-to-windows-without-conflicts-28c8</link>
      <guid>https://forem.com/antoniodem/complete-guide-to-git-for-multi-platform-development-from-mac-to-windows-without-conflicts-28c8</guid>
      <description>&lt;h2&gt;
  
  
  Introduction: The Problem Every Cross-Platform Developer Knows
&lt;/h2&gt;

&lt;p&gt;Raise your hand if you've never found yourself in this situation: you work on a project on your Mac at the office, come home, open your Windows laptop, do a &lt;code&gt;git pull&lt;/code&gt; and... boom! Conflicts everywhere. Files that appear modified even though you've never touched them. Configurations that don't work. Paths that don't exist. Line endings gone crazy.&lt;/p&gt;

&lt;p&gt;If you recognized yourself in this description, this article is for you. After months of work on my &lt;strong&gt;Smart Conda Terminal&lt;/strong&gt; project – a VSCode extension that needs to work perfectly on both macOS and Windows – I learned (often the hard way) how to manage a truly multi-platform Git workflow.&lt;/p&gt;

&lt;p&gt;In this article, I'll share everything I've learned: from initial configuration to best practices, from tricks to avoid conflicts to solutions for the most common problems. Not a theoretical guide, but a practical manual born from field experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why is Multi-Platform Development So Complicated?
&lt;/h2&gt;

&lt;p&gt;Before diving in, let's understand why Git makes our lives difficult when we work on different operating systems:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Paths are Different&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;macOS&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"python.defaultInterpreterPath"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/Users/tony/miniconda3/envs/sct-dev/bin/python"&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Windows&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"python.defaultInterpreterPath"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"C:&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;Users&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;Tony&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;miniconda3&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;envs&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;sct-dev&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;python.exe"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. &lt;strong&gt;Line Endings are Different&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Unix/Mac use &lt;code&gt;LF&lt;/code&gt; (Line Feed: &lt;code&gt;\n&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Windows uses &lt;code&gt;CRLF&lt;/code&gt; (Carriage Return + Line Feed: &lt;code&gt;\r\n&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Result? Git sees every single file as modified, even if you haven't changed a comma.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;Shell Scripts Don't Work on Windows&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Bash scripts that run perfectly on Mac? On Windows you need PowerShell or WSL.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. &lt;strong&gt;VSCode Configurations are Platform-Specific&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Terminal profiles, conda paths, interpreter settings... all different.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Strategy: One Repository, Two Platforms, Zero Conflicts
&lt;/h2&gt;

&lt;p&gt;The solution I developed is based on three principles:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Shared configurations&lt;/strong&gt; for everything that is platform-agnostic&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local files ignored by Git&lt;/strong&gt; for platform-specific paths and settings&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Intelligent automation&lt;/strong&gt; that detects the platform&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Let's see how to implement it step by step.&lt;/p&gt;

&lt;h2&gt;
  
  
  Initial Setup: Preparing the Ground
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Cross-Platform Git Configuration
&lt;/h3&gt;

&lt;p&gt;First of all, let's configure Git correctly on both platforms:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Name and email (same on both)&lt;/span&gt;
git config &lt;span class="nt"&gt;--global&lt;/span&gt; user.name &lt;span class="s2"&gt;"Your Name"&lt;/span&gt;
git config &lt;span class="nt"&gt;--global&lt;/span&gt; user.email &lt;span class="s2"&gt;"your.email@example.com"&lt;/span&gt;

&lt;span class="c"&gt;# Line endings - CRUCIAL to avoid conflicts&lt;/span&gt;
&lt;span class="c"&gt;# On Mac/Linux:&lt;/span&gt;
git config &lt;span class="nt"&gt;--global&lt;/span&gt; core.autocrlf input

&lt;span class="c"&gt;# On Windows:&lt;/span&gt;
git config &lt;span class="nt"&gt;--global&lt;/span&gt; core.autocrlf &lt;span class="nb"&gt;true&lt;/span&gt;

&lt;span class="c"&gt;# Editor and other useful settings&lt;/span&gt;
git config &lt;span class="nt"&gt;--global&lt;/span&gt; core.editor &lt;span class="s2"&gt;"code --wait"&lt;/span&gt;
git config &lt;span class="nt"&gt;--global&lt;/span&gt; push.default simple
git config &lt;span class="nt"&gt;--global&lt;/span&gt; color.ui auto
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. The .gitattributes File: The Line Endings Savior
&lt;/h3&gt;

&lt;p&gt;Create this file in the project root and &lt;strong&gt;commit it&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;text&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# .gitattributes
* text=auto eol=lf
*.sh text eol=lf
*.js text eol=lf
*.json text eol=lf
*.md text eol=lf
*.py text eol=lf

# Binary files
*.png binary
*.jpg binary
*.ico binary
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This file tells Git: "Whatever the operating system, always use LF internally, and let the local system decide how to save files."&lt;/p&gt;

&lt;h3&gt;
  
  
  3. The Intelligent .gitignore
&lt;/h3&gt;

&lt;p&gt;A well-crafted &lt;code&gt;.gitignore&lt;/code&gt; is essential. Here's mine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Dependencies
node_modules/
.node_modules/
npm-debug.log*
package-lock.json

# Build outputs
out/
dist/
*.vsix

# OS files - Here's the trick!
.DS_Store          # macOS
Thumbs.db          # Windows
*.swp
*.swo

# IDE - Keep only shared configs
.vscode/settings.json.local
.vscode/*.local.json

# IMPORTANT: DO NOT ignore these
!.vscode/settings.json
!.vscode/launch.json
!.vscode/extensions.json
!.vscode/tasks.json

# Logs and cache
*.log
.npm
.cache/

# Environment
.env
.env.local

# Conda specific
.smart-conda-terminal/
conda-meta/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The key is in the IDE section: we keep shared configurations (with &lt;code&gt;!&lt;/code&gt;) but ignore local ones.&lt;/p&gt;

&lt;h2&gt;
  
  
  Project Structure: What to Commit and What Not
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;project/
├── .vscode/
│   ├── settings.json       ← COMMITTED (general settings)
│   ├── launch.json         ← COMMITTED (debug config)
│   ├── extensions.json     ← COMMITTED (recommended extensions)
│   └── tasks.json          ← COMMITTED (common tasks)
├── .gitattributes          ← COMMITTED
├── .gitignore              ← COMMITTED
├── package.json
├── src/
└── project.code-workspace  ← OPTIONAL, see below
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The Secret: Two-Level Configurations
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Level 1: Shared Settings&lt;/strong&gt; (&lt;code&gt;.vscode/settings.json&lt;/code&gt; - committed)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"editor.formatOnSave"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"editor.insertSpaces"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"editor.tabSize"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"files.trimTrailingWhitespace"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"files.exclude"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"out"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"dist"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"node_modules"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"**/.DS_Store"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"**/Thumbs.db"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Level 2: Workspace with Environment Variables&lt;/strong&gt; (optional)&lt;/p&gt;

&lt;p&gt;Instead of hard-coded paths, use variables:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"folders"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nl"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"."&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"settings"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"python.defaultInterpreterPath"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"${env:CONDA_PREFIX}/bin/python"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"python.terminal.activateEnvironment"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On Windows, &lt;code&gt;${env:CONDA_PREFIX}&lt;/code&gt; will automatically resolve to the correct path.&lt;/p&gt;

&lt;h2&gt;
  
  
  Daily Workflow: The Four Commandments
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Before Starting: PULL
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;your-project
git pull origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Simple but fundamental. Avoids 90% of conflicts.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. During Work: Small and Frequent Commits
&lt;/h3&gt;

&lt;p&gt;❌ &lt;strong&gt;Bad:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# After 3 days...&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"various changes"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;Good:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"feat: Add Windows terminal profile support"&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"fix: Python path resolution on Windows"&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"docs: Update cross-platform setup guide"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Before Finishing: Verify
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# What did I modify?&lt;/span&gt;
git status

&lt;span class="c"&gt;# See the differences in detail&lt;/span&gt;
git diff

&lt;span class="c"&gt;# Everything ok? Add&lt;/span&gt;
git add &lt;span class="nb"&gt;.&lt;/span&gt;

&lt;span class="c"&gt;# Commit with clear message&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"feat: Implement auto-platform detection"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. When You Finish: PUSH
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git push origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conflict Management: Real Situations and How to Solve Them
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Scenario 1: "Your local changes would be overwritten"
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The problem:&lt;/strong&gt; You have uncommitted local changes and do &lt;code&gt;git pull&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The solution (stash method):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Set aside your changes&lt;/span&gt;
git stash

&lt;span class="c"&gt;# 2. Download updates&lt;/span&gt;
git pull origin main

&lt;span class="c"&gt;# 3. Reapply your changes&lt;/span&gt;
git stash pop

&lt;span class="c"&gt;# 4. If there are conflicts, resolve them manually&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Scenario 2: Merge Conflicts
&lt;/h3&gt;

&lt;p&gt;When Git can't merge automatically, you'll see this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;HEAD&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1.0.0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// Your version&lt;/span&gt;
&lt;span class="o"&gt;=======&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2.0.0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// Remote version&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;origin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;main&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;How I solve it:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the file in VSCode&lt;/li&gt;
&lt;li&gt;Decide which version to keep (or merge both)&lt;/li&gt;
&lt;li&gt;Remove the markers &lt;code&gt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;/code&gt;, &lt;code&gt;=======&lt;/code&gt;, &lt;code&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Save and commit:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add conflicted-file.js
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"resolve: Merge conflict in version number"&lt;/span&gt;
git push origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Scenario 3: Crazy Line Endings
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Symptoms:&lt;/strong&gt; Git shows modified files even though you haven't touched them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Diagnosis:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git diff file.js
&lt;span class="c"&gt;# If you only see "^M" or invisible differences, it's line endings&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Cure:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Add .gitattributes (if not already there)&lt;/span&gt;
&lt;span class="c"&gt;# 2. Normalize all files&lt;/span&gt;
git add &lt;span class="nt"&gt;--renormalize&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"fix: Normalize line endings"&lt;/span&gt;
git push origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Automation Scripts: Platform Detection
&lt;/h2&gt;

&lt;p&gt;For scripts that need to work everywhere:&lt;br&gt;
&lt;/p&gt;

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

&lt;span class="c"&gt;# Detect platform&lt;/span&gt;
detect_platform&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;uname&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="k"&gt;in
        &lt;/span&gt;Darwin&lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"mac"&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
        Linux&lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;     &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"linux"&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
        MINGW&lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;MSYS&lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;CYGWIN&lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"windows"&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
        &lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;          &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"unknown"&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
    &lt;span class="k"&gt;esac&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;# Get correct conda path&lt;/span&gt;
get_conda_path&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;PLATFORM&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;detect_platform&lt;span class="si"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nv"&gt;$PLATFORM&lt;/span&gt; &lt;span class="k"&gt;in
        &lt;/span&gt;mac|linux&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/miniconda3"&lt;/span&gt;
            &lt;span class="p"&gt;;;&lt;/span&gt;
        windows&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$USERPROFILE&lt;/span&gt;&lt;span class="s2"&gt;/miniconda3"&lt;/span&gt;
            &lt;span class="p"&gt;;;&lt;/span&gt;
    &lt;span class="k"&gt;esac&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;# Use the function&lt;/span&gt;
&lt;span class="nv"&gt;CONDA_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;get_conda_path&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Conda path: &lt;/span&gt;&lt;span class="nv"&gt;$CONDA_PATH&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Best Practices: The Golden Rules
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Meaningful Commit Messages
&lt;/h3&gt;

&lt;p&gt;I use the Conventional Commits format:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;feat: Add new feature
fix: Fix bug
docs: Update documentation
style: Code formatting
refactor: Code restructuring
&lt;span class="nb"&gt;test&lt;/span&gt;: Add tests
chore: General maintenance
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Pull Requests for Important Changes
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create a branch for the feature&lt;/span&gt;
git checkout &lt;span class="nt"&gt;-b&lt;/span&gt; feature/new-feature

&lt;span class="c"&gt;# Work on the branch&lt;/span&gt;
git add &lt;span class="nb"&gt;.&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"feat: Implement new feature"&lt;/span&gt;

&lt;span class="c"&gt;# Push the branch&lt;/span&gt;
git push origin feature/new-feature

&lt;span class="c"&gt;# On GitHub: create Pull Request&lt;/span&gt;
&lt;span class="c"&gt;# After review: merge to main&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Don't Commit Generated Files
&lt;/h3&gt;

&lt;p&gt;Never ever commit:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;node_modules/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Build outputs (&lt;code&gt;dist/&lt;/code&gt;, &lt;code&gt;out/&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Log files&lt;/li&gt;
&lt;li&gt;Local configurations&lt;/li&gt;
&lt;li&gt;Credentials&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Test on Both Platforms Before Pushing
&lt;/h3&gt;

&lt;p&gt;Personal checklist:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; Does the code work on Mac?&lt;/li&gt;
&lt;li&gt; Does the code work on Windows?&lt;/li&gt;
&lt;li&gt; Do tests pass on both?&lt;/li&gt;
&lt;li&gt; Is the documentation updated?&lt;/li&gt;
&lt;li&gt; Is the commit message clear?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Troubleshooting: The Most Common Problems
&lt;/h2&gt;

&lt;h3&gt;
  
  
  "Permission denied (publickey)"
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; Git can't connect to GitHub.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Generate SSH key&lt;/span&gt;
ssh-keygen &lt;span class="nt"&gt;-t&lt;/span&gt; ed25519 &lt;span class="nt"&gt;-C&lt;/span&gt; &lt;span class="s2"&gt;"your.email@example.com"&lt;/span&gt;

&lt;span class="c"&gt;# Copy the key&lt;/span&gt;
&lt;span class="c"&gt;# Mac:&lt;/span&gt;
pbcopy &amp;lt; ~/.ssh/id_ed25519.pub
&lt;span class="c"&gt;# Windows:&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; ~/.ssh/id_ed25519.pub | clip

&lt;span class="c"&gt;# Add it on GitHub: Settings → SSH Keys&lt;/span&gt;

&lt;span class="c"&gt;# Test&lt;/span&gt;
ssh &lt;span class="nt"&gt;-T&lt;/span&gt; git@github.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  "Repository too large"
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; The repository has become huge.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Remove untracked files&lt;/span&gt;
git clean &lt;span class="nt"&gt;-fd&lt;/span&gt;

&lt;span class="c"&gt;# Compress&lt;/span&gt;
git gc &lt;span class="nt"&gt;--aggressive&lt;/span&gt; &lt;span class="nt"&gt;--prune&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;now
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  "Detached HEAD state"
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; You checked out a specific commit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Return to main branch&lt;/span&gt;
git checkout main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Tools That Simplify Life
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. GitHub Desktop
&lt;/h3&gt;

&lt;p&gt;Simple and intuitive GUI, perfect for beginners.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. GitKraken
&lt;/h3&gt;

&lt;p&gt;Advanced graphical visualization of branches and history.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. VSCode Built-in Git
&lt;/h3&gt;

&lt;p&gt;My favorite. Perfect integration with the editor.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Git Aliases
&lt;/h3&gt;

&lt;p&gt;Shortcuts for frequent commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git config &lt;span class="nt"&gt;--global&lt;/span&gt; alias.co checkout
git config &lt;span class="nt"&gt;--global&lt;/span&gt; alias.br branch
git config &lt;span class="nt"&gt;--global&lt;/span&gt; alias.ci commit
git config &lt;span class="nt"&gt;--global&lt;/span&gt; alias.st status
git config &lt;span class="nt"&gt;--global&lt;/span&gt; alias.lg &lt;span class="s2"&gt;"log --oneline --graph --all"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now I can do &lt;code&gt;git st&lt;/code&gt; instead of &lt;code&gt;git status&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion: The Perfect Workflow Exists
&lt;/h2&gt;

&lt;p&gt;After months of experimentation, my daily workflow has been reduced to this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Morning (start work):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git pull origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Evening (end work):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git status
git add &lt;span class="nb"&gt;.&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"feat: Clear description"&lt;/span&gt;
git push origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;In case of problems:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git stash
git pull origin main
git stash pop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Simple, right? The key is in the correct initial configuration. Once everything is set up properly, Git becomes an ally, not an enemy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Checklist for Your Project
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt; &lt;code&gt;.gitattributes&lt;/code&gt; configured for line endings&lt;/li&gt;
&lt;li&gt; Complete and tested &lt;code&gt;.gitignore&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt; Multi-platform Git configuration (&lt;code&gt;core.autocrlf&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt; Two-level VSCode settings (shared + local)&lt;/li&gt;
&lt;li&gt; Scripts with automatic platform detection&lt;/li&gt;
&lt;li&gt; SSH keys configured on both platforms&lt;/li&gt;
&lt;li&gt; Workflow documented for the team&lt;/li&gt;
&lt;li&gt; Tests on both operating systems&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Useful Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://git-scm.com/book/en/v2" rel="noopener noreferrer"&gt;Pro Git Book&lt;/a&gt; - The Git bible, free&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://education.github.com/git-cheat-sheet-education.pdf" rel="noopener noreferrer"&gt;Git Cheat Sheet&lt;/a&gt; - Essential commands&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.conventionalcommits.org/" rel="noopener noreferrer"&gt;Conventional Commits&lt;/a&gt; - Standard for commit messages&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://guides.github.com/introduction/flow/" rel="noopener noreferrer"&gt;GitHub Flow&lt;/a&gt; - Workflow with branches&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Do you have questions or suggestions?&lt;/strong&gt; Write to me in the comments! This workflow is constantly evolving and I'm always curious to discover how other developers handle the same problem.&lt;/p&gt;

&lt;p&gt;If the article was useful to you, leave a clap 👏 and share it with other developers who work on multiple platforms!&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Final note:&lt;/strong&gt; All the code and configurations shown in this article are taken from my real project &lt;strong&gt;Smart Conda Terminal&lt;/strong&gt;, a VSCode extension for intelligent management of Conda environments. The repository is public and can serve as a practical example of what's described here.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; #GitHub #VSCode #Python #NodeJS #DeveloperTools #Conda #ExtensionDevelopment #JavaScript #Productivity #OpenSource&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>python</category>
      <category>tutorial</category>
      <category>programming</category>
    </item>
    <item>
      <title>How I Built My First VS Code Extension to Solve the Conda Environment Headache</title>
      <dc:creator>Antonio</dc:creator>
      <pubDate>Thu, 02 Oct 2025 06:53:54 +0000</pubDate>
      <link>https://forem.com/antoniodem/how-i-built-my-first-vs-code-extension-to-solve-the-conda-environment-headache-47no</link>
      <guid>https://forem.com/antoniodem/how-i-built-my-first-vs-code-extension-to-solve-the-conda-environment-headache-47no</guid>
      <description>&lt;h2&gt;
  
  
  The Problem That Drove Me Crazy
&lt;/h2&gt;

&lt;p&gt;Picture this: You're a developer working on multiple Python or Node.js projects. Each project has its own conda environment with specific dependencies. Every single time you open a terminal in VS Code, you have to remember to type:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;conda activate my-project-env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Forget to do this? Your code breaks. Wrong environment? Dependencies missing. Different project? Different environment to remember.&lt;/p&gt;

&lt;p&gt;After the hundredth time of forgetting to activate the right environment and spending 10 minutes debugging why my imports weren't working, I thought: &lt;strong&gt;"There has to be a better way."&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Journey: From Frustration to Solution
&lt;/h2&gt;

&lt;p&gt;As a developer who works primarily with Python data science projects and some Node.js side projects, I was constantly switching between environments. The mental overhead was real:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Project A&lt;/strong&gt;: &lt;code&gt;conda activate datascience-env&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Project B&lt;/strong&gt;: &lt;code&gt;conda activate webapp-env&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Project C&lt;/strong&gt;: &lt;code&gt;conda activate ml-research&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I started looking for existing solutions. There were a few VS Code extensions that helped with Python environments, but nothing that gave me the seamless, zero-friction experience I wanted for both Python and Node.js projects.&lt;/p&gt;

&lt;p&gt;That's when I decided: &lt;strong&gt;"I'm going to build this myself."&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built: Smart Conda Workspace
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Smart Conda Workspace&lt;/strong&gt; is a VS Code extension that automatically configures your terminal to use the right conda environment for your project. No more manual &lt;code&gt;conda activate&lt;/code&gt; commands. No more forgetting which environment goes with which project.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Features:
&lt;/h3&gt;

&lt;p&gt;✅ &lt;strong&gt;Zero-friction setup&lt;/strong&gt;: One command to configure everything&lt;br&gt;
✅ &lt;strong&gt;Multi-language support&lt;/strong&gt;: Works with Python AND Node.js projects&lt;br&gt;
✅ &lt;strong&gt;Cross-platform&lt;/strong&gt;: Windows, macOS, and Linux&lt;br&gt;
✅ &lt;strong&gt;Multi-shell support&lt;/strong&gt;: Automatically detects and configures Zsh, Bash, or PowerShell&lt;br&gt;
✅ &lt;strong&gt;Project memory&lt;/strong&gt;: Saves settings in a &lt;code&gt;.conda.workspace&lt;/code&gt; file&lt;/p&gt;
&lt;h2&gt;
  
  
  How It Works (The Technical Bits)
&lt;/h2&gt;

&lt;p&gt;The extension leverages VS Code's powerful Extension API to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Detect available conda environments&lt;/strong&gt; using the conda CLI&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integrate with VS Code's terminal system&lt;/strong&gt; to modify shell initialization&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Persist configuration&lt;/strong&gt; at the project level&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto-configure shell profiles&lt;/strong&gt; (&lt;code&gt;.zshrc&lt;/code&gt;, &lt;code&gt;.bashrc&lt;/code&gt;, PowerShell profiles)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here's the user flow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Open your project in VS Code
2. Press Cmd+Shift+P (or Ctrl+Shift+P)
3. Type "Smart Conda: Configure Workspace"
4. Select your desired conda environment
5. That's it! Terminal automatically uses the right environment
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The Magic Behind the Scenes
&lt;/h3&gt;

&lt;p&gt;When you configure a workspace, the extension:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Detects your shell type (Zsh/Bash/PowerShell)&lt;/li&gt;
&lt;li&gt;Modifies the VS Code terminal integration settings&lt;/li&gt;
&lt;li&gt;Creates a &lt;code&gt;.conda.workspace&lt;/code&gt; file to remember your choice&lt;/li&gt;
&lt;li&gt;Sets up automatic environment activation for future sessions&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why I Chose JavaScript Over TypeScript
&lt;/h2&gt;

&lt;p&gt;As a first-time extension developer, I made the deliberate choice to use &lt;strong&gt;vanilla JavaScript&lt;/strong&gt; instead of TypeScript. Here's why:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Faster iteration&lt;/strong&gt;: No compilation step meant faster testing cycles&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simpler debugging&lt;/strong&gt;: Direct source-to-runtime mapping&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lower complexity&lt;/strong&gt;: One less layer of abstraction to learn&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Immediate gratification&lt;/strong&gt;: Code changes reflected instantly&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;While TypeScript has its advantages for larger projects, JavaScript was perfect for this focused solution.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Development Process
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Research Phase (Week 1)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Studied VS Code Extension API documentation&lt;/li&gt;
&lt;li&gt;Analyzed existing conda/Python extensions&lt;/li&gt;
&lt;li&gt;Understood terminal integration capabilities&lt;/li&gt;
&lt;li&gt;Researched cross-platform shell differences&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  MVP Development (Week 2-3)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Built basic environment detection&lt;/li&gt;
&lt;li&gt;Implemented VS Code command registration&lt;/li&gt;
&lt;li&gt;Created simple UI for environment selection&lt;/li&gt;
&lt;li&gt;Added basic error handling&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Polish Phase (Week 4)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Added cross-platform support&lt;/li&gt;
&lt;li&gt;Implemented persistent configuration&lt;/li&gt;
&lt;li&gt;Created proper workspace integration&lt;/li&gt;
&lt;li&gt;Added comprehensive error handling&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Publishing (Week 5)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Created marketplace assets&lt;/li&gt;
&lt;li&gt;Wrote documentation&lt;/li&gt;
&lt;li&gt;Set up GitHub repository&lt;/li&gt;
&lt;li&gt;Published to VS Code Marketplace&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Challenges I Faced
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Cross-Platform Shell Differences
&lt;/h3&gt;

&lt;p&gt;Different operating systems use different shells with different syntax:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;macOS/Linux&lt;/strong&gt;: Bash/Zsh with POSIX-style commands&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Windows&lt;/strong&gt;: PowerShell with completely different syntax&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;: Dynamic shell detection and platform-specific configuration generation.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. VS Code Terminal Integration Complexity
&lt;/h3&gt;

&lt;p&gt;VS Code's terminal system is powerful but complex. Understanding how to properly integrate with terminal profiles took significant research.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;: Deep dive into VS Code's terminal API documentation and studying existing extensions.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Conda CLI Variations
&lt;/h3&gt;

&lt;p&gt;Different conda installations (Miniconda vs Anaconda) can have slightly different behaviors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;: Robust error handling and fallback mechanisms.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Technical Skills
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;VS Code Extension API&lt;/strong&gt;: Deep understanding of commands, configuration, and terminal integration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-platform development&lt;/strong&gt;: Handling different OS environments gracefully&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shell scripting&lt;/strong&gt;: Working with Bash, Zsh, and PowerShell programmatically&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Product Development
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;User experience design&lt;/strong&gt;: Reducing friction is everything&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation importance&lt;/strong&gt;: Clear setup instructions are crucial&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Iteration value&lt;/strong&gt;: Start simple, add complexity gradually&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Personal Growth
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Shipping mindset&lt;/strong&gt;: Perfect is the enemy of done&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Problem-solving approach&lt;/strong&gt;: Sometimes you have to build the tool you need&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open source contribution&lt;/strong&gt;: The joy of solving problems for others&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Impact
&lt;/h2&gt;

&lt;p&gt;Since publishing Smart Conda Workspace, I've received feedback from developers who were facing the exact same frustration. The solution resonated because it addressed a real, daily pain point.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key metrics after launch:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Downloads from VS Code Marketplace growing steadily&lt;/li&gt;
&lt;li&gt;Positive user reviews highlighting time savings&lt;/li&gt;
&lt;li&gt;Feature requests showing real-world usage&lt;/li&gt;
&lt;li&gt;Other developers contributing ideas and improvements&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;The extension works great for its core use case, but there's always room for improvement:&lt;/p&gt;

&lt;h3&gt;
  
  
  Planned Features:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Auto-detection&lt;/strong&gt;: Automatically suggest environments based on project files&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Environment creation&lt;/strong&gt;: Create new conda environments directly from VS Code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dependency management&lt;/strong&gt;: Integration with &lt;code&gt;environment.yml&lt;/code&gt; files&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Team sharing&lt;/strong&gt;: Better support for team environment configurations&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Technical Improvements:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Performance optimization&lt;/strong&gt;: Faster environment detection&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Better error messages&lt;/strong&gt;: More helpful troubleshooting guidance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integration expansion&lt;/strong&gt;: Support for more project types&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  For Fellow Developers: Key Takeaways
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Start with Your Own Pain Points
&lt;/h3&gt;

&lt;p&gt;The best projects solve problems you personally experience. If it annoys you daily, it probably annoys others too.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Choose the Right Tool for the Job
&lt;/h3&gt;

&lt;p&gt;Don't over-engineer. JavaScript was perfect for this project, even though TypeScript might seem "more professional."&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Focus on User Experience
&lt;/h3&gt;

&lt;p&gt;Technical complexity should be hidden from users. The best tools feel like magic.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Ship Early, Iterate Often
&lt;/h3&gt;

&lt;p&gt;My first version wasn't perfect, but it solved the core problem. User feedback guided improvements.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Documentation Is Product
&lt;/h3&gt;

&lt;p&gt;Clear setup instructions and good documentation are as important as the code itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It Yourself
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Smart Conda Workspace&lt;/strong&gt; is completely free and available in the VS Code Marketplace. If you work with conda environments, give it a try:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install the extension from VS Code Marketplace&lt;/li&gt;
&lt;li&gt;Open a project with conda environments&lt;/li&gt;
&lt;li&gt;Press &lt;code&gt;Cmd+Shift+P&lt;/code&gt; → "Smart Conda: Configure Workspace"&lt;/li&gt;
&lt;li&gt;Select your environment&lt;/li&gt;
&lt;li&gt;Enjoy never typing &lt;code&gt;conda activate&lt;/code&gt; again!&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;GitHub Repository&lt;/strong&gt;: [&lt;a href="https://github.com/AntonioDEM/smart-conda-terminal/tree/main" rel="noopener noreferrer"&gt;https://github.com/AntonioDEM/smart-conda-terminal/tree/main&lt;/a&gt;]&lt;/p&gt;

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

&lt;p&gt;Building Smart Conda Workspace taught me that sometimes the best solutions are the simple ones. We don't always need complex architectures or cutting-edge technologies. Sometimes we just need to eliminate one small friction point that happens a hundred times a day.&lt;/p&gt;

&lt;p&gt;The goal wasn't to revolutionize development workflows. It was to save developers 30 seconds and a bit of mental overhead every time they opened a terminal. Those 30 seconds add up.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What daily friction points are you experiencing in your development workflow?&lt;/strong&gt; Maybe it's time to build the tool you've been wishing existed.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;If you enjoyed this article, consider trying Smart Conda Workspace and leaving feedback. As a solo developer, every bit of input helps make the tool better for everyone.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Have questions about VS Code extension development or want to discuss conda workflows? Drop a comment below or reach out!&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; #VSCode #Python #NodeJS #DeveloperTools #Conda #ExtensionDevelopment #JavaScript #Productivity #OpenSource&lt;/p&gt;

</description>
      <category>vscode</category>
      <category>tutorial</category>
      <category>tooling</category>
      <category>python</category>
    </item>
  </channel>
</rss>
