For inboxkitten.com, an opensource disposable email service;\n\n

We migrated our serverless workload from Cloud Functions for Firebase to CloudFlare workers, taking advantage of the lower cost and faster-performing edge computing of Cloudflare network. Made possible due to our extremely low CPU and RAM overhead of our serverless functions.\n\n

If I were to summarize the limitation of Cloudflare (as oppose to firebase/gcp functions), it would be ...\n\n

    \n
  1. <5ms CPU time limit\n
  2. Incompatible with express.js\n
  3. one script limitation per domain\n\n\n

    Limitations our workload is able to conform with (YMMV)\n\n

    For hosting of static files, we migrated from Firebase to CommonsHost\n\n

    More details on the trade-off in between both serverless providers is in the article","rawContent":"For [inboxkitten.com](https://inboxkitten.com), an opensource disposable email service;\n\nWe migrated our serverless workload from @{Cloud Functions for Firebase}|tool:6673| to @{CloudFlare}|tool:15| workers, taking advantage of the lower cost and faster-performing edge computing of Cloudflare network. Made possible due to our extremely low CPU and RAM overhead of our serverless functions.\n\nIf I were to summarize the limitation of Cloudflare (as oppose to firebase/gcp functions), it would be ...\n\n1. <5ms CPU time limit\n2. Incompatible with express.js\n3. one script limitation per domain\n\nLimitations our workload is able to conform with (YMMV)\n\nFor hosting of static files, we migrated from @{Firebase}|tool:116| to [CommonsHost](https://commons.host/)\n\nMore details on the trade-off in between both serverless providers is in [the article](https://dev.to/uilicious/why-we-migrated-serverless-inboxkitten-from-firebase-to-cloudflare-workers-and-commonshost-gd3)\n","publishedAt":"2019-03-27T09:39:18Z","private":false,"sample":false,"commentsCount":0,"upvotesCount":14,"upvoted":false,"flagged":false,"bookmarked":false,"viewCount":600642,"draft":false,"createdAt":"2019-08-15T02:09:44Z","decisionType":"migration","answers({\"first\":2})":{"type":"id","generated":true,"id":"$StackDecision:101821943632695955.answers({\"first\":2})","typename":"StackDecisionConnection"},"subjectTools":[{"type":"id","generated":false,"id":"Tool:101231773404113083","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773461393493","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231776794429029","typename":"Tool"}],"fromTools":[{"type":"id","generated":false,"id":"Tool:101231773461393493","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231776794429029","typename":"Tool"}],"toTools":[{"type":"id","generated":false,"id":"Tool:101231773404113083","typename":"Tool"}],"deleted":false,"link":{"type":"id","generated":true,"id":"$StackDecision:101821943632695955.link","typename":"Link"},"company":{"type":"id","generated":false,"id":"Company:101231722643553047","typename":"Company"},"stack":null,"topics":[],"services":[{"type":"id","generated":false,"id":"Tool:101231776794429029","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773404113083","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773461393493","typename":"Tool"}],"user":{"type":"id","generated":false,"id":"User:101678654966344270","typename":"User"},"rootComments":[],"__typename":"StackDecision"},"$StackDecision:101821943632695955.permissions":{"edit":false,"delete":false,"__typename":"Permissions"},"$StackDecision:101821943632695955.answers({\"first\":2})":{"count":0,"pageInfo":{"type":"id","generated":true,"id":"$StackDecision:101821943632695955.answers({\"first\":2}).pageInfo","typename":"PageInfo"},"edges":[],"__typename":"StackDecisionConnection"},"$StackDecision:101821943632695955.answers({\"first\":2}).pageInfo":{"hasNextPage":false,"endCursor":null,"__typename":"PageInfo"},"Tool:101231773404113083":{"id":"101231773404113083","name":"CloudFlare","slug":"cloudflare","title":"The Web Performance & Security Company.","verified":true,"imageUrl":"https://img.stackshare.io/service/15/twitter-profile-400x400.png","canonicalUrl":"/cloudflare","path":"/cloudflare","votes":1778,"fans":27947,"stacks":77096,"followingTool":false,"followContext":null,"__typename":"Tool"},"Tool:101231773461393493":{"id":"101231773461393493","name":"Firebase","slug":"firebase","title":"The Realtime App Platform","verified":true,"imageUrl":"https://img.stackshare.io/service/116/cZLxNFZS.jpg","canonicalUrl":"/firebase","path":"/firebase","votes":1967,"fans":41879,"stacks":41517,"followingTool":false,"followContext":null,"__typename":"Tool","following":false,"category":{"type":"id","generated":true,"id":"$Tool:101231773461393493.category","typename":"Category"},"layer":{"type":"id","generated":true,"id":"$Tool:101231773461393493.layer","typename":"Layer"},"function":{"type":"id","generated":true,"id":"$Tool:101231773461393493.function","typename":"Function"}},"Tool:101231776794429029":{"id":"101231776794429029","name":"Cloud Functions for Firebase","slug":"cloud-functions-for-firebase","title":"Run your mobile backend code without managing servers","verified":true,"imageUrl":"https://img.stackshare.io/service/6673/cZLxNFZS.jpg","canonicalUrl":"/cloud-functions-for-firebase","path":"/cloud-functions-for-firebase","votes":6,"fans":520,"stacks":475,"followingTool":false,"followContext":null,"__typename":"Tool"},"$StackDecision:101821943632695955.link":{"url":"https://dev.to/uilicious/why-we-migrated-serverless-inboxkitten-from-firebase-to-cloudflare-workers-and-commonshost-gd3","title":"Why we migrated opensource 😼inboxkitten (77 million serverless request) from 🔥Firebase to ☁️Cloudflare workers & 🐑CommonsHost - DEV Community 👩‍💻👨‍💻","imageUrl":"https://practicaldev-herokuapp-com.freetls.fastly.net/assets/android-icon-192x192-0409854849dca4043b26f85039b8c3d42cbac2bd8793fec1004eb389fa153877.png","__typename":"Link"},"Company:101231722643553047":{"id":"101231722643553047","path":"/companies/ui-licious","imageUrl":"https://img.stackshare.io/company/28674/default_f389dd772fbd5809e1b8df40f5e8e9873d63d3ca.png","name":"UI licious","slug":"ui-licious","features":[],"__typename":"Company"},"User:101678654966344270":{"id":"101678654966344270","username":"PicoCreator","path":"/PicoCreator","imageUrl":"https://img.stackshare.io/user/285587/default_11bc85fc38cd68f66d55498dc1ba210d93be01d7.jpeg","displayName":"Eugene Cheah","title":"CTO","companyName":"Uilicious","__typename":"User"},"$ROOT_QUERY.tool({\"id\":\"firebase\"}).stackDecisions({\"after\":\"\",\"first\":10}).edges.0":{"node":{"type":"id","generated":false,"id":"StackDecision:101821943632695955","typename":"StackDecision"},"__typename":"StackDecisionEdge"},"StackDecision:104331856541518887":{"id":"104331856541518887","showAutoGeneratedTag":false,"permissions":{"type":"id","generated":true,"id":"$StackDecision:104331856541518887.permissions","typename":"Permissions"},"publicId":"104331856541518887","htmlContent":"

    This time I want to share something different. For those that have read my stack decisions, it's normal to expect some advice on infrastructure or React Native. Lately my mind has been focusing more on product as a experience than what's it made of (anatomy). As a tech leader, I have to worry about things like: are we taking enough time for reviews? Are we improving over time? Are we faster now? Is our code of higher quality?\n\n

    For all these questions you can add many great recommendations on your pipeline. We use Trello for bug-tracking and project management. We use https://danger.systems/js/ to add checks for linting, type-enforcing and other quality dimensions in our PRs and a great feature from Vercel that let's you previsualize deployments directly in a PR. However it's not easy to measure this improvements over time. For customer matters we have Amplitude or Firebase analytics, but for our internal process? That's a little bit more complicated.\n\n

    I collaborated recently with some folks in a small startup as an early adopter to create a metrics dashboard for engineers. I tried to add the tool to stackshare.io but still it doesn't appear as one of the options, please take a look on it over product hunt and let us know https://www.producthunt.com/posts/scope-6","rawContent":"This time I want to share something different. For those that have read my stack decisions, it's normal to expect some advice on infrastructure or @{React Native}|tool:2699|. Lately my mind has been focusing more on product as a experience than what's it made of (anatomy). As a tech leader, I have to worry about things like: are we taking enough time for reviews? Are we improving over time? Are we faster now? Is our code of higher quality?\n\nFor all these questions you can add many great recommendations on your pipeline. We use @{Trello}|tool:109| for bug-tracking and project management. We use https://danger.systems/js/ to add checks for linting, type-enforcing and other quality dimensions in our PRs and a great feature from @{Vercel}|tool:7618| that let's you previsualize deployments directly in a PR. However it's not easy to measure this improvements over time. For customer matters we have @{Amplitude}|tool:640| or @{Firebase}|tool:116| analytics, but for our internal process? That's a little bit more complicated.\n\nI collaborated recently with some folks in a small startup as an early adopter to create a metrics dashboard for engineers. I tried to add the tool to stackshare.io but still it doesn't appear as one of the options, please take a look on it over product hunt and let us know https://www.producthunt.com/posts/scope-6","publishedAt":"2020-06-12T16:03:10Z","private":false,"sample":false,"commentsCount":0,"upvotesCount":15,"upvoted":false,"flagged":false,"bookmarked":false,"viewCount":478981,"draft":false,"createdAt":"2020-06-12T16:03:11Z","decisionType":"freeform","answers({\"first\":2})":{"type":"id","generated":true,"id":"$StackDecision:104331856541518887.answers({\"first\":2})","typename":"StackDecisionConnection"},"subjectTools":[],"fromTools":[],"toTools":[],"deleted":false,"link":{"type":"id","generated":true,"id":"$StackDecision:104331856541518887.link","typename":"Link"},"company":{"type":"id","generated":false,"id":"Company:101231717552328078","typename":"Company"},"stack":{"type":"id","generated":false,"id":"Stack:101231799743038856","typename":"Stack"},"topics":[],"services":[{"type":"id","generated":false,"id":"Tool:101231773461393493","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773692729304","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231777233002910","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773457672502","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231774544144572","typename":"Tool"}],"user":{"type":"id","generated":false,"id":"User:101232031860244544","typename":"User"},"rootComments":[],"__typename":"StackDecision"},"$StackDecision:104331856541518887.permissions":{"edit":false,"delete":false,"__typename":"Permissions"},"$StackDecision:104331856541518887.answers({\"first\":2})":{"count":0,"pageInfo":{"type":"id","generated":true,"id":"$StackDecision:104331856541518887.answers({\"first\":2}).pageInfo","typename":"PageInfo"},"edges":[],"__typename":"StackDecisionConnection"},"$StackDecision:104331856541518887.answers({\"first\":2}).pageInfo":{"hasNextPage":false,"endCursor":null,"__typename":"PageInfo"},"$StackDecision:104331856541518887.link":{"url":"https://www.producthunt.com/posts/scope-6","title":"Scope - Software Engineering Metrics for Engineers and Team Leaders | Product Hunt","imageUrl":"","__typename":"Link"},"Company:101231717552328078":{"id":"101231717552328078","path":"/companies/netbeast","imageUrl":"https://img.stackshare.io/company/16436/default_bc41e940174a90be9ec8786fc9c77f2f71d9d6f5.png","name":"Netbeast","slug":"netbeast","features":[],"__typename":"Company"},"Stack:101231799743038856":{"id":"101231799743038856","imageUrl":"https://img.stackshare.io/stack/47142/default_d54684d0ae16468771664f250005db65c1336c1b.png","name":"Yeti","identifier":"netbeast/yeti","path":"/netbeast/yeti","private":false,"owner":{"type":"id","generated":false,"id":"Company:101231717552328078","typename":"Company"},"__typename":"Stack"},"Tool:101231773692729304":{"id":"101231773692729304","name":"Amplitude","slug":"amplitude","title":"User analytics to fuel explosive user growth","verified":true,"imageUrl":"https://img.stackshare.io/service/640/default_51e537c5ed098d3e9aba0eb94299e4575a556aec.jpg","canonicalUrl":"/amplitude","path":"/amplitude","votes":36,"fans":836,"stacks":897,"followingTool":false,"followContext":null,"__typename":"Tool"},"Tool:101231777233002910":{"id":"101231777233002910","name":"Vercel","slug":"vercel","title":"It makes serverless application deployment easy","verified":false,"imageUrl":"https://img.stackshare.io/service/7618/bHjpwZem_400x400.png","canonicalUrl":"/vercel","path":"/vercel","votes":86,"fans":1447,"stacks":1506,"followingTool":false,"followContext":null,"__typename":"Tool"},"Tool:101231773457672502":{"id":"101231773457672502","name":"Trello","slug":"trello","title":"Your entire project, in a single glance","verified":false,"imageUrl":"https://img.stackshare.io/service/109/-CvHThPk_400x400.jpg","canonicalUrl":"/trello","path":"/trello","votes":3707,"fans":41434,"stacks":43402,"followingTool":false,"followContext":null,"__typename":"Tool"},"Tool:101231774544144572":{"id":"101231774544144572","name":"React Native","slug":"react-native","title":"A framework for building native apps with React","verified":false,"imageUrl":"https://img.stackshare.io/service/2699/KoK6gHzp.jpg","canonicalUrl":"/react-native","path":"/react-native","votes":1156,"fans":34689,"stacks":33963,"followingTool":false,"followContext":null,"__typename":"Tool"},"User:101232031860244544":{"id":"101232031860244544","username":"jsdario","path":"/jsdario","imageUrl":"https://img.stackshare.io/user/86193/default_bf44ae217017c44ff06ece2fabd5d17de25416b7.jpg","displayName":"Jesus Dario Rivera Rubio","title":"Telecomm Engineering","companyName":"Netbeast","__typename":"User"},"$ROOT_QUERY.tool({\"id\":\"firebase\"}).stackDecisions({\"after\":\"\",\"first\":10}).edges.1":{"node":{"type":"id","generated":false,"id":"StackDecision:104331856541518887","typename":"StackDecision"},"__typename":"StackDecisionEdge"},"StackDecision:105161993903708297":{"id":"105161993903708297","showAutoGeneratedTag":false,"permissions":{"type":"id","generated":true,"id":"$StackDecision:105161993903708297.permissions","typename":"Permissions"},"publicId":"105161993903708297","htmlContent":"

    Hi, we are looking to create a sports app that collects and displays player stats. It will include team chats with push notifications for upcoming games etc. We are thinking of using the standard MERN stack route with a GraphQL API or a real-time Firebase database. Any advice would be greatly appreciated.","rawContent":"Hi, we are looking to create a sports app that collects and displays player stats. It will include team chats with push notifications for upcoming games etc. We are thinking of using the standard MERN stack route with a @{GraphQL}|tool:3820| API or a real-time @{Firebase}|tool:116| database. Any advice would be greatly appreciated.","publishedAt":"2020-11-06T06:38:02Z","private":false,"sample":false,"commentsCount":0,"upvotesCount":6,"upvoted":false,"flagged":false,"bookmarked":false,"viewCount":2146206,"draft":false,"createdAt":"2020-11-06T06:38:02Z","decisionType":"getAdvice","answers({\"first\":2})":{"type":"id","generated":true,"id":"$StackDecision:105161993903708297.answers({\"first\":2})","typename":"StackDecisionConnection"},"subjectTools":[{"type":"id","generated":false,"id":"Tool:101231773461393493","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231775212866992","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773845103618","typename":"Tool"}],"fromTools":[],"toTools":[],"deleted":false,"link":null,"company":null,"stack":null,"topics":[],"services":[{"type":"id","generated":false,"id":"Tool:101231773461393493","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231775212866992","typename":"Tool"}],"user":{"type":"id","generated":false,"id":"User:105161931373123661","typename":"User"},"rootComments":[],"__typename":"StackDecision"},"$StackDecision:105161993903708297.permissions":{"edit":false,"delete":false,"__typename":"Permissions"},"$StackDecision:105161993903708297.answers({\"first\":2})":{"count":3,"pageInfo":{"type":"id","generated":true,"id":"$StackDecision:105161993903708297.answers({\"first\":2}).pageInfo","typename":"PageInfo"},"edges":[{"type":"id","generated":true,"id":"$StackDecision:105161993903708297.answers({\"first\":2}).edges.0","typename":"StackDecisionEdge"},{"type":"id","generated":true,"id":"$StackDecision:105161993903708297.answers({\"first\":2}).edges.1","typename":"StackDecisionEdge"}],"__typename":"StackDecisionConnection"},"$StackDecision:105161993903708297.answers({\"first\":2}).pageInfo":{"hasNextPage":true,"endCursor":"Mg","__typename":"PageInfo"},"StackDecision:105200371156008201":{"id":"105200371156008201","publicId":"105200371156008201","htmlContent":"

    hi it looks like an interesting app, I have been working on apps with mern stack but recently I came across hasura and it was a total game-changer, it fast forward most of my developing process on the backend, here is a sample code to manage notifications, you can twist it a bit to work in an app https://hasura.io/docs/1.0/graphql/core/event-triggers/samples.html#push-notifications","rawContent":"hi it looks like an interesting app, I have been working on apps with mern stack but recently I came across hasura and it was a total game-changer, it fast forward most of my developing process on the backend, here is a sample code to manage notifications, you can twist it a bit to work in an app https://hasura.io/docs/1.0/graphql/core/event-triggers/samples.html#push-notifications","publishedAt":"2020-11-13T01:17:52Z","commentsCount":0,"private":false,"upvotesCount":4,"upvoted":false,"flagged":false,"bookmarked":false,"viewCount":6952,"draft":false,"createdAt":"2020-11-13T01:17:52Z","decisionType":"giveAdvice","showAutoGeneratedTag":false,"permissions":{"type":"id","generated":true,"id":"$StackDecision:105200371156008201.permissions","typename":"Permissions"},"subjectTools":[{"type":"id","generated":false,"id":"Tool:101231776741020731","typename":"Tool"}],"fromTools":[],"toTools":[],"deleted":false,"link":null,"company":null,"topics":[],"stack":null,"services":[],"user":{"type":"id","generated":false,"id":"User:103842039638128227","typename":"User"},"rootComments":[],"__typename":"StackDecision"},"$StackDecision:105200371156008201.permissions":{"edit":false,"delete":false,"__typename":"Permissions"},"Tool:101231776741020731":{"id":"101231776741020731","name":"Hasura","slug":"hasura","title":"An open source GraphQL engine that deploys instant, realtime GraphQL APIs on any Postgres database.","verified":true,"imageUrl":"https://img.stackshare.io/service/6590/default_c7e859a8bb0f760439df4171d4439c5ef861dc66.png","canonicalUrl":"/hasura","path":"/hasura","votes":144,"fans":720,"stacks":338,"followingTool":false,"followContext":null,"__typename":"Tool"},"User:103842039638128227":{"id":"103842039638128227","username":"avila91jose6664","path":"/avila91jose6664","imageUrl":"https://img.stackshare.io/user/447670/default_9518a2910f6e126118ff18adae9fedfc6a0e3a93.gif","displayName":"Jose Avila","title":"","companyName":"","__typename":"User"},"$StackDecision:105161993903708297.answers({\"first\":2}).edges.0":{"node":{"type":"id","generated":false,"id":"StackDecision:105200371156008201","typename":"StackDecision"},"__typename":"StackDecisionEdge"},"StackDecision:105243191274447272":{"id":"105243191274447272","publicId":"105243191274447272","htmlContent":"

    Firebase won’t provide GraphQL (out of the box) but is great for creating real-time apps. I’ve done this using Vue/Quasar framework (Quasar.dev) and Vuex with Vuefire or Vuexfire and their Firestore database. Deployment is easy as even with multiple project instances for Development/Staging/Production. Their RTDB or Firestore databases will be great for Chat apps. Push notifications are also supported. Free tier is large and serverless functions remove the need to manage servers and generally cheaper if you’re not using them 24/7. Local emulators with debugging support will speed up your coding. Firebase UI will handle most of your sign in UI. Firestore security rules allow you to move some business logic to the client side app and thus support offline and faster real-time updates as they occur client side first. Downside of Firestone is its query language is quite limited so you may also want to combine it with Google’s BigQuery to support complex SQL and reporting. Knowing what you need to query will be a deciding factor in choosing between Firebase and a GraphQL solution. There’s a BigQuery extension for Firebase to get you started. You can also use it with Google Data Studio.\n\n

    If you want/need GraphQL, I’d recommend having a look at AWS Amplify. I’ve not yet used it but looks like a reasonable alternative to Firebase though pricing is likely to be a bit higher and will likely have a steeper learning curve depending on past AWS experience.","rawContent":"Firebase won’t provide GraphQL (out of the box) but is great for creating real-time apps. I’ve done this using Vue/Quasar framework (Quasar.dev) and Vuex with Vuefire or Vuexfire and their Firestore database. Deployment is easy as even with multiple project instances for Development/Staging/Production. Their RTDB or Firestore databases will be great for Chat apps. Push notifications are also supported. Free tier is large and serverless functions remove the need to manage servers and generally cheaper if you’re not using them 24/7. Local emulators with debugging support will speed up your coding. Firebase UI will handle most of your sign in UI. Firestore security rules allow you to move some business logic to the client side app and thus support offline and faster real-time updates as they occur client side first. Downside of Firestone is its query language is quite limited so you may also want to combine it with Google’s BigQuery to support complex SQL and reporting. Knowing what you need to query will be a deciding factor in choosing between Firebase and a GraphQL solution. There’s a BigQuery extension for Firebase to get you started. You can also use it with Google Data Studio.\n\nIf you want/need GraphQL, I’d recommend having a look at AWS Amplify. I’ve not yet used it but looks like a reasonable alternative to Firebase though pricing is likely to be a bit higher and will likely have a steeper learning curve depending on past AWS experience.","publishedAt":"2020-11-20T14:47:35Z","commentsCount":0,"private":false,"upvotesCount":1,"upvoted":false,"flagged":false,"bookmarked":false,"viewCount":2250,"draft":false,"createdAt":"2020-11-20T14:47:35Z","decisionType":"giveAdvice","showAutoGeneratedTag":false,"permissions":{"type":"id","generated":true,"id":"$StackDecision:105243191274447272.permissions","typename":"Permissions"},"subjectTools":[],"fromTools":[],"toTools":[],"deleted":false,"link":null,"company":null,"topics":[],"stack":null,"services":[],"user":{"type":"id","generated":false,"id":"User:103580561810414186","typename":"User"},"rootComments":[],"__typename":"StackDecision"},"$StackDecision:105243191274447272.permissions":{"edit":false,"delete":false,"__typename":"Permissions"},"User:103580561810414186":{"id":"103580561810414186","username":"tonyohagan8277","path":"/tonyohagan8277","imageUrl":"https://img.stackshare.io/user/369341/default_d76a55f24f1be848a0e158a405c4e1a6783c76aa.png","displayName":"Tony OHagan","title":"Senior Software Engineer ","companyName":"DCS Group ","__typename":"User"},"$StackDecision:105161993903708297.answers({\"first\":2}).edges.1":{"node":{"type":"id","generated":false,"id":"StackDecision:105243191274447272","typename":"StackDecision"},"__typename":"StackDecisionEdge"},"Tool:101231775212866992":{"id":"101231775212866992","name":"GraphQL","slug":"graphql","title":"A data query language and runtime","verified":false,"imageUrl":"https://img.stackshare.io/service/3820/12972006.png","canonicalUrl":"/graphql","path":"/graphql","votes":309,"fans":33708,"stacks":34079,"followingTool":false,"followContext":null,"__typename":"Tool"},"Tool:101231773845103618":{"id":"101231773845103618","name":"Node.js","slug":"nodejs","title":"A platform built on Chrome's JavaScript runtime for easily building fast, scalable network applications","verified":false,"imageUrl":"https://img.stackshare.io/service/1011/n1JRsFeB_400x400.png","canonicalUrl":"/nodejs","path":"/nodejs","votes":8543,"fans":184937,"stacks":190740,"followingTool":false,"followContext":null,"__typename":"Tool","following":false},"User:105161931373123661":{"id":"105161931373123661","username":"RandyMoss","path":"/RandyMoss","imageUrl":"https://img.stackshare.io/user/786921/default_32de6d75242ae80dfd9a09eb2e4c2ce816d62f1b.jpg","displayName":"Randy Moss","title":null,"companyName":null,"__typename":"User"},"$ROOT_QUERY.tool({\"id\":\"firebase\"}).stackDecisions({\"after\":\"\",\"first\":10}).edges.2":{"node":{"type":"id","generated":false,"id":"StackDecision:105161993903708297","typename":"StackDecision"},"__typename":"StackDecisionEdge"},"StackDecision:104508278987278100":{"id":"104508278987278100","showAutoGeneratedTag":false,"permissions":{"type":"id","generated":true,"id":"$StackDecision:104508278987278100.permissions","typename":"Permissions"},"publicId":"104508278987278100","htmlContent":"

    Hi all,\n\n

    I need advice for object-oriented data analysis. I have exported a collection of users from Firebase to JSON, and I want to analyze it, for example, how many users are females, males, etc. Are there any tools or packages that could help me quickly analyze this data?","rawContent":"Hi all,\n\nI need advice for object-oriented data analysis. I have exported a collection of users from @{Firebase}|tool:116| to @{JSON}|tool:2880|, and I want to analyze it, for example, how many users are females, males, etc. Are there any tools or packages that could help me quickly analyze this data?","publishedAt":"2020-07-13T19:49:44Z","private":false,"sample":false,"commentsCount":0,"upvotesCount":2,"upvoted":false,"flagged":false,"bookmarked":false,"viewCount":199331,"draft":false,"createdAt":"2020-07-13T19:49:44Z","decisionType":"getAdvice","answers({\"first\":2})":{"type":"id","generated":true,"id":"$StackDecision:104508278987278100.answers({\"first\":2})","typename":"StackDecisionConnection"},"subjectTools":[{"type":"id","generated":false,"id":"Tool:101231773461393493","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773939333405","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773845103618","typename":"Tool"}],"fromTools":[],"toTools":[],"deleted":false,"link":null,"company":null,"stack":null,"topics":[],"services":[{"type":"id","generated":false,"id":"Tool:101231774641851090","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773461393493","typename":"Tool"}],"user":{"type":"id","generated":false,"id":"User:101946391012365558","typename":"User"},"rootComments":[],"__typename":"StackDecision"},"$StackDecision:104508278987278100.permissions":{"edit":false,"delete":false,"__typename":"Permissions"},"$StackDecision:104508278987278100.answers({\"first\":2})":{"count":3,"pageInfo":{"type":"id","generated":true,"id":"$StackDecision:104508278987278100.answers({\"first\":2}).pageInfo","typename":"PageInfo"},"edges":[{"type":"id","generated":true,"id":"$StackDecision:104508278987278100.answers({\"first\":2}).edges.0","typename":"StackDecisionEdge"},{"type":"id","generated":true,"id":"$StackDecision:104508278987278100.answers({\"first\":2}).edges.1","typename":"StackDecisionEdge"}],"__typename":"StackDecisionConnection"},"$StackDecision:104508278987278100.answers({\"first\":2}).pageInfo":{"hasNextPage":true,"endCursor":"Mg","__typename":"PageInfo"},"StackDecision:104522806392058591":{"id":"104522806392058591","publicId":"104522806392058591","htmlContent":"

    Excel would be a go to choice. You can do all sort (mostly) of analysis on data easily. (unless you've nested array). Apply pivots, infer tables, generate graphs.\n\n

    If the data size is huge, you can also try MySQL and do queries in traditional manner.","rawContent":"Excel would be a go to choice. You can do all sort (mostly) of analysis on data easily. (unless you've nested array). Apply pivots, infer tables, generate graphs.\n\nIf the data size is huge, you can also try MySQL and do queries in traditional manner.","publishedAt":"2020-07-16T09:24:14Z","commentsCount":0,"private":false,"upvotesCount":1,"upvoted":false,"flagged":false,"bookmarked":false,"viewCount":1446,"draft":false,"createdAt":"2020-07-16T09:24:14Z","decisionType":"giveAdvice","showAutoGeneratedTag":false,"permissions":{"type":"id","generated":true,"id":"$StackDecision:104522806392058591.permissions","typename":"Permissions"},"subjectTools":[{"type":"id","generated":false,"id":"Tool:101231776030042860","typename":"Tool"}],"fromTools":[],"toTools":[],"deleted":false,"link":null,"company":null,"topics":[],"stack":null,"services":[],"user":{"type":"id","generated":false,"id":"User:101232036354222058","typename":"User"},"rootComments":[],"__typename":"StackDecision"},"$StackDecision:104522806392058591.permissions":{"edit":false,"delete":false,"__typename":"Permissions"},"Tool:101231776030042860":{"id":"101231776030042860","name":"Microsoft Excel","slug":"microsoft-excel","title":"A spreadsheet program included in the Microsoft Office suite of applications","verified":true,"imageUrl":"https://img.stackshare.io/service/5279/RZPZ1KYT_400x400.png","canonicalUrl":"/microsoft-excel","path":"/microsoft-excel","votes":0,"fans":726,"stacks":700,"followingTool":false,"followContext":null,"__typename":"Tool"},"User:101232036354222058":{"id":"101232036354222058","username":"ashwani_0x","path":"/ashwani_0x","imageUrl":"https://img.stackshare.io/user/94703/default_149b94ef3c3c79298dcd3acfd4f1c72d81fd4653.png","displayName":"Ashwani Agarwal","title":"Software Engineer III","companyName":"Airtel Payments Bank","__typename":"User"},"$StackDecision:104508278987278100.answers({\"first\":2}).edges.0":{"node":{"type":"id","generated":false,"id":"StackDecision:104522806392058591","typename":"StackDecision"},"__typename":"StackDecisionEdge"},"StackDecision:104524276900335742":{"id":"104524276900335742","publicId":"104524276900335742","htmlContent":"

    You could check out MongoDB Atlas Data lake: https://www.mongodb.com/blog/post/mongodb-atlas-data-lake-now-generally-available\n\n

    It can allow you to upload the json file into Atlas and then you can run queries on it using the MongoDB Query Language. ","rawContent":"You could check out MongoDB Atlas Data lake: https://www.mongodb.com/blog/post/mongodb-atlas-data-lake-now-generally-available\n\nIt can allow you to upload the json file into Atlas and then you can run queries on it using the MongoDB Query Language. \n","publishedAt":"2020-07-16T15:38:13Z","commentsCount":0,"private":false,"upvotesCount":1,"upvoted":false,"flagged":false,"bookmarked":false,"viewCount":1858,"draft":false,"createdAt":"2020-07-16T15:38:13Z","decisionType":"giveAdvice","showAutoGeneratedTag":false,"permissions":{"type":"id","generated":true,"id":"$StackDecision:104524276900335742.permissions","typename":"Permissions"},"subjectTools":[{"type":"id","generated":false,"id":"Tool:101231776297440807","typename":"Tool"}],"fromTools":[],"toTools":[],"deleted":false,"link":null,"company":null,"topics":[],"stack":null,"services":[],"user":{"type":"id","generated":false,"id":"User:103792742266785421","typename":"User"},"rootComments":[],"__typename":"StackDecision"},"$StackDecision:104524276900335742.permissions":{"edit":false,"delete":false,"__typename":"Permissions"},"Tool:101231776297440807":{"id":"101231776297440807","name":"MongoDB Atlas","slug":"mongodb-atlas","title":"Deploy and scale a MongoDB cluster in the cloud with just a few clicks","verified":true,"imageUrl":"https://img.stackshare.io/service/5739/atlas-360x360.png","canonicalUrl":"/mongodb-atlas","path":"/mongodb-atlas","votes":34,"fans":1158,"stacks":853,"followingTool":false,"followContext":null,"__typename":"Tool"},"User:103792742266785421":{"id":"103792742266785421","username":"johnadamsy","path":"/johnadamsy","imageUrl":"https://img.stackshare.io/user/429949/default_b1666f7edfdd9bc601b44a5d272a89bb6baa7817.jpeg","displayName":"Opiyo Adamsy","title":"Server Idler","companyName":null,"__typename":"User"},"$StackDecision:104508278987278100.answers({\"first\":2}).edges.1":{"node":{"type":"id","generated":false,"id":"StackDecision:104524276900335742","typename":"StackDecision"},"__typename":"StackDecisionEdge"},"Tool:101231773939333405":{"id":"101231773939333405","name":"JavaScript","slug":"javascript","title":"Lightweight, interpreted, object-oriented language with first-class functions","verified":false,"imageUrl":"https://img.stackshare.io/service/1209/javascript.jpeg","canonicalUrl":"/javascript","path":"/javascript","votes":8073,"fans":317151,"stacks":365723,"followingTool":false,"followContext":null,"__typename":"Tool","following":false},"Tool:101231774641851090":{"id":"101231774641851090","name":"JSON","slug":"json","title":"A lightweight data-interchange format","verified":false,"imageUrl":"https://img.stackshare.io/service/2880/1024px-JSON_vector_logo.svg.png","canonicalUrl":"/json","path":"/json","votes":9,"fans":2320,"stacks":1960,"followingTool":false,"followContext":null,"__typename":"Tool"},"User:101946391012365558":{"id":"101946391012365558","username":"lukasvarkalis","path":"/lukasvarkalis","imageUrl":"https://img.stackshare.io/user/291832/default_f97f7fda1c93e900db32a38de02141f8649e5576.jpeg","displayName":"Lukas Varkalis","title":"Software Engineer","companyName":"","__typename":"User"},"$ROOT_QUERY.tool({\"id\":\"firebase\"}).stackDecisions({\"after\":\"\",\"first\":10}).edges.3":{"node":{"type":"id","generated":false,"id":"StackDecision:104508278987278100","typename":"StackDecision"},"__typename":"StackDecisionEdge"},"StackDecision:104586416281735036":{"id":"104586416281735036","showAutoGeneratedTag":false,"permissions":{"type":"id","generated":true,"id":"$StackDecision:104586416281735036.permissions","typename":"Permissions"},"publicId":"104586416281735036","htmlContent":"

    I am setting up a content management system (CMS) in Laravel using #GoogleCloudPlatform. This #CMS will have quite a few polymorphic many-to-many relationships (at least 10) and for that reason I am considering whether I should use Firebase or other #NoSQL databases with Laravel.\n\n

    I know that there is a laravel-firebase package by Kreait which should allow me to use the firebase as database. My question is therefore:\n\n

      \n
    1. Are there any drawbacks to using Firebase with Laravel, which I should be aware of?\n
    2. Can I possibly use a hybrid model where some data is stored in the SQL database (e.g. user data) while other is stored in Firebase (e.g. the content).\n
    3. Or should I just stick to MySQL and create the several polymorphic many-to-many relationships?\n
    4. Should I do both and see what works better?\n\n\n

      Any advice is appreciated.","rawContent":"I am setting up a content management system (CMS) in Laravel using @{#GoogleCloudPlatform}|topic:636|. This @{#CMS}|topic:933| will have quite a few polymorphic many-to-many relationships (at least 10) and for that reason I am considering whether I should use @{Firebase}|tool:116| or other @{#NoSQL}|topic:1679| databases with Laravel.\n\nI know that there is a laravel-firebase package by Kreait which should allow me to use the firebase as database. My question is therefore:\n\n1. Are there any drawbacks to using Firebase with @{Laravel}|tool:992|, which I should be aware of?\n2. Can I possibly use a hybrid model where some data is stored in the SQL database (e.g. user data) while other is stored in Firebase (e.g. the content).\n3. Or should I just stick to @{MySQL}|tool:1025| and create the several polymorphic many-to-many relationships?\n4. Should I do both and see what works better?\n\nAny advice is appreciated.","publishedAt":"2020-07-27T15:01:04Z","private":false,"sample":false,"commentsCount":0,"upvotesCount":6,"upvoted":false,"flagged":false,"bookmarked":false,"viewCount":194882,"draft":false,"createdAt":"2020-07-27T15:01:04Z","decisionType":"getAdvice","answers({\"first\":2})":{"type":"id","generated":true,"id":"$StackDecision:104586416281735036.answers({\"first\":2})","typename":"StackDecisionConnection"},"subjectTools":[{"type":"id","generated":false,"id":"Tool:101231777274352317","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773836807964","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773851859414","typename":"Tool"}],"fromTools":[],"toTools":[],"deleted":false,"link":null,"company":null,"stack":null,"topics":[{"type":"id","generated":true,"id":"StackDecision:104586416281735036.topics.0","typename":"Topic"},{"type":"id","generated":true,"id":"StackDecision:104586416281735036.topics.1","typename":"Topic"},{"type":"id","generated":true,"id":"StackDecision:104586416281735036.topics.2","typename":"Topic"}],"services":[{"type":"id","generated":false,"id":"Tool:101231773851859414","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773836807964","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773461393493","typename":"Tool"}],"user":{"type":"id","generated":false,"id":"User:104541388931529911","typename":"User"},"rootComments":[],"__typename":"StackDecision"},"$StackDecision:104586416281735036.permissions":{"edit":false,"delete":false,"__typename":"Permissions"},"$StackDecision:104586416281735036.answers({\"first\":2})":{"count":0,"pageInfo":{"type":"id","generated":true,"id":"$StackDecision:104586416281735036.answers({\"first\":2}).pageInfo","typename":"PageInfo"},"edges":[],"__typename":"StackDecisionConnection"},"$StackDecision:104586416281735036.answers({\"first\":2}).pageInfo":{"hasNextPage":false,"endCursor":null,"__typename":"PageInfo"},"Tool:101231777274352317":{"id":"101231777274352317","name":"Cloud Firestore","slug":"google-cloud-firestore","title":"NoSQL database built for global apps","verified":true,"imageUrl":"https://img.stackshare.io/service/7696/Untitled-5.png","canonicalUrl":"/google-cloud-firestore","path":"/google-cloud-firestore","votes":111,"fans":1109,"stacks":729,"followingTool":false,"followContext":null,"__typename":"Tool"},"Tool:101231773836807964":{"id":"101231773836807964","name":"Laravel","slug":"laravel","title":"A PHP Framework For Web Artisans","verified":false,"imageUrl":"https://img.stackshare.io/service/992/AcA2LnWL_400x400.jpg","canonicalUrl":"/laravel","path":"/laravel","votes":3869,"fans":27493,"stacks":28332,"followingTool":false,"followContext":null,"__typename":"Tool"},"Tool:101231773851859414":{"id":"101231773851859414","name":"MySQL","slug":"mysql","title":"The world's most popular open source database","verified":false,"imageUrl":"https://img.stackshare.io/service/1025/logo-mysql-170x170.png","canonicalUrl":"/mysql","path":"/mysql","votes":3753,"fans":123932,"stacks":126754,"followingTool":false,"followContext":null,"__typename":"Tool","following":false},"StackDecision:104586416281735036.topics.0":{"name":"NoSQL","__typename":"Topic"},"StackDecision:104586416281735036.topics.1":{"name":"CMS","__typename":"Topic"},"StackDecision:104586416281735036.topics.2":{"name":"GoogleCloudPlatform","__typename":"Topic"},"User:104541388931529911":{"id":"104541388931529911","username":"Coola","path":"/Coola","imageUrl":"https://img.stackshare.io/user/669438/default_a9982031d013d93b605b7f99ea8bca321fa29c6f.jpg","displayName":"A M","title":"","companyName":"","__typename":"User"},"$ROOT_QUERY.tool({\"id\":\"firebase\"}).stackDecisions({\"after\":\"\",\"first\":10}).edges.4":{"node":{"type":"id","generated":false,"id":"StackDecision:104586416281735036","typename":"StackDecision"},"__typename":"StackDecisionEdge"},"StackDecision:104529557357459047":{"id":"104529557357459047","showAutoGeneratedTag":false,"permissions":{"type":"id","generated":true,"id":"$StackDecision:104529557357459047.permissions","typename":"Permissions"},"publicId":"104529557357459047","htmlContent":"

      Hi,\n\n

      I am in the process of building a mobile application and releasing it to the AppStore.\nCurrently, we're in a TestFlight Beta with ~ 1500 users with a front-end only native iOS app.\nBefore releasing it to production, we would like to add the following functionalities:\n\n

        \n
      1. User email authentication\n

      2. Being able to store and synchronise individual user's data ( generated while interacting with the app each day -> \"user session\" ) between various devices\n

      3. Having user session data ( anonymized ) available for an admin via a visual interface for querying, generating insights\n

      4. Simple crud interface for remote configs\n

      5. a/b testing\n

      6. GDPR requirements ( e.g. workflows for removing or exporting user data, ideally a way to keep the anonymized data too ) \n

      7. Integration with 3rd party services like Mailchimp or Mixpanel ( which we already use, data is sent directly from the app )\n\n\n

        Would appreciate any help with finding the right solution for this case given:\n\n

          \n
        1. Costs (we don't expect large media files storage)\n

        2. Flexibility to add new features related to the backend in the future\n

        3. Infra setup and maintenance \n\n\n

          What I've been thinking so far was one of: 1. BaaS AWS/Firebase 2. Custom backend with PostgreSQL 3. PaaS of a Realm type (mobile app already uses Realm for local persistence) \n\n

          Thanks!","rawContent":"Hi,\n\nI am in the process of building a mobile application and releasing it to the AppStore.\nCurrently, we're in a TestFlight Beta with ~ 1500 users with a front-end only native iOS app.\nBefore releasing it to production, we would like to add the following functionalities:\n\n1. User email authentication\n\n2. Being able to store and synchronise individual user's data ( generated while interacting with the app each day -> \"user session\" ) between various devices\n\n3. Having user session data ( anonymized ) available for an admin via a visual interface for querying, generating insights\n\n4. Simple crud interface for remote configs\n\n5. a/b testing\n\n6. GDPR requirements ( e.g. workflows for removing or exporting user data, ideally a way to keep the anonymized data too ) \n\n7. Integration with 3rd party services like @{Mailchimp}|tool:47| or @{Mixpanel}|tool:60| ( which we already use, data is sent directly from the app )\n\n\nWould appreciate any help with finding the right solution for this case given:\n\n1. Costs (we don't expect large media files storage)\n\n2. Flexibility to add new features related to the backend in the future\n\n3. Infra setup and maintenance \n\n\nWhat I've been thinking so far was one of: 1. BaaS AWS/@{Firebase}|tool:116| 2. Custom backend with @{PostgreSQL}|tool:1028| 3. PaaS of a Realm type (mobile app already uses Realm for local persistence) \n\nThanks!","publishedAt":"2020-07-17T14:01:06Z","private":false,"sample":false,"commentsCount":0,"upvotesCount":2,"upvoted":false,"flagged":false,"bookmarked":false,"viewCount":238708,"draft":false,"createdAt":"2020-07-17T14:01:06Z","decisionType":"getAdvice","answers({\"first\":2})":{"type":"id","generated":true,"id":"$StackDecision:104529557357459047.answers({\"first\":2})","typename":"StackDecisionConnection"},"subjectTools":[{"type":"id","generated":false,"id":"Tool:101231773461393493","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773853533403","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773902893044","typename":"Tool"}],"fromTools":[],"toTools":[],"deleted":false,"link":null,"company":null,"stack":null,"topics":[],"services":[{"type":"id","generated":false,"id":"Tool:101231773853533403","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773461393493","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773431684432","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773423818690","typename":"Tool"}],"user":{"type":"id","generated":false,"id":"User:104524668593557330","typename":"User"},"rootComments":[],"__typename":"StackDecision"},"$StackDecision:104529557357459047.permissions":{"edit":false,"delete":false,"__typename":"Permissions"},"$StackDecision:104529557357459047.answers({\"first\":2})":{"count":0,"pageInfo":{"type":"id","generated":true,"id":"$StackDecision:104529557357459047.answers({\"first\":2}).pageInfo","typename":"PageInfo"},"edges":[],"__typename":"StackDecisionConnection"},"$StackDecision:104529557357459047.answers({\"first\":2}).pageInfo":{"hasNextPage":false,"endCursor":null,"__typename":"PageInfo"},"Tool:101231773853533403":{"id":"101231773853533403","name":"PostgreSQL","slug":"postgresql","title":"A powerful, open source object-relational database system","verified":false,"imageUrl":"https://img.stackshare.io/service/1028/ASOhU5xJ.png","canonicalUrl":"/postgresql","path":"/postgresql","votes":3550,"fans":96408,"stacks":99323,"followingTool":false,"followContext":null,"__typename":"Tool","following":false},"Tool:101231773902893044":{"id":"101231773902893044","name":"Realm","slug":"realm","title":"Realm makes it easy to build reactive apps, realtime collaborative features, and offline-first experiences.","verified":true,"imageUrl":"https://img.stackshare.io/service/1140/realm_logo_200_x_200.png","canonicalUrl":"/realm","path":"/realm","votes":16,"fans":519,"stacks":269,"followingTool":false,"followContext":null,"__typename":"Tool"},"Tool:101231773431684432":{"id":"101231773431684432","name":"Mixpanel","slug":"mixpanel","title":"Powerful, self-serve product analytics to help you convert, engage, and retain more users","verified":true,"imageUrl":"https://img.stackshare.io/service/60/default_a3830bd6c50dcc059aaf3aaf287131b64e0957e2.png","canonicalUrl":"/mixpanel","path":"/mixpanel","votes":438,"fans":4642,"stacks":7107,"followingTool":false,"followContext":null,"__typename":"Tool"},"Tool:101231773423818690":{"id":"101231773423818690","name":"Mailchimp","slug":"mailchimp","title":"Easy email newsletters","verified":false,"imageUrl":"https://img.stackshare.io/service/47/default_3a2efb58b55346c25d951f68f21e56f8af77c9b8.jpg","canonicalUrl":"/mailchimp","path":"/mailchimp","votes":1172,"fans":15921,"stacks":22874,"followingTool":false,"followContext":null,"__typename":"Tool"},"User:104524668593557330":{"id":"104524668593557330","username":"psiedlak5760","path":"/psiedlak5760","imageUrl":"https://img.stackshare.io/user/667055/default_09f7c9c93a920e15d22661675d7376cfa0bdb5da.jpg","displayName":"Pawel S","title":"","companyName":"","__typename":"User"},"$ROOT_QUERY.tool({\"id\":\"firebase\"}).stackDecisions({\"after\":\"\",\"first\":10}).edges.5":{"node":{"type":"id","generated":false,"id":"StackDecision:104529557357459047","typename":"StackDecision"},"__typename":"StackDecisionEdge"},"StackDecision:103843572360279650":{"id":"103843572360279650","showAutoGeneratedTag":false,"permissions":{"type":"id","generated":true,"id":"$StackDecision:103843572360279650.permissions","typename":"Permissions"},"publicId":"103843572360279650","htmlContent":"

          I'm planning to make a web app with browser games that would be a Progressive Web App. I decided to use Vue.js as the front framework and Firebase to store basic information about users. Then I found out about Nuxt.js and I figured it could be really handy for making the project as PWA.\n\n

          The thing is, that I don't know if I will need Server Side Rendering for this, I couldn't find a lot of information but from what I know, the web app doesn't need SSR to be PWA. I am not sure how this would work with JavaScript browser games made with frameworks like Phaser or melon.js. Also, I host my website on GoDaddy and I've heard that it's quite hard to set up SSR with cPanel. \n\n

          So my questions are:\n\n

          Should I use SSR for Progressive Web Application built with Nuxt, filled with javascript browser games that are lazily loaded, or does that not make sense? If it makes sense, would SSR work with godaddy hosting and cPanel?\n\n

          Any help would be appreciated!","rawContent":"I'm planning to make a web app with browser games that would be a Progressive Web App. I decided to use @{Vue.js}|tool:3837| as the front framework and @{Firebase}|tool:116| to store basic information about users. Then I found out about @{Nuxt.js}|tool:7304| and I figured it could be really handy for making the project as PWA.\n\nThe thing is, that I don't know if I will need Server Side Rendering for this, I couldn't find a lot of information but from what I know, the web app doesn't need SSR to be PWA. I am not sure how this would work with @{JavaScript}|tool:1209| browser games made with frameworks like @{Phaser}|tool:4014| or melon.js. Also, I host my website on @{GoDaddy}|tool:42| and I've heard that it's quite hard to set up SSR with @{cPanel}|tool:3079|. \n\nSo my questions are:\n\nShould I use SSR for Progressive Web Application built with Nuxt, filled with javascript browser games that are lazily loaded, or does that not make sense? If it makes sense, would SSR work with godaddy hosting and cPanel?\n\nAny help would be appreciated!\n\n","publishedAt":"2020-03-18T10:26:06Z","private":false,"sample":false,"commentsCount":0,"upvotesCount":7,"upvoted":false,"flagged":false,"bookmarked":false,"viewCount":153160,"draft":false,"createdAt":"2020-03-18T10:26:06Z","decisionType":"getAdvice","answers({\"first\":2})":{"type":"id","generated":true,"id":"$StackDecision:103843572360279650.answers({\"first\":2})","typename":"StackDecisionConnection"},"subjectTools":[{"type":"id","generated":false,"id":"Tool:101231774752382726","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773461393493","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231777094096455","typename":"Tool"}],"fromTools":[],"toTools":[],"deleted":false,"link":null,"company":null,"stack":null,"topics":[],"services":[{"type":"id","generated":false,"id":"Tool:101231774752382726","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773420308094","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231775310522009","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773939333405","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231777094096455","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773461393493","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231775222204089","typename":"Tool"}],"user":{"type":"id","generated":false,"id":"User:103492658991550933","typename":"User"},"rootComments":[],"__typename":"StackDecision"},"$StackDecision:103843572360279650.permissions":{"edit":false,"delete":false,"__typename":"Permissions"},"$StackDecision:103843572360279650.answers({\"first\":2})":{"count":1,"pageInfo":{"type":"id","generated":true,"id":"$StackDecision:103843572360279650.answers({\"first\":2}).pageInfo","typename":"PageInfo"},"edges":[{"type":"id","generated":true,"id":"$StackDecision:103843572360279650.answers({\"first\":2}).edges.0","typename":"StackDecisionEdge"}],"__typename":"StackDecisionConnection"},"$StackDecision:103843572360279650.answers({\"first\":2}).pageInfo":{"hasNextPage":false,"endCursor":"MQ","__typename":"PageInfo"},"StackDecision:103851630130807703":{"id":"103851630130807703","publicId":"103851630130807703","htmlContent":"

          Perhaps you could generate static website with Nuxt and deploy on cPanel or some free static hosting.","rawContent":"Perhaps you could generate static website with Nuxt and deploy on cPanel or some free static hosting.","publishedAt":"2020-03-19T20:35:17Z","commentsCount":0,"private":false,"upvotesCount":6,"upvoted":false,"flagged":false,"bookmarked":false,"viewCount":2753,"draft":false,"createdAt":"2020-03-19T20:35:17Z","decisionType":"giveAdvice","showAutoGeneratedTag":false,"permissions":{"type":"id","generated":true,"id":"$StackDecision:103851630130807703.permissions","typename":"Permissions"},"subjectTools":[{"type":"id","generated":false,"id":"Tool:101231777094096455","typename":"Tool"}],"fromTools":[],"toTools":[],"deleted":false,"link":null,"company":null,"topics":[],"stack":null,"services":[],"user":{"type":"id","generated":false,"id":"User:101232094536830744","typename":"User"},"rootComments":[],"__typename":"StackDecision"},"$StackDecision:103851630130807703.permissions":{"edit":false,"delete":false,"__typename":"Permissions"},"Tool:101231777094096455":{"id":"101231777094096455","name":"Nuxt.js","slug":"nuxt","title":"The Vue.js Framework","verified":true,"imageUrl":"https://img.stackshare.io/service/7304/23360933.png","canonicalUrl":"/nuxt","path":"/nuxt","votes":371,"fans":2222,"stacks":1967,"followingTool":false,"followContext":null,"__typename":"Tool"},"User:101232094536830744":{"id":"101232094536830744","username":"eskimm","path":"/eskimm","imageUrl":"https://img.stackshare.io/user/202087/default_4ca24d14808ebd23017caec064017ac4045061be.jpeg","displayName":"Alan Red","title":null,"companyName":null,"__typename":"User"},"$StackDecision:103843572360279650.answers({\"first\":2}).edges.0":{"node":{"type":"id","generated":false,"id":"StackDecision:103851630130807703","typename":"StackDecision"},"__typename":"StackDecisionEdge"},"Tool:101231774752382726":{"id":"101231774752382726","name":"cPanel","slug":"cpanel","title":"Create an exceptional hosting experience","verified":false,"imageUrl":"https://img.stackshare.io/service/3079/Dpfp-1vu_400x400.jpg","canonicalUrl":"/cpanel","path":"/cpanel","votes":13,"fans":183,"stacks":166,"followingTool":false,"followContext":null,"__typename":"Tool"},"Tool:101231773420308094":{"id":"101231773420308094","name":"GoDaddy","slug":"godaddy","title":"Your all in one solution to grow online","verified":false,"imageUrl":"https://img.stackshare.io/service/42/default_fe6434a2b381cb644610fabe7e72af9a2c57e571.jpg","canonicalUrl":"/godaddy","path":"/godaddy","votes":11,"fans":627,"stacks":557,"followingTool":false,"followContext":null,"__typename":"Tool"},"Tool:101231775310522009":{"id":"101231775310522009","name":"Phaser","slug":"phaserio","title":"Desktop and Mobile HTML5 game framework","verified":false,"imageUrl":"https://img.stackshare.io/service/4014/sqSv2hIr_400x400.jpg","canonicalUrl":"/phaserio","path":"/phaserio","votes":4,"fans":207,"stacks":129,"followingTool":false,"followContext":null,"__typename":"Tool"},"Tool:101231775222204089":{"id":"101231775222204089","name":"Vue.js","slug":"vue-js","title":"A progressive framework for building user interfaces","verified":false,"imageUrl":"https://img.stackshare.io/service/3837/paeckCWC.png","canonicalUrl":"/vue-js","path":"/vue-js","votes":1562,"fans":52531,"stacks":54772,"followingTool":false,"followContext":null,"__typename":"Tool"},"User:103492658991550933":{"id":"103492658991550933","username":"mwpodgorni5345","path":"/mwpodgorni5345","imageUrl":"https://img.stackshare.io/user/347439/default_3135f1231070e99a010a3dd67b3ec7c12926822a.jpg","displayName":"Michał Podgórni","title":"","companyName":"","__typename":"User"},"$ROOT_QUERY.tool({\"id\":\"firebase\"}).stackDecisions({\"after\":\"\",\"first\":10}).edges.6":{"node":{"type":"id","generated":false,"id":"StackDecision:103843572360279650","typename":"StackDecision"},"__typename":"StackDecisionEdge"},"StackDecision:106254892860204714":{"id":"106254892860204714","showAutoGeneratedTag":false,"permissions":{"type":"id","generated":true,"id":"$StackDecision:106254892860204714.permissions","typename":"Permissions"},"publicId":"106254892860204714","htmlContent":"

          Hi. \nI am gonna build a simple app for a company to ease their work. \nThe company is sending out pdf files to their users' email. \nThe data is a health analysis with a lot of different health values.\nThe app should be an MVP, where users can watch their data instead of opening a pdf file. \nThe company should be able to fill in the data in either Firebase or Contentful database.\nIs Contentful or Firebase best for this solution? What is your opinion?","rawContent":"Hi. \nI am gonna build a simple app for a company to ease their work. \nThe company is sending out pdf files to their users' email. \nThe data is a health analysis with a lot of different health values.\nThe app should be an MVP, where users can watch their data instead of opening a pdf file. \nThe company should be able to fill in the data in either @{Firebase}|tool:116| or @{Contentful}|tool:672| database.\nIs Contentful or Firebase best for this solution? What is your opinion?","publishedAt":"2021-05-18T06:56:36Z","private":false,"sample":false,"commentsCount":0,"upvotesCount":5,"upvoted":false,"flagged":false,"bookmarked":false,"viewCount":97838,"draft":false,"createdAt":"2021-05-18T06:56:37Z","decisionType":"getAdvice","answers({\"first\":2})":{"type":"id","generated":true,"id":"$StackDecision:106254892860204714.answers({\"first\":2})","typename":"StackDecisionConnection"},"subjectTools":[{"type":"id","generated":false,"id":"Tool:101231773704516198","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773461393493","typename":"Tool"}],"fromTools":[],"toTools":[],"deleted":false,"link":null,"company":null,"stack":null,"topics":[],"services":[{"type":"id","generated":false,"id":"Tool:101231773704516198","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773461393493","typename":"Tool"}],"user":{"type":"id","generated":false,"id":"User:106254848895368466","typename":"User"},"rootComments":[],"__typename":"StackDecision"},"$StackDecision:106254892860204714.permissions":{"edit":false,"delete":false,"__typename":"Permissions"},"$StackDecision:106254892860204714.answers({\"first\":2})":{"count":2,"pageInfo":{"type":"id","generated":true,"id":"$StackDecision:106254892860204714.answers({\"first\":2}).pageInfo","typename":"PageInfo"},"edges":[{"type":"id","generated":true,"id":"$StackDecision:106254892860204714.answers({\"first\":2}).edges.0","typename":"StackDecisionEdge"},{"type":"id","generated":true,"id":"$StackDecision:106254892860204714.answers({\"first\":2}).edges.1","typename":"StackDecisionEdge"}],"__typename":"StackDecisionConnection"},"$StackDecision:106254892860204714.answers({\"first\":2}).pageInfo":{"hasNextPage":false,"endCursor":"Mg","__typename":"PageInfo"},"StackDecision:106371389871860338":{"id":"106371389871860338","publicId":"106371389871860338","htmlContent":"

          As far as I know, Contentful (I never used it) provides a UI where you can manually manage your data (create, edit, remove data).\n\n

          You say this: The company should be able to fill in the data in either Firebase or Contentful database.\n\n

          My point is that Firebase does NOT provides a User Friendly UI for filling data. You need dev-knowledge in order to use the UI of Firebase Firestore.\nI would recommend to check how is the UI of Contentful.\nSpend some hours checking how to manually enter data in Contentful. If you think it's user friendly, so go for it, because Firebase is 0% user friendly.\n\n

          But, if you want to create your own form for entering the data, and saving it in contentful or firebase... Well... That's another question.","rawContent":"As far as I know, Contentful (I never used it) provides a UI where you can manually manage your data (create, edit, remove data).\n\nYou say this: `The company should be able to fill in the data in either Firebase or Contentful database`.\n\nMy point is that Firebase does NOT provides a User Friendly UI for filling data. You need dev-knowledge in order to use the UI of Firebase Firestore.\nI would recommend to check how is the UI of Contentful.\nSpend some hours checking how to manually enter data in Contentful. If you think it's user friendly, so go for it, because Firebase is 0% user friendly.\n\nBut, if you want to create your own form for entering the data, and saving it in contentful or firebase... Well... That's another question.","publishedAt":"2021-06-07T20:43:20Z","commentsCount":0,"private":false,"upvotesCount":4,"upvoted":false,"flagged":false,"bookmarked":false,"viewCount":3523,"draft":false,"createdAt":"2021-06-07T20:43:20Z","decisionType":"giveAdvice","showAutoGeneratedTag":false,"permissions":{"type":"id","generated":true,"id":"$StackDecision:106371389871860338.permissions","typename":"Permissions"},"subjectTools":[{"type":"id","generated":false,"id":"Tool:101231773704516198","typename":"Tool"}],"fromTools":[],"toTools":[],"deleted":false,"link":null,"company":{"type":"id","generated":false,"id":"Company:104358305213695335","typename":"Company"},"topics":[],"stack":{"type":"id","generated":false,"id":"Stack:104358306261457840","typename":"Stack"},"services":[],"user":{"type":"id","generated":false,"id":"User:104358316798766509","typename":"User"},"rootComments":[],"__typename":"StackDecision"},"$StackDecision:106371389871860338.permissions":{"edit":false,"delete":false,"__typename":"Permissions"},"Tool:101231773704516198":{"id":"101231773704516198","name":"Contentful","slug":"contentful","title":"Contentful is a cloud-based API-first content platform ","verified":true,"imageUrl":"https://img.stackshare.io/service/672/default_622e25ec0417ac85db5b66ca399528b101ba284f.png","canonicalUrl":"/contentful","path":"/contentful","votes":70,"fans":1143,"stacks":824,"followingTool":false,"followContext":null,"__typename":"Tool"},"Company:104358305213695335":{"id":"104358305213695335","path":"/companies/nofilter","imageUrl":"https://img.stackshare.io/company/162313/default_fb6416e637b0b20c0c4805c1965b7238ed00c9b6.png","name":"NoFilter","slug":"nofilter","__typename":"Company"},"Stack:104358306261457840":{"id":"104358306261457840","imageUrl":"https://img.stackshare.io/stack/668431/default_a21e5a254d2fe80f7a3188d330bbf825cce1a753.png","name":"NoFilter","identifier":"nofilter/nofilter","path":"/nofilter/nofilter","private":false,"owner":{"type":"id","generated":false,"id":"Company:104358305213695335","typename":"Company"},"__typename":"Stack"},"User:104358316798766509":{"id":"104358316798766509","username":"BrodaNoel","path":"/BrodaNoel","imageUrl":"https://img.stackshare.io/user/632120/default_ea946ab6ef22fb6182aaa604fd58aca49aaabc94.jpeg","displayName":"Noel Broda","title":"Founder, CEO, CTO","companyName":"NoFilter","__typename":"User"},"$StackDecision:106254892860204714.answers({\"first\":2}).edges.0":{"node":{"type":"id","generated":false,"id":"StackDecision:106371389871860338","typename":"StackDecision"},"__typename":"StackDecisionEdge"},"StackDecision:107101413427707703":{"id":"107101413427707703","publicId":"107101413427707703","htmlContent":"

          Generally, I recommend not putting personally identifiable information (user information) into Contentful. If you believe the user information is not personally identifiable (emails are not stored, no full names, etc...) then you could do this in Contentful. \n\n

          However once you have PII - use a combination approach.\n\n

          Personal information and health records in Firebase, generic words and language and images in Contentful.","rawContent":"Generally, I recommend not putting personally identifiable information (user information) into Contentful. If you believe the user information is not personally identifiable (emails are not stored, no full names, etc...) then you could do this in Contentful. \n\nHowever once you have PII - use a combination approach.\n\nPersonal information and health records in Firebase, generic words and language and images in Contentful.","publishedAt":"2021-10-14T18:57:55Z","commentsCount":0,"private":false,"upvotesCount":4,"upvoted":false,"flagged":false,"bookmarked":false,"viewCount":1656,"draft":false,"createdAt":"2021-10-14T18:57:55Z","decisionType":"giveAdvice","showAutoGeneratedTag":false,"permissions":{"type":"id","generated":true,"id":"$StackDecision:107101413427707703.permissions","typename":"Permissions"},"subjectTools":[{"type":"id","generated":false,"id":"Tool:101231773704516198","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773461393493","typename":"Tool"}],"fromTools":[],"toTools":[],"deleted":false,"link":null,"company":null,"topics":[],"stack":null,"services":[],"user":{"type":"id","generated":false,"id":"User:107101365201945978","typename":"User"},"rootComments":[],"__typename":"StackDecision"},"$StackDecision:107101413427707703.permissions":{"edit":false,"delete":false,"__typename":"Permissions"},"User:107101365201945978":{"id":"107101365201945978","username":"kum4rbot","path":"/kum4rbot","imageUrl":"https://img.stackshare.io/user/1053399/default_67f9701253784b1d139b18fd2059df657902f76b.jpg","displayName":"Andrew Kumar","title":"","companyName":"","__typename":"User"},"$StackDecision:106254892860204714.answers({\"first\":2}).edges.1":{"node":{"type":"id","generated":false,"id":"StackDecision:107101413427707703","typename":"StackDecision"},"__typename":"StackDecisionEdge"},"User:106254848895368466":{"id":"106254848895368466","username":"emmalp85","path":"/emmalp85","imageUrl":"https://img.stackshare.io/user/969371/default_e26b517de18db80720f2a1515962dd7a9278f00f.png","displayName":"Emma P","title":"","companyName":"","__typename":"User"},"$ROOT_QUERY.tool({\"id\":\"firebase\"}).stackDecisions({\"after\":\"\",\"first\":10}).edges.7":{"node":{"type":"id","generated":false,"id":"StackDecision:106254892860204714","typename":"StackDecision"},"__typename":"StackDecisionEdge"},"StackDecision:104324115205255075":{"id":"104324115205255075","showAutoGeneratedTag":false,"permissions":{"type":"id","generated":true,"id":"$StackDecision:104324115205255075.permissions","typename":"Permissions"},"publicId":"104324115205255075","htmlContent":"

          Hey everyone, I am a new self-taught developer and have some questions regarding apps. I apologize in advance if the question is too obvious or simple. \n\n

          I am currently trying to build an app for a local supermarket as a way to get experience in the development world. The app needs to pull data from a MySQL database that the owner has through GoDaddy. It also needs to have an admin panel. \n\n

          Problem: I have the app ready, and it works using Firebase. I also have the admin panel built with React and Redux. However, I have no idea how to integrate the app with the Admin Panel. Can somebody please mentor me in this case? \n\n

          Thanks. ","rawContent":"Hey everyone, I am a new self-taught developer and have some questions regarding apps. I apologize in advance if the question is too obvious or simple. \n\nI am currently trying to build an app for a local supermarket as a way to get experience in the development world. The app needs to pull data from a @{MySQL}|tool:1025| database that the owner has through @{GoDaddy}|tool:42|. It also needs to have an admin panel. \n\nProblem: I have the app ready, and it works using @{Firebase}|tool:116|. I also have the admin panel built with @{React}|tool:1020| and @{Redux}|tool:4074|. However, I have no idea how to integrate the app with the Admin Panel. Can somebody please mentor me in this case? \n\nThanks. ","publishedAt":"2020-06-11T07:14:28Z","private":false,"sample":false,"commentsCount":0,"upvotesCount":5,"upvoted":false,"flagged":false,"bookmarked":false,"viewCount":78809,"draft":false,"createdAt":"2020-06-11T07:14:28Z","decisionType":"getAdvice","answers({\"first\":2})":{"type":"id","generated":true,"id":"$StackDecision:104324115205255075.answers({\"first\":2})","typename":"StackDecisionConnection"},"subjectTools":[{"type":"id","generated":false,"id":"Tool:101231774033451843","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773849098825","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773844232272","typename":"Tool"}],"fromTools":[],"toTools":[],"deleted":false,"link":null,"company":null,"stack":null,"topics":[],"services":[{"type":"id","generated":false,"id":"Tool:101231775357043443","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773849098825","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773461393493","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773420308094","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773851859414","typename":"Tool"}],"user":{"type":"id","generated":false,"id":"User:103048923824927071","typename":"User"},"rootComments":[],"__typename":"StackDecision"},"$StackDecision:104324115205255075.permissions":{"edit":false,"delete":false,"__typename":"Permissions"},"$StackDecision:104324115205255075.answers({\"first\":2})":{"count":2,"pageInfo":{"type":"id","generated":true,"id":"$StackDecision:104324115205255075.answers({\"first\":2}).pageInfo","typename":"PageInfo"},"edges":[{"type":"id","generated":true,"id":"$StackDecision:104324115205255075.answers({\"first\":2}).edges.0","typename":"StackDecisionEdge"},{"type":"id","generated":true,"id":"$StackDecision:104324115205255075.answers({\"first\":2}).edges.1","typename":"StackDecisionEdge"}],"__typename":"StackDecisionConnection"},"$StackDecision:104324115205255075.answers({\"first\":2}).pageInfo":{"hasNextPage":false,"endCursor":"Mg","__typename":"PageInfo"},"StackDecision:104352470275353116":{"id":"104352470275353116","publicId":"104352470275353116","htmlContent":"

          There isn't really enough detail in your question to give you concrete answers. React/Redux are frontend technologies, and it sounds like you have your data in a MySQL database somewhere. There is no mention of any kind of backend, so I assume you don't have one. In that case, I don't know enough about GoDaddy to know what APIs it exposes for modifying your database, but unless you want to let literally anyone with the URL to your admin panel to be able to modify your data, you're going to need to include some authentication.\nNow, the classic way to do this is to look into creating some sort of backend to authenticate admins (with some kind of login system. There are many ways to do this, Laravel and Ruby on Rails are fairly time-tested technologies for doing this), and also serve as an in-between from your frontend admin panel to your database. The cost of doing it this way is you're going to have to have a server to host somewhere which will add to the maintenance cost for your client.\nAlternatively, there are ways which don't involve creating a backend, such as OAuth authentication. This article talks about a few: https://css-tricks.com/apis-and-authentication-on-the-jamstack/. Firebase can also do authentication for you, though it sounds like it only offers an SDK, not hosting (you will still need to create a authentication server, or use OAuth or other third-party authentication tech if you use Firebase).","rawContent":"There isn't really enough detail in your question to give you concrete answers. React/Redux are frontend technologies, and it sounds like you have your data in a MySQL database somewhere. There is no mention of any kind of backend, so I assume you don't have one. In that case, I don't know enough about GoDaddy to know what APIs it exposes for modifying your database, but unless you want to let literally anyone with the URL to your admin panel to be able to modify your data, you're going to need to include some authentication.\nNow, the classic way to do this is to look into creating some sort of backend to authenticate admins (with some kind of login system. There are many ways to do this, Laravel and Ruby on Rails are fairly time-tested technologies for doing this), and also serve as an in-between from your frontend admin panel to your database. The cost of doing it this way is you're going to have to have a server to host somewhere which will add to the maintenance cost for your client.\nAlternatively, there are ways which don't involve creating a backend, such as OAuth authentication. This article talks about a few: [https://css-tricks.com/apis-and-authentication-on-the-jamstack/](https://css-tricks.com/apis-and-authentication-on-the-jamstack/). Firebase can also do authentication for you, though it sounds like it only offers an SDK, not hosting (you will still need to create a authentication server, or use OAuth or other third-party authentication tech if you use Firebase).","publishedAt":"2020-06-16T07:25:32Z","commentsCount":0,"private":false,"upvotesCount":6,"upvoted":false,"flagged":false,"bookmarked":false,"viewCount":3220,"draft":false,"createdAt":"2020-06-16T07:25:32Z","decisionType":"giveAdvice","showAutoGeneratedTag":false,"permissions":{"type":"id","generated":true,"id":"$StackDecision:104352470275353116.permissions","typename":"Permissions"},"subjectTools":[{"type":"id","generated":false,"id":"Tool:101231773836807964","typename":"Tool"}],"fromTools":[],"toTools":[],"deleted":false,"link":null,"company":null,"topics":[],"stack":null,"services":[],"user":{"type":"id","generated":false,"id":"User:104352394784314820","typename":"User"},"rootComments":[],"__typename":"StackDecision"},"$StackDecision:104352470275353116.permissions":{"edit":false,"delete":false,"__typename":"Permissions"},"User:104352394784314820":{"id":"104352394784314820","username":"louisch","path":"/louisch","imageUrl":"https://img.stackshare.io/user/630388/default_cd1ca979c105482dce02904f812dd6d4907ad4a1.png","displayName":"louisch","title":null,"companyName":null,"__typename":"User"},"$StackDecision:104324115205255075.answers({\"first\":2}).edges.0":{"node":{"type":"id","generated":false,"id":"StackDecision:104352470275353116","typename":"StackDecision"},"__typename":"StackDecisionEdge"},"StackDecision:104492649861679388":{"id":"104492649861679388","publicId":"104492649861679388","htmlContent":"

          I'd say keep it simple and create a small express.js back end on heroku\nhttps://devcenter.heroku.com/articles/getting-started-with-nodejs\n\n

          This would communicate with the database. You would setup routes that your react app could access using something like axios\n\n

          express:\napp.get('/products', (req, res) => {\n // call mysql db run query and return result\n // set up db connection...\n dbconn.query('select * from products'). then(result => {\n res.send(result.rows) \n }).catch(e => res.sendStatus(400))\n})\nreact:\naxios.get('https://app.herokuapps.com/products').then(resp => console.log(resp.data))","rawContent":"I'd say keep it simple and create a small express.js back end on heroku\nhttps://devcenter.heroku.com/articles/getting-started-with-nodejs\n\nThis would communicate with the database. You would setup routes that your react app could access using something like axios\n\nexpress:\napp.get('/products', (req, res) => {\n // call mysql db run query and return result\n // set up db connection...\n dbconn.query('select * from products'). then(result => {\n res.send(result.rows) \n }).catch(e => res.sendStatus(400))\n})\nreact:\naxios.get('https://app.herokuapps.com/products').then(resp => console.log(resp.data))","publishedAt":"2020-07-11T01:35:02Z","commentsCount":0,"private":false,"upvotesCount":3,"upvoted":false,"flagged":false,"bookmarked":false,"viewCount":3205,"draft":false,"createdAt":"2020-07-11T01:35:02Z","decisionType":"giveAdvice","showAutoGeneratedTag":false,"permissions":{"type":"id","generated":true,"id":"$StackDecision:104492649861679388.permissions","typename":"Permissions"},"subjectTools":[{"type":"id","generated":false,"id":"Tool:101231773845103618","typename":"Tool"}],"fromTools":[],"toTools":[],"deleted":false,"link":null,"company":null,"topics":[],"stack":null,"services":[],"user":{"type":"id","generated":false,"id":"User:101850120548347307","typename":"User"},"rootComments":[],"__typename":"StackDecision"},"$StackDecision:104492649861679388.permissions":{"edit":false,"delete":false,"__typename":"Permissions"},"User:101850120548347307":{"id":"101850120548347307","username":"beerify","path":"/beerify","imageUrl":"https://img.stackshare.io/user/289455/default_e1ceb98066ca27811fb69eed87369fae8b3ef01b.png","displayName":"beerify","title":"","companyName":"Craft Delivery Inc","__typename":"User"},"$StackDecision:104324115205255075.answers({\"first\":2}).edges.1":{"node":{"type":"id","generated":false,"id":"StackDecision:104492649861679388","typename":"StackDecision"},"__typename":"StackDecisionEdge"},"Tool:101231774033451843":{"id":"101231774033451843","name":"Android Studio","slug":"android-studio","title":"Android development environment based on IntelliJ IDEA","verified":false,"imageUrl":"https://img.stackshare.io/service/1447/AyreX9yf.jpeg","canonicalUrl":"/android-studio","path":"/android-studio","votes":361,"fans":24335,"stacks":25469,"followingTool":false,"followContext":null,"__typename":"Tool"},"Tool:101231773849098825":{"id":"101231773849098825","name":"React","slug":"react","title":"A JavaScript library for building user interfaces","verified":false,"imageUrl":"https://img.stackshare.io/service/1020/OYIaJ1KK.png","canonicalUrl":"/react","path":"/react","votes":4085,"fans":164915,"stacks":175369,"followingTool":false,"followContext":null,"__typename":"Tool","following":false},"Tool:101231773844232272":{"id":"101231773844232272","name":"Swift","slug":"swift","title":"An innovative new programming language for Cocoa and Cocoa Touch. ","verified":false,"imageUrl":"https://img.stackshare.io/service/1009/tuHsaI2U.png","canonicalUrl":"/swift","path":"/swift","votes":1275,"fans":16633,"stacks":20457,"followingTool":false,"followContext":null,"__typename":"Tool"},"Tool:101231775357043443":{"id":"101231775357043443","name":"Redux","slug":"reduxjs","title":"Predictable state container for JavaScript apps","verified":false,"imageUrl":"https://img.stackshare.io/service/4074/13142323.png","canonicalUrl":"/reduxjs","path":"/reduxjs","votes":674,"fans":28685,"stacks":30805,"followingTool":false,"followContext":null,"__typename":"Tool"},"User:103048923824927071":{"id":"103048923824927071","username":"devonauts","path":"/devonauts","imageUrl":"https://img.stackshare.io/user/316284/default_39778352b7c35cabfcb76154b392537ac73c2fce.png","displayName":"Michael Urresta","title":"Developer","companyName":"Devonauts","__typename":"User"},"$ROOT_QUERY.tool({\"id\":\"firebase\"}).stackDecisions({\"after\":\"\",\"first\":10}).edges.8":{"node":{"type":"id","generated":false,"id":"StackDecision:104324115205255075","typename":"StackDecision"},"__typename":"StackDecisionEdge"},"StackDecision:104523431071745682":{"id":"104523431071745682","showAutoGeneratedTag":false,"permissions":{"type":"id","generated":true,"id":"$StackDecision:104523431071745682.permissions","typename":"Permissions"},"publicId":"104523431071745682","htmlContent":"

          We are starting to work on a web-based platform aiming to connect artists (clients) and professional freelancers (service providers). In-app, timeline-based, real-time communication between users (& storing it), file transfers, and push notifications are essential core features. We are considering using Node.js, ExpressJS, React, MongoDB stack with Socket.IO & Apollo, or maybe using Real-Time Database and functionalities of Firebase.","rawContent":"We are starting to work on a web-based platform aiming to connect artists (clients) and professional freelancers (service providers). In-app, timeline-based, real-time communication between users (& storing it), file transfers, and push notifications are essential core features. We are considering using @{Node.js}|tool:1011|, @{ExpressJS}|tool:1163|, @{React}|tool:1020|, @{MongoDB}|tool:1030| stack with @{Socket.IO}|tool:1161| & @{Apollo}|tool:5508|, or maybe using Real-Time Database and functionalities of @{Firebase}|tool:116|.","publishedAt":"2020-07-16T12:03:06Z","private":false,"sample":false,"commentsCount":0,"upvotesCount":9,"upvoted":false,"flagged":false,"bookmarked":false,"viewCount":1142181,"draft":false,"createdAt":"2020-07-16T12:03:06Z","decisionType":"getAdvice","answers({\"first\":2})":{"type":"id","generated":true,"id":"$StackDecision:104523431071745682.answers({\"first\":2})","typename":"StackDecisionConnection"},"subjectTools":[{"type":"id","generated":false,"id":"Tool:101231776161934711","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773461393493","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773920191005","typename":"Tool"}],"fromTools":[],"toTools":[],"deleted":false,"link":null,"company":null,"stack":null,"topics":[],"services":[{"type":"id","generated":false,"id":"Tool:101231773461393493","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231776161934711","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773920191005","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773854388643","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773849098825","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773920953695","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773845103618","typename":"Tool"}],"user":{"type":"id","generated":false,"id":"User:104016930033103313","typename":"User"},"rootComments":[],"__typename":"StackDecision"},"$StackDecision:104523431071745682.permissions":{"edit":false,"delete":false,"__typename":"Permissions"},"$StackDecision:104523431071745682.answers({\"first\":2})":{"count":3,"pageInfo":{"type":"id","generated":true,"id":"$StackDecision:104523431071745682.answers({\"first\":2}).pageInfo","typename":"PageInfo"},"edges":[{"type":"id","generated":true,"id":"$StackDecision:104523431071745682.answers({\"first\":2}).edges.0","typename":"StackDecisionEdge"},{"type":"id","generated":true,"id":"$StackDecision:104523431071745682.answers({\"first\":2}).edges.1","typename":"StackDecisionEdge"}],"__typename":"StackDecisionConnection"},"$StackDecision:104523431071745682.answers({\"first\":2}).pageInfo":{"hasNextPage":true,"endCursor":"Mg","__typename":"PageInfo"},"StackDecision:104530864987716080":{"id":"104530864987716080","publicId":"104530864987716080","htmlContent":"

          I would recommend looking hard into Firebase for this project, especially if you do not have dedicated full-stack or backend members on your team. \n\n

          The real time database, as you mentioned, is a great option, but I would also look into Firestore. Similar to RTDB, it adds more functions and some cool methods as well. Also, another great thing about Firebase is you have easy access to storage and dead simple auth as well.\n\n

          Node.js Express MongoDB Socket.IO and Apollo are great technologies as well, and may be the better option if you do not wish to cede as much control to third parties in your application.\n\n

          Overall, I say if you wish to focus more time developing your React application instead of other parts of your stack, Firebase is a great way to do that.","rawContent":"I would recommend looking hard into `Firebase` for this project, especially if you do not have dedicated full-stack or backend members on your team. \n\nThe real time database, as you mentioned, is a great option, but I would also look into `Firestore`. Similar to RTDB, it adds more functions and some cool methods as well. Also, another great thing about Firebase is you have easy access to storage and dead simple auth as well.\n\n`Node.js` `Express` `MongoDB` `Socket.IO` and `Apollo` are great technologies as well, and may be the better option if you do not wish to cede as much control to third parties in your application.\n\nOverall, I say if you wish to focus more time developing your `React` application instead of other parts of your stack, `Firebase` is a great way to do that.\n\n","publishedAt":"2020-07-17T19:33:39Z","commentsCount":2,"private":false,"upvotesCount":7,"upvoted":false,"flagged":false,"bookmarked":false,"viewCount":496509,"draft":false,"createdAt":"2020-07-17T19:33:39Z","decisionType":"giveAdvice","showAutoGeneratedTag":false,"permissions":{"type":"id","generated":true,"id":"$StackDecision:104530864987716080.permissions","typename":"Permissions"},"subjectTools":[{"type":"id","generated":false,"id":"Tool:101231773461393493","typename":"Tool"}],"fromTools":[],"toTools":[],"deleted":false,"link":null,"company":null,"topics":[],"stack":null,"services":[],"user":{"type":"id","generated":false,"id":"User:104338567664361183","typename":"User"},"rootComments":[{"type":"id","generated":false,"id":"Comment:104553827718297411","typename":"Comment"}],"__typename":"StackDecision"},"$StackDecision:104530864987716080.permissions":{"edit":false,"delete":false,"__typename":"Permissions"},"User:104338567664361183":{"id":"104338567664361183","username":"timmalstead7117","path":"/timmalstead7117","imageUrl":"https://img.stackshare.io/user/627921/default_4dd39918afe8c76029b2d0e69a2afc93ed262804.jpg","displayName":"Timothy Malstead","title":"Junior Full Stack Developer","companyName":"Freelance","__typename":"User"},"Comment:104553827718297411":{"id":"104553827718297411","content":"I totally agree with you.\nThe only issue is most features of firebase are paid (and from my perspective costly) which could be a concern when the app grows and they might need to migrate which would be a lot of work.\n\nBut if it's only a prototyping then it's all good.","postedAt":"2020-07-21T20:53:22Z","upvoted":false,"flagged":false,"upvotesCount":1,"parentId":null,"user":{"type":"id","generated":false,"id":"User:104012505499799972","typename":"User"},"__typename":"Comment","replies":[{"type":"id","generated":false,"id":"Comment:104554117668597319","typename":"Comment"}]},"User:104012505499799972":{"id":"104012505499799972","path":"/akay25","imageUrl":"https://img.stackshare.io/user/521100/default_588b195ea0de9d516409a43c00d431ef6a594f27.jpeg","displayName":"Ajay M","__typename":"User"},"Comment:104554117668597319":{"id":"104554117668597319","content":"I hear you. I honestly haven't looked into hosting costs of Firebase vs Express/Mongo much.","postedAt":"2020-07-21T22:07:07Z","upvoted":false,"flagged":false,"upvotesCount":1,"parentId":"104553827718297411","user":{"type":"id","generated":false,"id":"User:104338567664361183","typename":"User"},"__typename":"Comment"},"$StackDecision:104523431071745682.answers({\"first\":2}).edges.0":{"node":{"type":"id","generated":false,"id":"StackDecision:104530864987716080","typename":"StackDecision"},"__typename":"StackDecisionEdge"},"StackDecision:105298842822880873":{"id":"105298842822880873","publicId":"105298842822880873","htmlContent":"

          Hello Noam 👋,\n\n

          I suggest taking a look at Ably, it has all the realtime features you need and the platform is designed to guarantee critical functionality at scale.\n\n

          Here is an in depth comparison between Ably and Firebase","rawContent":"\nHello Noam 👋,\n\nI suggest taking a look at [Ably](https://www.ably.com/), it has all the realtime features you need and the platform is designed to guarantee critical functionality at scale.\n\nHere is an in depth [comparison between Ably and Firebase](https://www.ably.io/compare/ably-vs-firebase/?utm_source=stackshare&utm_medium=advice&utm_campaign=cc-ably-firebase)","publishedAt":"2020-11-30T10:40:31Z","commentsCount":0,"private":false,"upvotesCount":4,"upvoted":false,"flagged":false,"bookmarked":false,"viewCount":382674,"draft":false,"createdAt":"2020-11-30T10:40:31Z","decisionType":"giveAdvice","showAutoGeneratedTag":false,"permissions":{"type":"id","generated":true,"id":"$StackDecision:105298842822880873.permissions","typename":"Permissions"},"subjectTools":[{"type":"id","generated":false,"id":"Tool:101231776519264921","typename":"Tool"}],"fromTools":[],"toTools":[],"deleted":false,"link":null,"company":null,"topics":[],"stack":null,"services":[],"user":{"type":"id","generated":false,"id":"User:105122967981281531","typename":"User"},"rootComments":[],"__typename":"StackDecision"},"$StackDecision:105298842822880873.permissions":{"edit":false,"delete":false,"__typename":"Permissions"},"Tool:101231776519264921":{"id":"101231776519264921","name":"Ably","slug":"ably-0","title":"The platform to power synchronized digital experiences in realtime, at scale.","verified":true,"imageUrl":"https://img.stackshare.io/service/6158/default_bbf586736cc989eab4388b617a14c731e365e1b4.png","canonicalUrl":"/ably-0","path":"/ably-0","votes":81,"fans":117,"stacks":62,"followingTool":false,"followContext":null,"__typename":"Tool"},"User:105122967981281531":{"id":"105122967981281531","username":"ramirond","path":"/ramirond","imageUrl":"https://img.stackshare.io/user/779160/default_09741be529bbe4130c9065d68bac863e34631ca8.png","displayName":"Ramiro Nuñez Dosio","title":null,"companyName":null,"__typename":"User"},"$StackDecision:104523431071745682.answers({\"first\":2}).edges.1":{"node":{"type":"id","generated":false,"id":"StackDecision:105298842822880873","typename":"StackDecision"},"__typename":"StackDecisionEdge"},"Tool:101231776161934711":{"id":"101231776161934711","name":"Apollo","slug":"apollo","title":"GraphQL server for Express, Connect, Hapi, Koa and more","verified":false,"imageUrl":"https://img.stackshare.io/service/5508/CyUH653y.png","canonicalUrl":"/apollo","path":"/apollo","votes":25,"fans":2456,"stacks":2430,"followingTool":false,"followContext":null,"__typename":"Tool"},"Tool:101231773920191005":{"id":"101231773920191005","name":"Socket.IO","slug":"socket-io","title":"Realtime application framework (Node.JS server)","verified":false,"imageUrl":"https://img.stackshare.io/service/1161/vI0ZZlhZ_400x400.png","canonicalUrl":"/socket-io","path":"/socket-io","votes":776,"fans":13509,"stacks":13367,"followingTool":false,"followContext":null,"__typename":"Tool"},"Tool:101231773854388643":{"id":"101231773854388643","name":"MongoDB","slug":"mongodb","title":"The database for giant ideas","verified":true,"imageUrl":"https://img.stackshare.io/service/1030/leaf-360x360.png","canonicalUrl":"/mongodb","path":"/mongodb","votes":4136,"fans":94530,"stacks":94343,"followingTool":false,"followContext":null,"__typename":"Tool","following":false},"Tool:101231773920953695":{"id":"101231773920953695","name":"ExpressJS","slug":"expressjs","title":"Sinatra inspired web development framework for node.js -- insanely fast, flexible, and simple","verified":false,"imageUrl":"https://img.stackshare.io/service/1163/hashtag.png","canonicalUrl":"/expressjs","path":"/expressjs","votes":1617,"fans":29184,"stacks":32289,"followingTool":false,"followContext":null,"__typename":"Tool"},"User:104016930033103313":{"id":"104016930033103313","username":"shemeshno1328","path":"/shemeshno1328","imageUrl":"https://img.stackshare.io/user/523590/default_2a2c7d03115ed50a9fd5d3d4e4a42b76250aa5d0.jpg","displayName":"Noam Shemesh","title":"","companyName":"","__typename":"User"},"$ROOT_QUERY.tool({\"id\":\"firebase\"}).stackDecisions({\"after\":\"\",\"first\":10}).edges.9":{"node":{"type":"id","generated":false,"id":"StackDecision:104523431071745682","typename":"StackDecision"},"__typename":"StackDecisionEdge"},"$ROOT_QUERY.tool({\"id\":\"firebase\"}).stackDecisions({\"after\":\"\",\"first\":10})":{"edges":[{"type":"id","generated":true,"id":"$ROOT_QUERY.tool({\"id\":\"firebase\"}).stackDecisions({\"after\":\"\",\"first\":10}).edges.0","typename":"StackDecisionEdge"},{"type":"id","generated":true,"id":"$ROOT_QUERY.tool({\"id\":\"firebase\"}).stackDecisions({\"after\":\"\",\"first\":10}).edges.1","typename":"StackDecisionEdge"},{"type":"id","generated":true,"id":"$ROOT_QUERY.tool({\"id\":\"firebase\"}).stackDecisions({\"after\":\"\",\"first\":10}).edges.2","typename":"StackDecisionEdge"},{"type":"id","generated":true,"id":"$ROOT_QUERY.tool({\"id\":\"firebase\"}).stackDecisions({\"after\":\"\",\"first\":10}).edges.3","typename":"StackDecisionEdge"},{"type":"id","generated":true,"id":"$ROOT_QUERY.tool({\"id\":\"firebase\"}).stackDecisions({\"after\":\"\",\"first\":10}).edges.4","typename":"StackDecisionEdge"},{"type":"id","generated":true,"id":"$ROOT_QUERY.tool({\"id\":\"firebase\"}).stackDecisions({\"after\":\"\",\"first\":10}).edges.5","typename":"StackDecisionEdge"},{"type":"id","generated":true,"id":"$ROOT_QUERY.tool({\"id\":\"firebase\"}).stackDecisions({\"after\":\"\",\"first\":10}).edges.6","typename":"StackDecisionEdge"},{"type":"id","generated":true,"id":"$ROOT_QUERY.tool({\"id\":\"firebase\"}).stackDecisions({\"after\":\"\",\"first\":10}).edges.7","typename":"StackDecisionEdge"},{"type":"id","generated":true,"id":"$ROOT_QUERY.tool({\"id\":\"firebase\"}).stackDecisions({\"after\":\"\",\"first\":10}).edges.8","typename":"StackDecisionEdge"},{"type":"id","generated":true,"id":"$ROOT_QUERY.tool({\"id\":\"firebase\"}).stackDecisions({\"after\":\"\",\"first\":10}).edges.9","typename":"StackDecisionEdge"}],"pageInfo":{"type":"id","generated":true,"id":"$ROOT_QUERY.tool({\"id\":\"firebase\"}).stackDecisions({\"after\":\"\",\"first\":10}).pageInfo","typename":"PageInfo"},"__typename":"StackDecisionConnection"},"$ROOT_QUERY.tool({\"id\":\"firebase\"}).stackDecisions({\"after\":\"\",\"first\":10}).pageInfo":{"hasNextPage":true,"endCursor":"MTA","__typename":"PageInfo"},"$ROOT_QUERY.tool({\"id\":\"firebase\"})":{"stackDecisions({\"after\":\"\",\"first\":10})":{"type":"id","generated":true,"id":"$ROOT_QUERY.tool({\"id\":\"firebase\"}).stackDecisions({\"after\":\"\",\"first\":10})","typename":"StackDecisionConnection"},"__typename":"Tool"},"$Tool:101231773461393493.category":{"name":"Application Hosting","slug":"application-hosting","__typename":"Category"},"$Tool:101231773461393493.layer":{"name":"Application and Data","slug":"application_and_data","__typename":"Layer"},"$Tool:101231773461393493.function":{"name":"Realtime Backend / API","slug":"realtime-backend-api","__typename":"Function"},"$ROOT_QUERY.trendingTools({\"first\":25}).edges.0":{"node":{"type":"id","generated":false,"id":"Tool:101231773939333405","typename":"Tool"},"__typename":"ToolEdge"},"Tool:101231773410696721":{"id":"101231773410696721","name":"GitHub","imageUrl":"https://img.stackshare.io/service/27/default_869c34d29acc794d60ecdd5d2b5bfc042a80a4ec.jpg","canonicalUrl":"/github","following":false,"followContext":null,"__typename":"Tool"},"$ROOT_QUERY.trendingTools({\"first\":25}).edges.1":{"node":{"type":"id","generated":false,"id":"Tool:101231773410696721","typename":"Tool"},"__typename":"ToolEdge"},"Tool:101231773837179153":{"id":"101231773837179153","name":"Python","imageUrl":"https://img.stackshare.io/service/993/pUBY5pVj.png","canonicalUrl":"/python","following":false,"followContext":null,"__typename":"Tool"},"$ROOT_QUERY.trendingTools({\"first\":25}).edges.2":{"node":{"type":"id","generated":false,"id":"Tool:101231773837179153","typename":"Tool"},"__typename":"ToolEdge"},"Tool:101231775423888689":{"id":"101231775423888689","name":"Visual Studio Code","imageUrl":"https://img.stackshare.io/service/4202/Visual_Studio_Code_logo.png","canonicalUrl":"/visual-studio-code","following":false,"followContext":null,"__typename":"Tool"},"$ROOT_QUERY.trendingTools({\"first\":25}).edges.3":{"node":{"type":"id","generated":false,"id":"Tool:101231775423888689","typename":"Tool"},"__typename":"ToolEdge"},"Tool:101231773858546548":{"id":"101231773858546548","name":"Git","imageUrl":"https://img.stackshare.io/service/1046/git.png","canonicalUrl":"/git","following":false,"followContext":null,"__typename":"Tool"},"$ROOT_QUERY.trendingTools({\"first\":25}).edges.4":{"node":{"type":"id","generated":false,"id":"Tool:101231773858546548","typename":"Tool"},"__typename":"ToolEdge"},"$ROOT_QUERY.trendingTools({\"first\":25}).edges.5":{"node":{"type":"id","generated":false,"id":"Tool:101231773845103618","typename":"Tool"},"__typename":"ToolEdge"},"$ROOT_QUERY.trendingTools({\"first\":25}).edges.6":{"node":{"type":"id","generated":false,"id":"Tool:101231773849098825","typename":"Tool"},"__typename":"ToolEdge"},"Tool:101231774472411723":{"id":"101231774472411723","name":"HTML5","imageUrl":"https://img.stackshare.io/service/2538/kEpgHiC9.png","canonicalUrl":"/html5","following":false,"followContext":null,"__typename":"Tool"},"$ROOT_QUERY.trendingTools({\"first\":25}).edges.7":{"node":{"type":"id","generated":false,"id":"Tool:101231774472411723","typename":"Tool"},"__typename":"ToolEdge"},"Tool:101231773669807419":{"id":"101231773669807419","name":"Docker","imageUrl":"https://img.stackshare.io/service/586/n4u37v9t_400x400.png","canonicalUrl":"/docker","following":false,"followContext":null,"__typename":"Tool"},"$ROOT_QUERY.trendingTools({\"first\":25}).edges.8":{"node":{"type":"id","generated":false,"id":"Tool:101231773669807419","typename":"Tool"},"__typename":"ToolEdge"},"$ROOT_QUERY.trendingTools({\"first\":25}).edges.9":{"node":{"type":"id","generated":false,"id":"Tool:101231773851859414","typename":"Tool"},"__typename":"ToolEdge"},"Tool:101231774796677926":{"id":"101231774796677926","name":"Gmail","imageUrl":"https://img.stackshare.io/service/3167/default_2d280843054d533c0a56c573c2e47e2cc1105a88.jpg","canonicalUrl":"/gmail","following":false,"followContext":null,"__typename":"Tool"},"$ROOT_QUERY.trendingTools({\"first\":25}).edges.10":{"node":{"type":"id","generated":false,"id":"Tool:101231774796677926","typename":"Tool"},"__typename":"ToolEdge"},"Tool:101231773838011785":{"id":"101231773838011785","name":"Java","imageUrl":"https://img.stackshare.io/service/995/K85ZWV2F.png","canonicalUrl":"/java","following":false,"followContext":null,"__typename":"Tool"},"$ROOT_QUERY.trendingTools({\"first\":25}).edges.11":{"node":{"type":"id","generated":false,"id":"Tool:101231773838011785","typename":"Tool"},"__typename":"ToolEdge"},"Tool:101231774098455524":{"id":"101231774098455524","name":"TypeScript","imageUrl":"https://img.stackshare.io/service/1612/bynNY5dJ.jpg","canonicalUrl":"/typescript","following":false,"followContext":null,"__typename":"Tool"},"$ROOT_QUERY.trendingTools({\"first\":25}).edges.12":{"node":{"type":"id","generated":false,"id":"Tool:101231774098455524","typename":"Tool"},"__typename":"ToolEdge"},"Tool:101231773705712932":{"id":"101231773705712932","name":"Slack","imageUrl":"https://img.stackshare.io/service/675/RNiSRYOF_400x400.jpg","canonicalUrl":"/slack","following":false,"followContext":null,"__typename":"Tool"},"$ROOT_QUERY.trendingTools({\"first\":25}).edges.13":{"node":{"type":"id","generated":false,"id":"Tool:101231773705712932","typename":"Tool"},"__typename":"ToolEdge"},"$ROOT_QUERY.trendingTools({\"first\":25}).edges.14":{"node":{"type":"id","generated":false,"id":"Tool:101231773853533403","typename":"Tool"},"__typename":"ToolEdge"},"$ROOT_QUERY.trendingTools({\"first\":25}).edges.15":{"node":{"type":"id","generated":false,"id":"Tool:101231773854388643","typename":"Tool"},"__typename":"ToolEdge"},"Tool:101231773990286939":{"id":"101231773990286939","name":"Postman","imageUrl":"https://img.stackshare.io/service/1336/xWMRvm_5_400x400.png","canonicalUrl":"/postman","following":false,"followContext":null,"__typename":"Tool"},"$ROOT_QUERY.trendingTools({\"first\":25}).edges.16":{"node":{"type":"id","generated":false,"id":"Tool:101231773990286939","typename":"Tool"},"__typename":"ToolEdge"},"Tool:101231773895058604":{"id":"101231773895058604","name":"npm","imageUrl":"https://img.stackshare.io/service/1120/lejvzrnlpb308aftn31u.png","canonicalUrl":"/npm","following":false,"followContext":null,"__typename":"Tool"},"$ROOT_QUERY.trendingTools({\"first\":25}).edges.17":{"node":{"type":"id","generated":false,"id":"Tool:101231773895058604","typename":"Tool"},"__typename":"ToolEdge"},"Tool:101231773791035497":{"id":"101231773791035497","name":"GitLab","imageUrl":"https://img.stackshare.io/service/880/lmalkclL.png","canonicalUrl":"/gitlab","following":false,"followContext":null,"__typename":"Tool"},"$ROOT_QUERY.trendingTools({\"first\":25}).edges.18":{"node":{"type":"id","generated":false,"id":"Tool:101231773791035497","typename":"Tool"},"__typename":"ToolEdge"},"Tool:101231773849559490":{"id":"101231773849559490","name":"jQuery","imageUrl":"https://img.stackshare.io/service/1021/lxEKmMnB_400x400.jpg","canonicalUrl":"/jquery","following":false,"followContext":null,"__typename":"Tool"},"$ROOT_QUERY.trendingTools({\"first\":25}).edges.19":{"node":{"type":"id","generated":false,"id":"Tool:101231773849559490","typename":"Tool"},"__typename":"ToolEdge"},"Tool:101231776819926470":{"id":"101231776819926470","name":"CSS 3","imageUrl":"https://img.stackshare.io/service/6727/css.png","canonicalUrl":"/css-3","following":false,"followContext":null,"__typename":"Tool"},"$ROOT_QUERY.trendingTools({\"first\":25}).edges.20":{"node":{"type":"id","generated":false,"id":"Tool:101231776819926470","typename":"Tool"},"__typename":"ToolEdge"},"Tool:101231774206661614":{"id":"101231774206661614","name":"Kubernetes","imageUrl":"https://img.stackshare.io/service/1885/21_d3cvM.png","canonicalUrl":"/kubernetes","following":false,"followContext":null,"__typename":"Tool"},"$ROOT_QUERY.trendingTools({\"first\":25}).edges.21":{"node":{"type":"id","generated":false,"id":"Tool:101231774206661614","typename":"Tool"},"__typename":"ToolEdge"},"Tool:101231773479019630":{"id":"101231773479019630","name":"Google Drive","imageUrl":"https://img.stackshare.io/service/148/default_fd639832ff07e3b4f80afd816d82ce5e3b666ed2.jpg","canonicalUrl":"/google-drive","following":false,"followContext":null,"__typename":"Tool"},"$ROOT_QUERY.trendingTools({\"first\":25}).edges.22":{"node":{"type":"id","generated":false,"id":"Tool:101231773479019630","typename":"Tool"},"__typename":"ToolEdge"},"Tool:101231773836410122":{"id":"101231773836410122","name":"PHP","imageUrl":"https://img.stackshare.io/service/991/hwUcGZ41_400x400.jpg","canonicalUrl":"/php","following":false,"followContext":null,"__typename":"Tool"},"$ROOT_QUERY.trendingTools({\"first\":25}).edges.23":{"node":{"type":"id","generated":false,"id":"Tool:101231773836410122","typename":"Tool"},"__typename":"ToolEdge"},"Tool:101231773861864225":{"id":"101231773861864225","name":"NGINX","imageUrl":"https://img.stackshare.io/service/1052/YMxUfyWf.png","canonicalUrl":"/nginx","following":false,"followContext":null,"__typename":"Tool"},"$ROOT_QUERY.trendingTools({\"first\":25}).edges.24":{"node":{"type":"id","generated":false,"id":"Tool:101231773861864225","typename":"Tool"},"__typename":"ToolEdge"},"$ROOT_QUERY.trendingTools({\"first\":25})":{"edges":[{"type":"id","generated":true,"id":"$ROOT_QUERY.trendingTools({\"first\":25}).edges.0","typename":"ToolEdge"},{"type":"id","generated":true,"id":"$ROOT_QUERY.trendingTools({\"first\":25}).edges.1","typename":"ToolEdge"},{"type":"id","generated":true,"id":"$ROOT_QUERY.trendingTools({\"first\":25}).edges.2","typename":"ToolEdge"},{"type":"id","generated":true,"id":"$ROOT_QUERY.trendingTools({\"first\":25}).edges.3","typename":"ToolEdge"},{"type":"id","generated":true,"id":"$ROOT_QUERY.trendingTools({\"first\":25}).edges.4","typename":"ToolEdge"},{"type":"id","generated":true,"id":"$ROOT_QUERY.trendingTools({\"first\":25}).edges.5","typename":"ToolEdge"},{"type":"id","generated":true,"id":"$ROOT_QUERY.trendingTools({\"first\":25}).edges.6","typename":"ToolEdge"},{"type":"id","generated":true,"id":"$ROOT_QUERY.trendingTools({\"first\":25}).edges.7","typename":"ToolEdge"},{"type":"id","generated":true,"id":"$ROOT_QUERY.trendingTools({\"first\":25}).edges.8","typename":"ToolEdge"},{"type":"id","generated":true,"id":"$ROOT_QUERY.trendingTools({\"first\":25}).edges.9","typename":"ToolEdge"},{"type":"id","generated":true,"id":"$ROOT_QUERY.trendingTools({\"first\":25}).edges.10","typename":"ToolEdge"},{"type":"id","generated":true,"id":"$ROOT_QUERY.trendingTools({\"first\":25}).edges.11","typename":"ToolEdge"},{"type":"id","generated":true,"id":"$ROOT_QUERY.trendingTools({\"first\":25}).edges.12","typename":"ToolEdge"},{"type":"id","generated":true,"id":"$ROOT_QUERY.trendingTools({\"first\":25}).edges.13","typename":"ToolEdge"},{"type":"id","generated":true,"id":"$ROOT_QUERY.trendingTools({\"first\":25}).edges.14","typename":"ToolEdge"},{"type":"id","generated":true,"id":"$ROOT_QUERY.trendingTools({\"first\":25}).edges.15","typename":"ToolEdge"},{"type":"id","generated":true,"id":"$ROOT_QUERY.trendingTools({\"first\":25}).edges.16","typename":"ToolEdge"},{"type":"id","generated":true,"id":"$ROOT_QUERY.trendingTools({\"first\":25}).edges.17","typename":"ToolEdge"},{"type":"id","generated":true,"id":"$ROOT_QUERY.trendingTools({\"first\":25}).edges.18","typename":"ToolEdge"},{"type":"id","generated":true,"id":"$ROOT_QUERY.trendingTools({\"first\":25}).edges.19","typename":"ToolEdge"},{"type":"id","generated":true,"id":"$ROOT_QUERY.trendingTools({\"first\":25}).edges.20","typename":"ToolEdge"},{"type":"id","generated":true,"id":"$ROOT_QUERY.trendingTools({\"first\":25}).edges.21","typename":"ToolEdge"},{"type":"id","generated":true,"id":"$ROOT_QUERY.trendingTools({\"first\":25}).edges.22","typename":"ToolEdge"},{"type":"id","generated":true,"id":"$ROOT_QUERY.trendingTools({\"first\":25}).edges.23","typename":"ToolEdge"},{"type":"id","generated":true,"id":"$ROOT_QUERY.trendingTools({\"first\":25}).edges.24","typename":"ToolEdge"}],"__typename":"ToolConnection"}}

          Firebase

          Firebase

          Application and Data / Application Hosting / Realtime Backend / API
          CTO at Uilicious·

          For inboxkitten.com, an opensource disposable email service;

          We migrated our serverless workload from Cloud Functions for Firebase to CloudFlare workers, taking advantage of the lower cost and faster-performing edge computing of Cloudflare network. Made possible due to our extremely low CPU and RAM overhead of our serverless functions.

          If I were to summarize the limitation of Cloudflare (as oppose to firebase/gcp functions), it would be ...

          1. <5ms CPU time limit
          2. Incompatible with express.js
          3. one script limitation per domain

          Limitations our workload is able to conform with (YMMV)

          For hosting of static files, we migrated from Firebase to CommonsHost

          More details on the trade-off in between both serverless providers is in the article

          READ MORE
          Why we migrated opensource 😼inboxkitten (77 million serverless request) from 🔥Firebase to ☁️Cloudflare workers & 🐑CommonsHost - DEV Community 👩‍💻👨‍💻 (dev.to)
          14 upvotes·600.6K views
          Telecomm Engineering at Netbeast·
          Shared insights
          at
          ()

          This time I want to share something different. For those that have read my stack decisions, it's normal to expect some advice on infrastructure or React Native. Lately my mind has been focusing more on product as a experience than what's it made of (anatomy). As a tech leader, I have to worry about things like: are we taking enough time for reviews? Are we improving over time? Are we faster now? Is our code of higher quality?

          For all these questions you can add many great recommendations on your pipeline. We use Trello for bug-tracking and project management. We use https://danger.systems/js/ to add checks for linting, type-enforcing and other quality dimensions in our PRs and a great feature from Vercel that let's you previsualize deployments directly in a PR. However it's not easy to measure this improvements over time. For customer matters we have Amplitude or Firebase analytics, but for our internal process? That's a little bit more complicated.

          I collaborated recently with some folks in a small startup as an early adopter to create a metrics dashboard for engineers. I tried to add the tool to stackshare.io but still it doesn't appear as one of the options, please take a look on it over product hunt and let us know https://www.producthunt.com/posts/scope-6

          READ MORE
          Scope - Software Engineering Metrics for Engineers and Team Leaders | Product Hunt (producthunt.com)
          15 upvotes·479K views
          Needs advice
          on
          FirebaseFirebaseGraphQLGraphQL
          and
          Node.jsNode.js

          Hi, we are looking to create a sports app that collects and displays player stats. It will include team chats with push notifications for upcoming games etc. We are thinking of using the standard MERN stack route with a GraphQL API or a real-time Firebase database. Any advice would be greatly appreciated.

          READ MORE
          6 upvotes·2.1M views
          Replies (3)
          Senior Software Engineer at DCS Group ·

          Firebase won’t provide GraphQL (out of the box) but is great for creating real-time apps. I’ve done this using Vue/Quasar framework (Quasar.dev) and Vuex with Vuefire or Vuexfire and their Firestore database. Deployment is easy as even with multiple project instances for Development/Staging/Production. Their RTDB or Firestore databases will be great for Chat apps. Push notifications are also supported. Free tier is large and serverless functions remove the need to manage servers and generally cheaper if you’re not using them 24/7. Local emulators with debugging support will speed up your coding. Firebase UI will handle most of your sign in UI. Firestore security rules allow you to move some business logic to the client side app and thus support offline and faster real-time updates as they occur client side first. Downside of Firestone is its query language is quite limited so you may also want to combine it with Google’s BigQuery to support complex SQL and reporting. Knowing what you need to query will be a deciding factor in choosing between Firebase and a GraphQL solution. There’s a BigQuery extension for Firebase to get you started. You can also use it with Google Data Studio.

          If you want/need GraphQL, I’d recommend having a look at AWS Amplify. I’ve not yet used it but looks like a reasonable alternative to Firebase though pricing is likely to be a bit higher and will likely have a steeper learning curve depending on past AWS experience.

          READ MORE
          1 upvote·2.3K views
          View all (3)
          Software Engineer ·
          Needs advice
          on
          FirebaseFirebaseJavaScriptJavaScript
          and
          Node.jsNode.js

          Hi all,

          I need advice for object-oriented data analysis. I have exported a collection of users from Firebase to JSON, and I want to analyze it, for example, how many users are females, males, etc. Are there any tools or packages that could help me quickly analyze this data?

          READ MORE
          2 upvotes·199.3K views
          Replies (3)
          Software Engineer III at Airtel Payments Bank·
          Recommends
          on
          Microsoft Excel

          Excel would be a go to choice. You can do all sort (mostly) of analysis on data easily. (unless you've nested array). Apply pivots, infer tables, generate graphs.

          If the data size is huge, you can also try MySQL and do queries in traditional manner.

          READ MORE
          1 upvote·1.4K views
          View all (3)
          Needs advice
          on
          Cloud FirestoreCloud FirestoreLaravelLaravel
          and
          MySQLMySQL

          I am setting up a content management system (CMS) in Laravel using #GoogleCloudPlatform. This #CMS will have quite a few polymorphic many-to-many relationships (at least 10) and for that reason I am considering whether I should use Firebase or other #NoSQL databases with Laravel.

          I know that there is a laravel-firebase package by Kreait which should allow me to use the firebase as database. My question is therefore:

          1. Are there any drawbacks to using Firebase with Laravel, which I should be aware of?
          2. Can I possibly use a hybrid model where some data is stored in the SQL database (e.g. user data) while other is stored in Firebase (e.g. the content).
          3. Or should I just stick to MySQL and create the several polymorphic many-to-many relationships?
          4. Should I do both and see what works better?

          Any advice is appreciated.

          READ MORE
          6 upvotes·194.9K views
          Needs advice
          on
          FirebaseFirebasePostgreSQLPostgreSQL
          and
          RealmRealm

          Hi,

          I am in the process of building a mobile application and releasing it to the AppStore. Currently, we're in a TestFlight Beta with ~ 1500 users with a front-end only native iOS app. Before releasing it to production, we would like to add the following functionalities:

          1. User email authentication

          2. Being able to store and synchronise individual user's data ( generated while interacting with the app each day -> "user session" ) between various devices

          3. Having user session data ( anonymized ) available for an admin via a visual interface for querying, generating insights

          4. Simple crud interface for remote configs

          5. a/b testing

          6. GDPR requirements ( e.g. workflows for removing or exporting user data, ideally a way to keep the anonymized data too )

          7. Integration with 3rd party services like Mailchimp or Mixpanel ( which we already use, data is sent directly from the app )

          Would appreciate any help with finding the right solution for this case given:

          1. Costs (we don't expect large media files storage)

          2. Flexibility to add new features related to the backend in the future

          3. Infra setup and maintenance

          What I've been thinking so far was one of: 1. BaaS AWS/Firebase 2. Custom backend with PostgreSQL 3. PaaS of a Realm type (mobile app already uses Realm for local persistence)

          Thanks!

          READ MORE
          2 upvotes·238.7K views
          Needs advice
          on
          cPanelcPanelFirebaseFirebase
          and
          Nuxt.jsNuxt.js

          I'm planning to make a web app with browser games that would be a Progressive Web App. I decided to use Vue.js as the front framework and Firebase to store basic information about users. Then I found out about Nuxt.js and I figured it could be really handy for making the project as PWA.

          The thing is, that I don't know if I will need Server Side Rendering for this, I couldn't find a lot of information but from what I know, the web app doesn't need SSR to be PWA. I am not sure how this would work with JavaScript browser games made with frameworks like Phaser or melon.js. Also, I host my website on GoDaddy and I've heard that it's quite hard to set up SSR with cPanel.

          So my questions are:

          Should I use SSR for Progressive Web Application built with Nuxt, filled with javascript browser games that are lazily loaded, or does that not make sense? If it makes sense, would SSR work with godaddy hosting and cPanel?

          Any help would be appreciated!

          READ MORE
          7 upvotes·153.2K views
          Replies (1)
          Recommends
          on
          Nuxt.js

          Perhaps you could generate static website with Nuxt and deploy on cPanel or some free static hosting.

          READ MORE
          6 upvotes·2.8K views
          Needs advice
          on
          ContentfulContentful
          and
          FirebaseFirebase

          Hi. I am gonna build a simple app for a company to ease their work. The company is sending out pdf files to their users' email. The data is a health analysis with a lot of different health values. The app should be an MVP, where users can watch their data instead of opening a pdf file. The company should be able to fill in the data in either Firebase or Contentful database. Is Contentful or Firebase best for this solution? What is your opinion?

          READ MORE
          5 upvotes·97.8K views
          Replies (2)
          Founder, CEO, CTO at NoFilter·

          As far as I know, Contentful (I never used it) provides a UI where you can manually manage your data (create, edit, remove data).

          You say this: The company should be able to fill in the data in either Firebase or Contentful database.

          My point is that Firebase does NOT provides a User Friendly UI for filling data. You need dev-knowledge in order to use the UI of Firebase Firestore. I would recommend to check how is the UI of Contentful. Spend some hours checking how to manually enter data in Contentful. If you think it's user friendly, so go for it, because Firebase is 0% user friendly.

          But, if you want to create your own form for entering the data, and saving it in contentful or firebase... Well... That's another question.

          READ MORE
          4 upvotes·3.5K views
          Recommends
          on
          Contentful
          Firebase

          Generally, I recommend not putting personally identifiable information (user information) into Contentful. If you believe the user information is not personally identifiable (emails are not stored, no full names, etc...) then you could do this in Contentful.

          However once you have PII - use a combination approach.

          Personal information and health records in Firebase, generic words and language and images in Contentful.

          READ MORE
          4 upvotes·1.7K views
          Developer at Devonauts·
          Needs advice
          on
          Android StudioAndroid StudioReactReact
          and
          SwiftSwift

          Hey everyone, I am a new self-taught developer and have some questions regarding apps. I apologize in advance if the question is too obvious or simple.

          I am currently trying to build an app for a local supermarket as a way to get experience in the development world. The app needs to pull data from a MySQL database that the owner has through GoDaddy. It also needs to have an admin panel.

          Problem: I have the app ready, and it works using Firebase. I also have the admin panel built with React and Redux. However, I have no idea how to integrate the app with the Admin Panel. Can somebody please mentor me in this case?

          Thanks.

          READ MORE
          5 upvotes·78.8K views
          Replies (2)
          Recommends
          on
          Laravel

          There isn't really enough detail in your question to give you concrete answers. React/Redux are frontend technologies, and it sounds like you have your data in a MySQL database somewhere. There is no mention of any kind of backend, so I assume you don't have one. In that case, I don't know enough about GoDaddy to know what APIs it exposes for modifying your database, but unless you want to let literally anyone with the URL to your admin panel to be able to modify your data, you're going to need to include some authentication. Now, the classic way to do this is to look into creating some sort of backend to authenticate admins (with some kind of login system. There are many ways to do this, Laravel and Ruby on Rails are fairly time-tested technologies for doing this), and also serve as an in-between from your frontend admin panel to your database. The cost of doing it this way is you're going to have to have a server to host somewhere which will add to the maintenance cost for your client. Alternatively, there are ways which don't involve creating a backend, such as OAuth authentication. This article talks about a few: https://css-tricks.com/apis-and-authentication-on-the-jamstack/. Firebase can also do authentication for you, though it sounds like it only offers an SDK, not hosting (you will still need to create a authentication server, or use OAuth or other third-party authentication tech if you use Firebase).

          READ MORE
          6 upvotes·3.2K views
          Craft Delivery Inc·
          Recommends
          on
          Node.js

          I'd say keep it simple and create a small express.js back end on heroku https://devcenter.heroku.com/articles/getting-started-with-nodejs

          This would communicate with the database. You would setup routes that your react app could access using something like axios

          express: app.get('/products', (req, res) => { // call mysql db run query and return result // set up db connection... dbconn.query('select * from products'). then(result => { res.send(result.rows) }).catch(e => res.sendStatus(400)) }) react: axios.get('https://app.herokuapps.com/products').then(resp => console.log(resp.data))

          READ MORE
          3 upvotes·3.2K views
          Needs advice
          on
          ApolloApolloFirebaseFirebase
          and
          Socket.IOSocket.IO

          We are starting to work on a web-based platform aiming to connect artists (clients) and professional freelancers (service providers). In-app, timeline-based, real-time communication between users (& storing it), file transfers, and push notifications are essential core features. We are considering using Node.js, ExpressJS, React, MongoDB stack with Socket.IO & Apollo, or maybe using Real-Time Database and functionalities of Firebase.

          READ MORE
          9 upvotes·1.1M views
          Replies (3)
          Junior Full Stack Developer at Freelance·
          Recommends
          on
          Firebase

          I would recommend looking hard into Firebase for this project, especially if you do not have dedicated full-stack or backend members on your team.

          The real time database, as you mentioned, is a great option, but I would also look into Firestore. Similar to RTDB, it adds more functions and some cool methods as well. Also, another great thing about Firebase is you have easy access to storage and dead simple auth as well.

          Node.js Express MongoDB Socket.IO and Apollo are great technologies as well, and may be the better option if you do not wish to cede as much control to third parties in your application.

          Overall, I say if you wish to focus more time developing your React application instead of other parts of your stack, Firebase is a great way to do that.

          READ MORE
          7 upvotes·2 comments·496.5K views
          Ajay M
          Ajay M
          ·
          July 21st 2020 at 8:53PM

          I totally agree with you.

          The only issue is most features of firebase are paid (and from my perspective costly) which could be a concern when the app grows and they might need to migrate which would be a lot of work.

          But if it's only a prototyping then it's all good.

          ·
          Reply
          Timothy Malstead
          Timothy Malstead
          ·
          July 21st 2020 at 10:07PM

          I hear you. I honestly haven't looked into hosting costs of Firebase vs Express/Mongo much.

          ·
          Reply
          View all (3)