# 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" height="513" 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" height="530" 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" height="145" 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.

