Useful walkthrough. One sharpening: pair go mod graph with go mod why <module>. The graph shows you the edges, why tells you which of your imports actually pulls a module in, which is what you need when deciding what to cut. Also worth noting for readers: since Go 1.17 module graph pruning, the graph is shallower than it used to be. And a "cycle" in require directives is a version-selection quirk. True import cycles are still rejected by the compiler.