[{"data":1,"prerenderedAt":2593},["ShallowReactive",2],{"homepage-latest-articles":3,"$fXJ9zvFku99TZPm2erDx9uOkwLzLz0GC7vOFnZmKOwGw":426,"$fwZ3YFPJ4zKk2SfaA9AxYfMMyaXN65XCdD0QaM2jwNFU":522,"$fDwu9ehCBHgHfeg8RZBkb9AoSdpxNmQRujIbuBFhb7L8":577,"$fVIeW95ErlqY1Na4ajmk4GOnh2wtcOwpWVNHlfMWnO8k":729,"$ftnR_cX1JSZIHL-Rw1ERCu7391Wha6vfC2LOw2IUfC_I":881,"$fI13NoyhCd_BB8nFboNtyIpcCQd5YOrx8IEv3hAy0rVE":2308},[4,128,226,323],{"id":5,"title":6,"articleType":7,"categories":8,"date":12,"description":13,"extension":14,"meta":15,"paragraphs":16,"path":123,"readingTime":124,"sitemap":125,"stem":126,"__hash__":127},"articleEntries\u002Farticles-data\u002Fdruxt-drupal-13x-resource-list-yours-20260909.json","Druxt (for Drupal) 1.3.x; the resource list is yours","Blog post",[9,10,11],"Drupal","Druxt","Planet Drupal","2026-09-09T19:30:00+10:00","Druxt's Drupal module answers for twelve JSON:API resources, hardcoded, all of them describing structure. 1.3.0 makes that list yours, and here's what I'd add to mine. Any JSON:API client benefits, not only Druxt.","json",{},[17,29,42,72,80,96,106,114],{"type":18,"layout":19,"regions":20},"section","layout_onecol",{"content":21},[22,25,27],{"type":23,"html":24},"text_formatted","\u003Cp>Druxt's Drupal module carries a list of twelve JSON:API resources it answers for. It's been the same twelve since 2021, hardcoded in a PHP array, and changing it has meant carrying a patch.\u003C\u002Fp>",{"type":23,"html":26},"\u003Cp>1.3.0, tagged today, makes that list yours. The twelve stay exactly as they are, so nothing a site exposes changes when it updates. What is new is being able to choose, and the first thing I would choose is the one my frontend has always had to guess at: the toolbar an administrator configured for a text format.\u003C\u002Fp>\u003Cp>A CORS default ships in the same release. If you keep a proxy rule in front of your frontend so that authenticated calls succeed, this is the release where you delete it.\u003C\u002Fp>",{"type":23,"html":28},"\u003Cp>The module name suggests otherwise, but this is a Drupal-side change. Any client holding the right permission gets the same reads.\u003C\u002Fp>",{"type":18,"title":30,"layout":19,"regions":31},"What it answers today",{"content":32},[33,35,40],{"type":23,"html":34},"\u003Cp>Anyone holding the \u003Ccode>access druxt resources\u003C\u002Fcode> permission can read these, whatever access control would otherwise have said:\u003C\u002Fp>",{"type":36,"title":37,"code":38,"language":39},"code","The list, as it stands","block--block\nconfigurable_language--configurable_language\nentity_form_display--entity_form_display\nentity_form_mode--entity_form_mode\nentity_view_display--entity_view_display\nentity_view_mode--entity_view_mode\nfield_config--field_config\nfield_storage_config--field_storage_config\njsonapi_resource_config--jsonapi_resource_config\nmenu--menu\nmenu_link_content--menu_link_content\nview--view","text",{"type":23,"html":41},"\u003Cp>Every one describes structure, and all of it is configuration, with one exception: \u003Ccode>menu_link_content\u003C\u002Fcode> is content, and we will come back to it. None of them describes how the site prefers things to look or behave, and with the list compiled in, nobody could add one that did.\u003C\u002Fp>",{"type":18,"title":43,"layout":19,"regions":44},"Starting with rich text",{"content":45},[46,48,50,52,59,61,63,68,70],{"type":23,"html":47},"\u003Cp>A frontend offering an editing experience has no way to read the toolbar an administrator configured, so it ships whatever buttons its developer chose and hopes they match.\u003C\u002Fp>",{"type":23,"html":49},"\u003Cp>The reason it cannot read it is the interesting part. The only core permission that grants access to a text format's configuration is \u003Cstrong>administer filters\u003C\u002Fstrong>, which core itself flags \u003Ccode>restrict access\u003C\u002Fcode>. Hand it to an author and they can rewrite the text format, one of the shorter routes to an XSS. So the choice has been between a permission you cannot give them and a frontend guessing at a toolbar.\u003C\u002Fp>",{"type":23,"html":51},"\u003Cp>A checkbox is the third option, on a new settings form at \u003Cem>Configuration &gt; Web services &gt; Druxt\u003C\u002Fem>. It grants read where \u003Cstrong>administer filters\u003C\u002Fstrong> grants write, and it grants it to everyone holding \u003Ccode>access druxt resources\u003C\u002Fcode> instead of to one trusted account. List \u003Ccode>editor--editor\u003C\u002Fcode> and the frontend reads the toolbar and builds from it; change the toolbar in Drupal and the editor changes, with no rebuild: 10 buttons for \u003Ccode>basic_html\u003C\u002Fcode>, 16 for \u003Ccode>full_html\u003C\u002Fcode>.\u003C\u002Fp>",{"type":53,"src":54,"alt":55,"caption":56,"width":57,"height":58},"media","\u002Fimages\u002Fwriting\u002Fdruxt-130-toolbars.png","Two toolbars stacked, each labelled with one word. Above, labelled Drupal: the buttons sit in grey tiles and the separators are tiles of their own. Below, labelled Frontend: the same buttons in the same order in a plain row with thin dividers. In both, reading left to right: bold, italic, strikethrough, superscript, subscript, code, remove format, link, bulleted list, numbered list, block quote, image, table, horizontal line, a heading dropdown, code block and source editing.","\u003Cp>The same toolbar, twice. Drupal draws the separators as draggable tiles because that screen is for editing the toolbar; the frontend draws them as dividers.\u003C\u002Fp>",2560,744,{"type":23,"html":60},"\u003Cp>Which filters run is a second tick, on \u003Ccode>filter_format--filter_format\u003C\u002Fcode>. It tells a frontend whether a caption arrives in a \u003Ccode>data-caption\u003C\u002Fcode> attribute or in the markup. Fetch it once first: JSON:API hands over whole entities, so that is every format on the site and each one's filter settings, an open blob contrib modules fill with their own keys.\u003C\u002Fp>",{"type":23,"html":62},"\u003Cp>What comes back is Drupal's vocabulary, not CKEditor's. \u003Ccode>drupalInsertImage\u003C\u002Fcode> is Drupal's name for \u003Ccode>uploadImage\u003C\u002Fcode>, and an item your build has not loaded is dropped with a console warning rather than an error, so the editor comes up fine, quietly missing buttons the format says it has.\u003C\u002Fp>",{"type":36,"title":64,"code":65,"language":66,"highlighted":67},"Reading the toolbar, server side","\u002F\u002F Nuxt 2. fetch() runs on the server; druxt-site injects $druxt.\nasync fetch() {\n  \u002F\u002F A string: an object flattens to filter=[object Object] and 400s.\n  const { data } = await this.$druxt.getCollection(\n    'editor--editor',\n    'filter[drupal_internal__format]=basic_html',\n  )\n  this.items = ((data[0] || {}).attributes || {}).settings.toolbar.items || []\n}","js","\u003Cspan class=\"token comment\">\u002F\u002F Nuxt 2. fetch() runs on the server; druxt-site injects $druxt.\u003C\u002Fspan>\n\u003Cspan class=\"token keyword\">async\u003C\u002Fspan> \u003Cspan class=\"token function\">fetch\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">{\u003C\u002Fspan>\n  \u003Cspan class=\"token comment\">\u002F\u002F A string: an object flattens to filter=[object Object] and 400s.\u003C\u002Fspan>\n  \u003Cspan class=\"token keyword\">const\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">{\u003C\u002Fspan> data \u003Cspan class=\"token punctuation\">}\u003C\u002Fspan> \u003Cspan class=\"token operator\">=\u003C\u002Fspan> \u003Cspan class=\"token keyword\">await\u003C\u002Fspan> \u003Cspan class=\"token keyword\">this\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">.\u003C\u002Fspan>$druxt\u003Cspan class=\"token punctuation\">.\u003C\u002Fspan>\u003Cspan class=\"token function\">getCollection\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>\n    \u003Cspan class=\"token string\">'editor--editor'\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">,\u003C\u002Fspan>\n    \u003Cspan class=\"token string\">'filter[drupal_internal__format]=basic_html'\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">,\u003C\u002Fspan>\n  \u003Cspan class=\"token punctuation\">)\u003C\u002Fspan>\n  \u003Cspan class=\"token keyword\">this\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">.\u003C\u002Fspan>items \u003Cspan class=\"token operator\">=\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>data\u003Cspan class=\"token punctuation\">[\u003C\u002Fspan>\u003Cspan class=\"token number\">0\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">]\u003C\u002Fspan> \u003Cspan class=\"token operator\">||\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">{\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">}\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">.\u003C\u002Fspan>attributes \u003Cspan class=\"token operator\">||\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">{\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">}\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">.\u003C\u002Fspan>settings\u003Cspan class=\"token punctuation\">.\u003C\u002Fspan>toolbar\u003Cspan class=\"token punctuation\">.\u003C\u002Fspan>items \u003Cspan class=\"token operator\">||\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">[\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">]\u003C\u002Fspan>\n\u003Cspan class=\"token punctuation\">}\u003C\u002Fspan>",{"type":23,"html":69},"\u003Cp>All of which is me saying: expect a Druxt CKEditor module in the future. Mounting the editor is where the work actually is. CKEditor 5 uses static class blocks, which the bundler Nuxt 2 ships cannot parse, so today you load it from a script tag and match the version Drupal ships rather than the one npm defaults to. That is exactly the sort of thing a module should absorb so nobody else meets it.\u003C\u002Fp>",{"type":23,"html":71},"\u003Cp>Neither is ticked by default. Updating writes the same twelve into configuration and stops there, and nothing on the list is readable by anyone until \u003Ccode>access druxt resources\u003C\u002Fcode> is granted, which installing grants to nobody. Changing the list needs \u003Ccode>administer druxt\u003C\u002Fcode>, which ships restricted.\u003C\u002Fp>",{"type":18,"title":73,"layout":19,"regions":74},"Then everything else",{"content":75},[76,78],{"type":23,"html":77},"\u003Cp>What else is a frontend inventing? All three of these are configuration entities, so they are already in that checkbox list, unticked:\u003C\u002Fp>",{"type":23,"html":79},"\u003Cul>\u003Cli>\u003Cstrong>Image styles.\u003C\u002Fstrong> Effects carry the dimensions a \u003Ccode>srcset\u003C\u002Fcode> needs. The derivative URLs are solved already, by \u003Ca href=\"https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Fjsonapi_image_styles\">JSON:API Image Styles\u003C\u002Fa> and \u003Ca href=\"https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Fconsumer_image_styles\">Consumer Image Styles\u003C\u002Fa>, after \u003Ca href=\"https:\u002F\u002Fwww.lullabot.com\u002Farticles\u002Fdecoupled-drupal-hard-problems-image-styles\">Lullabot named it in 2018\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Editorial workflow.\u003C\u002Fstrong> Content moderation's states and transitions would let an editing interface show where a document sits and which moves are legal, instead of a hardcoded draft-and-published pair\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Bulk actions.\u003C\u002Fstrong> \u003Ccode>action--action\u003C\u002Fcode> carries every action a site has configured, so a decoupled content list could offer exactly those\u003C\u002Fli>\n\u003C\u002Ful>",{"type":18,"title":81,"layout":19,"regions":82},"What it will not answer for",{"content":83},[84,86,88,90],{"type":23,"html":85},"\u003Cp>Druxt answers Drupal's entity access check with a yes for any listed route, and lifts JSON:API's limit on filtering by fields the requester could not otherwise see. A listed resource is readable by anyone holding \u003Ccode>access druxt resources\u003C\u002Fcode>, whatever the site would otherwise have said, and on a decoupled site that permission often goes to anonymous.\u003C\u002Fp>",{"type":23,"html":87},"\u003Cp>The list has one axis. It says what, never who: the same yes, site-wide, for everyone holding the permission. That suits configuration, which answers the same whoever is asking. Content varies per entity by published state, owner and field access, so one yes is never right for it. \u003Ccode>user--user\u003C\u002Fcode> would hand over every account, blocked ones included, and enough filtering to enumerate them.\u003C\u002Fp>",{"type":23,"html":89},"\u003Cp>\u003Ccode>menu_link_content\u003C\u002Fcode> is the exception, and it is content, grandfathered because it shipped in the hardcoded list. It is also the resource that gives a frontend the least, so I maintain \u003Ca href=\"https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Fjsonapi_menu_items\">JSON:API Menu Items\u003C\u002Fa> to cover the gap.\u003C\u002Fp>",{"type":53,"src":91,"alt":92,"caption":93,"width":94,"height":95},"\u002Fimages\u002Fwriting\u002Fdruxt-130-settings-form.png","The Druxt settings form at Configuration, Web services, Druxt. A list headed Exposed resources with a checkbox per configuration entity type. Ticked: block, editor, entity_form_display, entity_form_mode, entity_view_display, entity_view_mode, field_config, field_storage_config, menu, menu_link_content, view. Unticked: action, base_field_override, block_content_type, date_format, filter_format, image_style, media_type, node_type, oauth2_scope, oauth2_token_type, taxonomy_vocabulary, user_role. No content entity types are offered. Help text below reads that a checked resource is readable by anyone with the access druxt resources permission, whatever the site would otherwise allow.","\u003Cp>Configuration entity types only, and no content ones offered at all. \u003Ccode>editor--editor\u003C\u002Fcode> and \u003Ccode>filter_format--filter_format\u003C\u002Fcode> are separate ticks, and the help text under the list says outright that a ticked resource is readable by anyone holding the permission.\u003C\u002Fp>",1280,900,{"type":18,"title":97,"layout":19,"regions":98},"CORS, and the proxy rule you can delete",{"content":99},[100,102,104],{"type":23,"html":101},"\u003Cp>One more thing, and it takes a step out of everyone's setup. On a site that has not configured CORS itself, Druxt turns it on and allows every header, and now sets \u003Ccode>allowedMethods\u003C\u002Fcode> too. That list is what the library underneath advertises methods from, and core ships it empty, so the browser refused the preflight and the request never left.\u003C\u002Fp>",{"type":23,"html":103},"\u003Cp>Anonymous \u003Ccode>GET\u003C\u002Fcode> was never affected, since a simple request is not preflighted. What changes is everything else: writes, and reads that set an \u003Ccode>Authorization\u003C\u002Fcode> header. If you keep a proxy rule or a middleware in front of your frontend so that authenticated calls succeed, this is the release where you delete it. Worth checking rather than assuming, because a refused preflight answers 204 with a clean log, and \u003Ccode>curl\u003C\u002Fcode> never reproduces it: only a browser enforces the response.\u003C\u002Fp>",{"type":23,"html":105},"\u003Cp>A site that configured \u003Ccode>cors.config\u003C\u002Fcode> itself is untouched, and credentials stay off, so cookies and sessions still do not travel cross-origin. An \u003Ccode>Authorization\u003C\u002Fcode> header does. The \u003Ca href=\"https:\u002F\u002Fdruxtjs.org\u002F\">documentation site\u003C\u002Fa> was rebuilt around \u003Ca href=\"https:\u002F\u002Fdruxtjs.org\u002Ftutorials\">tutorials\u003C\u002Fa> last week, and the \u003Ca href=\"https:\u002F\u002Fdruxtjs.org\u002Ftutorials\u002Fauthentication\">login flow\u003C\u002Fa> is the one to start with if authenticated requests are what you have been putting off.\u003C\u002Fp>",{"type":18,"title":107,"layout":19,"regions":108},"What are you working around?",{"content":109},[110,112],{"type":23,"html":111},"\u003Cp>Enough about what I would tick. What I want to know is what you are already working around. Anyone building against Drupal from outside it has written something that guesses at a value Drupal already holds. Mine was a toolbar. It is a checkbox now.\u003C\u002Fp>",{"type":23,"html":113},"\u003Cp>So what is yours, and what would you build if you could simply read it?\u003C\u002Fp>",{"type":18,"layout":19,"regions":115},{"content":116},[117],{"type":118,"description":119,"url":120,"gitpod":121,"drupalUrl":122},"repository","\u003Cp>The Drupal module this ships in. If your projects lean on modules like it, sponsoring is what keeps them maintained.\u003C\u002Fp>","https:\u002F\u002Fgithub.com\u002Fdruxt\u002Fdruxt_drupal",false,"https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Fdruxt","\u002Fwriting\u002Fdruxt-drupal-13x-resource-list-yours-20260909","6 min",{"loc":123},"articles-data\u002Fdruxt-drupal-13x-resource-list-yours-20260909","0TMmpSgDFN8pTy6pWj4l16jdBzeadBDefLfPbkLsyzM",{"id":129,"title":130,"articleType":7,"categories":131,"date":132,"description":133,"extension":14,"meta":134,"paragraphs":135,"path":221,"readingTime":222,"sitemap":223,"stem":224,"__hash__":225},"articleEntries\u002Farticles-data\u002Fdrupal-site-settings-over-jsonapi-consumer-20260826.json","Drupal site settings over JSON:API, per consumer",[9,10,11],"2026-08-26T19:20:00+10:00","Run the same decoupled frontend twice with two consumer IDs and get two differently branded sites. Decoupled Settings serves the site and theme config Drupal already holds over JSON:API, with per-consumer overrides. Four years ago I guessed the answer would be Consumers plus theme settings. Turns out it was.",{},[136,143,149,155,185,195,208,214],{"type":18,"layout":19,"regions":137},{"content":138},[139,141],{"type":23,"html":140},"\u003Cp>In April 2022 I wrote about \u003Ca href=\"\u002Fwriting\u002Fdecoupling-configuration-config-pages-20220412\">decoupling configuration with Config Pages\u003C\u002Fa>, and ended it with a guess at where I'd go next:\u003C\u002Fp>\n\n\u003Cblockquote>\u003Cp>One of my future experiments with Druxt will be to look at the options of using the Drupal Consumers module alongside Drupal theme settings as a solution.\u003C\u002Fp>\u003C\u002Fblockquote>",{"type":23,"html":142},"\u003Cp>That experiment is now a module. \u003Ca href=\"https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Fdecoupled_settings\">Decoupled Settings\u003C\u002Fa> serves the site and theme configuration Drupal already holds over JSON:API, and lets every frontend override just the values it needs. It went up on Drupal.org this week.\u003C\u002Fp>",{"type":18,"title":144,"layout":19,"regions":145},"What core doesn't give you",{"content":146},[147],{"type":23,"html":148},"\u003Cp>Core's JSON:API is an entity API. Content entities and config entities alike, so node types, image styles and views are all in there. What it has never exposed is simple configuration, and there's a good argument that it shouldn't by default, because plenty of what sits in \u003Ccode>system.site\u003C\u002Fcode> is nobody's business.\u003C\u002Fp>\n\n\u003Cp>But a decoupled frontend still needs the boring stuff:\u003C\u002Fp>\n\n\u003Cul>\u003Cli>The site name, for the document title\u003C\u002Fli>\n\u003Cli>The slogan\u003C\u002Fli>\n\u003Cli>The logo and the favicon\u003C\u002Fli>\n\u003Cli>The front page path, so the router knows what \"home\" means\u003C\u002Fli>\n\u003C\u002Ful>\n\n\u003Cp>So every decoupled build solves it locally, and most of the ways to solve it end up keeping a second copy of the site name somewhere.\u003C\u002Fp>",{"type":18,"title":150,"layout":19,"regions":151},"Isn't that what Config Pages is for?",{"content":152},[153],{"type":23,"html":154},"\u003Cp>Config Pages is for settings \u003Cem>you\u003C\u002Fem> invent: define a type, add the fields your app needs, done. That job hasn't changed, and it's still on my sites.\u003C\u002Fp>\n\n\u003Cp>Where it gets awkward is settings Drupal already stores. Model the site name as a field on a Config Page and the site name exists in two places, and something has to keep them in step, and sooner or later something won't.\u003C\u002Fp>",{"type":18,"title":156,"layout":19,"regions":157},"How it works",{"content":158},[159,161,167,169,175,177,180,183],{"type":23,"html":160},"\u003Cp>So the module doesn't store settings. It reads them from the config objects that already hold them, and a consumer stores only what it changes.\u003C\u002Fp>",{"type":53,"alt":162,"caption":163,"width":164,"height":165,"src":166},"The per-consumer overrides form for a consumer named Partner Portal, filtered to system.site. Columns are Setting, Inherited value, Override and Value for this consumer. system.site:name and system.site:slogan are ticked and overridden to 'Partner Portal' and 'Same code, different consumer'; langcode, page.403, page.404 and page.front are unticked and inherited.","\u003Cp>Tick a setting to override it for this consumer. Everything unticked keeps following the site.\u003C\u002Fp>",1336,1022,"\u002Fimages\u002Fwriting\u002Fdecoupled-settings-consumer-overrides.png",{"type":23,"html":168},"\u003Cp>Tick a setting and it's yours. Leave it alone and it keeps following the site. Tick it and leave the value blank and that frontend doesn't show a slogan at all, which is a different thing again from clearing the override and going back to inheriting.\u003C\u002Fp>\n\n\u003Cp>What's exposed at all is bounded twice: the config objects you list, and within those, the keys typed config schema declares. On install that's \u003Ccode>system.site\u003C\u002Fcode> plus the active theme, and both of \u003Ccode>system.site\u003C\u002Fcode>'s email keys ship excluded. The settings form shows exactly how wide the exposure is, unsaved changes included, so you can trim it to the keys you want before anything ships.\u003C\u002Fp>",{"type":53,"alt":170,"caption":171,"width":172,"height":173,"src":174},"The Decoupled Settings configuration form: an Exposed configuration list containing system.site, a checkbox to expose the active theme settings, an Excluded settings box listing system.site:mail and system.site:mail_notification, and a 'What a frontend will read' table showing each setting with its global value.","\u003Cp>The exposure list, the keys it holds back, and what a frontend gets from what's left. Filtered to \u003Ccode>system.site\u003C\u002Fcode> here, so the theme's fourteen keys aren't in shot.\u003C\u002Fp>",1016,1358,"\u002Fimages\u002Fwriting\u002Fdecoupled-settings-exposure-form.png",{"type":23,"html":176},"\u003Cp>Reading it is one GET:\u003C\u002Fp>",{"type":36,"title":178,"code":179},"Reading settings as a consumer","curl \"https:\u002F\u002Fdrupal.example.com\u002Fjsonapi\u002Fdecoupled\u002Fsettings?consumerId=partner_frontend\"",{"type":36,"title":181,"code":182},"Abbreviated: 7 of the 23 keys, otherwise as returned","{\n  \"data\": {\n    \"type\": \"decoupled_settings--settings\",\n    \"id\": \"decoupled-settings\",\n    \"attributes\": {\n      \"settings\": {\n        \"system.site\": {\n          \"name\": \"Partner Portal\",\n          \"slogan\": \"Same code, different consumer\",\n          \"page\": { \"front\": \"\u002Fnode\" }\n        },\n        \"olivero.settings\": {\n          \"favicon\": { \"url\": \"\u002Fcore\u002Fthemes\u002Folivero\u002Ffavicon.ico\", \"use_default\": true },\n          \"logo\": { \"url\": \"\u002Fcore\u002Fthemes\u002Folivero\u002Flogo.svg\", \"use_default\": true }\n        }\n      },\n      \"consumer\": \"partner_frontend\"\n    }\n  }\n}",{"type":23,"html":184},"\u003Cp>The logo and favicon come back as resolved URLs, through core's own theme settings resolution and its fallbacks. Responses collect the config cache tags of every object that contributed, so an editor changing the site name invalidates them with nobody writing a hook.\u003C\u002Fp>\n\n\u003Cp>With \u003Ca href=\"https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Fsimple_oauth\">Simple OAuth\u003C\u002Fa> it's simpler still: a client credentials token identifies the consumer by itself, no header and no query parameter, because the OAuth client and the settings consumer are the same entity.\u003C\u002Fp>",{"type":18,"title":186,"layout":19,"regions":187},"One backend, many frontends",{"content":188},[189,191,193],{"type":23,"html":190},"\u003Cp>A consumer is a name on a request. Point two builds of the same frontend at one backend, have each identify as a different consumer, and each comes up as its own site: its own name, its own slogan, its own logo and favicon. Nothing in the code differs between them, only an environment variable.\u003C\u002Fp>",{"type":23,"html":192},"\u003Cp>Read the settings at build time and bake them into the artifact, and the artifact doesn't depend on Drupal at runtime, at the cost of a rebuild whenever a setting changes. Read them at runtime and the cache tags start earning their keep. Either way it's one request, so it matters very little what the frontend is built with.\u003C\u002Fp>\n\n\u003Cp>A consumer gets its own name, slogan, front page and branding assets. Menus, regions, layouts and per-market content are still yours to solve.\u003C\u002Fp>",{"type":23,"html":194},"\u003Cp>If you're on Druxt, a module that wires all of this into the build is close behind, for the current Druxt release. It identifies the app as a consumer, reads the settings, and applies the site name and favicon to the document head. It also bakes the whole resolved set into Nuxt's runtime config, so \u003Ccode>$config.decoupledSettings['system.site'].name\u003C\u002Fcode> works anywhere in the app.\u003C\u002Fp>",{"type":18,"title":196,"layout":19,"regions":197},"Where it stands",{"content":198},[199,201,203,205],{"type":23,"html":200},"\u003Cp>108 tests and 492 assertions across unit, kernel and functional coverage, green on Drupal 10 and Drupal 11. The first pipeline on drupalcode.org came back green across all eight jobs on its first run, which never happens.\u003C\u002Fp>",{"type":23,"html":202},"\u003Cp>It's \u003Cstrong>1.0.0-beta2\u003C\u002Fstrong>. Drupal's security advisory policy covers stable releases only, and the response shape can still move before 1.0. Adopt now and you're the second consumer of this API, which means you get a say in that shape while it's still soft.\u003C\u002Fp>\n\n\u003Cp>Overrides live on the consumer entity, so they're content rather than config, and they stay in the database rather than travelling with \u003Ccode>drush cim\u003C\u002Fcode>. Multilingual works one way today: exposed values follow language negotiation, but an override applies in every language, so you can translate a setting or brand it per consumer, not both yet.\u003C\u002Fp>",{"type":23,"html":204},"\u003Cp>If any of that is useful, the beta is out now:\u003C\u002Fp>",{"type":36,"title":206,"code":207},"Install","composer require 'drupal\u002Fdecoupled_settings:^1.0@beta'\ndrush en decoupled_settings",{"type":18,"title":209,"layout":19,"regions":210},"What next?",{"content":211},[212],{"type":23,"html":213},"\u003Cp>File (Field) Paths, still next up, and the Druxt half of this behind it.\u003C\u002Fp>\n\n\u003Cp>If you're running decoupled Drupal already, how are you getting the site name into your frontend today? I'd like to know, while the API shape is still soft enough to change.\u003C\u002Fp>",{"type":18,"layout":19,"regions":215},{"content":216},[217],{"type":118,"description":218,"url":219,"gitpod":121,"drupalUrl":220},"\u003Cp>Source on GitHub, project page and issue queue on Drupal.org. If your projects lean on modules like this one, sponsoring is what keeps them actively maintained.\u003C\u002Fp>","https:\u002F\u002Fgithub.com\u002FDecipher\u002Fdecoupled_settings","https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Fdecoupled_settings","\u002Fwriting\u002Fdrupal-site-settings-over-jsonapi-consumer-20260826","4 min",{"loc":221},"articles-data\u002Fdrupal-site-settings-over-jsonapi-consumer-20260826","AfWvvQeLG8E0HK9wKF51FKaoMngbUKR6PfbLJ8v2H6s",{"id":227,"title":228,"articleType":7,"categories":229,"date":230,"description":231,"extension":14,"meta":232,"paragraphs":233,"path":319,"readingTime":124,"sitemap":320,"stem":321,"__hash__":322},"articleEntries\u002Farticles-data\u002Fjsonapi-views-120-20260812.json","JSON:API Views 8.x-1.2",[9,10,11],"2026-08-12T20:00:00+10:00","JSON:API gets you entities, not listings - JSON:API Views exposes any Drupal View as a JSON:API resource. 8.x-1.2: faster route building on view-heavy sites, cache headers that actually invalidate, a corrected preview URL, and a reworked OpenAPI fix.",{},[234,243,273,289,295],{"type":18,"layout":19,"regions":235},{"content":236},[237,239,241],{"type":23,"html":238},"\u003Cp>JSON:API on its own gets you decoupled entities: fetch a node, fetch a set of IDs, done. It doesn't get you the filtering, sorting and pagination that most real content listings actually need - a list of articles by tag, a paginated product catalogue, an events calendar with a date filter. You either reimplement that logic on the frontend, or Drupal ships a hand-written custom resource for every list on the site. That gap is the same regardless of what's rendering on the other end, React and Next.js, Vue and Nuxt, or anything else that can call an API.\u003C\u002Fp>\n\n\u003Cp>JSON:API Views closes it: whatever a View can already do, a decoupled frontend can ask for over JSON:API, using the access checks and query logic the view already has, no separate endpoint to write or maintain. It's also, not coincidentally, why I still maintain the module at all: it's the backend half of DruxtViews, the piece that makes Views work in Druxt, my own Nuxt-based decoupled Drupal framework.\u003C\u002Fp>",{"type":23,"html":240},"\u003Cp>8.x-1.2 lands six fixes, five of which already had a patch sitting in the queue: route building that's dramatically faster on sites with a lot of exposed views, a preview URL that finally matches what an exposed filter is actually configured to accept, a caching fix so front-end caches actually invalidate, a routing crash tied to numeric bundle names, and a reworked fix for an OpenAPI export crash. Just fixes, no updating required.\u003C\u002Fp>",{"type":23,"html":242},"\u003Cp>JSON:API Views isn't mine originally. \u003Ca href=\"https:\u002F\u002Fwww.drupal.org\u002Fu\u002Fpixelwhip\">pixelwhip\u003C\u002Fa> built the module and shipped its first releases; I took over maintenance after that, and 8.x-1.2 is the first release I've cut on the 1.x line. Thanks to pixelwhip for building the thing in the first place.\u003C\u002Fp>",{"type":18,"title":244,"layout":19,"regions":245},"If you haven't used it before",{"content":246},[247,249,255,257,263,265,268,270],{"type":23,"html":248},"\u003Cp>Views is what most Drupal sites already lean on for anything with filtering, sorting or pagination baked in: a list of articles by tag, a paginated product catalogue, an events calendar with a date filter. JSON:API on its own gets a decoupled frontend entities, but it doesn't know about any of that. JSON:API Views bridges the two: enable it on a display and Drupal generates a route for it under \u003Ccode>\u002Fjsonapi\u002Fviews\u002F{view_id}\u002F{display_id}\u003C\u002Fcode>, backed by the same query, filters and access checks the display already has.\u003C\u002Fp>",{"type":53,"alt":250,"caption":251,"width":252,"height":253,"src":254},"The 'Expose via JSON:API' checkbox on a view display's settings, checked by default, with the description 'Controls exposure the view with JSON:API.'","Every display ships exposed by default. One checkbox turns it off (for now, see What's next below).",960,254,"\u002Fimages\u002Fwriting\u002Fjsonapi-views-expose-checkbox.png",{"type":23,"html":256},"\u003Cp>The preview panel in the Views UI picks it up too, once a display is exposed: the same query info table that already shows you the page's path grows a JSON:API Views row with the live URL for that display, arguments and exposed filter values included.\u003C\u002Fp>",{"type":53,"alt":258,"caption":259,"width":260,"height":261,"src":262},"The Views UI preview panel's query info table, showing Title, Path, and a JSON:API Views row linking to \u002Fjsonapi\u002Fviews\u002Ffrontpage\u002Fpage_1","The generated JSON:API endpoint for a view, right there in the Views UI preview panel.",886,137,"\u002Fimages\u002Fwriting\u002Fjsonapi-views-preview-url.png",{"type":23,"html":264},"\u003Cp>Hit that URL and it's a normal JSON:API response, whatever content types the view actually mixes together:\u003C\u002Fp>",{"type":36,"title":266,"code":267},"GET \u002Fjsonapi\u002Fviews\u002Ffrontpage\u002Fpage_1","{\n  \"data\": [\n    {\n      \"type\": \"node--page\",\n      \"id\": \"19e113d5-c838-43e1-ba75-1def5466e3de\",\n      \"attributes\": {\n        \"title\": \"About this site\",\n        \"status\": true,\n        \"created\": \"2026-08-09T09:07:37+00:00\"\n      }\n    },\n    {\n      \"type\": \"node--article\",\n      \"id\": \"62c2d25d-93c9-438b-8bdf-a75b69d05dc5\",\n      \"attributes\": {\n        \"title\": \"Building decoupled Views with jsonapi_views\",\n        \"status\": true,\n        \"created\": \"2026-08-08T10:18:06+00:00\"\n      }\n    }\n  ],\n  \"meta\": { \"count\": \"2\" }\n}",{"type":23,"html":269},"\u003Cp>On the frontend, \u003Ca href=\"https:\u002F\u002Fdruxtjs.org\">Druxt\u003C\u002Fa>'s \u003Ccode>&lt;DruxtView&gt;\u003C\u002Fcode> component renders that exact route as Vue components, filters, sorting and pagination included, no custom resource on either side. It's the frontend half of the same pipeline. DruxtViews targets Nuxt 2 today; a Nuxt 3\u002F4-compatible Druxt is actively in progress, more on that soon.\u003C\u002Fp>",{"type":36,"title":271,"code":272},"Render a View with Druxt","\u003CDruxtView view-id=\"frontpage\" display-id=\"page_1\" \u002F>",{"type":18,"title":274,"layout":19,"regions":275},"What's fixed",{"content":276},[277,279,281,283,285,287],{"type":23,"html":278},"\u003Cp>Five bug fixes, with a big thanks to the community whose patches made most of them possible:\u003C\u002Fp>",{"type":23,"html":280},"\u003Cp>\u003Cstrong>Cache headers weren't being set\u003C\u002Fstrong> (\u003Ca href=\"https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Fjsonapi_views\u002Fissues\u002F3202583\">#3202583\u003C\u002Fa>, patch by \u003Ca href=\"https:\u002F\u002Fwww.drupal.org\u002Fu\u002Fyahyaalhamad\">yahyaalhamad\u003C\u002Fa>). View cache tags weren't reaching the JSON:API response's headers, so a page cache in front of the site never invalidated when the underlying content changed. Fixed by pushing the tags onto the response's bubbleable metadata.\u003C\u002Fp>",{"type":23,"html":282},"\u003Cp>\u003Cstrong>Route building got slow with a lot of exposed views\u003C\u002Fstrong> (\u003Ca href=\"https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Fjsonapi_views\u002Fissues\u002F3484714\">#3484714\u003C\u002Fa>, patch by \u003Ca href=\"https:\u002F\u002Fwww.drupal.org\u002Fu\u002Fjacobbell84\">jacobbell84\u003C\u002Fa>). Every rebuild looked up each view's resource type from scratch, once per view per entity type. Caching it per entity type instead: 637 calls to \u003Ccode>ResourceTypeRepository::get()\u003C\u002Fcode> down to 13, at the scale the issue reported.\u003C\u002Fp>",{"type":23,"html":284},"\u003Cp>\u003Cstrong>Numeric bundle machine names broke routing entirely\u003C\u002Fstrong> (\u003Ca href=\"https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Fjsonapi_views\u002Fissues\u002F3503402\">#3503402\u003C\u002Fa>, patch by \u003Ca href=\"https:\u002F\u002Fwww.drupal.org\u002Fu\u002Fchodec\">chodec\u003C\u002Fa>). An all-digit bundle machine name threw an \u003Ccode>AssertionError\u003C\u002Fcode> during route building instead of returning a route. Cast to string before the lookup, fixed.\u003C\u002Fp>",{"type":23,"html":286},"\u003Cp>\u003Cstrong>The preview URL used the wrong query parameter\u003C\u002Fstrong> (\u003Ca href=\"https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Fjsonapi_views\u002Fissues\u002F3376193\">#3376193\u003C\u002Fa>, patch by \u003Ca href=\"https:\u002F\u002Fwww.drupal.org\u002Fu\u002Fjeffschuler\">jeffschuler\u003C\u002Fa>). The Views UI preview panel was reading an exposed filter's field name instead of its configured identifier, breaking any view where you'd renamed a filter to something readable. It now reads the identifier the display is actually configured with.\u003C\u002Fp>",{"type":23,"html":288},"\u003Cp>\u003Cstrong>OpenAPI schema export crashed with jsonapi_views enabled\u003C\u002Fstrong> (\u003Ca href=\"https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Fjsonapi_views\u002Fissues\u002F3265781\">#3265781\u003C\u002Fa>). jsonapi_views now reports a view's real \u003Ccode>ResourceType\u003C\u002Fcode> on the route when its entity type has exactly one bundle, so OpenAPI describes it correctly; multi-bundle views are left alone.\u003C\u002Fp>",{"type":18,"title":290,"layout":19,"regions":291},"What's next",{"content":292},[293],{"type":23,"html":294},"\u003Cp>This is part of the same push that got Field Tokens 2.0.0 and Custom Formatters 4.1.0 out the door: working through my modules one at a time and actually clearing the backlog, not just triaging it. There's more coming for JSON:API Views too, tighter access control at the route level, more performance headroom for sites well past a hundred exposed views, and eventually a 2.0.x that flips exposure from opt-out to opt-in. File (Field) Paths is next up though, tens of thousands of sites and still sitting in RC ahead of a stable 1.0.\u003C\u002Fp>",{"type":18,"layout":19,"regions":296},{"content":297},[298,309,311,313,317],{"type":299,"title":300,"content":301},"jumbotron","If your project depends on this work",[302,304],{"type":23,"html":303},"\u003Cp>JSON:API Views, the wider Druxt ecosystem, the other modules I maintain - I build all of it in the open, and sponsorship is what keeps it actively maintained.\u003C\u002Fp>",{"type":305,"link":306},"link",{"href":307,"label":308},"https:\u002F\u002Fgithub.com\u002Fsponsors\u002FDecipher","Sponsor on GitHub",{"type":23,"html":310},"\u003Cp>If any of this is useful to you, 8.x-1.2 is out now:\u003C\u002Fp>",{"type":36,"code":312},"composer require 'drupal\u002Fjsonapi_views:^1.2'",{"type":118,"description":314,"url":315,"gitpod":121,"drupalUrl":316},"Source on GitHub, project page on Drupal.org, patches welcome in the issue queue. If your project depends on this, sponsoring keeps it actively maintained.","https:\u002F\u002Fgithub.com\u002FDecipher\u002Fjsonapi_views","https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Fjsonapi_views",{"type":23,"html":318},"\u003Cp>What's your decoupled stack - are you hand-rolling a listing endpoint for every view, or reaching for something like this? I'd genuinely like to know.\u003C\u002Fp>","\u002Fwriting\u002Fjsonapi-views-120-20260812",{"loc":319},"articles-data\u002Fjsonapi-views-120-20260812","IsRHTHtqIKYhqX2U3Spkek9suuSbvuZjZBeYs_Gog8c",{"id":324,"title":325,"articleType":7,"categories":326,"date":327,"description":328,"extension":14,"meta":329,"paragraphs":330,"path":422,"readingTime":222,"sitemap":423,"stem":424,"__hash__":425},"articleEntries\u002Farticles-data\u002Fcustom-formatters-410-20260731.json","Custom Formatters 4.1.0",[9,11],"2026-07-31T13:30:00+10:00","Nearly a decade after stepping away, 4.1.0 picks the module back up and brings back formatter settings, live preview, a CodeMirror editor, and Devel Generate support, with more to come.",{},[331,338,363,375,381,392,398,411],{"type":18,"layout":19,"regions":332},{"content":333},[334,336],{"type":23,"html":335},"\u003Cp>Custom Formatters is old. I started it in 2009, my first year building seriously for Drupal, and shipped it through Drupal 6 and 7. Then in late 2016, not long after the first Drupal 8 alpha, I stepped away (work, life, the usual reasons) and for the best part of a decade it wasn't mine to ship.\u003C\u002Fp>\n\n\u003Cp>It didn't die, though, and that's almost entirely down to one person. \u003Ca href=\"https:\u002F\u002Fwww.drupal.org\u002Fu\u002Fpodarok\">Andrii Podanenko\u003C\u002Fa> (\u003Cem>podarok\u003C\u002Fem>), backed by \u003Ca href=\"https:\u002F\u002Fwww.drupal.org\u002Fitcare\">ITCare\u003C\u002Fa> and the \u003Ca href=\"https:\u002F\u002Fwww.drupal.org\u002Fopen-y\">Open Y\u003C\u002Fa> distribution, carried it through the Drupal 8 beta, the Drupal 10 port, and the start of the Drupal 11 line, essentially single-handedly, for years. Huge thanks to Andrii for looking after it all that time. I've picked the 4.1.x line back up alongside him, and 4.1.0 is the first release to come out of that.\u003C\u002Fp>",{"type":23,"html":337},"\u003Cp>4.1.0 is, deliberately, a bit of a nostalgia trip. A handful of the things that made the module worth reaching for in the first place quietly went missing during the Drupal 8 port (formatter settings, live preview, a real code editor, Devel Generate support), and this release brings four of them back. There's new stuff too.\u003C\u002Fp>",{"type":18,"title":339,"layout":19,"regions":340},"Formatter settings",{"content":341},[342,344,350,352,358,360],{"type":23,"html":343},"\u003Cp>The old approach leaned on the Form Builder module, a separate drag-and-drop form builder bolted on the side. You'd end up with a real settings form in theory, but what it actually generated behind the scenes was a block of PHP form arrays that got \u003Ccode>eval()\u003C\u002Fcode>'d at render time. Clever for 2011. Not exactly integrated, and it quietly disappeared in the Drupal 8 port along with a few other things.\u003C\u002Fp>\n\n\u003Cp>4.1.0 finally replaces it. Formatter settings are just fields now, attached to a formatter the same way you'd attach fields to any content type: a text field for a CSS class, a boolean for whether to link to the entity, whatever the formatter needs. In the template it's \u003Ccode>settings.field_name\u003C\u002Fcode> for the rendered value, or \u003Ccode>raw_settings.field_name\u003C\u002Fcode> if you want it unformatted.\u003C\u002Fp>",{"type":53,"src":345,"alt":346,"caption":347,"width":348,"height":349},"\u002Fimages\u002Fwriting\u002Fcustom-formatters-settings-fields.png","The Manage Fields tab on a Custom Formatters formatter, listing two attached fields: CSS class (Short text) and Link to entity (Boolean)","Attached like any other field.",1198,298,{"type":23,"html":351},"\u003Cp>You attach the fields the normal way, and configure them per placement right from Manage Display, the same way you'd configure an image style:\u003C\u002Fp>",{"type":53,"src":353,"alt":354,"caption":355,"width":356,"height":357},"\u002Fimages\u002Fwriting\u002Fcustom-formatters-settings-manage-display.png","The inline formatter settings on a Manage Display row for the Linkable title formatter, with a CSS class field set to text-lg and a Link to entity toggle switched on","Configured the same way as an image style.",810,463,{"type":23,"html":359},"\u003Cp>The module ships its own example of this, a Twig formatter called \"Linkable title\" that wraps the field value in a link and applies whatever class you've given it:\u003C\u002Fp>",{"type":36,"title":361,"code":362},"Example: Linkable title (Twig + settings)","{% for item in items %}\n  {% set class = settings.field_css_class ? ' class=\"' ~ settings.field_css_class|clean_class ~ '\"' : '' %}\n  {% if settings.field_link and settings.field_link|lower not in ['no', 'off', 'false', '0', ''] %}\n    \u003Ca href=\"{{ entity.id ? path('entity.node.canonical', {'node': entity.id}) : '#' }}\"{{ class|raw }}>{{ item.value }}\u003C\u002Fa>\n  {% else %}\n    \u003Cspan{{ class|raw }}>{{ item.value }}\u003C\u002Fspan>\n  {% endif %}\n{% endfor %}",{"type":18,"title":364,"layout":19,"regions":365},"Live preview",{"content":366},[367,369],{"type":23,"html":368},"\u003Cp>Settings only matter if you can see what they do, so live preview is back too, and it's wired into settings. Pick an entity, fill in the settings, and watch the output render right there on the edit form. The panel gives you per-engine debug output alongside the render itself (a variables dump for Twig and PHP, the raw HTML for HTML+Token), so you can see exactly what reached the template.\u003C\u002Fp>",{"type":53,"src":370,"alt":371,"caption":372,"width":373,"height":374},"\u002Fimages\u002Fwriting\u002Fcustom-formatters-settings-hero.png","The formatter edit form showing the syntax-highlighted CodeMirror editor for the Linkable title Twig template above a live preview panel, with CSS class set to text-lg and Link to entity enabled, a rendered link to a node, and a debug dump showing the settings and raw_settings values","Fill in the settings, see it render.",1312,1656,{"type":18,"title":376,"layout":19,"regions":377},"Devel Generate",{"content":378},[379],{"type":23,"html":380},"\u003Cp>And if nothing on the site has the right field type yet (say you're building an image formatter before any image field exists), Devel Generate support steps in. It builds a throwaway sample entity for the preview instead of leaving it blank, so you're never creating a dummy node just to see your formatter render.\u003C\u002Fp>",{"type":18,"title":382,"layout":19,"regions":383},"A real code editor",{"content":384},[385,387],{"type":23,"html":386},"\u003Cp>The last of the four returning features is the one I'm most pleased with: a real code editor. The template field is now a CodeMirror editor, syntax-highlighted with HTML-aware auto-closing tags, instead of a plain textarea. More usefully, its autocomplete actually knows what each engine supports. Type \u003Ccode>{{\u003C\u002Fcode> in a Twig formatter and it offers the variables in scope; type \u003Ccode>[\u003C\u002Fcode> in an HTML+Token formatter and it offers Drupal tokens, including the \u003Ccode>[formatter_setting:...]\u003C\u002Fcode> ones; \u003Ccode>Ctrl+Space\u003C\u002Fcode> gives you context-appropriate suggestions in any engine.\u003C\u002Fp>",{"type":53,"src":388,"alt":389,"caption":390,"width":348,"height":391},"\u002Fimages\u002Fwriting\u002Fcustom-formatters-autocomplete.png","The CodeMirror editor on a Twig formatter with the autocomplete dropdown open after typing {{, offering the in-scope variables items, entity, langcode, settings and raw_settings","Type {{ in a Twig formatter: autocomplete knows what's in scope.",633,{"type":18,"title":393,"layout":19,"regions":394},"Also back",{"content":395},[396],{"type":23,"html":397},"\u003Cp>A few smaller things are back as well: a Save &amp; Edit button, so you're not bounced back to the formatter list every time you tweak something; and an \u003Ccode>entity\u003C\u002Fcode> variable in Twig templates, so a formatter can reach the parent entity directly instead of only the field it's attached to. Drupal 11 support is locked in.\u003C\u002Fp>\n\n\u003Cp>Integration with the \u003Ca href=\"https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Finsert\">Insert\u003C\u002Fa> module is back too. Any formatter targeting an image, file, or entity reference field is automatically exposed as an Insert style and can be dropped straight into a WYSIWYG.\u003C\u002Fp>",{"type":18,"title":399,"layout":19,"regions":400},"Connected to Field Tokens",{"content":401},[402,404],{"type":23,"html":403},"\u003Cp>If you're running Field Tokens as well, this connects to something I fixed there too. The \u003Ccode>[formatted_field-*]\u003C\u002Fcode> integration, which lets a token render a field through one of these formatters, broke during Field Tokens' own Drupal 8 port and stayed broken for years. 2.0.0 rebuilt that data provider from scratch, so whatever you build here, settings included, is reachable from a token again.\u003C\u002Fp>",{"type":405,"title":406,"description":407,"link":408},"card","Field Tokens 2.0.0","Wildcard deltas, dot notation for nested formatter settings, and a restored Custom Formatters integration.",{"href":409,"label":410},"\u002Fwriting\u002Ffield-tokens-200-20260722","Read the Field Tokens 2.0.0 post",{"type":18,"layout":19,"regions":412},{"content":413},[414,416,418],{"type":23,"html":415},"\u003Cp>If any of this is useful to you, 4.1.0 is out now:\u003C\u002Fp>",{"type":36,"code":417},"composer require 'drupal\u002Fcustom_formatters:^4.1'",{"type":118,"description":419,"url":420,"gitpod":121,"drupalUrl":421},"Source on GitHub, the full project page on Drupal.org, and if it's saved you some time, sponsorship is always appreciated.","https:\u002F\u002Fgithub.com\u002FDecipher\u002Fcustom_formatters","https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Fcustom_formatters","\u002Fwriting\u002Fcustom-formatters-410-20260731",{"loc":422},"articles-data\u002Fcustom-formatters-410-20260731","b94HneyZbDy5y7s94XfcKeA2cLF4sAIZQ_Wkloh7mv8",{"list":427},[428,431,434,437,447,454,461,467,473,479,485,490,495,498,501,504,507,510,514,518],{"title":429,"field_project_machine_name":430,"project_usage":-1,"flag_project_star_user":-1},"SSI","ssi",{"title":432,"field_project_machine_name":433,"project_usage":-1,"flag_project_star_user":-1},"BitTorrent Sync fields","btsync_fields",{"title":435,"field_project_machine_name":436,"project_usage":-1,"flag_project_star_user":-1},"Druxt connect","druxt_connect",{"title":438,"field_project_machine_name":439,"project_usage":440,"flag_project_star_user":-1},"ImageField Tokens","imagefield_tokens",{"3.0.x":441,"8.x-2.x":442,"6.x-1.x":443,"7.x-1.x":444,"3.1.x":445,"3.2.x":446},20,237,123,2954,"161","627",{"title":448,"field_project_machine_name":449,"project_usage":450,"flag_project_star_user":-1},"Wysiwyg Fields","wysiwyg_fields",{"6.x-1.x":451,"7.x-2.x":452,"7.x-1.x":453},"1","9","29",{"title":455,"field_project_machine_name":456,"project_usage":457,"flag_project_star_user":-1},"Mobile Codes","mobile_codes",{"6.x-1.x":458,"6.x-2.x":459,"7.x-2.x":460},"2",9,378,{"title":462,"field_project_machine_name":463,"project_usage":464,"flag_project_star_user":-1},"File Aliases","file_aliases",{"6.x-1.x":465,"7.x-1.x":466},35,62,{"title":468,"field_project_machine_name":469,"project_usage":470,"flag_project_star_user":-1},"Drag'n'Drop Uploads","dragndrop_uploads",{"6.x-1.x":471,"7.x-1.x":472},"7","37",{"title":474,"field_project_machine_name":475,"project_usage":476,"flag_project_star_user":-1},"Wysiwyg ImageField","wysiwyg_imagefield",{"6.x-1.x":477,"7.x-1.x":478},8,"63",{"title":480,"field_project_machine_name":481,"project_usage":482,"flag_project_star_user":-1},"Formatters for Node Reference fields","formatters4nodereference",{"6.x-1.x":483,"7.x-1.x":484},"3","5",{"title":486,"field_project_machine_name":487,"project_usage":488,"flag_project_star_user":-1},"Formatter Settings","formatter_settings",{"6.x-1.x":489},"6",{"title":491,"field_project_machine_name":492,"project_usage":493,"flag_project_star_user":-1},"Deep Zoom","deepzoom",{"7.x-1.x":494},19,{"title":496,"field_project_machine_name":497,"project_usage":-1,"flag_project_star_user":-1},"Hostmaster Reinstall","hostmaster_reinstall",{"title":499,"field_project_machine_name":500,"project_usage":-1,"flag_project_star_user":-1},"Provision Reinstall","provision_reinstall",{"title":502,"field_project_machine_name":503,"project_usage":-1,"flag_project_star_user":-1},"Hosting Reinstall","hosting_reinstall",{"title":505,"field_project_machine_name":506,"project_usage":-1,"flag_project_star_user":-1},"Render As","renderas",{"title":508,"field_project_machine_name":509,"project_usage":-1,"flag_project_star_user":-1},"Derivicon","derivicon",{"title":511,"field_project_machine_name":512,"project_usage":513,"flag_project_star_user":-1},"Contextual variables","context_variable",{"7.x-1.x":483},{"title":515,"field_project_machine_name":516,"project_usage":517,"flag_project_star_user":-1},"Contextual modules","context_module",{"7.x-1.x":483},{"title":519,"field_project_machine_name":520,"project_usage":521,"flag_project_star_user":-1},"Contextual server variables","context_server_vars",{"7.x-1.x":458},{"list":523},[524,529,533,536,543,548,557,560,565,572],{"title":525,"field_project_machine_name":526,"project_usage":527,"flag_project_star_user":-1},"Dindent","dindent",{"7.x-1.x":528},"4",{"title":530,"field_project_machine_name":531,"project_usage":532,"flag_project_star_user":-1},"famfamfam.com icons","famfamfam",{"7.x-1.x":459},{"title":534,"field_project_machine_name":535,"project_usage":-1,"flag_project_star_user":-1},"Better sub-themes","better_subthemes",{"title":537,"field_project_machine_name":538,"project_usage":539,"flag_project_star_user":-1},"Field Tokens","field_tokens",{"7.x-1.x":540,"2.0.x":541,"8.x-1.x":542},434,364,"93",{"title":544,"field_project_machine_name":545,"project_usage":546,"flag_project_star_user":-1},"JSON:API Menu Items","jsonapi_menu_items",{"1.2.x":547,"1.1.x":477},3782,{"title":549,"field_project_machine_name":550,"project_usage":551,"flag_project_star_user":-1},"Custom Formatters","custom_formatters",{"6.x-1.x":552,"8.x-3.x":553,"4.1.x":554,"7.x-2.x":555,"4.0.x":556},45,85,384,2557,"64",{"title":558,"field_project_machine_name":559,"project_usage":-1,"flag_project_star_user":-1},"Decoupled Settings","decoupled_settings",{"title":561,"field_project_machine_name":562,"project_usage":563,"flag_project_star_user":-1},"Administration Menu select","admin_select",{"7.x-1.x":564,"6.x-1.x":451},172,{"title":566,"field_project_machine_name":567,"project_usage":568,"flag_project_star_user":-1},"File (Field) Paths","filefield_paths",{"6.x-2.x":451,"6.x-1.x":569,"7.x-1.x":570,"8.x-1.x":571},573,11660,17567,{"title":573,"field_project_machine_name":574,"project_usage":575,"flag_project_star_user":-1},"DruxtJS","druxt",{"1.0.x":451,"1.1.x":483,"1.2.x":576},415,{"list":578},[579,582,585,588,591,594,597,600,603,606,609,612,615,618,621,624,627,630,633,636,639,642,645,648,651,654,657,660,663,666,669,672,675,678,681,684,687,690,693,696,699,702,705,708,711,714,717,720,723,726],{"created":580,"url":581},"1788920715","https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Fdruxt\u002Fissues\u002F3309969#comment-16764482",{"created":583,"url":584},"1788818455","https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Ffilefield_paths\u002Fissues\u002F3035301#comment-16762452",{"created":586,"url":587},"1788818437","https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Ffilefield_paths\u002Fissues\u002F3035301#comment-16762451",{"created":589,"url":590},"1788768757","https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Fdruxt\u002Fissues\u002F3309969#comment-16761345",{"created":592,"url":593},"1788767371","https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Fdruxt\u002Fissues\u002F3309969#comment-16761316",{"created":595,"url":596},"1788750260","https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Ffilefield_paths\u002Fissues\u002F3619767#comment-16761121",{"created":598,"url":599},"1788746171","https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Ffilefield_paths\u002Fissues\u002F3619767#comment-16761099",{"created":601,"url":602},"1788745468","https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Ffilefield_paths\u002Fissues\u002F3619767#comment-16761083",{"created":604,"url":605},"1788745341","https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Ffilefield_paths\u002Fissues\u002F3045063#comment-16761081",{"created":607,"url":608},"1788594321","https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Fdruxt\u002Fissues\u002F3273228#comment-16759310",{"created":610,"url":611},"1788418391","https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Fdruxt\u002Fissues\u002F3618677#comment-16756416",{"created":613,"url":614},"1788343885","https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Ffilefield_paths\u002Fissues\u002F3045063#comment-16754995",{"created":616,"url":617},"1788343069","https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Ffilefield_paths\u002Fissues\u002F3045063#comment-16754962",{"created":619,"url":620},"1788340410","https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Ffilefield_paths\u002Fissues\u002F3432653#comment-16754902",{"created":622,"url":623},"1788340346","https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Ffilefield_paths\u002Fissues\u002F3616606#comment-16754899",{"created":625,"url":626},"1788244103","https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Ffilefield_paths\u002Fissues\u002F3035301#comment-16753337",{"created":628,"url":629},"1788132203","https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Ffilefield_paths\u002Fissues\u002F3035301#comment-16751914",{"created":631,"url":632},"1787963893","https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Ffilefield_paths\u002Fissues\u002F3419618#comment-16750632",{"created":634,"url":635},"1787898274","https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Ffilefield_paths\u002Fissues\u002F3432653#comment-16749653",{"created":637,"url":638},"1787898260","https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Ffilefield_paths\u002Fissues\u002F3432653#comment-16749652",{"created":640,"url":641},"1787897913","https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Ffilefield_paths\u002Fissues\u002F3432653#comment-16749648",{"created":643,"url":644},"1787890622","https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Ffilefield_paths\u002Fissues\u002F3616606#comment-16749586",{"created":646,"url":647},"1787889464","https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Ffilefield_paths\u002Fissues\u002F3616606#comment-16749583",{"created":649,"url":650},"1787887387","https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Fdecoupled_settings\u002Fissues\u002F3619604#comment-16749580",{"created":652,"url":653},"1787886777","https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Fdecoupled_settings\u002Fissues\u002F3619603#comment-16749579",{"created":655,"url":656},"1787802107","https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Ffilefield_paths\u002Fissues\u002F3569210#comment-16748329",{"created":658,"url":659},"1787794815","https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Ffilefield_paths\u002Fissues\u002F3569210#comment-16748309",{"created":661,"url":662},"1787793869","https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Ffilefield_paths\u002Fissues\u002F3569210#comment-16748306",{"created":664,"url":665},"1787793012","https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Fdecoupled_settings\u002Fissues\u002F3619391#comment-16748304",{"created":667,"url":668},"1787783005","https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Fcontrib_tracker\u002Fissues\u002F2683111#comment-16748252",{"created":670,"url":671},"1787782984","https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Fcontrib_tracker\u002Fissues\u002F2700763#comment-16748250",{"created":673,"url":674},"1787649595","https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Ffilefield_paths\u002Fissues\u002F3419618#comment-16745649",{"created":676,"url":677},"1787628485","https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Fdruxt\u002Fissues\u002F3312152#comment-16745255",{"created":679,"url":680},"1787613697","https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Fdruxt\u002Fissues\u002F3618677#comment-16745185",{"created":682,"url":683},"1787612239","https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Fdruxt\u002Fissues\u002F3618675#comment-16745160",{"created":685,"url":686},"1787556438","https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Ffilefield_paths\u002Fissues\u002F3015137#comment-16744134",{"created":688,"url":689},"1787536449","https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Ffilefield_paths\u002Fissues\u002F3015137#comment-16743932",{"created":691,"url":692},"1787520571","https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Fdruxt\u002Fissues\u002F3618675#comment-16743820",{"created":694,"url":695},"1787472800","https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Fdruxt\u002Fissues\u002F3618677#comment-16743404",{"created":697,"url":698},"1787472568","https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Fdruxt\u002Fissues\u002F3618675#comment-16743402",{"created":700,"url":701},"1787472043","https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Fdecoupled_router\u002Fissues\u002F3111456#comment-16743399",{"created":703,"url":704},"1787472000","https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Fdecoupled_router\u002Fissues\u002F3111456#comment-16743397",{"created":706,"url":707},"1787452630","https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Ftextimage\u002Fissues\u002F3569464#comment-16743364",{"created":709,"url":710},"1787379945","https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Fdecoupled_router\u002Fissues\u002F3397122#comment-16742743",{"created":712,"url":713},"1787379281","https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Fdecoupled_router\u002Fissues\u002F3411402#comment-16742738",{"created":715,"url":716},"1787378122","https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Fdecoupled_router\u002Fissues\u002F3611685#comment-16742732",{"created":718,"url":719},"1787355802","https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Ftextimage\u002Fissues\u002F3569464#comment-16742670",{"created":721,"url":722},"1787268648","https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Ftextimage\u002Fissues\u002F3569464#comment-16741259",{"created":724,"url":725},"1787042573","https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Fdecoupled_router\u002Fissues\u002F3495182#comment-16737142",{"created":727,"url":728},"1787042397","https:\u002F\u002Fwww.drupal.org\u002Fproject\u002Ffilefield_paths\u002Fissues\u002F3419618#comment-16737135",{"list":730},[731,734,737,740,743,746,749,752,755,758,761,764,767,770,773,776,779,782,785,788,791,794,797,800,803,806,809,812,815,818,821,824,827,830,833,836,839,842,845,848,851,854,857,860,863,866,869,872,875,878],{"created":732,"title":733},"1788935723","druxt 1.3.1",{"created":735,"title":736},"1788925070","druxt 1.3.0",{"created":738,"title":739},"1788768644","druxt 1.3.x-dev",{"created":741,"title":742},"1788767562","filefield_paths 8.x-1.0-rc2",{"created":744,"title":745},"1788585516","druxt 1.2.2",{"created":747,"title":748},"1787731539","decoupled_settings 1.0.0-beta2",{"created":750,"title":751},"1787654460","decoupled_settings 1.0.0-beta1",{"created":753,"title":754},"1787382308","decoupled_router 2.0.7",{"created":756,"title":757},"1786266222","jsonapi_views 8.x-1.2",{"created":759,"title":760},"1785462039","custom_formatters 4.1.0",{"created":762,"title":763},"1784183539","imagefield_tokens 3.2.x-dev",{"created":765,"title":766},"1783477661","field_tokens 2.0.0",{"created":768,"title":769},"1781748605","field_tokens 2.0.0-rc4",{"created":771,"title":772},"1780823431","custom_formatters 4.1.0-beta3",{"created":774,"title":775},"1779757758","field_tokens 2.0.x-dev",{"created":777,"title":778},"1779586472","custom_formatters 4.1.0-beta2",{"created":780,"title":781},"1777794354","custom_formatters 4.1.x-dev",{"created":783,"title":784},"1676000321","druxt 1.2.x-dev",{"created":786,"title":787},"1676000291","druxt 1.2.0",{"created":789,"title":790},"1675998772","jsonapi_views 8.x-1.1",{"created":792,"title":793},"1635120605","druxt 1.1.1",{"created":795,"title":796},"1634962907","druxt 1.1.0",{"created":798,"title":799},"1634962672","druxt 1.1.x-dev",{"created":801,"title":802},"1633070672","jsonapi_views 8.x-1.0",{"created":804,"title":805},"1623905502","jsonapi_views 8.x-1.0-beta3",{"created":807,"title":808},"1623037306","druxt 1.0.2",{"created":810,"title":811},"1622617266","druxt 1.0.1",{"created":813,"title":814},"1619993261","jsonapi_menu_items 1.2.1",{"created":816,"title":817},"1619843589","druxt 1.0.0",{"created":819,"title":820},"1618724732","jsonapi_menu_items 1.2.0",{"created":822,"title":823},"1618724492","jsonapi_menu_items 1.2.x-dev",{"created":825,"title":826},"1616619130","jsonapi_views 8.x-1.0-beta2",{"created":828,"title":829},"1615111239","druxt 1.0.0-beta2",{"created":831,"title":832},"1612775511","druxt 1.0.0-beta1",{"created":834,"title":835},"1612768879","jsonapi_views 8.x-1.0-beta1",{"created":837,"title":838},"1611263472","jsonapi_menu_items 1.1.1",{"created":840,"title":841},"1611184889","jsonapi_menu_items 1.1.x-dev",{"created":843,"title":844},"1602805495","druxt 0.4.1",{"created":846,"title":847},"1600354700","jsonapi_menu_items 1.1.0",{"created":849,"title":850},"1599791532","jsonapi_menu_items 1.0.1",{"created":852,"title":853},"1599537629","druxt 0.4.0",{"created":855,"title":856},"1599199621","jsonapi_menu_items 1.0.0",{"created":858,"title":859},"1599199507","jsonapi_menu_items 1.0.x-dev",{"created":861,"title":862},"1598235135","druxt 0.3.0",{"created":864,"title":865},"1597270761","druxt 0.2.0",{"created":867,"title":868},"1597127254","decoupled_router 8.x-1.12",{"created":870,"title":871},"1595661841","druxt 0.1.0",{"created":873,"title":874},"1595661719","druxt 0.0.x-dev",{"created":876,"title":877},"1595067695","druxt 1.0.x-dev",{"created":879,"title":880},"1481224378","gss 8.x-1.x-dev",[882,891,897,903,909,915,921,926,930,935,941,948,952,959,965,970,975,980,986,992,997,1001,1006,1015,1021,1027,1033,1040,1045,1050,1055,1060,1066,1071,1077,1081,1087,1092,1096,1101,1107,1112,1117,1123,1127,1132,1137,1143,1149,1155,1160,1165,1170,1175,1179,1184,1188,1193,1197,1202,1207,1211,1217,1220,1225,1231,1236,1241,1245,1249,1254,1259,1265,1271,1275,1280,1284,1290,1295,1300,1306,1311,1316,1321,1325,1330,1336,1341,1345,1350,1355,1360,1367,1372,1377,1382,1388,1393,1398,1403,1407,1412,1417,1422,1426,1430,1434,1439,1445,1450,1455,1460,1465,1470,1475,1479,1483,1488,1492,1497,1502,1508,1514,1518,1521,1526,1530,1534,1538,1543,1548,1552,1557,1561,1564,1570,1574,1579,1583,1588,1593,1597,1601,1605,1611,1616,1621,1625,1630,1634,1639,1644,1648,1652,1657,1662,1666,1670,1674,1678,1682,1687,1691,1695,1699,1704,1709,1713,1718,1723,1728,1732,1736,1740,1744,1748,1752,1756,1760,1764,1769,1773,1779,1783,1787,1792,1797,1802,1807,1812,1817,1822,1826,1830,1834,1839,1843,1847,1852,1857,1861,1866,1871,1875,1879,1885,1889,1893,1897,1902,1907,1911,1915,1919,1925,1930,1934,1938,1941,1947,1951,1956,1960,1964,1968,1972,1976,1981,1986,1990,1996,2001,2007,2013,2017,2023,2028,2033,2037,2041,2046,2050,2054,2058,2062,2066,2070,2074,2078,2081,2085,2089,2094,2099,2104,2109,2114,2119,2123,2127,2132,2137,2142,2146,2150,2154,2158,2162,2166,2170,2174,2178,2182,2186,2192,2198,2202,2206,2210,2216,2220,2225,2229,2234,2238,2244,2249,2254,2259,2263,2268,2273,2278,2282,2287,2291,2295,2300,2304],{"type":883,"repo":884,"created_at":886,"payload":887},"PullRequestEvent",{"name":885},"Decipher\u002Fstuar.tc","2026-09-09T09:54:03Z",{"action":888,"pull_request":889},"merged",{"number":890},178,{"type":892,"repo":893,"created_at":894,"payload":895},"PushEvent",{"name":885},"2026-09-09T09:42:48Z",{"ref":896},"refs\u002Fheads\u002Fdevelop",{"type":883,"repo":898,"created_at":899,"payload":900},{"name":885},"2026-09-09T09:45:36Z",{"action":901,"pull_request":902},"opened",{"number":890},{"type":883,"repo":904,"created_at":905,"payload":906},{"name":885},"2026-09-09T09:42:46Z",{"action":888,"pull_request":907},{"number":908},176,{"type":883,"repo":910,"created_at":911,"payload":912},{"name":885},"2026-09-09T09:42:45Z",{"action":888,"pull_request":913},{"number":914},175,{"type":892,"repo":916,"created_at":918,"payload":919},{"name":917},"Decipher\u002Ffilefield_paths","2026-09-07T23:13:53Z",{"ref":920},"refs\u002Fheads\u002Ffeature\u002F1.0-changelog-history",{"type":892,"repo":922,"created_at":923,"payload":924},{"name":885},"2026-09-09T09:18:36Z",{"ref":925},"refs\u002Fheads\u002Fdocs\u002Fdruxt-drupal-130-resource-list",{"type":892,"repo":927,"created_at":928,"payload":929},{"name":917},"2026-09-07T23:34:42Z",{"ref":920},{"type":892,"repo":931,"created_at":932,"payload":933},{"name":885},"2026-09-09T09:17:43Z",{"ref":934},"refs\u002Fheads\u002Ffeat\u002Fcode-block-syntax-highlighting",{"type":892,"repo":936,"created_at":938,"payload":939},{"name":937},"Decipher\u002Fdecoupled_router","2026-09-07T23:06:00Z",{"ref":940},"refs\u002Fheads\u002F3111456-language-issue-5.0.6",{"type":942,"repo":943,"created_at":944,"payload":945},"CreateEvent",{"name":917},"2026-09-07T22:30:27Z",{"ref":946,"ref_type":947},"feature\u002F1.0-changelog-history","branch",{"type":892,"repo":949,"created_at":950,"payload":951},{"name":885},"2026-09-09T08:50:31Z",{"ref":925},{"type":883,"repo":953,"created_at":955,"payload":956},{"name":954},"druxt\u002Fdruxt.js","2026-09-09T08:54:41Z",{"action":901,"pull_request":957},{"number":958},823,{"type":942,"repo":960,"created_at":962,"payload":963},{"name":961},"Decipher\u002Fdecoupled_settings","2026-09-08T05:25:28Z",{"ref":964,"ref_type":947},"feature\u002F12-consumer-access",{"type":942,"repo":966,"created_at":967,"payload":968},{"name":885},"2026-09-09T08:47:14Z",{"ref":969,"ref_type":947},"feat\u002Fcode-block-syntax-highlighting",{"type":883,"repo":971,"created_at":972,"payload":973},{"name":885},"2026-09-09T08:47:37Z",{"action":901,"pull_request":974},{"number":908},{"type":883,"repo":976,"created_at":977,"payload":978},{"name":885},"2026-09-09T08:47:35Z",{"action":901,"pull_request":979},{"number":914},{"type":892,"repo":981,"created_at":983,"payload":984},{"name":982},"druxt\u002Fdemo.druxtjs.org","2026-09-08T04:08:15Z",{"ref":985},"refs\u002Fheads\u002Fmain",{"type":942,"repo":987,"created_at":989,"payload":990},{"name":988},"Decipher\u002FDecipher.github.io","2026-09-08T03:46:35Z",{"ref":991,"ref_type":947},"feature\u002Fsite-article",{"type":892,"repo":993,"created_at":994,"payload":995},{"name":982},"2026-09-08T03:15:10Z",{"ref":996},"refs\u002Fheads\u002Ffeat\u002Fvisual-refresh",{"type":892,"repo":998,"created_at":999,"payload":1000},{"name":982},"2026-09-07T21:40:05Z",{"ref":996},{"type":892,"repo":1002,"created_at":1003,"payload":1004},{"name":961},"2026-09-08T02:50:32Z",{"ref":1005},"refs\u002Fheads\u002Ffeature\u002F15-theme-manifest",{"type":1007,"repo":1008,"created_at":1010,"payload":1011},"ReleaseEvent",{"name":1009},"druxt\u002Fdruxt_drupal","2026-09-09T06:38:27Z",{"action":1012,"release":1013},"published",{"tag_name":1014},"1.3.1",{"type":892,"repo":1016,"created_at":1018,"payload":1019},{"name":1017},"Decipher\u002Fdruxt_drupal","2026-09-09T06:00:09Z",{"ref":1020},"refs\u002Fheads\u002F1.3.x",{"type":883,"repo":1022,"created_at":1023,"payload":1024},{"name":1017},"2026-09-09T06:00:08Z",{"action":888,"pull_request":1025},{"number":1026},17,{"type":883,"repo":1028,"created_at":1029,"payload":1030},{"name":1017},"2026-09-09T06:00:07Z",{"action":888,"pull_request":1031},{"number":1032},15,{"type":1034,"repo":1035,"created_at":1036,"payload":1037},"PullRequestReviewCommentEvent",{"name":1017},"2026-09-09T05:49:48Z",{"action":1038,"pull_request":1039},"created",{"number":1026},{"type":1041,"repo":1042,"created_at":1036,"payload":1043},"PullRequestReviewEvent",{"name":1017},{"action":1038,"pull_request":1044},{"number":1026},{"type":892,"repo":1046,"created_at":1047,"payload":1048},{"name":1017},"2026-09-09T05:49:27Z",{"ref":1049},"refs\u002Fheads\u002Fdocs\u002Fvale-prose-fixes",{"type":883,"repo":1051,"created_at":1052,"payload":1053},{"name":1017},"2026-09-09T05:20:45Z",{"action":901,"pull_request":1054},{"number":1026},{"type":942,"repo":1056,"created_at":1057,"payload":1058},{"name":1017},"2026-09-09T05:20:16Z",{"ref":1059,"ref_type":947},"docs\u002Fvale-prose-fixes",{"type":883,"repo":1061,"created_at":1062,"payload":1063},{"name":1017},"2026-09-09T05:15:00Z",{"action":901,"pull_request":1064},{"number":1065},16,{"type":883,"repo":1067,"created_at":1068,"payload":1069},{"name":1017},"2026-09-09T04:59:55Z",{"action":901,"pull_request":1070},{"number":1032},{"type":1072,"repo":1073,"created_at":1074,"payload":1075},"DeleteEvent",{"name":1017},"2026-09-09T04:40:47Z",{"ref":1076,"ref_type":947},"fix\u002Finstall-phase-requirements",{"type":892,"repo":1078,"created_at":1079,"payload":1080},{"name":1009},"2026-09-09T04:40:31Z",{"ref":1020},{"type":883,"repo":1082,"created_at":1083,"payload":1084},{"name":1017},"2026-09-09T04:38:00Z",{"action":888,"pull_request":1085},{"number":1086},14,{"type":883,"repo":1088,"created_at":1089,"payload":1090},{"name":1017},"2026-09-09T04:29:58Z",{"action":901,"pull_request":1091},{"number":1086},{"type":892,"repo":1093,"created_at":1094,"payload":1095},{"name":1017},"2026-09-09T03:23:06Z",{"ref":1020},{"type":942,"repo":1097,"created_at":1098,"payload":1099},{"name":1009},"2026-09-09T03:26:13Z",{"ref":1100,"ref_type":947},"1.3.x",{"type":883,"repo":1102,"created_at":1103,"payload":1104},{"name":1017},"2026-09-09T03:23:04Z",{"action":888,"pull_request":1105},{"number":1106},13,{"type":883,"repo":1108,"created_at":1109,"payload":1110},{"name":1017},"2026-09-09T03:06:37Z",{"action":901,"pull_request":1111},{"number":1106},{"type":1072,"repo":1113,"created_at":1114,"payload":1115},{"name":1017},"2026-09-09T02:11:20Z",{"ref":1116,"ref_type":947},"feature\u002F3541756-cors-allowed-methods",{"type":883,"repo":1118,"created_at":1119,"payload":1120},{"name":1017},"2026-09-09T02:08:52Z",{"action":888,"pull_request":1121},{"number":1122},11,{"type":892,"repo":1124,"created_at":1125,"payload":1126},{"name":1017},"2026-09-09T02:08:53Z",{"ref":1020},{"type":892,"repo":1128,"created_at":1129,"payload":1130},{"name":1017},"2026-09-09T01:12:14Z",{"ref":1131},"refs\u002Fheads\u002Ffeature\u002F3541756-cors-allowed-methods",{"type":892,"repo":1133,"created_at":1134,"payload":1135},{"name":988},"2026-09-08T22:25:28Z",{"ref":1136},"refs\u002Fheads\u002Ffeature\u002Fsite-article",{"type":892,"repo":1138,"created_at":1140,"payload":1141},{"name":1139},"druxt\u002Fmodule-template","2026-09-08T21:32:08Z",{"ref":1142},"refs\u002Fheads\u002Ffeat\u002Frepo-standards",{"type":883,"repo":1144,"created_at":1145,"payload":1146},{"name":1017},"2026-09-07T07:42:08Z",{"action":1147,"pull_request":1148},"closed",{"number":477},{"type":1150,"repo":1151,"created_at":1152,"payload":1153},"IssueCommentEvent",{"name":1017},"2026-09-08T22:26:25Z",{"action":1038,"issue":1154},{"number":477},{"type":892,"repo":1156,"created_at":1157,"payload":1158},{"name":1017},"2026-09-07T07:38:17Z",{"ref":1159},"refs\u002Fheads\u002Ffeature\u002F3309969-configurable-resources",{"type":892,"repo":1161,"created_at":1162,"payload":1163},{"name":917},"2026-09-07T05:55:18Z",{"ref":1164},"refs\u002Fheads\u002F8.x-1.x",{"type":892,"repo":1166,"created_at":1167,"payload":1168},{"name":982},"2026-09-06T23:51:01Z",{"ref":1169},"refs\u002Fheads\u002Ffix\u002Fci-hardening",{"type":942,"repo":1171,"created_at":1172,"payload":1173},{"name":982},"2026-09-06T23:20:31Z",{"ref":1174,"ref_type":947},"feat\u002Fvisual-refresh",{"type":892,"repo":1176,"created_at":1177,"payload":1178},{"name":917},"2026-09-06T23:32:54Z",{"ref":1164},{"type":942,"repo":1180,"created_at":1181,"payload":1182},{"name":917},"2026-09-06T23:32:21Z",{"ref":1183,"ref_type":947},"fix\u002Fsecure-default-temp-location",{"type":892,"repo":1185,"created_at":1186,"payload":1187},{"name":982},"2026-09-07T00:52:10Z",{"ref":996},{"type":892,"repo":1189,"created_at":1190,"payload":1191},{"name":917},"2026-09-07T01:09:09Z",{"ref":1192},"refs\u002Fheads\u002Ffeature\u002F3619767-readme-temporary-location",{"type":892,"repo":1194,"created_at":1195,"payload":1196},{"name":982},"2026-09-07T00:44:50Z",{"ref":996},{"type":942,"repo":1198,"created_at":1199,"payload":1200},{"name":982},"2026-09-06T23:20:28Z",{"ref":1201,"ref_type":947},"fix\u002Fci-hardening",{"type":942,"repo":1203,"created_at":1204,"payload":1205},{"name":917},"2026-09-07T00:11:14Z",{"ref":1206,"ref_type":947},"feature\u002F3619767-readme-temporary-location",{"type":942,"repo":1208,"created_at":1209,"payload":1210},{"name":1017},"2026-09-07T04:11:51Z",{"ref":1100,"ref_type":947},{"type":1150,"repo":1212,"created_at":1213,"payload":1214},{"name":1139},"2026-09-08T11:24:22Z",{"action":1038,"issue":1215},{"number":1216},80,{"type":892,"repo":1218,"created_at":1213,"payload":1219},{"name":1139},{"ref":1142},{"type":883,"repo":1221,"created_at":1222,"payload":1223},{"name":1139},"2026-09-08T11:21:14Z",{"action":901,"pull_request":1224},{"number":1216},{"type":892,"repo":1226,"created_at":1228,"payload":1229},{"name":1227},"druxt\u002Fumami.demo.druxtjs.org","2026-09-08T10:39:36Z",{"ref":1230},"refs\u002Fheads\u002Ffeat\u002Fvisual-uplift",{"type":1150,"repo":1232,"created_at":1233,"payload":1234},{"name":961},"2026-09-08T10:39:23Z",{"action":1038,"issue":1235},{"number":1065},{"type":892,"repo":1237,"created_at":1238,"payload":1239},{"name":1227},"2026-09-08T10:39:18Z",{"ref":1240},"refs\u002Fheads\u002Ffeat\u002Fdrupal-11",{"type":892,"repo":1242,"created_at":1243,"payload":1244},{"name":1227},"2026-09-08T10:13:54Z",{"ref":1240},{"type":1072,"repo":1246,"created_at":1247,"payload":1248},{"name":917},"2026-09-07T01:10:05Z",{"ref":1183,"ref_type":947},{"type":892,"repo":1250,"created_at":1251,"payload":1252},{"name":961},"2026-09-08T09:43:32Z",{"ref":1253},"refs\u002Fheads\u002Ffeature\u002F12-consumer-access",{"type":1072,"repo":1255,"created_at":1256,"payload":1257},{"name":1017},"2026-09-08T09:29:16Z",{"ref":1258,"ref_type":947},"docs\u002Freadme-urls",{"type":942,"repo":1260,"created_at":1262,"payload":1263},{"name":1261},"druxt\u002Fquickstart","2026-09-07T00:02:10Z",{"ref":1264,"ref_type":947},"fix\u002Fstart-false-success",{"type":883,"repo":1266,"created_at":1267,"payload":1268},{"name":1017},"2026-09-08T08:52:57Z",{"action":888,"pull_request":1269},{"number":1270},12,{"type":942,"repo":1272,"created_at":1273,"payload":1274},{"name":1017},"2026-09-08T08:42:41Z",{"ref":1258,"ref_type":947},{"type":883,"repo":1276,"created_at":1277,"payload":1278},{"name":1017},"2026-09-08T08:42:43Z",{"action":901,"pull_request":1279},{"number":1270},{"type":892,"repo":1281,"created_at":1282,"payload":1283},{"name":1017},"2026-09-08T08:11:32Z",{"ref":1131},{"type":883,"repo":1285,"created_at":1286,"payload":1287},{"name":1017},"2026-09-03T07:20:12Z",{"action":1147,"pull_request":1288},{"number":1289},6,{"type":1150,"repo":1291,"created_at":1292,"payload":1293},{"name":1017},"2026-09-08T07:58:41Z",{"action":1038,"issue":1294},{"number":1289},{"type":1072,"repo":1296,"created_at":1297,"payload":1298},{"name":1017},"2026-09-08T07:58:40Z",{"ref":1299,"ref_type":947},"fix\u002Fcors-allowed-methods-1.3.x",{"type":883,"repo":1301,"created_at":1302,"payload":1303},{"name":1017},"2026-09-08T07:54:40Z",{"action":1147,"pull_request":1304},{"number":1305},10,{"type":1150,"repo":1307,"created_at":1308,"payload":1309},{"name":1017},"2026-09-08T07:58:38Z",{"action":1038,"issue":1310},{"number":1305},{"type":883,"repo":1312,"created_at":1313,"payload":1314},{"name":1017},"2026-09-08T07:56:36Z",{"action":901,"pull_request":1315},{"number":1122},{"type":883,"repo":1317,"created_at":1318,"payload":1319},{"name":1017},"2026-09-08T07:55:20Z",{"action":888,"pull_request":1320},{"number":459},{"type":892,"repo":1322,"created_at":1323,"payload":1324},{"name":1017},"2026-09-08T07:55:21Z",{"ref":1020},{"type":892,"repo":1326,"created_at":1328,"payload":1329},{"name":1327},"druxt\u002F.github","2026-09-08T07:48:26Z",{"ref":985},{"type":883,"repo":1331,"created_at":1332,"payload":1333},{"name":1327},"2026-09-08T07:48:25Z",{"action":888,"pull_request":1334},{"number":1335},3,{"type":883,"repo":1337,"created_at":1338,"payload":1339},{"name":1017},"2026-09-08T07:47:04Z",{"action":901,"pull_request":1340},{"number":1305},{"type":942,"repo":1342,"created_at":1343,"payload":1344},{"name":1017},"2026-09-08T07:46:44Z",{"ref":1299,"ref_type":947},{"type":883,"repo":1346,"created_at":1347,"payload":1348},{"name":1017},"2026-09-08T07:45:42Z",{"action":901,"pull_request":1349},{"number":459},{"type":942,"repo":1351,"created_at":1352,"payload":1353},{"name":1017},"2026-09-08T07:45:26Z",{"ref":1354,"ref_type":947},"feature\u002Fproject-logo",{"type":1150,"repo":1356,"created_at":1357,"payload":1358},{"name":1327},"2026-09-08T07:22:15Z",{"action":1038,"issue":1359},{"number":1335},{"type":1361,"repo":1362,"created_at":1364,"payload":1365},"WatchEvent",{"name":1363},"nuxt-hub\u002Fstarter","2026-09-08T06:33:51Z",{"action":1366},"started",{"type":1361,"repo":1368,"created_at":1370,"payload":1371},{"name":1369},"abi\u002Fscreenshot-to-code","2026-09-08T06:23:54Z",{"action":1366},{"type":1361,"repo":1373,"created_at":1375,"payload":1376},{"name":1374},"heygen-com\u002Fhyperframes","2026-09-08T06:20:54Z",{"action":1366},{"type":1150,"repo":1378,"created_at":1379,"payload":1380},{"name":961},"2026-09-08T05:34:41Z",{"action":1038,"issue":1381},{"number":1032},{"type":883,"repo":1383,"created_at":1384,"payload":1385},{"name":1327},"2026-09-08T05:31:21Z",{"action":888,"pull_request":1386},{"number":1387},4,{"type":1034,"repo":1389,"created_at":1390,"payload":1391},{"name":1327},"2026-09-08T05:31:05Z",{"action":1038,"pull_request":1392},{"number":1387},{"type":1041,"repo":1394,"created_at":1395,"payload":1396},{"name":1327},"2026-09-08T05:31:06Z",{"action":1038,"pull_request":1397},{"number":1387},{"type":1034,"repo":1399,"created_at":1400,"payload":1401},{"name":1327},"2026-09-08T05:31:04Z",{"action":1038,"pull_request":1402},{"number":1387},{"type":1041,"repo":1404,"created_at":1390,"payload":1405},{"name":1327},{"action":1038,"pull_request":1406},{"number":1387},{"type":892,"repo":1408,"created_at":1409,"payload":1410},{"name":1327},"2026-09-08T05:30:53Z",{"ref":1411},"refs\u002Fheads\u002Fdocs\u002Fcommunity-health",{"type":1150,"repo":1413,"created_at":1414,"payload":1415},{"name":961},"2026-09-08T05:25:43Z",{"action":1038,"issue":1416},{"number":1065},{"type":883,"repo":1418,"created_at":1419,"payload":1420},{"name":961},"2026-09-08T05:25:35Z",{"action":901,"pull_request":1421},{"number":1065},{"type":892,"repo":1423,"created_at":1424,"payload":1425},{"name":961},"2026-09-08T05:22:41Z",{"ref":1005},{"type":892,"repo":1427,"created_at":1428,"payload":1429},{"name":961},"2026-09-08T05:05:32Z",{"ref":1005},{"type":892,"repo":1431,"created_at":1432,"payload":1433},{"name":954},"2026-09-06T12:32:37Z",{"ref":896},{"type":892,"repo":1435,"created_at":1436,"payload":1437},{"name":954},"2026-09-06T12:23:37Z",{"ref":1438},"refs\u002Fheads\u002Ffeature\u002Fgitlab-ci-parity",{"type":883,"repo":1440,"created_at":1441,"payload":1442},{"name":1327},"2026-09-08T04:29:17Z",{"action":888,"pull_request":1443},{"number":1444},2,{"type":883,"repo":1446,"created_at":1447,"payload":1448},{"name":1327},"2026-09-08T04:29:14Z",{"action":901,"pull_request":1449},{"number":1387},{"type":883,"repo":1451,"created_at":1452,"payload":1453},{"name":1327},"2026-09-08T04:27:01Z",{"action":901,"pull_request":1454},{"number":1335},{"type":942,"repo":1456,"created_at":1457,"payload":1458},{"name":1327},"2026-09-08T04:26:49Z",{"ref":1459,"ref_type":947},"docs\u002Fsecurity-policy",{"type":1034,"repo":1461,"created_at":1462,"payload":1463},{"name":1327},"2026-09-08T04:26:21Z",{"action":1038,"pull_request":1464},{"number":1444},{"type":1041,"repo":1466,"created_at":1467,"payload":1468},{"name":1327},"2026-09-08T04:26:22Z",{"action":1038,"pull_request":1469},{"number":1444},{"type":892,"repo":1471,"created_at":1472,"payload":1473},{"name":1327},"2026-09-08T04:26:08Z",{"ref":1474},"refs\u002Fheads\u002Fdocs\u002Fprofile-readme-refresh",{"type":892,"repo":1476,"created_at":1477,"payload":1478},{"name":954},"2026-09-06T11:18:13Z",{"ref":1438},{"type":892,"repo":1480,"created_at":1481,"payload":1482},{"name":961},"2026-09-08T04:14:09Z",{"ref":1005},{"type":883,"repo":1484,"created_at":1485,"payload":1486},{"name":1327},"2026-09-08T04:06:20Z",{"action":901,"pull_request":1487},{"number":1444},{"type":892,"repo":1489,"created_at":1490,"payload":1491},{"name":988},"2026-09-08T03:56:00Z",{"ref":1136},{"type":1072,"repo":1493,"created_at":1494,"payload":1495},{"name":954},"2026-09-06T10:35:15Z",{"ref":1496,"ref_type":947},"feature\u002Fdocs-druxt-1-2-2",{"type":1150,"repo":1498,"created_at":1499,"payload":1500},{"name":961},"2026-09-08T03:48:04Z",{"action":1038,"issue":1501},{"number":1032},{"type":883,"repo":1503,"created_at":1504,"payload":1505},{"name":988},"2026-09-08T03:47:20Z",{"action":901,"pull_request":1506},{"number":1507},23,{"type":883,"repo":1509,"created_at":1510,"payload":1511},{"name":988},"2026-09-08T03:47:01Z",{"action":901,"pull_request":1512},{"number":1513},22,{"type":1072,"repo":1515,"created_at":1516,"payload":1517},{"name":982},"2026-09-08T03:40:23Z",{"ref":1174,"ref_type":947},{"type":892,"repo":1519,"created_at":1516,"payload":1520},{"name":982},{"ref":896},{"type":883,"repo":1522,"created_at":1523,"payload":1524},{"name":982},"2026-09-08T03:40:21Z",{"action":888,"pull_request":1525},{"number":466},{"type":892,"repo":1527,"created_at":1528,"payload":1529},{"name":961},"2026-09-08T03:31:42Z",{"ref":1005},{"type":892,"repo":1531,"created_at":1532,"payload":1533},{"name":954},"2026-09-06T12:39:45Z",{"ref":985},{"type":892,"repo":1535,"created_at":1536,"payload":1537},{"name":961},"2026-09-08T03:23:01Z",{"ref":1005},{"type":1072,"repo":1539,"created_at":1540,"payload":1541},{"name":954},"2026-09-06T12:23:13Z",{"ref":1542,"ref_type":947},"feature\u002Fdocs-legacy-redirects",{"type":1072,"repo":1544,"created_at":1545,"payload":1546},{"name":954},"2026-09-06T11:48:15Z",{"ref":1547,"ref_type":947},"feature\u002Fdocs-redirect-targets",{"type":892,"repo":1549,"created_at":1550,"payload":1551},{"name":954},"2026-09-06T11:48:13Z",{"ref":896},{"type":883,"repo":1553,"created_at":1554,"payload":1555},{"name":961},"2026-09-08T02:48:53Z",{"action":901,"pull_request":1556},{"number":1032},{"type":892,"repo":1558,"created_at":1559,"payload":1560},{"name":982},"2026-09-08T02:41:20Z",{"ref":896},{"type":1072,"repo":1562,"created_at":1559,"payload":1563},{"name":982},{"ref":1201,"ref_type":947},{"type":883,"repo":1565,"created_at":1566,"payload":1567},{"name":982},"2026-09-08T02:41:17Z",{"action":888,"pull_request":1568},{"number":1569},61,{"type":892,"repo":1571,"created_at":1572,"payload":1573},{"name":982},"2026-09-08T02:21:08Z",{"ref":996},{"type":1072,"repo":1575,"created_at":1576,"payload":1577},{"name":954},"2026-09-06T12:32:38Z",{"ref":1578,"ref_type":947},"feature\u002Fgitlab-ci-parity",{"type":942,"repo":1580,"created_at":1581,"payload":1582},{"name":954},"2026-09-06T09:14:44Z",{"ref":1578,"ref_type":947},{"type":942,"repo":1584,"created_at":1585,"payload":1586},{"name":988},"2026-09-06T01:43:31Z",{"ref":1587,"ref_type":947},"session",{"type":892,"repo":1589,"created_at":1590,"payload":1591},{"name":988},"2026-09-06T00:46:53Z",{"ref":1592},"refs\u002Fheads\u002Ffeature\u002Fauthoring-cart",{"type":892,"repo":1594,"created_at":1595,"payload":1596},{"name":988},"2026-09-06T00:38:14Z",{"ref":1592},{"type":892,"repo":1598,"created_at":1599,"payload":1600},{"name":954},"2026-09-06T10:31:20Z",{"ref":1438},{"type":892,"repo":1602,"created_at":1603,"payload":1604},{"name":988},"2026-09-05T23:17:55Z",{"ref":1592},{"type":1034,"repo":1606,"created_at":1607,"payload":1608},{"name":917},"2026-09-07T23:51:33Z",{"action":1038,"pull_request":1609},{"number":1610},37,{"type":1041,"repo":1612,"created_at":1613,"payload":1614},{"name":917},"2026-09-07T23:51:34Z",{"action":1038,"pull_request":1615},{"number":1610},{"type":1034,"repo":1617,"created_at":1618,"payload":1619},{"name":917},"2026-09-07T23:14:07Z",{"action":1038,"pull_request":1620},{"number":1610},{"type":1041,"repo":1622,"created_at":1618,"payload":1623},{"name":917},{"action":1038,"pull_request":1624},{"number":1610},{"type":883,"repo":1626,"created_at":1627,"payload":1628},{"name":917},"2026-09-07T22:30:58Z",{"action":901,"pull_request":1629},{"number":1610},{"type":1072,"repo":1631,"created_at":1632,"payload":1633},{"name":988},"2026-09-06T01:42:30Z",{"ref":1587,"ref_type":947},{"type":892,"repo":1635,"created_at":1636,"payload":1637},{"name":954},"2026-09-06T00:54:58Z",{"ref":1638},"refs\u002Fheads\u002Ffeature\u002Fdocs-redirect-targets",{"type":942,"repo":1640,"created_at":1641,"payload":1642},{"name":988},"2026-09-06T00:41:59Z",{"ref":1643,"ref_type":947},"content\u002Fedits-20260906-004154",{"type":892,"repo":1645,"created_at":1646,"payload":1647},{"name":988},"2026-09-05T06:31:24Z",{"ref":1592},{"type":892,"repo":1649,"created_at":1650,"payload":1651},{"name":988},"2026-09-05T09:53:44Z",{"ref":1592},{"type":892,"repo":1653,"created_at":1654,"payload":1655},{"name":988},"2026-09-05T09:39:04Z",{"ref":1656},"refs\u002Fheads\u002Fsession",{"type":942,"repo":1658,"created_at":1659,"payload":1660},{"name":988},"2026-09-05T09:20:18Z",{"ref":1661,"ref_type":947},"feature\u002Fseo",{"type":892,"repo":1663,"created_at":1664,"payload":1665},{"name":988},"2026-09-05T08:06:15Z",{"ref":1592},{"type":892,"repo":1667,"created_at":1668,"payload":1669},{"name":988},"2026-09-05T07:16:13Z",{"ref":1592},{"type":892,"repo":1671,"created_at":1672,"payload":1673},{"name":954},"2026-09-05T01:52:07Z",{"ref":896},{"type":892,"repo":1675,"created_at":1676,"payload":1677},{"name":988},"2026-09-05T06:30:46Z",{"ref":1592},{"type":892,"repo":1679,"created_at":1680,"payload":1681},{"name":988},"2026-09-05T08:45:08Z",{"ref":1592},{"type":892,"repo":1683,"created_at":1684,"payload":1685},{"name":954},"2026-09-05T09:34:09Z",{"ref":1686},"refs\u002Fheads\u002Ffeature\u002Fdocs-druxt-1-2-2",{"type":942,"repo":1688,"created_at":1689,"payload":1690},{"name":954},"2026-09-05T09:11:11Z",{"ref":1496,"ref_type":947},{"type":892,"repo":1692,"created_at":1693,"payload":1694},{"name":988},"2026-09-05T08:09:25Z",{"ref":1592},{"type":892,"repo":1696,"created_at":1697,"payload":1698},{"name":988},"2026-09-05T04:38:26Z",{"ref":1592},{"type":942,"repo":1700,"created_at":1701,"payload":1702},{"name":1227},"2026-09-05T07:07:59Z",{"ref":1703,"ref_type":947},"feat\u002Fdrupal-11",{"type":892,"repo":1705,"created_at":1706,"payload":1707},{"name":1017},"2026-09-05T07:31:08Z",{"ref":1708},"refs\u002Fheads\u002Ffeature\u002F3273228-views-route-langcode",{"type":892,"repo":1710,"created_at":1711,"payload":1712},{"name":988},"2026-09-05T09:17:41Z",{"ref":1592},{"type":892,"repo":1714,"created_at":1715,"payload":1716},{"name":1017},"2026-09-05T06:57:12Z",{"ref":1717},"refs\u002Fheads\u002F1.2.x",{"type":1072,"repo":1719,"created_at":1720,"payload":1721},{"name":954},"2026-09-05T01:52:09Z",{"ref":1722,"ref_type":947},"feature\u002Fdocs-module-page-header",{"type":892,"repo":1724,"created_at":1725,"payload":1726},{"name":988},"2026-09-05T06:18:13Z",{"ref":1727},"refs\u002Fheads\u002Ffeature\u002Fgitlab-pages-and-ci",{"type":892,"repo":1729,"created_at":1730,"payload":1731},{"name":988},"2026-09-05T01:20:34Z",{"ref":1592},{"type":942,"repo":1733,"created_at":1734,"payload":1735},{"name":988},"2026-09-05T05:00:09Z",{"ref":1587,"ref_type":947},{"type":892,"repo":1737,"created_at":1738,"payload":1739},{"name":988},"2026-09-05T04:54:43Z",{"ref":1592},{"type":892,"repo":1741,"created_at":1742,"payload":1743},{"name":1009},"2026-09-05T05:06:48Z",{"ref":1717},{"type":892,"repo":1745,"created_at":1746,"payload":1747},{"name":988},"2026-09-05T04:55:37Z",{"ref":1592},{"type":892,"repo":1749,"created_at":1750,"payload":1751},{"name":988},"2026-09-05T00:14:47Z",{"ref":985},{"type":892,"repo":1753,"created_at":1754,"payload":1755},{"name":1017},"2026-09-07T08:20:18Z",{"ref":1020},{"type":892,"repo":1757,"created_at":1758,"payload":1759},{"name":988},"2026-09-05T05:16:48Z",{"ref":1592},{"type":892,"repo":1761,"created_at":1762,"payload":1763},{"name":988},"2026-09-05T03:07:42Z",{"ref":1592},{"type":942,"repo":1765,"created_at":1766,"payload":1767},{"name":988},"2026-09-05T05:33:53Z",{"ref":1768,"ref_type":947},"chore\u002Fdruxt-1.2.2",{"type":892,"repo":1770,"created_at":1771,"payload":1772},{"name":988},"2026-09-05T02:00:11Z",{"ref":1592},{"type":883,"repo":1774,"created_at":1775,"payload":1776},{"name":917},"2026-09-07T07:16:02Z",{"action":888,"pull_request":1777},{"number":1778},36,{"type":892,"repo":1780,"created_at":1781,"payload":1782},{"name":917},"2026-09-07T07:16:03Z",{"ref":1164},{"type":892,"repo":1784,"created_at":1785,"payload":1786},{"name":1227},"2026-09-05T01:12:34Z",{"ref":1230},{"type":1150,"repo":1788,"created_at":1789,"payload":1790},{"name":917},"2026-09-07T06:44:47Z",{"action":1038,"issue":1791},{"number":1778},{"type":1150,"repo":1793,"created_at":1794,"payload":1795},{"name":917},"2026-09-07T06:44:33Z",{"action":1038,"issue":1796},{"number":1778},{"type":942,"repo":1798,"created_at":1799,"payload":1800},{"name":1227},"2026-09-05T00:51:31Z",{"ref":1801,"ref_type":947},"feat\u002Fvisual-uplift",{"type":892,"repo":1803,"created_at":1804,"payload":1805},{"name":954},"2026-09-05T00:51:13Z",{"ref":1806},"refs\u002Fheads\u002Ffeature\u002Fdocs-module-page-header",{"type":883,"repo":1808,"created_at":1809,"payload":1810},{"name":917},"2026-09-07T06:29:05Z",{"action":901,"pull_request":1811},{"number":1778},{"type":942,"repo":1813,"created_at":1814,"payload":1815},{"name":917},"2026-09-07T06:29:04Z",{"ref":1816,"ref_type":947},"feature\u002Frc2-release-prep",{"type":892,"repo":1818,"created_at":1819,"payload":1820},{"name":954},"2026-09-05T03:29:32Z",{"ref":1821},"refs\u002Fheads\u002Ffeature\u002Ffront-page-theming-tutorial",{"type":892,"repo":1823,"created_at":1824,"payload":1825},{"name":988},"2026-09-05T03:19:31Z",{"ref":1592},{"type":892,"repo":1827,"created_at":1828,"payload":1829},{"name":1227},"2026-09-05T01:26:45Z",{"ref":1230},{"type":892,"repo":1831,"created_at":1832,"payload":1833},{"name":1017},"2026-09-07T06:19:32Z",{"ref":1159},{"type":942,"repo":1835,"created_at":1836,"payload":1837},{"name":1227},"2026-09-04T23:51:41Z",{"ref":1838,"ref_type":947},"chore\u002Fgitlab-ci",{"type":892,"repo":1840,"created_at":1841,"payload":1842},{"name":1017},"2026-09-07T06:05:48Z",{"ref":1159},{"type":892,"repo":1844,"created_at":1845,"payload":1846},{"name":988},"2026-09-05T00:53:22Z",{"ref":1592},{"type":1072,"repo":1848,"created_at":1849,"payload":1850},{"name":917},"2026-09-07T05:58:45Z",{"ref":1851,"ref_type":947},"feature\u002Frc2-generated-name-munging",{"type":883,"repo":1853,"created_at":1854,"payload":1855},{"name":917},"2026-09-07T05:55:17Z",{"action":888,"pull_request":1856},{"number":465},{"type":892,"repo":1858,"created_at":1859,"payload":1860},{"name":988},"2026-09-05T00:22:41Z",{"ref":1592},{"type":892,"repo":1862,"created_at":1863,"payload":1864},{"name":1227},"2026-09-05T00:07:18Z",{"ref":1865},"refs\u002Fheads\u002Fchore\u002Fgitlab-ci",{"type":883,"repo":1867,"created_at":1868,"payload":1869},{"name":917},"2026-09-07T05:41:53Z",{"action":901,"pull_request":1870},{"number":465},{"type":942,"repo":1872,"created_at":1873,"payload":1874},{"name":917},"2026-09-07T05:41:52Z",{"ref":1851,"ref_type":947},{"type":892,"repo":1876,"created_at":1877,"payload":1878},{"name":917},"2026-09-07T05:31:59Z",{"ref":1164},{"type":883,"repo":1880,"created_at":1881,"payload":1882},{"name":917},"2026-09-07T05:32:00Z",{"action":888,"pull_request":1883},{"number":1884},33,{"type":892,"repo":1886,"created_at":1887,"payload":1888},{"name":1227},"2026-09-05T01:28:14Z",{"ref":1230},{"type":1072,"repo":1890,"created_at":1891,"payload":1892},{"name":1227},"2026-09-05T00:18:37Z",{"ref":1838,"ref_type":947},{"type":892,"repo":1894,"created_at":1895,"payload":1896},{"name":1017},"2026-09-07T04:22:17Z",{"ref":1159},{"type":883,"repo":1898,"created_at":1899,"payload":1900},{"name":1017},"2026-09-07T04:12:21Z",{"action":901,"pull_request":1901},{"number":477},{"type":942,"repo":1903,"created_at":1904,"payload":1905},{"name":1017},"2026-09-07T04:11:53Z",{"ref":1906,"ref_type":947},"feature\u002F3309969-configurable-resources",{"type":892,"repo":1908,"created_at":1909,"payload":1910},{"name":917},"2026-09-07T01:59:08Z",{"ref":1192},{"type":892,"repo":1912,"created_at":1913,"payload":1914},{"name":917},"2026-09-07T01:53:06Z",{"ref":1192},{"type":892,"repo":1916,"created_at":1917,"payload":1918},{"name":982},"2026-09-07T01:26:41Z",{"ref":996},{"type":883,"repo":1920,"created_at":1921,"payload":1922},{"name":1261},"2026-09-07T01:25:41Z",{"action":901,"pull_request":1923},{"number":1924},168,{"type":942,"repo":1926,"created_at":1927,"payload":1928},{"name":1261},"2026-09-07T01:25:40Z",{"ref":1929,"ref_type":947},"fix\u002Fdevcontainer-shell",{"type":892,"repo":1931,"created_at":1932,"payload":1933},{"name":982},"2026-09-07T00:59:45Z",{"ref":996},{"type":892,"repo":1935,"created_at":1936,"payload":1937},{"name":917},"2026-09-07T00:59:40Z",{"ref":1192},{"type":892,"repo":1939,"created_at":1936,"payload":1940},{"name":917},{"ref":1164},{"type":883,"repo":1942,"created_at":1943,"payload":1944},{"name":917},"2026-09-07T00:59:38Z",{"action":888,"pull_request":1945},{"number":1946},32,{"type":892,"repo":1948,"created_at":1949,"payload":1950},{"name":917},"2026-09-07T00:58:04Z",{"ref":1192},{"type":1150,"repo":1952,"created_at":1953,"payload":1954},{"name":917},"2026-09-07T00:57:49Z",{"action":1038,"issue":1955},{"number":1946},{"type":892,"repo":1957,"created_at":1958,"payload":1959},{"name":917},"2026-09-07T00:56:41Z",{"ref":1192},{"type":892,"repo":1961,"created_at":1962,"payload":1963},{"name":982},"2026-09-07T00:44:04Z",{"ref":996},{"type":892,"repo":1965,"created_at":1966,"payload":1967},{"name":982},"2026-09-07T00:39:23Z",{"ref":996},{"type":892,"repo":1969,"created_at":1970,"payload":1971},{"name":982},"2026-09-07T00:35:32Z",{"ref":996},{"type":892,"repo":1973,"created_at":1974,"payload":1975},{"name":982},"2026-09-07T00:30:21Z",{"ref":996},{"type":883,"repo":1977,"created_at":1978,"payload":1979},{"name":917},"2026-09-07T00:11:24Z",{"action":901,"pull_request":1980},{"number":1884},{"type":892,"repo":1982,"created_at":1983,"payload":1984},{"name":917},"2026-09-07T00:11:15Z",{"ref":1985},"refs\u002Fheads\u002Ffix\u002Fsecure-default-temp-location",{"type":892,"repo":1987,"created_at":1988,"payload":1989},{"name":982},"2026-09-07T00:05:35Z",{"ref":996},{"type":883,"repo":1991,"created_at":1992,"payload":1993},{"name":1261},"2026-09-07T00:02:16Z",{"action":901,"pull_request":1994},{"number":1995},166,{"type":942,"repo":1997,"created_at":1998,"payload":1999},{"name":1261},"2026-09-07T00:02:15Z",{"ref":2000,"ref_type":947},"fix\u002Fdruxt-1.2.2",{"type":883,"repo":2002,"created_at":2003,"payload":2004},{"name":1261},"2026-09-07T00:02:11Z",{"action":901,"pull_request":2005},{"number":2006},165,{"type":883,"repo":2008,"created_at":2009,"payload":2010},{"name":1261},"2026-09-07T00:02:07Z",{"action":901,"pull_request":2011},{"number":2012},164,{"type":942,"repo":2014,"created_at":2009,"payload":2015},{"name":1261},{"ref":2016,"ref_type":947},"fix\u002Foauth-consent-permission",{"type":883,"repo":2018,"created_at":2019,"payload":2020},{"name":1261},"2026-09-07T00:02:04Z",{"action":901,"pull_request":2021},{"number":2022},163,{"type":942,"repo":2024,"created_at":2025,"payload":2026},{"name":1261},"2026-09-07T00:02:03Z",{"ref":2027,"ref_type":947},"fix\u002Fvue-jest-deasync-install",{"type":1150,"repo":2029,"created_at":2030,"payload":2031},{"name":982},"2026-09-06T23:59:10Z",{"action":1038,"issue":2032},{"number":466},{"type":892,"repo":2034,"created_at":2035,"payload":2036},{"name":982},"2026-09-06T23:52:02Z",{"ref":996},{"type":892,"repo":2038,"created_at":2039,"payload":2040},{"name":917},"2026-09-06T23:51:11Z",{"ref":1164},{"type":883,"repo":2042,"created_at":2043,"payload":2044},{"name":917},"2026-09-06T23:33:17Z",{"action":901,"pull_request":2045},{"number":1946},{"type":892,"repo":2047,"created_at":2048,"payload":2049},{"name":982},"2026-09-06T23:26:21Z",{"ref":996},{"type":892,"repo":2051,"created_at":2052,"payload":2053},{"name":982},"2026-09-06T23:26:19Z",{"ref":1169},{"type":892,"repo":2055,"created_at":2056,"payload":2057},{"name":917},"2026-09-06T23:24:57Z",{"ref":1164},{"type":892,"repo":2059,"created_at":2060,"payload":2061},{"name":982},"2026-09-06T23:23:52Z",{"ref":996},{"type":892,"repo":2063,"created_at":2064,"payload":2065},{"name":982},"2026-09-06T23:23:41Z",{"ref":1169},{"type":883,"repo":2067,"created_at":1172,"payload":2068},{"name":982},{"action":901,"pull_request":2069},{"number":466},{"type":883,"repo":2071,"created_at":1199,"payload":2072},{"name":982},{"action":901,"pull_request":2073},{"number":1569},{"type":892,"repo":2075,"created_at":2076,"payload":2077},{"name":1227},"2026-09-06T23:19:50Z",{"ref":1230},{"type":892,"repo":2079,"created_at":2076,"payload":2080},{"name":1227},{"ref":1240},{"type":892,"repo":2082,"created_at":2083,"payload":2084},{"name":954},"2026-09-04T13:29:55Z",{"ref":896},{"type":892,"repo":2086,"created_at":2087,"payload":2088},{"name":954},"2026-09-04T11:09:17Z",{"ref":896},{"type":892,"repo":2090,"created_at":2091,"payload":2092},{"name":988},"2026-09-04T09:10:53Z",{"ref":2093},"refs\u002Fheads\u002Ffeature\u002Fsite-styling",{"type":892,"repo":2095,"created_at":2096,"payload":2097},{"name":954},"2026-09-04T09:04:30Z",{"ref":2098},"refs\u002Fheads\u002Ffeature\u002Fdocs-content-base",{"type":892,"repo":2100,"created_at":2101,"payload":2102},{"name":954},"2026-09-04T08:45:40Z",{"ref":2103},"refs\u002Fheads\u002Ffeature\u002Fdocs-api-sweep",{"type":892,"repo":2105,"created_at":2106,"payload":2107},{"name":954},"2026-09-04T08:45:35Z",{"ref":2108},"refs\u002Fheads\u002Ffeature\u002Fdocs-legacy",{"type":892,"repo":2110,"created_at":2111,"payload":2112},{"name":954},"2026-09-04T11:38:44Z",{"ref":2113},"refs\u002Fheads\u002Ffix\u002Fdocs-merge-polish",{"type":892,"repo":2115,"created_at":2116,"payload":2117},{"name":954},"2026-09-04T08:27:48Z",{"ref":2118},"refs\u002Fheads\u002Ffeature\u002Fdruxtjs-docs-lint-hardening",{"type":892,"repo":2120,"created_at":2121,"payload":2122},{"name":954},"2026-09-04T11:51:17Z",{"ref":2113},{"type":892,"repo":2124,"created_at":2125,"payload":2126},{"name":954},"2026-09-04T07:53:14Z",{"ref":2118},{"type":942,"repo":2128,"created_at":2129,"payload":2130},{"name":954},"2026-09-04T11:14:39Z",{"ref":2131,"ref_type":947},"fix\u002Fdocs-merge-polish",{"type":1072,"repo":2133,"created_at":2134,"payload":2135},{"name":954},"2026-09-04T11:09:15Z",{"ref":2136,"ref_type":947},"feature\u002Fdocs-content-base",{"type":942,"repo":2138,"created_at":2139,"payload":2140},{"name":988},"2026-09-04T10:54:53Z",{"ref":2141,"ref_type":947},"feature\u002Fgitlab-pages-and-ci",{"type":892,"repo":2143,"created_at":2144,"payload":2145},{"name":954},"2026-09-04T07:26:24Z",{"ref":2108},{"type":892,"repo":2147,"created_at":2148,"payload":2149},{"name":954},"2026-09-04T07:26:21Z",{"ref":2098},{"type":892,"repo":2151,"created_at":2152,"payload":2153},{"name":988},"2026-09-04T09:08:28Z",{"ref":985},{"type":892,"repo":2155,"created_at":2156,"payload":2157},{"name":988},"2026-09-04T05:58:56Z",{"ref":2093},{"type":892,"repo":2159,"created_at":2160,"payload":2161},{"name":954},"2026-09-04T08:07:46Z",{"ref":2118},{"type":892,"repo":2163,"created_at":2164,"payload":2165},{"name":954},"2026-09-04T08:54:01Z",{"ref":2103},{"type":892,"repo":2167,"created_at":2168,"payload":2169},{"name":954},"2026-09-04T08:53:15Z",{"ref":2108},{"type":892,"repo":2171,"created_at":2172,"payload":2173},{"name":988},"2026-09-04T09:49:54Z",{"ref":2093},{"type":892,"repo":2175,"created_at":2176,"payload":2177},{"name":954},"2026-09-04T08:45:32Z",{"ref":2098},{"type":892,"repo":2179,"created_at":2180,"payload":2181},{"name":954},"2026-09-04T09:04:37Z",{"ref":2103},{"type":892,"repo":2183,"created_at":2184,"payload":2185},{"name":954},"2026-09-04T09:04:35Z",{"ref":2118},{"type":883,"repo":2187,"created_at":2188,"payload":2189},{"name":954},"2026-09-02T10:57:21Z",{"action":1147,"pull_request":2190},{"number":2191},788,{"type":883,"repo":2193,"created_at":2194,"payload":2195},{"name":954},"2026-09-06T12:32:36Z",{"action":888,"pull_request":2196},{"number":2197},820,{"type":892,"repo":2199,"created_at":2200,"payload":2201},{"name":988},"2026-09-04T08:28:20Z",{"ref":2093},{"type":892,"repo":2203,"created_at":2204,"payload":2205},{"name":954},"2026-09-04T09:31:16Z",{"ref":2118},{"type":892,"repo":2207,"created_at":2208,"payload":2209},{"name":954},"2026-09-06T12:23:12Z",{"ref":896},{"type":883,"repo":2211,"created_at":2212,"payload":2213},{"name":954},"2026-09-06T12:23:10Z",{"action":888,"pull_request":2214},{"number":2215},821,{"type":892,"repo":2217,"created_at":2218,"payload":2219},{"name":954},"2026-09-06T12:19:55Z",{"ref":1438},{"type":1150,"repo":2221,"created_at":2222,"payload":2223},{"name":954},"2026-09-06T12:18:35Z",{"action":1038,"issue":2224},{"number":2215},{"type":892,"repo":2226,"created_at":2227,"payload":2228},{"name":954},"2026-09-06T12:02:56Z",{"ref":1438},{"type":883,"repo":2230,"created_at":2231,"payload":2232},{"name":954},"2026-09-06T11:56:44Z",{"action":901,"pull_request":2233},{"number":2215},{"type":942,"repo":2235,"created_at":2236,"payload":2237},{"name":954},"2026-09-06T11:56:35Z",{"ref":1542,"ref_type":947},{"type":883,"repo":2239,"created_at":2240,"payload":2241},{"name":954},"2026-09-06T11:48:11Z",{"action":888,"pull_request":2242},{"number":2243},819,{"type":1034,"repo":2245,"created_at":2246,"payload":2247},{"name":954},"2026-09-06T11:46:40Z",{"action":1038,"pull_request":2248},{"number":2243},{"type":1041,"repo":2250,"created_at":2251,"payload":2252},{"name":954},"2026-09-06T11:46:41Z",{"action":1038,"pull_request":2253},{"number":2243},{"type":1034,"repo":2255,"created_at":2256,"payload":2257},{"name":954},"2026-09-06T11:46:19Z",{"action":1038,"pull_request":2258},{"number":2197},{"type":1041,"repo":2260,"created_at":2256,"payload":2261},{"name":954},{"action":1038,"pull_request":2262},{"number":2197},{"type":1034,"repo":2264,"created_at":2265,"payload":2266},{"name":954},"2026-09-06T11:46:17Z",{"action":1038,"pull_request":2267},{"number":2197},{"type":1041,"repo":2269,"created_at":2270,"payload":2271},{"name":954},"2026-09-06T11:46:18Z",{"action":1038,"pull_request":2272},{"number":2197},{"type":1034,"repo":2274,"created_at":2275,"payload":2276},{"name":954},"2026-09-06T11:46:16Z",{"action":1038,"pull_request":2277},{"number":2197},{"type":1041,"repo":2279,"created_at":2265,"payload":2280},{"name":954},{"action":1038,"pull_request":2281},{"number":2197},{"type":1034,"repo":2283,"created_at":2284,"payload":2285},{"name":954},"2026-09-06T11:46:15Z",{"action":1038,"pull_request":2286},{"number":2197},{"type":1041,"repo":2288,"created_at":2275,"payload":2289},{"name":954},{"action":1038,"pull_request":2290},{"number":2197},{"type":892,"repo":2292,"created_at":2293,"payload":2294},{"name":954},"2026-09-06T11:45:55Z",{"ref":1438},{"type":942,"repo":2296,"created_at":2297,"payload":2298},{"name":954},"2026-09-04T07:06:57Z",{"ref":2299,"ref_type":947},"feature\u002Fdocs-api-sweep",{"type":892,"repo":2301,"created_at":2302,"payload":2303},{"name":954},"2026-09-04T09:04:33Z",{"ref":2108},{"type":892,"repo":2305,"created_at":2306,"payload":2307},{"name":954},"2026-09-04T07:51:42Z",{"ref":2118},[2309,2313,2317,2321,2325,2329,2333,2337,2341,2345,2349,2353,2357,2361,2365,2369,2373,2377,2381,2385,2389,2393,2397,2401,2405,2409,2413,2417,2421,2425,2429,2433,2437,2441,2445,2449,2453,2457,2461,2465,2469,2473,2477,2481,2485,2489,2493,2497,2501,2505,2509,2513,2517,2521,2525,2529,2533,2537,2541,2545,2549,2553,2557,2561,2565,2569,2573,2577,2581,2585,2589],{"created_at":2310,"state":888,"web_url":2311,"title":2312},"2026-09-07T07:59:09.857Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Fdruxt\u002F-\u002Fmerge_requests\u002F24","feat(#3309969): make the exposed JSON:API resource list configurable",{"created_at":2314,"state":888,"web_url":2315,"title":2316},"2026-09-02T10:09:55.374Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Ffilefield_paths\u002F-\u002Fmerge_requests\u002F79","Issue #3045063: Change redirect hash to match the Redirect module",{"created_at":2318,"state":888,"web_url":2319,"title":2320},"2026-08-28T06:23:23.488Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Ffilefield_paths\u002F-\u002Fmerge_requests\u002F77","test(#3432653): cover the migration path that reported the crash",{"created_at":2322,"state":888,"web_url":2323,"title":2324},"2026-08-28T04:15:32.747Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Ffilefield_paths\u002F-\u002Fmerge_requests\u002F76","Issue #3616606: Detect the original entity without property_exists",{"created_at":2326,"state":901,"web_url":2327,"title":2328},"2026-08-25T03:57:52.449Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Fjsonapi_node_preview\u002F-\u002Fmerge_requests\u002F4","Issue #3367724 by amermod, deciphered: Load included references from memory and by revision",{"created_at":2330,"state":888,"web_url":2331,"title":2332},"2026-08-24T23:20:50.079Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Fdruxt\u002F-\u002Fmerge_requests\u002F23","fix(#3618677): guard the jsonapi_views route lookup in the Views subscriber",{"created_at":2334,"state":901,"web_url":2335,"title":2336},"2026-08-24T07:25:42.420Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Ffilefield_paths\u002F-\u002Fmerge_requests\u002F75","fix(#3015137): point the field item at the moved file",{"created_at":2338,"state":888,"web_url":2339,"title":2340},"2026-08-23T21:29:04.023Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Fdruxt\u002F-\u002Fmerge_requests\u002F22","fix(#3618675): restore Decoupled Router 2.0.7 compatibility",{"created_at":2342,"state":901,"web_url":2343,"title":2344},"2026-08-22T07:29:02.073Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Fjsonapi_menu_items\u002F-\u002Fmerge_requests\u002F31","test(#3171186): add menu_link_config test coverage",{"created_at":2346,"state":888,"web_url":2347,"title":2348},"2026-08-20T05:41:30.726Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Ftextimage\u002F-\u002Fmerge_requests\u002F27","ci: trigger GitHub workflows on the 5.0.x branch",{"created_at":2350,"state":888,"web_url":2351,"title":2352},"2026-08-18T08:39:12.019Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Ffilefield_paths\u002F-\u002Fmerge_requests\u002F74","feat(#3419618): allow cross-scheme file moves and report skipped files during retroactive update",{"created_at":2354,"state":888,"web_url":2355,"title":2356},"2026-08-17T04:33:52.709Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Fdecoupled_router\u002F-\u002Fmerge_requests\u002F40","fix(#3166364): replace dead path hooks with entity hooks",{"created_at":2358,"state":888,"web_url":2359,"title":2360},"2026-08-14T00:46:24.947Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Ffilefield_paths\u002F-\u002Fmerge_requests\u002F73","fix: resolve phpstan and rector deprecation warnings",{"created_at":2362,"state":888,"web_url":2363,"title":2364},"2026-08-14T00:45:46.775Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Fdecoupled_router\u002F-\u002Fmerge_requests\u002F39","ci: fix intermittent phpunit failures on the shared runner",{"created_at":2366,"state":888,"web_url":2367,"title":2368},"2026-08-12T11:26:29.637Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Fdecoupled_router\u002F-\u002Fmerge_requests\u002F38","fix(#3611685): Catch RedirectLoopException in RedirectPathTranslatorSubscriber",{"created_at":2370,"state":888,"web_url":2371,"title":2372},"2026-08-06T09:21:33.173Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Fjsonapi_views\u002F-\u002Fmerge_requests\u002F26","fix(#3265781): add resource type route default for single-bundle views",{"created_at":2374,"state":888,"web_url":2375,"title":2376},"2026-08-04T01:45:14.605Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Fjsonapi_views\u002F-\u002Fmerge_requests\u002F25","Issue #3484714: Increase route build speed",{"created_at":2378,"state":888,"web_url":2379,"title":2380},"2026-08-04T00:30:35.129Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Fjsonapi_views\u002F-\u002Fmerge_requests\u002F24","Issue #3202583: Views cache settings not added to headers",{"created_at":2382,"state":888,"web_url":2383,"title":2384},"2026-07-29T10:44:55.917Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Fcustom_formatters\u002F-\u002Fmerge_requests\u002F13","fix: resolve pre-existing phpstan and phpcs CI failures",{"created_at":2386,"state":888,"web_url":2387,"title":2388},"2026-07-25T00:28:19.398Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Fdruxt\u002F-\u002Fmerge_requests\u002F21","test: add comprehensive coverage for path translator subscribers",{"created_at":2390,"state":888,"web_url":2391,"title":2392},"2026-07-23T03:39:56.630Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Fdruxt\u002F-\u002Fmerge_requests\u002F20","fix(#3597394): add Drupal 12 compatibility, drop D8\u002FD9",{"created_at":2394,"state":888,"web_url":2395,"title":2396},"2026-07-22T23:56:40.172Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Fdruxt\u002F-\u002Fmerge_requests\u002F19","fix(#3558380): pass route name string to Url::fromRoute in Views subscriber",{"created_at":2398,"state":888,"web_url":2399,"title":2400},"2026-07-21T02:14:34.763Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Fimagefield_tokens\u002F-\u002Fmerge_requests\u002F8","feat(#3452812): add widget settings for token-based default alt\u002Ftitle values",{"created_at":2402,"state":888,"web_url":2403,"title":2404},"2026-07-15T07:40:27.005Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Fimagefield_tokens\u002F-\u002Fmerge_requests\u002F7","fix(#3607919): full Drupal 11.4 compatibility and code modernization",{"created_at":2406,"state":901,"web_url":2407,"title":2408},"2026-07-06T05:10:08.723Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Ffilefield_paths\u002F-\u002Fmerge_requests\u002F71","feat(#3608361): pass field delta in token data for [file:delta] support",{"created_at":2410,"state":901,"web_url":2411,"title":2412},"2026-06-22T05:59:57.121Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Ffilefield_paths\u002F-\u002Fmerge_requests\u002F70","feat(#2072237): allow disabling File (Field) Paths processing site-wide and per entity",{"created_at":2414,"state":901,"web_url":2415,"title":2416},"2026-06-19T04:22:57.651Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Ffilefield_paths\u002F-\u002Fmerge_requests\u002F69","Draft: Test coverage: src\u002F, .module, and .install",{"created_at":2418,"state":888,"web_url":2419,"title":2420},"2026-06-19T01:26:51.661Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Ffilefield_paths\u002F-\u002Fmerge_requests\u002F68","test(#3269636): add failing test for private:\u002F\u002F redirect path bug",{"created_at":2422,"state":888,"web_url":2423,"title":2424},"2026-06-18T22:08:20.277Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Ffilefield_paths\u002F-\u002Fmerge_requests\u002F67","fix(#3121826): add on-demand image style delivery for temporary:\u002F\u002F staged files",{"created_at":2426,"state":1147,"web_url":2427,"title":2428},"2026-06-18T08:41:50.682Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Ffilefield_paths\u002F-\u002Fmerge_requests\u002F66","Draft: feat: adopt drupal_extension_scaffold tooling and CI",{"created_at":2430,"state":888,"web_url":2431,"title":2432},"2026-05-31T07:36:44.683Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Ffield_tokens\u002F-\u002Fmerge_requests\u002F8","feat(#3267442): support ranges, wildcards, and omitted deltas in field tokens",{"created_at":2434,"state":901,"web_url":2435,"title":2436},"2026-05-31T02:19:43.604Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Fcustom_formatters\u002F-\u002Fmerge_requests\u002F11","Draft: ci: update scaffold, add GitLab CI, bump PHPStan to ^2, fix PHPStan 2.x errors",{"created_at":2438,"state":888,"web_url":2439,"title":2440},"2026-01-20T02:02:21.521Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Fdrupal_cms\u002F-\u002Fmerge_requests\u002F763","#3568407: remove obsolete automatic_updates_extensions from drupal_cms_admin_ui recipe",{"created_at":2442,"state":901,"web_url":2443,"title":2444},"2025-09-05T04:10:35.319Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Fnext\u002F-\u002Fmerge_requests\u002F4","feat(#3545030): add workspace id to preview query",{"created_at":2446,"state":888,"web_url":2447,"title":2448},"2025-08-17T23:57:03.628Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Fdruxt\u002F-\u002Fmerge_requests\u002F17","feat(#3541756): set default CORS allowedHeaders.",{"created_at":2450,"state":901,"web_url":2451,"title":2452},"2025-05-08T03:51:14.946Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Fadmin_audit_trail\u002F-\u002Fmerge_requests\u002F17","Draft: #3284680: added export csv route",{"created_at":2454,"state":1147,"web_url":2455,"title":2456},"2023-06-16T04:38:06.627Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Fsimple_oauth_revoke\u002F-\u002Fmerge_requests\u002F2","Issue #3367157: Add support for D10",{"created_at":2458,"state":901,"web_url":2459,"title":2460},"2023-02-27T00:01:54.487Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Fjsonapi_user_resources\u002F-\u002Fmerge_requests\u002F3","Issue #3288150: Automated Drupal 10 compatibility fixes",{"created_at":2462,"state":1147,"web_url":2463,"title":2464},"2023-02-09T00:41:07.583Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Fm4032404\u002F-\u002Fmerge_requests\u002F1","Issue #3288400: Automated Drupal 10 compatibility fixes",{"created_at":2466,"state":901,"web_url":2467,"title":2468},"2023-02-09T00:08:49.582Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Fentity_display_mode\u002F-\u002Fmerge_requests\u002F1","Issue #3287230: Automated Drupal 10 compatibility fixes",{"created_at":2470,"state":888,"web_url":2471,"title":2472},"2023-02-08T23:29:59.816Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Fanonymous_redirect\u002F-\u002Fmerge_requests\u002F1","Issue #3286076: Automated Drupal 10 compatibility fixes",{"created_at":2474,"state":1147,"web_url":2475,"title":2476},"2023-02-07T03:23:22.157Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Fparagraphs_ee\u002F-\u002Fmerge_requests\u002F14","Issue #3288984: Automated Drupal 10 compatibility fixes",{"created_at":2478,"state":1147,"web_url":2479,"title":2480},"2023-02-07T01:11:04.418Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Fdruxt\u002F-\u002Fmerge_requests\u002F12","Issue #3287092: Automated Drupal 10 compatibility fixes",{"created_at":2482,"state":888,"web_url":2483,"title":2484},"2023-02-07T00:46:55.790Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Fjsonapi_views\u002F-\u002Fmerge_requests\u002F9","Issue #3288151: Automated Drupal 10 compatibility fixes",{"created_at":2486,"state":888,"web_url":2487,"title":2488},"2022-10-12T23:02:59.783Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Fdruxt\u002F-\u002Fmerge_requests\u002F11","Issue #3315030: Add a wildcard route translator service to catch all available routes",{"created_at":2490,"state":888,"web_url":2491,"title":2492},"2022-10-12T22:48:23.867Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Fdruxt\u002F-\u002Fmerge_requests\u002F10","Issue #3315035: Cannot load the \"view\" entity with NULL ID",{"created_at":2494,"state":901,"web_url":2495,"title":2496},"2022-04-08T01:53:56.404Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Fjsonapi_menu_items\u002F-\u002Fmerge_requests\u002F7","Issue #3192576: Add langcode",{"created_at":2498,"state":901,"web_url":2499,"title":2500},"2022-04-08T00:42:54.086Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Fdecoupled_router\u002F-\u002Fmerge_requests\u002F5","Issue #3111456: Unable to resolve path on node in other language than default",{"created_at":2502,"state":901,"web_url":2503,"title":2504},"2022-04-06T04:09:03.877Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Fdruxt\u002F-\u002Fmerge_requests\u002F9","Issue #3273228: Add langcode to Views Decoupled Router integration",{"created_at":2506,"state":1147,"web_url":2507,"title":2508},"2022-03-22T03:37:58.299Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Felasticsearch_connector\u002F-\u002Fmerge_requests\u002F17","Issue #3186674: Support php 8",{"created_at":2510,"state":888,"web_url":2511,"title":2512},"2022-03-03T02:27:25.013Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Flinkit_media_library\u002F-\u002Fmerge_requests\u002F1","Issue #3267475: Add data-entity-bundle prop for better JSON:API support",{"created_at":2514,"state":888,"web_url":2515,"title":2516},"2022-02-26T00:23:00.535Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Fjsonapi_node_preview_tab\u002F-\u002Fmerge_requests\u002F2","Issue #3266416: create url from route",{"created_at":2518,"state":901,"web_url":2519,"title":2520},"2022-02-14T02:22:16.263Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Fdruxt\u002F-\u002Fmerge_requests\u002F8","Issue #3264181: Node Preview",{"created_at":2522,"state":1147,"web_url":2523,"title":2524},"2022-01-07T08:20:49.629Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Fdrupal\u002F-\u002Fmerge_requests\u002F1619","#3257163: Add bundle to drupal-media",{"created_at":2526,"state":888,"web_url":2527,"title":2528},"2021-11-15T21:19:32.592Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Fdruxt\u002F-\u002Fmerge_requests\u002F7","Issue #3249293: Error: Call to a member function isInternal() on null in \u002Fvar\u002Fwww\u002Fhtml\u002Fweb\u002Fmodules\u002Fcontrib\u002Fdruxt\u002Fdruxt.install on line 44",{"created_at":2530,"state":888,"web_url":2531,"title":2532},"2021-10-24T00:46:07.309Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Fdruxt\u002F-\u002Fmerge_requests\u002F6","Issue #3245544: Decoupled Views routes returning `null` label in Drupal 9.2",{"created_at":2534,"state":888,"web_url":2535,"title":2536},"2021-10-22T05:22:01.957Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Fdruxt\u002F-\u002Fmerge_requests\u002F5","Issue #3232542: Add Report for required JSON:API resources",{"created_at":2538,"state":888,"web_url":2539,"title":2540},"2021-10-20T05:53:01.933Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Fdruxt\u002F-\u002Fmerge_requests\u002F4","Issue #3206487: Add 'configurable_language' endpoint.",{"created_at":2542,"state":888,"web_url":2543,"title":2544},"2021-10-20T02:30:37.861Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Fdruxt\u002F-\u002Fmerge_requests\u002F3","Issue #3244770: Add access to 'jsonapi_resource_config--jsonapi_resource_config' endpoint",{"created_at":2546,"state":888,"web_url":2547,"title":2548},"2021-10-01T04:39:23.079Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Fjsonapi_views\u002F-\u002Fmerge_requests\u002F5","Issue #3145281: Allow user to decide whether to expose the view with JSONAPI",{"created_at":2550,"state":888,"web_url":2551,"title":2552},"2021-10-01T02:25:48.242Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Fjsonapi_views\u002F-\u002Fmerge_requests\u002F4","Issue #3239967: Pagination links are broken on Drupal 9.2.x",{"created_at":2554,"state":888,"web_url":2555,"title":2556},"2021-05-11T05:15:51.313Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Fjsonapi_menu_items\u002F-\u002Fmerge_requests\u002F5","Issue #3213317: No results for filters results in 403.",{"created_at":2558,"state":901,"web_url":2559,"title":2560},"2021-05-11T00:08:46.068Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Fjsonapi_menu_items\u002F-\u002Fmerge_requests\u002F4","Issue #3198306: Add link to related JSON:API resources.",{"created_at":2562,"state":888,"web_url":2563,"title":2564},"2021-05-02T06:11:17.311Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Fjsonapi_menu_items\u002F-\u002Fmerge_requests\u002F3","Issue #3211656: Caching issues with filters",{"created_at":2566,"state":888,"web_url":2567,"title":2568},"2021-05-01T02:17:45.922Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Fdruxt\u002F-\u002Fmerge_requests\u002F2","Issue #3211751: Missing EntityViewDisplays",{"created_at":2570,"state":901,"web_url":2571,"title":2572},"2021-04-17T02:05:22.149Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Fjsonapi_menu_items\u002F-\u002Fmerge_requests\u002F2","Issue #3171371: Add filters for menu tree parameters",{"created_at":2574,"state":888,"web_url":2575,"title":2576},"2021-04-14T10:51:45.107Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Fjsonapi_menu_items\u002F-\u002Fmerge_requests\u002F1","Issue #3205065: Menu items not discoverable",{"created_at":2578,"state":888,"web_url":2579,"title":2580},"2021-03-24T11:53:31.999Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Fjsonapi_views\u002F-\u002Fmerge_requests\u002F2","Issue #3205301: Add JSON:API Url to Query preview info.",{"created_at":2582,"state":888,"web_url":2583,"title":2584},"2021-03-07T04:09:31.707Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Fdruxt\u002F-\u002Fmerge_requests\u002F1","Issue #3202067: Expose 'menu--menu' resource attributes.",{"created_at":2586,"state":888,"web_url":2587,"title":2588},"2021-03-01T04:43:51.902Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Fjsonapi_views\u002F-\u002Fmerge_requests\u002F1","Issue #3200875: Error: Call to a member function getPagerId() on null",{"created_at":2590,"state":888,"web_url":2591,"title":2592},"2020-12-09T05:47:52.660Z","https:\u002F\u002Fgit.drupalcode.org\u002Fproject\u002Fdecoupled_router\u002F-\u002Fmerge_requests\u002F1","Issue #3187393: Linting fixes.",1788948076563]