diff --git a/drupalorg/drupalorg.module b/drupalorg/drupalorg.module
index 0a1a6b2f6cfbb5ebc4e41dc838a7d58b35990db7..44b8a8c27491d81ba130b6313263d8de2f2a02e3 100644
--- a/drupalorg/drupalorg.module
+++ b/drupalorg/drupalorg.module
@@ -535,6 +535,14 @@ function drupalorg_menu() {
     'file' => 'drupalorg.pages.inc',
   ];
 
+  $items['drupalorg_toggle_branch_visibility/%/%/%'] = [
+    'page callback' => '_drupalorg_toggle_branch_visibility',
+    'page arguments' => [1, 2, 3],
+    'access arguments' => ['edit any project_issue content'],
+    'type' => MENU_CALLBACK,
+    'file' => 'drupalorg.pages.inc',
+  ];
+
   return $items;
 }
 
diff --git a/drupalorg/drupalorg.pages.inc b/drupalorg/drupalorg.pages.inc
index 569b38b73faf6759ed6ba5a3aea22e5e20322c25..4723dd0f4858e21951c579b121733387a5e72119 100644
--- a/drupalorg/drupalorg.pages.inc
+++ b/drupalorg/drupalorg.pages.inc
@@ -1342,3 +1342,32 @@ function drupalorg_org_owner_tools(stdClass $node) {
 
   return $content;
 }
+
+/**
+ * Callback function.
+ */
+function _drupalorg_toggle_branch_visibility($gitlab_project_id, $branch_name, $status) {
+  // Check token.
+  if (!isset($_GET['token']) || !drupal_valid_token($_GET['token'], 'drupalorg-toggle-branch-' . $gitlab_project_id . '-' . $branch_name . '-' . $status)) {
+    drupal_set_message(t('Invalid token.'), 'error');
+    drupal_access_denied();
+  }
+
+  // Check that the status value is valid.
+  if (!in_array($status, ['hidden', 'active'])) {
+    drupal_set_message(t('Status %status is not a valid option.', ['%status' => $status]), 'error');
+    drupal_goto();
+  }
+
+  // Set the visibility of the branch.  
+  db_merge('drupalorg_issue_fork_branches')
+    ->key([
+      'gitlab_project_id' => $gitlab_project_id,
+      'branch' => $branch_name,
+    ])
+    ->fields(['status' => $status])
+    ->execute();
+
+  drupal_set_message(t('Branch visibility has been toggled.'));
+  drupal_goto('', ['fragment' => 'main']);
+}
diff --git a/drupalorg/includes/DrupalorgIssueFork.php b/drupalorg/includes/DrupalorgIssueFork.php
index 6dca7f620a648540c7eddf575fffba81ad976353..214695508f03e79cdc06b2e74c0dd294c3319e14 100644
--- a/drupalorg/includes/DrupalorgIssueFork.php
+++ b/drupalorg/includes/DrupalorgIssueFork.php
@@ -525,6 +525,23 @@ class DrupalorgIssueFork extends Entity {
           ],
         ];
       }
+
+      if (user_access('edit any project_issue content')) {
+        $toggle_text = ($row->status == 'hidden') ? t('show') : t('hide');
+        $new_status = ($row->status == 'hidden') ? 'active' : 'hidden';
+        $branch_output['operations']['toggle'] = [
+          '#prefix' => '<a class="toggle-branch" title="' . t('@toggle branch for everyone', [
+            '@toggle' => ucfirst($toggle_text),
+          ]) . '" href="' . url('drupalorg_toggle_branch_visibility/' . $this->gitlab_project_id . '/' . $row->branch . '/' . $new_status, [
+            'query' => [
+              'token' => drupal_get_token('drupalorg-toggle-branch-' . $this->gitlab_project_id . '-' . $row->branch . '-' . $new_status),
+              'destination' => current_path(),
+            ]
+          ]) . '">',
+          '#markup' => $toggle_text,
+          '#suffix' => '</a> ',
+        ];
+      }
       $output['branches'][$row->status][] = $branch_output;
     }