diff --git a/.github/workflows/codespell.yml b/.github/workflows/codespell.yml new file mode 100644 index 00000000..17d577d3 --- /dev/null +++ b/.github/workflows/codespell.yml @@ -0,0 +1,25 @@ +# Codespell configuration is within pyproject.toml +--- +name: Codespell + +on: + push: + branches: [hovudstraum] + pull_request: + branches: [hovudstraum] + +permissions: + contents: read + +jobs: + codespell: + name: Check for spelling errors + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Annotate locations with typos + uses: codespell-project/codespell-problem-matcher@v1 + - name: Codespell + uses: codespell-project/actions-codespell@v2 diff --git a/README.md b/README.md index 63227835..6aa8fa9d 100644 --- a/README.md +++ b/README.md @@ -986,7 +986,7 @@ specify `--shr /foobar` to enable this feature; a toplevel virtual folder named * you can name it whatever, `foobar` is just an example * if you're using config files, put `shr: /foobar` inside the `[global]` section instead -users can delete their own shares in the controlpanel, and a list of privileged users (`--shr-adm`) are allowed to see and/or delet any share on the server +users can delete their own shares in the controlpanel, and a list of privileged users (`--shr-adm`) are allowed to see and/or delete any share on the server after a share has expired, it remains visible in the controlpanel for `--shr-rt` minutes (default is 1 day), and the owner can revive it by extending the expiration time there @@ -2689,7 +2689,7 @@ sync folders to/from copyparty NOTE: full bidirectional sync, like what [nextcloud](https://docs.nextcloud.com/server/latest/user_manual/sv/files/desktop_mobile_sync.html) and [syncthing](https://syncthing.net/) does, will never be supported! Only single-direction sync (server-to-client, or client-to-server) is possible with copyparty -* if you want bidirectional sync, then copyparty and syncthing *should* be entirely safe to combine; they should be able to collaborate on the same folders without causing any trouble for eachother. Many people do this, and there have been no issues so far. But, if you *do* encounter any problems, please [file a copyparty bug](https://github.com/9001/copyparty/issues/new/choose) and I'll try to help -- just keep in mind I've never used syncthing before :-) +* if you want bidirectional sync, then copyparty and syncthing *should* be entirely safe to combine; they should be able to collaborate on the same folders without causing any trouble for each other. Many people do this, and there have been no issues so far. But, if you *do* encounter any problems, please [file a copyparty bug](https://github.com/9001/copyparty/issues/new/choose) and I'll try to help -- just keep in mind I've never used syncthing before :-) the commandline uploader [u2c.py](https://github.com/9001/copyparty/tree/hovudstraum/bin#u2cpy) with `--dr` is the best way to sync a folder to copyparty; verifies checksums and does files in parallel, and deletes unexpected files on the server after upload has finished which makes file-renames really cheap (it'll rename serverside and skip uploading) diff --git a/bin/mtag/geotag.py b/bin/mtag/geotag.py index 4415759a..971f7890 100755 --- a/bin/mtag/geotag.py +++ b/bin/mtag/geotag.py @@ -9,7 +9,7 @@ from copyparty.util import fsenc, runcmd uses exiftool to geotag images based on embedded gps coordinates in exif data adds four new metadata keys: - .gps_lat = latitute + .gps_lat = latitude .gps_lon = longitude .masl = meters above sea level city = "city, subregion, region" diff --git a/bin/mtag/very-bad-idea.py b/bin/mtag/very-bad-idea.py index 50cd390d..d9127184 100755 --- a/bin/mtag/very-bad-idea.py +++ b/bin/mtag/very-bad-idea.py @@ -151,7 +151,7 @@ def open_url(txt): for _ in range(20): sp.call(["xdotool", "key", "ctrl+w"]) # closes the open tab correctly # else: - # sp.call(["xdotool", "getactivewindow", "windowminimize"]) # minimizes the focused windo + # sp.call(["xdotool", "getactivewindow", "windowminimize"]) # minimizes the focused window # mpv is probably smart enough to use streamlink automatically if try_mpv(txt): @@ -166,7 +166,7 @@ def open_url(txt): # nope, # close any error messages: sp.call(["xdotool", "search", "--name", "Error", "windowclose"]) - # sp.call(["xdotool", "key", "ctrl+alt+d"]) # doesnt work at all + # sp.call(["xdotool", "key", "ctrl+alt+d"]) # does not work at all # sp.call(["xdotool", "keydown", "--delay", "100", "ctrl+alt+d"]) # sp.call(["xdotool", "keyup", "ctrl+alt+d"]) sp.call(["xdg-open", txt]) diff --git a/contrib/media-osd-bgone.ps1 b/contrib/media-osd-bgone.ps1 index 8018bd69..db0f0230 100644 --- a/contrib/media-osd-bgone.ps1 +++ b/contrib/media-osd-bgone.ps1 @@ -14,7 +14,7 @@ # then create a shortcut to that bat-file and move the shortcut here: # %appdata%\Microsoft\Windows\Start Menu\Programs\Startup # -# and now this will autorun on bootup +# and now this will autorun on boot-up Add-Type -TypeDefinition @" diff --git a/contrib/nixos/modules/copyparty.nix b/contrib/nixos/modules/copyparty.nix index 6bb51b68..7a039a78 100644 --- a/contrib/nixos/modules/copyparty.nix +++ b/contrib/nixos/modules/copyparty.nix @@ -363,7 +363,7 @@ in name: value: lib.attrsets.nameValuePair (value.path) { d = { - #: in front of things means it wont change it if the directory already exists. + #: in front of things means it won't change it if the directory already exists. group = ":${cfg.group}"; user = ":${cfg.user}"; mode = ":${ diff --git a/contrib/plugins/meadup.js b/contrib/plugins/meadup.js index cd5e123a..bc75d9b5 100644 --- a/contrib/plugins/meadup.js +++ b/contrib/plugins/meadup.js @@ -11,7 +11,7 @@ var hambagas = [ "https://www.youtube.com/watch?v=pFA3KGp4GuU" ]; -// keybaord, +// keyboard, // onscreen keyboard by @steinuil function initKeybaord(BASE_URL, HAMBAGA, consoleLog, consoleError) { document.querySelector('.keybaord-container').innerHTML = ` @@ -373,7 +373,7 @@ function initKeybaord(BASE_URL, HAMBAGA, consoleLog, consoleError) { } -// keybaord integration +// keyboard integration (function () { var o = mknod('div'); clmod(o, 'keybaord-container', 1); diff --git a/contrib/zfs-tune.py b/contrib/zfs-tune.py index fcd435c2..631c1b1c 100755 --- a/contrib/zfs-tune.py +++ b/contrib/zfs-tune.py @@ -58,7 +58,7 @@ def set_pagesize(db_path): # https://www.sqlite.org/pragma.html#pragma_page_size # `- disable wal; set pagesize; vacuum - # (copyparty will reenable wal if necessary) + # (copyparty will re-enable wal if necessary) with sqlite3.connect(db_path) as db: db.execute("pragma journal_mode=delete") diff --git a/copyparty/__main__.py b/copyparty/__main__.py index f8dcffb1..37444e66 100644 --- a/copyparty/__main__.py +++ b/copyparty/__main__.py @@ -1712,7 +1712,7 @@ def add_db_general(ap, hcores): ap2.add_argument("--no-idx", metavar="PTN", type=u, default=noidx, help="regex: disable indexing of matching absolute-filesystem-paths during e2ds folder scan (must be specified as one big regex, not multiple times) (volflag=noidx)") ap2.add_argument("--no-dirsz", action="store_true", help="do not show total recursive size of folders in listings, show inode size instead; slightly faster (volflag=nodirsz)") ap2.add_argument("--re-dirsz", action="store_true", help="if the directory-sizes in the UI are bonkers, use this along with \033[33m-e2dsa\033[0m to rebuild the index from scratch") - ap2.add_argument("--no-dhash", action="store_true", help="disable rescan acceleration; do full database integrity check -- makes the db ~5%% smaller and bootup/rescans 3~10x slower") + ap2.add_argument("--no-dhash", action="store_true", help="disable rescan acceleration; do full database integrity check -- makes the db ~5%% smaller and boot-up/rescans 3~10x slower") ap2.add_argument("--re-dhash", action="store_true", help="force a cache rebuild on startup; enable this once if it gets out of sync (should never be necessary)") ap2.add_argument("--no-forget", action="store_true", help="never forget indexed files, even when deleted from disk -- makes it impossible to ever upload the same file twice -- only useful for offloading uploads to a cloud service or something (volflag=noforget)") ap2.add_argument("--forget-ip", metavar="MIN", type=int, default=0, help="remove uploader-IP from database (and make unpost impossible) \033[33mMIN\033[0m minutes after upload, for GDPR reasons. Default [\033[32m0\033[0m] is never-forget. [\033[32m1440\033[0m]=day, [\033[32m10080\033[0m]=week, [\033[32m43200\033[0m]=month. (volflag=forget_ip)") diff --git a/copyparty/authsrv.py b/copyparty/authsrv.py index eb853b52..08935991 100644 --- a/copyparty/authsrv.py +++ b/copyparty/authsrv.py @@ -2657,7 +2657,7 @@ class AuthSrv(object): for mtp in local_only_mtp: if mtp not in local_mte: - t = 'volume "/{}" defines metadata tag "{}", but doesnt use it in "-mte" (or with "cmte" in its volflags)' + t = 'volume "/{}" defines metadata tag "{}", but does not use it in "-mte" (or with "cmte" in its volflags)' self.log(t.format(vol.vpath, mtp), 1) errors = True diff --git a/copyparty/cert.py b/copyparty/cert.py index 49fa9ea2..704fb4bc 100644 --- a/copyparty/cert.py +++ b/copyparty/cert.py @@ -151,7 +151,7 @@ def _gen_srv(log: "RootLogger", args, netdevs: dict[str, Netdev]): try: expiry, inf = _read_crt(args, "srv.pem") if "sans" not in inf: - raise Exception("no useable cert found") + raise Exception("no usable cert found") expired = time.time() + args.crt_sdays * 60 * 60 * 24 * 0.5 > expiry if expired: diff --git a/copyparty/httpcli.py b/copyparty/httpcli.py index 6e547863..02c2de16 100644 --- a/copyparty/httpcli.py +++ b/copyparty/httpcli.py @@ -2103,7 +2103,7 @@ class HttpCli(object): oh["Dav"] = "1, 2" oh["Ms-Author-Via"] = "DAV" - # winxp-webdav doesnt know what 204 is + # winxp-webdav does not know what 204 is self.send_headers(0, 200) return True @@ -2342,7 +2342,7 @@ class HttpCli(object): open_ka = {"fun": lzma.open, "preset": lv[alg]} open_a = ["wb"] else: - self.log("fallthrough? thats a bug", 1) + self.log("fallthrough? that's a bug", 1) suffix = "-{:.6f}-{}".format(time.time(), self.dip()) nameless = not fn diff --git a/copyparty/mdns.py b/copyparty/mdns.py index 69929081..2200b686 100644 --- a/copyparty/mdns.py +++ b/copyparty/mdns.py @@ -322,7 +322,7 @@ class MDNS(MCast): self.build_replies() Daemon(self.send_probes) zf = time.time() + 2 - self.probing = zf # cant unicast so give everyone an extra sec + self.probing = zf # can't unicast so give everyone an extra sec self.unsolicited = [zf, zf + 1, zf + 3, zf + 7] # rfc-8.3 try: diff --git a/copyparty/mtag.py b/copyparty/mtag.py index a22fa0dd..2ddf1aec 100644 --- a/copyparty/mtag.py +++ b/copyparty/mtag.py @@ -320,7 +320,7 @@ def parse_ffprobe( if v2 is None or zf > v2: ret[rk] = zf except: - # sqlite doesnt care but the code below does + # sqlite does not care but the code below does if v1 not in ["N/A"]: ret[rk] = v1 else: diff --git a/copyparty/stolen/ifaddr/_shared.py b/copyparty/stolen/ifaddr/_shared.py index 1f8ae931..d8969685 100644 --- a/copyparty/stolen/ifaddr/_shared.py +++ b/copyparty/stolen/ifaddr/_shared.py @@ -41,7 +41,7 @@ class Adapter(object): #: `{846EE342-7039-11DE-9D20-806E6F6E6963}`. self.name = name - #: Human readable name of the adpater. On Linux this + #: Human readable name of the adapter. On Linux this #: is currently the same as :attr:`name`. On Windows #: this is the name of the device. self.nice_name = nice_name diff --git a/copyparty/svchub.py b/copyparty/svchub.py index 9c954528..677d44ba 100644 --- a/copyparty/svchub.py +++ b/copyparty/svchub.py @@ -1338,7 +1338,7 @@ class SvcHub(object): pass self.shutdown() - # cant join; eats signals on win10 + # can't join; eats signals on win10 while not self.stopped: time.sleep(0.1) else: diff --git a/copyparty/szip.py b/copyparty/szip.py index 91fa2a34..551680b7 100644 --- a/copyparty/szip.py +++ b/copyparty/szip.py @@ -119,7 +119,7 @@ def gen_hdr( # infozip-macos: 0100 0000 a481 (spec-ver 1e03) file:644 # infozip-macos: 0100 0100 0080 (spec-ver 1e03) file:000 # win10-zip: 0000 2000 0000 (spec-ver xx00) FILE_ATTRIBUTE_ARCHIVE - ret += b"\x00\x00\x00\x00\xa4\x81" # unx + ret += b"\x00\x00\x00\x00\xa4\x81" # unix # ret += b"\x00\x00\x20\x00\x00\x00" # fat # 4b local-header-ofs diff --git a/copyparty/web/browser.js b/copyparty/web/browser.js index 090ae45b..132b2954 100644 --- a/copyparty/web/browser.js +++ b/copyparty/web/browser.js @@ -464,7 +464,7 @@ if (1) "m3u_clip": "m3u playlist now copied to clipboard\n\nyou should create a new textfile named something.m3u and paste the playlist in that document; this will make it playable", "gt_vau": "don't show videos, just play the audio\">๐ŸŽง", - "gt_msel": "enable file selection; ctrl-click a file to override$N$N<em>when active: doubleclick a file / folder to open it</em>$N$NHotkey: S\">multiselect", + "gt_msel": "enable file selection; ctrl-click a file to override$N$N<em>when active: double-click a file / folder to open it</em>$N$NHotkey: S\">multiselect", "gt_crop": "center-crop thumbnails\">crop", "gt_3x": "hi-res thumbnails\">3x", "gt_zoom": "zoom", @@ -2238,7 +2238,7 @@ var vbar = (function () { setTimeout(function () { if (IPHONE && mp.au && mul < 0.9 && mp.au.volume == 1) - toast.inf(6, 'volume doesnt work because apple says no'); + toast.inf(6, 'volume does not work because apple says no'); }, 1); } can.onmousedown = function (e) { diff --git a/copyparty/web/md.html b/copyparty/web/md.html index 1dfed659..457e665c 100644 --- a/copyparty/web/md.html +++ b/copyparty/web/md.html @@ -20,7 +20,7 @@ save sbs editor -
+
tools prettify table (ctrl-k) non-ascii: iterate (ctrl-u) diff --git a/copyparty/web/shares.html b/copyparty/web/shares.html index c85a641d..b26c9c08 100644 --- a/copyparty/web/shares.html +++ b/copyparty/web/shares.html @@ -19,7 +19,7 @@ files control-panel - axs = perms (read,write,move,delet) + axs = perms (read,write,move,delete) nf = numFiles (0=dir) min/hrs = time left diff --git a/copyparty/web/util.js b/copyparty/web/util.js index a63f25b1..ed928f67 100644 --- a/copyparty/web/util.js +++ b/copyparty/web/util.js @@ -2294,7 +2294,7 @@ function xhrchk(xhr, prefix, e404, lvl, tag) { var errtxt = ((xhr.response && xhr.response.err) || xhr.responseText) || '', suf = '', fun = toast[lvl || 'err'], - is_cf = /[Cc]loud[f]lare|>Just a mo[m]ent|#cf-b[u]bbles|Chec[k]ing your br[o]wser|\/chall[e]nge-platform|"chall[e]nge-error|nable Ja[v]aScript and cook/.test(errtxt); + is_cf = /[Cc]loud[f]lare|>Just a mo[m]ent|#cf-b[u]bbles|Chec[k]ing your br[o]wser|\/chall[e]nge-platform|"chall[e]nge-error|nable Ja[v]aScript and cook/.test(errtxt); # codespell:ignore if (errtxt.startsWith('
'))
         suf = '\n\nerror-details: ยซ' + unpre(errtxt).split('\n')[0].trim() + 'ยป';
diff --git a/docs/changelog.md b/docs/changelog.md
index 2b5a8b95..b77e9d25 100644
--- a/docs/changelog.md
+++ b/docs/changelog.md
@@ -18,7 +18,7 @@
   * does not include the smb-server, so antivirus doesn't think it's malware 7f5810f1
   * english-only, because antivirus apparently hates certain translations too 7f5810f1
   * renamed the webdav-config `.bat` to `.txt` because clearly only one of those are "dangerous" b624a387
-* show volumes with permssion `h` in the navpane fff7291d 
+* show volumes with permission `h` in the navpane fff7291d 
 * #937 global-option `--notooltips` to default-disable tooltips a325353b
 
 ## ๐Ÿฉน bugfixes
@@ -55,7 +55,7 @@
 * audioplayer: show embedded coverart as fallback for cover.jpg in OS widgets 9746b4e2
 * #928 option to [hide certain ui-elements](https://github.com/9001/copyparty/tree/hovudstraum/docs/rice#hide-ui-elements), either with volflags or url-params 98da5cc5
 * #911 users can now avoid autoban according to permissions 6f02812a
-* verbosity and permssion options for `?stack` 677fd8ee
+* verbosity and permission options for `?stack` 677fd8ee
   * default is now admin-only; previously it was "admin or read+write"
 
 ## ๐Ÿฉน bugfixes
@@ -452,12 +452,12 @@
 * #567 .raw image thumbnails (thx @ar-nelson!) 0177a9b4
   * available in docker-images `iv` and `dj`
 * #561 epub thumbnails (thx @Scotsguy!) 9435e6b2
-* #252 music thumbnails use embdded coverart if available 98d117b8
+* #252 music thumbnails use embedded coverart if available 98d117b8
   * thumbnails folder `.hist/th` must be deleted to take effect
 * #530 show username of uploaders in file listings; requires `a` (admin) permission 4df033ec
 * #604 a new group `@acct` which automatically contains all known usernames 68907eaf
 * controlpanel has a dedicated "logout all sessions" button, similar to the logout-link in the browser f4a3fba2
-* #397 accounts can be restricted to certian IPs 62e072a2
+* #397 accounts can be restricted to certain IPs 62e072a2
 * #504 automatic login through tailscale auth a4649d1e
 * #533 sticky qr-code with `--qr-pin 1` 1ebe06f5
 * #572 button to abort copy/move 715d374e
@@ -519,7 +519,7 @@
   * if you have enabled password hashing (`ah-alg: argon2` or similar) then you will need to hash your passwords again after enabling usernames, hashing them as `username:password:`
 * #468 add Greek translation (thx @chamdim!) 50f46187 392abd06
 * #471 add Czech translation (thx @kubakubakuba!) c9556583
-* #515 support systemd socket acivation (thx @mati1210!) 9b9d2a92
+* #515 support systemd socket activation (thx @mati1210!) 9b9d2a92
 * #523 add QR-code to the connectpage bcc3b156
 * #513 optional EOL-conversion for texteditor 8b31ed88
 * controlpanel refresh-button now toggles automatic refresh 7ae84dea
@@ -1081,7 +1081,7 @@ get the party going anywhere, anytime, no OS required! [download flashdrive imag
 
 * option to specify max-size for download-as-zip/tar 494179bd 0a33336d
   * either the total download size (`--zipmaxs 500M`), and/or max number of files (`--zipmaxn 9k`)
-  * applies to all uesrs by default; can also ignore limits for authorized users (`--zipmaxu`)
+  * applies to all users by default; can also ignore limits for authorized users (`--zipmaxu`)
   * errormessage can be customized with `--zipmaxt "winter is coming... but this download isn't"`
 * [appledoubles](https://a.ocv.me/pub/stuff/?doc=appledoubles-and-friends.txt) are detected and skipped when uploading with the browser-UI 78208405
 * IdP-volumes can be filtered by group 9c2c4237
@@ -1536,7 +1536,7 @@ this release includes a build of [copyparty-winpe64.exe](https://github.com/9001
 * webdav: support listing unmapped root with infinite recursion (Depth:0) 21a3f369
 * embed current sort config into media URLs (gallery/music) 0f257c93 4cfdc4c5 01670827
   * ensures that anyone clicking your link will see the files in the same order as you
-  * can be confgured serverside (`--hsortn`, volflag `hsortn`) and clientside (`#sort` in settings)
+  * can be configured serverside (`--hsortn`, volflag `hsortn`) and clientside (`#sort` in settings)
 * URL and UI options to disable checksum calculation of PUT, bup, basic uploads c5a000d2
   * also allows [choosing either md5, sha1, sha256, or blake2](https://github.com/9001/copyparty/blob/hovudstraum/docs/devnotes.md#write) instead of the default sha512
   * can give uploads a nice speed boost when copyparty is running on a potato
@@ -2729,7 +2729,7 @@ probably last release before v1.10 (IdP), please watch warmly
 * now possible to POST files without having to set the `act: bput` multipart field 9bc09ce9
   * mainly to support [igloo irc](https://github.com/9001/copyparty#client-examples) and other simplistic upload clients
 * try to point the linux oom-killer at FFmpeg so it doesn't kill innocent processes instead dc8e621d
-  * only works if copyparty has acces to /proc, so not in prisonparty, and maybe not in docker (todo)
+  * only works if copyparty has access to /proc, so not in prisonparty, and maybe not in docker (todo)
 * UX:
   * do another search immediately if a search-filter gets unchecked a4239a46
   * several ie11 fixes (keyboard hotkeys and a working text editor) 2fd2c6b9
@@ -3049,7 +3049,7 @@ just adding requested features, nothing important
   * `--no-crop` and the `nocrop` volflag now sets the default value of this instead of forcing the setting
   * thumbnail cleanup is now more granular, cleaning full-jpg separately from cropped-webp for example
 * set default sort order with `--sort` or volflag `sort`
-  * one or more comma-separated values; `tags/Cirle,tags/.tn,tags/Artist,tags/Title,href`
+  * one or more comma-separated values; `tags/Circle,tags/.tn,tags/Artist,tags/Title,href`
     * see the column header tooltips in the browser to know what names (`id`) to use
   * prefix a column name with `-` for descending sort
   * specifying a sort order in the client will override all server-defined ones
@@ -3215,7 +3215,7 @@ hello! it's been a while, an entire day even...
 * iPhones and iPads are now able to...
   * 9986136d play entire albums while the screen is off without the music randomly stopping
     * apple keeps breaking AudioContext in new and interesting ways; time to give up (no more equalizer)
-  * 1c0d9789 perform search queries and execude js code
+  * 1c0d9789 perform search queries and execute js code
     * by translating [smart-quotes](https://stackoverflow.com/questions/48678359/ios-11-safari-html-disable-smart-punctuation) into regular `'` and `"` characters
 * python 3.12 support
   * technically a bugfix since it was added [a year ago](https://github.com/9001/copyparty/commit/32e22dfe) way before the first py3.12 alpha was released but turns out i botched it, oh well
@@ -3699,7 +3699,7 @@ don't get excited! nothing new and revolutionary, but `xvol` and `xdev` changed
 
 ## bugfixes
 * more sqlite query-planner twiddling
-  * deleting files is MUCH faster now, and uploads / bootup might be a bit better too
+  * deleting files is MUCH faster now, and uploads / boot-up might be a bit better too
 * webdav optimizations / compliance
   * should make some webdav clients run faster than before
   * in very related news, the webdav-client in [rclone](https://github.com/rclone/rclone/) v1.63 ([currently beta](https://beta.rclone.org/?filter=latest)) will be ***FAST!***
@@ -4054,7 +4054,7 @@ hello from warsaw airport (goodbye japan ;_;)
 * browser ui didn't allow specifying number of threads for file search
 * dont panic if a digit key is pressed while viewing an image
 * workaround [linux kernel bug](https://utcc.utoronto.ca/~cks/space/blog/linux/KernelBindBugIn6016) causing log spam on dualstack
-  * ~~related issue (also mostly harmless) will be fixed next relese 01077068~~ 
+  * ~~related issue (also mostly harmless) will be fixed next release 01077068~~ 
     * they fixed it in linux 6.1 so these workarounds will be gone too
 
 
@@ -4199,7 +4199,7 @@ named after [that other thing](https://en.wikipedia.org/wiki/Tower_of_Babel), no
 * display a server [qr-code](https://github.com/9001/copyparty#qr-code) [(screenshot)](https://user-images.githubusercontent.com/241032/194728533-6f00849b-c6ac-43c6-9359-83e454d11e00.png) on startup
   * primarily for running copyparty on a phone and accessing it from another
   * optionally specify a path or password with `--qrl lootbox/?pw=hunter2`
-  * uses the server's exteral ip (default route) unless `--qri` specifies a domain / ip-prefix
+  * uses the server's external ip (default route) unless `--qri` specifies a domain / ip-prefix
   * classic cp437 `โ–„` `โ–€` for space efficiency; some misbehaving terminals / fonts need `--qrz 2`
 * new permission `G` returns the filekey of uploaded files for users without read-access
   * when combined with permission `w` and volflag `fk`, uploaded files will not be accessible unless the filekey is provided in the url, and `G` provides the filekey to the uploader unlike `g`
@@ -4420,7 +4420,7 @@ after two exciting releases, time for something boring
 
 ## new features
 *but wait, there's more!* ย  not only do you get the [multithreaded file hashing](https://github.com/9001/copyparty/releases/tag/v1.3.11) but also --
-* faster bootup and volume reindexing when `-e2ds` (file indexing) is enabled
+* faster boot-up and volume reindexing when `-e2ds` (file indexing) is enabled
   * `3x` faster is probably the average on most instances; more files per folder = faster
   * `9x` faster on a 36 TiB zfs music/media nas with `-e2ts` (metadata indexing), dropping from 46sec to 5sec
   * and `34x` on another zfs box, 63sec -> 1.8sec
@@ -5151,7 +5151,7 @@ so far just mild annoyances, nothing bad
 * last release broke folder listings if you left off the trailing slash in the url
   * also fix the markdown-editor breadcrumbs which made that very obvious
 * when running without `-e2d`, don't proactively create symlinks for dupe uploads
-  * prevents the client from accidentally pushing superflous links
+  * prevents the client from accidentally pushing superfluous links
 * ui didn't update correctly when navigating into a folder with indexing disabled
 
 # other changes
@@ -5268,7 +5268,7 @@ not super important but recommended
 # new features
 * navigate into textfiles using hotkeys (`v, k`)
 * close various UI elements by repeatedly hitting the Escape key
-* doubleclick files/folders to open them (in the grid view, when multiselect is enabled)
+* double-click files/folders to open them (in the grid view, when multiselect is enabled)
 * `--s-wr-slp` sets a delay between socket writes, simulates a slow network during downloads
 * `--s-wr-sz` sets socket write size, default 256 KiB (was hardcoded 32 KiB until now)
   * this increase download speed by ~50% (to around 3 GiB/s) when running on windows / where sendfile is unavailable
@@ -5337,7 +5337,7 @@ not super important but recommended
   * supported formats: same as transcoder + `mp3` `ogg` `opus`
   * needs FFmpeg and FFprobe, can be disabled with `--no-athumb`
 * **textfile viewer**
-  * with syntax hilighting
+  * with syntax highlighting
     * can be disabled by deleting `web/deps/prism.js.gz` or building the sfx with `no-hl`
   * and list of textfiles in the navpane; toggle with hotkey `v`
 * **navpane context dock**
@@ -5427,7 +5427,7 @@ for future releases, you can use a script to automatically grab the latest sfx a
 * latest gzip edition of the sfx: [v0.11.18](https://github.com/9001/copyparty/releases/tag/v0.11.18)
 
 ## bugfixes
-* currently-playing song didn't hilight correctly
+* currently-playing song didn't highlight correctly
 
 
 
@@ -5479,7 +5479,7 @@ thx to @Bevinsky and @icxes for the ux suggestions
   * and `?raw` POST without content-type is now allowed
 * file-listing is refreshed when all up2k uploads complete
 * new option `--ign-ebind` to continue startup even if one of the IPs / ports couldn't be listened on
-* new option `--ign-ebind-all` to run even if copyparty can't receieve any connections at all
+* new option `--ign-ebind-all` to run even if copyparty can't receive any connections at all
   * maybe useful for monitoring folders and hashing new files on a timer or something
 
 ## bugfixes
@@ -5562,7 +5562,7 @@ thx to @Bevinsky and @icxes for the ux suggestions
 
 ## bugfixes
 * race-condition initializing the up2k-client when dropping files into the browser and you're not using https
-* hilight active folder in the navpane even when the browser and copyparty disagrees on how to urlencode
+* highlight active folder in the navpane even when the browser and copyparty disagrees on how to urlencode
 * hide prologue/epilogue while search results are open
 * toasts could redefine css
 
@@ -5668,10 +5668,10 @@ thx to @Bevinsky and @icxes for the ux suggestions
 * loss of access to anon-read/write folders after logging in
   * affected filesearch, regular searching, and volume listings
 * more aggressively `no-cache`, preventing cloudflare from eating api calls
-* after deleteing all files inside a folder, don't delete the folder itself
+* after deleting all files inside a folder, don't delete the folder itself
   * was intended behavior but fairly confusing
 * don't reshow tooltips when alt-tabbing
-* accessibility: always hilight focused things
+* accessibility: always highlight focused things
 * markdown-editor modification poller doesn't cause performance issues after having a document open for several months
 * mtp plugins [audio-bpm.py](https://github.com/9001/copyparty/blob/hovudstraum/bin/mtag/audio-bpm.py) and [audio-key.py](https://github.com/9001/copyparty/blob/hovudstraum/bin/mtag/audio-key.py) explicitly asks for just the first audio stream, which prevents ffmpeg from transcoding video (nice)
 
@@ -6006,7 +6006,7 @@ note: `copyparty-sfx.py` is https://github.com/9001/copyparty/commit/5955940b wh
 * image-thumbnails: apply rotation hints from exif
 * image-thumbnails: higher quality AND slightly smaller
   * fix loss of detail on resize
-* argument `--th-mt` specifices number of cores to use for thumbnailing
+* argument `--th-mt` specifies number of cores to use for thumbnailing
   * default is 0 which means all cores
 
 ## bugfixes
@@ -6616,7 +6616,7 @@ all these changelogs are sorted by importance btw so here's the least important
 
 ## new features
 * video player -- click a webm/mp4 in the grid-view to play it
-  * only does formats/codecs supported by your browser for now (thats the foreshadowing part)
+  * only does formats/codecs supported by your browser for now (that's the foreshadowing part)
 * `--th-clean 0` disables periodic cleanup of the thumbnail cache 
 
 ## bugfixes
@@ -6793,7 +6793,7 @@ unless the upload was paused for 6 hours or more, it can probably be resumed by
 
 ## new features suggested by kipu
 * pause uploads by setting `parallel uploads` to `0`
-* increase max `parallel uploads` to 16 (using +/- buttons) and 64 (by manual text entry) to accomodate sad american internet connections
+* increase max `parallel uploads` to 16 (using +/- buttons) and 64 (by manual text entry) to accommodate sad american internet connections
 * also look for `cover.jpg` and `cover.png` as folder thumbnails by default, adjustable with `--th-covers`
 * change the description in the sfx so the corruption warning is the first plaintext you see
 
@@ -6947,7 +6947,7 @@ reason: [v0.11.12](https://github.com/9001/copyparty/releases/tag/v0.11.12) chan
 
 ## new features
 * much faster filesearch in chrome
-* skip hidden colums in the /np text
+* skip hidden columns in the /np text
 * support cygpaths when pointing to mtag tools
 
 ## bugfixes
@@ -7009,10 +7009,10 @@ this release includes [copyparty-sfx-gz.py](https://github.com/9001/copyparty/re
 * hotkey `b` to toggle breadcrumbs / directory tree sidebar
   * hotkey `p` is now play/pause
   * hotkey `m` is now parent-directory
-* hilight the playing track in gallery mode too
+* highlight the playing track in gallery mode too
 * toggle to disable the now-playing clipboard buttons
 * added lots of tooltips
-  * threw aray the competing tooltip implementations and did a single ok one
+  * threw array the competing tooltip implementations and did a single ok one
 * more accurate error-messages on upload failures due to filesystem permissions
 * add another output to the sfx repacker (gzip-compressed python sfx)
 
@@ -7060,7 +7060,7 @@ this release includes [copyparty-sfx-gz.py](https://github.com/9001/copyparty/re
 ## new features
 * media player can now continue into the next folder
 * eq curve supports both positive and negative values (and scales down to avoid clipping)
-* browser columns now fully hide when hidden; reenable them in the settings tab
+* browser columns now fully hide when hidden; re-enable them in the settings tab
 * other ux tweaks
   * add some icons
   * tree control buttons remain visible when scrolling
@@ -7184,7 +7184,7 @@ nothing really important happened since [v0.11.6](https://github.com/9001/copypa
 
 
 โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€  
-# 2021-0608-0741  `v0.11.10`  dont leave me hangin
+# 2021-0608-0741  `v0.11.10`  dont leave me hanging
 
 * drop-in upgrade, no additional steps since [v0.11.1](https://github.com/9001/copyparty/releases/tag/v0.11.1)
 * nothing really important since [v0.11.6](https://github.com/9001/copyparty/releases/tag/v0.11.6)
@@ -7676,7 +7676,7 @@ not so strong anymore
 โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€  
 # 2021-0315-0013  `v0.9.8`  the strongest for a while
 
-nothing more to add or fix for now (barely avoided adding bpm/tempo detection using keyfinder and vamp+qm since thats just too ridiculous)
+nothing more to add or fix for now (barely avoided adding bpm/tempo detection using keyfinder and vamp+qm since that's just too ridiculous)
 
 * browser: correct music playback order after sorting
 * browser: no more glitching on resize in non-tree-mode
@@ -7958,7 +7958,7 @@ valvrave-stop.jpg
 โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€  
 # 2020-1117-2258  `v0.5.4`  edovprim
 
-(get it? becasue reverse proxy haha)
+(get it? because reverse proxy haha)
 
 * reverse-proxy support
 * filetype column in the browser
diff --git a/docs/chungus.conf b/docs/chungus.conf
index a8e34516..ef52ebc7 100644
--- a/docs/chungus.conf
+++ b/docs/chungus.conf
@@ -1248,7 +1248,7 @@
   # if the directory-sizes in the UI are bonkers, use this along with -e2dsa to rebuild the index from scratch
   re-dirsz
 
-  # disable rescan acceleration; do full database integrity check -- makes the db ~5% smaller and bootup/rescans 3~10x slower
+  # disable rescan acceleration; do full database integrity check -- makes the db ~5% smaller and boot-up/rescans 3~10x slower
   no-dhash
 
   # force a cache rebuild on startup; enable this once if it gets out of sync (should never be necessary)
diff --git a/docs/hls.html b/docs/hls.html
index a1fe4fab..a29529fc 100644
--- a/docs/hls.html
+++ b/docs/hls.html
@@ -27,7 +27,7 @@ hls.on(Hls.Events.MEDIA_ATTACHED, function() {
 general good news:
 - doesn't need fixed-length segments; ok to let x264 pick optimal keyframes and slice on those
 - hls.js polls the m3u8 for new segments, scales the duration accordingly, seeking works great
-- the sfx will grow by 66 KiB since that's how small hls.js can get, wait thats not good
+- the sfx will grow by 66 KiB since that's how small hls.js can get, wait that's not good
 
 # vod, creates m3u8 at the end, fixed keyframes, v bad
 ffmpeg -hide_banner -threads 0 -flags -global_header -i ..\CowboyBebopMovie-OP1.webm -vf scale=1280:-4,format=yuv420p -ac 2 -c:a libopus -b:a 128k -c:v libx264 -preset slow -crf 24 -maxrate:v 5M -bufsize:v 10M -g 120 -keyint_min 120 -sc_threshold 0 -hls_time 4 -hls_playlist_type vod -hls_segment_filename v%05d.ts v.m3u8
diff --git a/docs/notes.sh b/docs/notes.sh
index 9152d4ac..c7e214fb 100644
--- a/docs/notes.sh
+++ b/docs/notes.sh
@@ -123,7 +123,7 @@ grep '"name": "2021-07-18 02-17-59.mkv"' fug.log | head -n 1 | sed -r 's/.*"hash
 
 
 ##
-## js oneliners
+## js one-liners
 
 # get all up2k search result URLs
 var t=[]; var b=document.location.href.split('#')[0].slice(0, -1); document.querySelectorAll('#u2tab .prog a').forEach((x) => {t.push(b+encodeURI(x.getAttribute("href")))}); console.log(t.join("\n"));
@@ -133,7 +133,7 @@ var s=mknod('style');s.innerHTML='*[data-ln]:before {content:attr(data-ln)!impor
 
 
 ##
-## bash oneliners
+## bash one-liners
 
 # get the size and video-id of all youtube vids in folder, assuming filename ends with -id.ext, and create a copyparty search query
 find -maxdepth 1 -printf '%s %p\n' | sort -n | awk '!/-([0-9a-zA-Z_-]{11})\.(mkv|mp4|webm)$/{next} {sub(/\.[^\.]+$/,"");n=length($0);v=substr($0,n-10);print $1, v}' | tee /dev/stderr | awk 'BEGIN {p="("} {printf("%s name like *-%s.* ",p,$2);p="or"} END {print ")\n"}' | cat >&2
@@ -271,7 +271,7 @@ brew install python@2
 pip install virtualenv
 
 # fix firefox phantom breakpoints,
-# suggestions from bugtracker, doesnt work (debugger is not attachable)
+# suggestions from bugtracker, does not work (debugger is not attachable)
 devtools settings >> advanced >> enable browser chrome debugging + enable remote debugging
 burger > developer >> browser toolbox  (ctrl-alt-shift-i)
 iframe btn topright >> chrome://devtools/content/debugger/index.html
diff --git a/docs/synology-dsm.md b/docs/synology-dsm.md
index b9388b53..b8fc165d 100644
--- a/docs/synology-dsm.md
+++ b/docs/synology-dsm.md
@@ -72,7 +72,7 @@ okay now continue with one of these:
 * open the `Package Center` and install the [Container Manager package](https://ocv.me/copyparty/doc/pics/dsm72-01.png) by `Docker Inc.`
 * open the `Container Manager` app
 * go to the `Registry` tab and search for `copyparty`
-* [doubleclick copyparty/ac](https://ocv.me/copyparty/doc/pics/dsm72-02.png) and keep the [default `latest`](https://ocv.me/copyparty/doc/pics/dsm72-03.png) when it asks you which tag to use
+* [double-click copyparty/ac](https://ocv.me/copyparty/doc/pics/dsm72-02.png) and keep the [default `latest`](https://ocv.me/copyparty/doc/pics/dsm72-03.png) when it asks you which tag to use
 * switch to the `Container` tab and click `Create`
 * [choose `copyparty/ac:latest`](https://ocv.me/copyparty/doc/pics/dsm72-04.png) and click `Next`
 
@@ -93,7 +93,7 @@ if you're using DSM 7.1 or older, then you don't have [Container Manager](https:
 * open the `Package Center` and install the [Docker package](https://ocv.me/copyparty/doc/pics/dsm71-01.png) by `Docker Inc.`
 * open the `Docker` app
 * go to the `Registry` tab and search for `copyparty`
-* [doubleclick copyparty/ac](https://ocv.me/copyparty/doc/pics/dsm71-02.png) and keep the [default `latest`](https://ocv.me/copyparty/doc/pics/dsm71-03.png) when it asks you which tag to use
+* [double-click copyparty/ac](https://ocv.me/copyparty/doc/pics/dsm71-02.png) and keep the [default `latest`](https://ocv.me/copyparty/doc/pics/dsm71-03.png) when it asks you which tag to use
 * switch to the `Container` tab and click `Create`
 * [choose `copyparty/ac:latest`](https://ocv.me/copyparty/doc/pics/dsm71-04.png) and `Next`
 * in the [Network](https://ocv.me/copyparty/doc/pics/dsm71-05.png) window, keep the default `Use the selected networks: [x] bridge`
diff --git a/docs/up2k.txt b/docs/up2k.txt
index 5c07b4e4..35c387ec 100644
--- a/docs/up2k.txt
+++ b/docs/up2k.txt
@@ -17,7 +17,7 @@ server creates session id and replies with the same json:
 		secretsalt, name, size, *hash
 	]))[:32].replace('+','-').replace('/','_')
 
-cilent uploads each chunk:
+client uploads each chunk:
 POST application/octet-stream
 X-Up2k-Hash: fUGShzwcSAmw5IbQ3y_2TUrI8a89LYQO-kW0o0rRcU0
 X-Up2k-Wark: CVNt9EYhgTFHU3xiK6gL-0ciJFopshvo
diff --git a/docs/versus.md b/docs/versus.md
index 2c293a14..da083424 100644
--- a/docs/versus.md
+++ b/docs/versus.md
@@ -82,9 +82,9 @@ currently up to date with [awesome-selfhosted](https://github.com/awesome-selfho
 <&Kethsar> copyparty is very much bloat ed, so yeah
 ```
 
-the table headers in the matrixes below are the different softwares, with a quick review of each software in the next section
+the table headers in the matrixes below are the different software, with a quick review of each software in the next section
 
-the softwares,
+the software,
 
 [a]: https://github.com/9001/copyparty "copyparty"
 [b]: https://github.com/rejetto/hfs2/ "hfs2"
@@ -114,7 +114,7 @@ the softwares,
 * `l` = [sftpgo][l]
 * `m` = [arozos][m]
 
-some softwares not in the matrixes,
+some software not in the matrixes,
 * [updog](#updog)
 * [goshs](#goshs)
 * [gimme-that](#gimmethat)
@@ -259,7 +259,7 @@ symbol legend,
   * you can successfully play `$'\355\221'` with mpv through mounting a remote copyparty server with rclone, pog
 * `a`/copyparty remarks:
   * extremely minimal samba/cifs server
-  * netscape 4 / ie6 support is mostly listed as a joke altho some people have actually found it useful ([ie4 tho](https://user-images.githubusercontent.com/241032/118192791-fb31fe00-b446-11eb-9647-898ea8efc1f7.png))
+  * netscape 4 / ie6 support is mostly listed as a joke although some people have actually found it useful ([ie4 tho](https://user-images.githubusercontent.com/241032/118192791-fb31fe00-b446-11eb-9647-898ea8efc1f7.png))
 * `l`/sftpgo translates mojibake filenames into valid utf-8 (information loss)
 * `m`/arozos has readonly-support for older browsers; no uploading
 
diff --git a/pyproject.toml b/pyproject.toml
index c5d41e31..cb0e3a76 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -163,3 +163,11 @@ follow_imports = "silent"
 
 [[tool.mypy.overrides]]
 no_implicit_reexport = false
+
+[tool.codespell]
+# Ref: https://github.com/codespell-project/codespell#using-a-config-file
+skip = '.git*,*.svg,*.lock,*.css,*.min.*,tl,pyproject.toml,*.patch'
+check-hidden = true
+# ignore camelcase
+ignore-regex = '(\b[a-z]+[A-Z][A-Za-z0-9]*\b|\[[a-z]\][a-z]+\b)'
+ignore-words-list = 'caf,cips,ans,ded,wark,warks,halp,ser,oen,datas,slin,nd,te,pres,ths,wast,clen,fo,nin,fils,tre,tred,tread,noice,unick,memers,idel'
diff --git a/scripts/copyparty-repack.sh b/scripts/copyparty-repack.sh
index c4de5d23..e45c6abd 100755
--- a/scripts/copyparty-repack.sh
+++ b/scripts/copyparty-repack.sh
@@ -27,7 +27,7 @@ set -e
 # 270004  copyparty-extras/sfx-lite/copyparty-sfx.py
 # 293159  copyparty-extras/sfx-lite/copyparty-sfx-gz.py
 #           `- also removed the codemirror markdown editor
-#              and the text-viewer syntax hilighting,
+#              and the text-viewer syntax highlighting,
 #              only essential features remaining
 #
 # 646297  copyparty-extras/copyparty-1.0.14.tar.gz
diff --git a/scripts/docker/README.md b/scripts/docker/README.md
index 7f4222f7..d39687bc 100644
--- a/scripts/docker/README.md
+++ b/scripts/docker/README.md
@@ -1,4 +1,4 @@
-copyparty is availabe in these repos:
+copyparty is available in these repos:
 * https://hub.docker.com/u/copyparty
 * https://github.com/9001?tab=packages&repo_name=copyparty
 
diff --git a/scripts/docker/innvikler.sh b/scripts/docker/innvikler.sh
index e79ffde1..e3f8c87d 100644
--- a/scripts/docker/innvikler.sh
+++ b/scripts/docker/innvikler.sh
@@ -79,7 +79,7 @@ smoketest() {
 # two-for-one:
 # 1) smoketest copyparty even starts
 # 2) build any bytecode we missed
-# this tends to race other builders (alle gode ting er tre)
+# this tends to race other builders (alle gode ting er tre)  # codespell:ignore
 cd /z
 python3 -m copyparty \
   --ign-ebind -p$((1024+RANDOM)),$((1024+RANDOM)),$((1024+RANDOM)) \
diff --git a/scripts/docker/make.sh b/scripts/docker/make.sh
index 3535fffa..aeb975f6 100755
--- a/scripts/docker/make.sh
+++ b/scripts/docker/make.sh
@@ -133,7 +133,7 @@ filt=
             ) 2> >(tee $a.err | sed "s/^/$aa:/" >&2) > >(tee $a.out | sed "s/^/$aa:/") &
         done
         [ -e err ] && {
-            echo somethign died,
+            echo something died,
             cat err
             pkill -P $$
             exit 1
@@ -144,7 +144,7 @@ filt=
     done
     wait
     [ -e err ] && {
-        echo somethign died,
+        echo something died,
         cat err
         pkill -P $$
         exit 1
diff --git a/scripts/make-sfx.sh b/scripts/make-sfx.sh
index f9476c33..1f4dd3ab 100755
--- a/scripts/make-sfx.sh
+++ b/scripts/make-sfx.sh
@@ -243,7 +243,7 @@ necho() {
 	rm -rf pyftpdlib-* pyftpdlib/test
 	patch -s -p1 <../scripts/patches/pyftpdlib-win313.patch
 	patch -s -p1 <../scripts/patches/pyftpdlib-fe80.patch
-	for f in pyftpdlib/_async{hat,ore}.py; do
+	for f in pyftpdlib/_async{hat,ore}.py; do  # codespell:ignore
 		[ -e "$f" ] || continue;
 		iawk 'NR<4||NR>27||!/^#/;NR==4{print"# license: https://opensource.org/licenses/ISC\n"}' $f
 	done
diff --git a/scripts/pyinstaller/build.sh b/scripts/pyinstaller/build.sh
index a7944a5c..7faac906 100644
--- a/scripts/pyinstaller/build.sh
+++ b/scripts/pyinstaller/build.sh
@@ -137,10 +137,10 @@ dist/copyparty.exe --version
 
 csum=$(sha512sum uplod.log
-cat uplod.log
+curl -fkT dist/copyparty.exe -HPW:wark https://192.168.123.1:3923/copyparty$esuf.exe >upload.log
+cat upload.log
 
-grep -q $csum uplod.log && echo upload OK || {
+grep -q $csum upload.log && echo upload OK || {
     echo UPLOAD FAILED
     exit 1
 }
diff --git a/scripts/pyinstaller/deps.txt b/scripts/pyinstaller/deps.txt
index 30dc9c19..bfb89b06 100644
--- a/scripts/pyinstaller/deps.txt
+++ b/scripts/pyinstaller/deps.txt
@@ -7,13 +7,13 @@ https://pypi.org/project/pywin32-ctypes/#files
 https://github.com/git-for-windows/git/releases/latest
 https://github.com/upx/upx/releases/latest
 
-# win10 additionals
+# win10 additional
 https://pypi.org/project/Jinja2/#files
 https://pypi.org/project/MarkupSafe/#files
 https://pypi.org/project/mutagen/#files
 https://pypi.org/project/Pillow/#files
 
-# win7 additionals
+# win7 additional
 https://pypi.org/project/future/#files
 https://pypi.org/project/importlib-metadata/#files
 https://pypi.org/project/pip/#files
diff --git a/scripts/pyinstaller/up2k.sh b/scripts/pyinstaller/up2k.sh
index 54cc7e8e..b349d1b9 100644
--- a/scripts/pyinstaller/up2k.sh
+++ b/scripts/pyinstaller/up2k.sh
@@ -36,10 +36,10 @@ $APPDATA/python/python37/scripts/pyinstaller -y --clean --upx-dir=. up2k.spec
 
 csum=$(sha512sum uplod.log
-cat uplod.log
+curl -fkT dist/u2c.exe -HPW:wark https://192.168.123.1:3923/ >upload.log
+cat upload.log
 
-grep -q $csum uplod.log && echo upload OK || {
+grep -q $csum upload.log && echo upload OK || {
     echo UPLOAD FAILED
     exit 1
 }
diff --git a/scripts/tl.js b/scripts/tl.js
index 7c9010f7..554840a5 100644
--- a/scripts/tl.js
+++ b/scripts/tl.js
@@ -490,7 +490,7 @@ Ls.hmn = {
 	"m3u_clip": "m3u playlist now copied to clipboard\n\nyou should create a new textfile named something.m3u and paste the playlist in that document; this will make it playable",
 
 	"gt_vau": "don't show videos, just play the audio\">๐ŸŽง",
-	"gt_msel": "enable file selection; ctrl-click a file to override$N$N<em>when active: doubleclick a file / folder to open it</em>$N$NHotkey: S\">multiselect",
+	"gt_msel": "enable file selection; ctrl-click a file to override$N$N<em>when active: double-click a file / folder to open it</em>$N$NHotkey: S\">multiselect",
 	"gt_crop": "center-crop thumbnails\">crop",
 	"gt_3x": "hi-res thumbnails\">3x",
 	"gt_zoom": "zoom",
diff --git a/srv/extend.md b/srv/extend.md
index bc9911b9..34a77f0c 100644
--- a/srv/extend.md
+++ b/srv/extend.md
@@ -30,7 +30,7 @@ finally ./except/these/ones.md
 
 
 ### also-this.md
-whic hshoud be ./except/also-this.md
+which should be ./except/also-this.md