{"id":2088,"date":"2015-01-21T13:15:58","date_gmt":"2015-01-21T11:15:58","guid":{"rendered":"http:\/\/www.webcodegeeks.com\/?p=2088"},"modified":"2015-01-19T13:42:11","modified_gmt":"2015-01-19T11:42:11","slug":"kudos-for-your-site-powered-by-firebase","status":"publish","type":"post","link":"https:\/\/www.webcodegeeks.com\/javascript\/kudos-for-your-site-powered-by-firebase\/","title":{"rendered":"Kudos for your site &#8211; powered by Firebase"},"content":{"rendered":"<p>I don&#8217;t quite remember, guess it was about more than a year ago when I came across a Svbtle-hosted blog where I noticed a small little circle, bouncing when you hover it and showing a number followed by &#8220;Kudos&#8221;. What are Kudos? Read ahead and see how I created my own version using Firebase as the backend storage.<\/p>\n<blockquote><p><strong>Note<\/strong>, if you&#8217;re here because you simply want to use the Kudos script on your own site, jump to the section about &#8220;Code and Usage&#8221;. Otherwise read ahead.<\/p><\/blockquote>\n<p>&nbsp;<br \/>\nSo, <strong>what are Kudos<\/strong>? Wikipedia explains them as follows:<\/p>\n<blockquote><p>Kudos (from the Ancient Greek: \u03ba\u1fe6\u03b4\u03bf\u03c2) is acclaim or praise for exceptional achievement. <cite><a href=\"http:\/\/en.wikipedia.org\/wiki\/Kudos\">Wikipedia<\/a><\/cite><\/p><\/blockquote>\n<p>If I&#8217;m right, then <a href=\"http:\/\/dustincurtis.com\/\">Dustin Curtis<\/a> came up with this idea when creating the famous blogging platform <a href=\"https:\/\/svbtle.com\/\">Svbtle<\/a>. Go there to see some examples.<br \/>\nIt&#8217;s basically similar to a Facebook &#8220;like&#8221; or Google+ &#8220;+1&#8221; button. I first saw them on the famous <a href=\"https:\/\/svbtle.com\/\">Svbtle<\/a> blog engine. I liked it, so I decided to roll my own.<\/p>\n<p>After some googling I found <a href=\"http:\/\/amitu.com\/2013\/04\/kudos-using-parse-for-jekyll\/\">Amit Upadhyay&#8217;s<\/a> post. He already had a similar idea to create a Svbtle independent Kudo implementation by using <a href=\"https:\/\/parse.com\/\">Parse<\/a> as the backend service.<\/p>\n<h2>Firebase as the backend DB<\/h2>\n<p>Modern JavaScript tools and libraries give you plenty of possibilities to create rich user interfaces in a fairly fast and easy way. However, <strong>once you need some backend service for persistent storage, things get complex<\/strong>. Don&#8217;t get me wrong, I love to code on the server and I regularly do it. But when I want to create some quick tool, some nice app, then the frontend is setup quite quickly. All you need is some JavaScript knowledge, a code\/text editor and a browser. When it comes to the backend you&#8230;<\/p>\n<ul>\n<li>have to decide which language\/server: Node, .Net, Java, Ruby&#8230;<\/li>\n<li>how to handle authentication: OAuth? Facebook, Twitter, Google,&#8230;<\/li>\n<li>which database? relational, non-releational? MongoDb, PostgreSQL<\/li>\n<li>hosting? some cloud service, self-hosted? a VPS?<\/li>\n<li>&#8230;<\/li>\n<\/ul>\n<p>Lots of decisions you don&#8217;t really want to face for a simple webapp like this kudo script here. Still, I obviously required some kind of backend for storing the kudos and even some minimal security policies to prevent &#8211; for instance &#8211; multiple kudos from a single person.<\/p>\n<p><strong>Firebase<\/strong> is great here. It presents itself as the &#8220;Realtime App Platform&#8221;:<\/p>\n<blockquote><p>Store &amp; Sync Data Instantly: Build realtime mobile and web apps in minutes using client-side code and our powerful API. Save time. Delight your users.<\/p><\/blockquote>\n<p>And that&#8217;s totally true. Not only do you get an easy way to store your data, but you can even implement real-time synchronization among your clients. That has never been so easy.<\/p>\n<p>Besides that, Firebase has lots of little integration libraries for the web (like Angular or Ember plugins), for mobile apps and even for server-side code like Node.js.<\/p>\n<p><a href=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2015\/01\/firebase-frameworks.png\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-2100\" src=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2015\/01\/firebase-frameworks.png\" alt=\"firebase-frameworks\" width=\"780\" height=\"430\" srcset=\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2015\/01\/firebase-frameworks.png 780w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2015\/01\/firebase-frameworks-300x165.png 300w\" sizes=\"(max-width: 780px) 100vw, 780px\" \/><\/a><\/p>\n<h2>How do I use Firebase<\/h2>\n<p>So how does this work on the Kudo script? I&#8217;ll only show some quick snippets as the official Firebase documentation is very clear and detailed.<\/p>\n<p>First of all you obviously need to integrate with Firebase. This is as easy as to include the JavaScript library:<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">&lt;script type='text\/javascript' src='https:\/\/cdn.firebase.com\/js\/client\/1.1.2\/firebase.js'&gt;&lt;\/script&gt;<\/pre>\n<p>In your code you then get a reference to the <code>Firebase<\/code> object, specifying the node you&#8217;d like to reference.<\/p>\n<blockquote><p><strong>Note<\/strong>, a Firebase storage can be imagined like a big JSON object within which you navigate around and organize your data. More on the <a href=\"https:\/\/www.firebase.com\/docs\/web\/guide\/understanding-data.html\">docs<\/a>.<\/p><\/blockquote>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">var firebase = new Firebase('https:\/\/firekudos.firebaseio.com\/');<\/pre>\n<p>Imagining you have a structure like<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">{\r\n    'kudos': &#x5B;\r\n        ...\r\n    ]\r\n}<\/pre>\n<p>..then you can navigate to the child nodes by either instantiating a new <code>Firebase<\/code> object with the new path <code>new Firebase('https:\/\/firekudos.firebaseio.com\/kudos)<\/code> or by using an existing instance:<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">var kudosChildNode = firebase.child('kudos');<\/pre>\n<h3>Authentication and authorization<\/h3>\n<p>Before continuing I have to explain another core feature of Firebase: <strong>user authentication &amp; authorization<\/strong>. JavaScript code cannot be trusted as it runs on the user&#8217;s machine. As such, when you directly access a database as a service you have to impose some security rules in order to make sure a user is only able to manipulate its own data. Firebase has <strong>build-in user authentication and authorization<\/strong>. There are adapters for the major OAuth providers like Twitter, Facebook, GitHub and Google. Moreover there&#8217;s the possibility to do username\/pwd authentication, through email or even by providing a custom login token generator. Just <a href=\"https:\/\/www.firebase.com\/docs\/web\/guide\/user-auth.html\">check out the docs<\/a>.<br \/>\nDoing such authentication just for the purpose of providing a Kudo would be a total overhead. Lucky me, Firebase also provides <strong>anonymous authentication<\/strong>.<\/p>\n<blockquote><p>Each time you login a user anonymously, a new, unique user ID will be generated, and your Firebase reference will be authenticated using these new credentials. The session will live until its configured expiration time&#8230;<\/p><\/blockquote>\n<p>Anonymous login is done like<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">firebase.authAnonymously(function(err, authenticationData) {\r\n    ...\r\n});<\/pre>\n<p><code>authenticationData<\/code> is an object <a href=\"https:\/\/www.firebase.com\/docs\/web\/api\/firebase\/getauth.html\">containing a series of properties<\/a>. One of them is the <code>uid<\/code> which uniquely identifies the authenticated user. By invoking <code>firebase.getAuth()<\/code> the current authentication object is returned, or <code>null<\/code> if the user is not yet logged in. <code>firebase<\/code> is the reference to the backend database (see code above).<\/p>\n<p>Within the Kudos script I use the following function for handling the authentication:<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">var getAuthData = function(){\r\n    var deferred = $.Deferred();\r\n\r\n    var authData = firebase.getAuth();\r\n    if(authData == null){\r\n        \/\/ authenticate the user\r\n        firebase.authAnonymously(function(err, authenticationData) {\r\n            \/\/authData = authenticationData\r\n            deferred.resolve(authenticationData);\r\n        });\r\n    }else{\r\n        deferred.resolve(authData);\r\n    }\r\n\r\n    return deferred.promise();\r\n};<\/pre>\n<p>The function returns a promise which either resolves with the authData when the user has already been authenticated or executes the anonymous login.<\/p>\n<p>I then use the <code>uid<\/code> from the authData to identify a user&#8217;s Kudo entry. This is how the data for a given page looks like:<\/p>\n<p><a href=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2015\/01\/firebase-data-entry-structure.png\"><img decoding=\"async\" class=\"aligncenter wp-image-2101\" src=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2015\/01\/firebase-data-entry-structure-1024x548.png\" alt=\"firebase-data-entry-structure\" width=\"860\" height=\"460\" srcset=\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2015\/01\/firebase-data-entry-structure-1024x548.png 1024w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2015\/01\/firebase-data-entry-structure-300x160.png 300w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2015\/01\/firebase-data-entry-structure.png 1359w\" sizes=\"(max-width: 860px) 100vw, 860px\" \/><\/a><\/p>\n<p>This allows me to restrict the user in such a way that it can only add new kudos or remove its own entry. This is enforced by the <strong>Firebase security rules<\/strong> which can be configured on its website. The rule for the kudo DB looks as follows:<\/p>\n<p><a href=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2015\/01\/firebase-kudo-rules.png\"><img decoding=\"async\" class=\"aligncenter wp-image-2102\" src=\"http:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2015\/01\/firebase-kudo-rules-1024x529.png\" alt=\"firebase-kudo-rules\" width=\"860\" height=\"444\" srcset=\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2015\/01\/firebase-kudo-rules-1024x529.png 1024w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2015\/01\/firebase-kudo-rules-300x155.png 300w, https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2015\/01\/firebase-kudo-rules.png 1607w\" sizes=\"(max-width: 860px) 100vw, 860px\" \/><\/a><\/p>\n<p>Again, check the docs for the exact syntax. What the above definition does is to allow all users to read all likes, but only modify (write) those created by themselves.<\/p>\n<h2>Storing and retrieving data<\/h2>\n<p>Storing data is as simple as selecting some node and setting the value.<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">someChildNode.set({\r\n    count: 1\r\n});<\/pre>\n<p>Specifically, in the Kudo script it looks like this:<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">getAuthData().then(function(authData){\r\n    firebaseKudos\r\n        .child(key)\r\n        .child('likes')\r\n        .child(authData.uid)\r\n        .set({\r\n            count: 1\r\n        });\r\n});<\/pre>\n<p><code>key<\/code> is the page url (cleaned from special symbols like slashes etc). Then I create\/or update a subnode &#8220;likes&#8221; before creating an entry for the current user, with its authentication UID.<\/p>\n<p><strong>Removing<\/strong> an existing Kudo simply removes the according node:<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">getAuthData().then(function(authData){\r\n    firebaseKudos\r\n        .child(key)\r\n        .child('likes')\r\n        .child(authData.uid)\r\n        .remove();\r\n});<\/pre>\n<p><strong>Retrieving<\/strong> the data enables at the same time also real-time updates.<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">firebaseKudos.child(key).on('value', function(snapshot){\r\n    if(snapshot){\r\n        var article = snapshot.val();\r\n        var likeCount = 0;\r\n        if(article){\r\n            for(var prop in article.likes){\r\n                likeCount++;\r\n            }\r\n        }\r\n        ...\r\n    }\r\n});<\/pre>\n<p>Every time a value is updated on the Firebase store, this callback will be invoked.<\/p>\n<h2>Code and Usage<\/h2>\n<p>All of the code is available on <strong>GitHub<\/strong>: <a href=\"https:\/\/github.com\/juristr\/kudos\">https:\/\/github.com\/juristr\/kudos<\/a>.<\/p>\n<p>There are even detailed instructions on how to add the script to your own page as well as on how to properly create and configure your Firebase account. As always, I&#8217;m more than happy for any comments or PRs with improvements.<\/p>\n<h2>Conclusion<\/h2>\n<p>Firebase is great as a backend for simple applications. Especially when it comes to real-time synchronization between different clients which you literally get for free. Another area where I could imagine to use it is on mobile devices. The vast amount of available client libraries makes it really easy to connect to Firebase. So you could have it as your integration backend with a larger environment or ecosystem of applications, just to be aligned with the latest movements Microservices ;).<\/p>\n<div class=\"attribution\">\n<table>\n<tbody>\n<tr>\n<td><span class=\"reference\">Reference: <\/span><\/td>\n<td><a href=\"http:\/\/juristr.com\/blog\/2014\/12\/kudos-for-your-site\/\">Kudos for your site &#8211; powered by Firebase<\/a> from our <a href=\"http:\/\/www.webcodegeeks.com\/wcg\/\">WCG partner<\/a> Juri Strumpflohner at the <a href=\"http:\/\/juristr.com\/blog\/\">Juri Strumpflohner&#8217;s TechBlog<\/a> blog.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>I don&#8217;t quite remember, guess it was about more than a year ago when I came across a Svbtle-hosted blog where I noticed a small little circle, bouncing when you hover it and showing a number followed by &#8220;Kudos&#8221;. What are Kudos? Read ahead and see how I created my own version using Firebase as &hellip;<\/p>\n","protected":false},"author":5,"featured_media":920,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9],"tags":[72],"class_list":["post-2088","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-javascript","tag-firebase"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Kudos for your site - powered by Firebase - Web Code Geeks - 2026<\/title>\n<meta name=\"description\" content=\"I don&#039;t quite remember, guess it was about more than a year ago when I came across a Svbtle-hosted blog where I noticed a small little circle, bouncing\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.webcodegeeks.com\/javascript\/kudos-for-your-site-powered-by-firebase\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Kudos for your site - powered by Firebase - Web Code Geeks - 2026\" \/>\n<meta property=\"og:description\" content=\"I don&#039;t quite remember, guess it was about more than a year ago when I came across a Svbtle-hosted blog where I noticed a small little circle, bouncing\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.webcodegeeks.com\/javascript\/kudos-for-your-site-powered-by-firebase\/\" \/>\n<meta property=\"og:site_name\" content=\"Web Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/webcodegeeks\" \/>\n<meta property=\"article:published_time\" content=\"2015-01-21T11:15:58+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/js-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Juri Strumpflohner\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@http:\/\/twitter.com\/juristr\" \/>\n<meta name=\"twitter:site\" content=\"@webcodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Juri Strumpflohner\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/kudos-for-your-site-powered-by-firebase\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/kudos-for-your-site-powered-by-firebase\/\"},\"author\":{\"name\":\"Juri Strumpflohner\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/33d3ee7edb105a80f1ff7199925b3060\"},\"headline\":\"Kudos for your site &#8211; powered by Firebase\",\"datePublished\":\"2015-01-21T11:15:58+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/kudos-for-your-site-powered-by-firebase\/\"},\"wordCount\":1358,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/kudos-for-your-site-powered-by-firebase\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/js-logo.jpg\",\"keywords\":[\"Firebase\"],\"articleSection\":[\"JavaScript\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.webcodegeeks.com\/javascript\/kudos-for-your-site-powered-by-firebase\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/kudos-for-your-site-powered-by-firebase\/\",\"url\":\"https:\/\/www.webcodegeeks.com\/javascript\/kudos-for-your-site-powered-by-firebase\/\",\"name\":\"Kudos for your site - powered by Firebase - Web Code Geeks - 2026\",\"isPartOf\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/kudos-for-your-site-powered-by-firebase\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/kudos-for-your-site-powered-by-firebase\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/js-logo.jpg\",\"datePublished\":\"2015-01-21T11:15:58+00:00\",\"description\":\"I don't quite remember, guess it was about more than a year ago when I came across a Svbtle-hosted blog where I noticed a small little circle, bouncing\",\"breadcrumb\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/kudos-for-your-site-powered-by-firebase\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.webcodegeeks.com\/javascript\/kudos-for-your-site-powered-by-firebase\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/kudos-for-your-site-powered-by-firebase\/#primaryimage\",\"url\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/js-logo.jpg\",\"contentUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/js-logo.jpg\",\"width\":150,\"height\":150},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/kudos-for-your-site-powered-by-firebase\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.webcodegeeks.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"JavaScript\",\"item\":\"https:\/\/www.webcodegeeks.com\/category\/javascript\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Kudos for your site &#8211; powered by Firebase\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#website\",\"url\":\"https:\/\/www.webcodegeeks.com\/\",\"name\":\"Web Code Geeks\",\"description\":\"Web Developers Resource Center\",\"publisher\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.webcodegeeks.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\/\/www.webcodegeeks.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png\",\"contentUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/webcodegeeks\",\"https:\/\/x.com\/webcodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/33d3ee7edb105a80f1ff7199925b3060\",\"name\":\"Juri Strumpflohner\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/45338315375849845e4c4b30f52cb417221e2d9a7e688785e4dd2af0e624a260?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/45338315375849845e4c4b30f52cb417221e2d9a7e688785e4dd2af0e624a260?s=96&d=mm&r=g\",\"caption\":\"Juri Strumpflohner\"},\"description\":\"Juri Strumpflohner mainly operates in the web sector developing rich applications with HTML5 and JavaScript. Beside having a Java background and developing Android applications he currently works as a software architect in the e-government sector. When he\u2019s not coding or blogging about his newest discoveries, he is practicing Yoseikan Budo where he owns a 2nd DAN.\",\"sameAs\":[\"http:\/\/juristr.com\/blog\/\",\"http:\/\/linkedin.com\/in\/juristr\/\",\"https:\/\/x.com\/http:\/\/twitter.com\/juristr\"],\"url\":\"https:\/\/www.webcodegeeks.com\/author\/juri-strumpflohner\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Kudos for your site - powered by Firebase - Web Code Geeks - 2026","description":"I don't quite remember, guess it was about more than a year ago when I came across a Svbtle-hosted blog where I noticed a small little circle, bouncing","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.webcodegeeks.com\/javascript\/kudos-for-your-site-powered-by-firebase\/","og_locale":"en_US","og_type":"article","og_title":"Kudos for your site - powered by Firebase - Web Code Geeks - 2026","og_description":"I don't quite remember, guess it was about more than a year ago when I came across a Svbtle-hosted blog where I noticed a small little circle, bouncing","og_url":"https:\/\/www.webcodegeeks.com\/javascript\/kudos-for-your-site-powered-by-firebase\/","og_site_name":"Web Code Geeks","article_publisher":"https:\/\/www.facebook.com\/webcodegeeks","article_published_time":"2015-01-21T11:15:58+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/js-logo.jpg","type":"image\/jpeg"}],"author":"Juri Strumpflohner","twitter_card":"summary_large_image","twitter_creator":"@http:\/\/twitter.com\/juristr","twitter_site":"@webcodegeeks","twitter_misc":{"Written by":"Juri Strumpflohner","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.webcodegeeks.com\/javascript\/kudos-for-your-site-powered-by-firebase\/#article","isPartOf":{"@id":"https:\/\/www.webcodegeeks.com\/javascript\/kudos-for-your-site-powered-by-firebase\/"},"author":{"name":"Juri Strumpflohner","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/33d3ee7edb105a80f1ff7199925b3060"},"headline":"Kudos for your site &#8211; powered by Firebase","datePublished":"2015-01-21T11:15:58+00:00","mainEntityOfPage":{"@id":"https:\/\/www.webcodegeeks.com\/javascript\/kudos-for-your-site-powered-by-firebase\/"},"wordCount":1358,"commentCount":0,"publisher":{"@id":"https:\/\/www.webcodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.webcodegeeks.com\/javascript\/kudos-for-your-site-powered-by-firebase\/#primaryimage"},"thumbnailUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/js-logo.jpg","keywords":["Firebase"],"articleSection":["JavaScript"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.webcodegeeks.com\/javascript\/kudos-for-your-site-powered-by-firebase\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.webcodegeeks.com\/javascript\/kudos-for-your-site-powered-by-firebase\/","url":"https:\/\/www.webcodegeeks.com\/javascript\/kudos-for-your-site-powered-by-firebase\/","name":"Kudos for your site - powered by Firebase - Web Code Geeks - 2026","isPartOf":{"@id":"https:\/\/www.webcodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.webcodegeeks.com\/javascript\/kudos-for-your-site-powered-by-firebase\/#primaryimage"},"image":{"@id":"https:\/\/www.webcodegeeks.com\/javascript\/kudos-for-your-site-powered-by-firebase\/#primaryimage"},"thumbnailUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/js-logo.jpg","datePublished":"2015-01-21T11:15:58+00:00","description":"I don't quite remember, guess it was about more than a year ago when I came across a Svbtle-hosted blog where I noticed a small little circle, bouncing","breadcrumb":{"@id":"https:\/\/www.webcodegeeks.com\/javascript\/kudos-for-your-site-powered-by-firebase\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.webcodegeeks.com\/javascript\/kudos-for-your-site-powered-by-firebase\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/javascript\/kudos-for-your-site-powered-by-firebase\/#primaryimage","url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/js-logo.jpg","contentUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/js-logo.jpg","width":150,"height":150},{"@type":"BreadcrumbList","@id":"https:\/\/www.webcodegeeks.com\/javascript\/kudos-for-your-site-powered-by-firebase\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.webcodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"JavaScript","item":"https:\/\/www.webcodegeeks.com\/category\/javascript\/"},{"@type":"ListItem","position":3,"name":"Kudos for your site &#8211; powered by Firebase"}]},{"@type":"WebSite","@id":"https:\/\/www.webcodegeeks.com\/#website","url":"https:\/\/www.webcodegeeks.com\/","name":"Web Code Geeks","description":"Web Developers Resource Center","publisher":{"@id":"https:\/\/www.webcodegeeks.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.webcodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.webcodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.webcodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/webcodegeeks","https:\/\/x.com\/webcodegeeks"]},{"@type":"Person","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/33d3ee7edb105a80f1ff7199925b3060","name":"Juri Strumpflohner","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/45338315375849845e4c4b30f52cb417221e2d9a7e688785e4dd2af0e624a260?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/45338315375849845e4c4b30f52cb417221e2d9a7e688785e4dd2af0e624a260?s=96&d=mm&r=g","caption":"Juri Strumpflohner"},"description":"Juri Strumpflohner mainly operates in the web sector developing rich applications with HTML5 and JavaScript. Beside having a Java background and developing Android applications he currently works as a software architect in the e-government sector. When he\u2019s not coding or blogging about his newest discoveries, he is practicing Yoseikan Budo where he owns a 2nd DAN.","sameAs":["http:\/\/juristr.com\/blog\/","http:\/\/linkedin.com\/in\/juristr\/","https:\/\/x.com\/http:\/\/twitter.com\/juristr"],"url":"https:\/\/www.webcodegeeks.com\/author\/juri-strumpflohner\/"}]}},"_links":{"self":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts\/2088","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/comments?post=2088"}],"version-history":[{"count":0,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts\/2088\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/media\/920"}],"wp:attachment":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/media?parent=2088"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/categories?post=2088"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/tags?post=2088"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}