<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
      <title>Victor Santos</title>
      <link>https://vss.dev</link>
      <description>Victor Santos, full-stack developer. Posts, tips, and a career changelog, browsable as a code editor.</description>
      <generator>Zola</generator>
      <language>en</language>
      <atom:link href="https://vss.dev/rss.xml" rel="self" type="application/rss+xml"/>
      <lastBuildDate>Wed, 03 Jun 2026 00:00:00 +0000</lastBuildDate>
      <item>
          <title>Commands worth keeping around</title>
          <pubDate>Wed, 03 Jun 2026 00:00:00 +0000</pubDate>
          <author>Victor Santos</author>
          <link>https://vss.dev/posts/commands-worth-keeping-around/</link>
          <guid>https://vss.dev/posts/commands-worth-keeping-around/</guid>
          <description xml:base="https://vss.dev/posts/commands-worth-keeping-around/">&lt;h1 id=&quot;commands-worth-keeping-around&quot;&gt;Commands worth keeping around&lt;&#x2F;h1&gt;
&lt;p&gt;This is a running list of small commands that solve annoying development
workflow problems.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;stop-windows-from-content-indexing-noisy-folders&quot;&gt;Stop Windows from content-indexing noisy folders&lt;&#x2F;h2&gt;
&lt;p&gt;Some folders are useful to keep on disk but not useful to search through
with Windows indexing. A good example is &lt;code&gt;node_modules&lt;&#x2F;code&gt;: thousands of
dependency files that can make indexing noisier than it needs to be.&lt;&#x2F;p&gt;
&lt;p&gt;To tell Windows not to content-index a folder:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;powershell&quot;&gt;attrib +I &amp;quot;C:\folder\not\to\index&amp;quot; &#x2F;S &#x2F;D
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;What each part does:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;+I&lt;&#x2F;code&gt; sets the &quot;not content indexed&quot; attribute&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;&#x2F;S&lt;&#x2F;code&gt; applies it to files inside subfolders&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;&#x2F;D&lt;&#x2F;code&gt; applies it to folders too&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;This is especially useful for generated or dependency-heavy folders:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;powershell&quot;&gt;attrib +I &amp;quot;C:\path\to\project\node_modules&amp;quot; &#x2F;S &#x2F;D
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This does not exclude the folder from OneDrive sync. It only tells
Windows Search not to content-index those files.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Things to pay attention to when building web applications</title>
          <pubDate>Tue, 02 Jun 2026 00:00:00 +0000</pubDate>
          <author>Victor Santos</author>
          <link>https://vss.dev/posts/things-to-pay-attention-to-when-building-web-applications/</link>
          <guid>https://vss.dev/posts/things-to-pay-attention-to-when-building-web-applications/</guid>
          <description xml:base="https://vss.dev/posts/things-to-pay-attention-to-when-building-web-applications/">&lt;h1 id=&quot;things-to-pay-attention-to-when-building-web-applications&quot;&gt;Things to pay attention to when building web applications&lt;&#x2F;h1&gt;
&lt;p&gt;This is a running list of small details I do not want to forget when
building web applications.&lt;&#x2F;p&gt;
&lt;p&gt;Some will be about forms. Some will be about accessibility,
performance, browser behavior, APIs, deployment, or anything else that
only becomes obvious after the product is in front of real users.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;disable-password-manager-suggestions-on-non-login-text-fields&quot;&gt;Disable password manager suggestions on non-login text fields&lt;&#x2F;h2&gt;
&lt;p&gt;If a field is for search, filtering, tagging, naming a project, writing a
note, or entering any text that is not authentication data, tell password
managers to leave it alone.&lt;&#x2F;p&gt;
&lt;p&gt;The common attributes are:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;1Password: &lt;code&gt;data-1p-ignore&lt;&#x2F;code&gt; or &lt;code&gt;data-op-ignore&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;LastPass: &lt;code&gt;data-lpignore=&quot;true&quot;&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Bitwarden: &lt;code&gt;data-bwignore&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Dashlane: &lt;code&gt;data-form-type=&quot;other&quot;&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;In practice, I usually put the set on text inputs that should never open
a credential picker:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;html&quot;&gt;&amp;lt;input
  type=&amp;quot;text&amp;quot;
  name=&amp;quot;project_name&amp;quot;
  autocomplete=&amp;quot;off&amp;quot;
  data-1p-ignore
  data-op-ignore
  data-lpignore=&amp;quot;true&amp;quot;
  data-bwignore
  data-form-type=&amp;quot;other&amp;quot;
&#x2F;&amp;gt;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This is not a replacement for good form semantics. Login forms should
still use proper &lt;code&gt;autocomplete&lt;&#x2F;code&gt; values like &lt;code&gt;username&lt;&#x2F;code&gt;,
&lt;code&gt;current-password&lt;&#x2F;code&gt;, and &lt;code&gt;new-password&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;The point is simpler: do not let authentication tooling interrupt fields
that have nothing to do with authentication.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Building vss.dev as a code editor</title>
          <pubDate>Sat, 30 May 2026 00:00:00 +0000</pubDate>
          <author>Victor Santos</author>
          <link>https://vss.dev/posts/building-vss-dev/</link>
          <guid>https://vss.dev/posts/building-vss-dev/</guid>
          <description xml:base="https://vss.dev/posts/building-vss-dev/">&lt;h1 id=&quot;building-vss-dev-as-a-code-editor&quot;&gt;Building vss.dev as a code editor&lt;&#x2F;h1&gt;
&lt;p&gt;I wanted my site to &lt;em&gt;be&lt;&#x2F;em&gt; the thing it talks about. So instead of a hero
section and a wall of buzzwords, you&#x27;re looking at an editor, and every
part of me is a file you can open.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-constraint-that-made-it-fun&quot;&gt;The constraint that made it fun&lt;&#x2F;h2&gt;
&lt;p&gt;Content is plain markdown. The pages are pre-rendered to static HTML by
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.getzola.org&quot;&gt;Zola&lt;&#x2F;a&gt;, so there&#x27;s no front-end framework and
no client-side rendering to wait on. If I&#x27;m going to put this on a
résumé, the source should be as honest as the content: view-source and
it&#x27;s all right there.&lt;&#x2F;p&gt;
&lt;p&gt;That meant writing the editor chrome myself, including a file tree, tabs,
a command palette, and a syntax highlighter for the source view:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;js&quot;&gt;function openFile(path) {
  if (!tabs.includes(path)) tabs.push(path);
  active = path;
  render();
}
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;the-one-detail-i-care-about&quot;&gt;The one detail I care about&lt;&#x2F;h2&gt;
&lt;p&gt;The editor chrome is monospaced. That&#x27;s the costume. But the moment you
read a post, the words are set in a serif. Code is for machines; writing
is for people. Letting those two voices sit side by side is the whole
idea.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-i-d-tell-past-me&quot;&gt;What I&#x27;d tell past me&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Ship the small version. A site you launch beats a redesign you don&#x27;t.&lt;&#x2F;li&gt;
&lt;li&gt;Constraints are a gift. &quot;Plain markdown, no framework&quot; killed a hundred decisions.&lt;&#x2F;li&gt;
&lt;li&gt;Make the thing you&#x27;d want to find.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Want the short version of how I work? Read &lt;a href=&quot;&#x2F;tips&#x2F;the-five-minute-rule&#x2F;&quot;&gt;the five-minute rule&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Escaping the tutorial trap</title>
          <pubDate>Sat, 18 Apr 2026 00:00:00 +0000</pubDate>
          <author>Victor Santos</author>
          <link>https://vss.dev/posts/escaping-the-tutorial-trap/</link>
          <guid>https://vss.dev/posts/escaping-the-tutorial-trap/</guid>
          <description xml:base="https://vss.dev/posts/escaping-the-tutorial-trap/">&lt;h1 id=&quot;escaping-the-tutorial-trap&quot;&gt;Escaping the tutorial trap&lt;&#x2F;h1&gt;
&lt;p&gt;For a while I measured progress in courses finished. Neat checkmarks,
zero scars. The problem with tutorials is they remove the one thing that
actually teaches you: &lt;em&gt;getting stuck&lt;&#x2F;em&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-shift&quot;&gt;The shift&lt;&#x2F;h2&gt;
&lt;p&gt;I started a rule: for every hour of watching, an hour of building
something that wasn&#x27;t in the video. Break it, fix it, look it up only
after I&#x27;d been confused on purpose.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;You don&#x27;t learn to debug by reading about debugging.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;h2 id=&quot;what-changed&quot;&gt;What changed&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;I stopped fearing the red error text and started reading it&lt;&#x2F;li&gt;
&lt;li&gt;My questions got sharper, and so did the answers&lt;&#x2F;li&gt;
&lt;li&gt;I built things I could actually point to&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The checkmarks felt good. The scars taught me more.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Debugging by bisection</title>
          <pubDate>Mon, 02 Mar 2026 00:00:00 +0000</pubDate>
          <author>Victor Santos</author>
          <link>https://vss.dev/tips/debugging-by-bisection/</link>
          <guid>https://vss.dev/tips/debugging-by-bisection/</guid>
          <description xml:base="https://vss.dev/tips/debugging-by-bisection/">&lt;h1 id=&quot;debugging-by-bisection&quot;&gt;Debugging by bisection&lt;&#x2F;h1&gt;
&lt;p&gt;When something breaks and you have no idea where, don&#x27;t read every line.
&lt;strong&gt;Cut the problem in half.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Comment out half the code. Does the bug survive? Now you know which half.&lt;&#x2F;li&gt;
&lt;li&gt;Repeat. Each step throws away 50% of the search space.&lt;&#x2F;li&gt;
&lt;li&gt;A bug hiding in 1,000 lines is about 10 halvings away from caught.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Same trick, different name. It lives in &lt;code&gt;git bisect&lt;&#x2F;code&gt;, which binary-searches
your commit history for the one that broke things:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;sh&quot;&gt;git bisect start
git bisect bad            # current commit is broken
git bisect good v1.4.0    # this old one worked
# git checks out the midpoint; you test and mark good&#x2F;bad
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Stop guessing. Start halving.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>The five-minute rule</title>
          <pubDate>Tue, 10 Feb 2026 00:00:00 +0000</pubDate>
          <author>Victor Santos</author>
          <link>https://vss.dev/tips/the-five-minute-rule/</link>
          <guid>https://vss.dev/tips/the-five-minute-rule/</guid>
          <description xml:base="https://vss.dev/tips/the-five-minute-rule/">&lt;h1 id=&quot;the-five-minute-rule&quot;&gt;The five-minute rule&lt;&#x2F;h1&gt;
&lt;p&gt;Before asking anyone (a teammate, a forum, a model), give yourself a
strict &lt;strong&gt;five minutes&lt;&#x2F;strong&gt; to write down three things:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;What I expected to happen&lt;&#x2F;li&gt;
&lt;li&gt;What actually happened&lt;&#x2F;li&gt;
&lt;li&gt;What I&#x27;ve already tried&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Two outcomes, both good: half the time, writing it out &lt;em&gt;is&lt;&#x2F;em&gt; the fix. The
other half, you&#x27;ve just authored a question people actually want to
answer.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;A good question is a debugged thought.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
</description>
      </item>
    </channel>
</rss>
