<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/local-ci-with-gh-signoff-why-i-turned-off-github-actions-for-pull-requests-bf9uoyylc" -->

---
title: Local CI With gh signoff: Why I Turned Off GitHub...
description: Pull requests in this repo haven't run GitHub Actions since June. The build and tests now run locally, and a 'signoff' commit status posted via Basecamp's...
canonical: https://daily.dev/posts/local-ci-with-gh-signoff-why-i-turned-off-github-actions-for-pull-requests-bf9uoyylc
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: Local CI With gh signoff: Why I Turned Off GitHub Actions for Pull Requests | daily.dev
og:description: Pull requests in this repo haven't run GitHub Actions since June. The build and tests now run locally, and a 'signoff' commit status posted via Basecamp's...
og:url: https://daily.dev/posts/local-ci-with-gh-signoff-why-i-turned-off-github-actions-for-pull-requests-bf9uoyylc
og:image: https://api.daily.dev/og/posts/bF9uOyYlc.png
og:image:alt: Local CI With gh signoff: Why I Turned Off GitHub Actions for Pull Requests
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Local CI With gh signoff: Why I Turned Off GitHub Actions for Pull Requests

**[Milan Jovanović](https://daily.dev/sources/milanjovanovic)** · 10 min read · 0 upvotes · 0 comments

## Summary

Pull requests in this repo haven't run GitHub Actions since June. The build and tests now run locally, and a 'signoff' commit status posted via Basecamp's gh-signoff extension gates the merge instead. In the 19 days before the switch, the CI workflow ran 588 times for pull requests, about 2.7 minutes each on a 2-core runner. Since then, 833 pull requests have merged with zero pull-request CI runs, while cloud CI still runs once per merge to main and on a weekly schedule to catch CVEs in base images. A GitHub ruleset requires the 'signoff' status before merging, and a pre-push git hook runs the checks locally before the push.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://milanjovanovic.tech/blog/i-turned-off-ci-for-pull-requests>

## Questions this post answers

### how can I require a GitHub status check that no workflow actually posts

A branch ruleset can require any status check by name, and the commit status API lets anyone with push access post one manually. Basecamp's gh-signoff extension posts a status named 'signoff' on the current commit, and running 'gh signoff install' creates the ruleset that requires that status before merging.

_Developers streamlining CI setups can find similar GitHub Actions workflow patterns on daily.dev._

### what exactly does the gh-signoff GitHub CLI extension do

It runs no tests itself. It posts a success commit status named 'signoff' on the current commit, and by default refuses to run while the repository has uncommitted or unpushed changes, ensuring the status lands on a commit GitHub already has. It's meant to run at the end of a script that stops on the first failing check.

_Teams deciding how to cut CI costs can compare local-gate approaches like this one on daily.dev._

### how much GitHub Actions usage can you save by disabling CI on pull requests

One .NET and Docker workflow ran 588 times for pull requests in 19 days before the switch, about 2.7 minutes each on a 2-core runner, plus again on every merge. After moving checks to a local pre-push gate with a signoff status, the workflow ran zero times for pull requests across 833 subsequent merged pull requests, running only once per merge to main.

_Engineers watching their Actions bill can track cost-cutting CI patterns like this on daily.dev._

## Similar posts on daily.dev

- [We now auto-approve and merge 15% of PRs](https://daily.dev/posts/we-now-auto-approve-and-merge-15-of-prs-8bygwtyr3) · swizec.com · 42 upvotes · 14 comments
- [Changes to test merge commit generation for pull requests](https://daily.dev/posts/changes-to-test-merge-commit-generation-for-pull-requests-drn1bxdax) · GitHub Changelog · 0 upvotes · 0 comments
- [GitHub Actions hardens checkout security to block ‘pwn request’ attacks](https://daily.dev/posts/github-actions-hardens-checkout-security-to-block-pwn-request-attacks-9pqi2ntb0) · InfoWorld · 0 upvotes · 0 comments
- [GitHub Actions alternative: Run Actions on CircleCI \(open preview\)](https://daily.dev/posts/github-actions-alternative-run-actions-on-circleci-open-preview--dcba6vjnb) · CircleCI · 1 upvotes · 0 comments
- [DRY isn't just for application code](https://daily.dev/posts/dry-isn-t-just-for-application-code-tqbsmydfp) · OctopusDeploy · 0 upvotes · 0 comments

---

Tags: [#github](https://daily.dev/tags/github), [#cicd](https://daily.dev/tags/cicd), [#.net](https://daily.dev/tags/.net), [#git](https://daily.dev/tags/git), [#github-actions](https://daily.dev/tags/github-actions)

[View this post on daily.dev](https://daily.dev/posts/local-ci-with-gh-signoff-why-i-turned-off-github-actions-for-pull-requests-bf9uoyylc)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"Local CI With gh signoff: Why I Turned Off GitHub Actions for Pull Requests","url":"https://daily.dev/posts/local-ci-with-gh-signoff-why-i-turned-off-github-actions-for-pull-requests-bf9uoyylc","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/local-ci-with-gh-signoff-why-i-turned-off-github-actions-for-pull-requests-bf9uoyylc"},"datePublished":"2026-10-30T20:03:02.361Z","dateModified":"2026-10-30T20:03:42.370Z","description":"Pull requests in this repo haven't run GitHub Actions since June. The build and tests now run locally, and a 'signoff' commit status posted via Basecamp's...","image":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/45053ab58379cd5d7c0f596e4097fccc?_a=AQAEuop","thumbnailUrl":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/45053ab58379cd5d7c0f596e4097fccc?_a=AQAEuop","isAccessibleForFree":true,"articleSection":"Milan Jovanović","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"Milan Jovanović","logo":"https://media.daily.dev/image/upload/t_logo,f_auto/v1/logos/78d8abfb692746538410dee47f93e566","url":"https://daily.dev/sources/milanjovanovic"},"commentCount":0,"discussionUrl":"https://daily.dev/posts/local-ci-with-gh-signoff-why-i-turned-off-github-actions-for-pull-requests-bf9uoyylc","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":0},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":0}],"keywords":"github,cicd,.net,git,github-actions","timeRequired":"PT10M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"Milan Jovanović","item":"https://daily.dev/sources/milanjovanovic"},{"@type":"ListItem","position":3,"name":"Local CI With gh signoff: Why I Turned Off GitHub Actions for Pull Requests"}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/local-ci-with-gh-signoff-why-i-turned-off-github-actions-for-pull-requests-bf9uoyylc#faq","mainEntity":[{"@type":"Question","name":"how can I require a GitHub status check that no workflow actually posts","acceptedAnswer":{"@type":"Answer","text":"A branch ruleset can require any status check by name, and the commit status API lets anyone with push access post one manually. Basecamp's gh-signoff extension posts a status named 'signoff' on the current commit, and running 'gh signoff install' creates the ruleset that requires that status before merging. Developers streamlining CI setups can find similar GitHub Actions workflow patterns on daily.dev."}},{"@type":"Question","name":"what exactly does the gh-signoff GitHub CLI extension do","acceptedAnswer":{"@type":"Answer","text":"It runs no tests itself. It posts a success commit status named 'signoff' on the current commit, and by default refuses to run while the repository has uncommitted or unpushed changes, ensuring the status lands on a commit GitHub already has. It's meant to run at the end of a script that stops on the first failing check. Teams deciding how to cut CI costs can compare local-gate approaches like this one on daily.dev."}},{"@type":"Question","name":"how much GitHub Actions usage can you save by disabling CI on pull requests","acceptedAnswer":{"@type":"Answer","text":"One .NET and Docker workflow ran 588 times for pull requests in 19 days before the switch, about 2.7 minutes each on a 2-core runner, plus again on every merge. After moving checks to a local pre-push gate with a signoff status, the workflow ran zero times for pull requests across 833 subsequent merged pull requests, running only once per merge to main. Engineers watching their Actions bill can track cost-cutting CI patterns like this on daily.dev."}}]}
```

