<?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: David Ongora</title>
    <description>The latest articles on DEV Community by David Ongora (@davidongora).</description>
    <link>https://dev.to/davidongora</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%2F2765449%2F2351cf5d-0546-4f71-9661-893b711f5753.jpeg</url>
      <title>DEV Community: David Ongora</title>
      <link>https://dev.to/davidongora</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/davidongora"/>
    <language>en</language>
    <item>
      <title>[Boost]</title>
      <dc:creator>David Ongora</dc:creator>
      <pubDate>Fri, 08 Aug 2025 06:40:15 +0000</pubDate>
      <link>https://dev.to/davidongora/-16b6</link>
      <guid>https://dev.to/davidongora/-16b6</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/davidongora/generating-dynamic-avatars-in-angular-using-dicebear-3npp" class="crayons-story__hidden-navigation-link"&gt;Generating Dynamic Avatars in Angular Using DiceBear.&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/davidongora" class="crayons-avatar  crayons-avatar--l  "&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%2Fuser%2Fprofile_image%2F2765449%2F2351cf5d-0546-4f71-9661-893b711f5753.jpeg" alt="davidongora profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/davidongora" class="crayons-story__secondary fw-medium m:hidden"&gt;
              David Ongora
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                David Ongora
                
              
              &lt;div id="story-author-preview-content-2755409" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/davidongora" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F2765449%2F2351cf5d-0546-4f71-9661-893b711f5753.jpeg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;David Ongora&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/davidongora/generating-dynamic-avatars-in-angular-using-dicebear-3npp" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Aug 8 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/davidongora/generating-dynamic-avatars-in-angular-using-dicebear-3npp" id="article-link-2755409"&gt;
          Generating Dynamic Avatars in Angular Using DiceBear.
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/avatars"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;avatars&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/dicebear"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;dicebear&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/angular"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;angular&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/emoji"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;emoji&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/davidongora/generating-dynamic-avatars-in-angular-using-dicebear-3npp" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;2&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/davidongora/generating-dynamic-avatars-in-angular-using-dicebear-3npp#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            3 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>avatars</category>
      <category>dicebear</category>
      <category>angular</category>
      <category>emoji</category>
    </item>
    <item>
      <title>Generating Dynamic Avatars in Angular Using DiceBear.</title>
      <dc:creator>David Ongora</dc:creator>
      <pubDate>Fri, 08 Aug 2025 06:31:15 +0000</pubDate>
      <link>https://dev.to/davidongora/generating-dynamic-avatars-in-angular-using-dicebear-3npp</link>
      <guid>https://dev.to/davidongora/generating-dynamic-avatars-in-angular-using-dicebear-3npp</guid>
      <description>&lt;p&gt;User interface personalization has become a cornerstone of modern web applications.&lt;br&gt;
Ever thought of replacing boring user initials with unique, dynamic avatars? With DiceBear &lt;a href="https://www.dicebear.com/" rel="noopener noreferrer"&gt;https://www.dicebear.com/&lt;/a&gt;, you can generate custom, SVG-based avatars right in your Angular app—perfect for user profiles, comments,leaderboards or dashboards.&lt;/p&gt;

&lt;p&gt;sample of profile with initials&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%2Fmka1vbg72k7i55tno3y3.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%2Fmka1vbg72k7i55tno3y3.png" alt="use of person initials" width="59" height="54"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;it looks nice if we give an avatar closer to is name or attributes that define him&lt;/p&gt;

&lt;p&gt;here is one for a coding guru or rather a geek&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%2Fj3ne1gnw7u5r8bvl6xey.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%2Fj3ne1gnw7u5r8bvl6xey.png" alt="use of avatar images" width="234" height="178"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Install DiceBear&lt;/strong&gt;&lt;br&gt;
Choose your package manager:&lt;/p&gt;

&lt;p&gt;npm&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install @dicebear/core @dicebear/collection --save
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;pnpm&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pnpm install @dicebear/core @dicebear/collection --save

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 2: Generate Avatars in Angular&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { createAvatar } from '@dicebear/core';
import { openPeeps } from '@dicebear/collection';
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;then in your component&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;generateAvatar(StudentName: string): SafeUrl | null {
    try {
      if (typeof createAvatar === 'function' &amp;amp;&amp;amp; openPeeps) {
        console.log('name passed to dicebear:', StudentName);
        const avatar = createAvatar(openPeeps, {
          seed: StudentName,
          backgroundColor: ['#E7EDF4'],
          scale: 80
        }).toString();
        return this.sanitizer.bypassSecurityTrustUrl(`data:image/svg+xml;utf8,${encodeURIComponent(avatar)}`);
      }
    } catch (error) {
      console.error('Failed to generate avatar:', error);
      // Fallback to empty or default avatar
      // this.myAvatar = this.sanitizer.bypassSecurityTrustUrl('path/to/default-avatar.svg');
    }
    return null; // Return null if avatar generation fails 
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Template Usage&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;div class="h-9 w-9 flex-shrink-0 rounded-full overflow-hidden bg-gray-200"&amp;gt;
&amp;lt;img [src]="generateAvatar(entry.student.fullname)" alt="Avatar" class="w-full h-full object-cover"&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;why sanitize the urls&lt;/strong&gt;&lt;br&gt;
to avoid getting this warning &lt;/p&gt;

&lt;p&gt;Without Sanitization&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%2Fyhd6bvlx0spg5se4cn7c.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%2Fyhd6bvlx0spg5se4cn7c.png" alt="Without Sanitization" width="542" height="326"&gt;&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%2Fhhrdq81vlz34vvdtuv4e.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%2Fhhrdq81vlz34vvdtuv4e.png" alt="Without Sanitization you get errors" width="545" height="51"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Why Sanitize the URL?&lt;/strong&gt;&lt;br&gt;
Angular blocks unsafe dynamic URLs by default to prevent XSS attacks. Since DiceBear generates SVG markup, we must sanitize it using DomSanitizer&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;how to sanitize the url&lt;/strong&gt;&lt;br&gt;
you can import the safeurl or use it as a pipe if you have it(custom one its not a core pipe).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { DomSanitizer, SafeUrl } from '@angular/platform-browser';

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;return this.sanitizer.bypassSecurityTrustUrl(`data:image/svg+xml;utf8,${encodeURIComponent(avatar)}`);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Before&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%2Fyrpaog6oltosfh3764jl.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%2Fyrpaog6oltosfh3764jl.png" alt="leaderboard using initials" width="257" height="146"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Results&lt;br&gt;
The transformation from static initials to dynamic avatars significantly enhances user interface engagement:&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%2Fe3g7htvl8bdn9go0gksa.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%2Fe3g7htvl8bdn9go0gksa.png" alt="leaderboard using avatars" width="276" height="164"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Names passed as seed to generate those avatars&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%2Ft8eda5wm2izigjpjtwd1.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%2Ft8eda5wm2izigjpjtwd1.png" alt="names passed as 'seed'" width="287" height="65"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why Use DiceBear?&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;No external API calls (avatars are generated on the frontend)&lt;/li&gt;
&lt;li&gt; Highly customizable (choose from multiple styles like lorelei, bottts, open-peeps, etc.)&lt;/li&gt;
&lt;li&gt; Deterministic (same input = same avatar every time)&lt;/li&gt;
&lt;li&gt;Lightweight (SVG-based, no heavy images)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Full Implementation&lt;br&gt;
avatar.component.ts&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
import { createAvatar } from '@dicebear/core';
import { openPeeps } from '@dicebear/collection';
import { DomSanitizer, SafeUrl } from '@angular/platform-browser';

@Component({
  selector: 'app-avatar',
  templateUrl: './avatar.component.html',
})
export class AvatarComponent {

  constructor(private sanitizer: DomSanitizer) {}

  generateAvatar(StudentName: string): SafeUrl | null {
    try {
      if (typeof createAvatar === 'function' &amp;amp;&amp;amp; openPeeps) {
        console.log('name passed to dicebear:', StudentName);
        const avatar = createAvatar(openPeeps, {
          seed: StudentName,
          backgroundColor: ['#E7EDF4'],
          scale: 80
        }).toString();
        return this.sanitizer.bypassSecurityTrustUrl(`data:image/svg+xml;utf8,${encodeURIComponent(avatar)}`);
      }
    } catch (error) {
      console.error('Failed to generate avatar:', error);
      // Fallback to empty or default avatar
      // this.myAvatar = this.sanitizer.bypassSecurityTrustUrl('path/to/default-avatar.svg');
    }
    return null; // Return null if avatar generation fails 
  }
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;avatar.component.html&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;div class="h-9 w-9 flex-shrink-0 rounded-full overflow-hidden bg-gray-200"&amp;gt;
&amp;lt;img [src]="generateAvatar(entry.student.fullname)" alt="Avatar" class="w-full h-full object-cover"&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>avatars</category>
      <category>dicebear</category>
      <category>angular</category>
      <category>emoji</category>
    </item>
    <item>
      <title>Deploy Flutter Web App to Vercel</title>
      <dc:creator>David Ongora</dc:creator>
      <pubDate>Sun, 16 Feb 2025 16:48:21 +0000</pubDate>
      <link>https://dev.to/davidongora/deploy-flutter-web-app-to-vercel-49pp</link>
      <guid>https://dev.to/davidongora/deploy-flutter-web-app-to-vercel-49pp</guid>
      <description>&lt;p&gt;Deploying a Flutter web app to Vercel is a straightforward process that allows you to host your app with ease. Vercel is a popular platform for deploying web applications, and it provides a seamless experience for hosting Flutter web apps. In this guide, we'll walk you through the steps to deploy your Flutter web app to Vercel.&lt;/p&gt;

&lt;p&gt;sample flutter app deployed you can clone it and deploy it&lt;br&gt;
&lt;a href="https://dev.tourl"&gt;https://notes-whiz-14l2.vercel.app/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;github link &lt;a href="https://dev.tourl"&gt;https://github.com/davidongora/NotesWhiz&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prerequisites&lt;/strong&gt;&lt;br&gt;
Before you begin, ensure you have the following:&lt;/p&gt;

&lt;p&gt;A Flutter web app ready for deployment.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A Vercel account (sign up at &lt;a href="https://dev.tourl"&gt;vercel.com&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Git installed on your machine.&lt;/li&gt;
&lt;li&gt;Flutter SDK installed and configured.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Prepare Your Flutter Web App&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ensure your Flutter app is configured for web deployment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enable Web Support:&lt;/strong&gt;&lt;br&gt;
Run the following command to enable web support in your Flutter project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flutter config --enable-web
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Build for Web:&lt;/strong&gt;&lt;br&gt;
Build your Flutter app for the web:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flutter build web
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 2: Push Your Code to GitHub&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Deploy to Vercel&lt;/strong&gt;&lt;br&gt;
Now that your code is on GitHub, you can deploy it to Vercel.&lt;/p&gt;

&lt;p&gt;Log in to Vercel:&lt;br&gt;
Go to vercel.com and log in with your GitHub account.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create a New Project:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Click on the &lt;strong&gt;&lt;em&gt;"New Project"&lt;/em&gt;&lt;/strong&gt; button.&lt;/p&gt;

&lt;p&gt;Select the GitHub repository where your Flutter app is hosted.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configure the Build Settings:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Vercel will automatically detect your Flutter project.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Set the following build settings:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Build Command:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flutter/bin/flutter build web --release
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output Directory:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;build/web
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install Command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if cd flutter; then git pull &amp;amp;&amp;amp; cd .. ; else git clone https://github.com/flutter/flutter.git; fi &amp;amp;&amp;amp; ls &amp;amp;&amp;amp; flutter/bin/flutter doctor &amp;amp;&amp;amp; flutter/bin/flutter clean &amp;amp;&amp;amp; flutter/bin/flutter config --enable-web
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Deploy:&lt;/p&gt;

&lt;p&gt;Click the &lt;em&gt;&lt;strong&gt;"Deploy"&lt;/strong&gt;&lt;/em&gt; button.&lt;/p&gt;

&lt;p&gt;Vercel will start building your Flutter web app. This process may take a few minutes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4: Access Your Deployed Site&lt;/strong&gt;&lt;br&gt;
Once the build is complete, Vercel will provide you with a live URL for your deployed Flutter web app. You can access your app by clicking the link provided in the Vercel dashboard.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5: Custom Domain (Optional)&lt;/strong&gt;&lt;br&gt;
If you want to use a custom domain for your Flutter web app:&lt;/p&gt;

&lt;p&gt;Go to the "Domains" section in your Vercel dashboard.&lt;/p&gt;

&lt;p&gt;Add your custom domain and follow the instructions to configure DNS settings.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Troubleshooting&lt;/strong&gt;&lt;br&gt;
If you encounter issues during deployment, check the following:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Flutter Web Compatibility:&lt;/strong&gt;&lt;br&gt;
Ensure your app and its dependencies are compatible with the web platform. Avoid using libraries like dart:ffi that are not supported on the web.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Build Logs:&lt;/strong&gt;&lt;br&gt;
Check the build logs in the Vercel dashboard for detailed error messages.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Flutter Version:&lt;/strong&gt;&lt;br&gt;
Ensure you're using a stable version of Flutter. Run flutter upgrade to update your Flutter SDK.&lt;/p&gt;

&lt;p&gt;Deploying a Flutter web app to Vercel is a quick and efficient way to host your app. By following the steps outlined in this guide, you can easily deploy your Flutter web app and share it with the world. Happy coding! 🚀&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>vercel</category>
      <category>flutter</category>
      <category>dart</category>
    </item>
    <item>
      <title>Building an Angular Component Library</title>
      <dc:creator>David Ongora</dc:creator>
      <pubDate>Thu, 13 Feb 2025 18:17:04 +0000</pubDate>
      <link>https://dev.to/davidongora/building-an-angular-component-library-57fn</link>
      <guid>https://dev.to/davidongora/building-an-angular-component-library-57fn</guid>
      <description>&lt;p&gt;Steps on how to create a component library in Angular, using the Chimoney library as a use case.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Building an Angular Component Library: The Chimoney Use Case&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Creating a reusable component library in Angular can streamline your development process, allowing you to build consistent user interfaces across multiple applications. In this blog post, we will walk through the steps to create a component library using our Chimoney library as an example.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Setting Up the Angular Library&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;First, we need to set up our Angular library. You can create a new library using the Angular CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ng generate library ngx-chimoney-airtime-payouts

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command will create a new library named &lt;code&gt;ngx-chimoney-airtime-payouts&lt;/code&gt; in your Angular workspace.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Structuring the Library&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Your library will have the following structure:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;br&gt;
projects/&lt;br&gt;
└── ngx-chimoney-airtime-payouts/&lt;br&gt;
├── src/&lt;br&gt;
│ ├── lib/&lt;br&gt;
│ │ ├── components/&lt;br&gt;
│ │ │ ├── airtime/&lt;br&gt;
│ │ │ ├── bank/&lt;br&gt;
│ │ │ └── payouts/&lt;br&gt;
│ │ ├── ngx-chimoney-airtime-payouts.component.ts&lt;br&gt;
│ │ └── ngx-chimoney-airtime-payouts.service.ts&lt;br&gt;
│ └── public-api.ts&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
In the &lt;code&gt;public-api.ts&lt;/code&gt; file, you can export your components and services:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/*
* Public API Surface of ngx-chimoney-airtime-payouts
*/

export * from ‘./lib/ngx-chimoney-airtime-payouts.service’;
export * from ‘./lib/ngx-chimoney-airtime-payouts.component’;

// Components
export * from ‘./lib/components/airtime/airtime.component’;
export * from ‘./lib/components/bank/bank.component’;
export * from ‘./lib/components/payouts/payouts.component’;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 2: Building the Library&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After implementing your components, it’s time to build the library. Use the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ng build ngx-chimoney-airtime-payouts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command generates a &lt;code&gt;dist&lt;/code&gt; folder containing the compiled library.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Packing the Library&lt;/strong&gt;&lt;br&gt;
To use your library locally without publishing it to npm, you can create a package file. Navigate to the &lt;code&gt;dist&lt;/code&gt; folder of your library:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd dist/ngx-chimoney-airtime-payouts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm pack
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command will create a &lt;code&gt;.tgz&lt;/code&gt; file (e.g., &lt;code&gt;ngx-chimoney-airtime-payouts-0.0.1.tgz&lt;/code&gt;) in the current directory.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4: Installing the Library Locally&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Copy the generated &lt;code&gt;.tgz&lt;/code&gt; file to the root directory of the application where you want to use it. Then, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install ngx-chimoney-airtime-payouts-0.0.1.tgz
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command installs your library locally, allowing you to use it in your application.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5: Using the Library in Your Application&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now that your library is installed, you can use its components in your application. First, import the required modules in your application:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { FormsModule } from ‘@angular/forms’;
import { Component } from ‘@angular/core’;
import { RouterOutlet } from ‘@angular/router’;
import { PayoutsModule } from ‘ngx-chimoney-airtime-payouts’;
import { PayoutsComponent } from ‘ngx-chimoney-airtime-payouts’;
import { BankComponent } from ‘ngx-chimoney-airtime-payouts’;
import { AirtimeComponent } from ‘ngx-chimoney-airtime-payouts’;

@Component({
selector: ‘app-root’,
standalone: true,
imports: [
RouterOutlet,
PayoutsModule,
PayoutsComponent,
BankComponent,
AirtimeComponent,
FormsModule,
],
templateUrl: ‘./app.component.html’,
styleUrls: [‘./app.component.css’]
})
export class AppComponent {
title = ‘payouts-sample’;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In your template, you can now use the components as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;payouts-component&amp;gt;&amp;lt;/payouts-component&amp;gt;
&amp;lt;bank-component&amp;gt;&amp;lt;/bank-component&amp;gt;
&amp;lt;airtime-component&amp;gt;&amp;lt;/airtime-component&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;*&lt;em&gt;Step 6: Publishing the Library&lt;br&gt;
*&lt;/em&gt;&lt;br&gt;
If you decide to share your library with the world, you can publish it to npm. Make sure you have an account on npm and are logged in. Use the following command to publish:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm publish dist/ngx-chimoney-airtime-payouts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command will make your library available for installation via npm, allowing others to use it in their Angular applications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Creating a component library in Angular not only promotes reusability but also helps maintain consistency across your projects. By following the steps outlined in this blog post, you can easily build, pack, and publish your Angular component library, like our Chimoney library. Happy coding!&lt;/p&gt;

</description>
      <category>angular</category>
      <category>webdev</category>
      <category>opensource</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
