{"id":12239,"date":"2019-01-17T03:30:08","date_gmt":"2019-01-17T11:30:08","guid":{"rendered":"https:\/\/engineering.fb.com\/?p=12239"},"modified":"2020-05-20T20:08:24","modified_gmt":"2020-05-21T03:08:24","slug":"spectrum","status":"publish","type":"post","link":"https:\/\/engineering.fb.com\/2019\/01\/17\/developer-tools\/spectrum\/","title":{"rendered":"Facebook open-sources Spectrum 1.0.0 for better mobile image production"},"content":{"rendered":"<p>As mobile camera hardware rapidly improves, our phones capture and store larger and larger files. Uploading these large files can eat up mobile data; it can take forever for them to load; and, sometimes, the files fail to load at all. To make the upload process more efficient, we developed <a href=\"https:\/\/libspectrum.io\/\">Spectrum<\/a>, an image processing library for Android and iOS. With Spectrum, we have improved the reliability and quality of image uploads at a large scale across our apps. We recently presented Spectrum as an open source project at <a href=\"https:\/\/www.sf.droidcon.com\/\">droidcon SF<\/a>, and, today, we are officially releasing <a href=\"https:\/\/github.com\/facebookincubator\/spectrum\">Spectrum 1.0.0<\/a> on GitHub.<\/p>\n<h2>The path to better mobile image production<\/h2>\n<p>Step one begins before an image is uploaded. By reducing the file size through transcoding, we can quickly reduce data consumption and improve upload reliability. It&#8217;s a simple solution, but reducing size while maintaining quality requires a deep understanding of the various processing steps and image formats.<\/p>\n<p>Using the platform-provided APIs for image processing is one possible solution. But numerous mobile platforms and evolving APIs can result in divergent output. To serve a broad developer base, platforms hide details and parameters that we want to control to optimize the output. Often, common tasks, such as interpretation of EXIF metadata, can result in code duplication that hinders maintenance and global improvements. And making use of the latest compression libraries, such as MozJpeg, requires writing native code in C\/C++. We wanted to make it easier for developers to send smaller files while maintaining control of the image quality \u2014 without needing to write custom or hard-to-maintain solutions.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-12749 size-full\" src=\"https:\/\/engineering.fb.com\/wp-content\/uploads\/2019\/01\/spectrum1.jpg\" alt=\"\" width=\"2000\" height=\"1125\" srcset=\"https:\/\/engineering.fb.com\/wp-content\/uploads\/2019\/01\/spectrum1.jpg 2000w, https:\/\/engineering.fb.com\/wp-content\/uploads\/2019\/01\/spectrum1.jpg?resize=580,326 580w, https:\/\/engineering.fb.com\/wp-content\/uploads\/2019\/01\/spectrum1.jpg?resize=916,515 916w, https:\/\/engineering.fb.com\/wp-content\/uploads\/2019\/01\/spectrum1.jpg?resize=768,432 768w, https:\/\/engineering.fb.com\/wp-content\/uploads\/2019\/01\/spectrum1.jpg?resize=1024,576 1024w, https:\/\/engineering.fb.com\/wp-content\/uploads\/2019\/01\/spectrum1.jpg?resize=1536,864 1536w, https:\/\/engineering.fb.com\/wp-content\/uploads\/2019\/01\/spectrum1.jpg?resize=96,54 96w, https:\/\/engineering.fb.com\/wp-content\/uploads\/2019\/01\/spectrum1.jpg?resize=192,108 192w\" sizes=\"auto, (max-width: 992px) 100vw, 62vw\" \/><\/p>\n<p><i>As modern smartphones capture high-resolution images, the large file size makes uploads unreliable on some mobile networks. Sending it at full resolution is often wasteful, as the content delivery network (CDN) will resize the image for the recipient anyway.<\/i><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-12750 size-full\" src=\"https:\/\/engineering.fb.com\/wp-content\/uploads\/2019\/01\/Spectrum2.jpg\" alt=\"\" width=\"2000\" height=\"1125\" srcset=\"https:\/\/engineering.fb.com\/wp-content\/uploads\/2019\/01\/Spectrum2.jpg 2000w, https:\/\/engineering.fb.com\/wp-content\/uploads\/2019\/01\/Spectrum2.jpg?resize=580,326 580w, https:\/\/engineering.fb.com\/wp-content\/uploads\/2019\/01\/Spectrum2.jpg?resize=916,515 916w, https:\/\/engineering.fb.com\/wp-content\/uploads\/2019\/01\/Spectrum2.jpg?resize=768,432 768w, https:\/\/engineering.fb.com\/wp-content\/uploads\/2019\/01\/Spectrum2.jpg?resize=1024,576 1024w, https:\/\/engineering.fb.com\/wp-content\/uploads\/2019\/01\/Spectrum2.jpg?resize=1536,864 1536w, https:\/\/engineering.fb.com\/wp-content\/uploads\/2019\/01\/Spectrum2.jpg?resize=96,54 96w, https:\/\/engineering.fb.com\/wp-content\/uploads\/2019\/01\/Spectrum2.jpg?resize=192,108 192w\" sizes=\"auto, (max-width: 992px) 100vw, 62vw\" \/><\/p>\n<p><i>Resizing the image on the sender&#8217;s device reduces the bandwidth required to send the image. As a result, the entire pipeline has minimal payload overhead, improving the end-to-end experience. The remaining challenge is how to maintain image quality while benefiting from the smaller file.<\/i><\/p>\n<h2>Spectrum: Building image processing infrastructure<\/h2>\n<p>Spectrum makes common image operations simple, efficient, and consistent for mobile developers. Its declarative API allows developers to focus on the desired output properties instead of the individual steps. Subsequently, this allows Spectrum to transparently choose the optimal way to fulfill the transcoding request. For instance, when given the opportunity, Spectrum prefers<a href=\"https:\/\/libspectrum.io\/docs\/supported_image_formats\"> lossless operations for cropping and rotating JPEG images<\/a>. Another example is <a href=\"https:\/\/libspectrum.io\/docs\/resizing_images\">resizing<\/a>, where Spectrum optimizes the interplay between decoder sampling and pixel-perfect resizing.<\/p>\n<p>&#8220;Recipes&#8221; help developers choose the optimal execution sequence for the individual requests. Plugins provide these. For example, the JPEG plugin will provide recipes for the lossless cropping and rotation of JPEG images. All recipes are aggregated internally and sorted such that lossless and efficient recipes are at the top. With every request, Spectrum will iterate the list to execute the first matching (and therefore most efficient) recipe. The last resort is a generic recipe that can handle any request by decoding and encoding the image.<\/p>\n<p>The core of Spectrum is written in C++. This allows for sharing between our apps on Android and iOS, thus making our outputs more consistent. The offered <a href=\"https:\/\/libspectrum.io\/docs\/getting_started_android\">Java<\/a> and <a href=\"https:\/\/libspectrum.io\/docs\/getting_started_ios\">Objective-C<\/a> APIs are just thin wrappers around this core to make development easier. Furthermore, the C++ core provides greater control over allocations and often allows higher execution speed for computational intensive operations.<\/p>\n<p>Integration with native libraries such as <a href=\"https:\/\/github.com\/mozilla\/mozjpeg\">MozJpeg<\/a> allows Spectrum to control encoding parameters beyond the general purpose platform APIs. It allows developers to utilize computationally intensive encoding, which requires more processing time but significantly reduces the file size. Examples are trellis quantization and scan optimization. This is an important trade-off on mobile, where a slow network connection can dominate the upload experience. It also allows us to control more advanced parameters such as <a href=\"https:\/\/en.wikipedia.org\/wiki\/Chroma_subsampling\">chroma subsampling<\/a> to improve the quality of images with sharp edges and illustrations. The consistent API makes these features accessible to developers who are not image experts.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-12751 size-full\" src=\"https:\/\/engineering.fb.com\/wp-content\/uploads\/2019\/01\/Spectrum3.jpg\" alt=\"The core of the library is implemented in C++. It matches incoming requests against a set of \u201crecipes\u201d that can fulfill the image operation. Here, preference is given to more efficient and lossless operations. Plugins provide support for image formats and additional recipes.\" width=\"2000\" height=\"1125\" srcset=\"https:\/\/engineering.fb.com\/wp-content\/uploads\/2019\/01\/Spectrum3.jpg 2000w, https:\/\/engineering.fb.com\/wp-content\/uploads\/2019\/01\/Spectrum3.jpg?resize=580,326 580w, https:\/\/engineering.fb.com\/wp-content\/uploads\/2019\/01\/Spectrum3.jpg?resize=916,515 916w, https:\/\/engineering.fb.com\/wp-content\/uploads\/2019\/01\/Spectrum3.jpg?resize=768,432 768w, https:\/\/engineering.fb.com\/wp-content\/uploads\/2019\/01\/Spectrum3.jpg?resize=1024,576 1024w, https:\/\/engineering.fb.com\/wp-content\/uploads\/2019\/01\/Spectrum3.jpg?resize=1536,864 1536w, https:\/\/engineering.fb.com\/wp-content\/uploads\/2019\/01\/Spectrum3.jpg?resize=96,54 96w, https:\/\/engineering.fb.com\/wp-content\/uploads\/2019\/01\/Spectrum3.jpg?resize=192,108 192w\" sizes=\"auto, (max-width: 992px) 100vw, 62vw\" \/><\/p>\n<p><i>The core of the library is implemented in C++. It matches incoming requests against a set of \u201crecipes\u201d that can fulfill the image operation. Here, preference is given to more efficient and lossless operations. Plugins provide support for image formats and additional recipes.<\/i><\/p>\n<p>We hope Spectrum will benefit developers in the same way it has helped Facebook create a better image production experience. In our apps, Spectrum has improved the reliability and quality of image uploads at large scale across our apps. The default integration with Mozilla JPEG allows a reduction of up to 15 percent in upload file size compared with a baseline encoder. We are excited to see how the community uses the <a href=\"https:\/\/github.com\/facebookincubator\/spectrum\">Spectrum 1.0.0<\/a> library to improve the photo experiences in applications.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>As mobile camera hardware rapidly improves, our phones capture and store larger and larger files. Uploading these large files can eat up mobile data; it can take forever for them to load; and, sometimes, the files fail to load at all. To make the upload process more efficient, we developed Spectrum, an image processing library [&#8230;]<\/p>\n<p><a class=\"btn btn-secondary understrap-read-more-link\" href=\"https:\/\/engineering.fb.com\/2019\/01\/17\/developer-tools\/spectrum\/\">Read More&#8230;<\/a><\/p>\n","protected":false},"author":1,"featured_media":12747,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[4,66,5,174],"tags":[],"coauthors":[1603,385],"class_list":["post-12239","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-android","category-developer-tools","category-ios","category-open-source","fb_content_type-article"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v19.3 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Open-sourcing Spectrum 1.0.0 for mobile image uploads - Engineering at Meta<\/title>\n<meta name=\"description\" content=\"To make the mobile image upload process more efficient, we are releasing Spectrum 1.0.0, an image processing library for Android and iOS.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/engineering.fb.com\/2019\/01\/17\/developer-tools\/spectrum\/\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Daniel Hugenroth, changigi649\" \/>\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:\\\/\\\/engineering.fb.com\\\/2019\\\/01\\\/17\\\/developer-tools\\\/spectrum\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/engineering.fb.com\\\/2019\\\/01\\\/17\\\/developer-tools\\\/spectrum\\\/\"},\"author\":{\"@id\":\"https:\\\/\\\/engineering.fb.com\\\/2019\\\/01\\\/17\\\/developer-tools\\\/spectrum\\\/#author\",\"name\":\"\"},\"headline\":\"Facebook open-sources Spectrum 1.0.0 for better mobile image production\",\"datePublished\":\"2019-01-17T11:30:08+00:00\",\"dateModified\":\"2020-05-21T03:08:24+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/engineering.fb.com\\\/2019\\\/01\\\/17\\\/developer-tools\\\/spectrum\\\/\"},\"wordCount\":803,\"publisher\":{\"@id\":\"https:\\\/\\\/engineering.fb.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/engineering.fb.com\\\/2019\\\/01\\\/17\\\/developer-tools\\\/spectrum\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/engineering.fb.com\\\/wp-content\\\/uploads\\\/2019\\\/01\\\/SpectrumHero.jpg\",\"articleSection\":[\"Android\",\"DevInfra\",\"iOS\",\"Open Source\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/engineering.fb.com\\\/2019\\\/01\\\/17\\\/developer-tools\\\/spectrum\\\/\",\"url\":\"https:\\\/\\\/engineering.fb.com\\\/2019\\\/01\\\/17\\\/developer-tools\\\/spectrum\\\/\",\"name\":\"Open-sourcing Spectrum 1.0.0 for mobile image uploads - Engineering at Meta\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/engineering.fb.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/engineering.fb.com\\\/2019\\\/01\\\/17\\\/developer-tools\\\/spectrum\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/engineering.fb.com\\\/2019\\\/01\\\/17\\\/developer-tools\\\/spectrum\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/engineering.fb.com\\\/wp-content\\\/uploads\\\/2019\\\/01\\\/SpectrumHero.jpg\",\"datePublished\":\"2019-01-17T11:30:08+00:00\",\"dateModified\":\"2020-05-21T03:08:24+00:00\",\"description\":\"To make the mobile image upload process more efficient, we are releasing Spectrum 1.0.0, an image processing library for Android and iOS.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/engineering.fb.com\\\/2019\\\/01\\\/17\\\/developer-tools\\\/spectrum\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/engineering.fb.com\\\/2019\\\/01\\\/17\\\/developer-tools\\\/spectrum\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/engineering.fb.com\\\/2019\\\/01\\\/17\\\/developer-tools\\\/spectrum\\\/#primaryimage\",\"url\":\"https:\\\/\\\/engineering.fb.com\\\/wp-content\\\/uploads\\\/2019\\\/01\\\/SpectrumHero.jpg\",\"contentUrl\":\"https:\\\/\\\/engineering.fb.com\\\/wp-content\\\/uploads\\\/2019\\\/01\\\/SpectrumHero.jpg\",\"width\":2000,\"height\":1125,\"caption\":\"Facebook open-sources Spectrum 1.0.0 for better mobile image production on Code.fb.com, Facebook's Engineering blog\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/engineering.fb.com\\\/2019\\\/01\\\/17\\\/developer-tools\\\/spectrum\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/engineering.fb.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Facebook open-sources Spectrum 1.0.0 for better mobile image production\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/engineering.fb.com\\\/#website\",\"url\":\"https:\\\/\\\/engineering.fb.com\\\/\",\"name\":\"Engineering at Meta\",\"description\":\"Engineering at Meta Blog\",\"publisher\":{\"@id\":\"https:\\\/\\\/engineering.fb.com\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/engineering.fb.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/engineering.fb.com\\\/#organization\",\"name\":\"Meta\",\"url\":\"https:\\\/\\\/engineering.fb.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/engineering.fb.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/engineering.fb.com\\\/wp-content\\\/uploads\\\/2023\\\/08\\\/Meta_lockup_positive-primary_RGB.jpg\",\"contentUrl\":\"https:\\\/\\\/engineering.fb.com\\\/wp-content\\\/uploads\\\/2023\\\/08\\\/Meta_lockup_positive-primary_RGB.jpg\",\"width\":29011,\"height\":12501,\"caption\":\"Meta\"},\"image\":{\"@id\":\"https:\\\/\\\/engineering.fb.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/Engineering\\\/\",\"https:\\\/\\\/x.com\\\/fb_engineering\"]},[]]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Open-sourcing Spectrum 1.0.0 for mobile image uploads - Engineering at Meta","description":"To make the mobile image upload process more efficient, we are releasing Spectrum 1.0.0, an image processing library for Android and iOS.","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:\/\/engineering.fb.com\/2019\/01\/17\/developer-tools\/spectrum\/","twitter_misc":{"Written by":"Daniel Hugenroth, changigi649","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/engineering.fb.com\/2019\/01\/17\/developer-tools\/spectrum\/#article","isPartOf":{"@id":"https:\/\/engineering.fb.com\/2019\/01\/17\/developer-tools\/spectrum\/"},"author":{"@id":"https:\/\/engineering.fb.com\/2019\/01\/17\/developer-tools\/spectrum\/#author","name":""},"headline":"Facebook open-sources Spectrum 1.0.0 for better mobile image production","datePublished":"2019-01-17T11:30:08+00:00","dateModified":"2020-05-21T03:08:24+00:00","mainEntityOfPage":{"@id":"https:\/\/engineering.fb.com\/2019\/01\/17\/developer-tools\/spectrum\/"},"wordCount":803,"publisher":{"@id":"https:\/\/engineering.fb.com\/#organization"},"image":{"@id":"https:\/\/engineering.fb.com\/2019\/01\/17\/developer-tools\/spectrum\/#primaryimage"},"thumbnailUrl":"https:\/\/engineering.fb.com\/wp-content\/uploads\/2019\/01\/SpectrumHero.jpg","articleSection":["Android","DevInfra","iOS","Open Source"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/engineering.fb.com\/2019\/01\/17\/developer-tools\/spectrum\/","url":"https:\/\/engineering.fb.com\/2019\/01\/17\/developer-tools\/spectrum\/","name":"Open-sourcing Spectrum 1.0.0 for mobile image uploads - Engineering at Meta","isPartOf":{"@id":"https:\/\/engineering.fb.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/engineering.fb.com\/2019\/01\/17\/developer-tools\/spectrum\/#primaryimage"},"image":{"@id":"https:\/\/engineering.fb.com\/2019\/01\/17\/developer-tools\/spectrum\/#primaryimage"},"thumbnailUrl":"https:\/\/engineering.fb.com\/wp-content\/uploads\/2019\/01\/SpectrumHero.jpg","datePublished":"2019-01-17T11:30:08+00:00","dateModified":"2020-05-21T03:08:24+00:00","description":"To make the mobile image upload process more efficient, we are releasing Spectrum 1.0.0, an image processing library for Android and iOS.","breadcrumb":{"@id":"https:\/\/engineering.fb.com\/2019\/01\/17\/developer-tools\/spectrum\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/engineering.fb.com\/2019\/01\/17\/developer-tools\/spectrum\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/engineering.fb.com\/2019\/01\/17\/developer-tools\/spectrum\/#primaryimage","url":"https:\/\/engineering.fb.com\/wp-content\/uploads\/2019\/01\/SpectrumHero.jpg","contentUrl":"https:\/\/engineering.fb.com\/wp-content\/uploads\/2019\/01\/SpectrumHero.jpg","width":2000,"height":1125,"caption":"Facebook open-sources Spectrum 1.0.0 for better mobile image production on Code.fb.com, Facebook's Engineering blog"},{"@type":"BreadcrumbList","@id":"https:\/\/engineering.fb.com\/2019\/01\/17\/developer-tools\/spectrum\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/engineering.fb.com\/"},{"@type":"ListItem","position":2,"name":"Facebook open-sources Spectrum 1.0.0 for better mobile image production"}]},{"@type":"WebSite","@id":"https:\/\/engineering.fb.com\/#website","url":"https:\/\/engineering.fb.com\/","name":"Engineering at Meta","description":"Engineering at Meta Blog","publisher":{"@id":"https:\/\/engineering.fb.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/engineering.fb.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/engineering.fb.com\/#organization","name":"Meta","url":"https:\/\/engineering.fb.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/engineering.fb.com\/#\/schema\/logo\/image\/","url":"https:\/\/engineering.fb.com\/wp-content\/uploads\/2023\/08\/Meta_lockup_positive-primary_RGB.jpg","contentUrl":"https:\/\/engineering.fb.com\/wp-content\/uploads\/2023\/08\/Meta_lockup_positive-primary_RGB.jpg","width":29011,"height":12501,"caption":"Meta"},"image":{"@id":"https:\/\/engineering.fb.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Engineering\/","https:\/\/x.com\/fb_engineering"]},[]]}},"jetpack_featured_media_url":"https:\/\/engineering.fb.com\/wp-content\/uploads\/2019\/01\/SpectrumHero.jpg","jetpack_shortlink":"https:\/\/wp.me\/sa0Lhq-spectrum","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/engineering.fb.com\/wp-json\/wp\/v2\/posts\/12239","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/engineering.fb.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/engineering.fb.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/engineering.fb.com\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/engineering.fb.com\/wp-json\/wp\/v2\/comments?post=12239"}],"version-history":[{"count":10,"href":"https:\/\/engineering.fb.com\/wp-json\/wp\/v2\/posts\/12239\/revisions"}],"predecessor-version":[{"id":15124,"href":"https:\/\/engineering.fb.com\/wp-json\/wp\/v2\/posts\/12239\/revisions\/15124"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/engineering.fb.com\/wp-json\/wp\/v2\/media\/12747"}],"wp:attachment":[{"href":"https:\/\/engineering.fb.com\/wp-json\/wp\/v2\/media?parent=12239"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/engineering.fb.com\/wp-json\/wp\/v2\/categories?post=12239"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/engineering.fb.com\/wp-json\/wp\/v2\/tags?post=12239"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/engineering.fb.com\/wp-json\/wp\/v2\/coauthors?post=12239"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}