{"id":5510,"date":"2014-05-15T11:31:16","date_gmt":"2014-05-15T11:31:16","guid":{"rendered":"http:\/\/insideintercom.io\/?p=5510"},"modified":"2020-07-30T13:03:56","modified_gmt":"2020-07-30T12:03:56","slug":"ember-delivers-rapid-improvements-at-intercom","status":"publish","type":"post","link":"https:\/\/www.intercom.com\/blog\/ember-delivers-rapid-improvements-at-intercom\/","title":{"rendered":"Ember delivers rapid improvements at Intercom"},"content":{"rendered":"<p class=\"opening_paragraph\">Rewriting core sections of your product with a framework unknown to most of your engineering team sounds crazy. But that\u2019s what we\u2019re doing within Intercom right now.<\/p>\n<p>Eight weeks ago, we began an experiment to determine if <a href=\"http:\/\/emberjs.com\/\">Ember.js<\/a> would allow us to raise the bar in terms of our product capability and development speed. We formed a small team tasked with re-implementing a core and complex section of our application, the user list. The required features included filtering, searching, sorting, selection, messaging, tagging and infinite scrolling.<\/p>\n<p>Based on the success of this project, we now have three teams working with Ember.js and we will be releasing a series of improvements to Intercom over the coming weeks.<\/p>\n<p><iframe loading=\"lazy\" width=\"600\" height=\"338\" src=\"\/\/fast.wistia.net\/embed\/iframe\/x6ml1tplpe\" name=\"wistia_embed\" frameborder=\"0\" scrolling=\"no\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/p>\n<h2 id=\"the-problem\">The Problem<\/h2>\n<p>Since its inception, Intercom has mainly consisted of a single Rails app. Rails allows small teams to be extremely productive and it is particularly well suited for the early life of a startup. As the application and engineering team size grows though, it is difficult to maintain this initial agility. The inevitable increase in application complexity has knock-on effects in terms of:<\/p>\n<ul>\n<li>Application startup time<\/li>\n<li>Test speed and TDD feedback time<\/li>\n<li>Developer productivity &amp; happiness<\/li>\n<li>Application brittleness<\/li>\n<li>Server memory usage<\/li>\n<\/ul>\n<p>The common Rails pattern of delivering a HTML page response coupled with a soup of jQuery behaviour leads to a further increase in slowness, brittleness and complexity. In Intercom, a large amount of useful data from the previous request was needlessly thrown away on each subsequent request. The page header, authenticated user, segments and counts all were regenerated on each page request.<\/p>\n<h2 id=\"the-solution\">The Solution<\/h2>\n<p>Our Ember user list has proved to be a much quicker and vastly simpler application than the Rails version. The application initially loads once and from then on has a granular conversation with our JSON APIs as the user interacts with it. The loaded page context, lost with the Rails version, is reused throughout the life of the application. Changing user segment now requires a single JSON request, not a full page reload. This obviously benefits application speed, but it also results in a simplification of role for the server application as it now focuses on a single task rather than rendering a whole page.<\/p>\n<div class=\"post_image_wrapper\"><img decoding=\"async\" src=\"https:\/\/intercom.com\/blog\/wp-content\/uploads\/2014\/05\/ember-timeline600.png\" alt=\"\" \/><\/div>\n<p>Ember has also allowed us to vastly simplify our user list codebase. Ember conventions make it clear where specific code should live. Routes are responsible for URLs and injecting models into controllers. Models are responsible for loading and persisting server side data. Controllers are responsible for application state and user actions. Templates describe the structure of rendered HTML. Views and components are responsible for low level DOM events and translating these into semantic meaning within an application.<\/p>\n<p><a href=\"http:\/\/emberjs.com\/guides\/components\/\">Ember components<\/a>, based on the W3C web component spec, allowed us to created a set of reusable UI widgets which hide their inner complexity from the rest of the application. Our segment list component is a good example. Using it in a handlebars template is a simple one liner:<\/p>\n<p dir=\"ltr\">{{segment-list-component segments=content activeSegment=segment}}<\/p>\n<p>Internally it renders a list of segments within the available width, placing additional segments in a dropdown list (which happens to be another component). It also handles window resize events, recalculating the displayed list each time. This internal complexity is hidden away from the rest of the application, \u00a0we only open up this component when we need to make a change to it.<\/p>\n<div class=\"post_image_wrapper\"><img decoding=\"async\" src=\"https:\/\/intercom.com\/blog\/wp-content\/uploads\/2014\/05\/Segments-Screen-Shot.png\" alt=\"\" \/><\/div>\n<p>The black box mechanisms that Ember provides extend to other areas too. Working on an area of an Ember application usually means making changes to a particular route and its related model, controller and template. These objects are isolated from other areas of the application resulting in a simple development context. As an engineer, I find it extremely easy to get into \u201cthe zone\u201d with Ember.<\/p>\n<p>Watching my colleagues learn Ember over the past number of weeks has been exhilarating. In each case, the initial learning curve was quickly met with a series of \u201cAha!\u201d moments followed by declarations such as \u201cThis is too easy\u201d, \u201cEmber is amazing\u201d and \u201cWhere is all the code!?\u201d. There is nothing better than working with a talented team of designers and engineers who are having fun building amazing products. Ember has certainly made it fun.<\/p>\n<div class=\"post_image_wrapper\"><img decoding=\"async\" src=\"https:\/\/intercom.com\/blog\/wp-content\/uploads\/2014\/05\/New-Ember-user-list.png\" alt=\"\" \/><\/div>\n<p>We\u2019ve built up considerable momentum with Ember recently and the next few weeks will see the roll out of the our new Ember user list, company list, inbox and messaging wizard. Our Rails app will shrink over time, becoming a simple set of clean RESTful APIs and vastly reducing the complexity of the server side of Intercom. From both the client and the server, we\u2019re raising the bar on what\u2019s possible with Intercom and Ember.js is playing an important role.<br \/>\n<em>Are you interested in working with Ember.js and Intercom? We currently have a number of <a href=\"https:\/\/www.intercom.com\/blog\/careers\">engineering roles<\/a> open in Dublin and San Francisco.<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Rewriting core sections of your product with a framework unknown to most of your engineering team sounds crazy. But that\u2019s what we\u2019re doing within Intercom right now. Eight weeks ago, we began an experiment to determine&hellip;<\/p>\n","protected":false},"author":86,"featured_media":5527,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"category":[4],"tags":[212,164,143,161,162],"coauthors":[393],"class_list":["post-5510","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-news","tag-development","tag-ember","tag-intercom","tag-product-development","tag-software"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.3 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Ember Delivers Rapid Improvements - Inside Intercom<\/title>\n<meta name=\"description\" content=\"Rewriting core sections of your product with a framework unknown to most of your engineering team sounds crazy. But that\u2019s what we\u2019re doing at Intercom.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.intercom.com\/blog\/ember-delivers-rapid-improvements-at-intercom\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Ember delivers rapid improvements at Intercom\" \/>\n<meta property=\"og:description\" content=\"Rewriting core sections of your product with a framework unknown to most of your engineering team sounds crazy. But that\u2019s what we\u2019re doing at Intercom.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.intercom.com\/blog\/ember-delivers-rapid-improvements-at-intercom\/\" \/>\n<meta property=\"og:site_name\" content=\"The Intercom Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/intercominc\" \/>\n<meta property=\"article:published_time\" content=\"2014-05-15T11:31:16+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2020-07-30T12:03:56+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.intercom.com\/blog\/wp-content\/uploads\/2014\/05\/Intercom-Ember_370.png\" \/>\n\t<meta property=\"og:image:width\" content=\"370\" \/>\n\t<meta property=\"og:image:height\" content=\"230\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Gavin Joyce\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@gavinjoyce\" \/>\n<meta name=\"twitter:site\" content=\"@intercom\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Gavin Joyce\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.intercom.com\\\/blog\\\/ember-delivers-rapid-improvements-at-intercom\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.intercom.com\\\/blog\\\/ember-delivers-rapid-improvements-at-intercom\\\/\"},\"author\":{\"name\":\"Gavin Joyce\",\"@id\":\"https:\\\/\\\/www.intercom.com\\\/blog\\\/#\\\/schema\\\/person\\\/79e83ec7372bf3c375bb7d365669be88\"},\"headline\":\"Ember delivers rapid improvements at Intercom\",\"datePublished\":\"2014-05-15T11:31:16+00:00\",\"dateModified\":\"2020-07-30T12:03:56+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.intercom.com\\\/blog\\\/ember-delivers-rapid-improvements-at-intercom\\\/\"},\"wordCount\":821,\"publisher\":{\"@id\":\"https:\\\/\\\/www.intercom.com\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.intercom.com\\\/blog\\\/ember-delivers-rapid-improvements-at-intercom\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.intercom.com\\\/blog\\\/wp-content\\\/uploads\\\/2014\\\/05\\\/Intercom-Ember_370.png\",\"keywords\":[\"development\",\"ember\",\"Intercom\",\"product development\",\"software\"],\"articleSection\":[\"News &amp; Updates\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.intercom.com\\\/blog\\\/ember-delivers-rapid-improvements-at-intercom\\\/\",\"url\":\"https:\\\/\\\/www.intercom.com\\\/blog\\\/ember-delivers-rapid-improvements-at-intercom\\\/\",\"name\":\"Ember Delivers Rapid Improvements - Inside Intercom\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.intercom.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.intercom.com\\\/blog\\\/ember-delivers-rapid-improvements-at-intercom\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.intercom.com\\\/blog\\\/ember-delivers-rapid-improvements-at-intercom\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.intercom.com\\\/blog\\\/wp-content\\\/uploads\\\/2014\\\/05\\\/Intercom-Ember_370.png\",\"datePublished\":\"2014-05-15T11:31:16+00:00\",\"dateModified\":\"2020-07-30T12:03:56+00:00\",\"description\":\"Rewriting core sections of your product with a framework unknown to most of your engineering team sounds crazy. But that\u2019s what we\u2019re doing at Intercom.\",\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.intercom.com\\\/blog\\\/ember-delivers-rapid-improvements-at-intercom\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.intercom.com\\\/blog\\\/ember-delivers-rapid-improvements-at-intercom\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.intercom.com\\\/blog\\\/wp-content\\\/uploads\\\/2014\\\/05\\\/Intercom-Ember_370.png\",\"contentUrl\":\"https:\\\/\\\/www.intercom.com\\\/blog\\\/wp-content\\\/uploads\\\/2014\\\/05\\\/Intercom-Ember_370.png\",\"width\":370,\"height\":230,\"caption\":\"intercom_loves_ember\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.intercom.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.intercom.com\\\/blog\\\/\",\"name\":\"The Intercom Blog\",\"description\":\"Articles and Podcasts on Customer Service, AI and Automation, Product, and more\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.intercom.com\\\/blog\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.intercom.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.intercom.com\\\/blog\\\/#organization\",\"name\":\"The Intercom Blog\",\"url\":\"https:\\\/\\\/www.intercom.com\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.intercom.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.intercom.com\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/08\\\/Intercom-logo-sq-black-trans.png\",\"contentUrl\":\"https:\\\/\\\/www.intercom.com\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/08\\\/Intercom-logo-sq-black-trans.png\",\"width\":1000,\"height\":1000,\"caption\":\"The Intercom Blog\"},\"image\":{\"@id\":\"https:\\\/\\\/www.intercom.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/intercominc\",\"https:\\\/\\\/x.com\\\/intercom\",\"https:\\\/\\\/www.instagram.com\\\/intercom\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/2491343\",\"https:\\\/\\\/www.pinterest.ie\\\/intercom\\\/\",\"https:\\\/\\\/www.youtube.com\\\/channel\\\/UCJG0MvLP03kyzzAkD-w98aQ\",\"https:\\\/\\\/en.wikipedia.org\\\/wiki\\\/Intercom_(company)\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.intercom.com\\\/blog\\\/#\\\/schema\\\/person\\\/79e83ec7372bf3c375bb7d365669be88\",\"name\":\"Gavin Joyce\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f7233f3a50606e1d6bd901950963db023819a6c68763714c453992ac0505b5d4?s=96&d=mm&r=pgee57bc9b05233d68817bc62e7887cf74\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f7233f3a50606e1d6bd901950963db023819a6c68763714c453992ac0505b5d4?s=96&d=mm&r=pg\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f7233f3a50606e1d6bd901950963db023819a6c68763714c453992ac0505b5d4?s=96&d=mm&r=pg\",\"caption\":\"Gavin Joyce\"},\"description\":\"Ruby &amp; Ember.js | @intercom | @restpack\",\"sameAs\":[\"http:\\\/\\\/www.gavinjoyce.com\\\/\",\"https:\\\/\\\/x.com\\\/gavinjoyce\"],\"url\":\"https:\\\/\\\/www.intercom.com\\\/blog\\\/author\\\/gavinjoyce\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Ember Delivers Rapid Improvements - Inside Intercom","description":"Rewriting core sections of your product with a framework unknown to most of your engineering team sounds crazy. But that\u2019s what we\u2019re doing at Intercom.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.intercom.com\/blog\/ember-delivers-rapid-improvements-at-intercom\/","og_locale":"en_US","og_type":"article","og_title":"Ember delivers rapid improvements at Intercom","og_description":"Rewriting core sections of your product with a framework unknown to most of your engineering team sounds crazy. But that\u2019s what we\u2019re doing at Intercom.","og_url":"https:\/\/www.intercom.com\/blog\/ember-delivers-rapid-improvements-at-intercom\/","og_site_name":"The Intercom Blog","article_publisher":"https:\/\/www.facebook.com\/intercominc","article_published_time":"2014-05-15T11:31:16+00:00","article_modified_time":"2020-07-30T12:03:56+00:00","og_image":[{"width":370,"height":230,"url":"https:\/\/www.intercom.com\/blog\/wp-content\/uploads\/2014\/05\/Intercom-Ember_370.png","type":"image\/png"}],"author":"Gavin Joyce","twitter_card":"summary_large_image","twitter_creator":"@gavinjoyce","twitter_site":"@intercom","twitter_misc":{"Written by":"Gavin Joyce","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.intercom.com\/blog\/ember-delivers-rapid-improvements-at-intercom\/#article","isPartOf":{"@id":"https:\/\/www.intercom.com\/blog\/ember-delivers-rapid-improvements-at-intercom\/"},"author":{"name":"Gavin Joyce","@id":"https:\/\/www.intercom.com\/blog\/#\/schema\/person\/79e83ec7372bf3c375bb7d365669be88"},"headline":"Ember delivers rapid improvements at Intercom","datePublished":"2014-05-15T11:31:16+00:00","dateModified":"2020-07-30T12:03:56+00:00","mainEntityOfPage":{"@id":"https:\/\/www.intercom.com\/blog\/ember-delivers-rapid-improvements-at-intercom\/"},"wordCount":821,"publisher":{"@id":"https:\/\/www.intercom.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.intercom.com\/blog\/ember-delivers-rapid-improvements-at-intercom\/#primaryimage"},"thumbnailUrl":"https:\/\/www.intercom.com\/blog\/wp-content\/uploads\/2014\/05\/Intercom-Ember_370.png","keywords":["development","ember","Intercom","product development","software"],"articleSection":["News &amp; Updates"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.intercom.com\/blog\/ember-delivers-rapid-improvements-at-intercom\/","url":"https:\/\/www.intercom.com\/blog\/ember-delivers-rapid-improvements-at-intercom\/","name":"Ember Delivers Rapid Improvements - Inside Intercom","isPartOf":{"@id":"https:\/\/www.intercom.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.intercom.com\/blog\/ember-delivers-rapid-improvements-at-intercom\/#primaryimage"},"image":{"@id":"https:\/\/www.intercom.com\/blog\/ember-delivers-rapid-improvements-at-intercom\/#primaryimage"},"thumbnailUrl":"https:\/\/www.intercom.com\/blog\/wp-content\/uploads\/2014\/05\/Intercom-Ember_370.png","datePublished":"2014-05-15T11:31:16+00:00","dateModified":"2020-07-30T12:03:56+00:00","description":"Rewriting core sections of your product with a framework unknown to most of your engineering team sounds crazy. But that\u2019s what we\u2019re doing at Intercom.","inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.intercom.com\/blog\/ember-delivers-rapid-improvements-at-intercom\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.intercom.com\/blog\/ember-delivers-rapid-improvements-at-intercom\/#primaryimage","url":"https:\/\/www.intercom.com\/blog\/wp-content\/uploads\/2014\/05\/Intercom-Ember_370.png","contentUrl":"https:\/\/www.intercom.com\/blog\/wp-content\/uploads\/2014\/05\/Intercom-Ember_370.png","width":370,"height":230,"caption":"intercom_loves_ember"},{"@type":"WebSite","@id":"https:\/\/www.intercom.com\/blog\/#website","url":"https:\/\/www.intercom.com\/blog\/","name":"The Intercom Blog","description":"Articles and Podcasts on Customer Service, AI and Automation, Product, and more","publisher":{"@id":"https:\/\/www.intercom.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.intercom.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.intercom.com\/blog\/#organization","name":"The Intercom Blog","url":"https:\/\/www.intercom.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.intercom.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.intercom.com\/blog\/wp-content\/uploads\/2019\/08\/Intercom-logo-sq-black-trans.png","contentUrl":"https:\/\/www.intercom.com\/blog\/wp-content\/uploads\/2019\/08\/Intercom-logo-sq-black-trans.png","width":1000,"height":1000,"caption":"The Intercom Blog"},"image":{"@id":"https:\/\/www.intercom.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/intercominc","https:\/\/x.com\/intercom","https:\/\/www.instagram.com\/intercom\/","https:\/\/www.linkedin.com\/company\/2491343","https:\/\/www.pinterest.ie\/intercom\/","https:\/\/www.youtube.com\/channel\/UCJG0MvLP03kyzzAkD-w98aQ","https:\/\/en.wikipedia.org\/wiki\/Intercom_(company)"]},{"@type":"Person","@id":"https:\/\/www.intercom.com\/blog\/#\/schema\/person\/79e83ec7372bf3c375bb7d365669be88","name":"Gavin Joyce","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/f7233f3a50606e1d6bd901950963db023819a6c68763714c453992ac0505b5d4?s=96&d=mm&r=pgee57bc9b05233d68817bc62e7887cf74","url":"https:\/\/secure.gravatar.com\/avatar\/f7233f3a50606e1d6bd901950963db023819a6c68763714c453992ac0505b5d4?s=96&d=mm&r=pg","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f7233f3a50606e1d6bd901950963db023819a6c68763714c453992ac0505b5d4?s=96&d=mm&r=pg","caption":"Gavin Joyce"},"description":"Ruby &amp; Ember.js | @intercom | @restpack","sameAs":["http:\/\/www.gavinjoyce.com\/","https:\/\/x.com\/gavinjoyce"],"url":"https:\/\/www.intercom.com\/blog\/author\/gavinjoyce\/"}]}},"jetpack_featured_media_url":"https:\/\/www.intercom.com\/blog\/wp-content\/uploads\/2014\/05\/Intercom-Ember_370.png","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.intercom.com\/blog\/wp-json\/wp\/v2\/posts\/5510","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.intercom.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.intercom.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.intercom.com\/blog\/wp-json\/wp\/v2\/users\/86"}],"replies":[{"embeddable":true,"href":"https:\/\/www.intercom.com\/blog\/wp-json\/wp\/v2\/comments?post=5510"}],"version-history":[{"count":0,"href":"https:\/\/www.intercom.com\/blog\/wp-json\/wp\/v2\/posts\/5510\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.intercom.com\/blog\/wp-json\/wp\/v2\/media\/5527"}],"wp:attachment":[{"href":"https:\/\/www.intercom.com\/blog\/wp-json\/wp\/v2\/media?parent=5510"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.intercom.com\/blog\/wp-json\/wp\/v2\/category?post=5510"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.intercom.com\/blog\/wp-json\/wp\/v2\/tags?post=5510"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.intercom.com\/blog\/wp-json\/wp\/v2\/coauthors?post=5510"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}