dependabot-demo: The Repo That Shows Dependabot’s Decision Tree

Two requirement styles, one update policy, and raw bot logs reveal how Dependabot decides what deserves a pull request.

7 min read • View on GitHub • More from ankitvgupta

A sealed inspection machine sits between a requirements file on one side and a pull request envelope on the other. Sheets of log paper pass through a narrow chamber before the output is stamped and released. The scene explains that Dependabot is a sequence of checks and decisions, not a single magic update step.
The repo’s twist is visibility. It shows the decision path before the PR exists.
Key Takeaways

The weirdest thing in this repo is the point

Most Dependabot demos stop at the visible output. A pull request appears, a version changes, and the story ends there. ankitvgupta/dependabot-demo is interesting because it refuses to stop at the output. It checks in the raw execution logs, which turns the repo into a little laboratory for automated dependency policy.

That choice changes the whole read. Instead of treating Dependabot like a black box that happens to be hosted by GitHub, the repo exposes the parts that usually stay invisible: manifest parsing, version interpretation, proxy fetches, and the updater’s final decision. The result is less like a sample app and more like a field note from inside the bot.

Fork me to try out Dependabot

Kondux, Repository Maintainer · Kondux/dependabot

Two directories, two dependency philosophies

The core experiment lives in two sibling folders. compatible_release uses the Python compatible release operator, ~=`, while pinned_release uses the exact pin, ==. That sounds subtle, but it is the whole story. The same bot sees two dependency contracts and reacts differently because the contracts mean different things.

StrategyWhat it saysWhat Dependabot can doOperational meaning
<code>~= 1.24.0</code>Stay within the compatible release range.Suggest updates that still fit the range, or open a PR when the constraint itself needs to move.You are accepting some automatic movement, but only inside a boundary.
<code>== 1.24.0</code>Use this exact version and nothing else.Every change requires a deliberate version bump in the requirement file.You are trading convenience for tight control and repeatable installs.
Patch ignore ruleSkip semver patch updates at the policy layer.Dependabot focuses on larger changes instead of tiny churn.The repo makes policy visible, because the bot is not just scanning versions, it is obeying rules.
Two nearly identical dependency cards sit on a workbench. One card is flexible and bends slightly at the edges, while the other is locked in a rigid frame. A small update token approaches both, but a policy gate reroutes the token differently for each card. The image explains why `~=` and `==` create different automation outcomes.
The difference is not cosmetic. It changes what the bot is allowed to propose.

Inside Dependabot’s gatekeeping

The repository’s config file is the brainstem. In .github/dependabot.yml, the same ecosystem is configured for two directories, then a global patch ignore rule cuts off low-value noise. That means the bot is not simply checking for newer versions. It is checking versions through policy.

version: 2
updates:
  - package-ecosystem: "pip"
    directory: "/compatible_release"
    schedule:
      interval: "weekly"
  - package-ecosystem: "pip"
    directory: "/pinned_release"
    schedule:
      interval: "weekly"
    ignore:
      - dependency-name: "*"
        update-types: ["version-update:semver-patch"]

From there, the flow gets more interesting than a normal update bot. Dependabot reads the manifest, interprets the version operator, checks what the policy allows, and uses its updater and proxy layers to gather metadata before deciding whether a PR should exist. The checked-in logs matter because they show that the decision is assembled, not guessed.

The diagram turns the repo’s hidden machinery into a visible pipeline, from manifest parse to PR decision.

That is why the logs feel so revealing. They expose the difference between version semantics and update policy. A compatible release can move inside its range, a pinned release cannot, and the ignore rule can block patch noise even before the bot gets to the more interesting decisions.

Why this demo exists

This is not a production app. It is a teaching artifact. The repository exists to make an invisible system legible, which is a valuable move whenever automation starts making decisions on your behalf. Ankit Gupta’s repo does that by making the path from manifest to PR inspectable.

That framing matters because Dependabot often gets discussed as a convenience feature. This repo pushes the conversation one layer deeper. It shows that the convenience comes from a policy machine with a narrow set of choices, and those choices are the real product.

Dependabot is not the only answer

The natural comparison is Renovate. Dependabot wins on zero-friction GitHub integration, while Renovate wins on breadth and control. This repo is useful because it helps you see what you give up, or keep, when you choose the GitHub-native default.

ToolWhere it fits bestStrengthTrade-off
DependabotTeams already living in GitHub.Simple setup and native pull requests.Less expressive policy and fewer cross-repo presets.
RenovateTeams that want deeper configuration.Broader platform support and richer rules.More setup, more tuning, more surface area.

The point is not to crown a winner. It is to notice what this repo teaches about automation: the more invisible the policy, the more useful a demo becomes. Dependabot feels simple at the top because the policy is doing careful work underneath.

The practical lesson for teams

If you use ~=`, you are saying that compatible movement is acceptable. If you use ==, you are saying that every change deserves explicit attention. Dependabot does not erase that difference. It makes the difference operational.

That is the real value of dependabot-demo. It shows that dependency automation is not just about staying current. It is about deciding how much change to absorb automatically, how much noise to ignore, and how much control you want to keep in the repository itself.