<?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: Niklas Kiefer</title>
    <description>The latest articles on DEV Community by Niklas Kiefer (@pinussilvestrus).</description>
    <link>https://dev.to/pinussilvestrus</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%2F64163%2F77356439-cc89-4906-888c-52a0c7ab5ab5.png</url>
      <title>DEV Community: Niklas Kiefer</title>
      <link>https://dev.to/pinussilvestrus</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pinussilvestrus"/>
    <language>en</language>
    <item>
      <title>use-spinner - Show loading spinners for your asynchronous calls</title>
      <dc:creator>Niklas Kiefer</dc:creator>
      <pubDate>Sat, 03 Apr 2021 08:41:55 +0000</pubDate>
      <link>https://dev.to/pinussilvestrus/use-spinner-show-loading-spinners-for-your-asynchronous-calls-43o2</link>
      <guid>https://dev.to/pinussilvestrus/use-spinner-show-loading-spinners-for-your-asynchronous-calls-43o2</guid>
      <description>&lt;p&gt;Hello community 👋&lt;/p&gt;

&lt;p&gt;Sometimes calls can take longer, so showing a loading spinner becomes an option to fill the gap. I was tired of configuring such spinners times and times again.&lt;/p&gt;

&lt;p&gt;Yesterday I built a tiny Javascript library called &lt;a href="https://github.com/pinussilvestrus/use-spinner" rel="noopener noreferrer"&gt;&lt;code&gt;use-spinner&lt;/code&gt;&lt;/a&gt; that simply wraps asynchronous calls into a new function adding a loading spinner to the DOM.&lt;/p&gt;

&lt;p&gt;Simply install the module&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--save&lt;/span&gt; use-spinner


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

&lt;/div&gt;
&lt;p&gt;and embed it in your Node.js styled application.&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;useSpinner&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;use-spinner&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;use-spinner/assets/use-spinner.css&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mySlowCall&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &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;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="cm"&gt;/*...*/&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;spinned&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useSpinner&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mySlowCall&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;spinned&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;


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

&lt;/div&gt;
&lt;p&gt;&lt;a href="https://media.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%2Fbv6g2hpitdr8rhv43pw7.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fbv6g2hpitdr8rhv43pw7.gif" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Of course, it is rather rudimentary right now and the spinner itself is hardly customizable. However, I like the easiness of integration to existing functions without much configuration.&lt;/p&gt;

&lt;p&gt;Enjoy ❤️&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/pinussilvestrus" rel="noopener noreferrer"&gt;
        pinussilvestrus
      &lt;/a&gt; / &lt;a href="https://github.com/pinussilvestrus/use-spinner" rel="noopener noreferrer"&gt;
        use-spinner
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Add a simple loading spinner to your async JS calls - built for the browser.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;use-spinner&lt;/h1&gt;

&lt;/div&gt;

&lt;p&gt;&lt;a href="https://github.com/pinussilvestrus/use-spinner/actions/workflows/CI.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/pinussilvestrus/use-spinner/actions/workflows/CI.yml/badge.svg" alt="CI"&gt;&lt;/a&gt; &lt;a href="https://bundlephobia.com/result?p=use-spinner@latest" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/d75bcebd44f0342ed5965b1f623973fa10ed0dfe5d022b257ce859bf9ee2d36c/68747470733a2f2f696d672e736869656c64732e696f2f62756e646c6570686f6269612f6d696e7a69702f7573652d7370696e6e65723f6c6162656c3d7061636b61676525323073697a65" alt="npm bundle size"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Add a simple loading spinner to your async JS calls - built for the browser.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Installation&lt;/h2&gt;

&lt;/div&gt;

&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;$ npm install --save use-spinner&lt;/pre&gt;

&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Usage&lt;/h2&gt;

&lt;/div&gt;

&lt;div class="highlight highlight-source-js notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-k"&gt;import&lt;/span&gt; &lt;span class="pl-s1"&gt;useSpinner&lt;/span&gt; &lt;span class="pl-k"&gt;from&lt;/span&gt; &lt;span class="pl-s"&gt;'use-spinner'&lt;/span&gt;&lt;span class="pl-kos"&gt;;&lt;/span&gt;

&lt;span class="pl-k"&gt;import&lt;/span&gt; &lt;span class="pl-s"&gt;'use-spinner/assets/use-spinner.css'&lt;/span&gt;&lt;span class="pl-kos"&gt;;&lt;/span&gt;

&lt;span class="pl-k"&gt;const&lt;/span&gt; &lt;span class="pl-en"&gt;fn&lt;/span&gt; &lt;span class="pl-c1"&gt;=&lt;/span&gt; &lt;span class="pl-k"&gt;async&lt;/span&gt; &lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt; &lt;span class="pl-c1"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="pl-kos"&gt;{&lt;/span&gt;
  &lt;span class="pl-k"&gt;await&lt;/span&gt; &lt;span class="pl-k"&gt;new&lt;/span&gt; &lt;span class="pl-v"&gt;Promise&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-s1"&gt;resolve&lt;/span&gt; &lt;span class="pl-c1"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="pl-en"&gt;setTimeout&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt; &lt;span class="pl-c1"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="pl-kos"&gt;{&lt;/span&gt;
    &lt;span class="pl-smi"&gt;console&lt;/span&gt;&lt;span class="pl-kos"&gt;.&lt;/span&gt;&lt;span class="pl-en"&gt;log&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-s"&gt;'done.'&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt;&lt;span class="pl-kos"&gt;;&lt;/span&gt;
    &lt;span class="pl-en"&gt;resolve&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt;&lt;span class="pl-kos"&gt;;&lt;/span&gt;
  &lt;span class="pl-kos"&gt;}&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt; &lt;span class="pl-c1"&gt;2000&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt;&lt;span class="pl-kos"&gt;;&lt;/span&gt;
&lt;span class="pl-kos"&gt;}&lt;/span&gt;&lt;span class="pl-kos"&gt;;&lt;/span&gt;

&lt;span class="pl-c"&gt;// wrap your asynchronous function&lt;/span&gt;
&lt;span class="pl-k"&gt;const&lt;/span&gt; &lt;span class="pl-s1"&gt;spinnedFn&lt;/span&gt; &lt;span class="pl-c1"&gt;=&lt;/span&gt; &lt;span class="pl-en"&gt;useSpinner&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-en"&gt;fn&lt;/span&gt;&lt;span class="pl-kos"&gt;,&lt;/span&gt; &lt;span class="pl-kos"&gt;{&lt;/span&gt;
  &lt;span class="pl-c1"&gt;container&lt;/span&gt;: &lt;span class="pl-s"&gt;'body'&lt;/span&gt;
&lt;span class="pl-kos"&gt;}&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt;&lt;span class="pl-kos"&gt;;&lt;/span&gt;

&lt;span class="pl-c"&gt;// execute with a loading spinner&lt;/span&gt;
&lt;span class="pl-k"&gt;await&lt;/span&gt; &lt;span class="pl-s1"&gt;spinnedFn&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt;&lt;span class="pl-kos"&gt;;&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/pinussilvestrus/use-spinner./docs/screencast.gif"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fpinussilvestrus%2Fuse-spinner.%2Fdocs%2Fscreencast.gif" alt="Screencast"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Options&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;The API accepts a second argument configuring the wrapped function. This defaults to:&lt;/p&gt;

&lt;div class="highlight highlight-source-js notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-kos"&gt;{&lt;/span&gt;
  &lt;span class="pl-c1"&gt;container&lt;/span&gt;: &lt;span class="pl-s"&gt;'body'&lt;/span&gt;
&lt;span class="pl-kos"&gt;}&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;container&lt;/em&gt;: a selector or a DOM element that appends the loading spinner.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;License&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;MIT&lt;/p&gt;

&lt;/div&gt;
&lt;br&gt;
&lt;br&gt;
  &lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/pinussilvestrus/use-spinner" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


</description>
      <category>showdev</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>New version of postit-js got published</title>
      <dc:creator>Niklas Kiefer</dc:creator>
      <pubDate>Fri, 12 Mar 2021 14:56:33 +0000</pubDate>
      <link>https://dev.to/pinussilvestrus/new-version-of-postit-js-got-published-2gnm</link>
      <guid>https://dev.to/pinussilvestrus/new-version-of-postit-js-got-published-2gnm</guid>
      <description>&lt;p&gt;Hi folks 👋🏻&lt;/p&gt;

&lt;p&gt;today I just released a new version of &lt;code&gt;postit-js&lt;/code&gt;, an embeddable Javascript library to create simple Brainstorming boards. &lt;/p&gt;

&lt;p&gt;The APIs are now exposing Promises, a proper test infrastructure was established, and on top, the bundle size got reduced decently.&lt;/p&gt;

&lt;p&gt;Simply create your Modeler instance&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;postit-js-core/assets/postit-js.css&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;PostItModeler&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;postit-js-core/lib/Modeler&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;XML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`
&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;
&amp;lt;postit:Definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" id="sample-diagram"&amp;gt;
  &amp;lt;postit:PostitBoard id="Board_1"&amp;gt;
    &amp;lt;postit:SquarePostit name="A new idea" id="Postit_1" color="#7EC845" /&amp;gt;
  &amp;lt;/postit:PostitBoard&amp;gt;
  &amp;lt;postitDi:PostitRootBoard id="RootBoard_1"&amp;gt;
    &amp;lt;postitDi:PostitPlane id="PositPlane_1" boardElement="Board_1"&amp;gt;
      &amp;lt;postitDi:PostitShape id="Postit_1_di" boardElement="Postit_1"&amp;gt;
        &amp;lt;dc:Bounds x="300" y="200" width="150" height="150" /&amp;gt;
      &amp;lt;/postitDi:PostitShape&amp;gt;
    &amp;lt;/postitDi:PostitPlane&amp;gt;
  &amp;lt;/postitDi:PostitRootBoard&amp;gt;
&amp;lt;/postit:Definitions&amp;gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;modeler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;PostItModeler&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;container&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#canvas&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;keyboard&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;bindTo&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="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;modeler&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;importXML&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;XML&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;and go on brainstorming&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bMy9CJVd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7kxsdpwapwbxwt58zh42.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bMy9CJVd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7kxsdpwapwbxwt58zh42.png" alt="Alt Text" width="800" height="544"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Check out &lt;a href="https://postit-js-demo.netlify.app/"&gt;the demo&lt;/a&gt; or the project on GitHub.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--A9-wwsHG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/pinussilvestrus"&gt;
        pinussilvestrus
      &lt;/a&gt; / &lt;a href="https://github.com/pinussilvestrus/postit-js"&gt;
        postit-js
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Create post-it boards - built with diagram-js
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;Have fun!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>diagramjs</category>
      <category>brainstorm</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Thinking Backward - or: searching for the Big Why</title>
      <dc:creator>Niklas Kiefer</dc:creator>
      <pubDate>Sat, 30 Jan 2021 13:02:35 +0000</pubDate>
      <link>https://dev.to/pinussilvestrus/thinking-backward-or-searching-for-the-big-why-44h</link>
      <guid>https://dev.to/pinussilvestrus/thinking-backward-or-searching-for-the-big-why-44h</guid>
      <description>&lt;p&gt;Where to start? Every product work begins with questions like that, no matter if it's ideating a completely new product idea, creating a simple feature enhancement, or fixing a crucial bug.&lt;/p&gt;

&lt;p&gt;I once wrote &lt;a href="https://dev.to/pinussilvestrus/creating-the-unknown-what-and-what-not-to-build-in-efficient-prototypes-467p"&gt;another blog post&lt;/a&gt; about prototyping and how to use it to tackle uncertain problems. &lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/pinussilvestrus" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AndksD3r--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://res.cloudinary.com/practicaldev/image/fetch/s--MIa8wPzV--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/64163/77356439-cc89-4906-888c-52a0c7ab5ab5.png" alt="pinussilvestrus"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/pinussilvestrus/creating-the-unknown-what-and-what-not-to-build-in-efficient-prototypes-467p" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Creating the unknown - What and what not to build in efficient prototypes&lt;/h2&gt;
      &lt;h3&gt;Niklas Kiefer ・ Apr 14 '20&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#webdev&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#ux&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#prototyping&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;At &lt;a href="http://camunda.com/"&gt;Camunda&lt;/a&gt; we follow the mindset to keep our work focused. One thing at a time, but doing this one right. That's great, but how do you know what this &lt;em&gt;one thing&lt;/em&gt; is?&lt;/p&gt;

&lt;p&gt;One principle my team more or less actively used in the past is to &lt;em&gt;work backward&lt;/em&gt;. You might say it sounds like guessing the right solution. Let me explain.&lt;/p&gt;

&lt;h3&gt;
  
  
  Working Backwards © Amazon
&lt;/h3&gt;

&lt;p&gt;The idea of working backward isn't new, &lt;a href="https://www.inc.com/justin-bariso/amazon-uses-a-secret-process-for-launching-new-ideas-and-it-can-transform-way-you-work.html"&gt;Amazon "introduced" it a while ago&lt;/a&gt;. At the very beginning while developing new products, the product manager, or even better the team, writes an internal press release about the finished product. Before creating a single user story, without writing a single line of code.&lt;/p&gt;

&lt;p&gt;The press release should be customer focussed, stating why current solutions are failing and why users will be amazed by the new product. Having this as a "solution sketch" they start iterating, keep on improving it. The key here: "Iterating on a press release is a lot less expensive than iterating on the product itself (and quicker!)" (Ian McAllister). &lt;/p&gt;

&lt;p&gt;I never wrote such a press release as the working backward method requires. What's important to me here are the principles that are behind. That's why I'd rather call it &lt;em&gt;Thinking Backward&lt;/em&gt;. It does not start with a press release, an MVP, a mockup, or a prototype. It starts with thinking.&lt;/p&gt;

&lt;h3&gt;
  
  
  It's all about shaping
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://basecamp.com/shapeup"&gt;Basecamp did tremendous work in the past&lt;/a&gt; to define what shaping of tasks means for successful product development. You could argue it's not feasible for any organization to do those 6 weeks of focused working sprints where the team is absolutely autonomous without any surrounding noise.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cdngklGF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/mr2mj82ajv38n3fc7zs5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cdngklGF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/mr2mj82ajv38n3fc7zs5.png" alt="shape up" width="800" height="292"&gt;&lt;/a&gt;&lt;/p&gt;
Shape up phases by Basecamp, source: https://basecamp.com/shapeup/4.1-appendix-02



&lt;p&gt;What's even more important is the &lt;em&gt;shaping&lt;/em&gt; part at the beginning. Avoiding circles in the development phase is a key part of my personal approach to software development. &lt;/p&gt;

&lt;p&gt;In the end, it's a matter of avoiding waste. Taking more time to &lt;em&gt;really understand&lt;/em&gt;  the problem and identify the core need will produce waste as well. That's okay if you compare the potential waste and problems of redefining requirements and refactoring huge parts of your code at the very end of the development lifecycle.&lt;/p&gt;

&lt;p&gt;The Shape Up "manifesto" from Basecamp itself has this nice sentence: "If we don't make trade-offs upfront by shaping, the universe will force us to make trade-offs later in a mad rush".&lt;/p&gt;

&lt;p&gt;Of course, there will be cases where you feel spending more and more time shaping a topic will cause more effort than needed. Don't come to an end, if taking the bad parts, could even cause mental problems. What's really important in this phase is to gather &lt;em&gt;learnings&lt;/em&gt; and create &lt;em&gt;focus&lt;/em&gt; on the most relevant aspects. &lt;/p&gt;

&lt;p&gt;Afterward, it will be much easier to simply get the stuff done, without getting lost in circles. Build the one thing which matters and do it right. And get this thing done. Which does not mean that circles in the implementation phase are bad. But that's another topic.&lt;/p&gt;

&lt;h3&gt;
  
  
  Begin with the problem - jump back if necessary
&lt;/h3&gt;

&lt;p&gt;Shaping comes along with thinking about the problem in a deeper manner. I tend to start with the following question: what is the main problem we want to tackle and why will users be &lt;em&gt;amazed&lt;/em&gt; by it? That's not easy for sure and depends on a lot of prerequisites and hypotheses you still have to find out.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vxHwrQsN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/jdr9qbp4tj9e1vqkcbdg.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vxHwrQsN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/jdr9qbp4tj9e1vqkcbdg.jpeg" alt="double diamond" width="800" height="432"&gt;&lt;/a&gt;&lt;/p&gt;
The Double Diamond of creating solutions, source: https://www.smashingmagazine.com/2020/05/research-study-double-diamond-model



&lt;p&gt;With this saying, the double diamond is worth to be mentioned. Despite &lt;a href="https://uxdesign.cc/why-the-double-diamond-isnt-enough-adaa48a8aec1"&gt;this model might have some weaknesses&lt;/a&gt;, it shows a very relevant aspect: all the research, all the shaping you do in regards to find a solution, it all aims to find the main problem and to deliver a focus. &lt;/p&gt;

&lt;p&gt;The problem: sometimes it feels like a waterfall. Defining the problem, then defining the requirements, then creating the solution. That's indeed not ideal. The solution space is always re-opening the space of the problem. Therefore it's recommended to take steps back, evaluate the problem, and re-shape it. You may name those problems to be "wicked", Horst Rittel did &lt;a href="https://nnsi.northwestern.edu/wicked-problems-what-are-they-and-why-are-they-of-interest-to-nnsi-researchers/"&gt;a lot of ground keeping work&lt;/a&gt; in this regard.&lt;/p&gt;

&lt;p&gt;By the way: if you also love those diagrams about the double diamond and design thinking, give this website a try: &lt;a href="https://designfuckingthinking.tumblr.com/"&gt;https://designfuckingthinking.tumblr.com/&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Find the Big Why
&lt;/h3&gt;

&lt;p&gt;"Users have to be amazed by the product", that's the spirit of Amazon's working backward method. That's far from being easy. This requires a lot of research to get the real &lt;em&gt;needs&lt;/em&gt; of a user. That's not a high-level exercise, it really goes into the psychology of users while working with our products.&lt;/p&gt;

&lt;p&gt;Thinking backward about the product which aims to be build creates new perspectives. We ask: what makes our users happy? Is there a particular need our product needs to serve?&lt;/p&gt;

&lt;p&gt;I don't want to go too much into detail. What's important is that we can directly influence the way users adopt new products and features by building them in the way they deal with basic psychological needs. &lt;/p&gt;

&lt;p&gt;Don't understand me wrong, it's absolutely not about creating an interface that "looks nice" and the user enjoys from a visual perspective. It's about functionality. &lt;/p&gt;

&lt;p&gt;That's the "Big Why". &lt;a href="http://www.experienceandinteraction.com/tools"&gt;Hassenzahl and Diefenbach&lt;/a&gt; did a lot of known worth research on this topic.&lt;/p&gt;

&lt;h3&gt;
  
  
  It does not have to be a press release
&lt;/h3&gt;

&lt;p&gt;It can be anything that is not a technical prototype nor a design sketch. To give some inspirations &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;write a letter from a user&lt;/li&gt;
&lt;li&gt;write a product review from a user&lt;/li&gt;
&lt;li&gt;create a promotion video&lt;/li&gt;
&lt;li&gt;create a user onboarding&lt;/li&gt;
&lt;li&gt;create a getting started guide&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--b8ECdZZ2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/dttsozvr4bb32ppw5nro.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--b8ECdZZ2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/dttsozvr4bb32ppw5nro.png" alt="letter from a user" width="751" height="1001"&gt;&lt;/a&gt;&lt;/p&gt;
An imaginary letter from a user I recently created in a UX Thinking training (German). The project scope was an application for shared traveling.



&lt;p&gt;At Camunda we recently did the last thing. One project was about creating an embeddable library that our customers can easily integrate into their existing Javascript applications.&lt;/p&gt;

&lt;p&gt;It helped a lot to get an understanding of what the end-users will see at the very first. What would they expect? What are the actual steps they need to do to integrate our library? We took this sketch of a getting started guide, reflect &amp;amp; iterate on it with customers, and came closer to real requirements, step by step.&lt;/p&gt;

&lt;p&gt;This perspective helped in focussing on the most important aspects: What should the user be able to achieve and how can we provide it in the easiest way. Remember: the user has to be amazed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Summary
&lt;/h3&gt;

&lt;p&gt;If you get one thing about the words above, then it should be to keep your work focused. Don't waste your time with features your users don't care about. Take the time to really understand the problem, find out what your users will enjoy the most, and simply get these things done. &lt;/p&gt;

</description>
      <category>productivity</category>
      <category>product</category>
      <category>agile</category>
      <category>development</category>
    </item>
    <item>
      <title>Creating the unknown - What and what not to build in efficient prototypes</title>
      <dc:creator>Niklas Kiefer</dc:creator>
      <pubDate>Tue, 14 Apr 2020 06:00:20 +0000</pubDate>
      <link>https://dev.to/pinussilvestrus/creating-the-unknown-what-and-what-not-to-build-in-efficient-prototypes-467p</link>
      <guid>https://dev.to/pinussilvestrus/creating-the-unknown-what-and-what-not-to-build-in-efficient-prototypes-467p</guid>
      <description>&lt;p&gt;In the last couple of quarters, I did a lot of work in improving the overall modeling experience for the &lt;a href="https://bpmn.io/toolkit/dmn-js/" rel="noopener noreferrer"&gt;dmn-js toolkit&lt;/a&gt;. We decided on an approach that would rather go with building prototypes instead of real features. &lt;/p&gt;

&lt;p&gt;This allowed us experimenting, elaborating, and iterating a lot with the tremendous amount of decision modeling ideas we had at the beginning. Along this road, I learned a lot, so I decided to write down my thoughts about the overall process and what, from my experience, makes a prototype &lt;em&gt;efficient&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Background: Agile Prototyping
&lt;/h3&gt;

&lt;p&gt;Generally saying we moved along an &lt;em&gt;Agile Prototyping&lt;/em&gt; process while creating our prototypes. I won't go too much into detail about that topic, &lt;a href="https://www.atlassian.com/blog/agile/agile-design-prototype" rel="noopener noreferrer"&gt;this blog post&lt;/a&gt; explains it quite good.&lt;/p&gt;

&lt;p&gt;What we keen to do all the time was to improve our prototypes with each iteration. Beginning with the most important or most obvious feature, we tried to add more and more to the actual demo, until we were sure the original feature fits our users needs. This included a couple of user tests to verify our assumptions, or to improve the demo with our findings. &lt;/p&gt;

&lt;p&gt;Starting with a demo instead of a real implementation gave us enough flexibility to try out multiple things for a specific problem. We were simply not coupled to internal conventions &lt;code&gt;dmn-js&lt;/code&gt; would have given us.&lt;/p&gt;

&lt;p&gt;Once we have to tackle a bigger problem, about which we do not know much yet, it makes total sense to start with that approach. Take the time to experiment and learn about the problem before you actually start solving it. The next chapters should explain about some learning I've made during this time. &lt;/p&gt;

&lt;h3&gt;
  
  
  Know the use case
&lt;/h3&gt;

&lt;p&gt;Before creating a demo showcase, it's necessary to know a particular use case you want to test. Not every scenario is suitable for creating a prototype for it. Most bug fixes and feature requests are quite trivial in the end. Once you don't know how the feature would look in the end, maybe because there wasn't built something like that before or there are a bunch of possible solutions, it's a perfect starting point to think about creating a prototype.&lt;/p&gt;

&lt;p&gt;There will be a dedicated chapter for that point, but: Don't start with too many scenarios. Try to think about the &lt;strong&gt;basic user story&lt;/strong&gt; you want to solve. Is there a particular problem your users face multiple times? Is there a specific request your application should serve. Before you begin, try to create a basic user journey. After you created that one, try to think about variable routes the journey could take. Once you know the basic scenario, it will be easier to define a specific interaction for the prototype.&lt;/p&gt;

&lt;p&gt;I can recommend &lt;a href="https://uxplanet.org/a-beginners-guide-to-user-journey-mapping-bd914f4c517c" rel="noopener noreferrer"&gt;this blog post&lt;/a&gt; for first guidance on how to create pleasant user journeys.&lt;/p&gt;

&lt;h3&gt;
  
  
  It's about Innovation + Inspiration
&lt;/h3&gt;

&lt;p&gt;It's okay not always to create entirely new functionality. Although the problem would be huge and uncertain in its possible solutions, most stuff was already solved out there. Inspiration is not cheating. The users are often used in certain ways of solving different problems. &lt;/p&gt;

&lt;p&gt;That's why it makes total sense to take solutions from other applications and check whether you can bring it inside your prototype. In some cases, there might be standards that give a basic guideline on how to solve problems. Doing such a &lt;strong&gt;pre-research&lt;/strong&gt; often helped me before getting started with the ideation step.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fjw8kjwow18au3dp87q6s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fjw8kjwow18au3dp87q6s.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Also, you have to deal that your prototype solutions follow the design guidelines of your application. It depends on the use case, but creating a sidebar control panel when you only use popup modals in the current state might not be a good idea.&lt;/p&gt;

&lt;p&gt;This should not hold from bringing the innovation into your work. Creating prototypes is the perfect time to go crazy. Whenever it's suitable, think about unusual solutions. Whether they are ideal in the end, you'll find it out in the user testing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Start with a pen
&lt;/h3&gt;

&lt;p&gt;Don't start coding! As it is best practice to not fixing the bug right away, but first &lt;a href="https://basecamp.com/shapeup" rel="noopener noreferrer"&gt;shaping the problem&lt;/a&gt;, you should do the same with your prototype. Depending on how big the problem is, start with  &lt;strong&gt;sketches&lt;/strong&gt; or low-fidelity prototypes. So, pen and paper!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F14846d35rp5w2m4mky76.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F14846d35rp5w2m4mky76.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Try to take some time and illustrate as many solutions as possible. Also, try not to doing it alone. Spreading and sharing ideas helps to create synergies. As one of the dozen possible methods to drive the sketching and ideation phase, I can recommend to try out &lt;a href="https://www.edenspiekermann.com/insights/working-with-design-studios/" rel="noopener noreferrer"&gt;Design Studio&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Starting with a sketch helps to express and change ideas more frequently. Since you're just at the beginning, don't be coupled to technical solutions. It also enabled us to have first user test scenarios with some sketches itself to get the earliest feedback as possible. &lt;/p&gt;

&lt;p&gt;After several iterations and once we were confident we found the right solution, we went into creating paper prototypes or quickly starting with the actual demo, depending on your needs. Sketches have a lack of illustrating interactions. Combining sketches to a paper prototype enables the chance to bring the idea to life.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fhdmg5httc0k4a3dc206o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fhdmg5httc0k4a3dc206o.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Btw., for creating sketches, I can really recommend trying out &lt;a href="https://excalidraw.com/" rel="noopener noreferrer"&gt;Excalidraw&lt;/a&gt;. Of course, starting with a pen as a first step is indispensable. But then converting more shaped ideas into a virtual sketch helps to illustrate some aspects more deeply.&lt;/p&gt;

&lt;h3&gt;
  
  
  It's not a feature branch
&lt;/h3&gt;

&lt;p&gt;I mentioned it a couple of times before, but do &lt;strong&gt;not stuck on your codebase&lt;/strong&gt;. Try to create demos from scratch. Why? Because oftentimes, your codebase gives you restrictions on what and how to build stuff.&lt;/p&gt;

&lt;p&gt;Prototyping is a phase of the development cycle where you want to try out crazy ideas. Creating your demo on a blank HTML page helps to create whatever you want, without dealing with technical limitations. Do not overengineer stuff. You know the use case of the demo, so build the demo application right for that purpose. There will be time to think about the final implementation later on.&lt;/p&gt;

&lt;p&gt;I lately wrote a &lt;a href="https://dev.to/pinussilvestrus/creating-demos-with-svelte-2gem"&gt;blog article about creating demos with Svelte&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Keep it simple
&lt;/h3&gt;

&lt;p&gt;That one should be clear now. Once you know the user story of your prototype, try to keep it in that scope. Furthermore, don't intend to reinvent the wheel. You need an autocomplete input? Try to integrate a working library for that. Modals, icons, drag and drop functionality? Try not to build it yourself. Of course, there will be cases where you have to create something from scratch again so that these components fit your needs. Most of the cases, it's okay to re-use certain stuff.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fu4p0julbmmkyhfm5jqu8.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fu4p0julbmmkyhfm5jqu8.gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Additionally, do not implement all edge cases inside your prototype. &lt;strong&gt;Focus on the problem your demo should solve&lt;/strong&gt;. Do not get stuck on extra cases that might affect you in the future. The primary purpose should be to verify your idea with the user. Make sure you give your testing person a scenario to click through. &lt;/p&gt;

&lt;p&gt;That's the most crucial stuff which should work smoothly. Any extra stuff is a bonus. Often the case, crazy other functionality might also distract the testing user from the main focus, which would have a negative effect as well.&lt;/p&gt;

&lt;h3&gt;
  
  
  Build fast, fail faster
&lt;/h3&gt;

&lt;p&gt;Since you want to be agile in your prototyping phase, plan multiple iterations. You won't find the best solution at the beginning, that won't work. Take user testing sessions to verify your ideas. Does the user like it? Keep it. It was confusing, or the user had problems to solve your problem? Think about alternatives and improve the demo. &lt;/p&gt;

&lt;p&gt;Step by step, you will find the best or at least a very good solution that fits your needs. I often heard that prototyping might be a waste of time, especially when you throw it away at the end. It's okay to throw stuff away. The main goal of this phase should be to &lt;strong&gt;make learnings&lt;/strong&gt;. Get to know the problem, try out different solutions, and learn.&lt;/p&gt;

&lt;h3&gt;
  
  
  Think about variations
&lt;/h3&gt;

&lt;p&gt;When you're doing the user testings, try to think about variations of your solutions. Because then, you will have a side-by-side comparison inside the demo. The user faces multiple ways of solving the same problem and can directly express what he likes the most. Often, in the end, the solution will be a mixture.&lt;/p&gt;

&lt;p&gt;When creating variants, make sure they &lt;strong&gt;only differ in specific aspects&lt;/strong&gt;. The rest should be exactly designed the same. Why? If one option might have, for example, another color, other dimensions, or simply nice looking icons, the user might feel one solution to be the best for the wrong reason. You want to know which way of solving is the best, interactionwise. So the user should not be distracted from surrounding things.&lt;/p&gt;

&lt;p&gt;For us, it was also a good idea to implement variant toggles inside the demo application. It gave us the flexibility to quickly jump from one variant to another, e.g., via clicking a badge on the right upper corner or via keyboard shortcut. Also, we sometimes had remote user tests, so the user had to control the application entirely itself. Having such a simple variant toggle implemented was the easiest way to test all variants after each other without wasting time between them.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fuwmx2xnitwyv5tgcacgi.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fuwmx2xnitwyv5tgcacgi.gif" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Keep the best
&lt;/h3&gt;

&lt;p&gt;The first goal should be to make learning, as I described before. After you did some user tests, went over several iterations, you might have a solution in which you're confident it will solve your problem in the final application. Will you implement all features of your demo? &lt;strong&gt;No, of course, not&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;After the concept phase, it's time to reflect. Pick the best aspects and think about how to bring them into your real application. Scope your findings and start with the low-hanging fruits. As the prototyping phase was a time of iterations, the implementation phase should follow the same guideline. &lt;/p&gt;

&lt;h3&gt;
  
  
  Summary
&lt;/h3&gt;

&lt;p&gt;To summarize, I made the following lessons learned while creating the DMN prototypes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Know the use case&lt;/li&gt;
&lt;li&gt;It's about Innovation + Inspiration&lt;/li&gt;
&lt;li&gt;Start with a pen&lt;/li&gt;
&lt;li&gt;It's not a feature branch&lt;/li&gt;
&lt;li&gt;Keep it simple&lt;/li&gt;
&lt;li&gt;Build fast, fail faster&lt;/li&gt;
&lt;li&gt;Think about variations&lt;/li&gt;
&lt;li&gt;Keep the best&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You might not implement all stuff from your demo, although the user liked them a lot, due to technical or time limitations. That's okay, and you won't throw them away, keep them for coming releases. The prototyping phase shows you many aspects you didn't think about before. If there's one suitable solution, in the end, it was highly worth it.&lt;/p&gt;

&lt;p&gt;For me, it was the first time dealing with prototyping and creating demos in a more extended period. It came out the field of Usability Engineering as something very valuable during the development cycle, especially when the problems got bigger with a higher amount of uncertainty.&lt;/p&gt;

&lt;p&gt;I tried to link some other interesting blog posts inside my writings. If you have any other thoughts, opinions, or questions, feel free to reach out!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ux</category>
      <category>prototyping</category>
    </item>
    <item>
      <title>Creating Demos with Svelte - Lessons Learned</title>
      <dc:creator>Niklas Kiefer</dc:creator>
      <pubDate>Wed, 18 Mar 2020 09:51:36 +0000</pubDate>
      <link>https://dev.to/pinussilvestrus/creating-demos-with-svelte-2gem</link>
      <guid>https://dev.to/pinussilvestrus/creating-demos-with-svelte-2gem</guid>
      <description>&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: The Content was previously created inside &lt;a href="https://speakerdeck.com/pinussilvestrus/what-i-learned-from-using-svelte-for-the-demos"&gt;these slides&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We're currently creating a lot of demos and prototypes to improve the overall DMN modeling experience inside our &lt;a href="https://bpmn.io/"&gt;bpmn.io&lt;/a&gt; toolkit. After designing the first demos with &lt;a href="https://jquery.com/"&gt;jQuery&lt;/a&gt;, because of having the ability to create UI stuff quickly, and experiencing some silly things related to reactivity and state management, I wanted to give &lt;a href="https://svelte.dev/"&gt;Svelte&lt;/a&gt; the first try.&lt;/p&gt;

&lt;p&gt;I heard about it a couple of times before, and the possibilities and vision behind it sound quite pleasant to me. I can recommend &lt;a href="https://tsh.io/blog/svelte-framework/"&gt;this article&lt;/a&gt; to get a first glance about it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZsQoqrko--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/0b2cp158wvm0eao8vp3f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZsQoqrko--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/0b2cp158wvm0eao8vp3f.png" alt="Alt Text" width="800" height="404"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So I went to create the next DMN demo with Svelte and get away from jQuery. The general feeling was excellent. In comparison to the last demos, the speed of creating view switching and simple interactions was halved in working time, at least.&lt;/p&gt;

&lt;p&gt;That's why I decided to take some time and to reflect on it. The result was a quick lightning talk, which I discussed with my team. Next, I also want to share the main thoughts about it in this article.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Reactivity is 🔥
&lt;/h3&gt;

&lt;p&gt;To compare, in the jQuery demos, it took a lot of boilerplate code to input something like reactivity into my application. &lt;/p&gt;

&lt;p&gt;Svelte is designed for exactly that use case. As an example, binding variables to a component template makes it way easier to react to changes in the state and switch to different views.&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&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;view&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;let&lt;/span&gt; &lt;span class="nx"&gt;activeView&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt;
    &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"wrapper"&lt;/span&gt;
    &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"display: {view === activeView ? 'block' : 'none'}"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        {#if view === activeView}
            &lt;span class="nt"&gt;&amp;lt;slot/&amp;gt;&lt;/span&gt;
        {/if}
&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;Furthermore, it allows me to react to user selections, for example, when the user changes the hit policy inside a DMN decision table quickly.&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&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;tableData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;HIT_POLICIES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="cm"&gt;/* ... */&lt;/span&gt; &lt;span class="p"&gt;];&lt;/span&gt;

    &lt;span class="nl"&gt;$&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;explanation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
        &lt;span class="nx"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="nx"&gt;HIT_POLICIES&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
            &lt;span class="nx"&gt;hp&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;hp&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="nx"&gt;tableData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hitPolicy&lt;/span&gt;
        &lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;explanation&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;changeHitPolicy&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="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;value&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="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="nx"&gt;tableData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hitPolicy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;select&lt;/span&gt; &lt;span class="na"&gt;on:change=&lt;/span&gt;&lt;span class="s"&gt;{changeHitPolicy}&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    {#each HIT_POLICIES as { name }}
        &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;selected=&lt;/span&gt;&lt;span class="s"&gt;{name&lt;/span&gt; &lt;span class="err"&gt;===&lt;/span&gt; &lt;span class="na"&gt;tableData.hitPolicy&lt;/span&gt;&lt;span class="err"&gt;}&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{name}&lt;span class="nt"&gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
    {/each}
&lt;span class="nt"&gt;&amp;lt;/select&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"hp-explanation"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{explanation}&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Imagine doing that with jQuery, it would take me some actions to rerender the explanation &lt;code&gt;p&lt;/code&gt; node. Svelte, by design, is doing that for you.&lt;/p&gt;

&lt;h3&gt;
  
  
  Component Templating
&lt;/h3&gt;

&lt;p&gt;When creating my jQuery demos, I also tend to develop modules for different UI components. But even here, the boilerplate code to render this stuff was just pain.&lt;/p&gt;

&lt;p&gt;Creating Svelte components is more comfortable than that&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&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Table&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;../../../decision-table-layout/src/components/Table.svelte&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;ArrowExpandSvg&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;../../resources/arrow-expand.svg&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./NavigationTable.scss&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;noop&lt;/span&gt; &lt;span class="o"&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="p"&gt;{};&lt;/span&gt;

    &lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;onViewSwitch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;noop&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;let&lt;/span&gt; &lt;span class="nx"&gt;tableData&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"navigation-table"&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;class=&lt;/span&gt;&lt;span class="s"&gt;"buttons"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"arrow-expand btn btn-sticky"&lt;/span&gt; &lt;span class="na"&gt;on:click=&lt;/span&gt;&lt;span class="s"&gt;{()&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt; onViewSwitch('split-screen')}&amp;gt;
            {@html ArrowExpandSvg}
        &lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"edit-drd btn"&lt;/span&gt; &lt;span class="na"&gt;on:click=&lt;/span&gt;&lt;span class="s"&gt;{()&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt; onViewSwitch('drd')}&amp;gt;
            Edit DRD
        &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;Table&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt; &lt;span class="na"&gt;tableData&lt;/span&gt; &lt;span class="err"&gt;}&lt;/span&gt; &lt;span class="nt"&gt;/&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;It also allowed me to do particular re-use components, like the &lt;code&gt;Table&lt;/code&gt; component, in other parts very smoothly. &lt;/p&gt;

&lt;h3&gt;
  
  
  Global State
&lt;/h3&gt;

&lt;p&gt;Managing state can also be rough, and you tend to use specific state management libraries for that, like &lt;code&gt;Redux&lt;/code&gt; in React. I was not forced to do something like that in my demo, but it was nice to get the overall data from one entry point and re-use that in all of my components.&lt;/p&gt;

&lt;p&gt;So, whenever something of my table data changes, the different parts of my UI would be re-rendered due to those changes. There is no virtual DOM included, which makes it a bit faster. Svelte &lt;a href="https://svelte.dev/blog/virtual-dom-is-pure-overhead"&gt;itself explained briefly&lt;/a&gt;, why this approach solves some problems.&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&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;data&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;../resources/data.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;currentTable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Decision_03absfl&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;view&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;drd&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;Wrapper&lt;/span&gt; &lt;span class="na"&gt;view=&lt;/span&gt;&lt;span class="s"&gt;"drd"&lt;/span&gt; &lt;span class="na"&gt;activeView=&lt;/span&gt;&lt;span class="s"&gt;{view}&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;DRD&lt;/span&gt; &lt;span class="na"&gt;decision=&lt;/span&gt;&lt;span class="s"&gt;{currentTable.id}&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/Wrapper&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;Wrapper&lt;/span&gt; &lt;span class="na"&gt;view=&lt;/span&gt;&lt;span class="s"&gt;"split-screen"&lt;/span&gt; &lt;span class="na"&gt;activeView=&lt;/span&gt;&lt;span class="s"&gt;{view}&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;SplitScreen&lt;/span&gt; &lt;span class="na"&gt;tableData=&lt;/span&gt;&lt;span class="s"&gt;{currentTable}&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/Wrapper&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Summary
&lt;/h3&gt;

&lt;p&gt;Honestly saying, I just started to use Svelte for my demo applications, and there are lots of more aspects to learn. The reason I did not switch to React, which I used a lot of times before, was simply that I wanted to give Svelte a chance. &lt;/p&gt;

&lt;p&gt;The general expression was very good. The development speed and experience was unexpectedly good. To be clear, it just &lt;em&gt;felt&lt;/em&gt; very good to create this demo.&lt;/p&gt;

&lt;p&gt;In comparison to jQuery, it makes things way easier, like reactivity and state management. I can recommend to try it out.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ux</category>
      <category>prototyping</category>
      <category>svelte</category>
    </item>
    <item>
      <title>A Lightweight React Library for creating clickable Prototypes</title>
      <dc:creator>Niklas Kiefer</dc:creator>
      <pubDate>Thu, 19 Dec 2019 15:49:14 +0000</pubDate>
      <link>https://dev.to/pinussilvestrus/a-lightweight-react-library-for-creating-clickable-prototypes-2i68</link>
      <guid>https://dev.to/pinussilvestrus/a-lightweight-react-library-for-creating-clickable-prototypes-2i68</guid>
      <description>&lt;p&gt;As a little Holiday project, and as a follow-up of the DMN Innovation Week we had at &lt;a href="https://camunda.com" rel="noopener noreferrer"&gt;Camunda&lt;/a&gt;, I created &lt;a href="https://github.com/pinussilvestrus/clickable-prototype" rel="noopener noreferrer"&gt;a small React components library&lt;/a&gt; to quickly create clickable prototypes. &lt;/p&gt;

&lt;p&gt;Inside Innovation Week, we created multiple small prototypes to test various ideas on how to improve the DMN experience in &lt;a href="https://bpmn.io" rel="noopener noreferrer"&gt;bpmn-io&lt;/a&gt;. Inside that, I used &lt;code&gt;jquery&lt;/code&gt; to create a click-prototype and use it inside user tests. The results can be seen in this &lt;a href="https://github.com/pinussilvestrus/drd-relation-prototype" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Yes, jquery is not the &lt;em&gt;best&lt;/em&gt; solution to save the application state, like to save the actually visible view. Therefore I wanted to have a simple library that managed the interaction between different screens/views and where I only have to declare the click points which should direct to the next view. &lt;/p&gt;

&lt;p&gt;I've chosen &lt;code&gt;React&lt;/code&gt; and created the &lt;a href="https://github.com/pinussilvestrus/clickable-prototype" rel="noopener noreferrer"&gt;&lt;code&gt;clickable-prototype&lt;/code&gt;&lt;/a&gt; project. It offers different components to declare your clickable prototype. A simple React Application using that would like that&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Component&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;react&lt;/span&gt;&lt;span class="dl"&gt;'&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;View&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;HitBox&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ViewContainer&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;clickable-prototype&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;view1&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;./views/view1.png&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;view2&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;./views/view2.png&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;App&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Component&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;render &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;clickable-prototype&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; Demo&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ViewContainer&lt;/span&gt; &lt;span class="na"&gt;defaultView&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'view1'&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'container'&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;View&lt;/span&gt;
            &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'view1'&lt;/span&gt;
            &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'custom-view'&lt;/span&gt;
            &lt;span class="na"&gt;screen&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;view1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
            &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'1220px'&lt;/span&gt;
            &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'630px'&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;HitBox&lt;/span&gt;
              &lt;span class="na"&gt;position&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;380&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;477&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;280&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
              &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'view2'&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;View&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;View&lt;/span&gt;
            &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'view2'&lt;/span&gt;
            &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'custom-view'&lt;/span&gt;
            &lt;span class="na"&gt;screen&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;view2&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
            &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'1220px'&lt;/span&gt;
            &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'630px'&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;HitBox&lt;/span&gt;
              &lt;span class="na"&gt;position&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;490&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;477&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;280&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
              &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'view1'&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;View&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;ViewContainer&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;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 will result in the following prototype&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fwvom18t0sfuibjolkqyu.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fwvom18t0sfuibjolkqyu.gif" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It's a very early stage of the library but it helps me a lot to quickly create clickable prototypes without any extra fancy stuff as you'd have in applications like &lt;a href="https://www.invisionapp.com/" rel="noopener noreferrer"&gt;InVision&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I would really appreciate if you give it a try and give some feedback!&lt;/p&gt;

</description>
      <category>prototyping</category>
      <category>react</category>
      <category>sketch</category>
      <category>ux</category>
    </item>
    <item>
      <title>Building a honkify extension for bpmn-js</title>
      <dc:creator>Niklas Kiefer</dc:creator>
      <pubDate>Thu, 03 Oct 2019 09:48:56 +0000</pubDate>
      <link>https://dev.to/pinussilvestrus/building-a-honkify-extension-for-bpmn-js-2f7n</link>
      <guid>https://dev.to/pinussilvestrus/building-a-honkify-extension-for-bpmn-js-2f7n</guid>
      <description>&lt;p&gt;Something for the fun department: Yesterday I found this amazing project, which replaces any link on a page with a duck "honk": &lt;a href="https://github.com/jlengstorf/honkify"&gt;honkify.js&lt;/a&gt;.  This inspired me to build a simple &lt;a href="https://github.com/bpmn-io/bpmn-js"&gt;bpmn-js&lt;/a&gt; extension which adds this honk on several modeling operations, e.g. adding, moving or removing BPMN shapes from the canvas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;/// Honk.js&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;CommandInterceptor&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;diagram-js/lib/command/CommandInterceptor&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;inherits&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;inherits&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;showToast&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;show-toast&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="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;Honk&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;injector&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="nx"&gt;injector&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;invoke&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;CommandInterceptor&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;const&lt;/span&gt; &lt;span class="nx"&gt;audio&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Audio&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://res.cloudinary.com/jlengstorf/video/upload/q_auto/v1569957993/honk-sound.mp3&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="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;_honk&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;honk fired.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// honk&lt;/span&gt;
    &lt;span class="nx"&gt;audio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;play&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="c1"&gt;// show toast&lt;/span&gt;
    &lt;span class="nx"&gt;showToast&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Honk 🦆🦆🦆!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;time&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;top&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&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;execute&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;shape.create&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;shape.move&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;shape.delete&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nx"&gt;_honk&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;Honk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;$inject&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;injector&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="nx"&gt;inherits&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Honk&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;CommandInterceptor&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;I put the results in a &lt;a href="https://github.com/pinussilvestrus/bpmn-js-honkifay"&gt;small GitHub project&lt;/a&gt;, which everyone can simply install via &lt;code&gt;npm&lt;/code&gt; and directly integrate into their &lt;a href="https://bpmn.io"&gt;bpmn-io&lt;/a&gt; application. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_hSIb-jk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/t2y0ruenpelh3i2gee6b.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_hSIb-jk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/t2y0ruenpelh3i2gee6b.gif" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This fun example showcases how easy it is to build extensions for the bpmn-io toolkit. Also, have a look at the &lt;a href="https://github.com/bpmn-io/bpmn-js-nyan"&gt;bpmn-js-nyan-cat&lt;/a&gt; for another little example of how to bring joy in your modeling application.&lt;/p&gt;

&lt;p&gt;Enjoy!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>bpmn</category>
      <category>bpmnio</category>
      <category>javascript</category>
    </item>
    <item>
      <title>VS Code Extension - Render Process Diagrams with bpmn.io</title>
      <dc:creator>Niklas Kiefer</dc:creator>
      <pubDate>Mon, 30 Sep 2019 12:35:17 +0000</pubDate>
      <link>https://dev.to/pinussilvestrus/vs-code-extension-render-process-diagrams-with-bpmn-io-39ab</link>
      <guid>https://dev.to/pinussilvestrus/vs-code-extension-render-process-diagrams-with-bpmn-io-39ab</guid>
      <description>&lt;p&gt;As another exciting pet project, we created a &lt;a href="https://code.visualstudio.com/" rel="noopener noreferrer"&gt;Visual Studio Code&lt;/a&gt; extension for rendering BPMN 2.0 process diagrams. It is built on top of the amazing modeling toolkit &lt;a href="https://bpmn.io/" rel="noopener noreferrer"&gt;bpmn-io&lt;/a&gt; and can be &lt;a href="https://github.com/pinussilvestrus/vs-code-bpmn-io" rel="noopener noreferrer"&gt;found on GitHub&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;You can directly download it from &lt;a href="https://marketplace.visualstudio.com/items?itemName=bpmn-io.vs-code-bpmn-io" rel="noopener noreferrer"&gt;VS Code Marketplace&lt;/a&gt; or &lt;a href="https://github.com/pinussilvestrus/vs-code-bpmn-io#development-setup" rel="noopener noreferrer"&gt;follow the setup instructions&lt;/a&gt; to get it running locally. &lt;/p&gt;

&lt;p&gt;With this extension, it is possible to display a preview for your BPMN 2.0 diagrams. It also refreshes the preview whenever you re-focus it, to adapt made changes in the XML content. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fbiyef5hjcnorlng8bs22.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fbiyef5hjcnorlng8bs22.gif" alt="vs-code-bpmn-io extension"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As a next step, we plan to also add a modeling functionality to enable the powerful BPMN diagram editing capabilities of &lt;code&gt;bpmn-io&lt;/code&gt;. This will help to easily create BPMN process diagrams in Visual Studio Code without writing one line of XML.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F8v7asjbntdzgfawt02l7.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F8v7asjbntdzgfawt02l7.gif" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feel free to &lt;a href="https://github.com/pinussilvestrus/vs-code-bpmn-io" rel="noopener noreferrer"&gt;try out the extension&lt;/a&gt; and leave some feedback or a star for our work!&lt;/p&gt;

</description>
      <category>vscode</category>
      <category>plugins</category>
      <category>bpmn</category>
      <category>webdev</category>
    </item>
    <item>
      <title>render-bpmn: Upload and Display BPMN | CMMN | DMN Diagrams on Github</title>
      <dc:creator>Niklas Kiefer</dc:creator>
      <pubDate>Thu, 22 Aug 2019 14:40:36 +0000</pubDate>
      <link>https://dev.to/pinussilvestrus/render-bpmn-upload-and-display-bpmn-cmmn-dmn-diagrams-on-github-2mbo</link>
      <guid>https://dev.to/pinussilvestrus/render-bpmn-upload-and-display-bpmn-cmmn-dmn-diagrams-on-github-2mbo</guid>
      <description>&lt;p&gt;The &lt;a href="https://twitter.com/Camunda/status/1164197803792490502" rel="noopener noreferrer"&gt;2019 Camunda Summer Hackdays&lt;/a&gt; was a good place to work on long-time planned projects which I had no time for the last months. After three days we built a good working prototype on how to render BPMN diagrams on GitHub. &lt;a href="https://github.com/pinussilvestrus/github-bpmn" rel="noopener noreferrer"&gt;Checkout&lt;/a&gt; and leave some feedback or a star out there ⭐️.&lt;/p&gt;

&lt;h3&gt;
  
  
  General Problem
&lt;/h3&gt;

&lt;p&gt;It's currently hard to display BPMN files on GitHub. In the case of images, the application offers post-processing of the uploaded files in order to quickly display them. Unfortunately, this does not work for process diagrams. This kind of diagrams can be really helpful to outline feature requirements or bug root analysis. Right now, it requires to open these BPMN files in an external tool, as &lt;a href="https://bpmn.io" rel="noopener noreferrer"&gt;bpmn.io&lt;/a&gt;, to properly display them &lt;em&gt;or&lt;/em&gt; to convert the files to images.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F2vntycntkyyjiazxb45r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F2vntycntkyyjiazxb45r.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Hacking Prototypes
&lt;/h3&gt;

&lt;p&gt;In the 2019 Camunda Hackdays we wanted to create several prototypes in order to automatically render BPMN files in GitHub repositories. In the &lt;a href="https://github.com/pinussilvestrus/github-bpmn" rel="noopener noreferrer"&gt;resulted repository&lt;/a&gt; we provide these solutions. It solves the problem in two ways:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Automatically render BPMN files in Issues and Pull Requests&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The self-hosted &lt;a href="https://github.com/probot/probot" rel="noopener noreferrer"&gt;probot&lt;/a&gt; application offers an auto-rendering of uploaded BPMN files via bpmn.io. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Ft42rjzlna8a4lb96ddtu.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Ft42rjzlna8a4lb96ddtu.gif" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Automatically render BPMN, CMMN and DMN diagrams in repository file tree via hover&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can easily include the resulted userscript via Tampermonkey or use the adapted Chrome extension.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Ffm1696p32yu2q0if807a.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Ffm1696p32yu2q0if807a.gif" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;The resulting project offers an easy way to quickly display your beloved BPMN, CMMN or DMN files in your GitHub repository. We &lt;a href="https://github.com/pinussilvestrus/github-bpmn/issues" rel="noopener noreferrer"&gt;plan to increase the feature set&lt;/a&gt; soon, as long we find time for that. Feel free to try out the solutions, we'd love to hear some feedback ❤️ and receive some 🌟 on GitHub.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>productivity</category>
      <category>github</category>
      <category>bpmn</category>
    </item>
  </channel>
</rss>
