At IT Minds we create customized internal or #B2B web and mobile apps.\nI have a go to stack that I pitch to our customers consisting of 3 core areas.\n1) A data core #backend .\n2) A micro #serverless #backend.\n3) A user client #frontend.\n\n

For the Data Core I create a backend using TypeScript Node.js and with TypeORM connecting to a PostgreSQL \nExposing an action based api with Apollo GraphQL \n\n

For the micro serverless backend, which purpose is verification for authentication, autorization, logins and the likes.\nIt is created with Next.js api pages. Using MongoDB to store essential information, caching etc.\n\n

Finally the frontend is built with React using Next.js , TypeScript and @Apollo.\nWe create the frontend as a PWA and have a AMP landing page by default.","private":false,"viewCount":2904072,"publishedAt":"2019-08-14T08:34:49Z","upvotesCount":14,"decisionType":"freeform","fromTools":[],"toTools":[],"subjectTools":[],"services":[{"type":"id","generated":false,"id":"Tool:101231774098455524","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773845103618","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231777149555129","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773853533403","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231776161934711","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231775212866992","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231776411419473","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:101231776785845663","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231776433245869","typename":"Tool"}],"topics":[{"type":"id","generated":false,"id":"Topic:101777457607861763","typename":"Topic"},{"type":"id","generated":false,"id":"Topic:101231988901054690","typename":"Topic"},{"type":"id","generated":false,"id":"Topic:101231988860833239","typename":"Topic"}],"__typename":"StackDecision"},"$StackDecision:102614413651968242.company":{"imageUrl":"https://img.stackshare.io/company/23579/default_d00d0589d3279df1ba5453ba947c5a1315bded9b.png","thumbUrl":"https://img.stackshare.io/company/23579/thumb_d00d0589d3279df1ba5453ba947c5a1315bded9b.png","name":"IT Minds","path":"/companies/it-minds","features":[],"__typename":"Company"},"$StackDecision:102614413651968242.link":{"url":"https://dev.to/itminds/the-leading-web-stack-of-an-it-minds-senior-developer-45mb","title":"The Leading Web stack of an IT Minds Senior Developer. - DEV Community 👩‍💻👨‍💻","__typename":"Link"},"Tool:101231777149555129":{"name":"TypeORM","path":"/typeorm","id":"101231777149555129","imageUrl":"https://img.stackshare.io/service/7419/20165699.png","thumbUrl":"https://img.stackshare.io/service/7419/thumb_20165699.png","stacks":601,"fans":1086,"votes":81,"followingTool":false,"__typename":"Tool"},"Tool:101231773853533403":{"name":"PostgreSQL","path":"/postgresql","id":"101231773853533403","imageUrl":"https://img.stackshare.io/service/1028/ASOhU5xJ.png","thumbUrl":"https://img.stackshare.io/service/1028/thumb_ASOhU5xJ.png","stacks":98137,"fans":95355,"votes":3549,"followingTool":false,"__typename":"Tool","slug":"postgresql","title":"A powerful, open source object-relational database system","verified":false,"canonicalUrl":"/postgresql","following":false,"followContext":null},"Tool:101231776161934711":{"name":"Apollo","path":"/apollo","id":"101231776161934711","imageUrl":"https://img.stackshare.io/service/5508/CyUH653y.png","thumbUrl":"https://img.stackshare.io/service/5508/thumb_CyUH653y.png","stacks":2418,"fans":2444,"votes":25,"followingTool":false,"__typename":"Tool","thumbRetinaUrl":"https://img.stackshare.io/service/5508/thumb_retina_CyUH653y.png","slug":"apollo","title":"GraphQL server for Express, Connect, Hapi, Koa and more","verified":false,"canonicalUrl":"/apollo","following":false,"followContext":null},"Tool:101231776785845663":{"name":"PWA","path":"/pwa","id":"101231776785845663","imageUrl":"https://img.stackshare.io/service/6658/PSpUS-Hp_400x400.jpg","thumbUrl":"https://img.stackshare.io/service/6658/thumb_PSpUS-Hp_400x400.jpg","stacks":35,"fans":24,"votes":0,"followingTool":false,"__typename":"Tool"},"Tool:101231776433245869":{"name":"AMP","path":"/amp","id":"101231776433245869","imageUrl":"https://img.stackshare.io/service/6006/amp.jpg","thumbUrl":"https://img.stackshare.io/service/6006/thumb_amp.jpg","stacks":101,"fans":117,"votes":0,"followingTool":false,"__typename":"Tool"},"Topic:101777457607861763":{"name":"B2B","id":"101777457607861763","__typename":"Topic"},"Topic:101231988901054690":{"name":"Backend","id":"101231988901054690","__typename":"Topic"},"Topic:101231988860833239":{"name":"Serverless","id":"101231988860833239","__typename":"Topic"},"$Tool:101231775212866992.stackDecisions({\"first\":6}).edges.0":{"node":{"type":"id","generated":false,"id":"StackDecision:102614413651968242","typename":"StackDecision"},"__typename":"StackDecisionEdge"},"User:101232070678997624":{"id":"101232070678997624","username":"Scrayos","title":"CEO","companyName":"Scrayos UG (haftungsbeschränkt)","imageUrl":"https://img.stackshare.io/user/157783/default_3261fc6c63b4f7df47dd9f0524d6e1016d9107cb.png","thumbUrl":"https://img.stackshare.io/user/157783/thumb_3261fc6c63b4f7df47dd9f0524d6e1016d9107cb.png","displayName":"Joshua Dean Küpper","__typename":"User"},"StackDecision:104581137866292747":{"user":{"type":"id","generated":false,"id":"User:101232070678997624","typename":"User"},"company":{"type":"id","generated":true,"id":"$StackDecision:104581137866292747.company","typename":"Company"},"link":null,"publicId":"104581137866292747","id":"104581137866292747","htmlContent":"

We use GraphQL for the communication between our Minecraft-Proxies/Load-Balancers and our global Minecraft-Orchestration-Service JCOverseer.\n\n

This connection proved to be especially challenging, as there were so many available options and very specific requirements and we tried our hardest to put as little complexity into this interface as possible.\n\n

Initially we considered designing our very own Netty based Packet-Protocol. While the performance of this approach probably would've been noteworthy, we would have had to write a lot of packets as the individual payloads would differ a lot and for the protocol specification a new project would've been needed, so we scrapped that idea.\n\n

Our second idea was to use a combination of Redis Key/Value store (in particular the ability to write whole, complex sets as the values of keys) for existing data, Redis Pub-Sub for the synchronization of new/changed/deleted data and a Vert.x based REST API for the mutation requests of the clients. While this would certainly have been possible, we decided against it, as redis offers no real other data types than strings and typing was important to us.\n\n

So we finally settled for GraphQL as it would allow us to define dynamic queries and mutations and additionally has subscriptions in store, so we would only need one component instead of three separate. The proxies register as subscribers to the server changes channel and fetch the current data set in advance. If they need to request changes, this is done through a mutation in GraphQL aswell.\n\n

The status of the invidiual servers is fetched through Docker healthchecks and a Docker client in the orchestration service, that subscribes to changed HEALTHINESS values in docker. If a service becomes unhealthy it is unregistered and synchronized through GraphQL. The healthcheck is comparable to a ping packet that expects a response in a given time frame.","private":false,"viewCount":2093961,"publishedAt":"2020-07-26T16:38:42Z","upvotesCount":6,"decisionType":"tool","fromTools":[],"toTools":[{"type":"id","generated":false,"id":"Tool:101231775212866992","typename":"Tool"}],"subjectTools":[{"type":"id","generated":false,"id":"Tool:101231775212866992","typename":"Tool"}],"services":[{"type":"id","generated":false,"id":"Tool:101231773669807419","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231774861393249","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773854768982","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231774860582629","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231775212866992","typename":"Tool"}],"topics":[],"__typename":"StackDecision"},"$StackDecision:104581137866292747.company":{"imageUrl":"https://img.stackshare.io/company/23305/default_d6bc79c2bb597bc269388be95cc72731f00ace1e.png","thumbUrl":"https://img.stackshare.io/company/23305/thumb_d6bc79c2bb597bc269388be95cc72731f00ace1e.png","name":"Scrayos UG (haftungsbeschränkt)","path":"/companies/scrayos-ug-haftungsbeschrankt","features":[],"__typename":"Company"},"Tool:101231773669807419":{"name":"Docker","path":"/docker","id":"101231773669807419","imageUrl":"https://img.stackshare.io/service/586/n4u37v9t_400x400.png","thumbUrl":"https://img.stackshare.io/service/586/thumb_n4u37v9t_400x400.png","stacks":174222,"fans":160671,"votes":3857,"followingTool":false,"__typename":"Tool","slug":"docker","title":"Enterprise Container Platform for High-Velocity Innovation.","verified":true,"canonicalUrl":"/docker","following":false,"followContext":null},"Tool:101231774861393249":{"name":"Vert.x","path":"/vert-x","id":"101231774861393249","imageUrl":"https://img.stackshare.io/service/3279/q9FQ_NSR_400x400.jpg","thumbUrl":"https://img.stackshare.io/service/3279/thumb_q9FQ_NSR_400x400.jpg","stacks":259,"fans":397,"votes":59,"followingTool":false,"__typename":"Tool"},"Tool:101231773854768982":{"name":"Redis","path":"/redis","id":"101231773854768982","imageUrl":"https://img.stackshare.io/service/1031/default_cbce472cd134adc6688572f999e9122b9657d4ba.png","thumbUrl":"https://img.stackshare.io/service/1031/thumb_cbce472cd134adc6688572f999e9122b9657d4ba.png","stacks":59383,"fans":54870,"votes":3943,"followingTool":false,"__typename":"Tool","slug":"redis","title":"Open source (BSD licensed), in-memory data structure store","verified":false,"canonicalUrl":"/redis","following":false,"followContext":null},"Tool:101231774860582629":{"name":"Netty","path":"/netty","id":"101231774860582629","imageUrl":"https://img.stackshare.io/service/3278/netty_icon_256px.png","thumbUrl":"https://img.stackshare.io/service/3278/thumb_netty_icon_256px.png","stacks":262,"fans":484,"votes":17,"followingTool":false,"__typename":"Tool"},"$Tool:101231775212866992.stackDecisions({\"first\":6}).edges.1":{"node":{"type":"id","generated":false,"id":"StackDecision:104581137866292747","typename":"StackDecision"},"__typename":"StackDecisionEdge"},"User:105161931373123661":{"id":"105161931373123661","username":"RandyMoss","title":null,"companyName":null,"imageUrl":"https://img.stackshare.io/user/786921/default_32de6d75242ae80dfd9a09eb2e4c2ce816d62f1b.jpg","thumbUrl":"https://img.stackshare.io/user/786921/thumb_32de6d75242ae80dfd9a09eb2e4c2ce816d62f1b.jpg","displayName":"Randy Moss","__typename":"User"},"StackDecision:105161993903708297":{"user":{"type":"id","generated":false,"id":"User:105161931373123661","typename":"User"},"company":null,"link":null,"publicId":"105161993903708297","id":"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.","private":false,"viewCount":2140202,"publishedAt":"2020-11-06T06:38:02Z","upvotesCount":6,"decisionType":"getAdvice","fromTools":[],"toTools":[],"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"}],"services":[{"type":"id","generated":false,"id":"Tool:101231773461393493","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231775212866992","typename":"Tool"}],"topics":[],"__typename":"StackDecision"},"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":41412,"stacks":40955,"followingTool":false,"followContext":null,"__typename":"Tool","thumbUrl":"https://img.stackshare.io/service/116/thumb_cZLxNFZS.jpg"},"$Tool:101231775212866992.stackDecisions({\"first\":6}).edges.2":{"node":{"type":"id","generated":false,"id":"StackDecision:105161993903708297","typename":"StackDecision"},"__typename":"StackDecisionEdge"},"User:104331612960205286":{"id":"104331612960205286","username":"dipanjan122252","title":"","companyName":"","imageUrl":"https://img.stackshare.io/user/626876/default_beb3d13b4836f6bc5b6abf05160a96db4206d601.jpg","thumbUrl":"https://img.stackshare.io/user/626876/thumb_beb3d13b4836f6bc5b6abf05160a96db4206d601.jpg","displayName":"Deepanjan Majumdar","__typename":"User"},"StackDecision:104331643108827450":{"user":{"type":"id","generated":false,"id":"User:104331612960205286","typename":"User"},"company":null,"link":null,"publicId":"104331643108827450","id":"104331643108827450","htmlContent":"

We are currently using nginx as a reverse proxy for API mutations and GraphQL as a unified API service for all API access and fetch, where GQL has good support for caching, sorting, pagination, and querying. Is it recommended to use NGINX for all of the above purposes, and when API aggregation is not the case, not use GQL. \n\n

Or for sorting, querying, pagination, caching - is GQL always a better choice, even if there is no API aggregation involved?","private":false,"viewCount":2017538,"publishedAt":"2020-06-12T15:08:54Z","upvotesCount":6,"decisionType":"getAdvice","fromTools":[],"toTools":[],"subjectTools":[{"type":"id","generated":false,"id":"Tool:101231775212866992","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773861864225","typename":"Tool"}],"services":[{"type":"id","generated":false,"id":"Tool:101231773861864225","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231775212866992","typename":"Tool"}],"topics":[],"__typename":"StackDecision"},"Tool:101231773861864225":{"id":"101231773861864225","name":"NGINX","slug":"nginx","title":"A high performance free open source web server powering busiest sites on the Internet.","verified":true,"imageUrl":"https://img.stackshare.io/service/1052/YMxUfyWf.png","canonicalUrl":"/nginx","path":"/nginx","votes":5498,"fans":73355,"stacks":113314,"followingTool":false,"followContext":null,"__typename":"Tool","thumbUrl":"https://img.stackshare.io/service/1052/thumb_YMxUfyWf.png","following":false},"$Tool:101231775212866992.stackDecisions({\"first\":6}).edges.3":{"node":{"type":"id","generated":false,"id":"StackDecision:104331643108827450","typename":"StackDecision"},"__typename":"StackDecisionEdge"},"User:104042388677869390":{"id":"104042388677869390","username":"zimoony","title":"Senior Fullstack Developer","companyName":"QUANTUSflow Software GmbH","imageUrl":"https://img.stackshare.io/user/535402/default_002baf8a5098e7badd949774288e37e836a64e0f.jpeg","thumbUrl":"https://img.stackshare.io/user/535402/thumb_002baf8a5098e7badd949774288e37e836a64e0f.jpeg","displayName":"Simon Reymann","__typename":"User"},"StackDecision:104044015201141207":{"user":{"type":"id","generated":false,"id":"User:104042388677869390","typename":"User"},"company":{"type":"id","generated":true,"id":"$StackDecision:104044015201141207.company","typename":"Company"},"link":null,"publicId":"104044015201141207","id":"104044015201141207","htmlContent":"

Our whole Vue.js frontend stack (incl. SSR) consists of the following tools:\n\n