<?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: Maxime Lafarie</title>
    <description>The latest articles on DEV Community by Maxime Lafarie (@max).</description>
    <link>https://dev.to/max</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%2F179443%2F57a6f80f-2cbd-4b73-98e2-7217a4419ea7.jpeg</url>
      <title>DEV Community: Maxime Lafarie</title>
      <link>https://dev.to/max</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/max"/>
    <language>en</language>
    <item>
      <title>Build dynamic Angular forms on-the-fly</title>
      <dc:creator>Maxime Lafarie</dc:creator>
      <pubDate>Tue, 10 Dec 2019 13:20:12 +0000</pubDate>
      <link>https://dev.to/max/build-dynamic-angular-forms-on-the-fly-4n3m</link>
      <guid>https://dev.to/max/build-dynamic-angular-forms-on-the-fly-4n3m</guid>
      <description>&lt;p&gt;Forms never been a simple thing to deal with in Angular projects: you need to design each of them "properly" in the markup but also in the component with &lt;code&gt;FormControls&lt;/code&gt; and make sure everything fits well together.&lt;br&gt;
You also have to keep in mind that it will probably change frequently to meet the rapidly changing business and regulatory requirements.&lt;/p&gt;

&lt;p&gt;We will see how to create on-the-fly forms with metadata that describes the business object model.&lt;/p&gt;
&lt;h1&gt;
  
  
  The metadata
&lt;/h1&gt;

&lt;p&gt;The metadata will feed our system to indicate what will be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the values&lt;/li&gt;
&lt;li&gt;the field name&lt;/li&gt;
&lt;li&gt;the field type&lt;/li&gt;
&lt;li&gt;the validation conditions&lt;/li&gt;
&lt;li&gt;other things like placeholders, patterns and so on...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It will be structured in JSON, but you can obviously use the language you want: JSON+LD, csv, XML or whatever format you like.&lt;/p&gt;

&lt;p&gt;The data source also could be an API, a file or any other available source of data.&lt;/p&gt;

&lt;p&gt;In JSON, it will look like this (you can obviously adapt it to your needs):&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;// question-base.ts&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;QuestionBase&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;key&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="nl"&gt;label&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="nl"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;order&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="nl"&gt;controlType&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="nl"&gt;placeholder&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="nl"&gt;iterable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&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 will be a skeleton for every other kind of elements we would create like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;input&lt;/li&gt;
&lt;li&gt;textarea&lt;/li&gt;
&lt;li&gt;select&lt;/li&gt;
&lt;li&gt;any other form field...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each of these form elements will share the same &lt;code&gt;Class&lt;/code&gt; and extends it for their proper needs. For example &lt;code&gt;option&lt;/code&gt; will only be useful for &lt;code&gt;&amp;lt;select&amp;gt;&lt;/code&gt; element:&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;// question-dropdown.ts&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;QuestionBase&lt;/span&gt; &lt;span class="p"&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;./question-base&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="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DropdownQuestion&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;QuestionBase&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="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;controlType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dropdown&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;key&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="na"&gt;value&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;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;

  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&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="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;);&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;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;options&lt;/span&gt;&lt;span class="dl"&gt;'&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="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h1&gt;
  
  
  The component
&lt;/h1&gt;

&lt;p&gt;In order to make the code flexible, reliable, easily testable and maintainable, it has been spared in two parts. Firstly, there is the component (&lt;code&gt;app-dynamic-form&lt;/code&gt;) that will always be called in app's components as a wrapper:&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="c"&gt;&amp;lt;!-- app.component.html --&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;app-dynamic-form&lt;/span&gt; &lt;span class="na"&gt;#dynamicForm&lt;/span&gt;
                  &lt;span class="na"&gt;[questions]=&lt;/span&gt;&lt;span class="s"&gt;"questions"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/app-dynamic-form&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;and then, the &lt;code&gt;app-question&lt;/code&gt; component that will be called and repeated by &lt;code&gt;app-dynamic-form&lt;/code&gt; in order to create each separate form field:&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="c"&gt;&amp;lt;!-- dynamic-form.component.html --&amp;gt;&lt;/span&gt;

...
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;*ngFor=&lt;/span&gt;&lt;span class="s"&gt;"let question of questions"&lt;/span&gt;
     &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"form-row"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;app-question&lt;/span&gt; &lt;span class="na"&gt;[question]=&lt;/span&gt;&lt;span class="s"&gt;"question"&lt;/span&gt;
                &lt;span class="na"&gt;[form]=&lt;/span&gt;&lt;span class="s"&gt;"form"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/app-question&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h1&gt;
  
  
  Make it iterable (repeatable)
&lt;/h1&gt;

&lt;p&gt;As you can see above, &lt;code&gt;app-question&lt;/code&gt; is wrapped inside an &lt;code&gt;ngFor&lt;/code&gt; that loops over a collection of &lt;code&gt;questions&lt;/code&gt;, which is nothing else than an array of &lt;code&gt;QuestionBase&lt;/code&gt; as demonstrated at the beginning of this article.&lt;/p&gt;

&lt;p&gt;Inside this component, there's an &lt;code&gt;ngSwitch&lt;/code&gt;. Its job is to display the right HTMLElement depending on the type of field given in the object:&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="c"&gt;&amp;lt;!-- dynamic-form-question.component.html --&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;[ngSwitch]=&lt;/span&gt;&lt;span class="s"&gt;"question.controlType"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;*ngSwitchCase=&lt;/span&gt;&lt;span class="s"&gt;"'textbox'"&lt;/span&gt;
            &lt;span class="na"&gt;[formControl]=&lt;/span&gt;&lt;span class="s"&gt;"questionControl(index)"&lt;/span&gt;
            &lt;span class="na"&gt;[placeholder]=&lt;/span&gt;&lt;span class="s"&gt;"question.placeholder"&lt;/span&gt;
            &lt;span class="na"&gt;[attr.min]=&lt;/span&gt;&lt;span class="s"&gt;"question['min']"&lt;/span&gt;
            &lt;span class="na"&gt;[attr.max]=&lt;/span&gt;&lt;span class="s"&gt;"question['max']"&lt;/span&gt;
            &lt;span class="na"&gt;[attr.pattern]=&lt;/span&gt;&lt;span class="s"&gt;"question['pattern']"&lt;/span&gt;
            &lt;span class="na"&gt;[id]=&lt;/span&gt;&lt;span class="s"&gt;"questionId(index)"&lt;/span&gt;
            &lt;span class="na"&gt;[type]=&lt;/span&gt;&lt;span class="s"&gt;"question['type']"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;select&lt;/span&gt; &lt;span class="na"&gt;[id]=&lt;/span&gt;&lt;span class="s"&gt;"question.key"&lt;/span&gt;
            &lt;span class="na"&gt;*ngSwitchCase=&lt;/span&gt;&lt;span class="s"&gt;"'dropdown'"&lt;/span&gt;
            &lt;span class="na"&gt;[formControl]=&lt;/span&gt;&lt;span class="s"&gt;"questionControl(index)"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;
            &lt;span class="na"&gt;disabled&lt;/span&gt;
            &lt;span class="na"&gt;*ngIf=&lt;/span&gt;&lt;span class="s"&gt;"!!question.placeholder"&lt;/span&gt;
            &lt;span class="na"&gt;selected&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{{ question.placeholder }}&lt;span class="nt"&gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;*ngFor=&lt;/span&gt;&lt;span class="s"&gt;"let opt of question['options']"&lt;/span&gt;
            &lt;span class="na"&gt;[value]=&lt;/span&gt;&lt;span class="s"&gt;"opt.key"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{{ opt.value }}&lt;span class="nt"&gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/select&amp;gt;&lt;/span&gt;

    ...

&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;You may have noticed the way we're passing attributes values like &lt;code&gt;[attr.min]="question['min']"&lt;/code&gt; to elements with &lt;code&gt;options&lt;/code&gt; attributes assigned in the &lt;code&gt;constructor&lt;/code&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="c1"&gt;// question-dropdown.ts&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;QuestionBase&lt;/span&gt; &lt;span class="p"&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;./question-base&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="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TextboxQuestion&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;QuestionBase&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="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;type&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="nl"&gt;min&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;|&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;...&lt;/span&gt;

  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&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="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&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;text&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&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;min&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;min&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;But there's not only &lt;code&gt;FormControl&lt;/code&gt;s to display, &lt;code&gt;FormArray&lt;/code&gt;'s nice too! So let's go with some content projection:&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="c"&gt;&amp;lt;!-- dynamic-form-question.component.html --&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;*ngIf=&lt;/span&gt;&lt;span class="s"&gt;"question.iterable; else formTmpl"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;*ngFor=&lt;/span&gt;&lt;span class="s"&gt;"let field of questionArray.controls; 
                 let i=index; first as isFirst last as isLast"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

        &lt;span class="nt"&gt;&amp;lt;ng-container&lt;/span&gt; &lt;span class="na"&gt;[ngTemplateOutlet]=&lt;/span&gt;&lt;span class="s"&gt;"formTmpl"&lt;/span&gt;
                    &lt;span class="na"&gt;[ngTemplateOutletContext]=&lt;/span&gt;&lt;span class="s"&gt;"{index: i}"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/ng-container&amp;gt;&lt;/span&gt;

        &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;*ngIf=&lt;/span&gt;&lt;span class="s"&gt;"question.iterable &amp;amp;&amp;amp; questionArray.controls.length &amp;gt; 1"&lt;/span&gt;
                &lt;span class="na"&gt;(click)=&lt;/span&gt;&lt;span class="s"&gt;"removeQuestion(i)"&lt;/span&gt;
                &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"button"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;-&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;

        &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;*ngIf=&lt;/span&gt;&lt;span class="s"&gt;"question.iterable &amp;amp;&amp;amp; isLast"&lt;/span&gt;
                &lt;span class="na"&gt;(click)=&lt;/span&gt;&lt;span class="s"&gt;"addQuestion()"&lt;/span&gt;
                &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"button"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;+&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;You can see that this line &lt;code&gt;&amp;lt;div *ngIf="question.iterable; else formTmpl"&amp;gt;&lt;/code&gt; is the one who decides to display either a collection of &lt;code&gt;FormArray&lt;/code&gt; or a simple &lt;code&gt;FormControl&lt;/code&gt; so it is wrapped in an &lt;code&gt;ng-template&lt;/code&gt;. I'm passing current index with &lt;code&gt;let-index="index"&lt;/code&gt; given that this is the only way to know in which iteration step we are:&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="c"&gt;&amp;lt;!-- dynamic-form-question.component.html --&amp;gt;&lt;/span&gt;
  ..
  &lt;span class="nt"&gt;&amp;lt;ng-template&lt;/span&gt; &lt;span class="na"&gt;#formTmpl&lt;/span&gt;
               &lt;span class="na"&gt;let-index=&lt;/span&gt;&lt;span class="s"&gt;"index"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;[attr.for]=&lt;/span&gt;&lt;span class="s"&gt;"questionId(index)"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{{ questionLabel(index) }}&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;[ngSwitch]=&lt;/span&gt;&lt;span class="s"&gt;"question.controlType"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The challenge here is to keep the "link" with the right &lt;code&gt;question&lt;/code&gt; element (the one we're iterating on) because with this configuration there will be &lt;code&gt;questions&lt;/code&gt; in a &lt;code&gt;question&lt;/code&gt;. Types and classes will remain the same at this point because the only way to determine if a &lt;code&gt;question&lt;/code&gt; is iterable is to check the &lt;code&gt;iterable&lt;/code&gt; property of the &lt;code&gt;question&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Thanks to the &lt;code&gt;index&lt;/code&gt; property injected with &lt;code&gt;&amp;lt;ng-template #formTmpl let-index="index"&amp;gt;&lt;/code&gt;, we can easily retrieve it in &lt;code&gt;ngTemplateOutletContext&lt;/code&gt; with:&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;ng-container&lt;/span&gt; &lt;span class="na"&gt;[ngTemplateOutlet]=&lt;/span&gt;&lt;span class="s"&gt;"formTmpl"&lt;/span&gt;
              &lt;span class="na"&gt;[ngTemplateOutletContext]=&lt;/span&gt;&lt;span class="s"&gt;"{index: i}"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/ng-container&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;and do the job on the right iteration of the collection.&lt;/p&gt;
&lt;h1&gt;
  
  
  Demo &amp;amp; code
&lt;/h1&gt;

&lt;p&gt;All of the source code is available on Github and a demo is already available if you are just curious to see the awesomeness of the dynamic forms!&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%2F4nytgg3mnmgmh7fldua6.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%2F4nytgg3mnmgmh7fldua6.png" alt="A preview of the demo" width="800" height="663"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/maximelafarie" rel="noopener noreferrer"&gt;
        maximelafarie
      &lt;/a&gt; / &lt;a href="https://github.com/maximelafarie/angular-dynamic-forms" rel="noopener noreferrer"&gt;
        angular-dynamic-forms
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      On-the-fly form generation from data with Angular
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;center&gt;&lt;strong&gt;🔥&lt;a href="https://maximelafarie.com/angular-dynamic-forms" rel="noopener noreferrer"&gt;Demo available here&lt;/a&gt;🔥&lt;/strong&gt;&lt;/center&gt;




&lt;p&gt;Credits&lt;/p&gt;

&lt;p&gt;&lt;sup&gt;Photo by &lt;a href="https://unsplash.com/@patresinger?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Patrick Langwallner&lt;/a&gt; on &lt;a href="https://unsplash.com/search/photos/liberty-statue?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/sup&gt;&lt;br&gt;
&lt;sup&gt;Many thanks to &lt;a href="https://twitter.com/manekinekko" rel="noopener noreferrer"&gt;@manekinekko&lt;/a&gt; for rereading &amp;amp; correction&lt;/sup&gt;&lt;/p&gt;

</description>
      <category>angular</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Improve your GitHub repo visibility on Social Networks</title>
      <dc:creator>Maxime Lafarie</dc:creator>
      <pubDate>Thu, 27 Jun 2019 13:15:13 +0000</pubDate>
      <link>https://dev.to/max/improve-your-github-repo-visibility-on-social-networks-2be0</link>
      <guid>https://dev.to/max/improve-your-github-repo-visibility-on-social-networks-2be0</guid>
      <description>&lt;p&gt;I just discovered a very interesting way to improve the display of a GitHub repository on social networks!&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%2Fnxj4clqjnb96jt0xfx74.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%2Fnxj4clqjnb96jt0xfx74.gif" width="445" height="280"&gt;&lt;/a&gt;&lt;/p&gt;
Really?



&lt;p&gt;Basically, when you publish a link to a GitHub repository on a platform that supports meta tags (like OpenGraph), the display is a little poor:&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%2Fjdlupkzr8x50topmepvv.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%2Fjdlupkzr8x50topmepvv.png" width="800" height="344"&gt;&lt;/a&gt;&lt;/p&gt;
An overview of how Facebook displays it



&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%2Fmo2m5flsa35aawaggkui.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%2Fmo2m5flsa35aawaggkui.png" width="800" height="323"&gt;&lt;/a&gt;&lt;/p&gt;
An overview of how Twitter displays it



&lt;p&gt;Indeed, a new "Social preview" section has recently appeared in the repository settings.&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%2Fhn1f7t41b5q57iiwvpss.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%2Fhn1f7t41b5q57iiwvpss.png" width="800" height="323"&gt;&lt;/a&gt;&lt;/p&gt;
It's that simple!



&lt;p&gt;From then on, you can define an image to customize (improve) the appearance of your repository on social networks. The recommended image size for optimal display is 1280×640px. The minimum size is 640×320px.&lt;br&gt;
You also have the possibility to download a basic template that will help you create (if you have not already done so) your image with optimized margin management.&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%2Fh6k88nsplqjuak3gyrgr.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%2Fh6k88nsplqjuak3gyrgr.png" width="800" height="323"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is the result once the new image has been uploaded:&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%2F8zq95ybej4cjma0jvuhk.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%2F8zq95ybej4cjma0jvuhk.png" width="800" height="324"&gt;&lt;/a&gt;&lt;/p&gt;
On Facebook



&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%2Fnmmng6uf1ikolrtttuhm.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%2Fnmmng6uf1ikolrtttuhm.png" width="800" height="323"&gt;&lt;/a&gt;&lt;/p&gt;
On Twitter



&lt;p&gt;Here is a simple way to look after the appearance of your repository on social networks and sites that support meta tag display.&lt;/p&gt;

&lt;p&gt;Cheers! 🖖&lt;/p&gt;

</description>
      <category>github</category>
      <category>discuss</category>
      <category>tutorial</category>
      <category>seo</category>
    </item>
    <item>
      <title>It's Friday: let's dev in music!</title>
      <dc:creator>Maxime Lafarie</dc:creator>
      <pubDate>Fri, 14 Jun 2019 14:59:35 +0000</pubDate>
      <link>https://dev.to/max/it-s-friday-let-s-dev-in-music-2gc9</link>
      <guid>https://dev.to/max/it-s-friday-let-s-dev-in-music-2gc9</guid>
      <description>&lt;p&gt;As a developer, I really enjoy to code while listening to some music (it's one of the benefits of our job). I think it helps me to focus and destress.&lt;/p&gt;

&lt;p&gt;At work, when I look around me, there's only one or two people who aren't wearing headphones... 😅&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%2Fiej729qfrj65c0u5ep45.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%2Fiej729qfrj65c0u5ep45.gif" alt="Pingu" width="500" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'll share with you each Friday a song that I particularly liked. I know everybody won't like the songs I'll share, but it's not the main purpose. The goal of these posts is to exchange about this awesome way to focus or chill up in our job (coding is stressing and it varies depending on each developer).&lt;/p&gt;

&lt;p&gt;Why ? I think we can all exchange about songs and kind of music that we're listening to at job (and why). To my mind, it brings joy and happiness (especially the Friday). Let's relax and enjoy life a little bit!&lt;/p&gt;

&lt;p&gt;Today, it's the song "Love.Me" from the artist "Driver". It comes from the album "Forest" which is really good.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/q0AOk4CxYhw"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Feel free to let me know if you liked the song, the post type and to share any song you're currently listening to and what is the importance of music at work for you.&lt;/p&gt;

&lt;p&gt;Finally, I would like to share with you this awesome article that deals with music at work:&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__link"&gt;
  &lt;a href="/perigk" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&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%2F57084%2F9b94dba7-45b9-4822-8e81-22b6c10bfd53.jpeg" alt="perigk"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/perigk/the-definite-guide-to-pick-the-correct-music-while-working-2e7n" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;The Definite Guide to Pick the Correct Music While Working&lt;/h2&gt;
      &lt;h3&gt;Periklis Gkolias ・ Aug 27 '18&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#music&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#productivity&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#binauralbeats&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;Have a nice Friday! 🖖&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>music</category>
      <category>productivity</category>
      <category>friday</category>
    </item>
    <item>
      <title>How to enable night mode on Dev.to</title>
      <dc:creator>Maxime Lafarie</dc:creator>
      <pubDate>Fri, 14 Jun 2019 09:33:56 +0000</pubDate>
      <link>https://dev.to/max/how-to-enable-dark-mode-on-dev-to-4c3f</link>
      <guid>https://dev.to/max/how-to-enable-dark-mode-on-dev-to-4c3f</guid>
      <description>&lt;p&gt;I saw many people trying to get Dev.to in night mode with extensions, code tricks and so on.&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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fswctvf6hb9zumn10n4gd.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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fswctvf6hb9zumn10n4gd.png" alt="my alt text" width="800" height="579"&gt;&lt;/a&gt;&lt;br&gt;A preview of how Dev.to's night mode is looking
  &lt;/p&gt;

&lt;p&gt;The only thing you need to know in order to enable night mode in Dev.to is going to: &lt;strong&gt;Your profile -&amp;gt; Settings -&amp;gt; Misc (left menu)&lt;/strong&gt; and changing the theme you want in the &lt;strong&gt;Style Customization -&amp;gt; Site Theme&lt;/strong&gt; category.&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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fcqkj4umvs33rqb8gztvf.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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fcqkj4umvs33rqb8gztvf.png" alt="my alt text" width="800" height="781"&gt;&lt;/a&gt;&lt;br&gt;Here you can switch between several themes for Dev.to
  &lt;/p&gt;

&lt;p&gt;Click the &lt;strong&gt;Submit&lt;/strong&gt; button and Enjoy! 🖖&lt;/p&gt;

&lt;p&gt;Please note that the night mode on Dev.to is in public beta. If you want to contribute, you can go on the GitHub repo. 🤓&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/forem" rel="noopener noreferrer"&gt;
        forem
      &lt;/a&gt; / &lt;a href="https://github.com/forem/forem" rel="noopener noreferrer"&gt;
        forem
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      For empowering community 🌱
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div&gt;
  &lt;br&gt;
  &lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Forem 🌱&lt;/h1&gt;
&lt;/div&gt;
  &lt;strong&gt;For Empowering Community&lt;/strong&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;p&gt;
  &lt;a href="https://github.com/forem/forem/actions/workflows/ci.yml" rel="noopener noreferrer"&gt;
    &lt;img src="https://github.com/forem/forem/actions/workflows/ci.yml/badge.svg" alt="Build Status"&gt;
  &lt;/a&gt;
  &lt;a href="https://github.com/forem/forem/actions/workflows/cd.yml" rel="noopener noreferrer"&gt;
    &lt;img src="https://github.com/forem/forem/actions/workflows/cd.yml/badge.svg" alt="Build Status"&gt;
  &lt;/a&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/24d41800668b2023ad972b9ce8cd56b71d457f7b4b7bee64a9997ac8b836cefb/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6d6d69742d61637469766974792f772f666f72656d2f666f72656d"&gt;&lt;img src="https://camo.githubusercontent.com/24d41800668b2023ad972b9ce8cd56b71d457f7b4b7bee64a9997ac8b836cefb/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6d6d69742d61637469766974792f772f666f72656d2f666f72656d" alt="GitHub commit activity"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/forem/forem/issues?q=is%3Aissue+is%3Aopen+label%3A%22ready+for+dev%22" rel="noopener noreferrer"&gt;
    &lt;img src="https://camo.githubusercontent.com/7d0fbb38f76537b40744f80a5f7df5e69890a83b6c68b9146e1a2a47f6af9872/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732f666f72656d2f666f72656d2f726561647920666f7220646576" alt="GitHub issues ready for dev"&gt;
  &lt;/a&gt;
  &lt;a href="https://gitpod.io/#https://github.com/forem/forem" rel="nofollow noopener noreferrer"&gt;
    &lt;img src="https://camo.githubusercontent.com/bc096cd0ecba7968363d86d4bcd0721112b89d0df0da8a90cb730a91c05beb73/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f73657475702d6175746f6d617465642d626c75653f6c6f676f3d676974706f64" alt="GitPod badge"&gt;
  &lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Welcome to the &lt;a href="https://forem.com" rel="nofollow noopener noreferrer"&gt;Forem&lt;/a&gt; codebase, the platform that powers
&lt;a href="https://dev.to" rel="nofollow"&gt;dev.to&lt;/a&gt;. We are so excited to have you. With your help, we can
build out Forem’s usability, scalability, and stability to better serve our
communities.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What is Forem?&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Forem is open source software for building communities. Communities for your
peers, customers, fanbases, families, friends, and any other time and space
where people need to come together to be part of a collective
&lt;a href="https://dev.to/devteam/for-empowering-community-2k6h" rel="nofollow"&gt;See our announcement post&lt;/a&gt;
for a high-level overview of what Forem is.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://dev.to" rel="nofollow"&gt;dev.to&lt;/a&gt; (or just DEV) is hosted by Forem. It is a community of
software developers who write articles, take part in discussions, and build
their professional profiles. We value supportive and constructive dialogue in
the pursuit of great code and career growth for all members. The ecosystem spans
from beginner to advanced developers, and all are welcome to find their place…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/forem/forem" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


</description>
      <category>productivity</category>
      <category>tutorial</category>
      <category>discuss</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
