The core Shopify app has remained a Rails monolith, but we also have hundreds of other Rails apps across the organization. These are not microservices, but domain-specific apps: Shipping (talks with various shipping providers), Identity (single sign on across all Shopify stores), and App Store to name a few. Managing a hundred apps and keeping them up to date with security updates can be tough, so we've developed ServicesDB, an internal app that keeps track of all production services and helps developers to make sure that they don't miss anything important.\n\n
ServicesDB keeps a checklist for each app: ownership, uptime, logs, on-call rotation, exception reporting, and gem security updates. If there are problems with any of those, ServicesDB opens a GitHub issue and pings owners of the app to ask them to address it. ServicesDB also makes it easy to query the infrastructure and answer questions like, âHow many apps are on Rails 4.2? How many apps are using an outdated version of gem X? Which apps are calling this service?â.","rawContent":"The core Shopify app has remained a @{Rails}|tool:990| monolith, but we also have hundreds of other @{Rails}|tool:990| apps across the organization. These are not microservices, but domain-specific apps: Shipping (talks with various shipping providers), Identity (single sign on across all Shopify stores), and App Store to name a few. Managing a hundred apps and keeping them up to date with security updates can be tough, so we've developed ServicesDB, an internal app that keeps track of all production services and helps developers to make sure that they don't miss anything important.\n\nServicesDB keeps a checklist for each app: ownership, uptime, logs, on-call rotation, exception reporting, and gem security updates. If there are problems with any of those, ServicesDB opens a @{GitHub}|tool:27| issue and pings owners of the app to ask them to address it. ServicesDB also makes it easy to query the infrastructure and answer questions like, âHow many apps are on Rails 4.2? How many apps are using an outdated version of gem X? Which apps are calling this service?â.\n","publishedAt":"2018-09-13T06:57:35Z","commentsCount":0,"private":false,"upvotesCount":28,"upvoted":false,"flagged":false,"bookmarked":false,"viewCount":789633,"draft":false,"createdAt":"2018-09-13T06:57:35Z","decisionType":null,"showAutoGeneratedTag":false,"permissions":{"type":"id","generated":true,"id":"$StackDecision:101031322381293980.permissions","typename":"Permissions"},"subjectTools":[],"fromTools":[],"toTools":[],"link":{"type":"id","generated":true,"id":"$StackDecision:101031322381293980.link","typename":"Link"},"company":{"type":"id","generated":false,"id":"Company:101231709548158570","typename":"Company"},"topics":[],"stack":null,"services":[{"type":"id","generated":false,"id":"Tool:101231773835996572","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773410696721","typename":"Tool"}],"user":{"type":"id","generated":false,"id":"User:101232121295120227","typename":"User"},"rootComments":[],"__typename":"StackDecision","answers({\"first\":2})":{"type":"id","generated":true,"id":"$StackDecision:101031322381293980.answers({\"first\":2})","typename":"StackDecisionConnection"}},"$StackDecision:101031322381293980.permissions":{"edit":false,"delete":false,"__typename":"Permissions"},"$StackDecision:101031322381293980.link":{"url":"https://stackshare.io/shopify/e-commerce-at-scale-inside-shopifys-tech-stack","title":"E-Commerce at Scale: Inside Shopify's Tech Stack - Shopify Tech Stack | StackShare","imageUrl":"","__typename":"Link"},"$StackDecision:101031322381293980.answers({\"first\":2})":{"count":0,"pageInfo":{"type":"id","generated":true,"id":"$StackDecision:101031322381293980.answers({\"first\":2}).pageInfo","typename":"PageInfo"},"edges":[],"__typename":"StackDecisionConnection"},"$StackDecision:101031322381293980.answers({\"first\":2}).pageInfo":{"hasNextPage":false,"endCursor":null,"__typename":"PageInfo"},"$StackProfile:101231778565657394.stackDecisions({\"currentStackOnly\":true,\"first\":5}).edges.0":{"node":{"type":"id","generated":false,"id":"StackDecision:101031322381293980","typename":"StackDecision"},"__typename":"StackDecisionEdge"},"StackDecision:101031322383050818":{"id":"101031322383050818","publicId":"101031322383050818","htmlContent":"
The client-side stack of Shopify Admin has been a long journey. It started with HTML templates, jQuery and Prototype. We moved to Batman.js, our in-house Single-Page-Application framework (SPA), in 2013. Then, we re-evaluated our approach and moved back to statically rendered HTML and vanilla JavaScript. As the front-end ecosystem matured, we felt that it was time to rethink our approach again. Last year, we started working on moving Shopify Admin to React and TypeScript.\n\n Many things have changed since the days of jQuery and Batman. JavaScript execution is much faster. We can easily render our apps on the server to do less work on the client, and the resources and tooling for developers are substantially better with React than we ever had with Batman.\n\n #FrameworksFullStack #Languages","rawContent":"The client-side stack of Shopify Admin has been a long journey. It started with HTML templates, @{jQuery}|tool:1021| and @{Prototype}|tool:3597|. We moved to Batman.js, our in-house Single-Page-Application framework (SPA), in 2013. Then, we re-evaluated our approach and moved back to statically rendered HTML and vanilla @{JavaScript}|tool:1209|. As the front-end ecosystem matured, we felt that it was time to rethink our approach again. Last year, we started working on moving Shopify Admin to @{React}|tool:1020| and @{TypeScript}|tool:1612|.\r\n\r\nMany things have changed since the days of jQuery and Batman. JavaScript execution is much faster. We can easily render our apps on the server to do less work on the client, and the resources and tooling for developers are substantially better with @{React}|tool:1020| than we ever had with Batman.\r\n\n@{#FrameworksFullStack}|topic:217| @{#Languages}|topic:216|","publishedAt":"2018-09-13T07:07:00Z","commentsCount":1,"private":false,"upvotesCount":22,"upvoted":false,"flagged":false,"bookmarked":false,"viewCount":2406782,"draft":false,"createdAt":"2018-09-13T07:07:31Z","decisionType":null,"showAutoGeneratedTag":false,"permissions":{"type":"id","generated":true,"id":"$StackDecision:101031322383050818.permissions","typename":"Permissions"},"subjectTools":[],"fromTools":[],"toTools":[],"link":{"type":"id","generated":true,"id":"$StackDecision:101031322383050818.link","typename":"Link"},"company":{"type":"id","generated":false,"id":"Company:101231709548158570","typename":"Company"},"topics":[{"type":"id","generated":true,"id":"StackDecision:101031322383050818.topics.0","typename":"Topic"},{"type":"id","generated":true,"id":"StackDecision:101031322383050818.topics.1","typename":"Topic"}],"stack":null,"services":[{"type":"id","generated":false,"id":"Tool:101231773849559490","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773939333405","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773849098825","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231774098455524","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231775088451918","typename":"Tool"}],"user":{"type":"id","generated":false,"id":"User:101232121295120227","typename":"User"},"rootComments":[{"type":"id","generated":false,"id":"Comment:101231709144018601","typename":"Comment"}],"__typename":"StackDecision","answers({\"first\":2})":{"type":"id","generated":true,"id":"$StackDecision:101031322383050818.answers({\"first\":2})","typename":"StackDecisionConnection"}},"$StackDecision:101031322383050818.permissions":{"edit":false,"delete":false,"__typename":"Permissions"},"$StackDecision:101031322383050818.link":{"url":"https://stackshare.io/shopify/e-commerce-at-scale-inside-shopifys-tech-stack","title":"E-Commerce at Scale: Inside Shopify's Tech Stack - Shopify Tech Stack | StackShare","imageUrl":"","__typename":"Link"},"StackDecision:101031322383050818.topics.0":{"name":"FrameworksFullStack","__typename":"Topic"},"StackDecision:101031322383050818.topics.1":{"name":"Languages","__typename":"Topic"},"Tool:101231773849559490":{"id":"101231773849559490","name":"jQuery","slug":"jquery","title":"The Write Less, Do More, JavaScript Library.","verified":false,"imageUrl":"https://img.stackshare.io/service/1021/lxEKmMnB_400x400.jpg","canonicalUrl":"/jquery","path":"/jquery","votes":6557,"fans":82501,"stacks":191892,"followingTool":false,"followContext":null,"__typename":"Tool"},"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":8072,"fans":312791,"stacks":360884,"followingTool":false,"followContext":null,"__typename":"Tool"},"Tool:101231774098455524":{"id":"101231774098455524","name":"TypeScript","slug":"typescript","title":"A superset of JavaScript that compiles to clean JavaScript output","verified":false,"imageUrl":"https://img.stackshare.io/service/1612/bynNY5dJ.jpg","canonicalUrl":"/typescript","path":"/typescript","votes":502,"fans":83686,"stacks":94050,"followingTool":false,"followContext":null,"__typename":"Tool"},"Tool:101231775088451918":{"id":"101231775088451918","name":"Prototype","slug":"prototype","title":"Prototype JavaScript framework","verified":false,"imageUrl":"https://img.stackshare.io/service/3597/o_bigger_400x400.png","canonicalUrl":"/prototype","path":"/prototype","votes":0,"fans":159,"stacks":2261,"followingTool":false,"followContext":null,"__typename":"Tool"},"Comment:101231709144018601":{"id":"101231709144018601","content":"Thanks for sharing! What was the outcome of moving to React and TypeScript?","postedAt":"2018-09-19T06:58:04Z","upvoted":false,"flagged":false,"upvotesCount":5,"parentId":null,"user":{"type":"id","generated":false,"id":"User:101232006145601012","typename":"User"},"__typename":"Comment","replies":[]},"User:101232006145601012":{"id":"101232006145601012","path":"/makstaks","imageUrl":"https://img.stackshare.io/user/35809/default_97e1244fc3aa7c06d9823879fe38c6c275abdfda.jpeg","displayName":"Harrison Mak","__typename":"User"},"$StackDecision:101031322383050818.answers({\"first\":2})":{"count":0,"pageInfo":{"type":"id","generated":true,"id":"$StackDecision:101031322383050818.answers({\"first\":2}).pageInfo","typename":"PageInfo"},"edges":[],"__typename":"StackDecisionConnection"},"$StackDecision:101031322383050818.answers({\"first\":2}).pageInfo":{"hasNextPage":false,"endCursor":null,"__typename":"PageInfo"},"$StackProfile:101231778565657394.stackDecisions({\"currentStackOnly\":true,\"first\":5}).edges.1":{"node":{"type":"id","generated":false,"id":"StackDecision:101031322383050818","typename":"StackDecision"},"__typename":"StackDecisionEdge"},"StackDecision:101031322380818634":{"id":"101031322380818634","publicId":"101031322380818634","htmlContent":" In 2004, Shopifyâs CEO and founder, Tobi Lütke, was building out an e-commerce store for snowboarding products. Unsatisfied with the existing e-commerce products on the market, Tobi decided to build his own SaaS platform using Ruby on Rails.\n\n At that time, Rails wasn't even 1.0 yet, and the only version of the framework was exchanged as a .zip archive by email. Tobi joined Rails creator David Heinemeier Hansson (DHH) and started contributing to Ruby on Rails while building Shopify.\n\n Shopify is now one of the world's largest and oldest Rails apps. Itâs never been rewritten and still uses the original codebase, though it has matured considerably over the past decade. All of Tobiâs original commits are still in the version control history.\n\n The bet on Rails greatly shaped how we think at Shopify and empowered us to deliver product as fast as possible. While there are parts of the framework that sometimes make it harder to scale (e.g. ActiveRecord callbacks and code organization), many of us tend to agree with Tobi that Rails is what allowed Shopify to move from a garage startup to a public company.","rawContent":"In 2004, Shopifyâs CEO and founder, Tobi Lütke, was building out an e-commerce store for snowboarding products. Unsatisfied with the existing e-commerce products on the market, Tobi decided to build his own SaaS platform using @{Ruby}|tool:989| on @{Rails}|tool:990|.\n\nAt that time, @{Rails}|tool:990| wasn't even 1.0 yet, and the only version of the framework was exchanged as a .zip archive by email. Tobi joined Rails creator David Heinemeier Hansson (DHH) and started contributing to Ruby on Rails while building Shopify.\n\nShopify is now one of the world's largest and oldest Rails apps. Itâs never been rewritten and still uses the original codebase, though it has matured considerably over the past decade. All of Tobiâs original commits are still in the version control history.\n\nThe bet on @{Rails}|tool:990| greatly shaped how we think at Shopify and empowered us to deliver product as fast as possible. While there are parts of the framework that sometimes make it harder to scale (e.g. ActiveRecord callbacks and code organization), many of us tend to agree with Tobi that Rails is what allowed Shopify to move from a garage startup to a public company.\n","publishedAt":"2018-09-13T06:53:12Z","commentsCount":0,"private":false,"upvotesCount":19,"upvoted":false,"flagged":false,"bookmarked":false,"viewCount":753063,"draft":false,"createdAt":"2018-09-13T06:53:12Z","decisionType":null,"showAutoGeneratedTag":false,"permissions":{"type":"id","generated":true,"id":"$StackDecision:101031322380818634.permissions","typename":"Permissions"},"subjectTools":[],"fromTools":[],"toTools":[],"link":{"type":"id","generated":true,"id":"$StackDecision:101031322380818634.link","typename":"Link"},"company":{"type":"id","generated":false,"id":"Company:101231709548158570","typename":"Company"},"topics":[],"stack":null,"services":[{"type":"id","generated":false,"id":"Tool:101231773835511567","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773835996572","typename":"Tool"}],"user":{"type":"id","generated":false,"id":"User:101232121295120227","typename":"User"},"rootComments":[],"__typename":"StackDecision","answers({\"first\":2})":{"type":"id","generated":true,"id":"$StackDecision:101031322380818634.answers({\"first\":2})","typename":"StackDecisionConnection"}},"$StackDecision:101031322380818634.permissions":{"edit":false,"delete":false,"__typename":"Permissions"},"$StackDecision:101031322380818634.link":{"url":"https://stackshare.io/shopify/e-commerce-at-scale-inside-shopifys-tech-stack","title":"E-Commerce at Scale: Inside Shopify's Tech Stack - Shopify Tech Stack | StackShare","imageUrl":"","__typename":"Link"},"$StackDecision:101031322380818634.answers({\"first\":2})":{"count":0,"pageInfo":{"type":"id","generated":true,"id":"$StackDecision:101031322380818634.answers({\"first\":2}).pageInfo","typename":"PageInfo"},"edges":[],"__typename":"StackDecisionConnection"},"$StackDecision:101031322380818634.answers({\"first\":2}).pageInfo":{"hasNextPage":false,"endCursor":null,"__typename":"PageInfo"},"$StackProfile:101231778565657394.stackDecisions({\"currentStackOnly\":true,\"first\":5}).edges.2":{"node":{"type":"id","generated":false,"id":"StackDecision:101031322380818634","typename":"StackDecision"},"__typename":"StackDecisionEdge"},"StackDecision:101031322382392487":{"id":"101031322382392487","publicId":"101031322382392487","htmlContent":" At Shopify, over the years, we moved from shards to the concept of \"pods\". A pod is a fully isolated instance of Shopify with its own datastores like MySQL, Redis, Memcached. A pod can be spawned in any region. This approach has helped us eliminate global outages. As of today, we have more than a hundred pods, and since moving to this architecture we haven't had any major outages that affected all of Shopify. An outage today only affects a single pod or region.\n\n As we grew into hundreds of shards and pods, it became clear that we needed a solution to orchestrate those deployments. Today, we use Docker, Kubernetes, and Google Kubernetes Engine to make it easy to bootstrap resources for new Shopify Pods.","rawContent":"At Shopify, over the years, we moved from shards to the concept of \"pods\". A pod is a fully isolated instance of Shopify with its own datastores like @{MySQL}|tool:1025|, @{Redis}|tool:1031|, @{Memcached}|tool:1040|. A pod can be spawned in any region. This approach has helped us eliminate global outages. As of today, we have more than a hundred pods, and since moving to this architecture we haven't had any major outages that affected all of Shopify. An outage today only affects a single pod or region.\n\nAs we grew into hundreds of shards and pods, it became clear that we needed a solution to orchestrate those deployments. Today, we use @{Docker}|tool:586|, @{Kubernetes}|tool:1885|, and @{Google Kubernetes Engine}|tool:1587| to make it easy to bootstrap resources for new Shopify Pods.\n","publishedAt":"2018-09-13T07:03:58Z","commentsCount":0,"private":false,"upvotesCount":17,"upvoted":false,"flagged":false,"bookmarked":false,"viewCount":1274750,"draft":false,"createdAt":"2018-09-13T07:03:58Z","decisionType":null,"showAutoGeneratedTag":false,"permissions":{"type":"id","generated":true,"id":"$StackDecision:101031322382392487.permissions","typename":"Permissions"},"subjectTools":[],"fromTools":[],"toTools":[],"link":{"type":"id","generated":true,"id":"$StackDecision:101031322382392487.link","typename":"Link"},"company":{"type":"id","generated":false,"id":"Company:101231709548158570","typename":"Company"},"topics":[],"stack":null,"services":[{"type":"id","generated":false,"id":"Tool:101231773669807419","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231774206661614","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231774087656167","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773851859414","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773854768982","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773855606480","typename":"Tool"}],"user":{"type":"id","generated":false,"id":"User:101232121295120227","typename":"User"},"rootComments":[],"__typename":"StackDecision","answers({\"first\":2})":{"type":"id","generated":true,"id":"$StackDecision:101031322382392487.answers({\"first\":2})","typename":"StackDecisionConnection"}},"$StackDecision:101031322382392487.permissions":{"edit":false,"delete":false,"__typename":"Permissions"},"$StackDecision:101031322382392487.link":{"url":"https://stackshare.io/shopify/e-commerce-at-scale-inside-shopifys-tech-stack","title":"E-Commerce at Scale: Inside Shopify's Tech Stack - Shopify Tech Stack | StackShare","imageUrl":"","__typename":"Link"},"$StackDecision:101031322382392487.answers({\"first\":2})":{"count":0,"pageInfo":{"type":"id","generated":true,"id":"$StackDecision:101031322382392487.answers({\"first\":2}).pageInfo","typename":"PageInfo"},"edges":[],"__typename":"StackDecisionConnection"},"$StackDecision:101031322382392487.answers({\"first\":2}).pageInfo":{"hasNextPage":false,"endCursor":null,"__typename":"PageInfo"},"$StackProfile:101231778565657394.stackDecisions({\"currentStackOnly\":true,\"first\":5}).edges.3":{"node":{"type":"id","generated":false,"id":"StackDecision:101031322382392487","typename":"StackDecision"},"__typename":"StackDecisionEdge"},"StackDecision:101031322381713989":{"id":"101031322381713989","publicId":"101031322381713989","htmlContent":" As is common in the Rails stack, since the very beginning, we've stayed with MySQL as a relational database, Memcached for key/value storage and Redis for queues and background jobs.\n\n In 2014, we could no longer store all our data in a single MySQL instance - even by buying better hardware. We decided to use sharding and split all of Shopify into dozens of database partitions.\n\n Sharding played nicely for us because Shopify merchants are isolated from each other and we were able to put a subset of merchants on a single shard. It would have been harder if our business assumed shared data between customers.\n\n The sharding project bought us some time regarding database capacity, but as we soon found out, there was a huge single point of failure in our infrastructure. All those shards were still using a single Redis. At one point, the outage of that Redis took down all of Shopify, causing a major disruption we later called âRedismageddonâ. This taught us an important lesson to avoid any resources that are shared across all of Shopify.\n\n Over the years, we moved from shards to the concept of \"pods\". A pod is a fully isolated instance of Shopify with its own datastores like MySQL, Redis, memcached. A pod can be spawned in any region. This approach has helped us eliminate global outages. As of today, we have more than a hundred pods, and since moving to this architecture we haven't had any major outages that affected all of Shopify. An outage today only affects a single pod or region.","rawContent":"As is common in the @{Rails}|tool:990| stack, since the very beginning, we've stayed with @{MySQL}|tool:1025| as a relational database, @{Memcached}|tool:1040| for key/value storage and @{Redis}|tool:1031| for queues and background jobs.\n\nIn 2014, we could no longer store all our data in a single MySQL instance - even by buying better hardware. We decided to use sharding and split all of Shopify into dozens of database partitions.\n\nSharding played nicely for us because Shopify merchants are isolated from each other and we were able to put a subset of merchants on a single shard. It would have been harder if our business assumed shared data between customers.\n\nThe sharding project bought us some time regarding database capacity, but as we soon found out, there was a huge single point of failure in our infrastructure. All those shards were still using a single @{Redis}|tool:1031|. At one point, the outage of that Redis took down all of Shopify, causing a major disruption we later called âRedismageddonâ. This taught us an important lesson to avoid any resources that are shared across all of Shopify.\n\nOver the years, we moved from shards to the concept of \"pods\". A pod is a fully isolated instance of Shopify with its own datastores like MySQL, Redis, memcached. A pod can be spawned in any region. This approach has helped us eliminate global outages. As of today, we have more than a hundred pods, and since moving to this architecture we haven't had any major outages that affected all of Shopify. An outage today only affects a single pod or region.\n","publishedAt":"2018-09-13T06:59:49Z","commentsCount":0,"private":false,"upvotesCount":16,"upvoted":false,"flagged":false,"bookmarked":false,"viewCount":811886,"draft":false,"createdAt":"2018-09-13T06:59:49Z","decisionType":null,"showAutoGeneratedTag":false,"permissions":{"type":"id","generated":true,"id":"$StackDecision:101031322381713989.permissions","typename":"Permissions"},"subjectTools":[],"fromTools":[],"toTools":[],"link":{"type":"id","generated":true,"id":"$StackDecision:101031322381713989.link","typename":"Link"},"company":{"type":"id","generated":false,"id":"Company:101231709548158570","typename":"Company"},"topics":[],"stack":null,"services":[{"type":"id","generated":false,"id":"Tool:101231773835996572","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773851859414","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773855606480","typename":"Tool"},{"type":"id","generated":false,"id":"Tool:101231773854768982","typename":"Tool"}],"user":{"type":"id","generated":false,"id":"User:101232121295120227","typename":"User"},"rootComments":[],"__typename":"StackDecision","answers({\"first\":2})":{"type":"id","generated":true,"id":"$StackDecision:101031322381713989.answers({\"first\":2})","typename":"StackDecisionConnection"}},"$StackDecision:101031322381713989.permissions":{"edit":false,"delete":false,"__typename":"Permissions"},"$StackDecision:101031322381713989.link":{"url":"https://stackshare.io/shopify/e-commerce-at-scale-inside-shopifys-tech-stack","title":"E-Commerce at Scale: Inside Shopify's Tech Stack - Shopify Tech Stack | StackShare","imageUrl":"","__typename":"Link"},"$StackDecision:101031322381713989.answers({\"first\":2})":{"count":0,"pageInfo":{"type":"id","generated":true,"id":"$StackDecision:101031322381713989.answers({\"first\":2}).pageInfo","typename":"PageInfo"},"edges":[],"__typename":"StackDecisionConnection"},"$StackDecision:101031322381713989.answers({\"first\":2}).pageInfo":{"hasNextPage":false,"endCursor":null,"__typename":"PageInfo"},"$StackProfile:101231778565657394.stackDecisions({\"currentStackOnly\":true,\"first\":5}).edges.4":{"node":{"type":"id","generated":false,"id":"StackDecision:101031322381713989","typename":"StackDecision"},"__typename":"StackDecisionEdge"},"$StackProfile:101231778565657394.stackItems({\"after\":null,\"first\":5,\"itemType\":\"Package\"})":{"count":2,"edges":[{"type":"id","generated":true,"id":"$StackProfile:101231778565657394.stackItems({\"after\":null,\"first\":5,\"itemType\":\"Package\"}).edges.0","typename":"StackItemEdge"},{"type":"id","generated":true,"id":"$StackProfile:101231778565657394.stackItems({\"after\":null,\"first\":5,\"itemType\":\"Package\"}).edges.1","typename":"StackItemEdge"}],"pageInfo":{"type":"id","generated":true,"id":"$StackProfile:101231778565657394.stackItems({\"after\":null,\"first\":5,\"itemType\":\"Package\"}).pageInfo","typename":"PageInfo"},"__typename":"StackItemConnection"},"Tool:104706493772256477":{"id":"104706493772256477","name":"pandas","slug":"pypi-pandas","type":"Package","imageUrl":"https://img.stackshare.io/package/19837/default_85689b353a3a9409328e253ea28d859d29151e0c.png","path":"/pypi-pandas","canonicalUrl":"/pypi-pandas","packageManager":{"type":"id","generated":true,"id":"$Tool:104706493772256477.packageManager","typename":"PackageManager"},"toolType":false,"adoptionStageContext":null,"adoptionStage({\"companySlug\":\"shopify\"})":null,"versionRules":{"type":"id","generated":true,"id":"$Tool:104706493772256477.versionRules","typename":"VersionRuleConnection"},"__typename":"Tool"},"$Tool:104706493772256477.packageManager":{"miniImageUrl":"https://img.stackshare.io/package/pypi/mini-image.svg","slug":"pypi","__typename":"PackageManager"},"$Tool:104706493772256477.versionRules":{"totalCount":0,"__typename":"VersionRuleConnection"},"$StackProfile:101231778565657394.stackItems({\"after\":null,\"first\":5,\"itemType\":\"Package\"}).edges.0.node":{"tool":{"type":"id","generated":false,"id":"Tool:104706493772256477","typename":"Tool"},"versionStage":null,"versionStageContext":null,"versionNumber":null,"majorVersionNumber":null,"__typename":"StackItem"},"$StackProfile:101231778565657394.stackItems({\"after\":null,\"first\":5,\"itemType\":\"Package\"}).edges.0":{"node":{"type":"id","generated":true,"id":"$StackProfile:101231778565657394.stackItems({\"after\":null,\"first\":5,\"itemType\":\"Package\"}).edges.0.node","typename":"StackItem"},"__typename":"StackItemEdge"},"Tool:104706503574979517":{"id":"104706503574979517","name":"pyspark","slug":"pypi-pyspark","type":"Package","imageUrl":"https://img.stackshare.io/package/20194/default_3c305c494fb38a63681703a1e2253e6fc9546c86.png","path":"/pypi-pyspark","canonicalUrl":"/pypi-pyspark","packageManager":{"type":"id","generated":true,"id":"$Tool:104706503574979517.packageManager","typename":"PackageManager"},"toolType":false,"adoptionStageContext":null,"adoptionStage({\"companySlug\":\"shopify\"})":null,"versionRules":{"type":"id","generated":true,"id":"$Tool:104706503574979517.versionRules","typename":"VersionRuleConnection"},"__typename":"Tool"},"$Tool:104706503574979517.packageManager":{"miniImageUrl":"https://img.stackshare.io/package/pypi/mini-image.svg","slug":"pypi","__typename":"PackageManager"},"$Tool:104706503574979517.versionRules":{"totalCount":0,"__typename":"VersionRuleConnection"},"$StackProfile:101231778565657394.stackItems({\"after\":null,\"first\":5,\"itemType\":\"Package\"}).edges.1.node":{"tool":{"type":"id","generated":false,"id":"Tool:104706503574979517","typename":"Tool"},"versionStage":null,"versionStageContext":null,"versionNumber":null,"majorVersionNumber":null,"__typename":"StackItem"},"$StackProfile:101231778565657394.stackItems({\"after\":null,\"first\":5,\"itemType\":\"Package\"}).edges.1":{"node":{"type":"id","generated":true,"id":"$StackProfile:101231778565657394.stackItems({\"after\":null,\"first\":5,\"itemType\":\"Package\"}).edges.1.node","typename":"StackItem"},"__typename":"StackItemEdge"},"$StackProfile:101231778565657394.stackItems({\"after\":null,\"first\":5,\"itemType\":\"Package\"}).pageInfo":{"endCursor":"Mg","hasNextPage":false,"__typename":"PageInfo"},"$Company:101231709548158570.team({\"after\":null,\"first\":10})":{"count":4,"pageInfo":{"type":"id","generated":true,"id":"$Company:101231709548158570.team({\"after\":null,\"first\":10}).pageInfo","typename":"PageInfo"},"edges":[{"type":"id","generated":true,"id":"$Company:101231709548158570.team({\"after\":null,\"first\":10}).edges.0","typename":"UserEdge"},{"type":"id","generated":true,"id":"$Company:101231709548158570.team({\"after\":null,\"first\":10}).edges.1","typename":"UserEdge"},{"type":"id","generated":true,"id":"$Company:101231709548158570.team({\"after\":null,\"first\":10}).edges.2","typename":"UserEdge"},{"type":"id","generated":true,"id":"$Company:101231709548158570.team({\"after\":null,\"first\":10}).edges.3","typename":"UserEdge"}],"__typename":"UserConnection"},"$Company:101231709548158570.team({\"after\":null,\"first\":10}).pageInfo":{"hasNextPage":false,"endCursor":"NA","__typename":"PageInfo"},"$Company:101231709548158570.team({\"after\":null,\"first\":10}).edges.0":{"node":{"type":"id","generated":false,"id":"User:101232121295120227","typename":"User"},"__typename":"UserEdge"},"$Company:101231709548158570.team({\"after\":null,\"first\":10}).edges.1":{"node":{"type":"id","generated":false,"id":"User:101232131312713023","typename":"User"},"__typename":"UserEdge"},"$Company:101231709548158570.team({\"after\":null,\"first\":10}).edges.2":{"node":{"type":"id","generated":false,"id":"User:105562146545719436","typename":"User"},"__typename":"UserEdge"},"$Company:101231709548158570.team({\"after\":null,\"first\":10}).edges.3":{"node":{"type":"id","generated":false,"id":"User:101231995200615511","typename":"User"},"__typename":"UserEdge"}}