<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Qwerty</title>
    <description>The latest articles on DEV Community by Qwerty (@ackvf).</description>
    <link>https://dev.to/ackvf</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%2F7257%2Fed159052-aa93-4575-a8ed-703231979590.jpg</url>
      <title>DEV Community: Qwerty</title>
      <link>https://dev.to/ackvf</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ackvf"/>
    <language>en</language>
    <item>
      <title>Automatically hide _assets folders in Obsidian (until you need them)</title>
      <dc:creator>Qwerty</dc:creator>
      <pubDate>Tue, 31 Mar 2026 01:28:00 +0000</pubDate>
      <link>https://dev.to/ackvf/automatically-hide-assets-folders-in-obsidian-until-you-need-them-505i</link>
      <guid>https://dev.to/ackvf/automatically-hide-assets-folders-in-obsidian-until-you-need-them-505i</guid>
      <description>&lt;p&gt;This &lt;em&gt;used&lt;/em&gt; to be &lt;strong&gt;you&lt;/strong&gt; &lt;em&gt;(and by you I mean &lt;strong&gt;me&lt;/strong&gt;)&lt;/em&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Articles/
  Some Guide/
    _Some Guide.md
    Another take.png
    Final result.png
    How to do that.png
    How to do this.png
    ...
  Another Article/
    _Another Article.md
    Screenshot 1.png
    Screenshot 2.png
    ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This &lt;em&gt;is&lt;/em&gt; &lt;strong&gt;you&lt;/strong&gt; with the &lt;a href="https://github.com/mnaoumov/obsidian-custom-attachment-location" rel="noopener noreferrer"&gt;Custom Attachment Location&lt;/a&gt; plugin.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Articles/
  &amp;gt; Article A_assets/
  v Article B_assets/
      file-1.png
      file-2.png
      ...
  &amp;gt; Article C_assets/
    Article A.md
    Article B.md
    Article C.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It works, it keeps things tidy, but after a while the file explorer gets noisy anyway.&lt;/p&gt;

&lt;p&gt;So I looked around.. , and around.. , and found that it was pretty common wish on the Obsidian Forums, &lt;a href="https://forum.obsidian.md/t/enable-use-access-to-hidden-files-and-folders-starting-with-a-dot-dotfiles-dotfolders-within-obsidian/26908" rel="noopener noreferrer"&gt;one such&lt;/a&gt; dated back to 2021.&lt;/p&gt;

&lt;p&gt;After digging around for a bit more I found a stupidly simple brute-force CSS snippet....&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* hide path's with __before and ending with__ */&lt;/span&gt;
&lt;span class="nc"&gt;.nav-folder-title&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;data-path&lt;/span&gt;&lt;span class="o"&gt;^=&lt;/span&gt;&lt;span class="s1"&gt;"__"&lt;/span&gt;&lt;span class="o"&gt;][&lt;/span&gt;&lt;span class="nt"&gt;data-path&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"__"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🤯🤯🤯🤯💡💡💡 and it hit me.&lt;/p&gt;

&lt;p&gt;This article is my take on this CSS-only "hack" that you can drop straight into &lt;code&gt;Obsidian &amp;gt; Appearance &amp;gt; CSS snippets&lt;/code&gt; without installing anything.&lt;/p&gt;




&lt;h2&gt;
  
  
  What this snippet does
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Shrinks every folder whose name ends with &lt;code&gt;_assets&lt;/code&gt; &lt;em&gt;(configurable)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Expands the &lt;code&gt;_assets&lt;/code&gt; folder &lt;strong&gt;only for the currently active folder&lt;/strong&gt; &lt;em&gt;(when one of its notes or its assets is focused/active)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Includes optional css for scrolling within assets.&lt;/li&gt;
&lt;li&gt;Includes an optional “warning” highlight to identify folders that are expanded but visually collapsed &lt;em&gt;(more on why below)&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Note: In the gif below, the two visible collapsed assets folders are displayed as a thin gray line (customizable).&lt;/em&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frmucagxgwt5zzp7sfoik.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frmucagxgwt5zzp7sfoik.gif" alt="Displays an animation of the Obsidian File explorer with expanded and shrinked assets folders."&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  "Install" (Obsidian CSS snippet)
&lt;/h2&gt;

&lt;p&gt;Recommended: Use the &lt;a href="https://github.com/Zachatoo/obsidian-css-editor" rel="noopener noreferrer"&gt;CSS Editor&lt;/a&gt; plugin.&lt;/p&gt;

&lt;p&gt;With the editor:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Use the CSS Editor from the sidebar Ribbon to update an existing css snippet or create a new one, e.g. &lt;code&gt;hide-assets-folders.css&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Paste the CSS code below into it&lt;/li&gt;
&lt;li&gt;It should already be enabled. You can check by using the CSS Editor button again.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Without the editor:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Copy the snippet into a file, e.g. &lt;code&gt;hide-assets-folders.css&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Place it in your vault’s snippets folder:

&lt;ul&gt;
&lt;li&gt;Settings → Appearance → CSS snippets → (open snippets folder)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Enable it in Settings → Appearance → CSS snippets&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Recommended: Use the &lt;a href="https://github.com/mnaoumov/obsidian-custom-attachment-location" rel="noopener noreferrer"&gt;Custom Attachment Location&lt;/a&gt; plugin to keep your attachments organized in &lt;code&gt;_assets&lt;/code&gt; folders next to their notes.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;configure "Location for new attachments": &lt;code&gt;./${noteFileName}_assets&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The CSS snippet
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* Hide assets folders – https://forum.obsidian.md/t/automatically-hide-assets-folder-when-not-focused/111617 */&lt;/span&gt;
&lt;span class="nc"&gt;.nav-folder&lt;/span&gt;&lt;span class="nd"&gt;:has&lt;/span&gt;&lt;span class="o"&gt;(&amp;gt;[&lt;/span&gt;&lt;span class="nt"&gt;data-path&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;'_assets'&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c"&gt;/* Base style for every assets folder (visible / hidden). */&lt;/span&gt;
  &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;color-mix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;srgb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;currentColor&lt;/span&gt; &lt;span class="m"&gt;5%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;transparent&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c"&gt;/* Highlight all assets folders. */&lt;/span&gt;
  &lt;span class="nl"&gt;max-height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;4px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* The height of the hidden assets folder. */&lt;/span&gt;
  &lt;span class="nl"&gt;overflow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;hidden&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* Hide everything beyond the max-height. */&lt;/span&gt;
  &lt;span class="nl"&gt;transition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;max-height&lt;/span&gt; &lt;span class="m"&gt;500ms&lt;/span&gt; &lt;span class="n"&gt;ease-in-out&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* Enable smooth expand/shrink animation. */&lt;/span&gt;

  &lt;span class="c"&gt;/* Style overrides for active folders (has an .is-active child). */&lt;/span&gt;
  &lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="py"&gt;nav-folder-children&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;has&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;*&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is-active&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="err"&gt;&amp;gt;&lt;/span&gt; &lt;span class="err"&gt;&amp;amp;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nav-folder-children&lt;/span&gt; &lt;span class="err"&gt;&amp;gt;&lt;/span&gt; &lt;span class="err"&gt;&amp;amp;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;has&lt;/span&gt;&lt;span class="p"&gt;(.&lt;/span&gt;&lt;span class="n"&gt;is-active&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c"&gt;/* When the assets folder itself has an active asset. */&lt;/span&gt;
  &lt;span class="err"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;color-mix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;srgb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;currentColor&lt;/span&gt; &lt;span class="m"&gt;3%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;transparent&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c"&gt;/* Highlight for active expanded assets folders. */&lt;/span&gt;
    &lt;span class="nl"&gt;max-height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;150px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* Some large number is needed for the smooth effect. Too large ruins the animation, too small may limit assets visibility. Set at least 25px larger than the scrollable area below. */&lt;/span&gt;

    &lt;span class="c"&gt;/* Optional: Enable scroll within assets folders. */&lt;/span&gt;
    &lt;span class="err"&gt;.tree-item-children&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;max-height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;125px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* Max height of the scrollable area. */&lt;/span&gt;
      &lt;span class="nl"&gt;overflow-y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="err"&gt;}&lt;/span&gt;
&lt;span class="err"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* Optional: Highlight forgotten NOT-collapsed assets folders that break menu items rendering due to expecting their actual height. */&lt;/span&gt;
&lt;span class="nc"&gt;.nav-folder-children&lt;/span&gt;&lt;span class="nd"&gt;:not&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;:has&lt;/span&gt;&lt;span class="o"&gt;(&amp;gt;*&amp;gt;&lt;/span&gt;&lt;span class="nc"&gt;.is-active&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;.nav-folder&lt;/span&gt;&lt;span class="nd"&gt;:not&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;.is-collapsed&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nd"&gt;:has&lt;/span&gt;&lt;span class="o"&gt;(&amp;gt;[&lt;/span&gt;&lt;span class="nt"&gt;data-path&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;'_assets'&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt;&lt;span class="nd"&gt;:not&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;:has&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;.is-active&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;color-mix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;srgb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;red&lt;/span&gt; &lt;span class="m"&gt;30%&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;transparent&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nl"&gt;max-height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c"&gt;/* Make it slightly larger so that it can be clicked to hide comfortably. */&lt;/span&gt;
  &lt;span class="err"&gt;*&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;transparent&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="err"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  How it works (quickly)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;It targets folders whose &lt;code&gt;data-path&lt;/code&gt; ends in &lt;code&gt;_assets&lt;/code&gt; using:

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;:has(&amp;gt;[data-path$='_assets'])&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;“Hidden” is implemented by collapsing the folder’s height:

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;max-height: 4px; overflow: hidden;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;When a note within that folder becomes active (&lt;code&gt;.is-active&lt;/code&gt;), the child &lt;code&gt;_assets&lt;/code&gt; folder becomes “tall” again:

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;max-height: 1000px;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Obsidian’s file explorer DOM structure makes &lt;code&gt;:has(...)&lt;/code&gt; a surprisingly powerful tool for this kind of UI behavior.&lt;/p&gt;




&lt;h2&gt;
  
  
  Known drawbacks (and why they happen)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1) If there are multiple &lt;code&gt;_assets&lt;/code&gt; folders in the active folder…
&lt;/h3&gt;

&lt;p&gt;With pure CSS, you can’t easily say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Show &lt;em&gt;only&lt;/em&gt; the &lt;code&gt;_assets&lt;/code&gt; folder that corresponds to the active note.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;CSS can only express relationships like “some descendant/sibling is active”, not “the descendant matches &lt;em&gt;this&lt;/em&gt; sibling by name”.&lt;/p&gt;

&lt;p&gt;So if your active folder contains multiple &lt;code&gt;_assets&lt;/code&gt; folders, the logic can’t reliably reveal just one of them based on the current note.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Possible fix:&lt;/strong&gt; a small JS snippet (via something like &lt;em&gt;JavaScript Init&lt;/em&gt;) or a tiny plugin that toggles a class on the “correct” assets folder.&lt;/p&gt;

&lt;h3&gt;
  
  
  2) “Hidden” folders still affect virtualization / scrolling
&lt;/h3&gt;

&lt;p&gt;This one is subtle.&lt;/p&gt;

&lt;p&gt;Even though the folders are visually reduced, the file explorer’s rendering system still “counts” their size as if they were normally present. This is especially problematic when they’re expanded but visually limited by CSS. Obsidian virtualizes long lists (it dynamically renders/unrenders items based on scroll). When invisible elements inflate the expected height, rendering can happen too early/late, and you can end up with odd behavior like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;items being unrendered sooner than expected&lt;/li&gt;
&lt;li&gt;the active note being pushed out of the rendered range&lt;/li&gt;
&lt;li&gt;the &lt;code&gt;_assets&lt;/code&gt; folder disappearing again because the active item DOM isn’t present anymore&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s why the snippet includes a “warning” rule that highlights in red &lt;code&gt;_assets&lt;/code&gt; folders that are &lt;strong&gt;not collapsed&lt;/strong&gt; (expanded state) but currently hidden. In practice, it’s a signal to collapse them for smoother explorer behavior.&lt;/p&gt;




&lt;h2&gt;
  
  
  Recommended usage pattern
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Use a consistent naming scheme like: &lt;code&gt;SomeNote_assets/&lt;/code&gt; or &lt;code&gt;Folder_assets/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Keep &lt;code&gt;_assets&lt;/code&gt; folders collapsed by default&lt;/li&gt;
&lt;li&gt;Let the snippet reveal them only when you’re inside that folder&lt;/li&gt;
&lt;li&gt;If you run into the virtualization glitch often, consider:

&lt;ul&gt;
&lt;li&gt;manually collapsing assets folders&lt;/li&gt;
&lt;li&gt;or moving to a JS-based approach that truly removes/hides nodes rather than just shrinking them visually&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  What I might build next
&lt;/h2&gt;

&lt;p&gt;If there’s interest (or if it annoys me enough), the next step is a tiny JS helper/plugin that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;identifies the active note&lt;/li&gt;
&lt;li&gt;derives the “matching” &lt;code&gt;_assets&lt;/code&gt; folder name&lt;/li&gt;
&lt;li&gt;toggles a class on only that folder&lt;/li&gt;
&lt;li&gt;optionally collapses other &lt;code&gt;_assets&lt;/code&gt; folders automatically to prevent the virtualization issues&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Credits / inspiration
&lt;/h2&gt;

&lt;p&gt;This is based on and inspired by the forum CSS approach. Originally introduced in &lt;a href="https://forum.obsidian.md/t/automatically-hide-assets-folder-when-not-focused/111617" rel="noopener noreferrer"&gt;this thread&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>obsidian</category>
      <category>css</category>
      <category>guide</category>
    </item>
    <item>
      <title>Delightful TypeScript Mock Generator - Generate Realistic Test Data from Your Interfaces</title>
      <dc:creator>Qwerty</dc:creator>
      <pubDate>Wed, 14 Jan 2026 02:57:31 +0000</pubDate>
      <link>https://dev.to/ackvf/delightful-typescript-mock-generator-generate-realistic-test-data-from-your-interfaces-aa</link>
      <guid>https://dev.to/ackvf/delightful-typescript-mock-generator-generate-realistic-test-data-from-your-interfaces-aa</guid>
      <description>&lt;p&gt;Hello fellow developers! 👋&lt;/p&gt;

&lt;p&gt;I was frustrated developing with a single example json file, so I called to the internet, but the internet didn't call back. The only thing I found were other lost souls looking for answers... so I made my own and I find it incredibly delightful to play with. I wanted to share it with you, because I think you might like it too.&lt;br&gt;&lt;br&gt;
It's a &lt;strong&gt;TypeScript Mock Data Generator&lt;/strong&gt; that creates realistic test data from your interfaces or other JSONs.&lt;/p&gt;

&lt;p&gt;Instead of manually writing mock data or struggling with generic generators, just paste your TypeScript interface or existing JSON example and get properly structured, realistic data instantly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔗 Try it live:&lt;/strong&gt; &lt;a href="https://ts-mock-generator.qwerty.art/" rel="noopener noreferrer"&gt;https://ts-mock-generator.qwerty.art/&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;🔗 GitHub:&lt;/strong&gt; &lt;a href="https://github.com/ackvf/ts-mock-generator" rel="noopener noreferrer"&gt;https://github.com/ackvf/ts-mock-generator&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Why I Built This
&lt;/h2&gt;

&lt;p&gt;I was tired of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Waiting for backend APIs and working with single static example&lt;/li&gt;
&lt;li&gt;Manually creating mock data for development or tests&lt;/li&gt;
&lt;li&gt;Getting &lt;code&gt;{ name: "string", email: "string" }&lt;/code&gt; from basic generators&lt;/li&gt;
&lt;li&gt;Losing time on tedious setup for prototypes&lt;/li&gt;
&lt;li&gt;Creating inconsistent test data across projects&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I made a tool that just... works. Copy, click, paste, BAM!, click and you're done. Simple as that.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Cool Parts
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1. Smart Field Recognition
&lt;/h3&gt;

&lt;p&gt;The generator actually reads your field names and generates appropriate data. No configuration needed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;       &lt;span class="c1"&gt;// → "alex.chen@example.com"&lt;/span&gt;
  &lt;span class="nx"&gt;firstName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;   &lt;span class="c1"&gt;// → "Alex"&lt;/span&gt;
  &lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;         &lt;span class="c1"&gt;// → 32&lt;/span&gt;
  &lt;span class="nx"&gt;city&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;        &lt;span class="c1"&gt;// → "San Francisco"&lt;/span&gt;
  &lt;span class="nx"&gt;phoneNumber&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="c1"&gt;// → "+1-555-0123"&lt;/span&gt;
  &lt;span class="nx"&gt;avatar&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;      &lt;span class="c1"&gt;// → "https://cloudflare-ipfs.com/ipfs/..."&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It recognizes &lt;strong&gt;50+ common patterns&lt;/strong&gt;: emails, names, addresses, phone numbers, UUIDs, URLs, dates, prices, and more.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Type Names Matter (The Secret Sauce!)
&lt;/h3&gt;

&lt;p&gt;Can't change property names? Name your types meaningfully, and the generator picks up on it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;First&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;
&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;

&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;Person&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;// Uses the type name as a hint!&lt;/span&gt;
  &lt;span class="nl"&gt;n&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;First&lt;/span&gt;         &lt;span class="c1"&gt;// → "Emma" &lt;/span&gt;
  &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Age&lt;/span&gt;           &lt;span class="c1"&gt;// → 27&lt;/span&gt;
  &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Email&lt;/span&gt;         &lt;span class="c1"&gt;// → "emma@example.com"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. "Invalid" Patterns That Work Beautifully
&lt;/h3&gt;

&lt;p&gt;The tool allows some TypeScript patterns that are technically invalid but create amazing mocks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;First&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;

&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;Data&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// This "breaks" TypeScript index signature rules...&lt;/span&gt;
  &lt;span class="nl"&gt;users&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;First&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="nx"&gt;Age&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; 
  &lt;span class="c1"&gt;// But generates perfect output:&lt;/span&gt;
  &lt;span class="c1"&gt;// { "Emma": 24, "James": 19, "Sofia": 31 }&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is &lt;em&gt;technically&lt;/em&gt; breaking TypeScript rules (type aliases should be transparent), but for mock generation? It's perfect! The generator treats type names as semantic hints.&lt;/p&gt;

&lt;p&gt;The generator tolerates these "violations" because they make for better, more readable mock data!&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Reproducible Results
&lt;/h3&gt;

&lt;p&gt;Set a seed number, get the same data every time:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;Seed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your last 3 seeds are saved and clickable—super handy when you finally clicked enough times to get the perfect random mock, but you clicked one too many!&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Advanced TypeScript Support
&lt;/h3&gt;

&lt;p&gt;It handles the complex stuff too:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Template Literals:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Category&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ELEC&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;FURN&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;CLTH&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;SM&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;MD&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;LG&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;SKU&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;Category&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;-&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;-&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;Size&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;
&lt;span class="c1"&gt;// Generates: "ELEC-8472-LG"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Insane depth is not a problem!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Digit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;3&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;4&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;5&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;6&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;7&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;8&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;9&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;FourDigit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;Digit&lt;/span&gt;&lt;span class="p"&gt;}${&lt;/span&gt;&lt;span class="nx"&gt;Digit&lt;/span&gt;&lt;span class="p"&gt;}${&lt;/span&gt;&lt;span class="nx"&gt;Digit&lt;/span&gt;&lt;span class="p"&gt;}${&lt;/span&gt;&lt;span class="nx"&gt;Digit&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;
&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;CardNumber&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;FourDigit&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;FourDigit&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;FourDigit&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;FourDigit&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;

&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;Card&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;number&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;CardNumber&lt;/span&gt; &lt;span class="c1"&gt;// → "8452 4675 4126 6009",&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Utility Types:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;Config&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;partial&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Partial&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nx"&gt;picked&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Pick&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;email&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nx"&gt;omitted&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Omit&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;password&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nx"&gt;lowercase&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Lowercase&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;  &lt;span class="c1"&gt;// → "john"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Intersection Types:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;Employee&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;info&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="c1"&gt;// Merges into: { name: "John", id: 123, role: "Engineer" }&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;Store&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;inventory&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nx"&gt;categories&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Set&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nx"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="nx"&gt;employees&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="nx"&gt;Age&lt;/span&gt; &lt;span class="c1"&gt;// → "Elbert Funk": 63&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6. JSON ↔ TypeScript
&lt;/h3&gt;

&lt;p&gt;Works both ways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;TypeScript → JSON:&lt;/strong&gt; Generate mock data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JSON → TypeScript:&lt;/strong&gt; Paste API response, get interfaces&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Great for working with external APIs!&lt;/p&gt;

&lt;h2&gt;
  
  
  Real Usage Examples
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Quick prototyping with Realtime output:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The generator updates mock data as you type, so you can quickly iterate on your interfaces and see realistic data instantly. It will not break on errors, just shows nulls until valid.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;BlogPost&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;                            &lt;span class="c1"&gt;// → "b3f1c2e4-5d6a-7b8c-9d0e-f1a2b3c4d5e6"&lt;/span&gt;
  &lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;                         &lt;span class="c1"&gt;// → "Understanding TypeScript Generics"&lt;/span&gt;
  &lt;span class="nx"&gt;author&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;                        &lt;span class="c1"&gt;// → "Sophia Lee"  &lt;/span&gt;
  &lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;stri&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="c1"&gt;// &amp;lt;- still typing     // → null&lt;/span&gt;
  &lt;span class="nx"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;                        &lt;span class="c1"&gt;// → ["typescript", "programming", "webdev"]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Test data:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Always use seed 12345 in tests&lt;/li&gt;
&lt;li&gt;Everyone gets identical mock data&lt;/li&gt;
&lt;li&gt;Tests are reproducible&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Database seeding:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Generate 1000 users&lt;/li&gt;
&lt;li&gt;Seed: 999&lt;/li&gt;
&lt;li&gt;Same data every dev environment reset&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Under the Hood
&lt;/h2&gt;

&lt;p&gt;Built with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Next.js&lt;/strong&gt; for the UI&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TypeScript Compiler API&lt;/strong&gt; for parsing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Faker.js&lt;/strong&gt; for realistic data generation&lt;/li&gt;
&lt;li&gt;Runs 100% in your browser—no backend!&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  About Faker.js
&lt;/h3&gt;

&lt;p&gt;The realistic data comes from &lt;a href="https://fakerjs.dev/" rel="noopener noreferrer"&gt;Faker.js&lt;/a&gt;, which has tons of generators for names, addresses, images, lorem ipsum, and more. The tool maps TypeScript field names to appropriate Faker methods.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Future idea:&lt;/strong&gt; Add knobs and sliders to customize data generation (e.g. age ranges, locales).&lt;/p&gt;

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

&lt;p&gt;Paste this into the generator:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
  &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
  &lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;
  &lt;span class="nx"&gt;contact&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;phone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="nx"&gt;isActive&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt;
  &lt;span class="nx"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;admin&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;guest&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="nx"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;
  &lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;Child&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;Child&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Child&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Address&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;Address&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;street&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
  &lt;span class="nx"&gt;city&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
  &lt;span class="nx"&gt;country&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Child&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;First&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;Digit&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;
&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;First&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Digit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;3&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;4&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;5&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;6&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;7&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;8&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;9&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hit generate and see what happens! ✨&lt;/p&gt;

&lt;h2&gt;
  
  
  One more thing
&lt;/h2&gt;

&lt;p&gt;I almost forgot, it has a &lt;strong&gt;dark mode&lt;/strong&gt;! 🌙 How awesome is that!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqukq36wdhunjr451j5ct.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqukq36wdhunjr451j5ct.jpg" alt="Screenshot with a transition between a dark and a light theme" width="800" height="709"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Open Source &amp;amp; Looking for Ideas
&lt;/h2&gt;

&lt;p&gt;The project is &lt;strong&gt;open source&lt;/strong&gt; and I'd love contributions!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Support for more TypeScript patterns&lt;/li&gt;
&lt;li&gt;Integration with more faker mocking functions, or other mock data libraries&lt;/li&gt;
&lt;li&gt;Custom field mapping configuration&lt;/li&gt;
&lt;li&gt;CLI tool&lt;/li&gt;
&lt;li&gt;VS Code extension&lt;/li&gt;
&lt;li&gt;API&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I am happy to receive Suggestions for improvements and Bug reports.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check it out:&lt;/strong&gt; &lt;a href="https://github.com/ackvf/ts-mock-generator" rel="noopener noreferrer"&gt;https://github.com/ackvf/ts-mock-generator&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping Up
&lt;/h2&gt;

&lt;p&gt;This started as a weekend project and turned into something I just play with all day. It's snappy and so delightful to use. 🤗 If you work with TypeScript and need mock data, give it a shot!&lt;/p&gt;

&lt;p&gt;Found it useful? Star the repo, share it, or drop suggestions in the comments! 🙌&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Stack:&lt;/strong&gt; Next.js, TypeScript, Faker.js, Tailwind CSS, Shadcn/ui, Base UI&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; #typescript #webdev #testing #opensource #mockdata #json&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>webdev</category>
      <category>testing</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Don't get scammed on an interview.</title>
      <dc:creator>Qwerty</dc:creator>
      <pubDate>Wed, 26 Nov 2025 00:19:00 +0000</pubDate>
      <link>https://dev.to/ackvf/dont-get-scammed-on-an-interview-4f92</link>
      <guid>https://dev.to/ackvf/dont-get-scammed-on-an-interview-4f92</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7jjjiobhp478j4gmctj0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7jjjiobhp478j4gmctj0.png" alt="A short haiku: Flags hidden in plain sight. You saw the crimson early. The tears weren't yours. With an image of red flags across a field." width="800" height="1200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Don't get scammed on an interview.
&lt;/h3&gt;

&lt;p&gt;So… I just went through two “interviews” that turned out to be scams. Both followed the same playbook:&lt;br&gt;&lt;br&gt;
they gave me a repo link, told me to share my screen, and asked me to install + run the project during the call.&lt;/p&gt;

&lt;p&gt;On a &lt;em&gt;first&lt;/em&gt; interview.&lt;/p&gt;

&lt;p&gt;That alone feels off, right? But these scammers have gotten smarter. They’ll do the whole friendly intro, talk about the company, show you a project, ask about your past work — the whole thing feels legit until suddenly you’re the one walking &lt;em&gt;them&lt;/em&gt; through a repo on your machine.&lt;/p&gt;

&lt;p&gt;Luckily, I had a gut feeling something wasn’t right. I isolated everything, sandboxed the repo, and ended up finding a bunch of red flags… including a hidden script or a fake MetaMask popup that looked &lt;em&gt;exactly&lt;/em&gt; like the real extension.&lt;/p&gt;

&lt;p&gt;The worst thing is that while I already knew this was a scam, I heard &lt;em&gt;another scammer&lt;/em&gt; in the background doing the same thing to another poor dev. I even saw their cursor moving in a shared Figma file. However, it was hilarious to watch the panic after I wrote this:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fosajnjgnxyy13tgh2w2h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fosajnjgnxyy13tgh2w2h.png" alt="Screenshot from Figma with a comment: " width="800" height="290"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Anyway, this wasn't my first experience either, but seeing how profitable these scams must be, I finally decided to write about it to help other devs avoid getting burned.&lt;br&gt;&lt;br&gt;
Take this as advice from a friend who just dodged a bullet.&lt;/p&gt;
&lt;h2&gt;
  
  
  tl;dr
&lt;/h2&gt;

&lt;p&gt;If you are interest in knowing how to &lt;strong&gt;spot&lt;/strong&gt; these scams, read on, otherwise skip directly to the How to protect yourself section for a detailed guide, or skip all the way to the step-by-step screenshot guide, or just remember these key points:&lt;/p&gt;

&lt;p&gt;If you are in a rush to open unknown repos, use &lt;a href="https://github.com/features/codespaces" rel="noopener noreferrer"&gt;GitHub Codespaces&lt;/a&gt; or &lt;a href="https://codesandbox.io/" rel="noopener noreferrer"&gt;codesandbox&lt;/a&gt; with Copilot or another AI integration to analyze the repo for malicious intent and to run it in a safe environment.&lt;/p&gt;

&lt;p&gt;GitHub &lt;a href="https://github.com/features/codespaces" rel="noopener noreferrer"&gt;codespace&lt;/a&gt; is a VSCode in the browser at &lt;a href="https://github.dev" rel="noopener noreferrer"&gt;github.dev&lt;/a&gt; that gives everyone &lt;a href="https://docs.github.com/en/billing/concepts/product-billing/github-codespaces#free-quota" rel="noopener noreferrer"&gt;60 hr free&lt;/a&gt; compute time every month - ideal also for scoped home assignments.&lt;/p&gt;

&lt;p&gt;Alternatively, you can self-host full VSCode IDE in a docker with &lt;a href="https://github.com/coder/code-server" rel="noopener noreferrer"&gt;code-server&lt;/a&gt;, or just use VSCode Server in a docker and connect &lt;strong&gt;remotely&lt;/strong&gt; with any VSCode. You can also try &lt;a href="https://code.visualstudio.com/docs/devcontainers/containers" rel="noopener noreferrer"&gt;Dev Containers&lt;/a&gt; for free and completely local, that do all that, batteries included.&lt;/p&gt;

&lt;p&gt;Btw, &lt;a href="https://www.reddit.com/r/vscode/comments/1p3yjbs/what_is_the_difference_between_vscodedev_and/" rel="noopener noreferrer"&gt;what is the difference between github.dev and vscode.dev&lt;/a&gt;?&lt;/p&gt;
&lt;h2&gt;
  
  
  Why listen to me?
&lt;/h2&gt;

&lt;p&gt;I am a software developer with 10 years of experience interviewing at real companies. As a remote contractor, I've worked on 20 projects ranging from few months to couple years and the number of interviews done is significantly higher &lt;em&gt;(20 just this year)&lt;/em&gt;. Here are the red flags I noticed.&lt;/p&gt;
&lt;h2&gt;
  
  
  The red flags
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Flags hidden in plain sight.&lt;br&gt;&lt;br&gt;
You saw the crimson early.&lt;br&gt;&lt;br&gt;
The tears weren’t yours.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Different ways to get scammed and the First Red Flags
&lt;/h3&gt;

&lt;p&gt;There are multiple ways how these scammers try to invade your system or steal your credentials. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;some try to scam you right away via fake conferencing apps&lt;/li&gt;
&lt;li&gt;some will let you try a demo project even before the interview and ask you to provide &lt;em&gt;"feedback and suggestions for improvement"&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;some will ask you to clone and run a repo on your machine with the same agenda either as a &lt;strong&gt;homework&lt;/strong&gt; or during an interview&lt;/li&gt;
&lt;li&gt;and others try to build trust first by actually conducting a full interview&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  🟥 Never use unknown conferencing apps
&lt;/h4&gt;

&lt;p&gt;Insist on using Zoom, Google Meet, Microsoft Teams, Telegram or other mainstream apps.&lt;br&gt;
They are available on desktop, mobile as well as in a &lt;strong&gt;browser&lt;/strong&gt;, so you shouldn’t have any issues joining without installing anything. If it was legitimate, they would agree without any problems, especially if e.g. teams don't work for you, so you ask to use another.&lt;/p&gt;

&lt;p&gt;Be wary of links like meet.google.com.join.1bc-23e-h4j.com or zoom.us.joinsession.com and similar. Those are legitimately looking malicious sites, the important bit is the domain name before .com (or other TLD) - that’s the actual site you are visiting.&lt;/p&gt;

&lt;p&gt;If you are curious, before you open any links, use incognito browser mode without any sensitive cookies or extensions enabled to avoid leaking your credentials.&lt;/p&gt;
&lt;h4&gt;
  
  
  🟥 If they want you to install software, it's a scam
&lt;/h4&gt;

&lt;p&gt;Never install unknown software on your machine. I have never experienced a real interview that required installing anything beyond mainstream conferencing apps.&lt;/p&gt;
&lt;h4&gt;
  
  
  🟥 If they give you access to their full repo, it's a scam
&lt;/h4&gt;

&lt;p&gt;If they ask you to inspect their full repo or Figma design document and give feedback, it’s absolutely a scam. No real company would give away their intellectual property like that.&lt;/p&gt;

&lt;p&gt;Though, sometimes you are required to do a home assignment, but that’s different. In that case, you get a limited repo or a coding challenge designed specifically for interviews - and this is what this post is about and how to detect this, because you can absolutely get scammed even during these assignments.&lt;/p&gt;
&lt;h4&gt;
  
  
  🟥 If the offer sounds too good to be true, it probably is
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://www.reddit.com/r/mildlyinfuriating/comments/wu2kjb/if_something_sounds_too_good_to_be_true_it/" rel="noopener noreferrer"&gt;&lt;em&gt;... too good to be true.&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;These scammers always have multiple “open positions” they’re trying to fill, regardless of your actual skills or experience. Full time, part time, freelance, junior, senior — they’ll claim to have something for everyone. They will promise you a high salary, or claim to have a position that perfectly matches your skills.&lt;/p&gt;
&lt;h4&gt;
  
  
  🟥 Do a background check on their profile
&lt;/h4&gt;

&lt;p&gt;I was once contacted on LinkedIn by a 72 year old "senior web3 recruiter" who was previously a certified hypnotherapist of 40 years.&lt;/p&gt;

&lt;p&gt;The plot twist?&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://www.linkedin.com/posts/vitezslav-ackermann-ferko-87867150_wow-a-recruiter-for-a-web3-startup-with-activity-7340891660827951104-gynh/" rel="noopener noreferrer"&gt;real guy&lt;/a&gt;, an actual hypnotherapist, died 2 years prior which I found after reverse-image searching his profile picture.&lt;/p&gt;
&lt;h3&gt;
  
  
  🟥 The second Red Flag: The way They talk to you
&lt;/h3&gt;

&lt;p&gt;If you get past the initial obvious signs mentioned above, there are more subtle red flags to watch out for.&lt;/p&gt;

&lt;p&gt;One thing I didn’t expect is how predictable the &lt;em&gt;communication style&lt;/em&gt; of these scammers is.&lt;br&gt;&lt;br&gt;
If you pay attention, you can spot them before you ever touch a repo.&lt;/p&gt;

&lt;p&gt;Here are the patterns I noticed — and once you see them, you can’t unsee them.&lt;/p&gt;
&lt;h4&gt;
  
  
  They sound surprisingly unprofessional
&lt;/h4&gt;

&lt;p&gt;You’d expect an experienced recruiter or a senior engineer to speak clearly, guide the discussion, explain the agenda, and set expectations.&lt;/p&gt;

&lt;p&gt;With scammers, it’s the opposite:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;no real structure&lt;/li&gt;
&lt;li&gt;unclear questions&lt;/li&gt;
&lt;li&gt;unclear instructions&lt;/li&gt;
&lt;li&gt;often poor English and vague phrasing&lt;/li&gt;
&lt;li&gt;awkward pauses&lt;/li&gt;
&lt;li&gt;jumping between topics without transitions&lt;/li&gt;
&lt;li&gt;not really going into depth on anything &lt;/li&gt;
&lt;li&gt;proceeding with their script regardless of what you say or fails you make&lt;/li&gt;
&lt;li&gt;noisy/bussy room&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  They’re often inexperienced or too “casual”
&lt;/h4&gt;

&lt;p&gt;Young, &lt;strong&gt;impatient&lt;/strong&gt;, and not used to real hiring processes.&lt;br&gt;&lt;br&gt;
They don’t probe deeply into your experience.&lt;br&gt;&lt;br&gt;
They don’t ask follow-ups.&lt;br&gt;&lt;br&gt;
They don’t explore your reasoning.&lt;/p&gt;

&lt;p&gt;It feels like someone trying to &lt;strong&gt;pretend&lt;/strong&gt; they’re running an interview rather than someone who actually does this for a living.&lt;/p&gt;
&lt;h4&gt;
  
  
  They rush the introduction phase
&lt;/h4&gt;

&lt;p&gt;The intro is usually the weakest part of the whole act, because scammers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;don’t understand the actual product&lt;/li&gt;
&lt;li&gt;can’t answer deep questions&lt;/li&gt;
&lt;li&gt;aren’t trained in interview structure&lt;/li&gt;
&lt;li&gt;don’t want to waste time&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  They don’t actually care about your career or fit
&lt;/h4&gt;

&lt;p&gt;They don't care about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;how you think&lt;/li&gt;
&lt;li&gt;how you solve difficult challenges&lt;/li&gt;
&lt;li&gt;how you collaborate&lt;/li&gt;
&lt;li&gt;what kind of developer you are&lt;/li&gt;
&lt;li&gt;whether you’re someone they want to hire&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Real interviewers are curious about you, your story, your skills and thought process.&lt;/p&gt;
&lt;h4&gt;
  
  
  They have a short fuse
&lt;/h4&gt;

&lt;p&gt;If you hesitate, ask questions, or try to clarify anything, they get impatient or even annoyed. Real interviewers are &lt;strong&gt;patient and willing to explain things clearly&lt;/strong&gt;. You can try it by simply playing dumb on purpose for a bit and see how they react - it's really fun actually :-).&lt;/p&gt;
&lt;h4&gt;
  
  
  They overpraise you excessively
&lt;/h4&gt;

&lt;p&gt;Another thing I noticed: when I showed my portfolio, the reactions were overly enthusiastic to the point of feeling fake — constant “wow, amazing, man!” every few seconds. Experienced interviewers might acknowledge good work, but they don’t oversell it like that. Excessive praise is just another &lt;strong&gt;social engineering&lt;/strong&gt; tactic to build quick trust and rush you past your instincts. &lt;/p&gt;

&lt;p&gt;In a real interview, you should feel like you’re having a professional conversation with someone who knows what they’re doing and is genuinely &lt;strong&gt;interested in the details&lt;/strong&gt; you share.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;If it feels off, it probably is.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Disabled camera or filters are a red flag too
&lt;/h4&gt;

&lt;p&gt;If they don’t turn on their camera, that’s a big warning sign. Real interviewers and developers always show their face and expect the same from you at any stage of the interview. I can’t stress this enough: in my ~50+ interviews, I have never had a single call where at least one person didn’t already have their camera on when I joined. While this isn’t a hard rule, it’s a very strong convention in tech interviews.&lt;/p&gt;

&lt;p&gt;And if they &lt;em&gt;do&lt;/em&gt; turn it on, pay attention to their background, lighting, and overall professionalism. A messy or odd setup can be a sign they’re not who they claim to be. Even recruiters working from home make an effort to look presentable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Also be wary of AI filters or avatars&lt;/strong&gt; — they’re terrifyingly good now. Watch for subtle glitches: unnatural blinking, strange eye contact, stiff facial expressions, lips not syncing to speech, or weird distortions when they move and turn their head. If something feels off visually, trust that feeling.&lt;/p&gt;
&lt;h3&gt;
  
  
  🟥 The last Red Flag: They make You share Your screen
&lt;/h3&gt;

&lt;p&gt;Real companies don’t ask you to share your screen &lt;strong&gt;in the first interview&lt;/strong&gt; - be it to show your portfolio (they usually want portfolio ahead of time, with your CV), run code, or anything else.&lt;br&gt;
Real companies don’t ask you to clone and run their repo in the first 45 minutes of meeting you.&lt;br&gt;&lt;br&gt;
They especially don’t sit back and watch your screen like it’s a Twitch stream.&lt;/p&gt;

&lt;p&gt;In any normal code-review-style interview, it's usually a &lt;strong&gt;second or third round&lt;/strong&gt; and the interviewer sets up a shared multi-user coding environment using codesandbox or the likes and only then maybe ask you to share your screen, or just connect to a session. You don’t open unknown software on your machine while strangers watch your desktop icons, extensions, file paths, and environment variables.&lt;/p&gt;

&lt;p&gt;If someone insists on you running their repo early in the process: that’s your warning.&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  How to protect yourself
&lt;/h2&gt;

&lt;p&gt;Even in completely legitimate situations, if you find yourself in a situation where you’re being asked to run unknown code, here are the steps to protect yourself:&lt;/p&gt;

&lt;p&gt;You can skip this section if you only want to see the step-by-step guide.&lt;/p&gt;
&lt;h3&gt;
  
  
  Use isolated coding environment
&lt;/h3&gt;

&lt;p&gt;There are multiple ways to do this, depending on your needs, resources and &lt;strong&gt;time&lt;/strong&gt;.&lt;/p&gt;
&lt;h4&gt;
  
  
  Dev Containers - VSCode extension
&lt;/h4&gt;

&lt;p&gt;You can explore &lt;a href="https://code.visualstudio.com/docs/devcontainers/containers#_getting-started" rel="noopener noreferrer"&gt;Dev Containers&lt;/a&gt; that come with a VSCode extension, it runs locally in Docker or in cloud, batteries included.&lt;/p&gt;
&lt;h4&gt;
  
  
  Linux in Docker
&lt;/h4&gt;

&lt;p&gt;Another option is to set up a Docker image yourself with a prebuilt image or clean Linux. Experience very similar to just using WSL for development. You will connect "remotely" from your local VSCode over SSH, which triggers the installation of VSCode Server. From there you can install node and other dependencies, and clone and run the repo; fully isolated.&lt;/p&gt;
&lt;h4&gt;
  
  
  Self-hosted VSCode in Docker
&lt;/h4&gt;

&lt;p&gt;As we move to the cloud, you can self-host full VSCode IDE in a docker with &lt;a href="https://github.com/coder/code-server" rel="noopener noreferrer"&gt;code-server&lt;/a&gt;. This will give you web-based VSCode that you can access from any browser, any device, anywhere. Great for occasional development from a tablet.&lt;/p&gt;
&lt;h4&gt;
  
  
  GitHub Codespaces or codesandbox
&lt;/h4&gt;

&lt;p&gt;Some might argue that Docker is not 100% secure, so that leaves us with Virtual Machines or 3rd party cloud providers, such as &lt;a href="https://github.com/features/codespaces" rel="noopener noreferrer"&gt;GitHub Codespaces&lt;/a&gt; or &lt;a href="https://codesandbox.io/" rel="noopener noreferrer"&gt;codesandbox&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/features/codespaces" rel="noopener noreferrer"&gt;GitHub Codespaces&lt;/a&gt; provides 60 hours of &lt;a href="https://docs.github.com/en/billing/concepts/product-billing/github-codespaces#free-quota" rel="noopener noreferrer"&gt;&lt;strong&gt;free compute time&lt;/strong&gt;&lt;/a&gt; every month, which is more than enough for scoped home assignments or interviews. It’s a full VSCode in the browser at &lt;a href="https://github.dev" rel="noopener noreferrer"&gt;github.dev&lt;/a&gt; or &lt;a href="https://vscode.dev" rel="noopener noreferrer"&gt;vscode.dev&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.reddit.com/r/vscode/comments/1p3yjbs/what_is_the_difference_between_vscodedev_and/" rel="noopener noreferrer"&gt;What is the difference between github.dev and vscode.dev?&lt;/a&gt;&lt;br&gt;
Difference between the two is that github.dev is more integrated with github: automatic login, and some github related extensions, including Github Copilot and the github visual theme. It can load any github repo from the command prompt, or by pressing &lt;code&gt;.&lt;/code&gt; on a keyboard while on any github page, or just by replacing the &lt;code&gt;github.com&lt;/code&gt; with &lt;code&gt;github.dev&lt;/code&gt; in the URL.&lt;br&gt;
vscode.dev requires you to log in if you want to synchronize your settings and extensions and it can load github and azure repos in a similar way by appending the full url &lt;code&gt;vscode.dev/dev.azure.com/myRepo&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;However, in my experience it is much faster to just use &lt;a href="https://github.dev" rel="noopener noreferrer"&gt;github.dev&lt;/a&gt; for any repositories even outside of github such as bitbucket or gitlab, because a Codespace requires you to start from a repo on github or to create a new one, and &lt;a href="https://github.com/github/dev" rel="noopener noreferrer"&gt;https://github.com/github/dev&lt;/a&gt; is such a minimalistic repo that loads with github.dev by default.&lt;/p&gt;
&lt;h3&gt;
  
  
  Analyze the repo with AI tools
&lt;/h3&gt;

&lt;p&gt;Before you run any unknown code, use AI tools to analyze it for malicious intent. You can use GitHub Copilot, ChatGPT, or other AI assistants to review the codebase quickly. All of them are available as extensions in VSCode, so you can use them directly in your isolated coding environment. GitHub Copilot is also available &lt;strong&gt;for free&lt;/strong&gt; in GitHub Codespaces.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;strong&gt;Agent mode&lt;/strong&gt; to scan the whole codebase

&lt;ul&gt;
&lt;li&gt;A simple prompt &lt;em&gt;"Analyze this codebase for any malicious scripts, hidden backdoors, or suspicious behavior. Summarize your findings."&lt;/em&gt; should do.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Ask specific questions about dependency files, configuration scripts, or parts of the code that seem suspicious.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tip: Watch for unknown dependencies, suspiciously large files and obfuscated code. The following is a pretty common code injection. A normally looking &lt;code&gt;tailwind.config.js&lt;/code&gt; file, but there was a malicious one-line code inserted after at least a thousand spaces, completely unnoticeable to a naked eye.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh8kj2fkclpy1z1eidow2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh8kj2fkclpy1z1eidow2.png" alt="VSCode showing a large chunk of text hidden after a block of white space." width="524" height="464"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Step-by-step guide that is completely free and instant
&lt;/h2&gt;

&lt;p&gt;This guide uses GitHub Codespaces. It's free and instant to start. You get a full VSCode IDE in the browser with terminal access, extensions, GitHub Copilot, and everything you need to inspect and run the code safely.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;docs: &lt;a href="https://docs.github.com/en/billing/concepts/product-billing/github-codespaces#free-quota" rel="noopener noreferrer"&gt;Codespaces: Free quota&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;docs: &lt;a href="https://docs.github.com/en/billing/concepts/product-billing/github-codespaces#pricing" rel="noopener noreferrer"&gt;Codespaces: Free unit consumption multiplier and pricing&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;docs: &lt;a href="https://docs.github.com/en/copilot/concepts/billing/individual-plans#github-copilot-free" rel="noopener noreferrer"&gt;GitHub Copilot Free&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;account: &lt;a href="https://github.com/settings/billing/usage?query=product:codespaces" rel="noopener noreferrer"&gt;Billing / Usage dashboard&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  1. Open the repo link in your browser
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;If it is a github repo, while browsing it, hit &lt;code&gt;.&lt;/code&gt; on the keyboard or replace &lt;code&gt;github.com&lt;/code&gt; with &lt;code&gt;github.dev&lt;/code&gt; in the URL, which will launch the repo in github.dev browser VSCode.&lt;/li&gt;
&lt;li&gt;If not, copy the clone command (URL).&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  2. Start a Codespace on github.dev
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8jua7n8izpqbixnxijzc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8jua7n8izpqbixnxijzc.png" alt="Screenshot showing the steps below visually." width="563" height="432"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If the TERMINAL button doesn't appear, open Command Palette and find  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Codespaces: Continue working in New Codespace&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Choose &lt;strong&gt;2 cores&lt;/strong&gt; for 60 hours of free computing time every month. Double the CPU halves the free hours.&lt;/p&gt;
&lt;h4&gt;
  
  
  3. Clone the repo in the Codespace terminal &lt;em&gt;(optional)&lt;/em&gt;
&lt;/h4&gt;

&lt;p&gt;If it was not a github repo, clone it in the terminal:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff9aenktl61h8kizclgf9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff9aenktl61h8kizclgf9.png" alt="Entered the git clone command in terminal." width="509" height="112"&gt;&lt;/a&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 &amp;lt;REPO_URL&amp;gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; &amp;lt;REPO_NAME&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  4. Analyze the code with GitHub Copilot
&lt;/h4&gt;

&lt;p&gt;Open Command Palette and find&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Chat: Open Chat&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Switch to &lt;strong&gt;Agent mode&lt;/strong&gt;. and ask it to analyze the codebase for malicious intent:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Analyze this codebase for any malicious scripts, hidden backdoors, or suspicious behavior. Summarize your findings.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fki9rcwir0gdjfgrue2cl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fki9rcwir0gdjfgrue2cl.png" alt="AI Chat showing critical findings" width="787" height="715"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you find something, then that's your cue. You can use deobfuscation utilities to get more sense of the code or ask AI, if you are curious, but you should exit the interview.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://beautifier.io/" rel="noopener noreferrer"&gt;beautifier.io&lt;/a&gt; - online code beautifier&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fswg8a2e03o4xevpd8xp0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fswg8a2e03o4xevpd8xp0.png" alt="beautified code using beautifier.io" width="800" height="731"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  5. Run the code safely
&lt;/h4&gt;

&lt;p&gt;Follow the project’s README instructions to install dependencies and run the project. Since you’re in an isolated Codespace, any malicious code will be contained within this environment. But still be cautious before you enable access to any extensions.&lt;br&gt;
My suggestion would be to run it in a separate Browser profile or &lt;strong&gt;Incognito window&lt;/strong&gt; without any sensitive cookies or extensions enabled to avoid leaking your credentials, such as Metamask or other web3 wallets.&lt;/p&gt;

&lt;p&gt;You will see a link in the terminal to open the running project in a new browser tab if it is a web application.&lt;/p&gt;

&lt;h4&gt;
  
  
  6. Clean up
&lt;/h4&gt;

&lt;p&gt;When you are done, stop the Codespace to avoid consuming more hours and &lt;a href="https://github.com/codespaces" rel="noopener noreferrer"&gt;delete&lt;/a&gt; the codespace from your GitHub account as it consumes GB-hours. (You get 15 GB for a month for free.) The codespace gets deleted automatically after 30 days of inactivity, too, if you forget.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo7ovzdskg1xdjlke96x4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo7ovzdskg1xdjlke96x4.png" alt="Command Pallete: Stop Current Codespace" width="614" height="158"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Check the usage in the &lt;a href="https://github.com/settings/billing/usage?query=product:codespaces" rel="noopener noreferrer"&gt;dashboard&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you have already closed the Codespace tab, you can find it at &lt;a href="https://github.com/codespaces" rel="noopener noreferrer"&gt;https://github.com/codespaces&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg4ci5dud8c1m3upy5rsu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg4ci5dud8c1m3upy5rsu.png" alt="Codespaces: Delete codespace from context menu." width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;I don't want to waste any more of your time. This already blew beyond few simple screenshots into a more detailed guide, but I think it was worth it.&lt;/p&gt;

&lt;p&gt;Thank you for reading and please, &lt;strong&gt;do share it with your junior developer friends&lt;/strong&gt; to help them avoid getting scammed. The scammers keep improving and move into organized operations, so it must be profitable for them, and with the rise of AI, they will get even more sophisticated.&lt;/p&gt;

&lt;p&gt;Cheers! 🥂😎&lt;/p&gt;

&lt;p&gt;Qwerty, signing out.&lt;/p&gt;




&lt;p&gt;Veni&lt;br&gt;
Vidi&lt;br&gt;
Abii&lt;/p&gt;

&lt;p&gt;Vici&lt;/p&gt;

&lt;p&gt;(I came; I saw; I left; I won)&lt;/p&gt;

</description>
      <category>software</category>
      <category>interview</category>
      <category>scam</category>
      <category>guide</category>
    </item>
  </channel>
</rss>
