Repository: rclone/rclone
Pull request #6380 (2022-08-14 09:59:20)

Spelling
#### What is the purpose of this change?

Spelling fixes

#### Was the change discussed in an issue or in the forum before?


#### Checklist

- [x] I have read the [contribution guidelines](https://github.com/rclone/rclone/blob/master/CONTRIBUTING.md#submitting-a-new-feature-or-bug-fix).
- [ ] I have added tests for all changes in this PR if appropriate. -- check-spelling could catch things like this...
- [ ] I have added documentation for the changes if appropriate.
- [ ] All commit messages are in [house style](https://github.com/rclone/rclone/blob/master/CONTRIBUTING.md#commit-messages). -- I'll wait until the general changes are deemed acceptable before adjusting to match
- [ ] I'm done, this Pull Request is ready for review :-)


jsoref: @albertony: are you ok w/ the changes as is? If so, I can squash and write a proper commit message.

And yes, I'm more than happy to make a PR for the workflow. (Also happy to chat/demo it if that's helpful.)
albertony: 👍 But lets wait to see what @ncw has to say.
albertony: Is this PR result of running your tool only, or did you do some manual corrections as well?

Integration with golangci-lint would be nice, since we already use this to run a suite of "code quality" checks. Have you considered that?

I see there is an alternative called "misspell" which is in fact supported with golangci-lint. I just tried it real quick: Enabled it and ran it without any additional config. It found 34 errors, all in .go files. According to docs, by default it only checks comments in .go files, and must be configured to check entire source files for it to detect errors in strings. But the golangci-lint integration is always checking entire source ("Treat Go source files as a plain text by misspell: it allows detecting issues in strings, variable names, etc.", [ref](https://github.com/golangci/golangci-lint/blob/master/CHANGELOG.md#june-2019)). Strings are way more important than comments, at least in rclone, to get all the help texts correct, which are also used for generated documentation. And also the user documentation .md files are important. It would be easy for us to enable misspell, and it would be helpful enough, although quite limited results. Also; latest commit in the github repo is from 2018 so probably not much hope for improvements..
jsoref: The tool more or less only flags, it doesn't correct. But I believe that everything here was based on its output.

If you want the tool to only look at certain files, you can use `excludes.txt` and `only.txt` to tailor which files it looks at. (Note that this PR doesn't include the tool at all, it's purely)

I'm looking into generating SARIF output.

albertony: I think this is good.

> If so, I can squash and write a proper commit message.

If you do that, I will merge it. :)

Patch:
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index f299a4691..6f8ea2afa 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -77,7 +77,7 @@ Make sure you
   * Add [documentation](#writing-documentation) for a new feature.
   * [Commit your changes](#committing-your-changes) using the [message guideline](#commit-messages).
 
-When you are done with that push your changes to Github:
+When you are done with that push your changes to GitHub:
 
     git push -u origin my-new-feature
 
@@ -88,7 +88,7 @@ Your changes will then get reviewed and you might get asked to fix some stuff. I
 
 You may sometimes be asked to [base your changes on the latest master](#basing-your-changes-on-the-latest-master) or [squash your commits](#squashing-your-commits).
 
-## Using Git and Github ##
+## Using Git and GitHub ##
 
 ### Committing your changes ###
 
diff --git a/backend/alias/alias.go b/backend/alias/alias.go
index 33ba5d664..92dda17bf 100644
--- a/backend/alias/alias.go
+++ b/backend/alias/alias.go
@@ -1,3 +1,4 @@
+// Package alias implements a virtual provider to rename existing remotes.
 package alias
 
 import (
diff --git a/backend/all/all.go b/backend/all/all.go
index dc17911e4..5dae4d37d 100644
--- a/backend/all/all.go
+++ b/backend/all/all.go
@@ -1,3 +1,4 @@
+// Package all imports all the backends
 package all
 
 import (
diff --git a/backend/azureblob/azureblob.go b/backend/azureblob/azureblob.go
index edb863070..0db359222 100644
--- a/backend/azureblob/azureblob.go
+++ b/backend/azureblob/azureblob.go
@@ -1,8 +1,7 @@
-// Package azureblob provides an interface to the Microsoft Azure blob object storage system
-
 //go:build !plan9 && !solaris && !js
 // +build !plan9,!solaris,!js
 
+// Package azureblob provides an interface to the Microsoft Azure blob object storage system
 package azureblob
 
 import (
diff --git a/backend/b2/api/types.go b/backend/b2/api/types.go
index e139dc8c1..4d981d950 100644
--- a/backend/b2/api/types.go
+++ b/backend/b2/api/types.go
@@ -1,3 +1,4 @@
+// Package api provides types used by the Backblaze B2 API.
 package api
 
 import (
@@ -238,7 +239,7 @@ type GetFileInfoRequest struct {
 // If the original source of the file being uploaded has a last
 // modified time concept, Backblaze recommends using
 // src_last_modified_millis as the name, and a string holding the base
-// 10 number number of milliseconds since midnight, January 1, 1970
+// 10 number of milliseconds since midnight, January 1, 1970
 // UTC. This fits in a 64 bit integer such as the type "long" in the
 // programming language Java. It is intended to be compatible with
 // Java's time long. For example, it can be passed directly into the
diff --git a/backend/b2/b2.go b/backend/b2/b2.go
index 6fd77b6a0..52794d802 100644
--- a/backend/b2/b2.go
+++ b/backend/b2/b2.go
@@ -1,4 +1,4 @@
-// Package b2 provides an interface to the Backblaze B2 object storage system
+// Package b2 provides an interface to the Backblaze B2 object storage system.
 package b2
 
 // FIXME should we remove sha1 checks from here as rclone now supports
diff --git a/backend/box/api/types.go b/backend/box/api/types.go
index d3549f6aa..6ff87761c 100644
--- a/backend/box/api/types.go
+++ b/backend/box/api/types.go
@@ -14,7 +14,7 @@ const (
 	timeFormat = `"` + time.RFC3339 + `"`
 )
 
-// Time represents represents date and time information for the
+// Time represents date and time information for the
 // box API, by using RFC3339
 type Time time.Time
 
diff --git a/backend/box/box.go b/backend/box/box.go
index 93b2cd0cc..a6a33efdb 100644
--- a/backend/box/box.go
+++ b/backend/box/box.go
@@ -266,7 +266,7 @@ type Fs struct {
 	root         string                // the path we are working on
 	opt          Options               // parsed options
 	features     *fs.Features          // optional features
-	srv          *rest.Client          // the connection to the one drive server
+	srv          *rest.Client          // the connection to the server
 	dirCache     *dircache.DirCache    // Map of directory path to directory id
 	pacer        *fs.Pacer             // pacer for API calls
 	tokenRenewer *oauthutil.Renew      // renew the token on expiry
diff --git a/backend/cache/cache.go b/backend/cache/cache.go
index 1c75aea4a..5c4e5dc87 100644
--- a/backend/cache/cache.go
+++ b/backend/cache/cache.go
@@ -1,6 +1,7 @@
 //go:build !plan9 && !js
 // +build !plan9,!js
 
+// Package cache implements a virtual provider to cache existing remotes.
 package cache
 
 import (
diff --git a/backend/chunker/chunker.go b/backend/chunker/chunker.go
index 4ed8ec9e8..17da9393c 100644
--- a/backend/chunker/chunker.go
+++ b/backend/chunker/chunker.go
@@ -64,7 +64,7 @@ import (
 // length of 13 decimals it makes a 7-digit base-36 number.
 //
 // When transactions is set to the norename style, data chunks will
-// keep their temporary chunk names (with the transacion identifier
+// keep their temporary chunk names (with the transaction identifier
 // suffix). To distinguish them from temporary chunks, the txn field
 // of the metadata file is set to match the transaction identifier of
 // the data chunks.
@@ -1079,7 +1079,7 @@ func (o *Object) readMetadata(ctx context.Context) error {
 
 // readXactID returns the transaction ID stored in the passed metadata object
 func (o *Object) readXactID(ctx context.Context) (xactID string, err error) {
-	// if xactID has already been read and cahced return it now
+	// if xactID has already been read and cached return it now
 	if o.xIDCached {
 		return o.xactID, nil
 	}
diff --git a/backend/combine/combine.go b/backend/combine/combine.go
index dab80a82b..34644a968 100644
--- a/backend/combine/combine.go
+++ b/backend/combine/combine.go
@@ -1,4 +1,4 @@
-// Package combine implents a backend to combine multipe remotes in a directory tree
+// Package combine implents a backend to combine multiple remotes in a directory tree
 package combine
 
 /*
diff --git a/backend/compress/compress.go b/backend/compress/compress.go
index b53e725b8..2ae192eb9 100644
--- a/backend/compress/compress.go
+++ b/backend/compress/compress.go
@@ -90,7 +90,7 @@ Generally -1 (default, equivalent to 5) is recommended.
 Levels 1 to 9 increase compression at the cost of speed. Going past 6 
 generally offers very little return.
 
-Level -2 uses Huffmann encoding only. Only use if you know what you
+Level -2 uses Huffman encoding only. Only use if you know what you
 are doing.
 Level 0 turns off compression.`,
 			Default:  sgzip.DefaultCompression,
@@ -130,7 +130,7 @@ type Fs struct {
 	features *fs.Features // optional features
 }
 
-// NewFs contstructs an Fs from the path, container:path
+// NewFs constructs an Fs from the path, container:path
 func NewFs(ctx context.Context, name, rpath string, m configmap.Mapper) (fs.Fs, error) {
 	// Parse config into Options struct
 	opt := new(Options)
@@ -451,7 +451,7 @@ func (f *Fs) rcat(ctx context.Context, dstFileName string, in io.ReadCloser, mod
 		return f.Fs.Put(ctx, bytes.NewBuffer(buf[:n]), src, options...)
 	}
 
-	// Need to include what we allready read
+	// Need to include what we already read
 	in = &ReadCloserWrapper{
 		Reader: io.MultiReader(bytes.NewReader(buf), in),
 		Closer: in,
@@ -731,7 +731,7 @@ func (f *Fs) PutStream(ctx context.Context, in io.Reader, src fs.ObjectInfo, opt
 	}
 
 	// If our new object is compressed we have to rename it with the correct size.
-	// Uncompressed objects don't store the size in the name so we they'll allready have the correct name.
+	// Uncompressed objects don't store the size in the name so we they'll already have the correct name.
 	if compressible {
 		wrapObj, err := operations.Move(ctx, f.Fs, nil, f.dataName(src.Remote(), newObj.size, compressible), newObj.Object)
 		if err != nil {
@@ -742,7 +742,7 @@ func (f *Fs) PutStream(ctx context.Context, in io.Reader, src fs.ObjectInfo, opt
 	return newObj, nil
 }
 
-// Temporarely disabled. There might be a way to implement this correctly but with the current handling metadata duplicate objects
+// Temporarily disabled. There might be a way to implement this correctly but with the current handling metadata duplicate objects
 // will break stuff. Right no I can't think of a way to make this work.
 
 // PutUnchecked uploads the object
diff --git a/backend/crypt/crypt.go b/backend/crypt/crypt.go
index bae2c9799..85972298e 100644
--- a/backend/crypt/crypt.go
+++ b/backend/crypt/crypt.go
@@ -125,7 +125,7 @@ names, or for debugging purposes.`,
 
 This option could help with shortening the encrypted filename. The 
 suitable option would depend on the way your remote count the filename
-length and if it's case sensitve.`,
+length and if it's case sensitive.`,
 			Default: "base32",
 			Examples: []fs.OptionExample{
 				{
diff --git a/backend/drive/drive.go b/backend/drive/drive.go
index b4f310eaf..30c165b61 100644
--- a/backend/drive/drive.go
+++ b/backend/drive/drive.go
@@ -3305,7 +3305,7 @@ drives found and a combined drive.
     upstreams = "My Drive=My Drive:" "Test Drive=Test Drive:"
 
 Adding this to the rclone config file will cause those team drives to
-be accessible with the aliases shown. Any illegal charactes will be
+be accessible with the aliases shown. Any illegal characters will be
 substituted with "_" and duplicate names will have numbers suffixed.
 It will also add a remote called AllDrives which shows all the shared
 drives combined into one directory tree.
diff --git a/backend/dropbox/batcher.go b/backend/dropbox/batcher.go
index 874bb93d9..82a4b5524 100644
--- a/backend/dropbox/batcher.go
+++ b/backend/dropbox/batcher.go
@@ -309,7 +309,7 @@ func (b *batcher) Shutdown() {
 	}
 	b.shutOnce.Do(func() {
 		atexit.Unregister(b.atexit)
-		fs.Infof(b.f, "Commiting uploads - please wait...")
+		fs.Infof(b.f, "Committing uploads - please wait...")
 		// show that batcher is shutting down
 		close(b.closed)
 		// quit the commitLoop by sending a quitRequest message
diff --git a/backend/dropbox/dropbox.go b/backend/dropbox/dropbox.go
index 42686394d..740bd76e3 100644
--- a/backend/dropbox/dropbox.go
+++ b/backend/dropbox/dropbox.go
@@ -268,7 +268,7 @@ default based on the batch_mode in use.
 			Advanced: true,
 		}, {
 			Name:     "batch_commit_timeout",
-			Help:     `Max time to wait for a batch to finish comitting`,
+			Help:     `Max time to wait for a batch to finish committing`,
 			Default:  fs.Duration(10 * time.Minute),
 			Advanced: true,
 		}, {
@@ -1669,7 +1669,7 @@ func (o *Object) uploadChunked(ctx context.Context, in0 io.Reader, commitInfo *f
 						correctOffset := uErr.EndpointError.IncorrectOffset.CorrectOffset
 						delta := int64(correctOffset) - int64(cursor.Offset)
 						skip += delta
-						what := fmt.Sprintf("incorrect offset error receved: sent %d, need %d, skip %d", cursor.Offset, correctOffset, skip)
+						what := fmt.Sprintf("incorrect offset error received: sent %d, need %d, skip %d", cursor.Offset, correctOffset, skip)
 						if skip < 0 {
 							return false, fmt.Errorf("can't seek backwards to correct offset: %s", what)
 						} else if skip == chunkSize {
diff --git a/backend/fichier/fichier.go b/backend/fichier/fichier.go
index 454e391ff..e6c053051 100644
--- a/backend/fichier/fichier.go
+++ b/backend/fichier/fichier.go
@@ -1,3 +1,4 @@
+// Package fichier provides an interface to the 1Fichier storage system.
 package fichier
 
 import (
diff --git a/backend/fichier/structs.go b/backend/fichier/structs.go
index 89673f7f3..02e50a632 100644
--- a/backend/fichier/structs.go
+++ b/backend/fichier/structs.go
@@ -84,7 +84,7 @@ type CopyFileResponse struct {
 	URLs    []FileCopy `json:"urls"`
 }
 
-// FileCopy is used in the the CopyFileResponse
+// FileCopy is used in the CopyFileResponse
 type FileCopy struct {
 	FromURL string `json:"from_url"`
 	ToURL   string `json:"to_url"`
diff --git a/backend/filefabric/api/types.go b/backend/filefabric/api/types.go
index 926ad82a6..9f4fb5984 100644
--- a/backend/filefabric/api/types.go
+++ b/backend/filefabric/api/types.go
@@ -19,7 +19,7 @@ const (
 	timeFormatJSON = `"` + timeFormatParameters + `"`
 )
 
-// Time represents represents date and time information for the
+// Time represents date and time information for the
 // filefabric API
 type Time time.Time
 
@@ -95,7 +95,7 @@ type Status struct {
 	// Warning string `json:"warning"` // obsolete
 }
 
-// Status statisfies the error interface
+// Status satisfies the error interface
 func (e *Status) Error() string {
 	return fmt.Sprintf("%s (%s)", e.Message, e.Code)
 }
diff --git a/backend/filefabric/filefabric.go b/backend/filefabric/filefabric.go
index fa3e7a178..7442814c5 100644
--- a/backend/filefabric/filefabric.go
+++ b/backend/filefabric/filefabric.go
@@ -150,7 +150,7 @@ type Fs struct {
 	opt             Options            // parsed options
 	features        *fs.Features       // optional features
 	m               configmap.Mapper   // to save config
-	srv             *rest.Client       // the connection to the one drive server
+	srv             *rest.Client       // the connection to the server
 	dirCache        *dircache.DirCache // Map of directory path to directory id
 	pacer           *fs.Pacer          // pacer for API calls
 	tokenMu         sync.Mutex         // hold when reading the token
@@ -843,7 +843,7 @@ func (f *Fs) Purge(ctx context.Context, dir string) error {
 	return f.purgeCheck(ctx, dir, false)
 }
 
-// Wait for the the background task to complete if necessary
+// Wait for the background task to complete if necessary
 func (f *Fs) waitForBackgroundTask(ctx context.Context, taskID api.String) (err error) {
 	if taskID == "" || taskID == "0" {
 		// No task to wait for
diff --git a/backend/googlecloudstorage/googlecloudstorage.go b/backend/googlecloudstorage/googlecloudstorage.go
index 5ce96e672..dc233bfcd 100644
--- a/backend/googlecloudstorage/googlecloudstorage.go
+++ b/backend/googlecloudstorage/googlecloudstorage.go
@@ -311,7 +311,7 @@ rclone does if you know the bucket exists already.
 			Help: `If set this will decompress gzip encoded objects.
 
 It is possible to upload objects to GCS with "Content-Encoding: gzip"
-set. Normally rclone will download these files files as compressed objects.
+set. Normally rclone will download these files as compressed objects.
 
 If this flag is set then rclone will decompress these files with
 "Content-Encoding: gzip" as they are received. This means that rclone
diff --git a/backend/googlephotos/api/types.go b/backend/googlephotos/api/types.go
index d26cfc714..9b7aa79f6 100644
--- a/backend/googlephotos/api/types.go
+++ b/backend/googlephotos/api/types.go
@@ -1,3 +1,4 @@
+// Package api provides types used by the Google Photos API.
 package api
 
 import (
diff --git a/backend/googlephotos/googlephotos.go b/backend/googlephotos/googlephotos.go
index 238d6c783..c743ddec4 100644
--- a/backend/googlephotos/googlephotos.go
+++ b/backend/googlephotos/googlephotos.go
@@ -178,7 +178,7 @@ type Fs struct {
 	opt        Options                // parsed options
 	features   *fs.Features           // optional features
 	unAuth     *rest.Client           // unauthenticated http client
-	srv        *rest.Client           // the connection to the one drive server
+	srv        *rest.Client           // the connection to the server
 	ts         *oauthutil.TokenSource // token source for oauth2
 	pacer      *fs.Pacer              // To pace the API calls
 	startTime  time.Time              // time Fs was started - used for datestamps
diff --git a/backend/hdfs/hdfs.go b/backend/hdfs/hdfs.go
index 234344ece..c07c0d7e2 100644
--- a/backend/hdfs/hdfs.go
+++ b/backend/hdfs/hdfs.go
@@ -1,6 +1,7 @@
 //go:build !plan9
 // +build !plan9
 
+// Package hdfs provides an interface to the HDFS storage system.
 package hdfs
 
 import (
diff --git a/backend/hidrive/hidrive.go b/backend/hidrive/hidrive.go
index b0f56844a..5004b8191 100644
--- a/backend/hidrive/hidrive.go
+++ b/backend/hidrive/hidrive.go
@@ -330,7 +330,7 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, e
 		f.tokenRenewer = oauthutil.NewRenew(f.String(), ts, transaction)
 	}
 
-	// Do not allow the root-prefix to be non-existent nor a directory,
+	// Do not allow the root-prefix to be nonexistent nor a directory,
 	// but it can be empty.
 	if f.opt.RootPrefix != "" {
 		item, err := f.fetchMetadataForPath(ctx, f.opt.RootPrefix, api.HiDriveObjectNoMetadataFields)
@@ -623,7 +623,7 @@ func (f *Fs) Purge(ctx context.Context, dir string) error {
 // should be retried after the parent-directories of the destination have been created.
 // If so, it will create the parent-directories.
 //
-// If any errors arrise while finding the source or
+// If any errors arise while finding the source or
 // creating the parent-directory those will be returned.
 // Otherwise returns the originalError.
 func (f *Fs) shouldRetryAndCreateParents(ctx context.Context, destinationPath string, sourcePath string, originalError error) (bool, error) {
@@ -961,7 +961,7 @@ func (o *Object) Update(ctx context.Context, in io.Reader, src fs.ObjectInfo, op
 		} else {
 			_, _, err = o.fs.uploadFileChunked(ctx, resolvedPath, in, modTime, int(o.fs.opt.UploadChunkSize), o.fs.opt.UploadConcurrency)
 		}
-		// Try to check if object was updated, eitherway.
+		// Try to check if object was updated, either way.
 		// Metadata should be updated even if the upload fails.
 		info, metaErr = o.fs.fetchMetadataForPath(ctx, resolvedPath, api.HiDriveObjectWithMetadataFields)
 	} else {
diff --git a/backend/hidrive/hidrivehash/internal/internal.go b/backend/hidrive/hidrivehash/internal/internal.go
index f1596a9e6..261233c0d 100644
--- a/backend/hidrive/hidrivehash/internal/internal.go
+++ b/backend/hidrive/hidrivehash/internal/internal.go
@@ -1,3 +1,4 @@
+// Package internal provides utilities for HiDrive.
 package internal
 
 import (
diff --git a/backend/internetarchive/internetarchive.go b/backend/internetarchive/internetarchive.go
index b3d4a55cb..4c1dc7f82 100644
--- a/backend/internetarchive/internetarchive.go
+++ b/backend/internetarchive/internetarchive.go
@@ -227,7 +227,7 @@ type Object struct {
 	rawData json.RawMessage
 }
 
-// IAFile reprensents a subset of object in MetadataResponse.Files
+// IAFile represents a subset of object in MetadataResponse.Files
 type IAFile struct {
 	Name string `json:"name"`
 	// Source     string `json:"source"`
@@ -243,7 +243,7 @@ type IAFile struct {
 	rawData json.RawMessage
 }
 
-// MetadataResponse reprensents subset of the JSON object returned by (frontend)/metadata/
+// MetadataResponse represents subset of the JSON object returned by (frontend)/metadata/
 type MetadataResponse struct {
 	Files    []IAFile `json:"files"`
 	ItemSize int64    `json:"item_size"`
@@ -1273,7 +1273,7 @@ func trimPathPrefix(s, prefix string, enc encoder.MultiEncoder) string {
 	return enc.ToStandardPath(strings.TrimPrefix(s, prefix+"/"))
 }
 
-// mimicks urllib.parse.quote() on Python; exclude / from url.PathEscape
+// mimics urllib.parse.quote() on Python; exclude / from url.PathEscape
 func quotePath(s string) string {
 	seg := strings.Split(s, "/")
 	newValues := []string{}
diff --git a/backend/jottacloud/api/types.go b/backend/jottacloud/api/types.go
index 91e0c3095..8daf0f7ad 100644
--- a/backend/jottacloud/api/types.go
+++ b/backend/jottacloud/api/types.go
@@ -1,3 +1,4 @@
+// Package api provides types used by the Jottacloud API.
 package api
 
 import (
diff --git a/backend/jottacloud/jottacloud.go b/backend/jottacloud/jottacloud.go
index 0044c7f79..45e8489ea 100644
--- a/backend/jottacloud/jottacloud.go
+++ b/backend/jottacloud/jottacloud.go
@@ -1,3 +1,4 @@
+// Package jottacloud provides an interface to the Jottacloud storage system.
 package jottacloud
 
 import (
@@ -1417,7 +1418,7 @@ func (f *Fs) Copy(ctx context.Context, src fs.Object, remote string) (fs.Object,
 	}
 	info, err := f.copyOrMove(ctx, "cp", srcObj.filePath(), remote)
 
-	// if destination was a trashed file then after a successfull copy the copied file is still in trash (bug in api?)
+	// if destination was a trashed file then after a successful copy the copied file is still in trash (bug in api?)
 	if err == nil && bool(info.Deleted) && !f.opt.TrashedOnly && info.State == "COMPLETED" {
 		fs.Debugf(src, "Server-side copied to trashed destination, restoring")
 		info, err = f.createOrUpdate(ctx, remote, srcObj.modTime, srcObj.size, srcObj.md5)
diff --git a/backend/koofr/koofr.go b/backend/koofr/koofr.go
index f893b898b..54513f0c1 100644
--- a/backend/koofr/koofr.go
+++ b/backend/koofr/koofr.go
@@ -1,3 +1,4 @@
+// Package koofr provides an interface to the Koofr storage system.
 package koofr
 
 import (
@@ -667,7 +668,7 @@ func (f *Fs) PublicLink(ctx context.Context, remote string, expire fs.Duration,
 	//
 	// https://app.koofr.net/content/links/39a6cc01-3b23-477a-8059-c0fb3b0f15de/files/get?path=%2F
 	//
-	// I am not sure about meaning of "path" parameter; in my expriments
+	// I am not sure about meaning of "path" parameter; in my experiments
 	// it is always "%2F", and omitting it or putting any other value
 	// results in 404.
 	//
diff --git a/backend/local/setbtime.go b/backend/local/setbtime.go
index 20a914bf2..5d2c462ee 100644
--- a/backend/local/setbtime.go
+++ b/backend/local/setbtime.go
@@ -9,7 +9,7 @@ import (
 
 const haveSetBTime = false
 
-// setBTime changes the the birth time of the file passed in
+// setBTime changes the birth time of the file passed in
 func setBTime(name string, btime time.Time) error {
 	// Does nothing
 	return nil
diff --git a/backend/local/setbtime_windows.go b/backend/local/setbtime_windows.go
index 2b8fd98d5..adb9efa3a 100644
--- a/backend/local/setbtime_windows.go
+++ b/backend/local/setbtime_windows.go
@@ -11,7 +11,7 @@ import (
 
 const haveSetBTime = true
 
-// setBTime sets the the birth time of the file passed in
+// setBTime sets the birth time of the file passed in
 func setBTime(name string, btime time.Time) (err error) {
 	h, err := syscall.Open(name, os.O_RDWR, 0755)
 	if err != nil {
diff --git a/backend/mailru/api/m1.go b/backend/mailru/api/m1.go
index 039b1e104..c9d3e9c9f 100644
--- a/backend/mailru/api/m1.go
+++ b/backend/mailru/api/m1.go
@@ -1,3 +1,4 @@
+// Package api provides types used by the Mail.ru API.
 package api
 
 import (
diff --git a/backend/mailru/mailru.go b/backend/mailru/mailru.go
index bd527e8e2..95507996c 100644
--- a/backend/mailru/mailru.go
+++ b/backend/mailru/mailru.go
@@ -1,3 +1,4 @@
+// Package mailru provides an interface to the Mail.ru Cloud storage system.
 package mailru
 
 import (
diff --git a/backend/mega/mega.go b/backend/mega/mega.go
index bb038506b..92176c795 100644
--- a/backend/mega/mega.go
+++ b/backend/mega/mega.go
@@ -347,7 +347,7 @@ func (f *Fs) mkdir(ctx context.Context, rootNode *mega.Node, dir string) (node *
 		}
 	}
 	if err != nil {
-		return nil, fmt.Errorf("internal error: mkdir called with non-existent root node: %w", err)
+		return nil, fmt.Errorf("internal error: mkdir called with nonexistent root node: %w", err)
 	}
 	// i is number of directories to create (may be 0)
 	// node is directory to create them from
@@ -387,7 +387,7 @@ func (f *Fs) findRoot(ctx context.Context, create bool) (*mega.Node, error) {
 		return f._rootNode, nil
 	}
 
-	// Check for pre-existing root
+	// Check for preexisting root
 	absRoot := f.srv.FS.GetRoot()
 	node, err := f.findDir(absRoot, f.root)
 	//log.Printf("findRoot findDir %p %v", node, err)
diff --git a/backend/netstorage/netstorage.go b/backend/netstorage/netstorage.go
index 313679e27..31adcbe7a 100755
--- a/backend/netstorage/netstorage.go
+++ b/backend/netstorage/netstorage.go
@@ -118,7 +118,7 @@ type Fs struct {
 	filetype         string            // dir, file or symlink
 	dirscreated      map[string]bool   // if implicit dir has been created already
 	dirscreatedMutex sync.Mutex        // mutex to protect dirscreated
-	statcache        map[string][]File // cache successfull stat requests
+	statcache        map[string][]File // cache successful stat requests
 	statcacheMutex   sync.RWMutex      // RWMutex to protect statcache
 }
 
@@ -424,7 +424,7 @@ func (f *Fs) getFileName(file *File) string {
 func (f *Fs) List(ctx context.Context, dir string) (entries fs.DirEntries, err error) {
 	if f.filetype == "" {
 		// This happens in two scenarios.
-		// 1. NewFs is done on a non-existent object, then later rclone attempts to List/ListR this NewFs.
+		// 1. NewFs is done on a nonexistent object, then later rclone attempts to List/ListR this NewFs.
 		// 2. List/ListR is called from the context of test_all and not the regular rclone binary.
 		err := f.initFs(ctx, dir)
 		if err != nil {
@@ -488,7 +488,7 @@ func (f *Fs) List(ctx context.Context, dir string) (entries fs.DirEntries, err e
 func (f *Fs) ListR(ctx context.Context, dir string, callback fs.ListRCallback) (err error) {
 	if f.filetype == "" {
 		// This happens in two scenarios.
-		// 1. NewFs is done on a non-existent object, then later rclone attempts to List/ListR this NewFs.
+		// 1. NewFs is done on a nonexistent object, then later rclone attempts to List/ListR this NewFs.
 		// 2. List/ListR is called from the context of test_all and not the regular rclone binary.
 		err := f.initFs(ctx, dir)
 		if err != nil {
diff --git a/backend/onedrive/api/types.go b/backend/onedrive/api/types.go
index 12dca863b..ca5626858 100644
--- a/backend/onedrive/api/types.go
+++ b/backend/onedrive/api/types.go
@@ -1,5 +1,4 @@
-// Types passed and returned to and from the API
-
+// Package api provides types used by the OneDrive API.
 package api
 
 import (
@@ -14,7 +13,7 @@ const (
 	PackageTypeOneNote = "oneNote"
 )
 
-// Error is returned from one drive when things go wrong
+// Error is returned from OneDrive when things go wrong
 type Error struct {
 	ErrorInfo struct {
 		Code       string `json:"code"`
@@ -71,7 +70,7 @@ type Drive struct {
 	Quota     Quota       `json:"quota"`
 }
 
-// Timestamp represents represents date and time information for the
+// Timestamp represents date and time information for the
 // OneDrive API, by using ISO 8601 and is always in UTC time.
 type Timestamp time.Time
 
diff --git a/backend/onedrive/onedrive.go b/backend/onedrive/onedrive.go
index c0674c9c5..29afd3976 100644
--- a/backend/onedrive/onedrive.go
+++ b/backend/onedrive/onedrive.go
@@ -600,14 +600,14 @@ type Options struct {
 	Enc                     encoder.MultiEncoder `config:"encoding"`
 }
 
-// Fs represents a remote one drive
+// Fs represents a remote OneDrive
 type Fs struct {
 	name         string             // name of this remote
 	root         string             // the path we are working on
 	opt          Options            // parsed options
 	ci           *fs.ConfigInfo     // global config
 	features     *fs.Features       // optional features
-	srv          *rest.Client       // the connection to the one drive server
+	srv          *rest.Client       // the connection to the OneDrive server
 	dirCache     *dircache.DirCache // Map of directory path to directory id
 	pacer        *fs.Pacer          // pacer for API calls
 	tokenRenewer *oauthutil.Renew   // renew the token on expiry
@@ -615,7 +615,7 @@ type Fs struct {
 	driveType    string             // https://developer.microsoft.com/en-us/graph/docs/api-reference/v1.0/resources/drive
 }
 
-// Object describes a one drive object
+// Object describes a OneDrive object
 //
 // Will definitely have info but maybe not meta
 type Object struct {
@@ -645,7 +645,7 @@ func (f *Fs) Root() string {
 
 // String converts this Fs to a string
 func (f *Fs) String() string {
-	return fmt.Sprintf("One drive root '%s'", f.root)
+	return fmt.Sprintf("OneDrive root '%s'", f.root)
 }
 
 // Features returns the optional features of this Fs
@@ -653,7 +653,7 @@ func (f *Fs) Features() *fs.Features {
 	return f.features
 }
 
-// parsePath parses a one drive 'url'
+// parsePath parses a OneDrive 'url'
 func parsePath(path string) (root string) {
 	root = strings.Trim(path, "/")
 	return
diff --git a/backend/opendrive/opendrive.go b/backend/opendrive/opendrive.go
index 35e1871c3..037372e13 100644
--- a/backend/opendrive/opendrive.go
+++ b/backend/opendrive/opendrive.go
@@ -1,3 +1,4 @@
+// Package opendrive provides an interface to the OpenDrive storage system.
 package opendrive
 
 import (
diff --git a/backend/pcloud/api/types.go b/backend/pcloud/api/types.go
index 5ae2b6b6b..c1b5dc217 100644
--- a/backend/pcloud/api/types.go
+++ b/backend/pcloud/api/types.go
@@ -13,7 +13,7 @@ const (
 	timeFormat = `"` + time.RFC1123Z + `"`
 )
 
-// Time represents represents date and time information for the
+// Time represents date and time information for the
 // pcloud API, by using RFC1123Z
 type Time time.Time
 
diff --git a/backend/putio/putio.go b/backend/putio/putio.go
index 766a99b77..692364166 100644
--- a/backend/putio/putio.go
+++ b/backend/putio/putio.go
@@ -1,3 +1,4 @@
+// Package putio provides an interface to the put.io storage system.
 package putio
 
 import (
diff --git a/backend/qingstor/qingstor.go b/backend/qingstor/qingstor.go
index cd4880358..a3d0bd639 100644
--- a/backend/qingstor/qingstor.go
+++ b/backend/qingstor/qingstor.go
@@ -1,9 +1,8 @@
-// Package qingstor provides an interface to QingStor object storage
-// Home: https://www.qingcloud.com/
-
 //go:build !plan9 && !js
 // +build !plan9,!js
 
+// Package qingstor provides an interface to QingStor object storage
+// Home: https://www.qingcloud.com/
 package qingstor
 
 import (
diff --git a/backend/s3/s3.go b/backend/s3/s3.go
index 1f86b8592..7b3a81a29 100644
--- a/backend/s3/s3.go
+++ b/backend/s3/s3.go
@@ -2009,7 +2009,7 @@ See [the time option docs](/docs/#time-option) for valid formats.
 			Help: `If set this will decompress gzip encoded objects.
 
 It is possible to upload objects to S3 with "Content-Encoding: gzip"
-set. Normally rclone will download these files files as compressed objects.
+set. Normally rclone will download these files as compressed objects.
 
 If this flag is set then rclone will decompress these files with
 "Content-Encoding: gzip" as they are received. This means that rclone
@@ -5199,7 +5199,7 @@ func (o *Object) Update(ctx context.Context, in io.Reader, src fs.ObjectInfo, op
 		var head s3.HeadObjectOutput
 		//structs.SetFrom(&head, &req)
 		setFrom_s3HeadObjectOutput_s3PutObjectInput(&head, &req)
-		head.ETag = &md5sumHex // doesn't matter quotes are misssing
+		head.ETag = &md5sumHex // doesn't matter quotes are missing
 		head.ContentLength = &size
 		// If we have done a single part PUT request then we can read these
 		if gotEtag != "" {
diff --git a/backend/seafile/api/types.go b/backend/seafile/api/types.go
index 9fb95c0cf..d6224709f 100644
--- a/backend/seafile/api/types.go
+++ b/backend/seafile/api/types.go
@@ -1,3 +1,4 @@
+// Package api provides types used by the Seafile API.
 package api
 
 // Some api objects are duplicated with only small differences,
diff --git a/backend/seafile/seafile.go b/backend/seafile/seafile.go
index 00457676c..d1c2abdbc 100644
--- a/backend/seafile/seafile.go
+++ b/backend/seafile/seafile.go
@@ -1,3 +1,4 @@
+// Package seafile provides an interface to the Seafile storage system.
 package seafile
 
 import (
@@ -136,7 +137,7 @@ type Fs struct {
 	features            *fs.Features // optional features
 	endpoint            *url.URL     // URL of the host
 	endpointURL         string       // endpoint as a string
-	srv                 *rest.Client // the connection to the one drive server
+	srv                 *rest.Client // the connection to the server
 	pacer               *fs.Pacer    // pacer for API calls
 	authMu              sync.Mutex   // Mutex to protect library decryption
 	createDirMutex      sync.Mutex   // Protect creation of directories
diff --git a/backend/sftp/sftp.go b/backend/sftp/sftp.go
index 6a4259542..1c160996c 100644
--- a/backend/sftp/sftp.go
+++ b/backend/sftp/sftp.go
@@ -1,8 +1,7 @@
-// Package sftp provides a filesystem interface using github.com/pkg/sftp
-
 //go:build !plan9
 // +build !plan9
 
+// Package sftp provides a filesystem interface using github.com/pkg/sftp
 package sftp
 
 import (
diff --git a/backend/sia/api/types.go b/backend/sia/api/types.go
index ebec8961e..eb046ab22 100644
--- a/backend/sia/api/types.go
+++ b/backend/sia/api/types.go
@@ -1,3 +1,4 @@
+// Package api provides types used by the Sia API.
 package api
 
 import (
diff --git a/backend/sia/sia.go b/backend/sia/sia.go
index 2a8235638..b86faae61 100644
--- a/backend/sia/sia.go
+++ b/backend/sia/sia.go
@@ -1,3 +1,4 @@
+// Package sia provides an interface to the Sia storage system.
 package sia
 
 import (
diff --git a/backend/sugarsync/sugarsync.go b/backend/sugarsync/sugarsync.go
index 7078de975..1676c0949 100644
--- a/backend/sugarsync/sugarsync.go
+++ b/backend/sugarsync/sugarsync.go
@@ -200,7 +200,7 @@ type Fs struct {
 	root       string             // the path we are working on
 	opt        Options            // parsed options
 	features   *fs.Features       // optional features
-	srv        *rest.Client       // the connection to the one drive server
+	srv        *rest.Client       // the connection to the server
 	dirCache   *dircache.DirCache // Map of directory path to directory id
 	pacer      *fs.Pacer          // pacer for API calls
 	m          configmap.Mapper   // config file access
diff --git a/backend/union/policy/all.go b/backend/union/policy/all.go
index 1de36da2a..fe43654ff 100644
--- a/backend/union/policy/all.go
+++ b/backend/union/policy/all.go
@@ -1,3 +1,4 @@
+// Package policy provides utilities for the union implementation.
 package policy
 
 import (
diff --git a/backend/union/union.go b/backend/union/union.go
index 8bcbf66c9..7e10f06b8 100644
--- a/backend/union/union.go
+++ b/backend/union/union.go
@@ -1,3 +1,4 @@
+// Package union implements a virtual provider to join existing remotes.
 package union
 
 import (
diff --git a/backend/union/upstream/upstream.go b/backend/union/upstream/upstream.go
index 7b9f44fd2..119eb7bb0 100644
--- a/backend/union/upstream/upstream.go
+++ b/backend/union/upstream/upstream.go
@@ -1,3 +1,4 @@
+// Package upstream provides utility functionality to union.
 package upstream
 
 import (
diff --git a/backend/uptobox/api/types.go b/backend/uptobox/api/types.go
index 872a5cff0..8cf197754 100644
--- a/backend/uptobox/api/types.go
+++ b/backend/uptobox/api/types.go
@@ -1,3 +1,4 @@
+// Package api provides types used by the Uptobox API.
 package api
 
 import "fmt"
@@ -79,7 +80,7 @@ type UploadInfo struct {
 	} `json:"data"`
 }
 
-// UploadResponse is the respnse to a successful upload
+// UploadResponse is the response to a successful upload
 type UploadResponse struct {
 	Files []struct {
 		Name      string `json:"name"`
diff --git a/backend/uptobox/uptobox.go b/backend/uptobox/uptobox.go
index 6bc5bd823..d403341bf 100644
--- a/backend/uptobox/uptobox.go
+++ b/backend/uptobox/uptobox.go
@@ -1,3 +1,4 @@
+// Package uptobox provides an interface to the Uptobox storage system.
 package uptobox
 
 import (
@@ -162,7 +163,7 @@ func (f *Fs) splitPathFull(pth string) (string, string) {
 	return "//" + fullPath[:i], fullPath[i+1:]
 }
 
-// splitPath is modified splitPath version that doesn't include the seperator
+// splitPath is modified splitPath version that doesn't include the separator
 // in the base path
 func (f *Fs) splitPath(pth string) (string, string) {
 	// chop of any leading or trailing '/'
@@ -478,7 +479,7 @@ func (f *Fs) putUnchecked(ctx context.Context, in io.Reader, remote string, size
 	} else if size == 0 {
 		return nil, fs.ErrorCantUploadEmptyFiles
 	}
-	// yes it does take take 4 requests if we're uploading to root and 6+ if we're uploading to any subdir :(
+	// yes it does take 4 requests if we're uploading to root and 6+ if we're uploading to any subdir :(
 
 	// create upload request
 	opts := rest.Opts{
@@ -756,7 +757,7 @@ func (f *Fs) DirMove(ctx context.Context, src fs.Fs, srcRemote, dstRemote string
 	if err != nil {
 		return fmt.Errorf("dirmove: source not found: %w", err)
 	}
-	// check if the destination allready exists
+	// check if the destination already exists
 	dstPath := f.dirPath(dstRemote)
 	_, err = f.readMetaDataForPath(ctx, dstPath, &api.MetadataRequestOptions{Limit: 1})
 	if err == nil {
@@ -781,7 +782,7 @@ func (f *Fs) DirMove(ctx context.Context, src fs.Fs, srcRemote, dstRemote string
 	needMove := srcBase != dstBase
 
 	// if we have to rename we'll have to use a temporary name since
-	// there could allready be a directory with the same name as the src directory
+	// there could already be a directory with the same name as the src directory
 	if needRename {
 		// rename to a temporary name
 		tmpName := "rcloneTemp" + random.String(8)
diff --git a/backend/webdav/webdav.go b/backend/webdav/webdav.go
index ff5595f1b..8a815cef8 100644
--- a/backend/webdav/webdav.go
+++ b/backend/webdav/webdav.go
@@ -148,7 +148,7 @@ type Fs struct {
 	features           *fs.Features  // optional features
 	endpoint           *url.URL      // URL of the host
 	endpointURL        string        // endpoint as a string
-	srv                *rest.Client  // the connection to the one drive server
+	srv                *rest.Client  // the connection to the server
 	pacer              *fs.Pacer     // pacer for API calls
 	precision          time.Duration // mod time precision
 	canStream          bool          // set if can stream
diff --git a/backend/yandex/api/types.go b/backend/yandex/api/types.go
index 78d4c6850..614ced7d3 100644
--- a/backend/yandex/api/types.go
+++ b/backend/yandex/api/types.go
@@ -1,3 +1,4 @@
+// Package api provides types used by the Yandex API.
 package api
 
 import (
diff --git a/backend/yandex/yandex.go b/backend/yandex/yandex.go
index 3d5bf53cc..a643a7771 100644
--- a/backend/yandex/yandex.go
+++ b/backend/yandex/yandex.go
@@ -1,3 +1,4 @@
+// Package yandex provides an interface to the Yandex storage system.
 package yandex
 
 import (
diff --git a/backend/zoho/api/types.go b/backend/zoho/api/types.go
index 43d8644ce..cb8b7bf44 100644
--- a/backend/zoho/api/types.go
+++ b/backend/zoho/api/types.go
@@ -1,3 +1,4 @@
+// Package api provides types used by the Zoho API.
 package api
 
 import (
@@ -5,7 +6,7 @@ import (
 	"time"
 )
 
-// Time represents represents date and time information for Zoho
+// Time represents date and time information for Zoho
 // Zoho uses milliseconds since unix epoch (Java currentTimeMillis)
 type Time time.Time
 
diff --git a/backend/zoho/zoho.go b/backend/zoho/zoho.go
index 167fa03ea..1e7556b03 100644
--- a/backend/zoho/zoho.go
+++ b/backend/zoho/zoho.go
@@ -150,8 +150,8 @@ func init() {
 					return workspace.ID, workspace.Attributes.Name
 				})
 			case "workspace_end":
-				worksspaceID := config.Result
-				m.Set(configRootID, worksspaceID)
+				workspaceID := config.Result
+				m.Set(configRootID, workspaceID)
 				return nil, nil
 			}
 			return nil, fmt.Errorf("unknown state %q", config.State)
@@ -206,7 +206,7 @@ type Fs struct {
 	root     string             // the path we are working on
 	opt      Options            // parsed options
 	features *fs.Features       // optional features
-	srv      *rest.Client       // the connection to the one drive server
+	srv      *rest.Client       // the connection to the server
 	dirCache *dircache.DirCache // Map of directory path to directory id
 	pacer    *fs.Pacer          // pacer for API calls
 }
@@ -1264,7 +1264,7 @@ func (o *Object) Update(ctx context.Context, in io.Reader, src fs.ObjectInfo, op
 		return err
 	}
 
-	// upload was successfull, need to delete old object before rename
+	// upload was successful, need to delete old object before rename
 	if err = o.Remove(ctx); err != nil {
 		return fmt.Errorf("failed to remove old object: %w", err)
 	}
diff --git a/cmd/about/about.go b/cmd/about/about.go
index 46c1d6f66..967744b59 100644
--- a/cmd/about/about.go
+++ b/cmd/about/about.go
@@ -1,3 +1,4 @@
+// Package about provides the about command.
 package about
 
 import (
diff --git a/cmd/authorize/authorize.go b/cmd/authorize/authorize.go
index d3114c750..87dda815b 100644
--- a/cmd/authorize/authorize.go
+++ b/cmd/authorize/authorize.go
@@ -1,3 +1,4 @@
+// Package authorize provides the authorize command.
 package authorize
 
 import (
diff --git a/cmd/backend/backend.go b/cmd/backend/backend.go
index 85b7e44bd..3199f8a5d 100644
--- a/cmd/backend/backend.go
+++ b/cmd/backend/backend.go
@@ -1,3 +1,4 @@
+// Package backend provides the backend command.
 package backend
 
 import (
diff --git a/cmd/bisync/deltas.go b/cmd/bisync/deltas.go
index ee66980c4..d1dee1a1d 100644
--- a/cmd/bisync/deltas.go
+++ b/cmd/bisync/deltas.go
@@ -290,7 +290,7 @@ func (b *bisyncRun) applyDeltas(ctx context.Context, ds1, ds2 *deltaSet) (change
 	return
 }
 
-// exccessDeletes checks whether number of deletes is within allowed range
+// excessDeletes checks whether number of deletes is within allowed range
 func (ds *deltaSet) excessDeletes() bool {
 	maxDelete := ds.opt.MaxDelete
 	maxRatio := float64(maxDelete) / 100.0
diff --git a/cmd/bisync/help.go b/cmd/bisync/help.go
index 74f588489..14e6f7866 100644
--- a/cmd/bisync/help.go
+++ b/cmd/bisync/help.go
@@ -15,7 +15,7 @@ func makeHelp(help string) string {
 	return replacer.Replace(help)
 }
 
-var shortHelp = `Perform bidirectonal synchronization between two paths.`
+var shortHelp = `Perform bidirectional synchronization between two paths.`
 
 var rcHelp = makeHelp(`This takes the following parameters
 
diff --git a/cmd/cachestats/cachestats.go b/cmd/cachestats/cachestats.go
index 16a1398d3..7638db8f4 100644
--- a/cmd/cachestats/cachestats.go
+++ b/cmd/cachestats/cachestats.go
@@ -1,6 +1,7 @@
 //go:build !plan9 && !js
 // +build !plan9,!js
 
+// Package cachestats provides the cachestats command.
 package cachestats
 
 import (
diff --git a/cmd/cat/cat.go b/cmd/cat/cat.go
index 4f90f0478..227ddb1f3 100644
--- a/cmd/cat/cat.go
+++ b/cmd/cat/cat.go
@@ -1,3 +1,4 @@
+// Package cat provides the cat command.
 package cat
 
 import (
diff --git a/cmd/check/check.go b/cmd/check/check.go
index 886c36a58..3c126e176 100644
--- a/cmd/check/check.go
+++ b/cmd/check/check.go
@@ -1,3 +1,4 @@
+// Package check provides the check command.
 package check
 
 import (
diff --git a/cmd/checksum/checksum.go b/cmd/checksum/checksum.go
index 1083e3800..c25aa143d 100644
--- a/cmd/checksum/checksum.go
+++ b/cmd/checksum/checksum.go
@@ -1,3 +1,4 @@
+// Package checksum provides the checksum command.
 package checksum
 
 import (
diff --git a/cmd/cleanup/cleanup.go b/cmd/cleanup/cleanup.go
index 549e3b420..e54577466 100644
--- a/cmd/cleanup/cleanup.go
+++ b/cmd/cleanup/cleanup.go
@@ -1,3 +1,4 @@
+// Package cleanup provides the cleanup command.
 package cleanup
 
 import (
diff --git a/cmd/cmount/mount.go b/cmd/cmount/mount.go
index 873adcaf0..c9893f2f7 100644
--- a/cmd/cmount/mount.go
+++ b/cmd/cmount/mount.go
@@ -1,11 +1,10 @@
-// Package cmount implements a FUSE mounting system for rclone remotes.
-//
-// This uses the cgo based cgofuse library
-
 //go:build cmount && ((linux && cgo) || (darwin && cgo) || (freebsd && cgo) || windows)
 // +build cmount
 // +build linux,cgo darwin,cgo freebsd,cgo windows
 
+// Package cmount implements a FUSE mounting system for rclone remotes.
+//
+// This uses the cgo based cgofuse library
 package cmount
 
 import (
diff --git a/cmd/cmount/mount_brew.go b/cmd/cmount/mount_brew.go
index ec1b97881..964c0b234 100644
--- a/cmd/cmount/mount_brew.go
+++ b/cmd/cmount/mount_brew.go
@@ -1,9 +1,10 @@
-// Build for macos with the brew tag to handle the absence
-// of fuse and print an appropriate error message
-
 //go:build brew && darwin
 // +build brew,darwin
 
+// Package cmount implements a FUSE mounting system for rclone remotes.
+//
+// Build for macos with the brew tag to handle the absence
+// of fuse and print an appropriate error message
 package cmount
 
 import (
diff --git a/cmd/cmount/mount_unsupported.go b/cmd/cmount/mount_unsupported.go
index 3b6761beb..375cec456 100644
--- a/cmd/cmount/mount_unsupported.go
+++ b/cmd/cmount/mount_unsupported.go
@@ -1,10 +1,11 @@
-// Build for cmount for unsupported platforms to stop go complaining
-// about "no buildable Go source files "
-
 //go:build !((linux && cgo && cmount) || (darwin && cgo && cmount) || (freebsd && cgo && cmount) || (windows && cmount))
 // +build !linux !cgo !cmount
 // +build !darwin !cgo !cmount
 // +build !freebsd !cgo !cmount
 // +build !windows !cmount
 
+// Package cmount implements a FUSE mounting system for rclone remotes.
+//
+// Build for cmount for unsupported platforms to stop go complaining
+// about "no buildable Go source files".
 package cmount
diff --git a/cmd/cmount/mountpoint_windows.go b/cmd/cmount/mountpoint_windows.go
index 5cd0aa1d0..a1e511409 100644
--- a/cmd/cmount/mountpoint_windows.go
+++ b/cmd/cmount/mountpoint_windows.go
@@ -80,7 +80,7 @@ func handleDefaultMountpath() (string, error) {
 func handleNetworkShareMountpath(mountpath string, opt *mountlib.Options) (string, error) {
 	// Assuming mount path is a valid network share path (UNC format, "\\Server\Share").
 	// Always mount as network drive, regardless of the NetworkMode option.
-	// Find an unused drive letter to use as mountpoint, the the supplied path can
+	// Find an unused drive letter to use as mountpoint, the supplied path can
 	// be used as volume prefix (network share path) instead of mountpoint.
 	if !opt.NetworkMode {
 		fs.Debugf(nil, "Forcing --network-mode because mountpoint path is network share UNC format")
diff --git a/cmd/config/config.go b/cmd/config/config.go
index ed5700327..66b2a1c6d 100644
--- a/cmd/config/config.go
+++ b/cmd/config/config.go
@@ -1,3 +1,4 @@
+// Package config provides the config command.
 package config
 
 import (
@@ -139,7 +140,7 @@ are 100% certain you are already passing obscured passwords then use
 |rclone config password| command.
 
 The flag |--non-interactive| is for use by applications that wish to
-configure rclone themeselves, rather than using rclone's text based
+configure rclone themselves, rather than using rclone's text based
 configuration questions. If this flag is set, and rclone needs to ask
 the user a question, a JSON blob will be returned with the question in
 it.
diff --git a/cmd/copy/copy.go b/cmd/copy/copy.go
index 33175e1f7..c6e42a70e 100644
--- a/cmd/copy/copy.go
+++ b/cmd/copy/copy.go
@@ -1,3 +1,4 @@
+// Package copy provides the copy command.
 package copy
 
 import (
diff --git a/cmd/copyto/copyto.go b/cmd/copyto/copyto.go
index 02d2af21e..85b54fa60 100644
--- a/cmd/copyto/copyto.go
+++ b/cmd/copyto/copyto.go
@@ -1,3 +1,4 @@
+// Package copyto provides the copyto command.
 package copyto
 
 import (
diff --git a/cmd/copyurl/copyurl.go b/cmd/copyurl/copyurl.go
index fc3cf38cc..a3c079b11 100644
--- a/cmd/copyurl/copyurl.go
+++ b/cmd/copyurl/copyurl.go
@@ -1,3 +1,4 @@
+// Package copyurl provides the copyurl command.
 package copyurl
 
 import (
diff --git a/cmd/cryptcheck/cryptcheck.go b/cmd/cryptcheck/cryptcheck.go
index ec0597da7..aab50ef06 100644
--- a/cmd/cryptcheck/cryptcheck.go
+++ b/cmd/cryptcheck/cryptcheck.go
@@ -1,3 +1,4 @@
+// Package cryptcheck provides the cryptcheck command.
 package cryptcheck
 
 import (
diff --git a/cmd/cryptdecode/cryptdecode.go b/cmd/cryptdecode/cryptdecode.go
index d36c70ca4..9c6178e9e 100644
--- a/cmd/cryptdecode/cryptdecode.go
+++ b/cmd/cryptdecode/cryptdecode.go
@@ -1,3 +1,4 @@
+// Package cryptdecode provides the cryptdecode command.
 package cryptdecode
 
 import (
diff --git a/cmd/dedupe/dedupe.go b/cmd/dedupe/dedupe.go
index b43c4c279..94a136ca2 100644
--- a/cmd/dedupe/dedupe.go
+++ b/cmd/dedupe/dedupe.go
@@ -1,3 +1,4 @@
+// Package dedupe provides the dedupe command.
 package dedupe
 
 import (
diff --git a/cmd/delete/delete.go b/cmd/delete/delete.go
index a432dbe56..047c320af 100644
--- a/cmd/delete/delete.go
+++ b/cmd/delete/delete.go
@@ -1,3 +1,4 @@
+// Package delete provides the delete command.
 package delete
 
 import (
diff --git a/cmd/deletefile/deletefile.go b/cmd/deletefile/deletefile.go
index 88750c75e..9d222771d 100644
--- a/cmd/deletefile/deletefile.go
+++ b/cmd/deletefile/deletefile.go
@@ -1,3 +1,4 @@
+// Package deletefile provides the deletefile command.
 package deletefile
 
 import (
diff --git a/cmd/genautocomplete/genautocomplete.go b/cmd/genautocomplete/genautocomplete.go
index 597113577..9502bbbc9 100644
--- a/cmd/genautocomplete/genautocomplete.go
+++ b/cmd/genautocomplete/genautocomplete.go
@@ -1,3 +1,4 @@
+// Package genautocomplete provides the genautocomplete command.
 package genautocomplete
 
 import (
diff --git a/cmd/gendocs/gendocs.go b/cmd/gendocs/gendocs.go
index 7a7ef3f46..e80b8a924 100644
--- a/cmd/gendocs/gendocs.go
+++ b/cmd/gendocs/gendocs.go
@@ -1,3 +1,4 @@
+// Package gendocs provides the gendocs command.
 package gendocs
 
 import (
diff --git a/cmd/hashsum/hashsum.go b/cmd/hashsum/hashsum.go
index 64dfde4ce..4a1993716 100644
--- a/cmd/hashsum/hashsum.go
+++ b/cmd/hashsum/hashsum.go
@@ -1,3 +1,4 @@
+// Package hashsum provides the hashsum command.
 package hashsum
 
 import (
@@ -98,7 +99,7 @@ For the MD5 and SHA1 algorithms there are also dedicated commands,
 
 This command can also hash data received on standard input (stdin),
 by not passing a remote:path, or by passing a hyphen as remote:path
-when there is data to read (if not, the hypen will be treated literaly,
+when there is data to read (if not, the hyphen will be treated literally,
 as a relative path).
 
 Run without a hash to see the list of all supported hashes, e.g.
diff --git a/cmd/help.go b/cmd/help.go
index 0d1295d34..ecc34b63e 100644
--- a/cmd/help.go
+++ b/cmd/help.go
@@ -343,7 +343,7 @@ func showBackend(name string) {
 			defaultValue := opt.GetValue()
 			// Default value and Required are related: Required means option must
 			// have a value, but if there is a default then a value does not have
-			// to be explicitely set and then Required makes no difference.
+			// to be explicitly set and then Required makes no difference.
 			if defaultValue != "" {
 				fmt.Printf("- Default:     %s\n", quoteString(defaultValue))
 			} else {
diff --git a/cmd/link/link.go b/cmd/link/link.go
index 3367178c5..a0356cd33 100644
--- a/cmd/link/link.go
+++ b/cmd/link/link.go
@@ -1,3 +1,4 @@
+// Package link provides the link command.
 package link
 
 import (
diff --git a/cmd/listremotes/listremotes.go b/cmd/listremotes/listremotes.go
index 908979a4f..bf7b697f2 100644
--- a/cmd/listremotes/listremotes.go
+++ b/cmd/listremotes/listremotes.go
@@ -1,3 +1,4 @@
+// Package ls provides the ls command.
 package ls
 
 import (
diff --git a/cmd/ls/ls.go b/cmd/ls/ls.go
index e08a2c21d..334b12f8e 100644
--- a/cmd/ls/ls.go
+++ b/cmd/ls/ls.go
@@ -1,3 +1,4 @@
+// Package ls provides the ls command.
 package ls
 
 import (
diff --git a/cmd/ls/lshelp/lshelp.go b/cmd/ls/lshelp/lshelp.go
index f4a678be2..3a98fff14 100644
--- a/cmd/ls/lshelp/lshelp.go
+++ b/cmd/ls/lshelp/lshelp.go
@@ -1,3 +1,4 @@
+// Package lshelp provides common help for list commands.
 package lshelp
 
 import (
@@ -25,7 +26,7 @@ Note that |ls| and |lsl| recurse by default - use |--max-depth 1| to stop the re
 
 The other list commands |lsd|,|lsf|,|lsjson| do not recurse by default - use |-R| to make them recurse.
 
-Listing a non-existent directory will produce an error except for
+Listing a nonexistent directory will produce an error except for
 remotes which can't have empty directories (e.g. s3, swift, or gcs -
 the bucket-based remotes).
 `, "|", "`")
diff --git a/cmd/lsd/lsd.go b/cmd/lsd/lsd.go
index bd723daad..8d79266fb 100644
--- a/cmd/lsd/lsd.go
+++ b/cmd/lsd/lsd.go
@@ -1,3 +1,4 @@
+// Package lsd provides the lsd command.
 package lsd
 
 import (
diff --git a/cmd/lsf/lsf.go b/cmd/lsf/lsf.go
index e370f930c..2651e90e7 100644
--- a/cmd/lsf/lsf.go
+++ b/cmd/lsf/lsf.go
@@ -1,3 +1,4 @@
+// Package lsf provides the lsf command.
 package lsf
 
 import (
diff --git a/cmd/lsjson/lsjson.go b/cmd/lsjson/lsjson.go
index 8e4e343da..a17ade327 100644
--- a/cmd/lsjson/lsjson.go
+++ b/cmd/lsjson/lsjson.go
@@ -1,3 +1,4 @@
+// Package lsjson provides the lsjson command.
 package lsjson
 
 import (
@@ -83,7 +84,7 @@ If ` + "`--files-only`" + ` is not specified directories in addition to the file
 will be returned.
 
 If ` + "`--metadata`" + ` is set then an additional Metadata key will be returned.
-This will have metdata in rclone standard format as a JSON object.
+This will have metadata in rclone standard format as a JSON object.
 
 if ` + "`--stat`" + ` is set then a single JSON blob will be returned about the
 item pointed to. This will return an error if the item isn't found.
diff --git a/cmd/lsl/lsl.go b/cmd/lsl/lsl.go
index f2f40f7a7..f8108c5f7 100644
--- a/cmd/lsl/lsl.go
+++ b/cmd/lsl/lsl.go
@@ -1,3 +1,4 @@
+// Package lsl provides the lsl command.
 package lsl
 
 import (
diff --git a/cmd/md5sum/md5sum.go b/cmd/md5sum/md5sum.go
index 665ae4467..91bc66e44 100644
--- a/cmd/md5sum/md5sum.go
+++ b/cmd/md5sum/md5sum.go
@@ -1,3 +1,4 @@
+// Package md5sum provides the md5sum command.
 package md5sum
 
 import (
@@ -34,7 +35,7 @@ to running ` + "`rclone hashsum MD5 remote:path`" + `.
 
 This command can also hash data received on standard input (stdin),
 by not passing a remote:path, or by passing a hyphen as remote:path
-when there is data to read (if not, the hypen will be treated literaly,
+when there is data to read (if not, the hyphen will be treated literally,
 as a relative path).
 `,
 	RunE: func(command *cobra.Command, args []string) error {
diff --git a/cmd/mkdir/mkdir.go b/cmd/mkdir/mkdir.go
index 33fa33667..3c99180fe 100644
--- a/cmd/mkdir/mkdir.go
+++ b/cmd/mkdir/mkdir.go
@@ -1,3 +1,4 @@
+// Package mkdir provides the mkdir command.
 package mkdir
 
 import (
diff --git a/cmd/mount/mount.go b/cmd/mount/mount.go
index db0f23bd3..765419df4 100644
--- a/cmd/mount/mount.go
+++ b/cmd/mount/mount.go
@@ -1,8 +1,7 @@
-// Package mount implements a FUSE mounting system for rclone remotes.
-
 //go:build linux || freebsd
 // +build linux freebsd
 
+// Package mount implements a FUSE mounting system for rclone remotes.
 package mount
 
 import (
diff --git a/cmd/mount/mount_unsupported.go b/cmd/mount/mount_unsupported.go
index cc5ccb628..84f8656dc 100644
--- a/cmd/mount/mount_unsupported.go
+++ b/cmd/mount/mount_unsupported.go
@@ -1,9 +1,10 @@
-// Build for mount for unsupported platforms to stop go complaining
-// about "no buildable Go source files "
-
-// Invert the build constraint: linux freebsd
-
 //go:build !linux && !freebsd
 // +build !linux,!freebsd
 
+// Package mount implements a FUSE mounting system for rclone remotes.
+//
+// Build for mount for unsupported platforms to stop go complaining
+// about "no buildable Go source files".
+//
+// Invert the build constraint: linux freebsd
 package mount
diff --git a/cmd/mount2/mount.go b/cmd/mount2/mount.go
index d33f44533..cbb890500 100644
--- a/cmd/mount2/mount.go
+++ b/cmd/mount2/mount.go
@@ -1,8 +1,7 @@
-// Package mount implements a FUSE mounting system for rclone remotes.
-
 //go:build linux || (darwin && amd64)
 // +build linux darwin,amd64
 
+// Package mount2 implements a FUSE mounting system for rclone remotes.
 package mount2
 
 import (
diff --git a/cmd/mount2/mount_unsupported.go b/cmd/mount2/mount_unsupported.go
index 975a25b3e..649eab0a2 100644
--- a/cmd/mount2/mount_unsupported.go
+++ b/cmd/mount2/mount_unsupported.go
@@ -1,8 +1,9 @@
-// Build for mount for unsupported platforms to stop go complaining
-// about "no buildable Go source files "
-
 //go:build !linux && (!darwin || !amd64)
 // +build !linux
 // +build !darwin !amd64
 
+// Package mount2 implements a FUSE mounting system for rclone remotes.
+//
+// Build for mount for unsupported platforms to stop go complaining
+// about "no buildable Go source files".
 package mount2
diff --git a/cmd/mountlib/help.go b/cmd/mountlib/help.go
index 10aea7b9f..7516157e8 100644
--- a/cmd/mountlib/help.go
+++ b/cmd/mountlib/help.go
@@ -88,7 +88,7 @@ and experience unexpected program errors, freezes or other issues, consider moun
 as a network drive instead.
 
 When mounting as a fixed disk drive you can either mount to an unused drive letter,
-or to a path representing a **non-existent** subdirectory of an **existing** parent
+or to a path representing a **nonexistent** subdirectory of an **existing** parent
 directory or drive. Using the special value |*| will tell rclone to
 automatically assign the next available drive letter, starting with Z: and moving backward.
 Examples:
@@ -119,7 +119,7 @@ the mapped drive, shown in Windows Explorer etc, while the complete
 |\\server\share| will be reported as the remote UNC path by
 |net use| etc, just like a normal network drive mapping.
 
-If you specify a full network share UNC path with |--volname|, this will implicitely
+If you specify a full network share UNC path with |--volname|, this will implicitly
 set the |--network-mode| option, so the following two examples have same result:
 
     rclone @ remote:path/to/files X: --network-mode
@@ -128,7 +128,7 @@ set the |--network-mode| option, so the following two examples have same result:
 You may also specify the network share UNC path as the mountpoint itself. Then rclone
 will automatically assign a drive letter, same as with |*| and use that as
 mountpoint, and instead use the UNC path specified as the volume name, as if it were
-specified with the |--volname| option. This will also implicitely set
+specified with the |--volname| option. This will also implicitly set
 the |--network-mode| option. This means the following two examples have same result:
 
     rclone @ remote:path/to/files \\cloud\remote
@@ -164,7 +164,7 @@ The permissions on each entry will be set according to [options](#options)
 
 The default permissions corresponds to |--file-perms 0666 --dir-perms 0777|,
 i.e. read and write permissions to everyone. This means you will not be able
-to start any programs from the the mount. To be able to do that you must add
+to start any programs from the mount. To be able to do that you must add
 execute permissions, e.g. |--file-perms 0777 --dir-perms 0777| to add it
 to everyone. If the program needs to write files, chances are you will have
 to enable [VFS File Caching](#vfs-file-caching) as well (see also [limitations](#limitations)).
diff --git a/cmd/mountlib/mount.go b/cmd/mountlib/mount.go
index b0119dc12..907f16efd 100644
--- a/cmd/mountlib/mount.go
+++ b/cmd/mountlib/mount.go
@@ -1,3 +1,4 @@
+// Package mountlib provides the mount command.
 package mountlib
 
 import (
@@ -237,7 +238,7 @@ func (m *MountPoint) Mount() (daemon *os.Process, err error) {
 		return nil, err
 	}
 
-	if err = m.CheckAllowings(); err != nil {
+	if err = m.CheckAllowed(); err != nil {
 		return nil, err
 	}
 	m.SetVolumeName(m.MountOpt.VolumeName)
diff --git a/cmd/mountlib/utils.go b/cmd/mountlib/utils.go
index 1ec4d786a..099e3a767 100644
--- a/cmd/mountlib/utils.go
+++ b/cmd/mountlib/utils.go
@@ -62,9 +62,9 @@ func absPath(path string) string {
 	return path
 }
 
-// CheckAllowings informs about ignored flags on Windows. If not on Windows
+// CheckAllowed informs about ignored flags on Windows. If not on Windows
 // and not --allow-non-empty flag is used, verify that mountpoint is empty.
-func (m *MountPoint) CheckAllowings() error {
+func (m *MountPoint) CheckAllowed() error {
 	opt := &m.MountOpt
 	if runtime.GOOS == "windows" {
 		if opt.AllowNonEmpty {
diff --git a/cmd/move/move.go b/cmd/move/move.go
index 3d7f87167..65c8adc23 100644
--- a/cmd/move/move.go
+++ b/cmd/move/move.go
@@ -1,3 +1,4 @@
+// Package move provides the move command.
 package move
 
 import (
diff --git a/cmd/moveto/moveto.go b/cmd/moveto/moveto.go
index 8d81bb3d3..698d7ee18 100644
--- a/cmd/moveto/moveto.go
+++ b/cmd/moveto/moveto.go
@@ -1,3 +1,4 @@
+// Package moveto provides the moveto command.
 package moveto
 
 import (
diff --git a/cmd/ncdu/ncdu.go b/cmd/ncdu/ncdu.go
index abb748b6d..d56f69bfc 100644
--- a/cmd/ncdu/ncdu.go
+++ b/cmd/ncdu/ncdu.go
@@ -1,8 +1,7 @@
-// Package ncdu implements a text based user interface for exploring a remote
-
 //go:build !plan9 && !js
 // +build !plan9,!js
 
+// Package ncdu implements a text based user interface for exploring a remote
 package ncdu
 
 import (
@@ -49,7 +48,7 @@ press '?' to toggle the help on and off. The supported keys are:
     ` + strings.Join(helpText()[1:], "\n    ") + `
 
 Listed files/directories may be prefixed by a one-character flag,
-some of them combined with a description in brackes at end of line.
+some of them combined with a description in brackets at end of line.
 These flags have the following meaning:
 
     e means this is an empty directory, i.e. contains no files (but
diff --git a/cmd/obscure/obscure.go b/cmd/obscure/obscure.go
index d26f1d72b..08cf8a06a 100644
--- a/cmd/obscure/obscure.go
+++ b/cmd/obscure/obscure.go
@@ -1,3 +1,4 @@
+// Package obscure provides the obscure command.
 package obscure
 
 import (
diff --git a/cmd/purge/purge.go b/cmd/purge/purge.go
index 335615cf9..d41e22cf6 100644
--- a/cmd/purge/purge.go
+++ b/cmd/purge/purge.go
@@ -1,3 +1,4 @@
+// Package purge provides the purge command.
 package purge
 
 import (
diff --git a/cmd/rc/rc.go b/cmd/rc/rc.go
index 53e8697d8..93c2e319e 100644
--- a/cmd/rc/rc.go
+++ b/cmd/rc/rc.go
@@ -1,3 +1,4 @@
+// Package rc provides the rc command.
 package rc
 
 import (
diff --git a/cmd/rcat/rcat.go b/cmd/rcat/rcat.go
index f082fa95d..c7766265d 100644
--- a/cmd/rcat/rcat.go
+++ b/cmd/rcat/rcat.go
@@ -1,3 +1,4 @@
+// Package rcat provides the rcat command.
 package rcat
 
 import (
diff --git a/cmd/rcd/rcd.go b/cmd/rcd/rcd.go
index cc4be57f9..940c300a6 100644
--- a/cmd/rcd/rcd.go
+++ b/cmd/rcd/rcd.go
@@ -1,3 +1,4 @@
+// Package rcd provides the rcd command.
 package rcd
 
 import (
diff --git a/cmd/reveal/reveal.go b/cmd/reveal/reveal.go
index 817dd92dd..e569a26b4 100644
--- a/cmd/reveal/reveal.go
+++ b/cmd/reveal/reveal.go
@@ -1,3 +1,4 @@
+// Package reveal provides the reveal command.
 package reveal
 
 import (
diff --git a/cmd/rmdir/rmdir.go b/cmd/rmdir/rmdir.go
index 9b532ca47..778315be8 100644
--- a/cmd/rmdir/rmdir.go
+++ b/cmd/rmdir/rmdir.go
@@ -1,3 +1,4 @@
+// Package rmdir provides the rmdir command.
 package rmdir
 
 import (
diff --git a/cmd/rmdirs/rmdirs.go b/cmd/rmdirs/rmdirs.go
index 41788c527..11a09ca20 100644
--- a/cmd/rmdirs/rmdirs.go
+++ b/cmd/rmdirs/rmdirs.go
@@ -1,3 +1,4 @@
+// Package rmdir provides the rmdir command.
 package rmdir
 
 import (
diff --git a/cmd/selfupdate/selfupdate.go b/cmd/selfupdate/selfupdate.go
index 5bfd1cb66..ab24290b3 100644
--- a/cmd/selfupdate/selfupdate.go
+++ b/cmd/selfupdate/selfupdate.go
@@ -1,6 +1,7 @@
 //go:build !noselfupdate
 // +build !noselfupdate
 
+// Package selfupdate provides the selfupdate command.
 package selfupdate
 
 import (
diff --git a/cmd/serve/dlna/data/data.go b/cmd/serve/dlna/data/data.go
index 8e142b99f..a5a92880c 100644
--- a/cmd/serve/dlna/data/data.go
+++ b/cmd/serve/dlna/data/data.go
@@ -1,6 +1,7 @@
-//go:generate go run assets_generate.go
+// Package data provides utilities for DLNA server.
 // The "go:generate" directive compiles static assets by running assets_generate.go
-
+//
+//go:generate go run assets_generate.go
 package data
 
 import (
diff --git a/cmd/serve/dlna/dlna.go b/cmd/serve/dlna/dlna.go
index da6a08a19..c36e492d7 100644
--- a/cmd/serve/dlna/dlna.go
+++ b/cmd/serve/dlna/dlna.go
@@ -1,3 +1,4 @@
+// Package dlna provides DLNA server.
 package dlna
 
 import (
diff --git a/cmd/serve/dlna/dlnaflags/dlnaflags.go b/cmd/serve/dlna/dlnaflags/dlnaflags.go
index 06ea27a19..85a1347dc 100644
--- a/cmd/serve/dlna/dlnaflags/dlnaflags.go
+++ b/cmd/serve/dlna/dlnaflags/dlnaflags.go
@@ -1,3 +1,4 @@
+// Package dlnaflags provides utility functionality to DLNA.
 package dlnaflags
 
 import (
diff --git a/cmd/serve/dlna/upnpav/upnpav.go b/cmd/serve/dlna/upnpav/upnpav.go
index 5ac5e17b7..c6dc9dc4f 100644
--- a/cmd/serve/dlna/upnpav/upnpav.go
+++ b/cmd/serve/dlna/upnpav/upnpav.go
@@ -1,3 +1,4 @@
+// Package upnpav provides utilities for DLNA server.
 package upnpav
 
 import (
diff --git a/cmd/serve/docker/unix.go b/cmd/serve/docker/unix.go
index 3c533d454..8bf7b6fbc 100644
--- a/cmd/serve/docker/unix.go
+++ b/cmd/serve/docker/unix.go
@@ -25,7 +25,7 @@ func newUnixListener(path string, gid int) (net.Listener, string, error) {
 		return nil, "", fmt.Errorf("expected only one socket from systemd, got %d", len(fds))
 	}
 
-	// create socket outselves
+	// create socket ourselves
 	if filepath.Ext(path) == "" {
 		path += ".sock"
 	}
diff --git a/cmd/serve/ftp/ftp.go b/cmd/serve/ftp/ftp.go
index 11753e42f..2023ba851 100644
--- a/cmd/serve/ftp/ftp.go
+++ b/cmd/serve/ftp/ftp.go
@@ -1,8 +1,7 @@
-// Package ftp implements an FTP server for rclone
-
 //go:build !plan9
 // +build !plan9
 
+// Package ftp implements an FTP server for rclone
 package ftp
 
 import (
@@ -154,7 +153,7 @@ func newServer(ctx context.Context, f fs.Fs, opt *Options) (*server, error) {
 	}
 	s.useTLS = s.opt.TLSKey != ""
 
-	// Check PassivePorts format since the the server library doesn't!
+	// Check PassivePorts format since the server library doesn't!
 	if !passivePortsRe.MatchString(opt.PassivePorts) {
 		return nil, fmt.Errorf("invalid format for passive ports %q", opt.PassivePorts)
 	}
diff --git a/cmd/serve/http/data/data.go b/cmd/serve/http/data/data.go
index 73f6a1ff2..075acf8b7 100644
--- a/cmd/serve/http/data/data.go
+++ b/cmd/serve/http/data/data.go
@@ -1,6 +1,7 @@
-//go:generate go run assets_generate.go
+// Package data provides common functionality for http servers
 // The "go:generate" directive compiles static assets by running assets_generate.go
-
+//
+//go:generate go run assets_generate.go
 package data
 
 import (
diff --git a/cmd/serve/http/http.go b/cmd/serve/http/http.go
index 8712f8ac8..cdf8afd28 100644
--- a/cmd/serve/http/http.go
+++ b/cmd/serve/http/http.go
@@ -1,3 +1,4 @@
+// Package http provides common functionality for http servers
 package http
 
 import (
diff --git a/cmd/serve/httplib/httpflags/httpflags.go b/cmd/serve/httplib/httpflags/httpflags.go
index 899482b7f..109604f0e 100644
--- a/cmd/serve/httplib/httpflags/httpflags.go
+++ b/cmd/serve/httplib/httpflags/httpflags.go
@@ -1,3 +1,4 @@
+// Package httpflags provides utility functionality to HTTP.
 package httpflags
 
 import (
diff --git a/cmd/serve/serve.go b/cmd/serve/serve.go
index 848cb24bb..f79162c82 100644
--- a/cmd/serve/serve.go
+++ b/cmd/serve/serve.go
@@ -1,3 +1,4 @@
+// Package serve provides the serve command.
 package serve
 
 import (
diff --git a/cmd/serve/sftp/sftp.go b/cmd/serve/sftp/sftp.go
index c77450a5e..46c485d75 100644
--- a/cmd/serve/sftp/sftp.go
+++ b/cmd/serve/sftp/sftp.go
@@ -1,8 +1,7 @@
-// Package sftp implements an SFTP server to serve an rclone VFS
-
 //go:build !plan9
 // +build !plan9
 
+// Package sftp implements an SFTP server to serve an rclone VFS
 package sftp
 
 import (
@@ -49,7 +48,7 @@ func AddFlags(flagSet *pflag.FlagSet, Opt *Options) {
 	flags.StringVarP(flagSet, &Opt.User, "user", "", Opt.User, "User name for authentication")
 	flags.StringVarP(flagSet, &Opt.Pass, "pass", "", Opt.Pass, "Password for authentication")
 	flags.BoolVarP(flagSet, &Opt.NoAuth, "no-auth", "", Opt.NoAuth, "Allow connections with no authentication if set")
-	flags.BoolVarP(flagSet, &Opt.Stdio, "stdio", "", Opt.Stdio, "Run an sftp server on run stdin/stdout")
+	flags.BoolVarP(flagSet, &Opt.Stdio, "stdio", "", Opt.Stdio, "Run an sftp server on stdin/stdout")
 }
 
 func init() {
@@ -62,11 +61,19 @@ func init() {
 var Command = &cobra.Command{
 	Use:   "sftp remote:path",
 	Short: `Serve the remote over SFTP.`,
-	Long: `Run a SFTP server to serve a remote over SFTP. This can be used
-with an SFTP client or you can make a remote of type sftp to use with it.
+	Long: `Run an SFTP server to serve a remote over SFTP. This can be used
+with an SFTP client or you can make a remote of type [sftp](/sftp) to use with it.
 
-You can use the filter flags (e.g. ` + "`--include`, `--exclude`" + `) to control what
-is served.
+You can use the [filter](/filtering) flags (e.g. ` + "`--include`, `--exclude`" + `)
+to control what is served.
+
+The server will respond to a small number of shell commands, mainly
+md5sum, sha1sum and df, which enable it to provide support for checksums
+and the about feature when accessed from an sftp remote.
+
+Note that this server uses fixed 32 KiB packet size, which means you must not
+configure the client to use any other values, e.g. with the
+[chunk_size](/sftp/#sftp-chunk-size) option on an sftp remote.
 
 The server will log errors.  Use ` + "`-v`" + ` to see access logs.
 
@@ -79,11 +86,6 @@ You must provide some means of authentication, either with
 ` + "`--auth-proxy`" + `, or set the ` + "`--no-auth`" + ` flag for no
 authentication when logging in.
 
-Note that this also implements a small number of shell commands so
-that it can provide md5sum/sha1sum/df information for the rclone sftp
-backend.  This means that is can support SHA1SUMs, MD5SUMs and the
-about command when paired with the rclone sftp backend.
-
 If you don't supply a host ` + "`--key`" + ` then rclone will generate rsa, ecdsa
 and ed25519 variants, and cache them for later use in rclone's cache
 directory (see ` + "`rclone help flags cache-dir`" + `) in the "serve-sftp"
diff --git a/cmd/settier/settier.go b/cmd/settier/settier.go
index 6be1c1c6a..8a1d234f0 100644
--- a/cmd/settier/settier.go
+++ b/cmd/settier/settier.go
@@ -1,3 +1,4 @@
+// Package settier provides the settier command.
 package settier
 
 import (
diff --git a/cmd/sha1sum/sha1sum.go b/cmd/sha1sum/sha1sum.go
index 1c3115a8b..053ca0cbb 100644
--- a/cmd/sha1sum/sha1sum.go
+++ b/cmd/sha1sum/sha1sum.go
@@ -1,3 +1,4 @@
+// Package sha1sum provides the sha1sum command.
 package sha1sum
 
 import (
@@ -34,7 +35,7 @@ to running ` + "`rclone hashsum SHA1 remote:path`" + `.
 
 This command can also hash data received on standard input (stdin),
 by not passing a remote:path, or by passing a hyphen as remote:path
-when there is data to read (if not, the hypen will be treated literaly,
+when there is data to read (if not, the hyphen will be treated literally,
 as a relative path).
 
 This command can also hash data received on STDIN, if not passing
diff --git a/cmd/size/size.go b/cmd/size/size.go
index 5ed51c7a6..c084de527 100644
--- a/cmd/size/size.go
+++ b/cmd/size/size.go
@@ -1,3 +1,4 @@
+// Package size provides the size command.
 package size
 
 import (
diff --git a/cmd/sync/sync.go b/cmd/sync/sync.go
index be233cdd9..33a5b0027 100644
--- a/cmd/sync/sync.go
+++ b/cmd/sync/sync.go
@@ -1,3 +1,4 @@
+// Package sync provides the sync command.
 package sync
 
 import (
diff --git a/cmd/touch/touch.go b/cmd/touch/touch.go
index 741c920b3..b0bea31b2 100644
--- a/cmd/touch/touch.go
+++ b/cmd/touch/touch.go
@@ -1,3 +1,4 @@
+// Package touch provides the touch command.
 package touch
 
 import (
@@ -143,12 +144,12 @@ func Touch(ctx context.Context, f fs.Fs, remote string) error {
 				return nil
 			}
 			if notCreateNewFile {
-				fs.Logf(f, "Not touching non-existent file due to --no-create")
+				fs.Logf(f, "Not touching nonexistent file due to --no-create")
 				return nil
 			}
 			if recursive {
 				// For consistency, --recursive never creates new files.
-				fs.Logf(f, "Not touching non-existent file due to --recursive")
+				fs.Logf(f, "Not touching nonexistent file due to --recursive")
 				return nil
 			}
 			if operations.SkipDestructive(ctx, f, "touch (create)") {
diff --git a/cmd/tree/tree.go b/cmd/tree/tree.go
index 2528d9dc2..5705dcec8 100644
--- a/cmd/tree/tree.go
+++ b/cmd/tree/tree.go
@@ -1,3 +1,4 @@
+// Package tree provides the tree command.
 package tree
 
 import (
diff --git a/cmd/version/version.go b/cmd/version/version.go
index 3ec69e135..25a17aa41 100644
--- a/cmd/version/version.go
+++ b/cmd/version/version.go
@@ -1,3 +1,4 @@
+// Package version provides the version command.
 package version
 
 import (
diff --git a/docs/content/authors.md b/docs/content/authors.md
index 853b2f4dd..56d329258 100644
--- a/docs/content/authors.md
+++ b/docs/content/authors.md
@@ -632,3 +632,8 @@ put them back in again.` >}}
   * Jordi Gonzalez Muñoz <jordigonzm@gmail.com>
   * Joram Schrijver <i@joram.io>
   * Mark Trolley <marktrolley@gmail.com>
+  * João Henrique Franco <joaohenrique.franco@gmail.com>
+  * anonion <aman207@users.noreply.github.com>
+  * Ryan Morey <4590343+rmorey@users.noreply.github.com>
+  * Simon Bos <simonbos9@gmail.com>
+  * YFdyh000 <yfdyh000@gmail.com>
\ No newline at end of file
diff --git a/docs/content/bisync.md b/docs/content/bisync.md
index 68393d2a8..78bf06a0b 100644
--- a/docs/content/bisync.md
+++ b/docs/content/bisync.md
@@ -323,7 +323,7 @@ Most of these events come up due to a error status from an internal call.
 On such a critical error the `{...}.path1.lst` and `{...}.path2.lst`
 listing files are renamed to extension `.lst-err`, which blocks any future
 bisync runs (since the normal `.lst` files are not found).
-Bisync keeps them under `bisync` subdirectory of the rclone cache direcory,
+Bisync keeps them under `bisync` subdirectory of the rclone cache directory,
 typically at `${HOME}/.cache/rclone/bisync/` on Linux.
 
 Some errors are considered temporary and re-running the bisync is not blocked.
@@ -421,7 +421,7 @@ don't have spelling case differences (`Smile.jpg` vs. `smile.jpg`).
 ## Windows support {#windows}
 
 Bisync has been tested on Windows 8.1, Windows 10 Pro 64-bit and on Windows
-Github runners.
+GitHub runners.
 
 Drive letters are allowed, including drive letters mapped to network drives
 (`rclone bisync J:\localsync GDrive:`).
@@ -929,7 +929,7 @@ test command flags can be equally prefixed by a single `-` or double dash.
   synched tree even if there are check file mismatches in the test tree.
 - Some Dropbox tests can fail, notably printing the following message:
   `src and dst identical but can't set mod time without deleting and re-uploading`
-  This is expected and happens due a way Dropbox handles modificaion times.
+  This is expected and happens due a way Dropbox handles modification times.
   You should use the `-refresh-times` test flag to make up for this.
 - If Dropbox tests hit request limit for you and print error message
   `too_many_requests/...: Too many requests or write operations.`
@@ -939,7 +939,7 @@ test command flags can be equally prefixed by a single `-` or double dash.
 ### Updating golden results
 
 Sometimes even a slight change in the bisync source can cause little changes
-spread around many log files. Updating them manually would be a nighmare.
+spread around many log files. Updating them manually would be a nightmare.
 
 The `-golden` flag will store the `test.log` and `*.lst` listings from each
 test case into respective golden directories. Golden results will
diff --git a/docs/content/changelog.md b/docs/content/changelog.md
index e4745b24d..0a6f32119 100644
--- a/docs/content/changelog.md
+++ b/docs/content/changelog.md
@@ -14,7 +14,7 @@ description: "Rclone Changelog"
     * build: Fix android build after GitHub actions change (Nick Craig-Wood)
     * dlna: Fix SOAP action header parsing (Joram Schrijver)
     * docs: Fix links to mount command from install docs (albertony)
-    * dropox: Fix ChangeNotify was unable to decrypt errors (Nick Craig-Wood)
+    * dropbox: Fix ChangeNotify was unable to decrypt errors (Nick Craig-Wood)
     * fs: Fix parsing of times and durations of the form "YYYY-MM-DD HH:MM:SS" (Nick Craig-Wood)
     * serve sftp: Fix checksum detection (Nick Craig-Wood)
     * sync: Add accidentally missed filter-sensitivity to --backup-dir option (Nick Naumann)
@@ -274,7 +274,7 @@ description: "Rclone Changelog"
     * build
         * Fix ARM architecture version in .deb packages after nfpm change (Nick Craig-Wood)
         * Hard fork `github.com/jlaffaye/ftp` to fix `go get github.com/rclone/rclone` (Nick Craig-Wood)
-    * oauthutil: Fix crash when webrowser requests `/robots.txt` (Nick Craig-Wood)
+    * oauthutil: Fix crash when webbrowser requests `/robots.txt` (Nick Craig-Wood)
     * operations: Fix goroutine leak in case of copy retry (Ankur Gupta)
     * rc:
         * Fix `operations/publiclink` default for `expires` parameter (Nick Craig-Wood)
@@ -360,7 +360,7 @@ description: "Rclone Changelog"
     * Add rclone to list of supported `md5sum`/`sha1sum` commands to look for (albertony)
     * Refactor so we only have one way of running remote commands (Nick Craig-Wood)
     * Fix timeout on hashing large files by sending keepalives (Nick Craig-Wood)
-    * Fix unecessary seeking when uploading and downloading files (Nick Craig-Wood)
+    * Fix unnecessary seeking when uploading and downloading files (Nick Craig-Wood)
     * Update docs on how to create `known_hosts` file (Nick Craig-Wood)
 * Storj
     * Rename tardigrade backend to storj backend (Nick Craig-Wood)
@@ -961,8 +961,8 @@ description: "Rclone Changelog"
         * Add sort by average size in directory (Adam Plánský)
         * Add toggle option for average s3ize in directory - key 'a' (Adam Plánský)
         * Add empty folder flag into ncdu browser (Adam Plánský)
-        * Add `!` (errror) and `.` (unreadable) file flags to go with `e` (empty) (Nick Craig-Wood)
-    * obscure: Make `rclone osbcure -` ignore newline at end of line (Nick Craig-Wood)
+        * Add `!` (error) and `.` (unreadable) file flags to go with `e` (empty) (Nick Craig-Wood)
+    * obscure: Make `rclone obscure -` ignore newline at end of line (Nick Craig-Wood)
     * operations
         * Add logs when need to upload files to set mod times (Nick Craig-Wood)
         * Move and copy log name of the destination object in verbose (Adam Plánský)
@@ -987,7 +987,7 @@ description: "Rclone Changelog"
         * Make the error count match up in the log message (Nick Craig-Wood)
     * move: Fix data loss when source and destination are the same object (Nick Craig-Wood)
     * operations
-        * Fix `--cutof-mode` hard not cutting off immediately (Nick Craig-Wood)
+        * Fix `--cutoff-mode` hard not cutting off immediately (Nick Craig-Wood)
         * Fix `--immutable` error message (Nick Craig-Wood)
     * sync
         * Fix `--cutoff-mode` soft & cautious so it doesn't end the transfer early (Nick Craig-Wood)
@@ -1035,7 +1035,7 @@ description: "Rclone Changelog"
     * Fixed crash on an empty file name (lluuaapp)
 * Box
     * Fix NewObject for files that differ in case (Nick Craig-Wood)
-    * Fix finding directories in a case insentive way (Nick Craig-Wood)
+    * Fix finding directories in a case insensitive way (Nick Craig-Wood)
 * Chunker
     * Skip long local hashing, hash in-transit (fixes) (Ivan Andreev)
     * Set Features ReadMimeType to false as Object.MimeType not supported (Nick Craig-Wood)
@@ -1116,7 +1116,7 @@ description: "Rclone Changelog"
     * Implement `--sftp-use-fstat` for unusual SFTP servers (Nick Craig-Wood)
 * Sugarsync
     * Fix NewObject for files that differ in case (Nick Craig-Wood)
-    * Fix finding directories in a case insentive way (Nick Craig-Wood)
+    * Fix finding directories in a case insensitive way (Nick Craig-Wood)
 * Swift
     * Fix deletion of parts of Static Large Object (SLO) (Nguyễn Hữu Luân)
     * Ensure partially uploaded large files are uploaded unless `--swift-leave-parts-on-error` (Nguyễn Hữu Luân)
@@ -1190,7 +1190,7 @@ description: "Rclone Changelog"
 [See commits](https://github.com/rclone/rclone/compare/v1.53.1...v1.53.2)
 
 * Bug Fixes
-    * acounting
+    * accounting
         * Fix incorrect speed and transferTime in core/stats (Nick Craig-Wood)
         * Stabilize display order of transfers on Windows (Nick Craig-Wood)
     * operations
@@ -2160,7 +2160,7 @@ all the docs and Edward Barker for helping re-write the front page.
     * rcat: Fix slowdown on systems with multiple hashes (Nick Craig-Wood)
     * rcd: Fix permissions problems on cache directory with web gui download (Nick Craig-Wood)
 * Mount
-    * Default `--daemon-timout` to 15 minutes on macOS and FreeBSD (Nick Craig-Wood)
+    * Default `--daemon-timeout` to 15 minutes on macOS and FreeBSD (Nick Craig-Wood)
     * Update docs to show mounting from root OK for bucket-based (Nick Craig-Wood)
     * Remove nonseekable flag from write files (Nick Craig-Wood)
 * VFS
@@ -2468,7 +2468,7 @@ all the docs and Edward Barker for helping re-write the front page.
     * Update google cloud storage endpoints (weetmuts)
 * HTTP
     * Add an example with username and password which is supported but wasn't documented (Nick Craig-Wood)
-    * Fix backend with `--files-from` and non-existent files (Nick Craig-Wood)
+    * Fix backend with `--files-from` and nonexistent files (Nick Craig-Wood)
 * Hubic
     * Make error message more informative if authentication fails (Nick Craig-Wood)
 * Jottacloud
@@ -2952,7 +2952,7 @@ Point release to fix hubic and azureblob backends.
 * FTP
     * Work around strange response from box FTP server
     * More workarounds for FTP servers to fix mkParentDir error
-    * Fix no error on listing non-existent directory
+    * Fix no error on listing nonexistent directory
 * Google Cloud Storage
     * Add service_account_credentials (Matt Holt)
     * Detect bucket presence by listing it - minimises permissions needed
@@ -3025,7 +3025,7 @@ Point release to fix hubic and azureblob backends.
     * Add .deb and .rpm packages as part of the build
     * Make a beta release for all branches on the main repo (but not pull requests)
 * Bug Fixes
-    * config: fixes errors on non existing config by loading config file only on first access
+    * config: fixes errors on nonexistent config by loading config file only on first access
     * config: retry saving the config after failure (Mateusz)
     * sync: when using `--backup-dir` don't delete files if we can't set their modtime
         * this fixes odd behaviour with Dropbox and `--backup-dir`
@@ -3560,7 +3560,7 @@ Point release to fix hubic and azureblob backends.
     * Update B2 docs with Data usage, and Crypt section - thanks Tomasz Mazur
 * S3
     * Command line and config file support for
-        * Setting/overriding ACL  - thanks Radek Senfeld
+        * Setting/overriding ACL  - thanks Radek Šenfeld
         * Setting storage class - thanks Asko Tamm
 * Drive
     * Make exponential backoff work exactly as per Google specification
diff --git a/docs/content/compress.md b/docs/content/compress.md
index 9a2d6b974..f9f3afbc0 100644
--- a/docs/content/compress.md
+++ b/docs/content/compress.md
@@ -129,7 +129,7 @@ Generally -1 (default, equivalent to 5) is recommended.
 Levels 1 to 9 increase compression at the cost of speed. Going past 6 
 generally offers very little return.
 
-Level -2 uses Huffmann encoding only. Only use if you know what you
+Level -2 uses Huffman encoding only. Only use if you know what you
 are doing.
 Level 0 turns off compression.
 
diff --git a/docs/content/crypt.md b/docs/content/crypt.md
index 92390bda3..b0110f635 100644
--- a/docs/content/crypt.md
+++ b/docs/content/crypt.md
@@ -241,7 +241,7 @@ the password configured for an existing crypt remote means you will no longer
 able to decrypt any of the previously encrypted content. The only possibility
 is to re-upload everything via a crypt remote configured with your new password.
 
-Depending on the size of your data, your bandwith, storage quota etc, there are
+Depending on the size of your data, your bandwidth, storage quota etc, there are
 different approaches you can take:
 - If you have everything in a different location, for example on your local system,
 you could remove all of the prior encrypted files, change the password for your
@@ -254,7 +254,7 @@ effectively decrypting everything on the fly using the old password and
 re-encrypting using the new password. When done, delete the original crypt
 remote directory and finally the rclone crypt configuration with the old password.
 All data will be streamed from the storage system and back, so you will
-get half the bandwith and be charged twice if you have upload and download quota
+get half the bandwidth and be charged twice if you have upload and download quota
 on the storage system.
 
 **Note**: A security problem related to the random password generator
@@ -567,7 +567,7 @@ How to encode the encrypted filename to text string.
 
 This option could help with shortening the encrypted filename. The 
 suitable option would depend on the way your remote count the filename
-length and if it's case sensitve.
+length and if it's case sensitive.
 
 Properties:
 
diff --git a/docs/content/docs.md b/docs/content/docs.md
index c031a94be..95609d757 100644
--- a/docs/content/docs.md
+++ b/docs/content/docs.md
@@ -498,7 +498,7 @@ backends can also store arbitrary user metadata.
 
 Where possible the key names are standardized, so, for example, it is
 possible to copy object metadata from s3 to azureblob for example and
-metadata will be translated apropriately.
+metadata will be translated appropriately.
 
 Some backends have limits on the size of the metadata and rclone will
 give errors on upload if they are exceeded.
@@ -641,7 +641,7 @@ would mean limit the upload and download bandwidth to 10 MiB/s.
 single limit, specify the desired bandwidth in KiB/s, or use a
 suffix B|K|M|G|T|P. The default is `0` which means to not limit bandwidth.
 
-The upload and download bandwidth can be specified seperately, as
+The upload and download bandwidth can be specified separately, as
 `--bwlimit UP:DOWN`, so
 
     --bwlimit 10M:100k
@@ -2011,7 +2011,7 @@ In all other cases the file will not be updated.
 Consider using the `--modify-window` flag to compensate for time skews
 between the source and the backend, for backends that do not support
 mod times, and instead use uploaded times. However, if the backend
-does not support checksums, note that sync'ing or copying within the
+does not support checksums, note that syncing or copying within the
 time skew window may still result in additional transfers for safety.
 
 ### --use-mmap ###
diff --git a/docs/content/drive.md b/docs/content/drive.md
index 7bb23ed59..0277eba31 100644
--- a/docs/content/drive.md
+++ b/docs/content/drive.md
@@ -1335,7 +1335,7 @@ drives found and a combined drive.
     upstreams = "My Drive=My Drive:" "Test Drive=Test Drive:"
 
 Adding this to the rclone config file will cause those team drives to
-be accessible with the aliases shown. Any illegal charactes will be
+be accessible with the aliases shown. Any illegal characters will be
 substituted with "_" and duplicate names will have numbers suffixed.
 It will also add a remote called AllDrives which shows all the shared
 drives combined into one directory tree.
diff --git a/docs/content/dropbox.md b/docs/content/dropbox.md
index 62b351c51..a8f4fe83f 100644
--- a/docs/content/dropbox.md
+++ b/docs/content/dropbox.md
@@ -409,7 +409,7 @@ Properties:
 
 #### --dropbox-batch-commit-timeout
 
-Max time to wait for a batch to finish comitting
+Max time to wait for a batch to finish committing
 
 Properties:
 
diff --git a/docs/content/filefabric.md b/docs/content/filefabric.md
index 225573ba5..d66b48162 100644
--- a/docs/content/filefabric.md
+++ b/docs/content/filefabric.md
@@ -13,7 +13,7 @@ through a global file system.
 ## Configuration
 
 The initial setup for the Enterprise File Fabric backend involves
-getting a token from the the Enterprise File Fabric which you need to
+getting a token from the Enterprise File Fabric which you need to
 do in your browser.  `rclone config` walks you through it.
 
 Here is an example of how to make a remote called `remote`.  First run:
diff --git a/docs/content/flags.md b/docs/content/flags.md
index cd9801851..2426a4a4a 100644
--- a/docs/content/flags.md
+++ b/docs/content/flags.md
@@ -313,7 +313,7 @@ and may be set in the config file.
       --drive-use-trash                              Send files to the trash instead of deleting permanently (default true)
       --drive-v2-download-min-size SizeSuffix        If Object's are greater, use drive v2 API to download (default off)
       --dropbox-auth-url string                      Auth server URL
-      --dropbox-batch-commit-timeout Duration        Max time to wait for a batch to finish comitting (default 10m0s)
+      --dropbox-batch-commit-timeout Duration        Max time to wait for a batch to finish committing (default 10m0s)
       --dropbox-batch-mode string                    Upload file batching sync|async|off (default "sync")
       --dropbox-batch-size int                       Max number of files in upload batch
       --dropbox-batch-timeout Duration               Max time to allow an idle upload batch before uploading (default 0s)
diff --git a/docs/content/ftp.md b/docs/content/ftp.md
index 617ca38d7..fa29a6821 100644
--- a/docs/content/ftp.md
+++ b/docs/content/ftp.md
@@ -23,8 +23,7 @@ To create an FTP configuration named `remote`, run
 
 Rclone config guides you through an interactive setup process. A minimal
 rclone FTP remote definition only requires host, username and password.
-For an anonymous FTP server, use `anonymous` as username and your email
-address as password.
+For an anonymous FTP server, see [below](#anonymous-ftp).
 
 ```
 No remotes found, make a new one?
@@ -101,11 +100,33 @@ excess files in the directory.
 
     rclone sync -i /home/local/directory remote:directory
 
-### Example without a config file ###
+### Anonymous FTP
+
+When connecting to a FTP server that allows anonymous login, you can use the
+special "anonymous" username. Traditionally, this user account accepts any
+string as a password, although it is common to use either the password
+"anonymous" or "guest". Some servers require the use of a valid e-mail
+address as password.
+
+Using [on-the-fly](#backend-path-to-dir) or
+[connection string](/docs/#connection-strings) remotes makes it easy to access
+such servers, without requiring any configuration in advance. The following
+are examples of that:
+
+    rclone lsf :ftp: --ftp-host=speedtest.tele2.net --ftp-user=anonymous --ftp-pass=$(rclone obscure dummy)
+    rclone lsf :ftp,host=speedtest.tele2.net,user=anonymous,pass=$(rclone obscure dummy):
+
+The above examples work in Linux shells and in PowerShell, but not Windows
+Command Prompt. They execute the [rclone obscure](/commands/rclone_obscure/)
+command to create a password string in the format required by the
+[pass](#ftp-pass) option. The following examples are exactly the same, except use
+an already obscured string representation of the same password "dummy", and
+therefore works even in Windows Command Prompt:
 
-    rclone lsf :ftp: --ftp-host=speedtest.tele2.net --ftp-user=anonymous --ftp-pass=`rclone obscure dummy`
+    rclone lsf :ftp: --ftp-host=speedtest.tele2.net --ftp-user=anonymous --ftp-pass=IXs2wc8OJOz7SYLBk47Ji1rHTmxM
+    rclone lsf :ftp,host=speedtest.tele2.net,user=anonymous,pass=IXs2wc8OJOz7SYLBk47Ji1rHTmxM:
 
-### Implicit TLS ###
+### Implicit TLS
 
 Rlone FTP supports implicit FTP over TLS servers (FTPS). This has to
 be enabled in the FTP backend config for the remote, or with
@@ -117,7 +138,7 @@ can be set with [`--ftp-port`](#ftp-port).
 In addition to the [default restricted characters set](/overview/#restricted-characters)
 the following characters are also replaced:
 
-File names cannot end with the following characters. Repacement is
+File names cannot end with the following characters. Replacement is
 limited to the last character in a file name:
 
 | Character | Value | Replacement |
diff --git a/docs/content/googlecloudstorage.md b/docs/content/googlecloudstorage.md
index 61b751d15..e23090585 100644
--- a/docs/content/googlecloudstorage.md
+++ b/docs/content/googlecloudstorage.md
@@ -607,7 +607,7 @@ Properties:
 If set this will decompress gzip encoded objects.
 
 It is possible to upload objects to GCS with "Content-Encoding: gzip"
-set. Normally rclone will download these files files as compressed objects.
+set. Normally rclone will download these files as compressed objects.
 
 If this flag is set then rclone will decompress these files with
 "Content-Encoding: gzip" as they are received. This means that rclone
diff --git a/docs/content/hidrive.md b/docs/content/hidrive.md
index 68375d1a2..cd763cec3 100644
--- a/docs/content/hidrive.md
+++ b/docs/content/hidrive.md
@@ -124,7 +124,7 @@ the process is very similar to the process of initial setup exemplified before.
 HiDrive allows modification times to be set on objects accurate to 1 second.
 
 HiDrive supports [its own hash type](https://static.hidrive.com/dev/0001)
-which is used to verify the integrety of file contents after successful transfers.
+which is used to verify the integrity of file contents after successful transfers.
 
 ### Restricted filename characters
 
diff --git a/docs/content/install.md b/docs/content/install.md
index 714794f3d..f69b04fe7 100644
--- a/docs/content/install.md
+++ b/docs/content/install.md
@@ -360,7 +360,7 @@ the system. Both scheduled task and Windows service can be used to achieve this.
 NOTE: Remember that when rclone runs as the `SYSTEM` user, the user profile
 that it sees will not be yours. This means that if you normally run rclone with
 configuration file in the default location, to be able to use the same configuration
-when running as the system user you must explicitely tell rclone where to find
+when running as the system user you must explicitly tell rclone where to find
 it with the [`--config`](https://rclone.org/docs/#config-config-file) option,
 or else it will look in the system users profile path (`C:\Windows\System32\config\systemprofile`).
 To test your command manually from a Command Prompt, you can run it with
@@ -424,7 +424,7 @@ it should be possible through path rewriting as described [here](https://github.
 
 To Windows service running any rclone command, the excellent third-party utility
 [NSSM](http://nssm.cc), the "Non-Sucking Service Manager", can be used.
-It includes some advanced features such as adjusting process periority, defining
+It includes some advanced features such as adjusting process priority, defining
 process environment variables, redirect to file anything written to stdout, and
 customized response to different exit codes, with a GUI to configure everything from
 (although it can also be used from command line ).
diff --git a/docs/content/jottacloud.md b/docs/content/jottacloud.md
index 7d815e8c4..4a61d2e78 100644
--- a/docs/content/jottacloud.md
+++ b/docs/content/jottacloud.md
@@ -18,7 +18,7 @@ it also provides white-label solutions to different companies, such as:
   * Elgiganten Sweden (cloud.elgiganten.se)
   * Elgiganten Denmark (cloud.elgiganten.dk)
   * Giganti Cloud  (cloud.gigantti.fi)
-  * ELKO Clouud (cloud.elko.is)
+  * ELKO Cloud (cloud.elko.is)
 
 Most of the white-label versions are supported by this backend, although may require different
 authentication setup - described below.
@@ -34,10 +34,33 @@ and you have to choose the correct one when setting up the remote.
 
 ### Standard authentication
 
-To configure Jottacloud you will need to generate a personal security token in the Jottacloud web interface.
-You will the option to do in your [account security settings](https://www.jottacloud.com/web/secure)
-(for whitelabel version you need to find this page in its web interface).
-Note that the web interface may refer to this token as a JottaCli token.
+The standard authentication method used by the official service (jottacloud.com), as well as
+some of the whitelabel services, requires you to generate a single-use personal login token
+from the account security settings in the service's web interface. Log in to your account,
+go to "Settings" and then "Security", or use the direct link presented to you by rclone when
+configuring the remote: <https://www.jottacloud.com/web/secure>. Scroll down to the section
+"Personal login token", and click the "Generate" button. Note that if you are using a
+whitelabel service you probably can't use the direct link, you need to find the same page in
+their dedicated web interface, and also it may be in a different location than described above.
+
+To access your account from multiple instances of rclone, you need to configure each of them
+with a separate personal login token. E.g. you create a Jottacloud remote with rclone in one
+location, and copy the configuration file to a second location where you also want to run
+rclone and access the same remote. Then you need to replace the token for one of them, using
+the [config reconnect](https://rclone.org/commands/rclone_config_reconnect/) command, which
+requires you to generate a new personal login token and supply as input. If you do not
+do this, the token may easily end up being invalidated, resulting in both instances failing
+with an error message something along the lines of:
+
+    oauth2: cannot fetch token: 400 Bad Request
+    Response: {"error":"invalid_grant","error_description":"Stale token"}
+
+When this happens, you need to replace the token as described above to be able to use your
+remote again.
+
+All personal login tokens you have taken into use will be listed in the web interface under
+"My logged in devices", and from the right side of that list you can click the "X" button to
+revoke individual tokens.
 
 ### Legacy authentication
 
diff --git a/docs/content/mega.md b/docs/content/mega.md
index cd26c7010..7cc95adb6 100644
--- a/docs/content/mega.md
+++ b/docs/content/mega.md
@@ -110,7 +110,7 @@ Use `rclone dedupe` to fix duplicated files.
 #### Object not found
 
 If you are connecting to your Mega remote for the first time, 
-to test access and syncronisation, you may receive an error such as 
+to test access and synchronization, you may receive an error such as 
 
 ```
 Failed to create file system for "my-mega-remote:": 
diff --git a/docs/content/netstorage.md b/docs/content/netstorage.md
index 0c1bef5bd..eab479c1c 100644
--- a/docs/content/netstorage.md
+++ b/docs/content/netstorage.md
@@ -152,7 +152,7 @@ Individual symlink files on the remote can be used with the commands like "cat"
 With NetStorage, directories can exist in one of two forms:
 
 1. **Explicit Directory**. This is an actual, physical directory that you have created in a storage group.
-2. **Implicit Directory**. This refers to a directory within a path that has not been physically created. For example, during upload of a file, non-existent subdirectories can be specified in the target path. NetStorage creates these as "implicit." While the directories aren't physically created, they exist implicitly and the noted path is connected with the uploaded file.
+2. **Implicit Directory**. This refers to a directory within a path that has not been physically created. For example, during upload of a file, nonexistent subdirectories can be specified in the target path. NetStorage creates these as "implicit." While the directories aren't physically created, they exist implicitly and the noted path is connected with the uploaded file.
 
 Rclone will intercept all file uploads and mkdir commands for the NetStorage remote and will explicitly issue the mkdir command for each directory in the uploading path. This will help with the interoperability with the other Akamai services such as SFTP and the Content Management Shell (CMShell). Rclone will not guarantee correctness of operations with implicit directories which might have been created as a result of using an upload API directly.
 
diff --git a/docs/content/onedrive.md b/docs/content/onedrive.md
index b7a40ba78..0f6897e34 100644
--- a/docs/content/onedrive.md
+++ b/docs/content/onedrive.md
@@ -568,7 +568,7 @@ An official document about the limitations for different types of OneDrive can b
 ## Versions
 
 Every change in a file OneDrive causes the service to create a new
-version of the the file.  This counts against a users quota.  For
+version of the file.  This counts against a users quota.  For
 example changing the modification time of a file creates a second
 version, so the file apparently uses twice the space.
 
diff --git a/docs/content/overview.md b/docs/content/overview.md
index 2a9301acf..e20543238 100644
--- a/docs/content/overview.md
+++ b/docs/content/overview.md
@@ -111,7 +111,7 @@ systems they must support a common hash type.
 
 ### ModTime ###
 
-Allmost all cloud storage systems store some sort of timestamp
+Almost all cloud storage systems store some sort of timestamp
 on objects, but several of them not something that is appropriate
 to use for syncing. E.g. some backends will only write a timestamp
 that represent the time of the upload. To be relevant for syncing
diff --git a/docs/content/rc.md b/docs/content/rc.md
index fc6316e51..9d87e2e65 100644
--- a/docs/content/rc.md
+++ b/docs/content/rc.md
@@ -397,7 +397,7 @@ The parameters can be a string as per the rest of rclone, eg
 `s3:bucket/path` or `:sftp:/my/dir`. They can also be specified as
 JSON blobs.
 
-If specifyng a JSON blob it should be a object mapping strings to
+If specifying a JSON blob it should be a object mapping strings to
 strings. These values will be used to configure the remote. There are
 3 special values which may be set:
 
@@ -1568,7 +1568,7 @@ check that parameter passing is working properly.
 
 **Authentication is required for this call.**
 
-### sync/bisync: Perform bidirectonal synchronization between two paths. {#sync-bisync}
+### sync/bisync: Perform bidirectional synchronization between two paths. {#sync-bisync}
 
 This takes the following parameters
 
diff --git a/docs/content/s3.md b/docs/content/s3.md
index dc5fd6d47..d09dd3592 100644
--- a/docs/content/s3.md
+++ b/docs/content/s3.md
@@ -332,7 +332,7 @@ upload.
 
 Rclone's default directory traversal is to process each directory
 individually.  This takes one API call per directory.  Using the
-`--fast-list` flag will read all info about the the objects into
+`--fast-list` flag will read all info about the objects into
 memory first using a smaller number of API calls (one per 1000
 objects). See the [rclone docs](/docs/#fast-list) for more details.
 
diff --git a/docs/content/sftp.md b/docs/content/sftp.md
index 8f3066a93..48ebfb3a3 100644
--- a/docs/content/sftp.md
+++ b/docs/content/sftp.md
@@ -21,7 +21,7 @@ SSH installations.
 Paths are specified as `remote:path`. If the path does not begin with
 a `/` it is relative to the home directory of the user.  An empty path
 `remote:` refers to the user's home directory. For example, `rclone lsd remote:` 
-would list the home directory of the user cofigured in the rclone remote config 
+would list the home directory of the user configured in the rclone remote config 
 (`i.e /home/sftpuser`). However, `rclone lsd remote:/` would list the root 
 directory for remote machine (i.e. `/`)
 
@@ -264,7 +264,7 @@ can also run a SSH server, which is a port of OpenSSH (see official
 [installation guide](https://docs.microsoft.com/en-us/windows-server/administration/openssh/openssh_install_firstuse)). On a Windows server the shell handling is different: Although it can also
 be set up to use a Unix type shell, e.g. Cygwin bash, the default is to
 use Windows Command Prompt (cmd.exe), and PowerShell is a recommended
-alternative. All of these have bahave differently, which rclone must handle.
+alternative. All of these have behave differently, which rclone must handle.
 
 Rclone tries to auto-detect what type of shell is used on the server,
 first time you access the SFTP remote. If a remote shell session is
@@ -296,7 +296,7 @@ a new sftp remote is accessed. If you configure a sftp remote
 without a config file, e.g. an [on the fly](/docs/#backend-path-to-dir])
 remote, rclone will have nowhere to store the result, and it
 will re-run the command on every access. To avoid this you should
-explicitely set the `shell_type` option to the correct value,
+explicitly set the `shell_type` option to the correct value,
 or to `none` if you want to prevent rclone from executing any
 remote shell commands.
 
@@ -304,7 +304,7 @@ It is also important to note that, since the shell type decides
 how quoting and escaping of file paths used as command-line arguments
 are performed, configuring the wrong shell type may leave you exposed
 to command injection exploits. Make sure to confirm the auto-detected
-shell type, or explicitely set the shell type you know is correct,
+shell type, or explicitly set the shell type you know is correct,
 or disable shell access until you know.
 
 ### Checksum
diff --git a/fs/accounting/stats.go b/fs/accounting/stats.go
index fc17f95ac..3101ef993 100644
--- a/fs/accounting/stats.go
+++ b/fs/accounting/stats.go
@@ -278,7 +278,7 @@ type transferStats struct {
 	speed          float64
 }
 
-// calculateTransferStats calculates some addtional transfer stats not
+// calculateTransferStats calculates some additional transfer stats not
 // stored directly in StatsInfo
 func (s *StatsInfo) calculateTransferStats() (ts transferStats) {
 	// checking and transferring have their own locking so read
diff --git a/fs/chunkedreader/chunkedreader.go b/fs/chunkedreader/chunkedreader.go
index 1e29ea736..66cf666d2 100644
--- a/fs/chunkedreader/chunkedreader.go
+++ b/fs/chunkedreader/chunkedreader.go
@@ -1,3 +1,4 @@
+// Package chunkedreader provides functionality for reading in chunks.
 package chunkedreader
 
 import (
diff --git a/fs/config/configfile/configfile.go b/fs/config/configfile/configfile.go
index e9c498995..572ac15e1 100644
--- a/fs/config/configfile/configfile.go
+++ b/fs/config/configfile/configfile.go
@@ -40,7 +40,7 @@ func (s *Storage) check() {
 		if err == nil {
 			// check to see if config file has changed and if it has, reload it
 			if s.fi == nil || !fi.ModTime().Equal(s.fi.ModTime()) || fi.Size() != s.fi.Size() {
-				fs.Debugf(nil, "Config file has changed externaly - reloading")
+				fs.Debugf(nil, "Config file has changed externally - reloading")
 				err := s._load()
 				if err != nil {
 					fs.Errorf(nil, "Failed to read config file - using previous config: %v", err)
diff --git a/fs/config/configmap/configmap.go b/fs/config/configmap/configmap.go
index 516a91992..ee8d4918f 100644
--- a/fs/config/configmap/configmap.go
+++ b/fs/config/configmap/configmap.go
@@ -137,7 +137,7 @@ func (c Simple) Set(key, value string) {
 }
 
 // String the map value the same way the config parser does, but with
-// sorted keys for reproducability.
+// sorted keys for reproducibility.
 func (c Simple) String() string {
 	var ks = make([]string, 0, len(c))
 	for k := range c {
diff --git a/fs/dirtree/dirtree.go b/fs/dirtree/dirtree.go
index 2785dcbed..6b4be8b6d 100644
--- a/fs/dirtree/dirtree.go
+++ b/fs/dirtree/dirtree.go
@@ -1,5 +1,5 @@
 // Package dirtree contains the DirTree type which is used for
-// building filesystem heirachies in memory.
+// building filesystem hierarchies in memory.
 package dirtree
 
 import (
diff --git a/fs/driveletter/driveletter.go b/fs/driveletter/driveletter.go
index 0a683509e..0c02f3976 100644
--- a/fs/driveletter/driveletter.go
+++ b/fs/driveletter/driveletter.go
@@ -1,8 +1,7 @@
-// Package driveletter returns whether a name is a valid drive letter
-
 //go:build !windows
 // +build !windows
 
+// Package driveletter returns whether a name is a valid drive letter
 package driveletter
 
 // IsDriveLetter returns a bool indicating whether name is a valid
diff --git a/fs/driveletter/driveletter_windows.go b/fs/driveletter/driveletter_windows.go
index 40ca94d43..f8b506a80 100644
--- a/fs/driveletter/driveletter_windows.go
+++ b/fs/driveletter/driveletter_windows.go
@@ -1,6 +1,7 @@
 //go:build windows
 // +build windows
 
+// Package driveletter returns whether a name is a valid drive letter
 package driveletter
 
 // IsDriveLetter returns a bool indicating whether name is a valid
diff --git a/fs/hash/hash.go b/fs/hash/hash.go
index 93b1de3b2..4540b40cf 100644
--- a/fs/hash/hash.go
+++ b/fs/hash/hash.go
@@ -1,3 +1,4 @@
+// Package hash provides hash utilities for Fs.
 package hash
 
 import (
diff --git a/fs/newfs.go b/fs/newfs.go
index f64cb2c8d..adf8582fa 100644
--- a/fs/newfs.go
+++ b/fs/newfs.go
@@ -33,7 +33,7 @@ func NewFs(ctx context.Context, path string) (Fs, error) {
 	overridden := fsInfo.Options.Overridden(config)
 	if len(overridden) > 0 {
 		extraConfig := overridden.String()
-		//Debugf(nil, "detected overriden config %q", extraConfig)
+		//Debugf(nil, "detected overridden config %q", extraConfig)
 		md5sumBinary := md5.Sum([]byte(extraConfig))
 		suffix := base64.RawURLEncoding.EncodeToString(md5sumBinary[:])
 		// 5 characters length is 5*6 = 30 bits of base64
diff --git a/fs/operations/operations.go b/fs/operations/operations.go
index 2bfddd07d..59de5aac0 100644
--- a/fs/operations/operations.go
+++ b/fs/operations/operations.go
@@ -1787,7 +1787,7 @@ func copyURLFn(ctx context.Context, dstFileName string, url string, autoFilename
 			_, params, err := mime.ParseMediaType(resp.Header.Get("Content-Disposition"))
 			headerFilename := path.Base(strings.Replace(params["filename"], "\\", "/", -1))
 			if err != nil || headerFilename == "" {
-				return fmt.Errorf("CopyURL failed: filename not found in the Content-Dispoition header")
+				return fmt.Errorf("CopyURL failed: filename not found in the Content-Disposition header")
 			}
 			fs.Debugf(headerFilename, "filename found in Content-Disposition header.")
 			return fn(ctx, headerFilename, resp.Body, resp.ContentLength, modTime)
diff --git a/fs/rc/jobs/job.go b/fs/rc/jobs/job.go
index cb3aaa833..613093e25 100644
--- a/fs/rc/jobs/job.go
+++ b/fs/rc/jobs/job.go
@@ -1,5 +1,4 @@
-// Manage background jobs that the rc is running
-
+// Package jobs manages background jobs that the rc is running.
 package jobs
 
 import (
diff --git a/fs/rc/webgui/plugins.go b/fs/rc/webgui/plugins.go
index a6730aacb..859e6d999 100644
--- a/fs/rc/webgui/plugins.go
+++ b/fs/rc/webgui/plugins.go
@@ -1,3 +1,4 @@
+// Package webgui provides plugin functionality to the Web GUI.
 package webgui
 
 import (
@@ -226,14 +227,14 @@ func (p *Plugins) GetPluginByName(name string) (out *PackageJSON, err error) {
 
 }
 
-// getAuthorRepoBranchGithub gives author, repoName and branch from a github.com url
+// getAuthorRepoBranchGitHub gives author, repoName and branch from a github.com url
 //
 //	url examples:
 //	https://github.com/rclone/rclone-webui-react/
 //	http://github.com/rclone/rclone-webui-react
 //	https://github.com/rclone/rclone-webui-react/tree/caman-js
 //	github.com/rclone/rclone-webui-react
-func getAuthorRepoBranchGithub(url string) (author string, repoName string, branch string, err error) {
+func getAuthorRepoBranchGitHub(url string) (author string, repoName string, branch string, err error) {
 	repoURL := url
 	repoURL = strings.Replace(repoURL, "https://", "", 1)
 	repoURL = strings.Replace(repoURL, "http://", "", 1)
diff --git a/fs/rc/webgui/rc.go b/fs/rc/webgui/rc.go
index 8c54040e3..c3bada21f 100644
--- a/fs/rc/webgui/rc.go
+++ b/fs/rc/webgui/rc.go
@@ -102,7 +102,7 @@ func rcAddPlugin(_ context.Context, in rc.Params) (out rc.Params, err error) {
 		return nil, err
 	}
 
-	author, repoName, repoBranch, err := getAuthorRepoBranchGithub(pluginURL)
+	author, repoName, repoBranch, err := getAuthorRepoBranchGitHub(pluginURL)
 	if err != nil {
 		return nil, err
 	}
diff --git a/fs/rc/webgui/webgui.go b/fs/rc/webgui/webgui.go
index 8153024d1..ee05730f7 100644
--- a/fs/rc/webgui/webgui.go
+++ b/fs/rc/webgui/webgui.go
@@ -1,5 +1,4 @@
-// Define the Web GUI helpers
-
+// Package webgui defines the Web GUI helpers.
 package webgui
 
 import (
diff --git a/fs/registry.go b/fs/registry.go
index 33dba915b..adf891ad2 100644
--- a/fs/registry.go
+++ b/fs/registry.go
@@ -28,7 +28,7 @@ type RegInfo struct {
 	// Prefix for command line flags for this fs - defaults to Name if not set
 	Prefix string
 	// Create a new file system.  If root refers to an existing
-	// object, then it should return an Fs which which points to
+	// object, then it should return an Fs which points to
 	// the parent of that object and ErrorIsFile.
 	NewFs func(ctx context.Context, name string, root string, config configmap.Mapper) (Fs, error) `json:"-"`
 	// Function to call to help with config - see docs for ConfigIn for more info
@@ -179,7 +179,7 @@ func (o *Option) MarshalJSON() ([]byte, error) {
 	})
 }
 
-// GetValue gets the current current value which is the default if not set
+// GetValue gets the current value which is the default if not set
 func (o *Option) GetValue() interface{} {
 	val := o.Value
 	if val == nil {
diff --git a/lib/buildinfo/tags.go b/lib/buildinfo/tags.go
index 6e61a457d..945a1e445 100644
--- a/lib/buildinfo/tags.go
+++ b/lib/buildinfo/tags.go
@@ -1,3 +1,4 @@
+// Package buildinfo provides build information.
 package buildinfo
 
 import (
diff --git a/lib/daemonize/daemon_other.go b/lib/daemonize/daemon_other.go
index 788d034e0..a0781d453 100644
--- a/lib/daemonize/daemon_other.go
+++ b/lib/daemonize/daemon_other.go
@@ -1,8 +1,7 @@
-// Daemonization stub for non-Unix platforms (implementation)
-
 //go:build windows || plan9 || js
 // +build windows plan9 js
 
+// Package daemonize provides daemonization stub for non-Unix platforms.
 package daemonize
 
 import (
diff --git a/lib/daemonize/daemon_unix.go b/lib/daemonize/daemon_unix.go
index beb89f7ac..1fcb2c55c 100644
--- a/lib/daemonize/daemon_unix.go
+++ b/lib/daemonize/daemon_unix.go
@@ -1,8 +1,7 @@
-// Daemonization interface for Unix platforms (implementation)
-
 //go:build !windows && !plan9 && !js
 // +build !windows,!plan9,!js
 
+// Package daemonize provides daemonization interface for Unix platforms.
 package daemonize
 
 import (
diff --git a/lib/dircache/dircache.go b/lib/dircache/dircache.go
index 920215e08..8076e7c8f 100644
--- a/lib/dircache/dircache.go
+++ b/lib/dircache/dircache.go
@@ -140,7 +140,7 @@ func (dc *DirCache) SetRootIDAlias(rootID string) {
 	dc.Put("", dc.rootID)
 }
 
-// FlushDir flushes the map of all data starting with with the path
+// FlushDir flushes the map of all data starting with the path
 // dir.
 //
 // If dir is empty string then this is equivalent to calling ResetRoot
diff --git a/lib/encoder/encoder.go b/lib/encoder/encoder.go
index d50a2fcfe..a14d7c848 100644
--- a/lib/encoder/encoder.go
+++ b/lib/encoder/encoder.go
@@ -1,15 +1,13 @@
-/*
-Translate file names for usage on restrictive storage systems
-
-The restricted set of characters are mapped to a unicode equivalent version
-(most to their FULLWIDTH variant) to increase compatibility with other
-storage systems.
-See: http://unicode-search.net/unicode-namesearch.pl?term=FULLWIDTH
-
-Encoders will also quote reserved characters to differentiate between
-the raw and encoded forms.
-*/
-
+// Package encoder provides functionality to translate file names
+// for usage on restrictive storage systems.
+//
+// The restricted set of characters are mapped to a unicode equivalent version
+// (most to their FULLWIDTH variant) to increase compatibility with other
+// storage systems.
+// See: http://unicode-search.net/unicode-namesearch.pl?term=FULLWIDTH
+//
+// Encoders will also quote reserved characters to differentiate between
+// the raw and encoded forms.
 package encoder
 
 import (
diff --git a/lib/encoder/filename/init.go b/lib/encoder/filename/init.go
index 0cbc53c3c..ea206cb9e 100644
--- a/lib/encoder/filename/init.go
+++ b/lib/encoder/filename/init.go
@@ -1,3 +1,4 @@
+// Package filename provides utilities for encoder.
 package filename
 
 import (
diff --git a/lib/encoder/internal/gen/main.go b/lib/encoder/internal/gen/main.go
index a94c37935..97bcb32ba 100644
--- a/lib/encoder/internal/gen/main.go
+++ b/lib/encoder/internal/gen/main.go
@@ -1,3 +1,4 @@
+// Package main provides utilities for encoder.
 package main
 
 import (
diff --git a/lib/errors/errors.go b/lib/errors/errors.go
index 68238521e..ed848cbd6 100644
--- a/lib/errors/errors.go
+++ b/lib/errors/errors.go
@@ -1,3 +1,4 @@
+// Package errors provides error handling utilites.
 package errors
 
 import (
diff --git a/lib/file/preallocate_windows.go b/lib/file/preallocate_windows.go
index 49352356a..39955092e 100644
--- a/lib/file/preallocate_windows.go
+++ b/lib/file/preallocate_windows.go
@@ -92,7 +92,7 @@ func PreAllocate(size int64, out *os.File) error {
 }
 
 const (
-	FSCTL_SET_SPARSE = 0x000900c4
+	FSCTL_SET_SPARSE = 0x000900c4 // Control code to set or clears the FILE_ATTRIBUTE_SPARSE_FILE attribute of a file.
 )
 
 // SetSparseImplemented is a constant indicating whether the
diff --git a/lib/http/auth/auth.go b/lib/http/auth/auth.go
index e30ee9383..db50c8a30 100644
--- a/lib/http/auth/auth.go
+++ b/lib/http/auth/auth.go
@@ -1,3 +1,4 @@
+// Package auth provides authentication for http.
 package auth
 
 import (
diff --git a/lib/jwtutil/jwtutil.go b/lib/jwtutil/jwtutil.go
index af99ed3f8..dfb4dc33b 100644
--- a/lib/jwtutil/jwtutil.go
+++ b/lib/jwtutil/jwtutil.go
@@ -1,3 +1,4 @@
+// Package jwtutil provides JWT utilities.
 package jwtutil
 
 import (
@@ -69,8 +70,8 @@ func Config(id, name string, claims *jws.ClaimSet, header *jws.Header, queryPara
 		return fmt.Errorf("jwtutil: failed making auth request: %w", err)
 	}
 	defer func() {
-		deferedErr := resp.Body.Close()
-		if deferedErr != nil {
+		deferredErr := resp.Body.Close()
+		if deferredErr != nil {
 			err = fmt.Errorf("jwtutil: failed to close resp.Body: %w", err)
 		}
 	}()
diff --git a/lib/kv/bolt.go b/lib/kv/bolt.go
index 5f9f3d7a6..6fcfe49dd 100644
--- a/lib/kv/bolt.go
+++ b/lib/kv/bolt.go
@@ -1,6 +1,7 @@
 //go:build !plan9 && !js
 // +build !plan9,!js
 
+// Package kv provides key/value database.
 package kv
 
 import (
diff --git a/lib/mmap/mmap.go b/lib/mmap/mmap.go
index 719bcf816..4f323c938 100644
--- a/lib/mmap/mmap.go
+++ b/lib/mmap/mmap.go
@@ -1,3 +1,4 @@
+// Package mmap provides memory mapped related utilities.
 package mmap
 
 import "os"
diff --git a/lib/oauthutil/oauthutil.go b/lib/oauthutil/oauthutil.go
index 350fe1671..a7326e886 100644
--- a/lib/oauthutil/oauthutil.go
+++ b/lib/oauthutil/oauthutil.go
@@ -1,3 +1,4 @@
+// Package oauthutil provides OAuth utilities.
 package oauthutil
 
 import (
diff --git a/lib/readers/context.go b/lib/readers/context.go
index 6af6efbaf..177b18809 100644
--- a/lib/readers/context.go
+++ b/lib/readers/context.go
@@ -1,3 +1,4 @@
+// Package readers provides io.Reader related utilities.
 package readers
 
 import (
diff --git a/lib/rest/rest.go b/lib/rest/rest.go
index 69bb1deff..a424b9d3e 100644
--- a/lib/rest/rest.go
+++ b/lib/rest/rest.go
@@ -419,7 +419,7 @@ func MultipartUpload(ctx context.Context, in io.Reader, params url.Values, conte
 // opts.Body are set then CallJSON will do a multipart upload with a
 // file attached.  opts.MultipartContentName is the name of the
 // parameter and opts.MultipartFileName is the name of the file.  If
-// MultpartContentName is set, and request != nil is supplied, then
+// MultipartContentName is set, and request != nil is supplied, then
 // the request will be marshalled into JSON and added to the form with
 // parameter name MultipartMetadataName.
 //
diff --git a/librclone/librclone/librclone.go b/librclone/librclone/librclone.go
index 5b29e4c59..1e7dd6e11 100644
--- a/librclone/librclone/librclone.go
+++ b/librclone/librclone/librclone.go
@@ -1,7 +1,7 @@
 // Package librclone exports shims for library use
 //
 // This is the internal implementation which is used for C and
-// Gomobile libaries which need slightly different export styles.
+// Gomobile libraries which need slightly different export styles.
 //
 // The shims are a thin wrapper over the rclone RPC.
 package librclone
diff --git a/vfs/dir.go b/vfs/dir.go
index 7f6830582..c45033d0e 100644
--- a/vfs/dir.go
+++ b/vfs/dir.go
@@ -186,7 +186,7 @@ func (d *Dir) ForgetAll() (hasVirtual bool) {
 			}
 		}
 	}
-	// Purge any unecessary virtual entries
+	// Purge any unnecessary virtual entries
 	d._purgeVirtual()
 
 	d.read = time.Time{}
diff --git a/vfs/vfs.go b/vfs/vfs.go
index b6dc141b3..77ccdf499 100644
--- a/vfs/vfs.go
+++ b/vfs/vfs.go
@@ -10,15 +10,14 @@
 // may be referred to as "".  However Stat strips slashes so you can
 // use paths with slashes in.
 //
-// It also includes directory caching
+// # It also includes directory caching
 //
 // The vfs package returns Error values to signal precisely which
 // error conditions have ocurred.  It may also return general errors
 // it receives.  It tries to use os Error values (e.g. os.ErrExist)
 // where possible.
-
+//
 //go:generate sh -c "go run make_open_tests.go | gofmt > open_test.go"
-
 package vfs
 
 import (
diff --git a/vfs/vfscache/downloaders/downloaders.go b/vfs/vfscache/downloaders/downloaders.go
index 46018c7e1..8d6e90fb2 100644
--- a/vfs/vfscache/downloaders/downloaders.go
+++ b/vfs/vfscache/downloaders/downloaders.go
@@ -1,3 +1,4 @@
+// Package downloaders provides utilities for the VFS layer
 package downloaders
 
 import (
diff --git a/vfs/vfscache/item.go b/vfs/vfscache/item.go
index 36355d981..b7f40252d 100644
--- a/vfs/vfscache/item.go
+++ b/vfs/vfscache/item.go
@@ -1152,7 +1152,7 @@ func (item *Item) _ensure(offset, size int64) (err error) {
 // This is called by the downloader downloading file segments and the
 // vfs layer writing to the file.
 //
-// This doesn't mark the item as Dirty - that the the responsibility
+// This doesn't mark the item as Dirty - that the responsibility
 // of the caller as we don't know here whether we are adding reads or
 // writes to the cache file.
 //
diff --git a/vfs/vfscommon/cachemode.go b/vfs/vfscommon/cachemode.go
index a2d91bd4e..c82f3bc98 100644
--- a/vfs/vfscommon/cachemode.go
+++ b/vfs/vfscommon/cachemode.go
@@ -1,3 +1,4 @@
+// Package vfscommon provides utilities for VFS.
 package vfscommon
 
 import (


Test patch:
diff --git a/backend/hidrive/hidrivehash/hidrivehash_test.go b/backend/hidrive/hidrivehash/hidrivehash_test.go
index d27970c34..07f2435b4 100644
--- a/backend/hidrive/hidrivehash/hidrivehash_test.go
+++ b/backend/hidrive/hidrivehash/hidrivehash_test.go
@@ -138,7 +138,7 @@ var testTable = []struct {
 	// pattern describes how to use data to construct the hash-input.
 	// For every entry n at even indices this repeats the data n times.
 	// For every entry m at odd indices this repeats a null-byte m times.
-	// The input-data is constructed by concatinating the results in order.
+	// The input-data is constructed by concatenating the results in order.
 	pattern []int64
 	out     []byte
 	name    string
diff --git a/backend/local/local_internal_test.go b/backend/local/local_internal_test.go
index 698d263a8..811831d91 100644
--- a/backend/local/local_internal_test.go
+++ b/backend/local/local_internal_test.go
@@ -192,7 +192,7 @@ func TestHashOnUpdate(t *testing.T) {
 	require.NoError(t, err)
 	assert.Equal(t, "9a0364b9e99bb480dd25e1f0284c8555", md5)
 
-	// Reupload it with diferent contents but same size and timestamp
+	// Reupload it with different contents but same size and timestamp
 	var b = bytes.NewBufferString("CONTENT")
 	src := object.NewStaticObjectInfo(filePath, when, int64(b.Len()), true, nil, f)
 	err = o.Update(ctx, b, src)
diff --git a/backend/s3/s3_internal_test.go b/backend/s3/s3_internal_test.go
index be12cc42d..9d22ca69b 100644
--- a/backend/s3/s3_internal_test.go
+++ b/backend/s3/s3_internal_test.go
@@ -78,7 +78,7 @@ func (f *Fs) InternalTestMetadata(t *testing.T) {
 	}
 
 	t.Run("GzipEncoding", func(t *testing.T) {
-		// Test that the gziped file we uploaded can be
+		// Test that the gzipped file we uploaded can be
 		// downloaded with and without decompression
 		checkDownload := func(wantContents string, wantSize int64, wantHash string) {
 			gotContents := fstests.ReadObject(ctx, t, o, -1)
@@ -116,7 +116,7 @@ func (f *Fs) InternalTestNoHead(t *testing.T) {
 	defer func() {
 		assert.NoError(t, obj.Remove(ctx))
 	}()
-	// PutTestcontests checks the received object
+	// PutTestcontents checks the received object
 
 }
 
diff --git a/backend/swift/swift_internal_test.go b/backend/swift/swift_internal_test.go
index c85355084..49963fc61 100644
--- a/backend/swift/swift_internal_test.go
+++ b/backend/swift/swift_internal_test.go
@@ -16,8 +16,8 @@ func TestInternalUrlEncode(t *testing.T) {
 		want string
 	}{
 		{"", ""},
-		{"abcdefghijklmopqrstuvwxyz", "abcdefghijklmopqrstuvwxyz"},
-		{"ABCDEFGHIJKLMOPQRSTUVWXYZ", "ABCDEFGHIJKLMOPQRSTUVWXYZ"},
+		{"abcdefghijklmnopqrstuvwxyz", "abcdefghijklmnopqrstuvwxyz"},
+		{"ABCDEFGHIJKLMNOPQRSTUVWXYZ", "ABCDEFGHIJKLMNOPQRSTUVWXYZ"},
 		{"0123456789", "0123456789"},
 		{"abc/ABC/123", "abc/ABC/123"},
 		{"   ", "%20%20%20"},
diff --git a/cmd/cmount/mount_test.go b/cmd/cmount/mount_test.go
index 542c35b1b..7c9c852f6 100644
--- a/cmd/cmount/mount_test.go
+++ b/cmd/cmount/mount_test.go
@@ -3,6 +3,8 @@
 // +build linux,cgo darwin,cgo freebsd,cgo windows
 // +build !race !windows
 
+// Package cmount implements a FUSE mounting system for rclone remotes.
+//
 // FIXME this doesn't work with the race detector under Windows either
 // hanging or producing lots of differences.
 
diff --git a/cmd/test/histogram/histogram.go b/cmd/test/histogram/histogram.go
index d4f02d5d9..a3a2865b8 100644
--- a/cmd/test/histogram/histogram.go
+++ b/cmd/test/histogram/histogram.go
@@ -1,3 +1,4 @@
+// Package histogram provides the histogram test command.
 package histogram
 
 import (
diff --git a/cmd/test/info/info.go b/cmd/test/info/info.go
index c4eef5f04..89cc10a01 100644
--- a/cmd/test/info/info.go
+++ b/cmd/test/info/info.go
@@ -1,3 +1,4 @@
+// Package info provides the info test command.
 package info
 
 // FIXME once translations are implemented will need a no-escape
diff --git a/cmd/test/info/internal/build_csv/main.go b/cmd/test/info/internal/build_csv/main.go
index 96aa20a19..fbabe5b85 100644
--- a/cmd/test/info/internal/build_csv/main.go
+++ b/cmd/test/info/internal/build_csv/main.go
@@ -1,3 +1,4 @@
+// Package main provides utilities for the info test command.
 package main
 
 import (
diff --git a/cmd/test/info/internal/internal.go b/cmd/test/info/internal/internal.go
index 663662904..7af06b87a 100644
--- a/cmd/test/info/internal/internal.go
+++ b/cmd/test/info/internal/internal.go
@@ -1,3 +1,4 @@
+// Package internal provides internal implementation for the info test command.
 package internal
 
 import (
diff --git a/cmd/test/memory/memory.go b/cmd/test/memory/memory.go
index 551723258..38b7b1683 100644
--- a/cmd/test/memory/memory.go
+++ b/cmd/test/memory/memory.go
@@ -1,3 +1,4 @@
+// Package memory provides the memory test command.
 package memory
 
 import (
diff --git a/cmd/test/test.go b/cmd/test/test.go
index 39f5ccb29..774bf6c3a 100644
--- a/cmd/test/test.go
+++ b/cmd/test/test.go
@@ -1,3 +1,4 @@
+// Package test provides the test command.
 package test
 
 import (
diff --git a/cmdtest/environment_test.go b/cmdtest/environment_test.go
index 2124dc31c..b5b27eab5 100644
--- a/cmdtest/environment_test.go
+++ b/cmdtest/environment_test.go
@@ -81,7 +81,7 @@ func TestEnvironmentVariables(t *testing.T) {
 	// Backend flags and remote name
 	// - The listremotes command includes names from environment variables,
 	//   the part between "RCLONE_CONFIG_" and "_TYPE", converted to lowercase.
-	// - When using using a remote created from env, e.g. with lsd command,
+	// - When using a remote created from env, e.g. with lsd command,
 	//   the name is case insensitive in contrast to remotes in config file
 	//   (fs.ConfigToEnv converts to uppercase before checking environment).
 	// - Previously using a remote created from env, e.g. with lsd command,
diff --git a/fs/cache/cache_test.go b/fs/cache/cache_test.go
index c7620e25c..c03aa7dfa 100644
--- a/fs/cache/cache_test.go
+++ b/fs/cache/cache_test.go
@@ -154,7 +154,7 @@ func TestPin(t *testing.T) {
 	cleanup, create := mockNewFs(t)
 	defer cleanup()
 
-	// Test pinning and unpinning non-existent
+	// Test pinning and unpinning nonexistent
 	f := mockfs.NewFs(context.Background(), "mock", "/alien")
 	Pin(f)
 	Unpin(f)
diff --git a/fs/operations/check_test.go b/fs/operations/check_test.go
index 21692486d..be22051fe 100644
--- a/fs/operations/check_test.go
+++ b/fs/operations/check_test.go
@@ -186,11 +186,11 @@ func TestCheck(t *testing.T) {
 
 func TestCheckFsError(t *testing.T) {
 	ctx := context.Background()
-	dstFs, err := fs.NewFs(ctx, "non-existent")
+	dstFs, err := fs.NewFs(ctx, "nonexistent")
 	if err != nil {
 		t.Fatal(err)
 	}
-	srcFs, err := fs.NewFs(ctx, "non-existent")
+	srcFs, err := fs.NewFs(ctx, "nonexistent")
 	if err != nil {
 		t.Fatal(err)
 	}
diff --git a/fs/operations/lsjson_test.go b/fs/operations/lsjson_test.go
index d5d7ca319..a8943cfbd 100644
--- a/fs/operations/lsjson_test.go
+++ b/fs/operations/lsjson_test.go
@@ -13,7 +13,7 @@ import (
 	"github.com/stretchr/testify/require"
 )
 
-// Compare a and b in a file system idependent way
+// Compare a and b in a file system independent way
 func compareListJSONItem(t *testing.T, a, b *operations.ListJSONItem, precision time.Duration) {
 	assert.Equal(t, a.Path, b.Path, "Path")
 	assert.Equal(t, a.Name, b.Name, "Name")
diff --git a/fstest/fstests/fstests.go b/fstest/fstests/fstests.go
index 28e02a44b..3b9767eaf 100644
--- a/fstest/fstests/fstests.go
+++ b/fstest/fstests/fstests.go
@@ -531,14 +531,14 @@ func Run(t *testing.T, opt *Opt) {
 		assert.True(t, len(fsInfo.CommandHelp) > 0, "Command is declared, must return some help in CommandHelp")
 	})
 
-	// TestFsRmdirNotFound tests deleting a non-existent directory
+	// TestFsRmdirNotFound tests deleting a nonexistent directory
 	t.Run("FsRmdirNotFound", func(t *testing.T) {
 		skipIfNotOk(t)
 		if isBucketBasedButNotRoot(f) {
 			t.Skip("Skipping test as non root bucket-based remote")
 		}
 		err := f.Rmdir(ctx, "")
-		assert.Error(t, err, "Expecting error on Rmdir non-existent")
+		assert.Error(t, err, "Expecting error on Rmdir nonexistent")
 	})
 
 	// Make the directory
@@ -729,7 +729,7 @@ func Run(t *testing.T, opt *Opt) {
 			o, err := f.NewObject(ctx, "potato")
 			assert.Nil(t, o)
 			assert.Equal(t, fs.ErrorObjectNotFound, err)
-			// Now try an object in a non existing directory
+			// Now try an object in a nonexistent directory
 			o, err = f.NewObject(ctx, "directory/not/found/potato")
 			assert.Nil(t, o)
 			assert.Equal(t, fs.ErrorObjectNotFound, err)
@@ -1632,7 +1632,7 @@ func Run(t *testing.T, opt *Opt) {
 					fstest.CheckListingWithRoot(t, rootRemote, configLeaf, []fstest.Item{file1Root, file2Root}, dirs, rootRemote.Precision())
 				})
 
-				// Check that that listing the entries is OK
+				// Check that listing the entries is OK
 				t.Run("ListEntries", func(t *testing.T) {
 					entries, err := rootRemote.List(context.Background(), configLeaf)
 					require.NoError(t, err)
@@ -2068,7 +2068,7 @@ func Run(t *testing.T, opt *Opt) {
 
 		// TestFsRootCollapse tests if the root of an fs "collapses" to the
 		// absolute root. It creates a new fs of the same backend type with its
-		// root set to a *non-existent* folder, and attempts to read the info of
+		// root set to a *nonexistent* folder, and attempts to read the info of
 		// an object in that folder, whose name is taken from a directory that
 		// exists in the absolute root.
 		// This test is added after
diff --git a/fstest/mockfs/mockfs.go b/fstest/mockfs/mockfs.go
index fe73db5ca..62489c2f6 100644
--- a/fstest/mockfs/mockfs.go
+++ b/fstest/mockfs/mockfs.go
@@ -1,3 +1,4 @@
+// Package mockfs provides mock Fs for testing.
 package mockfs
 
 import (
diff --git a/fstest/run.go b/fstest/run.go
index a9b8b0a46..8751b3d23 100644
--- a/fstest/run.go
+++ b/fstest/run.go
@@ -17,7 +17,7 @@ func TestMkdir(t *testing.T) {
 	// test stuff
 }
 
-This will make r.Fremote and r.Flocal for a remote remote and a local
+This will make r.Fremote and r.Flocal for a remote and a local
 remote.  The remote is determined by the -remote flag passed in.
 
 */
diff --git a/lib/cache/cache_test.go b/lib/cache/cache_test.go
index 415e167c3..71e1a4dbb 100644
--- a/lib/cache/cache_test.go
+++ b/lib/cache/cache_test.go
@@ -158,7 +158,7 @@ func TestCachePin(t *testing.T) {
 	_, err := c.Get("/", create)
 	require.NoError(t, err)
 
-	// Pin a non-existent item to show nothing happens
+	// Pin a nonexistent item to show nothing happens
 	c.Pin("notfound")
 
 	c.mu.Lock()
@@ -312,7 +312,7 @@ func TestCacheRename(t *testing.T) {
 
 	assert.Equal(t, 2, c.Entries())
 
-	// rename to non-existent
+	// rename to nonexistent
 	value, found := c.Rename("existing1", "EXISTING1")
 	assert.Equal(t, true, found)
 	assert.Equal(t, existing1, value)
@@ -326,7 +326,7 @@ func TestCacheRename(t *testing.T) {
 
 	assert.Equal(t, 1, c.Entries())
 
-	// rename non-existent
+	// rename nonexistent
 	value, found = c.Rename("notfound", "NOTFOUND")
 	assert.Equal(t, false, found)
 	assert.Nil(t, value)
diff --git a/vfs/vfscache/cache_test.go b/vfs/vfscache/cache_test.go
index 6755dcee4..bd08736a0 100644
--- a/vfs/vfscache/cache_test.go
+++ b/vfs/vfscache/cache_test.go
@@ -450,7 +450,7 @@ func TestCachePurgeClean(t *testing.T) {
 	_, err = os.Stat(potato1.c.toOSPath(potato1.name))
 	require.NoError(t, err)
 
-	// Add some potatos
+	// Add some potatoes
 	potato2 := c.Item("sub/dir/potato2")
 	require.NoError(t, potato2.Open(nil))
 	require.NoError(t, potato2.Truncate(5))
@@ -603,7 +603,7 @@ func TestCacheRename(t *testing.T) {
 	assertPathNotExist(t, osPathMeta)
 	assert.False(t, c.Exists("sub/newPotato"))
 
-	// non-existent file - is ignored
+	// nonexistent file - is ignored
 	assert.NoError(t, c.Rename("nonexist", "nonexist2", nil))
 }
 
diff --git a/vfs/vfscache/writeback/writeback_test.go b/vfs/vfscache/writeback/writeback_test.go
index 512d0eeb7..cfc7f4fa9 100644
--- a/vfs/vfscache/writeback/writeback_test.go
+++ b/vfs/vfscache/writeback/writeback_test.go
@@ -408,7 +408,7 @@ func TestWriteBackAddUpdateNotModified(t *testing.T) {
 	pi2 := newPutItem(t)
 	id2 := wb.Add(id, "one", false, pi2.put)
 	assert.Equal(t, id, id2)
-	checkNotOnHeap(t, wb, wbItem) // object still being transfered
+	checkNotOnHeap(t, wb, wbItem) // object still being transferred
 	checkInLookup(t, wb, wbItem)
 
 	// Because modified was false above this should not cancel the
@@ -525,7 +525,7 @@ func TestWriteBackMaxQueue(t *testing.T) {
 	assert.Equal(t, toTransfer-maxTransfers, queued)
 	assert.Equal(t, maxTransfers, inProgress)
 
-	// now finish the the first maxTransfers
+	// now finish the first maxTransfers
 	for i := 0; i < maxTransfers; i++ {
 		pis[i].finish(nil)
 	}
diff --git a/vfs/vfstest/vfs.go b/vfs/vfstest/vfs.go
index 382fb8844..ad56fd42e 100644
--- a/vfs/vfstest/vfs.go
+++ b/vfs/vfstest/vfs.go
@@ -1,3 +1,4 @@
+// Package vfstest provides tests for VFS.
 package vfstest
 
 import (