Hyperdrive.el User Manual

Next:   [Contents][Index]

Hyperdrive.el User Manual

Hyperdrive is a P2P, real-time, local-first, versioned filesystem designed for easy peer-to-peer file sharing. hyperdrive.el is an independent project built by USHIN which provides an Emacs interface for managing hyperdrives.

hyperdrive.el is in early development. If something breaks, please see Troubleshooting.

This manual is for hyperdrive.el version 0.5.1.

Table of Contents


1 Freedom to copy

Copyright © 2023, 2024 USHIN, Inc.

Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, with the Front-Cover Texts being “A GNU Manual,” and with the Back-Cover Texts as in (a) below. A copy of the license is included in the section entitled “GNU Free Documentation License.”

(a) The FSF’s Back-Cover Text is: “You have the freedom to copy and modify this GNU manual.”


2 Installation


2.1 Install Emacs

hyperdrive.el requires GNU Emacs version 28.1 or later.


2.2 Install curl

hyperdrive.el requires a reasonably up-to-date version of curl.

Feel free to skip this step. curl may already installed on your machine, and hyperdrive.el will warn you otherwise.


2.3 Install hyperdrive.el

hyperdrive.el can be installed from NonGNU ELPA with M-x package-refresh-contents then M-x package-install RET hyperdrive.

After installing with NonGNU ELPA, you can later upgrade to a newer version of hyperdrive.el by running M-x package-refresh-contents then M-x package-upgrade RET hyperdrive. On Emacs 28, If package-upgrade is not available as a command, display the list of packages with M-x list-packages, select hyperdrive, and click the Install button.


2.4 Install hyper-gateway-ushin

hyperdrive.el relies on hyper-gateway-ushin for talking to the hypercore network.

After installing hyperdrive.el (see Install hyperdrive.el), run M-x hyperdrive-install to download and install the gateway.

Alternatively, follow the manual installation instructions.


3 Example configuration

After following the installation instructions, you can add this snippet to your ~/.emacs.d/init.el file. This code will make the keyboard shortcut C-c h (hold the Control key and tap c, then release both and tap h) open the hyperdrive menu command. It will also enable the “Hyperdrive” menu bar:

(when (package-installed-p 'hyperdrive)
  (global-set-key (kbd "C-c h") #'hyperdrive-menu)
  (menu-bar-mode +1)
  (hyperdrive-menu-bar-mode +1)
  (with-eval-after-load 'hyperdrive
    (context-menu-mode +1)
    (hyperdrive-context-menu-mode +1)))

With (use-package)use-package:

(use-package hyperdrive
  :bind ("C-c h" . hyperdrive-menu)
  :init
  (menu-bar-mode +1)
  (hyperdrive-menu-bar-mode +1)
  :config
  (context-menu-mode +1)
  (hyperdrive-context-menu-mode +1))

4 Usage

Be careful about what you share!
When you upload a file, beware:
  You may delete your own copy,
  But gone it may not be.
On the network it still may be there.

4.1 Install the gateway

Run M-x hyperdrive-install to download and install the gateway program (see hyper-gateway-ushin):

Command: hyperdrive-install

Download and install the gateway. Prompts for confirmation before downloading.

Command: hyperdrive-cancel-install

Cancel installation in progress.


4.3 Context menu support

If you enable hyperdrive-context-menu-mode, either in your configuration (see Example configuration) or with M-x hyperdrive-context-menu-mode, “Hyperdrive”-related menu items should appear when you right-click on hyperdrive names, like petname:foo. If you don’t see hyperdrive context menu items when you right-click on hyperdrive names, please check that context-menu-mode is enabled (it is enabled automatically by hyperdrive-context-menu-mode).

Command: hyperdrive-context-menu-mode

Enable the “Hyperdrive” right-click context menu.

If you have disabled context-menu-mode, you can still use the context menu bar by putting point on a hyperdrive name and pressing S-<f10>.


4.4 Hyperdrive menu command

M-x hyperdrive-menu is a keyboard-driven interface to many hyperdrive.el commands. With the menu open, press one of highlit keys or key combinations to invoke the command displayed next to it. Different commands are available in hyperdrive-menu when you’re inside a hyperdrive file, directory, or neither.

While inside the hyperdrive-menu, press ? twice to open this hyperdrive.el info manual. You can also press ? followed by a command’s key sequence to get help for that command. (more tips on getting help)

If you press C-u (universal prefix argument) before a key sequence, the command may behave differently, e.g., by prompting for more information. You can jump between hyperdrive-menu commands with the up and down arrow keys. Press C-g to close the menu.

Command: hyperdrive-menu

Show the hyperdrive menu interface.

For more on this type of user interface, please refer to the (transient)Transient documentation. To learn about the commands available in hyperdrive-menu, read on!


4.5 Start/stop the gateway

To connect with peers, you’ll need to start the gateway (see hyper-gateway-ushin). The current running status of the gateway can be seen in hyperdrive-menu (see Hyperdrive menu command) and in the “Hyperdrive” menu bar (see Menu bar support).

Command: hyperdrive-start

Start the gateway.

User Option: hyperdrive-gateway-ready-hook

Hook run when the gateway becomes responsive after hyperdrive-start. One of the default hooks, hyperdrive-check-gateway-version, will warn you if you’re running an outdated version of the gateway.

Command: hyperdrive-stop

Stop the gateway.

User Option: hyperdrive-gateway-dead-hook

Hook run when the gateway is no longer live after hyperdrive-stop.

Command: hyperdrive-restart

Restart the gateway.

Command: hyperdrive-gateway-version

Say the version of the gateway which is running.


4.5.1 Advanced gateway customization

User Option: hyperdrive-gateway-start-function

Function run to start the gateway. By default, hyperdrive.el will start the gateway as an Emacs subprocess.

User Option: hyperdrive-gateway-stop-function

Function run to stop the gateway.

User Option: hyperdrive-gateway-live-predicate

Function run to check that the gateway process is live.


4.6 Open a hyperdrive

You can open a hyperdrive folder or file by pasting in a hyper:// URL after M-x hyperdrive-open-url. Try loading USHIN’s hyperdrive:

hyper://aaj45d88g4eenu76rpmwzjiabsof1w8u6fufq6oogyhjk1ubygxy/
Command: hyperdrive-open-url

Open a hyperdrive file or directory by its hyper:// URL.

The following commands let you select and visit one of the hyperdrives you’ve already created or visited:

Command: hyperdrive-find-file

Open a hyperdrive file or directory by choosing one of your known hyperdrives and a path inside it. Like find-file, this command can be used to create a new file inside your own hyperdrives.

Command: hyperdrive-view-file

Like hyperdrive-find-file, but open the file in (emacs)view-mode.


4.6.1 Directory view

hyperdrive.el offers a Dired-like (see (emacs)Dired) interface for exploring hyperdrive directories. In the directory view, the file size color indicates how much of a file you have already downloaded:

green

fully downloaded (hyperdrive-size-fully-downloaded)

yellow

partially downloaded (hyperdrive-size-partially-downloaded)

red

not downloaded (hyperdrive-size-not-downloaded)

Mouse over the file size to see exactly how many blocks make up the file and how many of them you have downloaded.

The following bindings are available in the directory view by default:

Key: n (hyperdrive-ewoc-next)
Key: p (hyperdrive-ewoc-previous)

Move between entries.

Key: RET (hyperdrive-dir-find-file)

Open the file or directory at point.

Key: o (hyperdrive-dir-find-file-other-window)
Key: <mouse-1>
Key: <mouse-2>

Open the file or directory at point in a new window.

Key: v (hyperdrive-dir-view-file)

Open the file or directory at point in (emacs)view-mode.

Key: ^ (hyperdrive-up)

Go up to the parent directory.

Key: g (revert-buffer)

Refresh the directory to display potential updates.

Key: s (hyperdrive-dir-sort)

Sort directory contents by the current column. To sort by a different column, click on the column header or use the universal prefix argument (C-u s).

Key: d (hyperdrive-dir-download-file)

Download the file at point to disk.

Key: D (hyperdrive-delete)

Delete the file or directory (recursively) at point.

Key: F (hyperdrive-forget-file)

Delete your local copy of the file at point.

Key: H (hyperdrive-dir-history)

Open the version history (see View the hyperdrive version history) of file at point.

Key: w (hyperdrive-dir-copy-url)

Copy the URL of the file or directory at point.

Key: j (imenu)

Open imenu to quickly jump to a file in the current directory.

Key: ? (hyperdrive-menu)

Open hyperdrive-menu (see Hyperdrive menu command).

Key: + (hyperdrive-create-directory-no-op)

This command signals an error, because you cannot create empty directories (see No empty directories).

You can customize the directory view with the following options:

User Option: hyperdrive-directory-display-buffer-action

Display buffer action for hyperdrive directories. Passed to display-buffer, which see.

User Option: hyperdrive-directory-sort

Column by which directory entries are sorted by default. Internally, a cons cell of (COLUMN . DIRECTION), the COLUMN being one of the directory listing columns (name, size, or mtime) and DIRECTION being one of :ascending or :descending.


4.6.2 File view

The following keybindings are available inside the file view by default:

Key: C-x x g (hyperdrive-revert-buffer-quick)

Refresh the file to display potential updates. This command remaps the global revert-buffer-quick keybinding.

Key: C-x C-j (hyperdrive-up)

Jump to the parent hyperdrive directory from a hyperdrive file or directory buffer. This command remaps the global dired-jump keybinding.

For security reasons, hyperdrive.el does not enable major modes based on file extension unless the hyperdrive has been marked as “safe” with M-x hyperdrive-mark-as-safe (see Mark a hyperdrive as safe).

The following customization options affect how files are displayed:

User Option: hyperdrive-render-html

Control how HTML hyperdrive files are displayed. By default, HTML pages are rendered in Emacs with (eww)EWW. If nil, raw HTML will be displayed.


Previous: , Up: Open a hyperdrive   [Contents][Index]

4.6.3 Unknown paths

When you attempt to load a file or folder that doesn’t appear to exist, hyperdrive.el will prompt you to take action:

  • h (history) to open the version history for that file.
  • u (up) to open the parent directory containing that file or folder
  • r (recurse) to go up the directory tree until a directory is found or until you get to the root directory.
  • e (explain) to open this section of the hyperdrive Info manual.
  • q (exit) to exit,
  • ? (help) to show a help message.

If you attempt to load the root directory (hyper://PUBLIC-KEY/) of a hyperdrive with a valid-looking public key which you’ve never loaded before and for which no peers are currently found, hyperdrive.el should warn you that no peers were found for that drive. This might mean that the drive doesn’t exist or just that you’re not connected to anyone who knows about it.

If you attempt to load a file or directory for a hyperdrive with a malformed public key, hyperdrive.el should ask you to double-check the URL.


4.7 Create a hyperdrive

You can have multiple hyperdrives, each one containing its own set of files. Run M-x hyperdrive-new then type in a seed (see Seeds) to create a new hyperdrive. That seed will be combined with your secret master key (see Master key) to produce a public key (see Public keys) that uniquely identifies that hyperdrive.

Command: hyperdrive-new

Create a new hyperdrive from a seed string.

When you create a new drive, your chosen seed is used as its petname (see Petnames) by default.


4.8 Write to a hyperdrive

After modifying a file in one of your hyperdrives, save-buffer will silently update the current hyperdrive file with the new content.

Key: C-x C-s (save-buffer)

Save the current hyperdrive file buffer to its location.

Key: C-x s (save-some-buffers)

Save all modified hyperdrive file buffers to their locations. This command’s primary purpose is to save normal file buffers, and hyperdrive.el has integrated with it.

hyperdrive.el will prompt to save modified hyperdrive files before exiting Emacs. If you want the command save-some-buffers to always prompt to save hyperdrive files in addition to regular files, set save-some-buffers-default-predicate to t.

Command: hyperdrive-write-buffer

Write the current buffer to a hyperdrive by choosing one of hyperdrives you have created as well as the path in that hyperdrive where you want to store the file.


4.10 Delete a hyperdrive file

Please note that deleted files can be accessed by loading a prior version of the hyperdrive (see View the hyperdrive version history).

Command: hyperdrive-delete

Delete the hyperdrive file in the current buffer.

This command also has a keybinding in the directory view (see Directory view).


4.11 Forget a hyperdrive file

Please note that forgetting a file may result in data loss if it cannot be loaded from another peer on the network.

It is possible to “forget” your local copy of a hyperdrive file in order to save disk space. “Forgetting” a file does not delete the file from the hyperdrive and does not increment the hyperdrive’s version number.

Command: hyperdrive-forget-file

Delete your local copy of the file for the current buffer.

This command also has a keybinding in the directory view (see Directory view). When you forget a file, the file size of its directory listing will turn red, indicating that you no longer have a copy of the file.


4.12 View the hyperdrive version history

Hyperdrives are versioned, meaning that you can explore the history of changes made to hyperdrive files (see Versioning).

Command: hyperdrive-open-previous-version

Open the previous version of the current hyperdrive file or directory.

Command: hyperdrive-open-previous-version

Open the next version of the current hyperdrive file or directory.

Command: hyperdrive-open-at-version

Open the current hyperdrive file or directory at a specific version number. To open the file or directory at its hyperdrive’s latest version, leave the version blank.

The following keybindings are available when visiting an old version of a hyperdrive file (hyperdrive-blob-mode):

Key: n (hyperdrive-open-next-version)
Key: p (hyperdrive-open-previous-version)

Traverse version history for the current file.

Key: q (kill-current-buffer)

4.12.1 History buffer

The history buffer displays the entire known history of a hyperdrive file. For an explanation of how it works, see Partial version data.

Like in the directory view, the file size color in the history view indicates how much of a file you have already downloaded.

Command: hyperdrive-history

Open the history buffer for the current hyperdrive file. To open the history for a different file, use the universal prefix argument like this: C-u M-x hyperdrive-history.

The following keybindings are available inside the history view by default:

Key: n (hyperdrive-ewoc-next)
Key: p (hyperdrive-ewoc-previous)

Move between entries.

Key: + (hyperdrive-history-load)

Load all drive metadata, including version metadata, then reload the history buffer.

Key: RET (hyperdrive-history-find-file)

Open the file at the start of the version range at point. When the version range at point is unknown, run hyperdrive-history-load.

Key: o (hyperdrive-history-find-file-other-window)
Key: <mouse-1>
Key: <mouse-2>

Open the file at the start of the version range at point in a new window.

Key: v (hyperdrive-history-view-file)

Open the file at the start of the version range at point in (emacs)view-mode. When the version range at point is unknown, run hyperdrive-history-load.

Key: w (hyperdrive-history-copy-url)

Copy the URL of the file at the start of the version range at point.

Key: d (hyperdrive-history-download-file)

Download the file at the start of the version range at point.

Key: = (hyperdrive-history-diff)

Display the differences between the version at point and the prior version.

Key: F (hyperdrive-history-forget-file)

Delete your local copy of the file for the version range at point.

To act on the latest known version of the file, use these keybindings on the header line displaying the file description.

You can customize the history view:

User Option: hyperdrive-history-display-buffer-action

Display buffer action for hyperdrive history buffers. Passed to display-buffer, which see.


4.13 Describe a hyperdrive

To see information about a hyperdrive, such as its public key, seed, petname, nickname, domains, writability, local disk usage, or other metadata, run hyperdrive-describe-hyperdrive. For more on what this information means, see Naming.

Command: hyperdrive-describe-hyperdrive

Display the description of the hyperdrive containing the current file or directory. To describe a different hyperdrive, use the universal prefix argument: C-u M-x hyperdrive-describe-hyperdrive.


4.14 Name a hyperdrive

hyperdrive.el supports different ways to identify hyperdrives (see Naming). The following commands can be used to name hyperdrives:

Command: hyperdrive-set-petname

Set the petname (see Petnames) of the hyperdrive for the current hyperdrive file or directory. You can’t use the same petname for multiple hyperdrives. To set the petname of a different hyperdrive, use the universal prefix argument: C-u M-x hyperdrive-set-petname.

Command: hyperdrive-set-nickname

Set the nickname (see Nicknames) of the hyperdrive for the current hyperdrive file or directory. You can only set the nickname for a hyperdrive which you previously created. To set the nickname of a different hyperdrive, use the universal prefix argument like this: C-u M-x hyperdrive-set-nickname.


4.15 Explore the peer graph

hyperdrive.el includes a tool for building and exploring a network of sources of information. This peer graph feature is based on three ways relating to other peers:

Sources

Sources are peers whose content you want to see. Sources are also used to discover other sources.

Blockers

Blockers are peers whose blocked peers will be hidden from your view. Blockers are also used to discover other blockers.

Blocked

Blocked are peers whose content you do not want to see.

For a video demonstration and explanation of the peer graph, see peer graph, transclusion!


4.15.1 Customization

User Option: hyperdrive-peer-graph-sources-max-hops-default

Default maximum number of hops to go out when gathering source. Defaults to 3.

User Option: hyperdrive-peer-graph-blockers-max-hops-default

Default maximum number of hops to go out when gathering blockers. Defaults to 3.

User Option: hyperdrive-peer-graph-show-sources-p-default

Whether to show sources in peer graph and list views by default. Defaults to t.

User Option: hyperdrive-peer-graph-show-blockers-p-default

Whether to show blockers in peer graph and list views by default. Defaults to t.

User Option: hyperdrive-peer-graph-show-blocked-p-default

Whether to show blocked in peer graph and list views by default:

all

Show blocked sources and non-sources.

sources

Show only blocked sources. (default)

non-sources

Show only blocked non-sources.

nil

Hide blocked peers.

User Option: hyperdrive-peer-graph-shortest-paths-p-default

Whether to show only the shortest paths between peers by default. Defaults to t.

User Option: hyperdrive-peer-graph-buffer-name

Buffer name to use for peer graph buffers. Defaults to "*hyperdrive-peer-graph*".

User Option: hyperdrive-peer-graph-list-buffer-name

Buffer name to use for peer list buffers. Defaults to "*hyperdrive-peer-graph-list*".

User Option: hyperdrive-peer-graph-list-apply-filters

Whether the filters applied to the peer graph should affect the peer list as well. Defaults to t.

For example, if non-nil and hyperdrive-peer-graph-show-sources-p is nil, then sources will not appear in the peer list. Regardless of this options value, you can fold the sections of the peer list with magit-section-toggle, bound to TAB.

User Option: hyperdrive-peer-graph-display-buffer-action

Display buffer action for peer graph buffers. Passed to display-buffer, which see.

User Option: hyperdrive-peer-graph-list-display-buffer-action

Display buffer action for peer list buffers. Passed to display-buffer, which see.

User Option: hyperdrive-peer-graph-auto-resize-on-window-resize

Whether to redraw the graph when the window displaying its buffer resizes. Value has the same meaning as image-auto-resize-on-window-resize, defined in image-mode.el.

User Option: hyperdrive-peer-graph-menu-display-action

Display buffer action for transient peer graph menu. See (transient)transient.el info manual for more information.

User Option: hyperdrive-sbb-view-layout

Name of the Graphviz layout engine to use. See Graphviz documentation on layout for more information. Defaults to "dot".

User Option: hyperdrive-sbb-view-overlap

How to handle overlapping nodes. See GraphViz documentation on overlap for more information. Defaults to "voronoi".

Only affects fdp, neato, sfdp, circo, twopi layouts.

User Option: hyperdrive-sbb-view-sources-color

Color used for sources in peer graph. Defaults to foreground of hyperdrive-sbb-source face.

User Option: hyperdrive-sbb-view-blockers-color

Color used for blockers in peer graph. Defaults to foreground of hyperdrive-sbb-blocker face.

User Option: hyperdrive-sbb-view-blocked-color

Color used for blocked in peer graph. Defaults to foreground of hyperdrive-sbb-blocked face.


4.16 Bookmark a hyperdrive

You can use the built-in bookmark-set, bookmark-jump, and bookmark-list functions to store and jump to a hyperdrive file or directory.

Command: hyperdrive-bookmark-jump

Select a hyperdrive bookmark and jump to it.

Command: hyperdrive-bookmark-list

View a list of hyperdrive bookmarks.


4.17 Stream audio and video

When you use hyperdrive-find-file or some other command to open a streamable audio/video file, Emacs will use an external program to stream that video from the network. After the stream finishes, the audio/video file is stored locally.

User Option: hyperdrive-stream-player-command

Command used to play streamable URLs externally. Default uses mpv. There also exists a preconfigured option for VLC media player.


4.18 Download hyperdrive files

You can “download” a hyperdrive file to your local filesystem, meaning that hyperdrive.el will (1) download the file from the network if it hasn’t done so already and then (2) copy the file contents to a file-path on your machine of your choosing. The following commands may be run while offline.

Command: hyperdrive-download

Download a hyperdrive file by selecting a hyperdrive and a path.

Command: hyperdrive-download-url

Download a hyperdrive file by pasting in a hyper:// URL.

User Option: hyperdrive-download-directory

Location where hyperdrive-download-url will download files. Defaults to eww-download-directory or, if not bound, the home directory.


4.19 Upload files from your filesystem

If you already have a file on your local filesystem that you’d like to put on a hyperdrive, you can “upload” it. Note that the following commands add files to a hyperdrive, but those files are not automatically “uploaded” to anyone else’s machine in the traditional sense. Files are only shared on the network when other peers request them from your node. The following commands may be run while offline.

Command: hyperdrive-upload-file

Upload a single file from your filesystem. By default, the selected file will be placed in your hyperdrive’s root directory, but you can edit the filepath before uploading.

Command: hyperdrive-upload-files

Upload multiple files from your filesystem. The selected files will be uploaded into the same target directory in your hyperdrive.

On Emacs 29+, you can upload an image which you previously copied to your clipboard from an external program with M-x yank-media.


4.19.1 Mirror a whole directory

For uploading more than a few files, you can use hyperdrive-mirror.

Command: hyperdrive-mirror

Upload a directory, mirroring its subdirectory structure in your hyperdrive. This command prompts for a source directory on your local filesystem from which to upload files as well as a hyperdrive and target directory inside of it where the files will end up.

The source and target directories will be compared, and only the files which are “new locally” (they don’t already exist on the drive) or “newer locally” (they have been locally modified since a previous upload) will be uploaded. Files which are the “same” (they have the same timestamp as in the drive) or are “older locally” (they have been modified on the drive more recently than on the filesystem) will not be uploaded.

With a universal prefix argument (C-u M-x hyperdrive-mirror), it additionally prompts for a filter argument to programmatically determine which files will be considered for upload. With two universal prefix arguments (C-u C-u M-x hyperdrive-mirror), matching files will be uploaded without the confirmation step.

As a confirmation step, hyperdrive-mirror displays each file to be uploaded alongside the URL in the hyperdrive where it will end up. The following keybindings are available in hyperdrive-mirror-mode:

Key: C-c C-c (hyperdrive-mirror-do-upload)

Upload all of the files in the “To Upload” section.

Key: TAB (magit-section-toggle)

Fold or unfold the section at point.


4.20 Mark a hyperdrive as safe

For security reasons, hyperdrive.el does not enable major modes based on file extension unless the hyperdrive has been marked as “safe.” When opening a file in a hyperdrive marked as “unknown” (the default), hyperdrive.el will prompt you to mark the drive as “safe”, “unsafe”, or “unknown”. Files in hyperdrives which are marked as “safe” are always opened in the appropriate major mode with set-auto-mode. Files in hyperdrives which are marked as “unsafe” are opened in fundamental-mode (no major mode).

Command: hyperdrive-mark-as-safe

Mark a hyperdrive as “safe”, “unsafe”, or “unknown”. This command can also be invoked from hyperdrive-menu-hyperdrive and the menu bar.


4.21 Purge a hyperdrive

Data which has been purged from your local machine may still be available on the network.

Data which has been purged from your local machine may not be recoverable.

Command: hyperdrive-purge

Remove all data related to a hyperdrive. This command will prompt for confirmation before deleting anything. In addition to the hyperdrive’s file content and metadata, hyperdrive-purge also deletes relevant metadata persisted in the hyperdrive-hyperdrives variable.


4.22 Non-interactive use

In writing your own functions to extend hyperdrive.el, you can use hyperdrive-by-slot to access a hyperdrive by its metadata:

Function: hyperdrive-by-slot

This function accepts a hyperdrive seed, petname, or public key, and returns the hyperdrive struct.


4.22.1 Non-interactive use example: hyperdrive-mirror

You can use the following snippet to recursively upload all of the files from your local filesystem’s ~/blog/ directory into the /blog/ directory of a hyperdrive you previously created with petname "foo":

(hyperdrive-mirror
 "~/blog/"
 (hyperdrive-by-slot 'petname "foo")
 "/blog/")

To upload the same files without confirmation, add :no-confirm t.

Now let’s say that you want to upload only those files tagged as “public” using Protesilaos Stavrou’s Denote file-naming scheme. The following snippet includes a FILTER key whose value is a regular expression against which every expanded filename will be tested.

(hyperdrive-mirror
 "~/blog/"
 (hyperdrive-by-slot 'petname "foo")
 "/blog/"
 :filter "_public")

Alternatively, you could select files by tag with Karl Voit’s filetags. Either way allows for a “non-splitting” approach where public and private files exist in the same directory.

FILTER may also be a function, which receives the expanded filename as its only argument. For example, the following snippet will mirror only those files in ~/blog/ which are smaller than 5MB:

(hyperdrive-mirror
 "~/blog/"
 (hyperdrive-by-slot 'petname "foo")
 "/blog/"
 :filter (lambda (file) (> (* 5 1024 1024)
                      (file-attribute-size
                       (file-attributes file)))))

4.23 Org-transclusion integration

The hyperdrive-org-transclusion package adds support for transcluding hyperdrive files and parts of hyperdrive files with org-transclusion.

To use this feature, please install hyperdrive-org-transclusion with M-x package-install RET hyperdrive-org-transclusion and then add the following snippet to your configuration:

(with-eval-after-load 'org-transclusion
  (hyperdrive-org-transclusion-mode +1))

You can then run M-x org-transclusion-add on the following link to transclude the Org heading with the property CUSTOM_ID: emacs inside the /software.org file inside the USHIN hyperdrive:

#+transclude: [[hyper://aaj45d88g4eenu76rpmwzjiabsof1w8u6fufq6oogyhjk1ubygxy/software.org#%3A%3A%23emacs]]

4.24 Miscellaneous features


4.24.1 Find file at point integration

If you have enabled find-file-at-point (ffap) bindings with M-x ffap-bindings, you can open a hyperdrive link by putting the point on it and pressing C-x C-f.


4.24.2 Embark integration

Embark users can run embark-act in the completing-read interface for selecting a hyperdrive in order to select an alternative action for the selected hyperdrive.


4.24.3 Webjump integration

You can jump to a hyper:// link with M-x webjump after adding it to webjump-sites:

(add-to-list
 'webjump-sites
 '("USHIN Hyperdrive" . "hyper://aaj45d88g4eenu76rpmwzjiabsof1w8u6fufq6oogyhjk1ubygxy/"))

5 Concepts


5.1 Hyperdrive

Hyperdrive is a virtual filesystem which you can use to share files on the peer-to-peer (P2P) hyper network. It’s a folder with a globally unique link starting with hyper:// that you can put files into and other peers can pull files out of (if they have the link).

Anyone with the link to your hyperdrive can download its contents directly from your computer. There’s no need to make an account or rely on a third party to pass the data along. Anyone who has a copy of the content in your hyperdrive can serve it to others. This means that your hyperdrive can circulate on the hyper network even when you’re offline.

Hyperdrive is single-writer, meaning that you are the only one who change a hyperdrive that you’ve created. Files in a hyperdrive are cryptographically signed to ensure that the files you share aren’t tampered with.

You can make as many hyperdrives as you like; the only limitation is your own disk space.

Hyperdrive is offline-first since you can view files which were previously downloaded even when your machine is disconnected from the rest of the network. It’s also local-first, since you can connect with peers on a local network even without an internet connection.

Unlike BitTorrent, another P2P protocol for sharing files, hyperdrives are mutable. If you share a link to your hyperdrive and then later add, update, or delete files inside it, peers will be able to access your latest changes at the same link. When you make revisions to a hyperdrive, the old versions of your files can still be accessed by peers on the network. See Versioning for more information.


Next: , Up: Hyperdrive   [Contents][Index]

5.1.1 Sparse replication

Hyperdrives are sparsely replicated, meaning that peers can download particular files from a hyperdrive without having to download the whole drive. This reduces both load times and disk usage.


Next: , Previous: , Up: Hyperdrive   [Contents][Index]

5.1.2 Versioning

Hyperdrives are versioned, meaning that it is possible to explore a hyperdrive as it was in the past. Version numbers indicate the hyperdrive’s version. For example, hyper://PUBLIC-KEY/$/version/50/ refers to the fiftieth version of the hyperdrive identified by PUBLIC-KEY. If you want to load the latest version, leave out the /$/version/N part. For example, if you run…

M-x hyperdrive-open-url RET hyper://PUBLIC-KEY/foo.org RET

…then hyperdrive.el will attempt to find /foo.org inside the latest version of that hyperdrive.

Whenever you add a file, remove a file, or change a file, the hyperdrive’s version number gets incremented by 1. The version number tells you how many times the hyperdrive has been modified, not how many times a particular file has been modified. For example, let’s say that the current version of your hyperdrive at hyper://PUBLIC-KEY/ is 50. If you add a new file at hyper://PUBLIC-KEY/bar.org, the latest version of your hyperdrive will become 51.

Since /bar.org did not exist before version 51, if you attempt to load hyper://PUBLIC-KEY/$/version/50/bar.org, hyperdrive.el should warn you that nothing exists at that URL. If you add another file at hyper://PUBLIC-KEY/quux.org, your hyperdrive’s latest version will become 52. For the moment, hyper://PUBLIC-KEY/bar.org, hyper://PUBLIC-KEY/$/version/51/bar.org, and hyper://PUBLIC-KEY/$/version/52/bar.org, all point to the same version of /bar.org. If you then make a change to /bar.org, your hyperdrive’s latest version will become 53. Now hyper://PUBLIC-KEY/bar.org and hyper://PUBLIC-KEY/$/version/53/bar.org will point to the latest version of /bar.org, while the original version will be available at version 51 or 52.

Here’s the mockup of the history view for /bar.org so far, the hyperdrive’s latest version being 53:

Version rangeexists
53yes
51-52yes
1-50no

The table shows that /bar.org was created at version 51 and modified at version 53. The final version range number in the table is 53, indicating that the hyperdrive’s latest version is 53.

If you delete /bar.org then try to load hyper://PUBLIC-KEY/bar.org, hyperdrive.el will open an empty buffer for you to author a new file. If another peer attempts to load that URL, hyperdrive.el will warn "URL not found", since you are the only one who can modify your drive. All peers can view the old file contents at the versioned URLs.

Since only the current version of a hyperdrive file can be updated, hyperdrive.el sets the buffer to read-only whenever a version number is specified in a hyper URL.


5.1.2.1 Partial version data

Because hyperdrives are sparsely replicated (see Sparse replication), hyperdrive.el might not know the full version history of a file. In the history view (see History buffer), ranges of the history which have not yet been downloaded from the network are displayed as “unknown”. You can run the hyperdrive-history-load command to download the full history and reload the history buffer.


Previous: , Up: Hyperdrive   [Contents][Index]

5.1.3 Master key

The secret master key is combined with a seed (see Seeds) to generate a new public key for a hyperdrive when you run hyperdrive-new. Your master key is generated automatically by the gateway.


Next: , Previous: , Up: Concepts   [Contents][Index]

5.2 hyper-gateway-ushin

Hyper-gateway-ushin handles interactions with hyperdrive under the hood, and it runs a local HTTP server which offers a Fetch API to access the Hyperdrive network. In hyperdrive.el, P2P interactions consist mostly of, e.g., GET requests to download files and PUT requests to write files to a hyperdrive.


5.3 Naming

Inspired by Marc Stiegler’s An Introduction to Petname Systems, hyperdrive.el names drives in a three different ways:

Public key

public, globally unique, not human-memorable

Nickname

public, not necessarily unique, human-memorable

Petname

private, locally unique, human-memorable

If hyperdrive.el is like a phonebook, then public keys are phone numbers, nicknames are how your contacts introduce themselves, and petnames are the names you actually write down.

Each drive may also have one or both of the following attributes:

Seed

string used to generate public key

DNS domain

public, globally unique, human-memorable


Next: , Up: Naming   [Contents][Index]

5.3.1 Public keys

Public keys are globally unique identifiers for hyperdrives. They make up the first part of a hyper:// URL. Public keys are 52-character-long z-base-32 encoded keys generated from your master key (see Master key) and a seed string. When you run hyperdrive-new and type a new seed, the gateway automatically generates a new public key.


Next: , Previous: , Up: Naming   [Contents][Index]

5.3.2 Nicknames

Nicknames are public, memorable names which you can give to your own hyperdrives to make them easier for others to recognize. Other users can see your nicknames but cannot change them.

Nicknames are stored in each hyperdrive inside /.well-known/host-meta.json under the name key, as specified in RFC6415.


Next: , Previous: , Up: Naming   [Contents][Index]

5.3.3 Petnames

Petnames are locally unique hyperdrive identifiers. You can give a petname to any hyperdrive you load, whether you created it or not.


Next: , Previous: , Up: Naming   [Contents][Index]

5.3.4 Seeds

Seeds are used in tandem with your secret master key (see Master key) to generate public keys (see Public keys). The same seed and master key will always produce the same public key, so a hyperdrive’s seed cannot be changed. Seeds are local but not secret. To share a drive, you must use a public key or DNS domain (see DNS domains).


Previous: , Up: Naming   [Contents][Index]

5.3.5 DNS domains

It is possible to use DNSLink to link to a hyperdrive with a domain name instead of a public key (see Public keys), like hyper://example.org/path/to/file. Create a TXT record at _dnslink.example.org with the contents /hyper/PUBLIC-KEY (no trailing slash). Note: relying on DNS adds another point of centralization, reducing the durability of your link. hyperdrive.el somewhat mitigates this issue by remembering which public key the DNS record resolved to, so that peers can use the stored public key itself for subsequent connections.

DNS domains are checked for suspicious characters (see (elisp)Suspicious Text).


6 Customization

You can adjust the following options in the customization interface by running M-x customize-group RET hyperdrive RET:

User Option: hyperdrive-gateway-program

Name of executable to run when starting the gateway with hyperdrive-gateway-start-function. hyperdrive-install will install the gateway to this file in hyperdrive-gateway-directory.

User Option: hyperdrive-gateway-directory

Filesystem directory in which the gateway is expected to be found. hyperdrive-install will install the gateway to this location. When starting the gateway, if hyperdrive-gateway-program is not found in this directory, Emacs searches PATH for hyperdrive-gateway-program.

User Option: hyperdrive-gateway-command-args

Command line arguments passed to the gateway when starting the gateway with the default hyperdrive-gateway-start-function.

User Option: hyperdrive-gateway-port

hyperdrive.el will send HTTP requests to the gateway on this port. Defaults to 4973. The default hyperdrive-gateway-start-function will start the gateway on this port.

User Option: hyperdrive-persist-location

Location where persist will store hyperdrive-hyperdrives and hyperdrive-existent-versions. Defaults to nil, meaning that the default persist location will be used.

User Option: hyperdrive-timestamp-format

Format string used for timestamps. Passed to format-time-string, which see.

User Option: hyperdrive-queue-limit

Default number of request sent to the gateway at a time in a queue. Defaults to 20.

User Option: hyperdrive-preferred-formats

List of metadata types used to display hyperdrives. Hyperdrives are displayed using the first available metadata type. See Naming section for what this means.

User Option: hyperdrive-default-entry-format

Format string for displaying hyperdrive entries (files/directories). By default, entries are displayed with the preferred hyperdrive format in brackets (see hyperdrive-preferred-formats), followed by the full entry path, followed by “version: ” and version in parentheses.

User Option: hyperdrive-buffer-name-format

Format string for buffer names of buffers visiting hyperdrive files/directories. By default, this format is like hyperdrive-default-entry-format with the entry name sans directory instead of the full path.

User Option: hyperdrive-formats

Alist mapping hyperdrive and hyperdrive entry metadata to a format string, used in hyperdrive-default-entry-format and hyperdrive-buffer-name-format as well as other places hyperdrives or entries are displayed. By default, each metadatum is prefixed by its type, e.g., the petname foo is displayed by default as petname:foo.

Feel free to adjust the following example configuration for abbreviated labels:

(setq hyperdrive-formats
      '((name . "%s")
        (version . " (%s)")
        (path . "%s")
        (petname . "p:%s")
        (nickname . "n:%s")
        (public-key . "k:%s")
        (short-key . "k:%.8s…")
        (seed . "s:%s")
        (domains . "d:%s")))

With this snippet, the petname foo now displays as p:foo. For further customization, run M-x customize-group RET hyperdrive-entry-format.


6.1 Additional customization

This section mentions ways to change the behavior of hyperdrive.el besides its own customization options.


6.1.1 Completion styles and cycling

hyperdrive.el offers a completing-read interface for selecting a hyperdrive from a list of known hyperdrive. You can customize the completion styles and cycling behavior by customizing the hyperdrive category in completion-category-overrides.


7 Known limitations


7.1 No empty directories

Instead of files and folders, Hyperdrive technically has entries and entry prefixes. In other words, folders don’t exist unless they contain files. This results in potentially unexpected behavior:

  • it is not possible to create empty directories
  • deleting the last file in a folder deletes the folder as well

When a hyperdrive file or folder is not found, hyperdrive.el prompts you for an action (see Unknown paths).


7.2 Files and folders can have the same name

In the current implementation of Hyperdrive, it’s possible for an entry (folder) and an entry prefix (folder) to have the same name, e.g., hyper://PUBLIC-KEY/foo/bar/ and hyper://PUBLIC-KEY/foo/bar. In this case, the folder listing for hyper://PUBLIC-KEY/foo/ would display the bar entry but not the bar/ entry prefix.


7.3 Non-UTF-8 encoded text

We have primarily tested reading and writing files which are UTF-8 encoded. If you use other encodings and you notice issues, please let us know (see Contributing/Getting help).


8 Tips


Up: Tips   [Contents][Index]

8.1 Quick documentation access

There are many ways to read this info manual within Emacs:

Command: hyperdrive-info-manual

Open the hyperdrive.el info manual.

You can also open the hyperdrive.el info manual from hyperdrive-menu by pressing ? twice.

To view documentation for particular hyperdrive.el commands, functions, and variables, press C-h o (describe-symbol). Inside the *Help* buffer that pops open, you can press i (help-goto-info) to jump to the relevant section in the hyperdrive.el manual.


9 Troubleshooting


9.1 Reinstall/upgrade the gateway

Please ensure that you have the expected version of the gateway by running M-x hyperdrive-install.


10 Contributing/Getting help

You’re welcome to join our public XMPP chat room!

Bugs can be submitted to the ushin issue tracker. Patches, comments or questions can be submitted to the ushin public inbox.


11 Uninstallation

If you have installed the gateway with hyperdrive-install, you can delete the gateway which Emacs downloaded according to the values of hyperdrive-gateway-directory and hyperdrive-gateway-program, which is ~/.local/lib/hyperdrive.el/hyper-gateway-ushin by default.

You can delete the user data which hyper-gateway-ushin stores by default in ~/.local/share/hyper-gateway-nodejs.

You can remove hyperdrive.el with M-x package-delete hyperdrive.


12 Acknowledgments

Paula Maas and Martin Turner for inspiration, feedback and undying support.

Adam Porter for rewriting hyperdrive.el and for his work on plz.el.

Mauve Signweaver for their guidance into the world of p2p as well as the development of hyper-gateway.

Jonas Bernoulli for improving hyperdrive-mirror and for his work on transient.el.

Protesilaos Stavrou for design input and user-testing hyperdrive.el.

Eli Zaretskii for guidance about text encoding systems.

Ihor Radchenko for guidance about security and Org mode integration.

Karl Voit for his feedback which inspired the design of hyperdrive-mirror.

Steve Purcell and Akira Komamura for suggestions to improve our CI build manifests.

Eshel Yaron for the suggestion to add hyperdrive-menu-bar-mode.

Chris Rayner for the suggestion to add hyperdrive-org-transclusion-mode.


13 Indices


13.1 Keystroke index


Previous: , Up: Indices   [Contents][Index]

13.4 Concept index

Jump to:   D   H   N   P   S   V  
Index Entry  Section

D
DNS domains: DNS domains

H
hyper-gateway-ushin: hyper-gateway-ushin

N
Naming: Naming
Nicknames: Nicknames

P
Petnames: Petnames
Public keys: Public keys

S
Seeds: Seeds
Sparse replication: Sparse replication

V
Versioning: Versioning

Jump to:   D   H   N   P   S   V  

14 GNU Free Documentation License

Version 1.3, 3 November 2008
Copyright © 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
https://fsf.org/

Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
  1. PREAMBLE

    The purpose of this License is to make a manual, textbook, or other functional and useful document free in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others.

    This License is a kind of “copyleft”, which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software.

    We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference.

  2. APPLICABILITY AND DEFINITIONS

    This License applies to any manual or other work, in any medium, that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. Such a notice grants a world-wide, royalty-free license, unlimited in duration, to use that work under the conditions stated herein. The “Document”, below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as “you”. You accept the license if you copy, modify or distribute the work in a way requiring permission under copyright law.

    A “Modified Version” of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language.

    A “Secondary Section” is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document’s overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (Thus, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them.

    The “Invariant Sections” are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. If a section does not fit the above definition of Secondary then it is not allowed to be designated as Invariant. The Document may contain zero Invariant Sections. If the Document does not identify any Invariant Sections then there are none.

    The “Cover Texts” are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be at most 25 words.

    A “Transparent” copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, that is suitable for revising the document straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup, or absence of markup, has been arranged to thwart or discourage subsequent modification by readers is not Transparent. An image format is not Transparent if used for any substantial amount of text. A copy that is not “Transparent” is called “Opaque”.

    Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML, PostScript or PDF designed for human modification. Examples of transparent image formats include PNG, XCF and JPG. Opaque formats include proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML, PostScript or PDF produced by some word processors for output purposes only.

    The “Title Page” means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, “Title Page” means the text near the most prominent appearance of the work’s title, preceding the beginning of the body of the text.

    The “publisher” means any person or entity that distributes copies of the Document to the public.

    A section “Entitled XYZ” means a named subunit of the Document whose title either is precisely XYZ or contains XYZ in parentheses following text that translates XYZ in another language. (Here XYZ stands for a specific section name mentioned below, such as “Acknowledgements”, “Dedications”, “Endorsements”, or “History”.) To “Preserve the Title” of such a section when you modify the Document means that it remains a section “Entitled XYZ” according to this definition.

    The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. These Warranty Disclaimers are considered to be included by reference in this License, but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License.

  3. VERBATIM COPYING

    You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3.

    You may also lend copies, under the same conditions stated above, and you may publicly display copies.

  4. COPYING IN QUANTITY

    If you publish printed copies (or copies in media that commonly have printed covers) of the Document, numbering more than 100, and the Document’s license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects.

    If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages.

    If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a computer-network location from which the general network-using public has access to download using public-standard network protocols a complete Transparent copy of the Document, free of added material. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public.

    It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document.

  5. MODIFICATIONS

    You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version:

    1. Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission.
    2. List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has fewer than five), unless they release you from this requirement.
    3. State on the Title page the name of the publisher of the Modified Version, as the publisher.
    4. Preserve all the copyright notices of the Document.
    5. Add an appropriate copyright notice for your modifications adjacent to the other copyright notices.
    6. Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below.
    7. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document’s license notice.
    8. Include an unaltered copy of this License.
    9. Preserve the section Entitled “History”, Preserve its Title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section Entitled “History” in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence.
    10. Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the “History” section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission.
    11. For any section Entitled “Acknowledgements” or “Dedications”, Preserve the Title of the section, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein.
    12. Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles.
    13. Delete any section Entitled “Endorsements”. Such a section may not be included in the Modified Version.
    14. Do not retitle any existing section to be Entitled “Endorsements” or to conflict in title with any Invariant Section.
    15. Preserve any Warranty Disclaimers.

    If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version’s license notice. These titles must be distinct from any other section titles.

    You may add a section Entitled “Endorsements”, provided it contains nothing but endorsements of your Modified Version by various parties—for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard.

    You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one.

    The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version.

  6. COMBINING DOCUMENTS

    You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice, and that you preserve all their Warranty Disclaimers.

    The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work.

    In the combination, you must combine any sections Entitled “History” in the various original documents, forming one section Entitled “History”; likewise combine any sections Entitled “Acknowledgements”, and any sections Entitled “Dedications”. You must delete all sections Entitled “Endorsements.”

  7. COLLECTIONS OF DOCUMENTS

    You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects.

    You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document.

  8. AGGREGATION WITH INDEPENDENT WORKS

    A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, is called an “aggregate” if the copyright resulting from the compilation is not used to limit the legal rights of the compilation’s users beyond what the individual works permit. When the Document is included in an aggregate, this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document.

    If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate, the Document’s Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate.

  9. TRANSLATION

    Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License, and all the license notices in the Document, and any Warranty Disclaimers, provided that you also include the original English version of this License and the original versions of those notices and disclaimers. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer, the original version will prevail.

    If a section in the Document is Entitled “Acknowledgements”, “Dedications”, or “History”, the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title.

  10. TERMINATION

    You may not copy, modify, sublicense, or distribute the Document except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, or distribute it is void, and will automatically terminate your rights under this License.

    However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation.

    Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice.

    Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, receipt of a copy of some or all of the same material does not give you any rights to use it.

  11. FUTURE REVISIONS OF THIS LICENSE

    The Free Software Foundation may publish new, revised versions of the GNU Free Documentation License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. See https://www.gnu.org/copyleft/.

    Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License “or any later version” applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation. If the Document specifies that a proxy can decide which future versions of this License can be used, that proxy’s public statement of acceptance of a version permanently authorizes you to choose that version for the Document.

  12. RELICENSING

    “Massive Multiauthor Collaboration Site” (or “MMC Site”) means any World Wide Web server that publishes copyrightable works and also provides prominent facilities for anybody to edit those works. A public wiki that anybody can edit is an example of such a server. A “Massive Multiauthor Collaboration” (or “MMC”) contained in the site means any set of copyrightable works thus published on the MMC site.

    “CC-BY-SA” means the Creative Commons Attribution-Share Alike 3.0 license published by Creative Commons Corporation, a not-for-profit corporation with a principal place of business in San Francisco, California, as well as future copyleft versions of that license published by that same organization.

    “Incorporate” means to publish or republish a Document, in whole or in part, as part of another Document.

    An MMC is “eligible for relicensing” if it is licensed under this License, and if all works that were first published under this License somewhere other than this MMC, and subsequently incorporated in whole or in part into the MMC, (1) had no cover texts or invariant sections, and (2) were thus incorporated prior to November 1, 2008.

    The operator of an MMC Site may republish an MMC contained in the site under CC-BY-SA on the same site at any time before August 1, 2009, provided the MMC is eligible for relicensing.

ADDENDUM: How to use this License for your documents

To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page:

Copyright (C)  YEAR  YOUR NAME.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3
or any later version published by the Free Software Foundation;
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
Texts.  A copy of the license is included in the section entitled ``GNU
Free Documentation License''.

If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the “with…Texts.” line with this:

with the Invariant Sections being LIST THEIR TITLES, with
the Front-Cover Texts being LIST, and with the Back-Cover Texts
being LIST.

If you have Invariant Sections without Cover Texts, or some other combination of the three, merge those two alternatives to suit the situation.

If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software.