# Pkg.go.dev has a new look!
12:00 10 Nov 2020

Julie Qiu

##

Since launching pkg.go.dev, we’ve received a lot of great feedback on
design and usability.
In particular, it was clear that the way information was organized confused
users when navigating the site.

Today we’re excited to share a redesigned pkg.go.dev,
which we hope will be clearer and more helpful.
This blog post presents the highlights. For details,
see [Go issue 41585](https://golang.org/issue/41585).

## Consistent landing page for all paths

The main change is that the pkg.go.dev/\<path> page has been reorganized
around the idea of a path.
A path represents a directory in a particular version of a module.
Now, regardless of what’s in that directory,
every path page will have the same layout,
with the goal of making the experience consistently useful and predictable.

<div class="image">
<img src="pkgsite-redesign/path.png" width="800" alt="Landing page for cloud.google.com/go/storage" style="border: 1px solid black;">
</div>

The path page will display the README at that path if there is one.
Previously, the overview tab only showed the README if present at the module root.
This is one of many changes we’re making to place the most important information up front.

## Documentation navigation

The documentation section now displays an index along with a sidenav.
This gives the ability to see the full package API,
while having context as they are navigating the documentation section.
There is also a new Jump To input box in the left sidenav,
to search for identifiers.


<div class="image">
<img src="pkgsite-redesign/nav.png" width="800" alt="Jump To feature navigating net/http" style="border: 1px solid black;">
</div>

See [Go issue 41587](https://golang.org/issue/41587) for details on changes in the documentation section.

## Metadata on main page

The top bar on each page now shows additional metadata,
such as each package’s “imports” and “imported by” counts.
Banners also show information about the latest minor and major versions of a module.
See [Go issue 41588](https://golang.org/issue/41588) for details.

<div class="image">
<img src="pkgsite-redesign/meta.png" width="800" alt="Header metadata for github.com/russross/blackfriday" style="border: 1px solid black;">
</div>

## Video Walkthrough

Last week at [Google Open Source Live](https://opensourcelive.withgoogle.com/events/go),
we presented a walkthrough of the new site experience in our talk,
[Level Up: Go Package Discovery and Editor Tooling](https://www.youtube.com/watch?v=n7ayE29b7QA&feature=emb_logo).

.iframe https://www.youtube.com/embed/n7ayE29b7QA 400 650

## Feedback

We’re excited to share this updated design with you.
As always, please let us know what you think via the “Share Feedback”
and “Report an Issue” links at the bottom of every page of the site.

And if you’re interested in contributing to this project, pkg.go.dev is open source! Check out the
[contribution guidelines](https://go.googlesource.com/pkgsite/+/refs/heads/master/CONTRIBUTING.md)
to find out more.

