HTTP/2 301
date: Sun, 12 Oct 2025 17:36:52 GMT
content-type: text/html; charset=utf-8
content-length: 0
vary: X-PJAX, X-PJAX-Container, Turbo-Visit, Turbo-Frame, X-Requested-With,Accept-Encoding, Accept, X-Requested-With
location: https://github.blog/2010-07-08-how-we-deploy-new-features/
cache-control: no-cache
strict-transport-security: max-age=31536000; includeSubdomains; preload
x-frame-options: deny
x-content-type-options: nosniff
x-xss-protection: 0
referrer-policy: origin-when-cross-origin, strict-origin-when-cross-origin
content-security-policy: default-src 'none'; base-uri 'self'; child-src github.githubassets.com github.com/assets-cdn/worker/ github.com/assets/ gist.github.com/assets-cdn/worker/; connect-src 'self' uploads.github.com www.githubstatus.com collector.github.com raw.githubusercontent.com api.github.com github-cloud.s3.amazonaws.com github-production-repository-file-5c1aeb.s3.amazonaws.com github-production-upload-manifest-file-7fdce7.s3.amazonaws.com github-production-user-asset-6210df.s3.amazonaws.com *.rel.tunnels.api.visualstudio.com wss://*.rel.tunnels.api.visualstudio.com github.githubassets.com objects-origin.githubusercontent.com copilot-proxy.githubusercontent.com proxy.individual.githubcopilot.com proxy.business.githubcopilot.com proxy.enterprise.githubcopilot.com *.actions.githubusercontent.com wss://*.actions.githubusercontent.com productionresultssa0.blob.core.windows.net/ productionresultssa1.blob.core.windows.net/ productionresultssa2.blob.core.windows.net/ productionresultssa3.blob.core.windows.net/ productionresultssa4.blob.core.windows.net/ productionresultssa5.blob.core.windows.net/ productionresultssa6.blob.core.windows.net/ productionresultssa7.blob.core.windows.net/ productionresultssa8.blob.core.windows.net/ productionresultssa9.blob.core.windows.net/ productionresultssa10.blob.core.windows.net/ productionresultssa11.blob.core.windows.net/ productionresultssa12.blob.core.windows.net/ productionresultssa13.blob.core.windows.net/ productionresultssa14.blob.core.windows.net/ productionresultssa15.blob.core.windows.net/ productionresultssa16.blob.core.windows.net/ productionresultssa17.blob.core.windows.net/ productionresultssa18.blob.core.windows.net/ productionresultssa19.blob.core.windows.net/ github-production-repository-image-32fea6.s3.amazonaws.com github-production-release-asset-2e65be.s3.amazonaws.com insights.github.com wss://alive.github.com wss://alive-staging.github.com api.githubcopilot.com api.individual.githubcopilot.com api.business.githubcopilot.com api.enterprise.githubcopilot.com; font-src github.githubassets.com; form-action 'self' github.com gist.github.com copilot-workspace.githubnext.com objects-origin.githubusercontent.com; frame-ancestors 'none'; frame-src viewscreen.githubusercontent.com notebooks.githubusercontent.com; img-src 'self' data: blob: github.githubassets.com media.githubusercontent.com camo.githubusercontent.com identicons.github.com avatars.githubusercontent.com private-avatars.githubusercontent.com github-cloud.s3.amazonaws.com objects.githubusercontent.com release-assets.githubusercontent.com secured-user-images.githubusercontent.com/ user-images.githubusercontent.com/ private-user-images.githubusercontent.com opengraph.githubassets.com marketplace-screenshots.githubusercontent.com/ copilotprodattachments.blob.core.windows.net/github-production-copilot-attachments/ github-production-user-asset-6210df.s3.amazonaws.com customer-stories-feed.github.com spotlights-feed.github.com objects-origin.githubusercontent.com *.githubusercontent.com; manifest-src 'self'; media-src github.com user-images.githubusercontent.com/ secured-user-images.githubusercontent.com/ private-user-images.githubusercontent.com github-production-user-asset-6210df.s3.amazonaws.com gist.github.com; script-src github.githubassets.com; style-src 'unsafe-inline' github.githubassets.com; upgrade-insecure-requests; worker-src github.githubassets.com github.com/assets-cdn/worker/ github.com/assets/ gist.github.com/assets-cdn/worker/
server: github.com
set-cookie: _gh_sess=d9cEbm4xBk0ZAkw6N8iHDK0UwTsgNVKoQP6zH5JO42MkUxuIc27omJ%2FsZtB%2B4MH53NYwbbUWdJCYYnDCJOvE7wOoKeC7lBgfbnNnsRsLtgxIiWlR5OQ253LChFmpy3cxS76OAf0U2EroncCGSFA46vWSu53ivdx0ALyg8%2BjJj2B2J1BhoomlbRiMCQorSidbNU5sJvclLgxas%2Bx81TVIbPPtmqzsl8WLwPZJp4%2B4dIPZyUPSVgUssQaQGrEDweWrXpuleVcuO2WaRKn9Wn8gqQ%3D%3D--23AtDimrsSZ6lQZk--c%2FYLU65yRhVrhEdaD7PLvw%3D%3D; Path=/; HttpOnly; Secure; SameSite=Lax
set-cookie: _octo=GH1.1.1215001842.1760290612; Path=/; Domain=github.com; Expires=Mon, 12 Oct 2026 17:36:52 GMT; Secure; SameSite=Lax
set-cookie: logged_in=no; Path=/; Domain=github.com; Expires=Mon, 12 Oct 2026 17:36:52 GMT; HttpOnly; Secure; SameSite=Lax
x-github-request-id: 8664:1321A5:BDF85D:F968C7:68EBE734
HTTP/2 301
server: nginx
date: Sun, 12 Oct 2025 17:36:52 GMT
content-type: text/html; charset=utf-8
location: https://github.blog/engineering/how-we-deploy-new-features/
x-redirect-by: Yoast SEO Premium
x-rq: bom2 177 249 80
x-cache: MISS
strict-transport-security: max-age=31536000;includeSubdomains;preload
HTTP/2 301
server: nginx
date: Sun, 12 Oct 2025 17:36:53 GMT
content-type: text/html; charset=UTF-8
location: https://github.blog/news-insights/the-library/how-we-deploy-new-features/
x-hacker: If you're reading this, you should visit https://join.a8c.com/viphacker and apply to join the fun, mention this header.
x-powered-by: WordPress VIP
host-header: a9130478a60e5f9135f765b23f26593b
x-frame-options: SAMEORIGIN
x-redirect-by: WordPress
x-rq: bom2 177 249 80
x-cache: MISS
strict-transport-security: max-age=31536000;includeSubdomains;preload
HTTP/2 200
server: nginx
date: Sun, 12 Oct 2025 17:36:53 GMT
content-type: text/html; charset=UTF-8
vary: Accept-Encoding
x-hacker: If you're reading this, you should visit https://join.a8c.com/viphacker and apply to join the fun, mention this header.
x-powered-by: WordPress VIP
host-header: a9130478a60e5f9135f765b23f26593b
x-frame-options: SAMEORIGIN
link: ; rel="https://api.w.org/"
link: ; rel="alternate"; title="JSON"; type="application/json"
link: ; rel=shortlink
content-encoding: gzip
cache-control: max-age=300, must-revalidate
accept-ranges: bytes
x-cache: MISS
x-rq: bom2 177 249 80
strict-transport-security: max-age=31536000;includeSubdomains;preload
How we deploy new features - The GitHub Blog
How we deploy new features
There’s been some recent discussion about rolling out new features. Ross at Flickr talked about using flags and flippers. Forrst mentioned their use of user buckets. The nice thing about…
July 8, 2010
|
Updated January 4, 2019
There’s been some recent discussion about rolling out new features. Ross at Flickr talked about using flags and flippers . Forrst mentioned their use of user buckets .
The nice thing about these techniques is that they’re simple and easy to tweak to meet your specific needs. Before launching Orgs, we relied on user feature flags to determine which users had beta access. However, we didn’t want to worry about enabling Orgs for all of the user’s fellow team members. This lead to a few UI if statements like this:
<% if @user.has_orgs? || @user.organizations.size > 0 -%>
<a href="...">Organizations</a><!-- link to organizations tab -->
We deploy a lot, but I don’t like littering the commit history with small configuration tweaks.
Replacing the Downloads server recently gave me a chance to try a slightly new technique: Using Redis for configuration management :
def use_nodeload?
case GitHub::Config[:nodeload]
when 'public' then current_repository.public?
when 'all' then true
else false
end
end
At one point, I was even sending a percentage of traffic to the new server to see how it handled things. If there were bugs, I could easily tweak the value in Redis without redeploying anything. If we need buckets, we could use Redis’ awesome Set commands .
Related posts
In September, we experienced three incidents that resulted in degraded performance across GitHub services.
AI is changing how software gets built. Explore the skills you need to keep up and stand out.
Why the U.S. Supreme Court case Cox v. Sony matters for developers and sharing updates to our Transparency Center and Acceptable Use Policies.
Explore more from GitHub
Docs
Everything you need to master GitHub, all in one place.
GitHub
Build what’s next on GitHub, the place for anyone from anywhere to build anything.
Customer stories
Meet the companies and engineering teams that build with GitHub.
GitHub Universe 2025
Last chance: Save $700 on your IRL pass to Universe and join us on Oct. 28-29 in San Francisco.
We do newsletters, too Discover tips, technical guides, and best practices in our biweekly newsletter just for devs.