{"id":18196,"date":"2017-08-08T12:15:36","date_gmt":"2017-08-08T09:15:36","guid":{"rendered":"https:\/\/www.webcodegeeks.com\/?p=18196"},"modified":"2017-08-08T11:41:06","modified_gmt":"2017-08-08T08:41:06","slug":"building-remote-caching-system-sequel","status":"publish","type":"post","link":"https:\/\/www.webcodegeeks.com\/devops\/building-remote-caching-system-sequel\/","title":{"rendered":"Building a Remote Caching System: The Sequel"},"content":{"rendered":"<p>Last fall, Docker made some big changes that required us to overhaul how our Codeship Pro image caching system worked. Our director of engineering, Laura Frank, published a <a href=\"https:\/\/www.webcodegeeks.com\/devops\/building-remote-caching-system\/\">blog post explaining everything<\/a> back when we launched this new system.<\/p>\n<p>The gist of this was that Docker no longer allowed images pulled from a remote source to be used as a cache source. This was a security measure to prevent cache poisoning. The workaround to this was to rely on the save and load commands to package up your images and store them on S3 as tarballs. This took a lot more time to do, per image, for a variety of reasons; Laura\u2019s blog post will explain it all in more detail.<\/p>\n<p>Now, though, we\u2019re undoing all of that\u2026because Docker restored the original functionality and made it possible for us to use remote images as a local cache source again.<\/p>\n<p>For you, this means much faster image caching on your builds. For us, it means we\u2019re using an Amazon-backed registry with much less disk space and much less overhead to offer a much better experience and faster build times for Codeship Pro builds! If you can\u2019t tell, we\u2019re very excited about improving the performance of our caching system.<\/p>\n<blockquote><p><a href=\"http:\/\/cms.codeship.com\/procaching\">Watch the engineer who\u2019s working on our caching system discuss the update.<\/a><\/p><\/blockquote>\n<h2>Registry-based System Security and Benchmarks<\/h2>\n<p>Let\u2019s take a minute to talk about the how and why of these changes a bit more.<\/p>\n<h3>What is the new system in more detail?<\/h3>\n<p>Essentially, after your builds complete, we push any images you have enabled caching for \u2014 using your simple <code>cached: true<\/code> directive attached to your services, as defined in your <a href=\"https:\/\/documentation.codeship.com\/pro\/builds-and-configuration\/services\/\">codeship-services.yml<\/a> file \u2014 to an Amazon-backed registry we maintain.<\/p>\n<p>These images are set up on registry accounts with credentials unique to your project. No other project has backend access to your cached images, and there is no centrally accessible pool of cached images under a single account.<\/p>\n<p>We\u2019re big fans of deferring security to more complex and larger providers, like AWS, where we can. Rather than host our own registry infrastructure and add a new security apparatus to our infrastructure support operations, we made the call that using AWS for this purpose would provide more reliable security than we could internally compete with at our size.<\/p>\n<h3>Let\u2019s look at performance<\/h3>\n<p>Speed was the main reason we made this change, and the benchmarks we have indicate that the gains for most builds will be quite substantial. Additionally, because we no longer need to save parent image data and because registries are much smarter at only saving differentials between images than the full tarball we previously had to rely on, you can see it has a huge dent in the disk space the system requires as well.<\/p>\n<ul>\n<li><strong>React + Postgres<\/strong>: 40% Faster <em>(6 minutes saved)<\/em><\/li>\n<li><strong>Rails + Postgres<\/strong>: 22% Faster <em>(4 minutes saved)<\/em><\/li>\n<li><strong>Node + Postgres<\/strong>: 56% Faster <em>(12 minutes saved)<\/em><\/li>\n<li><strong>Node + Selenium<\/strong>: 30% Faster <em>(5 minutes saved)<\/em><\/li>\n<\/ul>\n<h2>Optimizing for Caching<\/h2>\n<p>Before wrapping up, let\u2019s also discuss the internals of how image-based caching works so that you can design your Docker projects to get the most out of a caching system.<\/p>\n<p>Caching is layer-by-layer, just like your Docker images. Every specific command in your Dockerfile generates a new Docker layer. So combining two commands into a single command reduces the layer count by one. Inversely, breaking a single command out into multiple commands adds additional layers.<\/p>\n<p>This is important to keep in mind, because when your cached services are built during your Codeship Pro build run, cached layers can be reused only up to the point of a breaking change. Once we hit a layer that\u2019s different from your last build \u2014 let\u2019s say your code has changed \u2014 Docker will rebuild the rest of the image from that point on. This kind of architecture has some key design considerations for you as a result:<\/p>\n<ul>\n<li>Move breaking changes farther down in your Dockerfile<\/li>\n<li>Combining statements can reduce image complexity, if they\u2019re not brittle layers<\/li>\n<li>Adding your code should be one of the last things you do in your images<\/li>\n<li>Be mindful of dependencies and how dependency changes may invalidate the rest of the cached image<\/li>\n<\/ul>\n<p>If you\u2019re looking for more information on optimizing your builds to make the best use of caching, you can read <a href=\"https:\/\/blog.codeship.com\/speeding-up-your-docker-based-builds-with-codeship\/\">our blog post on the topic<\/a> for more suggestions and examples.<\/p>\n<div class=\"attribution\">\n<table>\n<tbody>\n<tr>\n<td><span class=\"reference\">Reference: <\/span><\/td>\n<td><a href=\"https:\/\/blog.codeship.com\/building-a-remote-caching-system-the-sequel\/\">Building a Remote Caching System: The Sequel<\/a> from our <a href=\"http:\/\/www.webcodegeeks.com\/join-us\/wcg\/\">WCG partner<\/a> Ethan Jones at the <a href=\"http:\/\/blog.codeship.com\/\">Codeship Blog<\/a> blog.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Last fall, Docker made some big changes that required us to overhaul how our Codeship Pro image caching system worked. Our director of engineering, Laura Frank, published a blog post explaining everything back when we launched this new system. The gist of this was that Docker no longer allowed images pulled from a remote source &hellip;<\/p>\n","protected":false},"author":1184,"featured_media":10356,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[17],"tags":[487,217],"class_list":["post-18196","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-devops","tag-caching","tag-docker"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Building a Remote Caching System: The Sequel - Web Code Geeks - 2026<\/title>\n<meta name=\"description\" content=\"Last fall, Docker made some big changes that required us to overhaul how our Codeship Pro image caching system worked. Our director of engineering, Laura\" \/>\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.webcodegeeks.com\/devops\/building-remote-caching-system-sequel\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Building a Remote Caching System: The Sequel - Web Code Geeks - 2026\" \/>\n<meta property=\"og:description\" content=\"Last fall, Docker made some big changes that required us to overhaul how our Codeship Pro image caching system worked. Our director of engineering, Laura\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.webcodegeeks.com\/devops\/building-remote-caching-system-sequel\/\" \/>\n<meta property=\"og:site_name\" content=\"Web Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/webcodegeeks\" \/>\n<meta property=\"article:published_time\" content=\"2017-08-08T09:15:36+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2016\/01\/docker-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Ethan Jones\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@webcodegeeks\" \/>\n<meta name=\"twitter:site\" content=\"@webcodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Ethan Jones\" \/>\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.webcodegeeks.com\/devops\/building-remote-caching-system-sequel\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/devops\/building-remote-caching-system-sequel\/\"},\"author\":{\"name\":\"Ethan Jones\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/0549db3f4b24fede869d6da6b45910e6\"},\"headline\":\"Building a Remote Caching System: The Sequel\",\"datePublished\":\"2017-08-08T09:15:36+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/devops\/building-remote-caching-system-sequel\/\"},\"wordCount\":757,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/devops\/building-remote-caching-system-sequel\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2016\/01\/docker-logo.jpg\",\"keywords\":[\"Caching\",\"Docker\"],\"articleSection\":[\"DevOps\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.webcodegeeks.com\/devops\/building-remote-caching-system-sequel\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.webcodegeeks.com\/devops\/building-remote-caching-system-sequel\/\",\"url\":\"https:\/\/www.webcodegeeks.com\/devops\/building-remote-caching-system-sequel\/\",\"name\":\"Building a Remote Caching System: The Sequel - Web Code Geeks - 2026\",\"isPartOf\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/devops\/building-remote-caching-system-sequel\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/devops\/building-remote-caching-system-sequel\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2016\/01\/docker-logo.jpg\",\"datePublished\":\"2017-08-08T09:15:36+00:00\",\"description\":\"Last fall, Docker made some big changes that required us to overhaul how our Codeship Pro image caching system worked. Our director of engineering, Laura\",\"breadcrumb\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/devops\/building-remote-caching-system-sequel\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.webcodegeeks.com\/devops\/building-remote-caching-system-sequel\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/devops\/building-remote-caching-system-sequel\/#primaryimage\",\"url\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2016\/01\/docker-logo.jpg\",\"contentUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2016\/01\/docker-logo.jpg\",\"width\":150,\"height\":150},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.webcodegeeks.com\/devops\/building-remote-caching-system-sequel\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.webcodegeeks.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"DevOps\",\"item\":\"https:\/\/www.webcodegeeks.com\/category\/devops\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Building a Remote Caching System: The Sequel\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#website\",\"url\":\"https:\/\/www.webcodegeeks.com\/\",\"name\":\"Web Code Geeks\",\"description\":\"Web Developers Resource Center\",\"publisher\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.webcodegeeks.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\/\/www.webcodegeeks.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png\",\"contentUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/webcodegeeks\",\"https:\/\/x.com\/webcodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/0549db3f4b24fede869d6da6b45910e6\",\"name\":\"Ethan Jones\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/f53b512c546b207d78a98e34674b81e08595f034c7eb17e2d8e9d368bd2dd44b?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/f53b512c546b207d78a98e34674b81e08595f034c7eb17e2d8e9d368bd2dd44b?s=96&d=mm&r=g\",\"caption\":\"Ethan Jones\"},\"description\":\"Ethan Jones is a support engineer at Codeship. You might know Ethan from Codeship webinars or eBooks. If you're a Codeship user you most probably interacted with Ethan before.\",\"sameAs\":[\"https:\/\/blog.codeship.com\"],\"url\":\"https:\/\/www.webcodegeeks.com\/author\/ethan-jones\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Building a Remote Caching System: The Sequel - Web Code Geeks - 2026","description":"Last fall, Docker made some big changes that required us to overhaul how our Codeship Pro image caching system worked. Our director of engineering, Laura","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.webcodegeeks.com\/devops\/building-remote-caching-system-sequel\/","og_locale":"en_US","og_type":"article","og_title":"Building a Remote Caching System: The Sequel - Web Code Geeks - 2026","og_description":"Last fall, Docker made some big changes that required us to overhaul how our Codeship Pro image caching system worked. Our director of engineering, Laura","og_url":"https:\/\/www.webcodegeeks.com\/devops\/building-remote-caching-system-sequel\/","og_site_name":"Web Code Geeks","article_publisher":"https:\/\/www.facebook.com\/webcodegeeks","article_published_time":"2017-08-08T09:15:36+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2016\/01\/docker-logo.jpg","type":"image\/jpeg"}],"author":"Ethan Jones","twitter_card":"summary_large_image","twitter_creator":"@webcodegeeks","twitter_site":"@webcodegeeks","twitter_misc":{"Written by":"Ethan Jones","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.webcodegeeks.com\/devops\/building-remote-caching-system-sequel\/#article","isPartOf":{"@id":"https:\/\/www.webcodegeeks.com\/devops\/building-remote-caching-system-sequel\/"},"author":{"name":"Ethan Jones","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/0549db3f4b24fede869d6da6b45910e6"},"headline":"Building a Remote Caching System: The Sequel","datePublished":"2017-08-08T09:15:36+00:00","mainEntityOfPage":{"@id":"https:\/\/www.webcodegeeks.com\/devops\/building-remote-caching-system-sequel\/"},"wordCount":757,"commentCount":0,"publisher":{"@id":"https:\/\/www.webcodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.webcodegeeks.com\/devops\/building-remote-caching-system-sequel\/#primaryimage"},"thumbnailUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2016\/01\/docker-logo.jpg","keywords":["Caching","Docker"],"articleSection":["DevOps"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.webcodegeeks.com\/devops\/building-remote-caching-system-sequel\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.webcodegeeks.com\/devops\/building-remote-caching-system-sequel\/","url":"https:\/\/www.webcodegeeks.com\/devops\/building-remote-caching-system-sequel\/","name":"Building a Remote Caching System: The Sequel - Web Code Geeks - 2026","isPartOf":{"@id":"https:\/\/www.webcodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.webcodegeeks.com\/devops\/building-remote-caching-system-sequel\/#primaryimage"},"image":{"@id":"https:\/\/www.webcodegeeks.com\/devops\/building-remote-caching-system-sequel\/#primaryimage"},"thumbnailUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2016\/01\/docker-logo.jpg","datePublished":"2017-08-08T09:15:36+00:00","description":"Last fall, Docker made some big changes that required us to overhaul how our Codeship Pro image caching system worked. Our director of engineering, Laura","breadcrumb":{"@id":"https:\/\/www.webcodegeeks.com\/devops\/building-remote-caching-system-sequel\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.webcodegeeks.com\/devops\/building-remote-caching-system-sequel\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/devops\/building-remote-caching-system-sequel\/#primaryimage","url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2016\/01\/docker-logo.jpg","contentUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2016\/01\/docker-logo.jpg","width":150,"height":150},{"@type":"BreadcrumbList","@id":"https:\/\/www.webcodegeeks.com\/devops\/building-remote-caching-system-sequel\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.webcodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"DevOps","item":"https:\/\/www.webcodegeeks.com\/category\/devops\/"},{"@type":"ListItem","position":3,"name":"Building a Remote Caching System: The Sequel"}]},{"@type":"WebSite","@id":"https:\/\/www.webcodegeeks.com\/#website","url":"https:\/\/www.webcodegeeks.com\/","name":"Web Code Geeks","description":"Web Developers Resource Center","publisher":{"@id":"https:\/\/www.webcodegeeks.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.webcodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.webcodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.webcodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/webcodegeeks","https:\/\/x.com\/webcodegeeks"]},{"@type":"Person","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/0549db3f4b24fede869d6da6b45910e6","name":"Ethan Jones","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/f53b512c546b207d78a98e34674b81e08595f034c7eb17e2d8e9d368bd2dd44b?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f53b512c546b207d78a98e34674b81e08595f034c7eb17e2d8e9d368bd2dd44b?s=96&d=mm&r=g","caption":"Ethan Jones"},"description":"Ethan Jones is a support engineer at Codeship. You might know Ethan from Codeship webinars or eBooks. If you're a Codeship user you most probably interacted with Ethan before.","sameAs":["https:\/\/blog.codeship.com"],"url":"https:\/\/www.webcodegeeks.com\/author\/ethan-jones\/"}]}},"_links":{"self":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts\/18196","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/users\/1184"}],"replies":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/comments?post=18196"}],"version-history":[{"count":0,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts\/18196\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/media\/10356"}],"wp:attachment":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/media?parent=18196"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/categories?post=18196"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/tags?post=18196"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}