Hyperdrive.el User Manual
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.
- Homepage: https://ushin.org/hyperdrive/hyperdrive-manual.html
- Repository: https://git.sr.ht/~ushin/hyperdrive.el
This manual is for hyperdrive.el
version 0.6-pre.
Table of Contents
- 1 Freedom to copy
- 2 Installation
- 3 Example configuration
- 4 Usage
- 4.1 Install the gateway
- 4.2 Menu bar support
- 4.3 Context menu support
- 4.4 Hyperdrive menu command
- 4.5 Start/stop the gateway
- 4.6 Open a hyperdrive
- 4.7 Create a hyperdrive
- 4.8 Write to a hyperdrive
- 4.9 Link to a hyperdrive
- 4.10 Delete a hyperdrive file
- 4.11 Forget a hyperdrive file
- 4.12 View the hyperdrive version history
- 4.13 Describe a hyperdrive
- 4.14 Name a hyperdrive
- 4.15 Explore the peer graph
- 4.16 Bookmark a hyperdrive
- 4.17 Stream audio and video
- 4.18 Download hyperdrive files
- 4.19 Upload files from your filesystem
- 4.20 Mark a hyperdrive as safe
- 4.21 Purge a hyperdrive
- 4.22 Non-interactive use
- 4.23 Org-transclusion integration
- 4.24 Miscellaneous features
- 5 Concepts
- 6 Customization
- 7 Known limitations
- 8 Tips
- 9 Troubleshooting
- 10 Contributing/Getting help
- 11 Uninstallation
- 12 Acknowledgments
- 13 Indices
- 14 GNU Free Documentation License
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.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 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.2 Menu bar support ¶
If you enable hyperdrive-menu-bar-mode
, either in your configuration
(see Example configuration) or with M-x hyperdrive-menu-bar-mode
,
the “Hyperdrive” menu should appear after the “Tools” menu at the top
of the screen. If you don’t see the menu bar, please double check
that menu-bar-mode
is enabled (it is enabled by default).
Enable the “Hyperdrive” menu bar.
If you have disabled menu-bar-mode
, you can still use the hyperdrive
menu bar by pressing C-mouse-3
in a hyperdrive file or directory.
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.
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:
-
n (
hyperdrive-ewoc-next
) ¶ - p (
hyperdrive-ewoc-previous
) Move between entries.
-
RET (
hyperdrive-dir-find-file
) ¶ Open the file or directory at point.
-
o (
hyperdrive-dir-find-file-other-window
) ¶ - <mouse-1>
- <mouse-2>
Open the file or directory at point in a new window.
-
v (
hyperdrive-dir-view-file
) ¶ Open the file or directory at point in view-mode.
-
^ (
hyperdrive-up
) ¶ Go up to the parent directory.
-
g (
revert-buffer
) ¶ Refresh the directory to display potential updates.
-
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
).-
d (
hyperdrive-dir-download-file
) ¶ Download the file at point to disk.
-
D (
hyperdrive-delete
) ¶ Delete the file or directory (recursively) at point.
-
F (
hyperdrive-forget-file
) ¶ Delete your local copy of the file at point.
-
H (
hyperdrive-dir-history
) ¶ Open the version history (see View the hyperdrive version history) of file at point.
-
w (
hyperdrive-dir-copy-url
) ¶ Copy the URL of the file or directory at point.
-
j (
imenu
) ¶ Open
imenu
to quickly jump to a file in the current directory.-
? (
hyperdrive-menu
) ¶ Open
hyperdrive-menu
(see Hyperdrive menu command).-
+ (
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
, ormtime
) and DIRECTION being one of:ascending
or:descending
.
4.6.2 File view ¶
The following keybindings are available inside the file view by default:
-
C-x x g (
hyperdrive-revert-buffer-quick
) ¶ Refresh the file to display potential updates. This command remaps the global
revert-buffer-quick
keybinding.-
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. If
nil
, raw HTML will be displayed.
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 folderr
(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.
-
C-x C-s (
save-buffer
) ¶ Save the current hyperdrive file buffer to its location.
-
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 commandsave-some-buffers
to always prompt to save hyperdrive files in addition to regular files, setsave-some-buffers-default-predicate
tot
.
- 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.9 Link to a hyperdrive ¶
You can share a hyperdrive file with someone by copying and sending its link. Anyone who has the link to a hyperdrive file or directory can load it and view its contents.
- Command: hyperdrive-copy-url ¶
Copy the URL of the current hyperdrive file or directory.
In the directory view, you can copy the URL of the file or directory
at point by pressing w
(see Directory view).
4.9.1 Org mode links ¶
If the current file is an org-mode file, org-store-link
will store a
link to the hyperdrive file. If point is inside a heading, a
URL-encoded search option containing its CUSTOM_ID
, ID
, or heading
text will be appended as the stored URL’s link fragment.
Linking by path alone to other files within the same hyperdrive is
supported; within hyper://PUBLIC-KEY/foo.org
, links to bar.org
,
./bar.org
, and /bar.org
will all point to hyper://PUBLIC-KEY/bar.org
.
Links within a hyperdrive may also begin with the explicit file:
prefix. A version number can also be specified; /$/version/42/bar.org
will point to hyper://PUBLIC-KEY/$/version/42/bar.org
.
Org-mode hyperdrive link completion allows you to interactively link
to a hyperdrive file/folder by running M-x org-insert-link
(or C-c C-l
in org-mode), then typing hyper:
and RET
. To change how
org-insert-link
inserts links to files within the same hyperdrive,
adjust hyperdrive-org-link-full-url
and org-link-file-path-type
.
- User Option: hyperdrive-org-link-full-url ¶
This option controls whether relative links to hyperdrives are ever inserted with
org-insert-link
. Set it tot
if you always want to insert fullhyper://
links.
4.9.2 Markdown links ¶
Relative links are supported; within hyper://PUBLIC-KEY/foo.md
, the
links [bar](<bar.md>)
, [bar](<./bar.md>)
, and [bar](</bar.md>)
all
point to hyper://PUBLIC-KEY/bar.md
.
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
):
-
n (
hyperdrive-open-next-version
) ¶ - p (
hyperdrive-open-previous-version
) Traverse version history for the current file.
-
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:
-
n (
hyperdrive-ewoc-next
) ¶ - p (
hyperdrive-ewoc-previous
) Move between entries.
-
+ (
hyperdrive-history-load
) ¶ Load all drive metadata, including version metadata, then reload the history buffer.
-
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
, runhyperdrive-history-load
.-
o (
hyperdrive-history-find-file-other-window
) ¶ - <mouse-1>
- <mouse-2>
Open the file at the start of the version range at point in a new window.
-
v (
hyperdrive-history-view-file
) ¶ Open the file at the start of the version range at point in view-mode. When the version range at point is
unknown
, runhyperdrive-history-load
.-
w (
hyperdrive-history-copy-url
) ¶ Copy the URL of the file at the start of the version range at point.
-
d (
hyperdrive-history-download-file
) ¶ Download the file at the start of the version range at point.
-
= (
hyperdrive-history-diff
) ¶ Display the differences between the version at point and the prior version.
-
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
isnil
, then sources will not appear in the peer list. Regardless of this options value, you can fold the sections of the peer list withmagit-section-toggle
, bound toTAB
.
- 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 inimage-mode.el
.
Display buffer action for transient peer graph menu. See 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 toeww-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
:
-
C-c C-c (
hyperdrive-mirror-do-upload
) ¶ Upload all of the files in the “To Upload” section.
-
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 thehyperdrive-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.
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.
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 range | exists |
---|---|
53 | yes |
51-52 | yes |
1-50 | no |
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.
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
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.
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.
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.
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).
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 inhyperdrive-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, ifhyperdrive-gateway-program
is not found in this directory, Emacs searchesPATH
forhyperdrive-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 to4973
. The defaulthyperdrive-gateway-start-function
will start the gateway on this port.
- User Option: hyperdrive-persist-location ¶
Location where
persist
will storehyperdrive-hyperdrives
andhyperdrive-existent-versions
. Defaults tonil
, meaning that the defaultpersist
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
andhyperdrive-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 petnamefoo
is displayed by default aspetname: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 asp:foo
. For further customization, runM-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 ¶
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!
xmpp:discuss@conference.ushin.org
(Join anonymously from your browser)#_bifrost_discuss_conference.ushin.org:aria-net.org
(Matrix bridge)
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 ¶
Jump to: | ?
^
+
<
=
C D F G H J N O P Q R S T V W |
---|
Jump to: | ?
^
+
<
=
C D F G H J N O P Q R S T V W |
---|
13.2 Function index ¶
Jump to: | B C D E F H I K M O R S W Y |
---|
Jump to: | B C D E F H I K M O R S W Y |
---|
13.3 Variable index ¶
Jump to: | C H O S W |
---|
Jump to: | C H O S W |
---|
13.4 Concept index ¶
Jump to: | D H N P S V |
---|
Jump to: | D H N P S V |
---|
14 GNU Free Documentation License ¶
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.
- 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.
- 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.
- 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.
- 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.
- 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:
- 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.
- 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.
- State on the Title page the name of the publisher of the Modified Version, as the publisher.
- Preserve all the copyright notices of the Document.
- Add an appropriate copyright notice for your modifications adjacent to the other copyright notices.
- 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.
- Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document’s license notice.
- Include an unaltered copy of this License.
- 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.
- 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.
- 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.
- 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.
- Delete any section Entitled “Endorsements”. Such a section may not be included in the Modified Version.
- Do not retitle any existing section to be Entitled “Endorsements” or to conflict in title with any Invariant Section.
- 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.
- 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.”
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.