<?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: Gydunhn</title>
    <description>The latest articles on DEV Community by Gydunhn (@gydunhn).</description>
    <link>https://dev.to/gydunhn</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%2F2999456%2F25b5902f-cc24-46e8-b699-d313e1adfab9.jpg</url>
      <title>DEV Community: Gydunhn</title>
      <link>https://dev.to/gydunhn</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gydunhn"/>
    <language>en</language>
    <item>
      <title>Vintom in Angular 19</title>
      <dc:creator>Gydunhn</dc:creator>
      <pubDate>Wed, 09 Apr 2025 20:41:32 +0000</pubDate>
      <link>https://dev.to/gydunhn/vintom-in-angular-19-32fm</link>
      <guid>https://dev.to/gydunhn/vintom-in-angular-19-32fm</guid>
      <description>&lt;h1&gt;
  
  
  Creating Personalized Videos with Data Security
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Personalized Video Solution
&lt;/h2&gt;

&lt;p&gt;Today I want to share with you a project I just completed: a proof of concept (POC) that integrates the Vintom tool for personalized videos with Angular 19. If you're looking for a way to implement personalized and dynamic videos in your Angular applications while maintaining complete control over your users' data, this article is for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Vintom and why should you care?
&lt;/h2&gt;

&lt;p&gt;Vintom is a powerful platform that allows you to create and play dynamically personalized videos. Imagine being able to show each user a video that includes their name, food preferences, clothing size, security data, banking information, or investment details. In short, data that belongs only to the user, specific information relevant to them. The possibilities for personalized marketing, user onboarding, or personalized communications are enormous.&lt;/p&gt;

&lt;p&gt;What makes this implementation especially interesting is that it uses the &lt;strong&gt;"Data in Client's Infrastructure"&lt;/strong&gt; mode, which means that all user data is processed directly in the client's browser. This ensures maximum security for sensitive information, as no personal data is sent to external servers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Main Features of the Implementation
&lt;/h2&gt;

&lt;p&gt;Our integration of Vintom with Angular 19 includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔒 &lt;strong&gt;100% client-side processing&lt;/strong&gt;: All data remains in the user's browser&lt;/li&gt;
&lt;li&gt;🌍 &lt;strong&gt;Multilingual subtitle support&lt;/strong&gt;: Implemented for English, Spanish, and Polish&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;🎨 &lt;strong&gt;Visual customization&lt;/strong&gt;: Customization options including colors, images, and graphics&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;everything that Vintom offers from its DEMO documentation.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A Look at the Code
&lt;/h2&gt;

&lt;p&gt;Implementing the Vintom player in Angular is surprisingly simple. Here's a snippet of how we initialize the player:&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="c1"&gt;// Vintom player initialization&lt;/span&gt;
&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;videoPlayer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;vintom&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Player&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;initialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;containerId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;personalize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;playerData&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The customization form allows users to select different parameters for their video:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Name&lt;/td&gt;
&lt;td&gt;Selection of predefined names&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Language (subtitles)&lt;/td&gt;
&lt;td&gt;English, Spanish, or Polish&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Image&lt;/td&gt;
&lt;td&gt;Different visual options (flower, fish, car...)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Color&lt;/td&gt;
&lt;td&gt;Customizable color palette&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Percentage&lt;/td&gt;
&lt;td&gt;Numerical value for graphics (0-100%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chart Type&lt;/td&gt;
&lt;td&gt;Pie chart or bar chart&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CTA URL&lt;/td&gt;
&lt;td&gt;URL for customized call-to-action&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Technical Challenges and Solutions
&lt;/h2&gt;

&lt;p&gt;One of the main challenges was correctly handling video playback errors. We implemented a global error handler that specifically captures common playback issues:&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="nf"&gt;setupErrorHandler&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;unhandledrejection&lt;/span&gt;&lt;span class="dl"&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;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;reason&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;AbortError&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; 
        &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;reason&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;play() request was interrupted&lt;/span&gt;&lt;span class="dl"&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;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;preventDefault&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stopPropagation&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This approach prevents non-critical errors during playback from affecting the user experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  Results and Learnings
&lt;/h2&gt;

&lt;p&gt;After completing the proof of concept, I can confirm that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Angular 19 and Vintom are fully compatible&lt;/strong&gt;: The integration is smooth and efficient&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Client-side processing works perfectly&lt;/strong&gt;: There are no significant performance issues&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;User experience is excellent&lt;/strong&gt;: Videos are generated quickly, and playback is smooth&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data security is guaranteed&lt;/strong&gt;: No personal data leaves the user's browser&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Technical Requirements
&lt;/h2&gt;

&lt;p&gt;If you want to implement something similar, you'll need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Node.js 16.x or higher&lt;/li&gt;
&lt;li&gt;Angular CLI 19.x&lt;/li&gt;
&lt;li&gt;Modern browsers (Chrome 50+, Firefox 50+, Safari 10+, Edge 15+)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Don't forget to include the necessary scripts in your &lt;code&gt;index.html&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://player.vintom.com/player/2.15.2/index.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://player.vintom.com/player/2.15.2/public/css/style.css"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;This proof of concept demonstrates the potential of Vintom in Angular applications, but there are several directions in which we could expand the project:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Explore the hybrid infrastructure mode for more complex use cases&lt;/li&gt;
&lt;li&gt;Add interaction analytics to measure the effectiveness of videos&lt;/li&gt;
&lt;li&gt;Integrate with CRM systems for user data-based personalization&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  In Conclusion
&lt;/h2&gt;

&lt;p&gt;The integration of Vintom with Angular 19 opens new possibilities for offering personalized user experiences without compromising data security. This client-centered approach represents the future of multimedia content personalization, where privacy and user experience go hand in hand.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This article is based on a real proof of concept. The code and techniques mentioned have been tested in a development environment.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Reference:
&lt;/h2&gt;

&lt;p&gt;💡 Originally published by Gydunhn on &lt;a href="https://gydunhn.bearblog.dev/en/angular-vintom/" rel="noopener noreferrer"&gt;bearblog.dev&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.vintom.com/how-it-works/" rel="noopener noreferrer"&gt;How it Works&lt;/a&gt; Vintom.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Gydunhn/Angular-Vintom-Demo" rel="noopener noreferrer"&gt;Github repository&lt;/a&gt; with the Demo (spanish).&lt;/p&gt;

</description>
      <category>angular</category>
      <category>development</category>
      <category>video</category>
      <category>web</category>
    </item>
    <item>
      <title>Optimizing Folder Structure in Angular Projects</title>
      <dc:creator>Gydunhn</dc:creator>
      <pubDate>Mon, 31 Mar 2025 03:00:00 +0000</pubDate>
      <link>https://dev.to/gydunhn/optimizing-folder-structure-in-angular-projects-233k</link>
      <guid>https://dev.to/gydunhn/optimizing-folder-structure-in-angular-projects-233k</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;The organization of files and folders may seem like a secondary aspect when developing Angular applications, but it's actually an architectural decision that has a profound impact on maintainability, scalability, and understanding of the project. In this article, we'll explore different approaches to structuring Angular projects, from the simplest to the most business domain-oriented.&lt;/p&gt;

&lt;p&gt;When we start a project with Angular CLI, we're provided with a default structure. However, as the application grows, this initial structure may prove insufficient. Should we follow the framework conventions or adapt the structure to better reflect our business domain?&lt;/p&gt;

&lt;h2&gt;
  
  
  The Difference Between Scaffolding and Folder Structure
&lt;/h2&gt;

&lt;p&gt;Before diving deeper, it's important to distinguish between two related but different concepts:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scaffolding&lt;/strong&gt; refers to the automatic process of generating code and initial structure using tools like Angular CLI. Commands like &lt;code&gt;ng new&lt;/code&gt; or &lt;code&gt;ng generate component&lt;/code&gt; automatically create files with boilerplate code and register them in the corresponding modules.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Folder structure&lt;/strong&gt; is the final organization of files and directories in the project, which can be the result of the initial scaffolding, but also of conscious decisions about how to organize the code according to the specific needs of the project.&lt;/p&gt;

&lt;p&gt;Scaffolding is a process that occurs at specific moments during development, while folder structure evolves continuously and is more under the control of the development team.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three Levels of Structure in Angular Projects
&lt;/h2&gt;

&lt;p&gt;We can identify three main approaches to organizing our Angular projects, each with different levels of complexity and benefits:&lt;/p&gt;

&lt;h3&gt;
  
  
  Level 1: Structure by File Type
&lt;/h3&gt;

&lt;p&gt;This is the most basic structure, generally created by default with Angular CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;└── src/
    ├── app/
    │   ├── components/
    │   ├── services/
    │   ├── models/
    │   ├── pipes/
    │   ├── directives/
    │   └── guards/
    ├── assets/
    ├── environments/
    └── ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Advantages&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Familiar to Angular developers&lt;/li&gt;
&lt;li&gt;Follows framework conventions&lt;/li&gt;
&lt;li&gt;Quick to implement&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Disadvantages&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does not communicate the business purpose&lt;/li&gt;
&lt;li&gt;Becomes difficult to maintain as it grows&lt;/li&gt;
&lt;li&gt;Related modules are scattered&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Ideal use cases&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prototypes (POC - Proof of Concept)&lt;/li&gt;
&lt;li&gt;Minimum Viable Products (MVP)&lt;/li&gt;
&lt;li&gt;Short-term projects&lt;/li&gt;
&lt;li&gt;Very small teams (1-2 developers)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This structure is perfect when we need to quickly validate an idea or concept, without worrying too much about long-term scalability.&lt;/p&gt;

&lt;h3&gt;
  
  
  Level 2: Structure by Features
&lt;/h3&gt;

&lt;p&gt;This approach groups code first by application features:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;└── src/
    ├── app/
    │   ├── core/                 &lt;span class="c"&gt;# Singleton services, global guards, etc.&lt;/span&gt;
    │   │   ├── services/
    │   │   ├── guards/
    │   │   └── interceptors/
    │   ├── shared/               &lt;span class="c"&gt;# Shared components, pipes, directives&lt;/span&gt;
    │   │   ├── components/
    │   │   ├── directives/
    │   │   └── pipes/
    │   ├── features/             &lt;span class="c"&gt;# Application features&lt;/span&gt;
    │   │   ├── auth/
    │   │   │   ├── components/
    │   │   │   ├── services/
    │   │   │   └── auth.module.ts
    │   │   ├── payment/
    │   │   │   ├── components/
    │   │   │   ├── services/
    │   │   │   └── payment.module.ts
    │   │   └── employees/
    │   │       ├── components/
    │   │       ├── services/
    │   │       └── employees.module.ts
    │   └── app.module.ts
    ├── assets/
    ├── environments/
    └── ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Advantages&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Organizes code by application features&lt;/li&gt;
&lt;li&gt;Uses Angular modules to encapsulate functionalities&lt;/li&gt;
&lt;li&gt;Facilitates parallel work between teams&lt;/li&gt;
&lt;li&gt;Keeps shared components separate&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Disadvantages&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Still maintains some technical orientation instead of domain focus&lt;/li&gt;
&lt;li&gt;It can be difficult to identify boundaries between features&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Ideal use cases&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Medium-sized projects (3-10 developers)&lt;/li&gt;
&lt;li&gt;Applications with expectation of moderate growth&lt;/li&gt;
&lt;li&gt;Teams with staff rotation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This structure is probably the most widely used in medium-sized Angular projects, as it offers a good balance between organization and ease of understanding.&lt;/p&gt;

&lt;h3&gt;
  
  
  Level 3: Structure with Screaming Architecture
&lt;/h3&gt;

&lt;p&gt;This approach is inspired by the concept of "Screaming Architecture" proposed by Robert C. Martin, where the project structure should "scream" its business purpose:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;└── src/
    ├── app/
    │   ├── core/                  &lt;span class="c"&gt;# Application infrastructure&lt;/span&gt;
    │   │   ├── infrastructure/    &lt;span class="c"&gt;# Technical implementations&lt;/span&gt;
    │   │   │   ├── http/
    │   │   │   ├── storage/
    │   │   │   └── auth/
    │   │   └── ui/               &lt;span class="c"&gt;# Base UI components&lt;/span&gt;
    │   │       ├── layout/
    │   │       └── components/
    │   ├── domains/              &lt;span class="c"&gt;# Business domains (modules)&lt;/span&gt;
    │   │   ├── hr-management/    &lt;span class="c"&gt;# Domain: HR Management&lt;/span&gt;
    │   │   │   ├── employee-directory/  &lt;span class="c"&gt;# Use case&lt;/span&gt;
    │   │   │   │   ├── components/
    │   │   │   │   ├── services/
    │   │   │   │   └── models/
    │   │   │   ├── payroll/      &lt;span class="c"&gt;# Use case&lt;/span&gt;
    │   │   │   └── hr-management.module.ts
    │   │   ├── sales/            &lt;span class="c"&gt;# Domain: Sales&lt;/span&gt;
    │   │   │   ├── product-catalog/  &lt;span class="c"&gt;# Use case&lt;/span&gt;
    │   │   │   ├── checkout/     &lt;span class="c"&gt;# Use case&lt;/span&gt;
    │   │   │   └── sales.module.ts
    │   │   └── customer-support/ &lt;span class="c"&gt;# Domain: Customer Support&lt;/span&gt;
    │   │       ├── ticket-management/  &lt;span class="c"&gt;# Use case&lt;/span&gt;
    │   │       ├── knowledge-base/     &lt;span class="c"&gt;# Use case&lt;/span&gt;
    │   │       └── customer-support.module.ts
    │   ├── shared/               &lt;span class="c"&gt;# Components shared between domains&lt;/span&gt;
    │   └── app.module.ts
    ├── assets/
    ├── environments/
    └── ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Advantages&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The structure clearly communicates the business purpose&lt;/li&gt;
&lt;li&gt;Organizes code by domains and use cases&lt;/li&gt;
&lt;li&gt;Facilitates business understanding for new developers&lt;/li&gt;
&lt;li&gt;Each domain can evolve independently&lt;/li&gt;
&lt;li&gt;Promotes separation of concerns&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Disadvantages&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Greater initial complexity&lt;/li&gt;
&lt;li&gt;Requires good knowledge of the business domain&lt;/li&gt;
&lt;li&gt;May be excessive for small applications&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Ideal use cases&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Large and complex projects&lt;/li&gt;
&lt;li&gt;Numerous teams (10+ developers)&lt;/li&gt;
&lt;li&gt;Long-life applications&lt;/li&gt;
&lt;li&gt;Systems with well-defined business domains&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What is Screaming Architecture?
&lt;/h2&gt;

&lt;p&gt;The concept of "Screaming Architecture" was proposed by Robert C. Martin (Uncle Bob) in 2011. The central idea is that a project's architecture should clearly communicate its purpose and business domain, not the technology or framework used.&lt;/p&gt;

&lt;p&gt;The analogy he offers is clear: when looking at an architect's plans, you immediately identify whether it's a house, an airport, or a shopping mall, without needing to see what materials will be used. Similarly, when opening a software project, we should be able to immediately identify what it does (a podcast application, a ticket sales system, etc.), not just what technology it uses (Angular, React, etc.).&lt;/p&gt;

&lt;p&gt;In the context of Angular, this means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The framework is just a tool, not the foundation of our architecture&lt;/li&gt;
&lt;li&gt;The structure should reflect domain concepts, not framework conventions&lt;/li&gt;
&lt;li&gt;Critical decisions should be based on business needs, not framework features&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Practical Implementation in Angular
&lt;/h2&gt;

&lt;p&gt;Let's see how we can implement these structures in Angular, focusing especially on the Screaming Architecture approach:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Using Modules for Domains
&lt;/h3&gt;

&lt;p&gt;Angular has a module system that perfectly fits the concept of domains:&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="c1"&gt;// domains/hr-management/hr-management.module.ts&lt;/span&gt;
&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;NgModule&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;declarations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[...],&lt;/span&gt;
  &lt;span class="na"&gt;imports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nx"&gt;CommonModule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;SharedModule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;RouterModule&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forChild&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;employees&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;component&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;EmployeeListComponent&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;payroll&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;component&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;PayrollComponent&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;providers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;EmployeeService&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;PayrollService&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;HrManagementModule&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;
  
  
  2. State by Domain (with NGRX/NGXS)
&lt;/h3&gt;

&lt;p&gt;If you use state management, each domain can have its own state:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;└── domains/
    └── hr-management/
        ├── store/
        │   ├── actions/
        │   ├── reducers/
        │   ├── effects/
        │   └── selectors/
        └── ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Barrel Pattern
&lt;/h3&gt;

&lt;p&gt;Facilitates imports using the barrel pattern:&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="c1"&gt;// domains/hr-management/index.ts&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./models&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./services&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./components&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Lazy Loading
&lt;/h3&gt;

&lt;p&gt;Take advantage of Angular's lazy loading to load domains only when 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="c1"&gt;// In app-routing.module.ts&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;routes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Routes&lt;/span&gt; &lt;span class="o"&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;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hr&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;loadChildren&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./domains/hr-management/hr-management.module&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;HrManagementModule&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;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;sales&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;loadChildren&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./domains/sales/sales.module&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SalesModule&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Transformation Example
&lt;/h2&gt;

&lt;p&gt;To better illustrate the concept, let's see how we could transform a traditional structure into one based on Screaming Architecture:&lt;/p&gt;

&lt;h3&gt;
  
  
  Before (Type-based approach)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;app/
├── components/
│   ├── product-list.component.ts
│   ├── cart.component.ts
│   └── checkout-form.component.ts
├── services/
│   ├── product.service.ts
│   └── cart.service.ts
└── models/
    ├── product.model.ts
    └── cart-item.model.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  After (Screaming Architecture approach)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;app/
└── domains/
    ├── catalog/
    │   ├── components/
    │   │   └── product-list.component.ts
    │   ├── services/
    │   │   └── product.service.ts
    │   └── models/
    │       └── product.model.ts
    └── shopping/
        ├── components/
        │   ├── cart.component.ts
        │   └── checkout-form.component.ts
        ├── services/
        │   └── cart.service.ts
        └── models/
            └── cart-item.model.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Practical Considerations
&lt;/h2&gt;

&lt;h3&gt;
  
  
  When to use each approach?
&lt;/h3&gt;

&lt;p&gt;There is no universal "correct" structure. The choice depends on several factors:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For small projects (1-3 developers)&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Level 1 is ideal for POCs and MVPs where the priority is to quickly validate concepts&lt;/li&gt;
&lt;li&gt;Level 2 is suitable if moderate growth is expected&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;For medium projects (4-10 developers)&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Level 2 is usually the most balanced&lt;/li&gt;
&lt;li&gt;Consider Level 3 if the domain is complex and well-defined&lt;/li&gt;
&lt;li&gt;Implement lazy loading for modules/features&lt;/li&gt;
&lt;li&gt;Evaluate using NgRx/NGXS with state separated by domain&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;For large projects (10+ developers)&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Level 3 with Screaming Architecture offers the best long-term benefits&lt;/li&gt;
&lt;li&gt;Consider dividing into multiple applications or microfrontends&lt;/li&gt;
&lt;li&gt;Use shared libraries for common code between domains&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Gradual Migration
&lt;/h3&gt;

&lt;p&gt;It's not necessary to do a complete refactoring immediately. You can adopt a gradual approach:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Identify the main domains of your application&lt;/li&gt;
&lt;li&gt;Start reorganizing one domain at a time&lt;/li&gt;
&lt;li&gt;Use the barrel pattern to minimize changes in imports&lt;/li&gt;
&lt;li&gt;Implement lazy loading to reduce performance impact during migration&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  To Summarize
&lt;/h2&gt;

&lt;p&gt;At the end of the day, what makes a folder structure truly "good" isn't about following trendy patterns or rigid rules—it's about what works for your team in the real world. The best structure is one that makes your developers smile when they navigate the codebase, not curse under their breath.&lt;/p&gt;

&lt;p&gt;Think of your folder structure as a living, breathing part of your application. It should grow and evolve alongside your project, adapting to new challenges and insights your team gains along the way. Some of the most effective structures I've seen came from teams who weren't afraid to say, "This isn't working for us anymore," and make thoughtful changes.&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%2Fxdt050thcevmqgispui3.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%2Fxdt050thcevmqgispui3.png" alt="In to the future" width="800" height="333"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>angular</category>
      <category>architecture</category>
      <category>development</category>
      <category>structure</category>
    </item>
    <item>
      <title>Create your own Extension Pack for Visual Studio Code</title>
      <dc:creator>Gydunhn</dc:creator>
      <pubDate>Sun, 26 Apr 2020 13:25:00 +0000</pubDate>
      <link>https://dev.to/gydunhn/create-your-own-extension-pack-for-visual-studio-code-6pb</link>
      <guid>https://dev.to/gydunhn/create-your-own-extension-pack-for-visual-studio-code-6pb</guid>
      <description>&lt;p&gt;I use multiple VSCode extensions to increase my productivity daily. When we wanted to standardize development in an important project and implement a basic set of necessary extensions, we found it necessary to create an &lt;strong&gt;Extension Pack&lt;/strong&gt;. This way we could better manage the list of required extensions.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is an Extension Pack?
&lt;/h2&gt;

&lt;p&gt;It's a single extension that groups other extensions together. When installing the pack, all included extensions are installed together. It's ideal for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sharing your favorite tools with colleagues&lt;/li&gt;
&lt;li&gt;Maintaining consistent configurations across teams&lt;/li&gt;
&lt;li&gt;Easily updating collections&lt;/li&gt;
&lt;/ul&gt;




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

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Install &lt;strong&gt;&lt;a href="https://nodejs.org/es/download/" rel="noopener noreferrer"&gt;Node.js&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Install Yeoman and the VSCode generator:&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Generate your Extension Pack
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Run the generator:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select &lt;strong&gt;"New Extension Pack"&lt;/strong&gt;&lt;br&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%2Fzos98aj6vnwj3ke1e86z.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%2Fzos98aj6vnwj3ke1e86z.png" alt="Selection screen" width="800" height="545"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Choose whether to include your current extensions (I selected &lt;em&gt;No&lt;/em&gt; to customize later)&lt;br&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%2Ffi5uw6k2htsdjoyqh0y7.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%2Ffi5uw6k2htsdjoyqh0y7.png" alt="Pack options" width="800" height="538"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Add your extensions
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Open the generated project in VSCode (&lt;code&gt;code .&lt;/code&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Edit &lt;code&gt;package.json&lt;/code&gt; and add the extension IDs to the &lt;code&gt;extensionPack&lt;/code&gt; array:&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;My favorite extensions:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens" rel="noopener noreferrer"&gt;GitLens — Git supercharged&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=aaron-bond.better-comments" rel="noopener noreferrer"&gt;Better Comments&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=Gruntfuggly.todo-tree" rel="noopener noreferrer"&gt;Todo Tree&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=yzhang.markdown-all-in-one" rel="noopener noreferrer"&gt;Markdown All in One&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=bierner.emojisense" rel="noopener noreferrer"&gt;:emojisense:&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=usernamehw.errorlens" rel="noopener noreferrer"&gt;Error Lens&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=IBM.output-colorizer" rel="noopener noreferrer"&gt;Output Colorizer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=PKief.material-icon-themee" rel="noopener noreferrer"&gt;Material Icon Theme&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Your Pack Icon
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Note that I added the &lt;code&gt;icon&lt;/code&gt; field in the &lt;code&gt;package.json&lt;/code&gt; file, with the path &lt;code&gt;img/essentials.png&lt;/code&gt;, so if you create a folder with that name, you can put an icon with that filename there. It should be 250px x 250px, so it's identifiable when installed.

&lt;ol&gt;
&lt;li&gt;Example:
&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%2Fr6e7mlhhhpwz6z8ig37z.png" alt="Icon" width="256" height="256"&gt;
&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;/ol&gt;




&lt;h2&gt;
  
  
  Package your extension
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Make sure &lt;code&gt;publisher&lt;/code&gt; is configured in &lt;code&gt;package.json&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Run:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A &lt;code&gt;.vsix&lt;/code&gt; file will be generated in your project&lt;br&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%2Fmset7pu5uuvesw6r1xt6.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%2Fmset7pu5uuvesw6r1xt6.png" alt="Generated VSIX file" width="258" height="223"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; You can publish to the VSCode Marketplace by following the &lt;a href="https://code.visualstudio.com/api/working-with-extensions/publishing-extension" rel="noopener noreferrer"&gt;official documentation&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Install your pack
&lt;/h2&gt;

&lt;p&gt;Manual installation in VSCode&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open Extensions (&lt;code&gt;Ctrl+Shift+X&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Click on the &lt;strong&gt;⋮&lt;/strong&gt; menu → &lt;em&gt;Install from VSIX...&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Select your &lt;code&gt;.vsix&lt;/code&gt; file&lt;/li&gt;
&lt;li&gt;Restart VSCode&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now your entire team can enjoy your extensions with just one click!&lt;/p&gt;




&lt;h2&gt;
  
  
  Tips
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Update the &lt;code&gt;README.md&lt;/code&gt; to explain the purpose of the pack&lt;/li&gt;
&lt;li&gt;Add a License file&lt;/li&gt;
&lt;li&gt;Use semantic versioning when updating&lt;/li&gt;
&lt;li&gt;Evaluate whether it's necessary to publish in the Marketplace to share it widely or not.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Source
&lt;/h2&gt;

&lt;p&gt;Gydunhn's Blog - &lt;a href="https://gydunhn.bearblog.dev/vscode-extension-pack/" rel="noopener noreferrer"&gt;Crea tu propio Extension Pack para Visual Studio Code&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%2Fxdt050thcevmqgispui3.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%2Fxdt050thcevmqgispui3.png" alt="In to the future" width="800" height="333"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>development</category>
      <category>extensions</category>
      <category>productivity</category>
      <category>tools</category>
    </item>
  </channel>
</rss>
