93 comments

[ 3.1 ms ] story [ 69.3 ms ] thread
I assume this is because of LLM scraping.
> A request that arrives with no credentials gets 60 requests per hour per IP address.

One request per minute.

Average, yes, but the way they phrase it, it could be a token bucket or similar, where you can do 60 quick requests and then be blocked for a bit while the bucket refills
More like you have 60 requests, you can exhaust them in a single second or spread them differently as per your choice.
Doesn’t help with scrapers though. They use a unique IP for each query.
Hopefully they bump this up.

Browsing open issues or reviewing a few PRs will easily use more than one request per minute.

The limits are based on the average user but I wonder if the most common interaction is to view a readme and bounce.

I don’t know that putting a paywall up to learn from or even consider contributing to public projects is a good thing.

Or a lot more with IPv6.
Most connections or VPS have a shared 64bit prefix that acts similar to an IPv4 address in that it's easy to block.

Yes, you get 64 more bits to make whatever addresses you want, but the prefix is still your fingerprint.

Could even do /32 if they want to make it as scarce as ipv4
I noticed that recently Github.com has some kind of weird bot detection on public repos. I have a browser extension for switching User Agents for a specific legacy site, sometimes i forget to turn it off and Github will require me to login to view public repos.

All of this is most likely due to mass scraping by LLMs.

The post is about gitlab but on the subject of GitHub, the rate limit I seem to have for viewing commit history seems to be 0 for logged out users and viewing source files seems to be about 5/hour.
Congrats on making the world worse with AI. All this performative data scraping and uploading and no progress at all.
No progress?!
(comment deleted)
what are you talking about? it's progressing a lot of money into specific people's pockets
Making the privileged money and giving them the power to manipulate the mass is progress to some.
I think it's because people are building agentic flows, reducing the amount of developer seats needed. It's the first step towards usage based pricing.
Providing kickbacks to the repos being scraped would be a good way to help fund open source projects and pay creators like streaming services do. Seems like they're headed in this direction - it would be a massive product differentiator over GH
Three minutes after kickbacks were announced there would be a flurry of new repos being created with bots repeatedly scraping them just to get those kickbacks.
Also known as the Cobra effect
My first reaction was that I really like this idea.

If we had a system where people who access projects pay and popular FOSS developers get paid for it we'd have much better alignment.

My second thought was that bots would immediately try to circumvent such a plan. They'd probably spam Gitlab with fake repos to try to harvest those payouts.

> They'd probably spam Gitlab with fake repos to try to harvest those payouts.

Yeah I wonder if the math would shake out to make that make any sense. Each bot would require a paid subscription, so the only incentive for them to do this would be if there was some discoverability algorithm or SEO that that traffic helped push the content to real users

The problem with this is that paying is a massive friction point to joining that many people, wisley or not, are much more averse to than a free (if toxic) option.

Normally, this is manageable, but for product categories with a huge network effect (like social media) this is a death knell unless you have the users of that product category already used to paying (Adobe's network effect driven business model comes to mind), and even then the switching friction is greater since that usually means many people paying for two systems for quite a long time, if not indefinitely.

Everyone pays one way or another
I think the main issue here is that the access point for many OSS projects most of the time is package managers.

People often aren’t hitting up GitHub directly to get or install open source projects: they’re going via homebrew, npm, or whatever, so the registry becomes the source. Of course you can install directly from GitHub even with package managers but most times you don’t and it’s increasingly seen as a security issue.

On your second point, ugh, yes, you’re absolutely right. I don’t think it would work exactly the way you describe but, if there’s some automated revenue sharing/distribution, you can bet that people will find ways to exploit it via some form of spamming.

You're right. Blanket rate limits probably aren't a good way to handle the traffic profile of places git services.

Package managers tend to only need a small portion of what's in any given repo; some metadata to figure out what's going on and a single binary package is generally enough. The obvious answer is to separate those out and serve them differently from developers, who are actually monkeying around with the source code.

I like the idea, but that wasn’t my read.

The guidance given seems to hurt open source projects, not help.

> Make the project private if the traffic is not coming from the audience you built it for, which stops anonymous callers reaching it at all. Or upgrade to Premium or Ultimate for much higher limits.

I would spend thousands of dollars for gitlab in terms of: 1) better UX for admin panel, I'm not sure what I've enabled and what not. Several buttons do not disable the rest of the settings, leaving me with some doubts (e.g. if I disabled grafana, why is there a setting that talks about where/how I store?) 2) a minimal version of gitlab without all the AI
Github would hit four nines if they followed suit. no clue why the dont try
Doesn't GitHub already have rate limiting especially if you are not logged in?
Yes. A lot is not accessible if not logged in.
it's too generous and contributes to their reliability woes
Because that would go against MSFT's wishes on pushing LLM driven development if they started acknowledging that these tools are more damaging than helpful.
GitHub's "paid" rate limits are the same as GitLab's free tier, so no, it doesn't help
I understand why they're doing this, but the anticausative title kinda rubs me the wrong way.
I am honestly surprised they aren't going lower at this point.

Gitlab must pay a fortune to bot traffic, most of which is malicious or garbage at best.

Damn, we’re even having Claude write important press releases now
"Write a post about decreasing limits so that this information is as obfuscated as possible."
I put the text in to gptzero's AI checker and it came back with being Highly Confident it was 100% AI written. I don't think I've ever seen it that confident that the entire thing was AI before.
Hmm I don't know if they've updated it, but I'm not smelling any of the Claudisms I know so well. No convoluted sentences, metaphors, therapy-speak, 'it's not' constructions, "load bearing" etc etc.
It’s the structure that really gives this one away. If you were writing a blog post about introducing limits you wouldn’t explain what HTTP 429 is or what the behavior would be like. It’s a rate limit.
The one that gave it away for me was “a request that arrives with no credentials gets 60 requests”. Nobody speaks like this, almost everyone would say “unauthenticated requests are limited to 60 per minute”, unless they’re writing a LinkedIn post which Claude seems to think it’s always doing.
My FF being in French, I was automatically served a French version and I just couldn't understand what I was reading. Each sentence unclear, no link between sentences...
I've mentioned in other threads, but we have execs at my work sending out emails using Claude. It's hilarious, but not unexpected.
Dunno, for folks around here, Claude is important, Gitlab is important and banal press release is important. So all of them together makes it obviously important.
> The requested URL was not found on this server.

Getting that so I do not know exactly what they are doing. From the title I am guessing they are restricting or throttling if downloads exceeds some value.

If you are using LLMs to interact with sites like GitLab and GitHub, and you have the option to use a GraphQL API, you should jump on it immediately.

GraphQL is absolutely terrible for human developers to interact with, but it's like Facebook could see into the future back in 2012. I cannot imagine a more perfect API surface for agents. With the REST API on GitHub, you can consume maybe 10 issue JSON blobs before your context window is blown out. With GraphQL constraining the results you can easily read hundreds in the same token budget.

Additionally, the # of requests your agents need to make can be reduced in many cases since GraphQL can join across types whereas REST APIs cannot. You essentially get savings in two dimensions here. Quota and raw token volume per logical response.

Although that may be true, the quota at least on GitHub depends on what you're quering. We worked directly with GitHub and a complex enough organisation hit with a GraphQL query can actually hit your hourly app limit before you even get a response.

As for GitLab, having hosted it for medium size organisations (~200 devs) and seeing how monorepo's work (they don't, we had GitLab's team show us that one page view made 50K db queries on our setup), please consult with your local admin team before firing GraphQL at it.

The quota consumption is based on the upfront possible number of connections given the query, not actual connections, so deeply nested queries can be very expensive if not aware and careful about it.
I work closely with the team responsible for a large, self-hosted GitHub Enterprise instance. This is good advice for clients/consumers of GH data, but it can very easily lead to a lot of strain on the server-side. It’s not obvious what fields that you request are simple reads from tables or actually end up invoking git under the hood.

You could argue the rate limit guards should better reflect that, but that’s just not the reality of the system. Likely speaks to a lot of stability issues GitHub has been facing lately.

Isn't it kind of part and parcel of any GraphQL deployment to update it efficiently?
That is true for almost any GraphQL backend not just GHE.
> It’s not obvious what fields that you request are simple reads from tables or actually end up invoking git under the hood.

I'm not familiar with graphql but what would make something "invoke git", is it a technical thing or hyperbole?

My over-simplified explanation: the graphql server will map a field on a request to a resolver. The resolver can execute whatever code it needs to return the value, up to and including calls into libgit.

So asking for the title of a PR might just be an extra column selected on a DB query. But calculating mergability status of that PR might be something else entirely.

All of the queries my agents use select fields like issue title, body, labels, createdAt, updatedAt, etc. That's about it. I would hope that stuff is cached and efficient to read. I do not think GraphQL is a good way to interact with git. Running git on the CLI is the best way to interact with git.
It's definitely one source of GitHub's issues. They never implemented limits properly and their codebase is likely decades of cruft and impossible to retrofit quickly (to say nothing of their horrific mysql clusters). If you want to scale and survive it, you have to build the thing right the first time.
You have to be so uptight about performance when you're small that people look at you funny, or your shit is going to fall right over under webscale (ai scale?) load.
Well 1. GitHub is the broken & bad one, and 2. isn't that kind of on them? If they're getting a ton of requests that read data awkwardly, the fix seems like the quintessential data engineering task.
You sound like someone who has not been informed about the problem GitHub is facing. No one else is facing anything close to it, so there is no meaning to "the bad one".

https://cursor.com/blog/git-at-any-scale

I put my ssh credential behind a tpm and now I notice that every time I switch a chat in ChatGPT it tries to see the current remote status of the branch.

That also doesn’t help with load. So besides what agents are doing themselves the AI companies also have a responsibility of being good citizens.

VS Code does this as well - or maybe the GitHub plugin does it. Either way, GitHub owns it.
> lot of strain on the server-side

That's why GitHub assigns "points" to each requests and deducts based on the data shape you request. For simple requests it's 1-to-1, but can quickly balloon

GraphQL is the AGENT=true of API responses.
> With the REST API on GitHub, you can consume maybe 10 issue JSON blobs before your context window is blown out.

This is a solved problem. They just dump it into a file and `jq` or `rg` to find the stuff they need.

Agents are smarter than you think. They've been hill-climbing for generations in their RL environments.

The ones that get their context window blown out don't survive to launch

I digress, but GitHub's GraphQL API has been neglected for years. Or at the minimum, they have not maintained feature parity with their REST API, so there are a good number of cases where you simply cannot do what you need to do without using their REST API.
It depends. There are hidden limits in GitHub’s gql. Some will time out above certain quantities and it’s not documented, which probably means it’s a significant server strain to serve the successful responses. I find I have to maintain a test suite to probe those limits. All this makes REST continue to be appealing if testing the gql load for a service hints at any uncertain limits/instability.
Now imagine an API that turns every prompt into a validated query within seconds, no prior schema knowledge required because we're building an index, so the model is not wasting tokens on that task even with multiple megabytes of SDL.

We're building such an API for some of the biggest enterprises in the world. Many of them have very large (federated) GraphQL APIs across tens and hundreds of teams. From an agent perspective it's a lot easier to consume a single unified graph where a single query can span 5 relationships vs making hundreds of N+1 rest API calls across many heterogenous APIs from different teams that all look slightly different.

All practical GraphQL interfaces constrain you to precisely the query formats that are used by the front end, to avoid queries accidentally reading private data or blowing up computation time.
GraphQL is not terribly bad to interact with. The schema system and field selection is really powerful that you can pick partial results, and that you can use an object oriented way to represent your domain models. It is pretty neat for cross-team collaboration.

Replacing GraphQL and REST + OpenAPI OTOH I think is much more terrible. You have two API description language (one on the URL path, maybe the Zod schema, another one on the OpenAPI schema). Things like tRPC or magic functions are just using Typescript type system and comment to replace the schema that GraphQL already has.

The only thing I would bitch about GraphQL is it is quite hard to build an ad-hoc GraphQL server from the first principle, while REST is really KISS till the end. And GraphQL typically needs a lot more attention to N+1 problem.

Having worked on the gh gql api, I wish you luck with timeouts haha
Worst case, this could be the start of a paywall to learn from, contribute to, or host open source projects.

Hopefully they find some kind of carve out for OSS projects while still blocking the egregious offenders.

60 requests per hour per IP if you haven't signed in... well that's unfortunately low.
60 requests an hour per IP seems low for a school or office network. A few people browsing issues and source files could use that up quite fast.
> You get 429 Too Many Requests with RateLimit-* headers and a Retry-After. Wait the interval it gives you, then retry.

Is there a test endpoint where one can validate the behavior of their ratelimit detection? Basically I do not want to cause excessive load on your servers just to test my implementation.

This is why I moved my code to self hosted forgejo instance. Private and guarded behind self hosted OIDC instance.

No more worrying about "rate limiting," subscription hell, or random extended outages (ie, github).

If LLM wants access, might implement payment layer and use 402 http status code and redirect them to payment page ;). Wonder how many people just give agents carte blanche physical (credit card) and virtual access

I forgot a superfluous free tier proof of concept pipeline and it ran every 6 hours for three months before I remembered to shut it off, sorry.

I expect to not be the only one, it certainly drives usage KPIs up and lead to this kind of decisions.

Important buried context: 60/hour unauthenticated, but 5,000/hour on the free plan.

60/hour sucks. 5000/hour (a little more than one per second) is totally fine.

I'm chalking this up alongside Docker's decision to restrict unauthenticated pulls. Unauthenticated anything went the way of the dodo some time ago. If you want unauthenticated access, go run your own mirror.

blog post should've been titled, have your agents sign in
CI needs to be decentralized, and the agents should run the test and verify the proof. This avoids all those API calls.
im self hosted so im somewhat safe i guess
To anybody saying this is brought on due to AI scraping - It isn't, they are just doing this at a time that can be seen as a valid excuse. Countering AI scraping is a solved problem. This has been rolled out to bring in more subscriptions and more dollars.