Open-source project
go-rod/rod avatar
go-rod/rod

go-rod/rod: a Go driver that speaks DevTools Protocol directly

A Chrome DevTools Protocol driver for web automation and scraping.

7,117 stars487 forksGoMIT

At a glance

What is it?
Rod is a Go library for browser automation and scraping that talks to Chrome over DevTools Protocol instead of wrapping WebDriver. It hides browser download, auto-waits and iframe handling behind chained calls, and it stays close enough to the protocol that you can drop to raw CDP when the helpers run out.
Who is it for?
Adopt go-rod/rod if your automation or scraping code is already Go and you want CDP-level control without writing WebDriver plumbing; skip it if your team lives in Python or Node and needs a large ecosystem of plugins, or if you need a browser other than Chrome or Chromium.
Can I use it commercially?
Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 51 days ago.
What is it written in?
Mainly Go, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 30, 2026, and from our analysis. They are not legal advice.

Editorial analysis

What rod is for, and who should reach for it

Rod is a Go library for web automation and scraping that sits directly on top of the Chrome DevTools Protocol. That phrasing matters. It is not a WebDriver client, and it is not a wrapper around another automation library. The README describes it as a "high-level driver directly based on DevTools Protocol", designed for both high-level and low-level use, with the high-level functions presented as examples for building a default version of Rod rather than as a fixed surface.

The audience follows from that. If you write Go and you need to drive a real Chrome or Chromium instance, rod gives you element queries, input, navigation and network interception in the same language as the rest of your service. If you need to reach past those helpers, the low-level packages are part of the same library, so you are not switching stacks to send a raw protocol command. Teams that already have a Python or Node automation suite have less reason to move, and the README does not argue that they should.

Chained context, auto-wait and the CDP layer underneath

The core design idea in the README is a chained context: calls are threaded together so that a timeout or cancellation applies to the whole chain rather than to each step. That is a different model from passing a context into every individual call, and it is the reason a rod program reads as one expression that either completes or times out.

On top of that, rod auto-waits for elements to be ready, so a query does not fail merely because the node has not appeared yet. The README lists WaitStable, WaitRequestIdle, HijackRequests and WaitDownload among the high-level helpers, and describes a two-step WaitEvent design that is meant to avoid missing events. Element lookup is documented as handling nested iframes and shadow DOMs, which is the part most homegrown CDP scripts get wrong first.

The repository layout reflects the split between convenience and protocol. Top-level files such as browser.go, page.go, element.go, input.go and hijack.go hold the user-facing API, while lib/ contains subpackages. The dependencies named in go.mod point at the same pattern: goob for the event design, leakless for process cleanup, gson for JSON, fetchup for fetching a browser. None of them are general-purpose web frameworks. They exist to make the driver behave.

Two claims in the README are worth separating. The library advertises thread safety for all operations, and it advertises that no zombie browser process is left after a crash. Both are properties you would want to verify against your own workload rather than assume, because they depend on how you launch and close the browser.

Installing rod and scraping a page for the first time

Rod is a Go module. The module path in go.mod is github.com/go-rod/rod, and the module declares go 1.21, so a toolchain at or above that version is the baseline. Add it with the standard Go command, which records the dependency in your module files.

Where rod gets in the way

The documentation surface is the first limitation. The README points to the documentation site, the pkg.go.dev reference and a FAQ, then tells you to search unit tests, issues and discussions for detailed examples. That is workable for a Go developer who is comfortable reading tests, and it is a poor fit for someone who wants a curated guide for every helper. If your team cannot read Go tests to learn an API, budget extra time.

Versioning is the second thing to look at. The newest release listed for the repository is v0.116.2 from 2024-07-12, and the last push to the repository was on 2026-08-11. A stable v1 has not been declared, so the import path carries no compatibility promise from the module version itself. Pin a version in go.mod and read the diff before you move.

Third, rod drives Chrome and Chromium through DevTools Protocol. There is no Firefox or WebKit path documented, so cross-browser testing is not what this library is for. If your test matrix includes Safari, rod is the wrong tool and no amount of low-level access changes that.

Finally, the auto-download behaviour that makes the first run pleasant is also a supply-chain and reproducibility question. In a locked-down CI image you will want to control which browser binary is used instead of letting the launcher decide, and the README does not spell out a policy for that.

Rod compared with Chromedp and Playwright

The README itself links a comparison of rod and Chromedp examples under lib/examples/compare-chromedp, which tells you the maintainers consider the two adjacent. Both are Go libraries that talk to Chrome over DevTools Protocol, so the difference is not the transport. It is the ergonomics: rod layers a chained context, automatic waiting and helpers such as WaitStable and HijackRequests over the protocol, and treats those helpers as replaceable examples rather than as the only way in. Chromedp exposes the protocol more directly and leaves more of the waiting logic to you. If you want to see the difference in code rather than in prose, that comparison folder is the honest place to look.

Playwright is the other common point of reference, and the difference is structural rather than stylistic. Playwright is a multi-language project with its own browser management and a cross-browser story, while rod is a Go library bound to DevTools Protocol and to Chrome. Choosing Playwright usually means choosing Node or Python for the automation layer; choosing rod usually means the automation lives in the same Go binary as the rest of your service. Neither is a better default. They optimise for different constraints.

Licence, maintenance and the cost of upgrading

Rod is MIT licensed, which permits commercial and closed-source use with the usual requirement to keep the copyright and permission notice. That is the licence text, not legal advice; if your organisation has a policy on dependency licences, run it through that process. The dependencies listed in go.mod carry their own licences, and the module graph is small, which keeps that review short.

On maintenance, the facts are narrow. The repository is not archived. The last push was on 2026-08-11, and the most recent release listed is v0.116.2 from 2024-07-12. The README states that CI enforces 100 percent test coverage, which is a claim about the project's own pipeline rather than a guarantee about the code you write on top of it. Because no v1 has been tagged, the practical upgrade cost is the cost of reading a diff between two v0.x tags and re-running your own scripts. Keep the browser version pinned alongside the library version; a Chrome update can change behaviour that no Go dependency bump will warn you about.

Editorial conclusion

Adopt go-rod/rod if your automation or scraping code is already Go and you want CDP-level control without writing WebDriver plumbing; skip it if your team lives in Python or Node and needs a large ecosystem of plugins, or if you need a browser other than Chrome or Chromium. Before committing, run a small script against the exact Chrome build you deploy, check that the browser launcher finds or downloads a matching binary in your CI image, and confirm the behaviour of the helpers you depend on, since the README points to unit tests and issues rather than a complete reference for every method. The last push to the repository was on 2026-08-11, and the newest release listed is v0.116.2 from 2024-07-12, so treat the release cadence and the push activity as two different signals.

Frequently asked questions

How do I install go-rod/rod in a Go project?

Add it with the standard Go module command, go get github.com/go-rod/rod@latest. The module declares go 1.21 in go.mod, so your toolchain needs to be at least that version.

Does go-rod/rod download Chrome for me?

The README states that rod automatically finds or downloads the browser through its launcher package, and the first example uses launcher.New().MustLaunch() to obtain a control URL. In a locked-down CI image you may want to control which binary is used instead.

What is the difference between go-rod/rod and Chromedp?

Both are Go libraries built on Chrome DevTools Protocol. Rod adds a chained context, auto-waiting and helpers such as WaitStable and HijackRequests, and the README links a direct comparison of examples under lib/examples/compare-chromedp.

Can go-rod/rod drive Firefox or Safari?

The README describes rod as a Chrome DevTools Protocol driver and does not document Firefox or WebKit support. For a cross-browser test matrix, rod is not the right tool.

Official sources

  1. go-rod/rod on GitHub
  2. License: MIT
  3. Project website
  4. README
  5. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/go-rod-rod.svg)](https://hysenlabs.com/projects/go-rod-rod)