<?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: Adrian Krebs</title>
    <description>The latest articles on DEV Community by Adrian Krebs (@krebs_adrian).</description>
    <link>https://dev.to/krebs_adrian</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%2F175314%2F2190fe17-a654-41c8-bbca-82195e6492e8.jpg</url>
      <title>DEV Community: Adrian Krebs</title>
      <link>https://dev.to/krebs_adrian</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/krebs_adrian"/>
    <language>en</language>
    <item>
      <title>How to build a crowdsourced webapp</title>
      <dc:creator>Adrian Krebs</dc:creator>
      <pubDate>Sun, 03 May 2020 12:05:16 +0000</pubDate>
      <link>https://dev.to/krebs_adrian/how-to-build-a-crowdsourced-webapp-5hgg</link>
      <guid>https://dev.to/krebs_adrian/how-to-build-a-crowdsourced-webapp-5hgg</guid>
      <description>&lt;p&gt;I recently launched my &lt;a href="https://www.buyforlifeproducts.com"&gt;crowdsourced platform for sustainable and durable products&lt;/a&gt; and wanted to share some pitfalls and challenges when building a crowdsourced application.&lt;/p&gt;

&lt;h2&gt;
  
  
  Collecting data with Airtable
&lt;/h2&gt;

&lt;p&gt;I decided to use &lt;a href="https://www.airtable.com"&gt;Airtable&lt;/a&gt;as a lightweight database because it's free, very user-friendly and you can easily create and share forms to collect data. You can setup your database in minutes and integrating the submission form on your website is super easy by embedding an iframe:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;iframe @load="load" class="airtable-embed" src="https://airtable.com/embed/shrpnZPkaGeToUEG3?backgroundColor=gray"
    frameborder="0" style="background: transparent;"&amp;gt;&amp;lt;/iframe&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;And here is how the embedded form looks like:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ln1fj_Fh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/wpob01z687npyk2lhbfx.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ln1fj_Fh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/wpob01z687npyk2lhbfx.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  How to deal with the lacking quality of the data
&lt;/h2&gt;

&lt;p&gt;One issue that comes with crowdsourced data is the lacking quality of some submissions. &lt;/p&gt;

&lt;p&gt;Some entries are of poor quality like missing fields or incorrect information:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--45uGqlVd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/hojcy8c3y5qjx1grgasd.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--45uGqlVd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/hojcy8c3y5qjx1grgasd.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's why I'm reviewing every submission manually to clean, verify, and complete the required data. After reviewing and fixing a submission, I run a &lt;code&gt;Node.js&lt;/code&gt; script that retrieves the newest entries from Airtable and inserts them into my Firebase database, from where the app loads all the data:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;admin.initializeApp({
    credential: admin.credential.cert(serviceAccount),
    databaseURL: "https://foobar.firebaseio.com"
});
let db = admin.firestore();

let docRef = db.collection('products')


for (let p of productList) {
    docRef.doc(p.id.toString()).set({
        "id": p.id,
        "name": p.name,
        "description": p.description,
        "link": p.link,
        "img": p.img,
        "category": p.category,
        "upvotes": 0,
        "subcategory": p.subcategory,
        "metadata": {
            "warranty": p.metadata.warranty,
            "madeIn": p.metadata.madeIn,
            "shippingTo": p.metadata.shippingTo,
            "foundingYear": p.metadata.foundingYear
        }
    });
}

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



&lt;p&gt;This way, I avoid having poor data displayed on my site. It's like having a staging database before publishing it to production.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to incentivize users to submit data
&lt;/h2&gt;

&lt;p&gt;I received over 250 submissions since the launch and I would never have been able to collect all this data manually by myself.&lt;br&gt;
But how do you motivate people to "do the work for you"?&lt;br&gt;
With every approved submission, users earn "stars", which is a gamification approach to incentivize user contributions. &lt;br&gt;
These stars are the best metric regular users have available to them to determine, at a glance, if someone is a valued member of the site.&lt;br&gt;
If someone has lots of points that means that the user has contributed popular content to the site. Think of Reddit's karma or StackOverflow's point-system.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--m3PaIe7g--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/24trkeztj0combi5o4ll.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--m3PaIe7g--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/24trkeztj0combi5o4ll.PNG" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let me know what you think about my project and don't hesitate to ask questions :)&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>vue</category>
      <category>javascript</category>
    </item>
    <item>
      <title>I built Remoteclerk - a video consultation app for retailers</title>
      <dc:creator>Adrian Krebs</dc:creator>
      <pubDate>Tue, 28 Apr 2020 13:48:23 +0000</pubDate>
      <link>https://dev.to/krebs_adrian/i-built-remoteclerk-a-video-consultation-app-for-retailers-4cid</link>
      <guid>https://dev.to/krebs_adrian/i-built-remoteclerk-a-video-consultation-app-for-retailers-4cid</guid>
      <description>&lt;p&gt;Covid-19 is going to push the retail marketplace faster than it has been moving toward a more remote experience. Stores and showrooms are closed but online shops are still open. However, product categories like furniture or sports gear usually require consultation by an experienced shop-employee before the purchase.&lt;br&gt;
That's why I built a video consultation software for retailers:&lt;/p&gt;

&lt;p&gt;Benefits:&lt;br&gt;
• Outside opening hours - Offer your expertise to the people at home even if your store is already closed&lt;br&gt;
• Offer expertise at home - Offer additional information about the material or functionality of a product. The customer gets the same experience as he would get it in the real shop.&lt;br&gt;
• Up-/Crosselling - Suggest additional, complementary or higher-end products to your customer.&lt;br&gt;
• No App installation - No app installation needed - everything is web-based. Works on smartphonse, tablet and desktop.&lt;br&gt;
• No Sign-Up required - The user does not need to sign-up and stays anonymous.&lt;br&gt;
• Easy to integrate - Easy to integrate widget for every online-shop.&lt;br&gt;
It's way easier to handle video calls with a fully integrated solution like this than it would be with Whatsapp, Zoom or other proprietary solutions.&lt;/p&gt;

&lt;h4&gt;
  
  
  Category Submission:
&lt;/h4&gt;

&lt;p&gt;Engaging Engagements&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo Link
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.theremoteclerk.com/"&gt;https://www.theremoteclerk.com/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--d77oy1Ym--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/0u1m60je65oi12rmq1vu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--d77oy1Ym--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/0u1m60je65oi12rmq1vu.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Link to Code
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/AdrianKrebs/remoteclerk"&gt;https://github.com/AdrianKrebs/remoteclerk&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How I built it (what's the stack? did I run into issues or discover something new along the way?)
&lt;/h2&gt;

&lt;p&gt;I used Vue.js as a frontend framework and Node.js on the server. Going through the Twilio API docs was interesting but not always easy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Additional Resources/Info
&lt;/h2&gt;

&lt;p&gt;I'm currently reaching out to retailers who would be interested in beta-testing the app.&lt;/p&gt;

</description>
      <category>twiliohackathon</category>
      <category>vue</category>
      <category>node</category>
    </item>
  </channel>
</rss>
