{"id":220400,"date":"2026-03-24T22:48:00","date_gmt":"2026-03-24T22:48:00","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/pushpull\/"},"modified":"2026-03-29T19:35:53","modified_gmt":"2026-03-29T19:35:53","slug":"pushpull","status":"publish","type":"plugin","link":"https:\/\/tah.wordpress.org\/plugins\/pushpull\/","author":23149214,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"0.0.15","stable_tag":"0.0.15","tested":"6.9.4","requires":"6.0","requires_php":"8.1","requires_plugins":null,"header_name":"PushPull","header_author":"CreativeMoods","header_description":"Push Pull DevOps plugin for Wordpress","assets_banners_color":"","last_updated":"2026-03-29 19:35:53","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/creativemoods\/pushpull","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":324,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","changelog"],"tags":{"0.0.10":{"tag":"0.0.10","author":"jeromesteunenberg","date":"2026-03-28 06:56:09"},"0.0.11":{"tag":"0.0.11","author":"jeromesteunenberg","date":"2026-03-28 08:58:33"},"0.0.12":{"tag":"0.0.12","author":"jeromesteunenberg","date":"2026-03-28 20:48:42"},"0.0.13":{"tag":"0.0.13","author":"jeromesteunenberg","date":"2026-03-29 09:39:27"},"0.0.14":{"tag":"0.0.14","author":"jeromesteunenberg","date":"2026-03-29 15:04:09"},"0.0.15":{"tag":"0.0.15","author":"jeromesteunenberg","date":"2026-03-29 19:35:53"},"0.0.3":{"tag":"0.0.3","author":"jeromesteunenberg","date":"2026-03-24 22:47:37"},"0.0.4":{"tag":"0.0.4","author":"jeromesteunenberg","date":"2026-03-25 13:06:13"},"0.0.5":{"tag":"0.0.5","author":"jeromesteunenberg","date":"2026-03-26 10:43:37"},"0.0.6":{"tag":"0.0.6","author":"jeromesteunenberg","date":"2026-03-26 13:23:52"},"0.0.7":{"tag":"0.0.7","author":"jeromesteunenberg","date":"2026-03-26 14:55:53"},"0.0.8":{"tag":"0.0.8","author":"jeromesteunenberg","date":"2026-03-27 14:19:19"},"0.0.9":{"tag":"0.0.9","author":"jeromesteunenberg","date":"2026-03-27 17:07:43"}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3491811,"resolution":"128x128","location":"assets","locale":""},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3491811,"resolution":"256x256","location":"assets","locale":""}},"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.0.10","0.0.11","0.0.12","0.0.13","0.0.14","0.0.15","0.0.3","0.0.4","0.0.5","0.0.6","0.0.7","0.0.8","0.0.9"],"block_files":[],"assets_screenshots":[],"screenshots":[],"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[74387,32397,216845,15326,1673],"plugin_category":[],"plugin_contributors":[258561],"plugin_business_model":[],"class_list":["post-220400","plugin","type-plugin","status-publish","hentry","plugin_tags-content-sync","plugin_tags-devops","plugin_tags-generateblocks","plugin_tags-git","plugin_tags-github","plugin_contributors-jeromesteunenberg","plugin_committers-jeromesteunenberg"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/pushpull\/assets\/icon-128x128.png?rev=3491811","icon_2x":"https:\/\/ps.w.org\/pushpull\/assets\/icon-256x256.png?rev=3491811","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>PushPull stores selected WordPress content in a Git repository using a canonical JSON representation instead of raw database dumps.<\/p>\n\n<h3>Beta notice<\/h3>\n\n<p>This is a beta plugin. It is still under active development, has limited functionality, and currently supports only a narrow subset of the intended PushPull feature set.<\/p>\n\n<p>The current release supports these managed domains:<\/p>\n\n<ol>\n<li>Primary domains:\n   generateblocks_global_styles\n   generateblocks_conditions\n   wordpress_block_patterns\n   wordpress_menus\n   wordpress_pages\n   wordpress_posts\n   wordpress_custom_css\n   generatepress_elements\n   wordpress_attachments (explicit opt-in only)<\/li>\n<li>Config domains:\n   wordpress_core_configuration<\/li>\n<li>Overlay domains:\n   translation_management (WPML-backed)\n   media_organization (Real Media Library-backed)<\/li>\n<\/ol>\n\n<p>PushPull keeps a local Git-like repository inside WordPress database tables and supports the following workflow directly from WordPress admin:<\/p>\n\n<ol>\n<li>Test the remote GitHub or GitLab connection<\/li>\n<li>Commit live managed content into the local repository<\/li>\n<li>Initialize an empty remote repository<\/li>\n<li>Fetch remote commits into a local tracking ref<\/li>\n<li>Diff live, local, and remote states<\/li>\n<li>Pull remote changes through fetch + merge<\/li>\n<li>Merge remote changes into the local branch<\/li>\n<li>Resolve conflicts when needed<\/li>\n<li>Apply repository content back into WordPress<\/li>\n<li>Push local commits to GitHub or GitLab<\/li>\n<\/ol>\n\n<p>The plugin also includes:<\/p>\n\n<ol>\n<li>An audit log screen<\/li>\n<li>Local repository reset tooling<\/li>\n<li>Remote branch reset tooling that creates one commit removing all tracked files from the branch<\/li>\n<li>Global and per-domain managed-content views in the admin UI<\/li>\n<li>Primary, config, and overlay domain separation in settings and Managed Content<\/li>\n<li>A high-level PushPull status dropdown in the WordPress admin bar<\/li>\n<li>Menu structure export and apply with hierarchy and theme location assignment<\/li>\n<\/ol>\n\n<h3>Current scope<\/h3>\n\n<p>This is an early, focused release. At the moment, PushPull is intentionally limited to:<\/p>\n\n<ol>\n<li>GitHub and GitLab as implemented remote providers<\/li>\n<li>Managed domains across three families:\n   generateblocks\/global-styles\/\n   generateblocks\/conditions\/\n   wordpress\/block-patterns\/\n   wordpress\/menus\/\n   wordpress\/pages\/\n   wordpress\/posts\/\n   wordpress\/custom-css\/\n   wordpress\/attachments\/\n   wordpress\/configuration\/\n   wordpress\/generatepress-elements\/\n   translations\/management\/\n   media\/organization\/<\/li>\n<li>Canonical JSON storage with one file per managed item for manifest-backed sets, plus directory-backed storage for attachments using <code>attachment.json<\/code> and the binary file<\/li>\n<li>Explicit opt-in attachment sync through a media-library checkbox<\/li>\n<li>Overlay domains that scope themselves to enabled compatible base domains rather than exporting every backend row blindly<\/li>\n<\/ol>\n\n<p>It does not yet manage forms, arbitrary <code>wp_options<\/code>, or arbitrary plugin data.<\/p>\n\n<h3>How PushPull represents content<\/h3>\n\n<p>PushPull does not use WordPress post IDs as repository identity.<\/p>\n\n<p>For the currently supported managed sets it stores:<\/p>\n\n<ol>\n<li>One canonical JSON file per managed item<\/li>\n<li>One separate <code>manifest.json<\/code> file for manifest-backed sets that preserves logical ordering<\/li>\n<li>One directory per attachment for the attachments set, containing <code>attachment.json<\/code> and the binary file<\/li>\n<li>Stable logical keys instead of environment-specific database IDs<\/li>\n<li>Canonical logical-key references for cross-domain relationships such as reading settings, translation groups, media folders, GeneratePress condition targets, and menu object references<\/li>\n<li>Recursive placeholder normalization for current-site absolute URLs in post-type-backed content<\/li>\n<\/ol>\n\n<h3>Configuration<\/h3>\n\n<p>PushPull currently supports GitHub and GitLab repositories.<\/p>\n\n<p>For GitHub, grant:<\/p>\n\n<ol>\n<li>Repository metadata read access<\/li>\n<li>Repository contents read and write access<\/li>\n<\/ol>\n\n<p>For GitLab fine-grained personal access tokens, grant:<\/p>\n\n<ol>\n<li><code>Project: Read<\/code><\/li>\n<li><code>Branch: Read<\/code><\/li>\n<li><code>Commit: Read<\/code><\/li>\n<li><code>Commit: Create<\/code><\/li>\n<li><code>Repository: Read<\/code><\/li>\n<\/ol>\n\n<p>In PushPull &gt; Settings:<\/p>\n\n<ol>\n<li>Select <code>GitHub<\/code> or <code>GitLab<\/code> as the provider<\/li>\n<li>Enter the repository owner and repository name<\/li>\n<li>Enter the target branch<\/li>\n<li>Enter the API token<\/li>\n<li>Enable one or more managed content domains in the managed content settings<\/li>\n<li>Click <code>Test connection<\/code><\/li>\n<li>Save the settings<\/li>\n<\/ol>\n\n<h4>Workflow<\/h4>\n\n<p>The normal workflow is:<\/p>\n\n<ol>\n<li><code>Commit<\/code> to snapshot the current live managed-set content into the local repository<\/li>\n<li><code>Fetch<\/code> to import the current remote branch into <code>refs\/remotes\/origin\/&lt;branch&gt;<\/code><\/li>\n<li>Inspect the live\/local and local\/remote diff views if needed<\/li>\n<li><code>Pull<\/code> for the common fetch + merge flow, or <code>Merge<\/code> manually after fetch when you want review first<\/li>\n<li><code>Apply repo to WordPress<\/code> when you want the local branch state written back into WordPress<\/li>\n<li><code>Push<\/code> when you want local commits published to GitHub or GitLab<\/li>\n<\/ol>\n\n<p>If both local and remote changed, PushPull can persist conflicts, let you resolve them in the admin UI, and then finalize a merge commit.<\/p>\n\n<p>When pushing to GitLab, PushPull currently linearizes local merge results into a normal commit on the remote branch instead of preserving merge topology. The merged tree content is preserved; only the remote Git history shape is flattened.<\/p>\n\n<h4>Empty repositories<\/h4>\n\n<p>If the configured GitHub or GitLab repository exists but has no commits yet, <code>Test connection<\/code> will report that the repository is reachable but empty.<\/p>\n\n<p>In that case, click <code>Initialize remote repository<\/code>. PushPull will:<\/p>\n\n<ol>\n<li>create the first commit on the configured branch<\/li>\n<li>fetch that initial commit into the local remote-tracking ref<\/li>\n<li>make the repository ready for normal commit, fetch, merge, apply, and push workflows<\/li>\n<\/ol>\n\n<p>You do not need to create the first commit manually on the provider before using PushPull.<\/p>\n\n<h3>TODO<\/h3>\n\n<ol>\n<li>Cache the admin-bar PushPull status summary so the high-level live\/local and local\/remote aggregation is not recomputed on every page view.<\/li>\n<li>Move chunked async provider resumability fully into the provider layer so <code>AsyncBranchOperationRunner<\/code> no longer needs provider-specific GitLab staging rehydration logic.<\/li>\n<li>Improve push progress and recap reporting to distinguish newly uploaded objects from objects reused from the remote history.<\/li>\n<li>Surface unresolved logical-reference mapping issues, such as GeneratePress condition IDs that could not be converted to logical placeholders, instead of silently leaving mixed raw IDs and canonical refs.<\/li>\n<\/ol>\n\n<h3>External services<\/h3>\n\n<p>PushPull connects to the GitHub or GitLab API for the repository you configure in the plugin settings.<\/p>\n\n<p>The plugin uses the provider REST API to:<\/p>\n\n<ol>\n<li>Read repository metadata and the default branch<\/li>\n<li>Read and update branch refs<\/li>\n<li>Read and create Git objects or provider-equivalent commit actions<\/li>\n<li>Test repository access before sync operations<\/li>\n<\/ol>\n\n<p>PushPull sends the following information to the configured provider over HTTPS:<\/p>\n\n<ol>\n<li>The repository owner, repository name, branch, and API base URL<\/li>\n<li>Your configured API token in the provider-specific authentication header<\/li>\n<li>Canonical JSON representations of the managed content you choose to commit and push<\/li>\n<li>Commit metadata such as commit messages and, if configured, author name and email<\/li>\n<\/ol>\n\n<p>In the current release, the managed content sent to the provider is limited to the enabled supported domains: GenerateBlocks Global Styles, GenerateBlocks Conditions, WordPress Block Patterns, WordPress Menus, WordPress Pages, WordPress Posts, WordPress Custom CSS, GeneratePress Elements, explicitly opted-in WordPress Attachments, WordPress core configuration, WPML-backed translation management, and Real Media Library-backed media organization.<\/p>\n\n<p>PushPull does not send your whole WordPress database to the provider. It only sends the managed content represented by the enabled adapters.<\/p>\n\n<p>GitHub terms of service: https:\/\/docs.github.com\/en\/site-policy\/github-terms\/github-terms-of-service\nGitHub privacy statement: https:\/\/docs.github.com\/en\/site-policy\/privacy-policies\/github-general-privacy-statement\nGitLab terms: https:\/\/about.gitlab.com\/terms\/\nGitLab privacy statement: https:\/\/about.gitlab.com\/privacy\/<\/p>\n\n<!--section=installation-->\n<h4>Uploading in WordPress Dashboard<\/h4>\n\n<ol>\n<li>Download the plugin ZIP.<\/li>\n<li>In WordPress, go to Plugins &gt; Add New Plugin.<\/li>\n<li>Click Upload Plugin.<\/li>\n<li>Select the ZIP file.<\/li>\n<li>Install and activate the plugin.<\/li>\n<\/ol>\n\n<h4>Installing from source<\/h4>\n\n<ol>\n<li>Clone this repository into <code>wp-content\/plugins\/pushpull<\/code>.<\/li>\n<li>Run <code>composer install<\/code>.<\/li>\n<li>Activate PushPull in WordPress.<\/li>\n<\/ol>\n\n<!--section=changelog-->\n<h4>0.0.15<\/h4>\n\n<ol>\n<li>Added a new primary <code>wordpress_menus<\/code> domain with canonical JSON export and apply for WordPress menus.<\/li>\n<li>Added v1 menu location support so theme menu assignments round-trip alongside menu structure.<\/li>\n<li>Added canonical menu item references for pages, posts, taxonomies, post-type archives, and custom links, with hierarchy preserved through <code>parentItemKey<\/code>.<\/li>\n<li>Added focused menu export\/apply coverage and nav-menu bootstrap support in the test suite.<\/li>\n<li>Updated the readme functionality description so WordPress menus are listed as a supported primary domain.<\/li>\n<\/ol>\n\n<h4>0.0.14<\/h4>\n\n<ol>\n<li>Added a new <code>media_organization<\/code> overlay domain with a first Real Media Library-backed adapter that stores canonical attachment-to-folder path assignments instead of plugin-specific folder IDs.<\/li>\n<li>Expanded <code>WordPress core configuration<\/code> with <code>wordpress_permalink_settings<\/code> support for the site's permalink structure.<\/li>\n<li>Added a PushPull status dropdown in the WordPress admin bar with high-level live vs local and local vs remote summaries plus quick links into Managed Content and the Audit Log.<\/li>\n<li>Extended the WordPress pages and posts domains to own GeneratePress layout override meta, including legacy page-editor keys used for sidebar layout, footer widgets, full-width content, and disabled elements.<\/li>\n<li>Hardened the admin and provider integration edges with safer admin-bar status fallback behavior and PHPStan bootstrap stubs for Real Media Library functions.<\/li>\n<\/ol>\n\n<h4>0.0.13<\/h4>\n\n<ol>\n<li>Added a first core config domain, <code>WordPress core configuration<\/code>, with <code>wordpress_reading_settings<\/code> support for <code>show_on_front<\/code>, <code>page_on_front<\/code>, and <code>page_for_posts<\/code>.<\/li>\n<li>Added canonical page logical-key references for reading settings so front-page and posts-page options can round-trip across environments without leaking WordPress IDs.<\/li>\n<li>Added a dedicated config-domain apply path so non-post WordPress configuration can be applied cleanly without pretending to be posts or overlays.<\/li>\n<li>Introduced <code>Config domains<\/code> as a separate UI family alongside <code>Primary domains<\/code> and <code>Overlay domains<\/code> in settings and Managed Content.<\/li>\n<li>Changed the Managed Content screen to show only enabled domains, so disabled managed sets no longer clutter the tabs or overview.<\/li>\n<\/ol>\n\n<h4>0.0.12<\/h4>\n\n<ol>\n<li>Added a new <code>translation_management<\/code> overlay domain with a first WPML-backed implementation that exports only in-scope translation groups for managed content.<\/li>\n<li>Added generic overlay-domain support, including separate <code>Primary domains<\/code> and <code>Overlay domains<\/code> sections in settings and clearer visual separation in the Managed Content UI.<\/li>\n<li>Added managed-set dependency ordering so hard domain dependencies can be declared explicitly, with GeneratePress elements now ordered after WordPress pages and posts.<\/li>\n<li>Added canonical logical-key mapping for GeneratePress element page\/post conditions so environment-specific object IDs no longer leak across sites.<\/li>\n<li>Added the first overlay-specific apply path so non-post domains like translation management can be applied asynchronously without pretending to be WordPress posts.<\/li>\n<\/ol>\n\n<h4>0.0.11<\/h4>\n\n<ol>\n<li>Added new managed content domains for WordPress posts and GeneratePress elements.<\/li>\n<li>Added asynchronous, chunked <code>Apply repo to WordPress<\/code> operations with modal progress so large apply actions no longer rely on one long blocking request.<\/li>\n<li>Moved <code>Pull<\/code>, <code>Fetch<\/code>, and <code>Push<\/code> to the top Managed Content navigation row so branch actions stay available while working inside a specific managed set.<\/li>\n<li>Fixed GitLab recursive tree fetching so repositories with more than one page of files no longer silently miss later entries during fetch.<\/li>\n<li>Improved attachment apply so WordPress regenerates target-side attachment metadata and image sub-sizes instead of reusing stale source-site thumbnail metadata.<\/li>\n<\/ol>\n\n<h4>0.0.10<\/h4>\n\n<ol>\n<li>Added a GitLab provider with project, branch, commit, tree, and blob support plus linearized push support for merge results.<\/li>\n<li>Added GitLab-specific settings and documentation, including fine-grained PAT permission guidance and a note that remote merge topology is flattened on push.<\/li>\n<li>Fixed GitLab push ref tracking so follow-up commits and pushes no longer fail after the first successful push.<\/li>\n<li>Fixed chunked GitLab fetch and pull so synthetic root trees survive across async requests.<\/li>\n<li>Fixed chunked GitLab push so staged synthetic blobs, trees, and commits are restored correctly across async requests.<\/li>\n<\/ol>\n\n<h4>0.0.9<\/h4>\n\n<ol>\n<li>Added asynchronous branch actions in the <code>All Managed Sets<\/code> overview so <code>Fetch<\/code>, <code>Pull<\/code>, and <code>Push<\/code> no longer rely on a blocking full-page POST flow.<\/li>\n<li>Added modal-based operation progress UI, with indeterminate progress for fetch and determinate progress for push.<\/li>\n<li>Added a first-commit guard so PushPull now requires <code>Fetch<\/code> before creating the first local commit when the remote branch already has history.<\/li>\n<li>Fixed push planning so unchanged remote objects are reused in the normal linear-history case instead of being counted and uploaded again.<\/li>\n<\/ol>\n\n<h4>0.0.8<\/h4>\n\n<ol>\n<li>Added new managed content domains for WordPress custom CSS and WordPress pages.<\/li>\n<li>Added a dedicated WordPress attachments domain with directory-backed repository storage using <code>attachment.json<\/code> plus the binary file.<\/li>\n<li>Added explicit opt-in attachment sync through a <code>Sync with PushPull<\/code> checkbox in the media library, so only marked attachments are managed.<\/li>\n<li>Added <code>wp_pattern_sync_status<\/code> to the owned WordPress block pattern meta allowlist.<\/li>\n<li>Refactored the sync engine so managed sets can supply authoritative repository files directly, allowing non-manifest adapter families like attachments.<\/li>\n<\/ol>\n\n<h4>0.0.7<\/h4>\n\n<ol>\n<li>Fixed WordPress block pattern apply\/export escaping so <code>\\\\u002d<\/code> sequences survive correctly in both <code>post_content<\/code> and pattern meta.<\/li>\n<li>Removed creation and modification timestamps from generic post-type canonical items to avoid false diffs across environments.<\/li>\n<li>Changed the <code>All Managed Sets<\/code> overview so each managed set starts collapsed by default.<\/li>\n<\/ol>\n\n<h4>0.0.6<\/h4>\n\n<ol>\n<li>Fixed branch commits so committing one managed set no longer removes previously committed managed-set content from the same branch.<\/li>\n<li>Reorganized the Managed Content admin UI so branch actions (<code>Pull<\/code>, <code>Fetch<\/code>, <code>Push<\/code>) appear only in the all-managed-sets overview, while per-managed-set views keep only managed-set actions.<\/li>\n<li>Moved remote branch reset into Settings alongside the local repository reset controls.<\/li>\n<li>Added transparent current-site URL placeholder normalization for post-type-backed managed content so environment-local absolute URLs can round-trip across sites.<\/li>\n<li>Split plugin runtime assets from WordPress.org listing assets, with packaging and SVN deploy updated to use the correct directories.<\/li>\n<\/ol>\n\n<h4>0.0.5<\/h4>\n\n<ol>\n<li>Added GitHub-backed remote repository support using GitHub's Git Database API.<\/li>\n<li>Added end-to-end commit, fetch, pull, merge, conflict resolution, apply, and push workflows in WordPress admin.<\/li>\n<li>Added local and remote repository reset actions, audit logging, and operation locking.<\/li>\n<li>Added support for multiple managed content domains, including GenerateBlocks conditions and WordPress block patterns.<\/li>\n<li>Added release automation for packaging, Plugin Check, WordPress.org SVN deploy, and public GitHub sync.<\/li>\n<\/ol>\n\n<h4>0.0.1<\/h4>\n\n<p>Initial public release focused on GitHub-backed synchronization of GenerateBlocks Global Styles.<\/p>","raw_excerpt":"Git-based content sync for WordPress.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/tah.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/220400","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tah.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/tah.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/tah.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=220400"}],"author":[{"embeddable":true,"href":"https:\/\/tah.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/jeromesteunenberg"}],"wp:attachment":[{"href":"https:\/\/tah.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=220400"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/tah.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=220400"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/tah.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=220400"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/tah.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=220400"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/tah.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=220400"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/tah.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=220400"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}