{"id":25865,"date":"2023-09-15T18:06:07","date_gmt":"2023-09-15T16:06:07","guid":{"rendered":"https:\/\/blog.mi.hdm-stuttgart.de\/?p=25865"},"modified":"2023-09-15T18:06:12","modified_gmt":"2023-09-15T16:06:12","slug":"guess-what-we-built-a-web-game-with-firebase","status":"publish","type":"post","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2023\/09\/15\/guess-what-we-built-a-web-game-with-firebase\/","title":{"rendered":"Guess What? We Built a Web Game with Firebase"},"content":{"rendered":"\n<h2 class=\"wp-block-heading has-x-large-font-size\">What is more or less?<\/h2>\n\n\n\n<p><a href=\"https:\/\/moreorless.io\/\" target=\"_blank\" rel=\"noopener\" title=\"&quot;More or Less&quot;\">&#8220;More or Less&#8221;<\/a> is a guessing game where you guess which item has a higher value for a specific attribute. For example, in the &#8220;Commit Clash: Which GitHub repo has more commits?&#8221; mode, you see one GitHub repository&#8217;s commit count and another repository. You have to decide if the repository has more or less commits. If you guess correctly, you see the next pair. If you&#8217;re wrong, you lose. Players who score high earn trophies. If they guess every pair correctly, they win a special trophy.<\/p>\n\n\n\n<figure class=\"wp-block-video\"><video height=\"720\" style=\"aspect-ratio: 1126 \/ 720;\" width=\"1126\" autoplay loop muted preload=\"auto\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/More-or-Less-Game-Preview.mp4\"><\/video><\/figure>\n\n\n\n<h3 class=\"wp-block-heading has-large-font-size\" style=\"padding-top:0;padding-right:0;padding-bottom:0;padding-left:0\">Different Game Types<\/h3>\n\n\n\n<p>Players can challenge themselves with modes like determining <a href=\"https:\/\/moreorless.io\/game\/country-size\" target=\"_blank\" rel=\"noopener\" title=\"which country is bigger, \">which country is bigger, <\/a><a href=\"https:\/\/moreorless.io\/game\/rich-people\" target=\"_blank\" rel=\"noopener\" title=\"who might have more money\">who might have more money<\/a><a href=\"https:\/\/moreorless.io\/game\/most-visited-websites\" target=\"_blank\" rel=\"noopener\" title=\", or which website gets more visits\">, or which website gets more visits<\/a>. Plus, there are even <a href=\"https:\/\/moreorless.io\/games\" target=\"_blank\" rel=\"noopener\" title=\"more modes \">more modes <\/a>to explore and enjoy.<\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_game_overview.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"580\" data-attachment-id=\"25904\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2023\/09\/15\/guess-what-we-built-a-web-game-with-firebase\/mol_game_overview\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_game_overview.png\" data-orig-size=\"2872,1626\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"mol_game_overview\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_game_overview-1024x580.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_game_overview-1024x580.png\" alt=\"\" class=\"wp-image-25904\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_game_overview-1024x580.png 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_game_overview-300x170.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_game_overview-768x435.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_game_overview-1536x870.png 1536w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_game_overview-2048x1159.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_ingame.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"580\" data-attachment-id=\"25905\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2023\/09\/15\/guess-what-we-built-a-web-game-with-firebase\/mol_ingame\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_ingame.png\" data-orig-size=\"2872,1626\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"mol_ingame\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_ingame-1024x580.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_ingame-1024x580.png\" alt=\"\" class=\"wp-image-25905\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_ingame-1024x580.png 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_ingame-300x170.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_ingame-768x435.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_ingame-1536x870.png 1536w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_ingame-2048x1159.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n<\/div>\n<\/div>\n\n\n\n<h3 class=\"wp-block-heading has-large-font-size\" style=\"padding-top:0\">Player Profile<\/h3>\n\n\n\n<p>Players have a profile where they can view their high scores per game and various statistics, such as total playtime, overall high score, trophies earned, and average score.<\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_profile_stats.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"580\" data-attachment-id=\"25908\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2023\/09\/15\/guess-what-we-built-a-web-game-with-firebase\/mol_profile_stats\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_profile_stats.png\" data-orig-size=\"2872,1626\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"mol_profile_stats\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_profile_stats-1024x580.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_profile_stats-1024x580.png\" alt=\"\" class=\"wp-image-25908\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_profile_stats-1024x580.png 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_profile_stats-300x170.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_profile_stats-768x435.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_profile_stats-1536x870.png 1536w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_profile_stats-2048x1159.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_profile_games.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"580\" data-attachment-id=\"25909\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2023\/09\/15\/guess-what-we-built-a-web-game-with-firebase\/mol_profile_games\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_profile_games.png\" data-orig-size=\"2872,1626\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"mol_profile_games\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_profile_games-1024x580.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_profile_games-1024x580.png\" alt=\"\" class=\"wp-image-25909\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_profile_games-1024x580.png 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_profile_games-300x170.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_profile_games-768x435.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_profile_games-1536x870.png 1536w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_profile_games-2048x1159.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n<\/div>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading has-x-large-font-size\" style=\"padding-top:var(--wp--preset--spacing--30);padding-right:0;padding-bottom:0;padding-left:0\">What did we did this semester?<\/h2>\n\n\n\n<h3 class=\"wp-block-heading has-large-font-size\">Initial Setup<\/h3>\n\n\n\n<p>At the beginning of this semester <a href=\"https:\/\/moreorless.io\/\" target=\"_blank\" rel=\"noopener\" title=\"&quot;More or Less&quot;\">&#8220;More or Less&#8221;<\/a> was using a <strong>Jamstack approach<\/strong> with <a href=\"https:\/\/react.dev\/\" target=\"_blank\" rel=\"noopener\" title=\"React\">React<\/a> and a static JSON backend. This is<strong> cost-effective<\/strong> and <strong>easy to develop<\/strong>. High scores were stored in the browser so there was no need for server-side profiles. We kept our game data in file-based databases on a static server and managed this data on our own.<\/p>\n\n\n\n<p>This semester, we updated our game to allow user-created content and server-side profiles adding a dynamic backend part to our application.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-large-font-size\" style=\"padding-top:var(--wp--preset--spacing--30)\">Features added this semester<\/h3>\n\n\n\n<h4 class=\"wp-block-heading has-medium-font-size\"><strong>User-Created Game Modes<\/strong><\/h4>\n\n\n\n<p>The main update was letting users create their own game modes. This introduced user-generated content to the platform. Users can now design new modes to share with everyone, or create personalized modes just for their friends or themselves.<\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_editor_general.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"580\" data-attachment-id=\"25910\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2023\/09\/15\/guess-what-we-built-a-web-game-with-firebase\/mol_editor_general\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_editor_general.png\" data-orig-size=\"2872,1626\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"mol_editor_general\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_editor_general-1024x580.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_editor_general-1024x580.png\" alt=\"\" class=\"wp-image-25910\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_editor_general-1024x580.png 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_editor_general-300x170.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_editor_general-768x435.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_editor_general-1536x870.png 1536w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_editor_general-2048x1159.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_editor_items.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"580\" data-attachment-id=\"25911\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2023\/09\/15\/guess-what-we-built-a-web-game-with-firebase\/mol_editor_items\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_editor_items.png\" data-orig-size=\"2872,1626\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"mol_editor_items\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_editor_items-1024x580.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_editor_items-1024x580.png\" alt=\"\" class=\"wp-image-25911\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_editor_items-1024x580.png 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_editor_items-300x170.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_editor_items-768x435.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_editor_items-1536x870.png 1536w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_editor_items-2048x1159.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_editor_display.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"580\" data-attachment-id=\"25912\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2023\/09\/15\/guess-what-we-built-a-web-game-with-firebase\/mol_editor_display\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_editor_display.png\" data-orig-size=\"2872,1626\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"mol_editor_display\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_editor_display-1024x580.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_editor_display-1024x580.png\" alt=\"\" class=\"wp-image-25912\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_editor_display-1024x580.png 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_editor_display-300x170.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_editor_display-768x435.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_editor_display-1536x870.png 1536w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_editor_display-2048x1159.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_editor_stats.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"580\" data-attachment-id=\"25913\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2023\/09\/15\/guess-what-we-built-a-web-game-with-firebase\/mol_editor_stats\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_editor_stats.png\" data-orig-size=\"2872,1626\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"mol_editor_stats\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_editor_stats-1024x580.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_editor_stats-1024x580.png\" alt=\"\" class=\"wp-image-25913\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_editor_stats-1024x580.png 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_editor_stats-300x170.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_editor_stats-768x435.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_editor_stats-1536x870.png 1536w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_editor_stats-2048x1159.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n<\/div>\n<\/div>\n\n\n\n<h4 class=\"wp-block-heading has-medium-font-size\"><strong>Account Authentication<\/strong><\/h4>\n\n\n\n<p>Now, users can sign in using oAuth or email and password, instead of the old local storage method. This allows game modes to be shared with the community and highscore saved in your account instead of your browser storage. We also introduced email verification and password reset features.<\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_login.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"580\" data-attachment-id=\"25915\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2023\/09\/15\/guess-what-we-built-a-web-game-with-firebase\/mol_login\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_login.png\" data-orig-size=\"2872,1626\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"mol_login\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_login-1024x580.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_login-1024x580.png\" alt=\"\" class=\"wp-image-25915\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_login-1024x580.png 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_login-300x170.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_login-768x435.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_login-1536x870.png 1536w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_login-2048x1159.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_reset_pass.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"580\" data-attachment-id=\"25917\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2023\/09\/15\/guess-what-we-built-a-web-game-with-firebase\/mol_reset_pass\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_reset_pass.png\" data-orig-size=\"2872,1626\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"mol_reset_pass\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_reset_pass-1024x580.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_reset_pass-1024x580.png\" alt=\"\" class=\"wp-image-25917\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_reset_pass-1024x580.png 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_reset_pass-300x170.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_reset_pass-768x435.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_reset_pass-1536x870.png 1536w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_reset_pass-2048x1159.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n<\/div>\n<\/div>\n\n\n\n<h4 class=\"wp-block-heading has-medium-font-size\"><strong>Profile Updates<\/strong><\/h4>\n\n\n\n<p>With the move to server-side profiles, we updated the profile design to allow users to share their highscores and added more account settings options. Now, users can include social links and have the ability to change their email, modify their password, and delete their account if necessary.<\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_profile_stats.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"580\" data-attachment-id=\"25908\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2023\/09\/15\/guess-what-we-built-a-web-game-with-firebase\/mol_profile_stats\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_profile_stats.png\" data-orig-size=\"2872,1626\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"mol_profile_stats\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_profile_stats-1024x580.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_profile_stats-1024x580.png\" alt=\"\" class=\"wp-image-25908\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_profile_stats-1024x580.png 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_profile_stats-300x170.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_profile_stats-768x435.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_profile_stats-1536x870.png 1536w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_profile_stats-2048x1159.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_settings_personal.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"580\" data-attachment-id=\"25918\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2023\/09\/15\/guess-what-we-built-a-web-game-with-firebase\/mol_settings_personal\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_settings_personal.png\" data-orig-size=\"2872,1626\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"mol_settings_personal\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_settings_personal-1024x580.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_settings_personal-1024x580.png\" alt=\"\" class=\"wp-image-25918\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_settings_personal-1024x580.png 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_settings_personal-300x170.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_settings_personal-768x435.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_settings_personal-1536x870.png 1536w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_settings_personal-2048x1159.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_settings_social.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"580\" data-attachment-id=\"25919\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2023\/09\/15\/guess-what-we-built-a-web-game-with-firebase\/mol_settings_social\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_settings_social.png\" data-orig-size=\"2872,1626\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"mol_settings_social\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_settings_social-1024x580.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_settings_social-1024x580.png\" alt=\"\" class=\"wp-image-25919\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_settings_social-1024x580.png 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_settings_social-300x170.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_settings_social-768x435.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_settings_social-1536x870.png 1536w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_settings_social-2048x1159.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_settings_account.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"580\" data-attachment-id=\"25920\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2023\/09\/15\/guess-what-we-built-a-web-game-with-firebase\/mol_settings_account\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_settings_account.png\" data-orig-size=\"2872,1626\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"mol_settings_account\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_settings_account-1024x580.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_settings_account-1024x580.png\" alt=\"\" class=\"wp-image-25920\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_settings_account-1024x580.png 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_settings_account-300x170.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_settings_account-768x435.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_settings_account-1536x870.png 1536w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_settings_account-2048x1159.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n<\/div>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading has-x-large-font-size\" style=\"padding-top:var(--wp--preset--spacing--30)\">Software is not an end in itself<\/h2>\n\n\n\n<p>By looking back at what projects we did the last semesters we found out that most of them <strong>couldn\u2019t make it to the market<\/strong>.&nbsp;<\/p>\n\n\n\n<p>We discovered that it\u2019s mostly because they were not really designed to be for the market. Trying out new things like a new technique or a jump into a new design pattern was a lot of fun, and a great learning experience, but the primary goal of a software \u201cSolving a functional problem\u201d was never really successful. <\/p>\n\n\n\n<p>In this semester we wanted to change that and focused on building an app which really covers the user&#8217;s needs. We started by <strong>focusing on the functional requirements<\/strong> instead of the technical ones.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-x-large-font-size\" style=\"padding-top:var(--wp--preset--spacing--30)\">Task-Oriented Design<\/h2>\n\n\n\n<p>To achieve this goal we started to define which user groups we have and what task they would like to achieve. Tasks are actions or goals these users want to do or reach in your app. Based on this definition we build our whole API and logic around these tasks.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-medium-font-size\"><strong>User Groups<\/strong><\/h3>\n\n\n\n<p>Players are users who only want to play the game modes.<br>Contributors are users who want to create game modes.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-medium-font-size\"><strong>Player Tasks<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Wants to play game modes.<\/li>\n\n\n\n<li>Wants to find and get suggested game modes.<\/li>\n\n\n\n<li>Wants to share game mode high scores.<\/li>\n\n\n\n<li>Wants to comment on game modes.<\/li>\n\n\n\n<li>Wants to share game modes.<\/li>\n\n\n\n<li>Wants to report game modes.<\/li>\n\n\n\n<li>Wants to see profile and progress.<\/li>\n\n\n\n<li>Wants to rate game modes.<\/li>\n\n\n\n<li>Wants to favorite game modes.<\/li>\n\n\n\n<li>Wants to manage profile.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading has-medium-font-size\"><strong>Contributor Tasks<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Wants to create game modes.<\/li>\n\n\n\n<li>Wants to modify game modes.<\/li>\n\n\n\n<li>Wants to delete game modes.<\/li>\n\n\n\n<li>Wants to share game modes (private and public).<\/li>\n\n\n\n<li>Wants to see game mode statistics.<\/li>\n<\/ul>\n\n\n\n<p>When working with a task-oriented design it can <strong>solve<\/strong> <strong>the<\/strong> <strong>domain problem<\/strong> quite well. However one problem we encourage is if you try to follow all tasks as best as possible, that your technical implementation gets very complicated.&nbsp;<\/p>\n\n\n\n<p>Looking at our first definition of how the game editor service should save a game:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/complicated.png\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"25923\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2023\/09\/15\/guess-what-we-built-a-web-game-with-firebase\/complicated\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/complicated.png\" data-orig-size=\"1174,859\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"complicated\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/complicated-1024x749.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/complicated-1024x749.png\" alt=\"\" class=\"wp-image-25923\" width=\"512\" height=\"375\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/complicated-1024x749.png 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/complicated-300x220.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/complicated-768x562.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/complicated.png 1174w\" sizes=\"auto, (max-width: 512px) 100vw, 512px\" \/><\/a><\/figure>\n\n\n\n<p>You will end up with a functional correct implementation but technical complex solution. That\u2019s the reason, we opted for a more straightforward approach which is not only easier to implement and maintain but also more understandable for the end user, enhancing the user experience.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/simple.png\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"25924\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2023\/09\/15\/guess-what-we-built-a-web-game-with-firebase\/simple\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/simple.png\" data-orig-size=\"633,875\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"simple\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/simple.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/simple.png\" alt=\"\" class=\"wp-image-25924\" width=\"317\" height=\"438\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/simple.png 633w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/simple-217x300.png 217w\" sizes=\"auto, (max-width: 317px) 100vw, 317px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading has-x-large-font-size\" style=\"padding-top:var(--wp--preset--spacing--30)\">Architecture<\/h2>\n\n\n\n<p>To focus on these functional requirements we were looking for an architecture and infrastructure which already includes many of the technical common challenges like Authentication, Controller logic, security, scalability and deployment so that we can focus on building our business problem. While evaluating using a traditional backend, or other cloud services we finally decided to go with <a href=\"https:\/\/firebase.google.com\/\" target=\"_blank\" rel=\"noopener\" title=\"Firebase\">Firebase<\/a>. Firebase seems to offer a more streamlined and integrated approach, enabling rapid development, built-in scalability, and a suite of tools that fits perfectly to our project&#8217;s specific needs.<\/p>\n\n\n\n<p>Our final architecture looks like this:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/architecture.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"505\" data-attachment-id=\"25925\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2023\/09\/15\/guess-what-we-built-a-web-game-with-firebase\/architecture-5\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/architecture.png\" data-orig-size=\"2018,995\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"architecture\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/architecture-1024x505.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/architecture-1024x505.png\" alt=\"\" class=\"wp-image-25925\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/architecture-1024x505.png 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/architecture-300x148.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/architecture-768x379.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/architecture-1536x757.png 1536w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/architecture.png 2018w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Github<\/strong>: With Github Actions we generate our Static API, build our <a href=\"https:\/\/react.dev\/\" target=\"_blank\" rel=\"noopener\" title=\"React\">React<\/a> frontend and deploy both using <a href=\"https:\/\/pages.cloudflare.com\/\" target=\"_blank\" rel=\"noopener\" title=\"Cloudflare Pages\">Cloudflare Pages<\/a>. We also run our <a href=\"https:\/\/www.cypress.io\/\" target=\"_blank\" rel=\"noopener\" title=\"Cypress\">Cypress<\/a> end-to-end tests, component tests and unit tests. Lastly we test and deploy our Firebase app. You can read more about Testing and CI\/CD below.&nbsp;<\/li>\n\n\n\n<li><strong>Static API<\/strong>: Our static API delivers our own created game modes. Read more about it <a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2023\/09\/15\/cost-efficient-server-structure-merging-static-and-dynamic-api\/\" title=\"Cost-Efficient Server Structure: Merging Static and Dynamic API\">here<\/a>.<\/li>\n\n\n\n<li><strong>React Frontend<\/strong>: Our whole game is created by using <a href=\"https:\/\/react.dev\/\" target=\"_blank\" rel=\"noopener\" title=\"React\">React<\/a> with <a href=\"https:\/\/www.typescriptlang.org\/\" target=\"_blank\" rel=\"noopener\" title=\"Typescript\">Typescript<\/a>, <a href=\"https:\/\/tailwindcss.com\/\" target=\"_blank\" rel=\"noopener\" title=\"TailwindCSS\">TailwindCSS<\/a>, <a href=\"https:\/\/formik.org\/\" target=\"_blank\" rel=\"noopener\" title=\"Formik\">Formik<\/a>, <a href=\"https:\/\/moment.github.io\/luxon\/#\/\" target=\"_blank\" rel=\"noopener\" title=\"Luxon\">Luxon<\/a>, <a href=\"https:\/\/firebase.google.com\/\" target=\"_blank\" rel=\"noopener\" title=\"Firebase\">Firebase<\/a> and <a href=\"https:\/\/tanstack.com\/\" target=\"_blank\" rel=\"noopener\" title=\"TanStack\">TanStack<\/a>.&nbsp;<\/li>\n\n\n\n<li><strong>Firebase Firestore<\/strong>: The user contributes data like game modes, profiles and highscores are stored in Firebase Firestore. There we use the centralized security approach from Firestore to protect our data using the Rules Language.<\/li>\n\n\n\n<li><strong>Firebase Cloud Storage<\/strong>: Is used for all the image assets users upload.&nbsp;<\/li>\n\n\n\n<li><strong>Firebase Authentication<\/strong>: Is used for user authentication of accounts.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading has-x-large-font-size\" style=\"padding-top:var(--wp--preset--spacing--30)\">Learnings<\/h2>\n\n\n\n<figure class=\"wp-block-image is-resized\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"25951\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2023\/09\/15\/optimizing-list-views-structuring-data-efficiently-in-firestore\/3_optimizing_list_views_structuring_data_efficiently_in_firestore\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/3_optimizing_list_views_structuring_data_efficiently_in_firestore.png\" data-orig-size=\"1100,480\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"3_optimizing_list_views_structuring_data_efficiently_in_firestore\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/3_optimizing_list_views_structuring_data_efficiently_in_firestore-1024x447.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/3_optimizing_list_views_structuring_data_efficiently_in_firestore-1024x447.png\" alt=\"\" class=\"wp-image-25951\" width=\"554\" height=\"242\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/3_optimizing_list_views_structuring_data_efficiently_in_firestore-1024x447.png 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/3_optimizing_list_views_structuring_data_efficiently_in_firestore-300x131.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/3_optimizing_list_views_structuring_data_efficiently_in_firestore-768x335.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/3_optimizing_list_views_structuring_data_efficiently_in_firestore.png 1100w\" sizes=\"auto, (max-width: 554px) 100vw, 554px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading has-contrast-color has-text-color has-link-color has-large-font-size wp-elements-42b72646965f4e3680eeec540d16c8db\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2023\/09\/15\/optimizing-list-views-structuring-data-efficiently-in-firestore\/\" target=\"_blank\" rel=\"noopener\" title=\"Optimizing List Views: Structuring Data Efficiently in Firestore\">Optimizing List Views: Structuring Data Efficiently in Firestore<\/a><\/h3>\n\n\n\n<p>While developing our guessing game \u201cMore or Less\u201d, we encountered a common challenge many developers face: determining the structure of our data model[\u2026]<\/p>\n\n\n\n<p style=\"padding-bottom:var(--wp--preset--spacing--30)\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2023\/09\/15\/optimizing-list-views-structuring-data-efficiently-in-firestore\/\" target=\"_blank\" rel=\"noopener\" title=\"Read more\">Read more<\/a><\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/2_cost_efficient_server_structure_merging_static_and_dynamic_api.png\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"25844\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2023\/09\/15\/cost-efficient-server-structure-merging-static-and-dynamic-api\/2_cost_efficient_server_structure_merging_static_and_dynamic_api\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/2_cost_efficient_server_structure_merging_static_and_dynamic_api.png\" data-orig-size=\"1100,480\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"2_cost_efficient_server_structure_merging_static_and_dynamic_api\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/2_cost_efficient_server_structure_merging_static_and_dynamic_api-1024x447.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/2_cost_efficient_server_structure_merging_static_and_dynamic_api-1024x447.png\" alt=\"Thumbnail for merging of static and dynamic API structures for optimized server costs and efficient content creation.\" class=\"wp-image-25844\" width=\"551\" height=\"240\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/2_cost_efficient_server_structure_merging_static_and_dynamic_api-1024x447.png 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/2_cost_efficient_server_structure_merging_static_and_dynamic_api-300x131.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/2_cost_efficient_server_structure_merging_static_and_dynamic_api-768x335.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/2_cost_efficient_server_structure_merging_static_and_dynamic_api.png 1100w\" sizes=\"auto, (max-width: 551px) 100vw, 551px\" \/><\/a><\/figure>\n\n\n\n<h3 class=\"wp-block-heading has-contrast-color has-text-color has-link-color has-large-font-size wp-elements-a55059b7cffeface8264383cc90e3f67\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2023\/09\/15\/cost-efficient-server-structure-merging-static-and-dynamic-api\/\" target=\"_blank\" rel=\"noopener\" title=\"Cost-Efficient Server Structure: Merging Static and Dynamic API\">Cost-Efficient Server Structure: Merging Static and Dynamic API<\/a><\/h3>\n\n\n\n<p>While developing our guessing game, \u201cMore or Less\u201d, we found a method to significantly reduce traffic on our serverless API, leading to cost savings and an improved content creation experience[&#8230;]<\/p>\n\n\n\n<p><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2023\/09\/15\/cost-efficient-server-structure-merging-static-and-dynamic-api\/\" target=\"_blank\" rel=\"noopener\" title=\"Cost-Efficient Server Structure: Merging Static and Dynamic API\">Read more<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading has-x-large-font-size\" style=\"padding-top:var(--wp--preset--spacing--30)\">Workflow: How to develop a serverless app local?&nbsp;<\/h2>\n\n\n\n<p>One of the biggest challenges when working with serverless apps is the <strong>local development process<\/strong>. Working with one staging online environment has several drawbacks.<\/p>\n\n\n\n<p>Luckily and another reason why we picked Firebase is that Firebase created their own <strong>Local Emulator services<\/strong> which allows you to run a local instance of Firebase on your own machine.&nbsp;<\/p>\n\n\n\n<p>Some advantages we discovered using the local emulator:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Fast Changes<\/strong>: Immediate testing without deploying.<\/li>\n\n\n\n<li><strong>Risk-Free Trials<\/strong>: No worry about impacting real users or data.<\/li>\n\n\n\n<li><strong>Offline Work<\/strong>: Development without needing internet.<\/li>\n\n\n\n<li><strong>Reduced Costs<\/strong>: No charges for local database operations.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading has-x-large-font-size\" style=\"padding-top:var(--wp--preset--spacing--30)\">Why Did We Not Use AWS or a Traditional Backend?<\/h2>\n\n\n\n<h3 class=\"wp-block-heading has-large-font-size\" style=\"padding-top:0\">Traditional Backend<\/h3>\n\n\n\n<p>Having had experience with traditional backends in our previous projects, we were already familiar with both their strengths and drawbacks. Here&#8217;s what we noticed:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Time-Consuming Setup<\/strong>: Establishing servers, databases, and other components often take much time, delaying the actual development of functional features.<\/li>\n\n\n\n<li><strong>Maintenance Overhead<\/strong>: Being responsible for server maintenance, software updates, and security patches often requires a lot of work.<\/li>\n\n\n\n<li><strong>Scalability Concerns<\/strong>: Building an architecture and infrastructure which is able to handle high traffic is difficult.<\/li>\n\n\n\n<li><strong>Security Challenges<\/strong>: Ensuring end-to-end security is an additional time consuming and difficult task .<\/li>\n<\/ul>\n\n\n\n<p>With this knowledge we were sure to use a serverless solution and took a look at AWS.<\/p>\n\n\n\n<h3 class=\"wp-block-heading has-large-font-size\">AWS<\/h3>\n\n\n\n<p>We found out that AWS is a robust and feature-rich platform, but working with it brought up several problems:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Complexity<\/strong>: AWS\u2019s huge range of services, while very powerful, introduces a steep learning curve. Setting up and configuring multiple services for our solution seemed time consuming and often unnecessarily complex, especially when the primary goal is rapid feature deployment.<\/li>\n\n\n\n<li><strong>Cost Management<\/strong>: AWS&#8217;s granular pricing model is, when used right, probably great but the complexity in deciding which service to use to get a good price and the technical goal was difficult for us.<\/li>\n\n\n\n<li><strong>Integration Efforts<\/strong>: To achieve what Firebase offers out of the box, such as authentication or real-time databases, AWS often requires integrating several services.<\/li>\n\n\n\n<li><strong>Development Speed<\/strong>: The time taken to learn, set up, deploy, and get started with AWS seemed longer for us.<\/li>\n<\/ul>\n\n\n\n<p>Given these insights, while both traditional backends and AWS have their good fits for projects, they seemed less fitting with our project&#8217;s goals this semester.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-x-large-font-size\" style=\"padding-top:var(--wp--preset--spacing--30)\">Continuous Integration and Continuous Deployment (CI\/CD)<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_cicd.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"402\" data-attachment-id=\"25932\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2023\/09\/15\/guess-what-we-built-a-web-game-with-firebase\/mol_cicd\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_cicd.png\" data-orig-size=\"1942,762\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"mol_cicd\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_cicd-1024x402.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_cicd-1024x402.png\" alt=\"\" class=\"wp-image-25932\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_cicd-1024x402.png 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_cicd-300x118.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_cicd-768x301.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_cicd-1536x603.png 1536w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/mol_cicd.png 1942w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>In our development process for &#8220;More or Less,&#8221; CI\/CD plays an important role in ensuring code quality and seamless deployment. Here&#8217;s a brief overview:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Running Tests<\/strong>: Our CI\/CD pipeline is designed to run both our Firebase and frontend tests automatically.&nbsp;<\/li>\n\n\n\n<li><strong>Deployment<\/strong>: Beyond testing, our CI\/CD process handles the deployment of our entire application stack. Once the tests pass, the pipeline initiates the deployment sequence, deploying the latest software into our staging environment or production environment.<\/li>\n\n\n\n<li><strong>Staging Environment<\/strong>: To catch potential issues or test the app before it reaches our users, we maintain a separate staging environment. This environment, achieved by setting up an additional Firebase project, mirrors our production setup. It offers us a sandbox to validate changes and ensure a good user experience before rolling out updates to our main user base.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading has-x-large-font-size\" style=\"padding-top:var(--wp--preset--spacing--30)\">Testing<\/h2>\n\n\n\n<h3 class=\"wp-block-heading has-large-font-size\">Frontend<\/h3>\n\n\n\n<p>We use <a href=\"https:\/\/www.cypress.io\/\" target=\"_blank\" rel=\"noopener\" title=\"Cypress\">Cypress<\/a> and the Firebase Emulator for frontend testing.&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>End-to-end tests<\/strong>: The main user stories, like creating an account, creating a game, playing the game and using the profile are tested end to end.<\/li>\n\n\n\n<li><strong>Component tests<\/strong>: The most important components, like buttons, form inputs, modals and so on are tested isolated with the Cypress mount feature.<\/li>\n\n\n\n<li><strong>Unit tests<\/strong>: Additionally, our service logic is covered by unit tests.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading has-large-font-size\">Firebase<\/h3>\n\n\n\n<p>The most important security aspect is working with the data from our users. While Firebase offers a great centralized way to define security rules for our data, it is very important for us that they are probably tested.&nbsp;<\/p>\n\n\n\n<p>We decided to use the <a href=\"https:\/\/www.npmjs.com\/package\/@firebase\/rules-unit-testing\" target=\"_blank\" rel=\"noopener\" title=\"@firebase\/rules-unit-testing\">@firebase\/rules-unit-testing<\/a> package provided by Firebase, in combination with <a href=\"https:\/\/jestjs.io\/\" target=\"_blank\" rel=\"noopener\" title=\"Jest\">Jest<\/a> to unit test all possible database operations. We utilize seeders to set up initial data and cleanup functions to ensure tests are independent and don&#8217;t interfere with one another.<\/p>\n\n\n\n<p>Our frontend tests are also using the security rules and therefore testing our security rules in an End-to-end environment.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-x-large-font-size\" style=\"padding-top:var(--wp--preset--spacing--30)\">Conclusion + Thank you<\/h2>\n\n\n\n<p>This semester, we focused on an upgrade for our &#8220;More or Less&#8221; game and chose Firebase for its benefits. Through exploring the basic serverless approach, transitioning to AWS, and ultimately settling on Firebase, we learned a lot from our choices. Thanks to everyone who helped.&nbsp;<\/p>\n\n\n\n<p>Now put your skills to the test: Dive into our game and <a href=\"https:\/\/moreorless.io\/game\/commit-clash\" target=\"_blank\" rel=\"noopener\" title=\"guess which repository has more commits.\">guess which repository has more commits.<\/a><\/p>\n\n\n\n<p>Our highscore was 23, are you able to beat that? \ud83d\ude09<\/p>\n\n\n\n<p>Happy Guessing!<\/p>\n\n\n\n<p>PS: The update allowing user contributions is still in development. We plan to try out this version with a select community and aim to launch it by the end of the year.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>What is more or less? &#8220;More or Less&#8221; is a guessing game where you guess which item has a higher value for a specific attribute. For example, in the &#8220;Commit Clash: Which GitHub repo has more commits?&#8221; mode, you see one GitHub repository&#8217;s commit count and another repository. You have to decide if the repository [&hellip;]<\/p>\n","protected":false},"author":1143,"featured_media":25952,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[1,120,396,649,22],"tags":[84,986,7,536,981,406,202,991,992,149],"ppma_author":[670,984],"class_list":["post-25865","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-allgemein","category-cloud-technologies","category-games","category-interactive-media","category-student-projects","tag-aws","tag-backend","tag-cloud","tag-cloud4dev","tag-firebase","tag-frontend","tag-serverless","tag-software-development-for-cloud-computing","tag-task-based-design","tag-testing"],"aioseo_notices":[],"jetpack_featured_media_url":"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/1_guessing_game.png","jetpack-related-posts":[{"id":25813,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2023\/09\/15\/cost-efficient-server-structure-merging-static-and-dynamic-api\/","url_meta":{"origin":25865,"position":0},"title":"Cost-Efficient Server Structure: Merging Static and Dynamic API","author":"mc071","date":"15. September 2023","format":false,"excerpt":"While developing our guessing game, \"More or Less\", we found a method to significantly reduce traffic on our serverless API, leading to cost savings and an improved content creation experience.\u00a0 The Problem In our game, players can contribute their own game modes, using the web editor.\u00a0 Additionally, we develop game\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"Thumbnail for merging of static and dynamic API structures for optimized server costs and efficient content creation.","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/2_cost_efficient_server_structure_merging_static_and_dynamic_api.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/2_cost_efficient_server_structure_merging_static_and_dynamic_api.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/2_cost_efficient_server_structure_merging_static_and_dynamic_api.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/2_cost_efficient_server_structure_merging_static_and_dynamic_api.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/2_cost_efficient_server_structure_merging_static_and_dynamic_api.png?resize=1050%2C600&ssl=1 3x"},"classes":[]},{"id":25863,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2023\/09\/15\/optimizing-list-views-structuring-data-efficiently-in-firestore\/","url_meta":{"origin":25865,"position":1},"title":"Optimizing List Views: Structuring Data Efficiently in Firestore","author":"js409","date":"15. September 2023","format":false,"excerpt":"While developing our guessing game \"More or Less\", we encountered a common challenge many developers face: determining the structure of our data model. Challenge 1: List vs. Detailed View Many websites show an excerpt of their content in a list view. In our \u201cMore or Less\u201d game, for example, we\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/3_optimizing_list_views_structuring_data_efficiently_in_firestore.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/3_optimizing_list_views_structuring_data_efficiently_in_firestore.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/3_optimizing_list_views_structuring_data_efficiently_in_firestore.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/3_optimizing_list_views_structuring_data_efficiently_in_firestore.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/3_optimizing_list_views_structuring_data_efficiently_in_firestore.png?resize=1050%2C600&ssl=1 3x"},"classes":[]},{"id":1729,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2016\/12\/08\/snakes-exploring-pipelines-a-system-engineering-and-management-project-2\/","url_meta":{"origin":25865,"position":2},"title":"Snakes exploring Pipelines &#8211; A \u201cSystem Engineering and Management\u201d Project","author":"Yann Loic Philippczyk","date":"8. December 2016","format":false,"excerpt":"Part 1: Tool Setup This series of blog entries describes a student project focused on developing an application by using methods like pair programming, test driven development and deployment pipelines. Welcome to the next part our project, on its way to become the Snake game with the very best underlying\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2016\/12\/blue-krait.jpg?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2016\/12\/blue-krait.jpg?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2016\/12\/blue-krait.jpg?resize=525%2C300&ssl=1 1.5x"},"classes":[]},{"id":26610,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2024\/09\/06\/hosthive-a-reservation-management-saas\/","url_meta":{"origin":25865,"position":3},"title":"HostHive &#8211; A Reservation Management SaaS","author":"Aleksandra Gidionova","date":"6. September 2024","format":false,"excerpt":"Introduction Picture this: it's a Friday night, and you and your friends are trying to grab a spot at your favorite hometown bar. But there's a catch \u2014 they don\u2019t have a website, let alone an online reservation system. You're left with two options: anxiously calling and hoping someone picks\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2024\/09\/image-16.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2024\/09\/image-16.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2024\/09\/image-16.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2024\/09\/image-16.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":21683,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2021\/09\/18\/ynstagram-cloud-computing-mit-aws-serverless\/","url_meta":{"origin":25865,"position":4},"title":"Ynstagram &#8211; Cloud Computing mit AWS &amp; Serverless","author":"ns144","date":"18. September 2021","format":false,"excerpt":"Im Rahmen der Vorlesung \u201cSoftware Development for Cloud Computing\u201d haben wir uns hinsichtlich des dortigen Semesterprojektes zum Ziel gesetzt einen einfachen Instagram Klon zu entwerfen um uns die Grundkenntnisse des Cloud Computings anzueignen. Grundkonzeption \/ Ziele des Projektes Da wir bereits einige Erfahrung mit React aufgrund anderer studentischer Projekte sammeln\u2026","rel":"","context":"In &quot;Cloud Technologies&quot;","block_context":{"text":"Cloud Technologies","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/scalable-systems\/cloud-technologies\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/09\/Prasentation_CC_01.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/09\/Prasentation_CC_01.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/09\/Prasentation_CC_01.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/09\/Prasentation_CC_01.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/09\/Prasentation_CC_01.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/09\/Prasentation_CC_01.png?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":2651,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2017\/08\/28\/how-we-integrated-ibm-watson-services-into-a-telegram-chat-bot\/","url_meta":{"origin":25865,"position":5},"title":"How we integrated IBM Watson services into a Telegram chat bot","author":"Adrian Steinert, Oliver Speck, Megan Klaiber","date":"28. August 2017","format":false,"excerpt":"Introduction IBMs artificial intelligence \u2018Watson\u2019 on the IBM Bluemix platform offers a wide range of cognitive services like image and audio analysis among other things. During our semester project in the lecture \u2018Software Development for Cloud Computing\u2019 we integrated useful Watson services into a Telegram chat bot to provide a\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/08\/12-factor.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/08\/12-factor.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/08\/12-factor.png?resize=525%2C300&ssl=1 1.5x"},"classes":[]}],"jetpack_sharing_enabled":true,"authors":[{"term_id":670,"user_id":1143,"is_guest":0,"slug":"michael_cabanis","display_name":"mc071","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/86026021a9dba15aa2e103b3ae5843b86b86a8942835a44889d70fccb60609b2?s=96&d=mm&r=g","0":null,"1":"","2":"","3":"","4":"","5":"","6":"","7":"","8":""},{"term_id":984,"user_id":1166,"is_guest":0,"slug":"jasmin-joy_springer","display_name":"js409","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/1f6b0be7c4d382e4436df225487fc66cd74c3f9b03189343fc7a76e2be638862?s=96&d=mm&r=g","0":null,"1":"","2":"","3":"","4":"","5":"","6":"","7":"","8":""}],"_links":{"self":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/25865","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/users\/1143"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/comments?post=25865"}],"version-history":[{"count":25,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/25865\/revisions"}],"predecessor-version":[{"id":25981,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/25865\/revisions\/25981"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/media\/25952"}],"wp:attachment":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/media?parent=25865"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/categories?post=25865"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/tags?post=25865"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/ppma_author?post=25865"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}