\input texinfo    @c -*- texinfo -*-
@c %**start of header
@setfilename hyperdrive.info
@settitle Hyperdrive.el User Manual
@documentencoding UTF-8
@documentlanguage en
@set txicodequoteundirected
@set txicodequotebacktick
@set MAINTAINERSITE @uref{https://ushin.org,maintainers webpage}
@set MAINTAINER Joseph Turner
@set MAINTAINEREMAIL @email{joseph@ushin.org}
@set MAINTAINERCONTACT @uref{mailto:joseph@ushin.org,contact the maintainer}
@c %**end of header

@dircategory Emacs
@direntry
* Hyperdrive: (hyperdrive). P2P filesystem in Emacs.
@end direntry

@finalout
@titlepage
@title Hyperdrive.el User Manual
@subtitle Release 0.6-pre
@author Joseph Turner and Adam Porter
@end titlepage

@contents

@ifnottex
@node Top
@top Hyperdrive.el User Manual

@uref{https://docs.holepunch.to/building-blocks/hyperdrive, Hyperdrive} is a P2P, real-time, local-first, versioned filesystem
designed for easy peer-to-peer file sharing.  @code{hyperdrive.el} is an
independent project built by @uref{https://ushin.org, USHIN} which provides an Emacs interface
for managing hyperdrives.

@code{hyperdrive.el} is in early development. If something breaks, please see
@ref{Troubleshooting}.

@itemize
@item
Homepage: @uref{https://ushin.org/hyperdrive/hyperdrive-manual.html}
@item
Repository: @uref{https://git.sr.ht/~ushin/hyperdrive.el}
@end itemize

This manual is for @code{hyperdrive.el} version 0.6-pre.

@end ifnottex

@menu
* Freedom to copy::
* Installation::
* Example configuration::
* Usage::
* Concepts::
* Customization: Customization (1). 
* Known limitations::
* Tips::
* Troubleshooting::
* Contributing/Getting help::
* Uninstallation::
* Acknowledgments::
* Indices::
* GNU Free Documentation License::

@detailmenu
--- The Detailed Node Listing ---

Installation

* Install Emacs::
* Install curl::
* Install hyperdrive.el: Install hyperdriveel. 
* Install hyper-gateway-ushin::

Usage

* Install the gateway::
* Menu bar support::
* Context menu support::
* Hyperdrive menu command::
* Start/stop the gateway::
* Open a hyperdrive::
* Create a hyperdrive::
* Write to a hyperdrive::
* Link to a hyperdrive::
* Delete a hyperdrive file::
* Forget a hyperdrive file::
* View the hyperdrive version history::
* Describe a hyperdrive::
* Name a hyperdrive::
* Explore the peer graph::
* Bookmark a hyperdrive::
* Stream audio and video::
* Download hyperdrive files::
* Upload files from your filesystem::
* Mark a hyperdrive as safe::
* Purge a hyperdrive::
* Non-interactive use::
* Org-transclusion integration::
* Miscellaneous features::

Start/stop the gateway

* Advanced gateway customization::

Open a hyperdrive

* Directory view::
* File view::
* Unknown paths::

Link to a hyperdrive

* Org mode links::
* Markdown links::

View the hyperdrive version history

* History buffer::

Explore the peer graph

* Customization::

Upload files from your filesystem

* Mirror a whole directory::

Non-interactive use

* Non-interactive use example @code{hyperdrive-mirror}::

Miscellaneous features

* Find file at point integration::
* Embark integration::
* Webjump integration::

Concepts

* Hyperdrive::
* hyper-gateway-ushin::
* Naming::

Hyperdrive

* Sparse replication::
* Versioning::
* Master key::

Versioning

* Partial version data::

Naming

* Public keys::
* Nicknames::
* Petnames::
* Seeds::
* DNS domains::

Customization

* Additional customization::

Additional customization

* Completion styles and cycling::

Known limitations

* No empty directories::
* Files and folders can have the same name::
* Non-UTF-8 encoded text::

Tips

* Quick documentation access::

Troubleshooting

* Reinstall/upgrade the gateway::

Indices

* Keystroke index::
* Function index::
* Variable index::
* Concept index::

@end detailmenu
@end menu

@node Freedom to copy
@chapter Freedom to copy

Copyright @copyright{} 2023, 2024, 2025 USHIN, Inc.

@quotation
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.''

@end quotation

@node Installation
@chapter Installation

@menu
* Install Emacs::
* Install curl::
* Install hyperdrive.el: Install hyperdriveel. 
* Install hyper-gateway-ushin::
@end menu

@node Install Emacs
@section Install Emacs

@code{hyperdrive.el} requires @uref{https://www.gnu.org/software/emacs/, GNU Emacs} version 28.1 or later.

@node Install curl
@section Install curl

@code{hyperdrive.el} requires a reasonably up-to-date version of @uref{https://curl.se/download.html, curl}.

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

@node Install hyperdriveel
@section Install hyperdrive.el

@code{hyperdrive.el} can be installed from @uref{https://elpa.nongnu.org/nongnu/hyperdrive.html, NonGNU ELPA} with @code{M-x
package-refresh-contents} then @code{M-x package-install RET hyperdrive}.

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

@node Install hyper-gateway-ushin
@section Install hyper-gateway-ushin

@code{hyperdrive.el} relies on @uref{https://git.sr.ht/~ushin/hyper-gateway-ushin/, hyper-gateway-ushin} for talking to the
hypercore network.

After installing @code{hyperdrive.el} (see @ref{Install hyperdriveel, , Install hyperdrive.el}), run @code{M-x
hyperdrive-install} to download and install the gateway.

Alternatively, follow the @uref{https://git.sr.ht/~ushin/hyper-gateway-ushin#installation, manual installation instructions}.

@node Example configuration
@chapter Example configuration

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

@lisp
(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)))
@end lisp

With @ref{Top,use-package,,use-package,}:

@lisp
(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))
@end lisp

@node Usage
@chapter Usage

@display
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.
@end display

@menu
* Install the gateway::
* Menu bar support::
* Context menu support::
* Hyperdrive menu command::
* Start/stop the gateway::
* Open a hyperdrive::
* Create a hyperdrive::
* Write to a hyperdrive::
* Link to a hyperdrive::
* Delete a hyperdrive file::
* Forget a hyperdrive file::
* View the hyperdrive version history::
* Describe a hyperdrive::
* Name a hyperdrive::
* Explore the peer graph::
* Bookmark a hyperdrive::
* Stream audio and video::
* Download hyperdrive files::
* Upload files from your filesystem::
* Mark a hyperdrive as safe::
* Purge a hyperdrive::
* Non-interactive use::
* Org-transclusion integration::
* Miscellaneous features::
@end menu

@node Install the gateway
@section Install the gateway

Run @code{M-x hyperdrive-install} to download and install the gateway program
(see @ref{hyper-gateway-ushin}):

@deffn Command hyperdrive-install
Download and install the gateway.  Prompts for confirmation before
downloading.
@end deffn

@deffn Command hyperdrive-cancel-install
Cancel installation in progress.
@end deffn

@node Menu bar support
@section Menu bar support

@findex menu-bar-mode

If you enable @code{hyperdrive-menu-bar-mode}, either in your configuration
(see @ref{Example configuration}) or with @code{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 @code{menu-bar-mode} is enabled (it is enabled by default).

@deffn Command hyperdrive-menu-bar-mode
Enable the ``Hyperdrive'' menu bar.
@end deffn

If you have disabled @code{menu-bar-mode}, you can still use the hyperdrive
menu bar by pressing @code{C-mouse-3} in a hyperdrive file or directory.

@node Context menu support
@section Context menu support

@findex context-menu-mode

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

@deffn Command hyperdrive-context-menu-mode
Enable the ``Hyperdrive'' right-click context menu.
@end deffn

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

@node Hyperdrive menu command
@section Hyperdrive menu command

@code{M-x hyperdrive-menu} is a keyboard-driven interface to many
@code{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 @code{hyperdrive-menu} when you're inside
a hyperdrive file, directory, or neither.

While inside the @code{hyperdrive-menu}, press @code{?} twice to open this
@code{hyperdrive.el} info manual.  You can also press @code{?} followed by a
command's key sequence to get help for that command. (@ref{Quick documentation access, , more tips on
getting help})

If you press @code{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 @code{hyperdrive-menu} commands with the
@code{up} and @code{down} arrow keys.  Press @code{C-g} to close the menu.

@deffn Command hyperdrive-menu
Show the hyperdrive menu interface.
@end deffn

For more on this type of user interface, please refer to the @ref{Introduction,Transient
documentation,,transient,}.  To learn about the commands available in
@code{hyperdrive-menu}, read on!

@node Start/stop the gateway
@section Start/stop the gateway

To connect with peers, you'll need to start the gateway (see
@ref{hyper-gateway-ushin}).  The current running status of the gateway
can be seen in @code{hyperdrive-menu} (see @ref{Hyperdrive menu command})
and in the ``Hyperdrive'' menu bar (see @ref{Menu bar support}).

@deffn Command hyperdrive-start
Start the gateway.
@end deffn

@defopt hyperdrive-gateway-ready-hook
Hook run when the gateway becomes responsive after @code{hyperdrive-start}.
One of the default hooks, @code{hyperdrive-check-gateway-version}, will
warn you if you're running an outdated version of the gateway.
@end defopt

@deffn Command hyperdrive-stop
Stop the gateway.
@end deffn

@defopt hyperdrive-gateway-dead-hook
Hook run when the gateway is no longer live after @code{hyperdrive-stop}.
@end defopt

@deffn Command hyperdrive-restart
Restart the gateway.
@end deffn

@deffn Command hyperdrive-gateway-version
Say the version of the gateway which is running.
@end deffn

@menu
* Advanced gateway customization::
@end menu

@node Advanced gateway customization
@subsection Advanced gateway customization

@defopt hyperdrive-gateway-start-function
Function run to start the gateway.  By default, @code{hyperdrive.el} will
start the gateway as an Emacs subprocess.
@end defopt

@defopt hyperdrive-gateway-stop-function
Function run to stop the gateway.
@end defopt

@defopt hyperdrive-gateway-live-predicate
Function run to check that the gateway process is live.
@end defopt

@node Open a hyperdrive
@section Open a hyperdrive

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

@example
hyper://aaj45d88g4eenu76rpmwzjiabsof1w8u6fufq6oogyhjk1ubygxy/
@end example

@deffn Command hyperdrive-open-url
Open a hyperdrive file or directory by its @code{hyper://} URL@.
@end deffn

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

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

@deffn Command hyperdrive-view-file
Like @code{hyperdrive-find-file}, but open the file in @ref{View Mode,view-mode,,emacs,}.
@end deffn

@menu
* Directory view::
* File view::
* Unknown paths::
@end menu

@node Directory view
@subsection Directory view

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

@table @asis
@item green
fully downloaded (@code{hyperdrive-size-fully-downloaded})
@item yellow
partially downloaded (@code{hyperdrive-size-partially-downloaded})
@item red
not downloaded (@code{hyperdrive-size-not-downloaded})
@end table

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:

@table @asis
@item @kbd{n} (@code{hyperdrive-ewoc-next})
@itemx @kbd{p} (@code{hyperdrive-ewoc-previous})
@kindex n
@kindex p
@findex hyperdrive-ewoc-next
@findex hyperdrive-ewoc-previous
Move between entries.

@item @kbd{@key{RET}} (@code{hyperdrive-dir-find-file})
@kindex RET
@findex hyperdrive-dir-find-file
Open the file or directory at point.

@item @kbd{o} (@code{hyperdrive-dir-find-file-other-window})
@itemx @kbd{<mouse-1>}
@itemx @kbd{<mouse-2>}
@kindex o
@kindex <mouse-1>
@kindex <mouse-2>
@findex hyperdrive-dir-find-file-other-window
Open the file or directory at point in a new window.

@item @kbd{v} (@code{hyperdrive-dir-view-file})
@kindex v
@findex hyperdrive-dir-view-file
Open the file or directory at point in @ref{View Mode,view-mode,,emacs,}.

@item @kbd{^} (@code{hyperdrive-up})
@kindex ^
@findex hyperdrive-up
Go up to the parent directory.

@item @kbd{g} (@code{revert-buffer})
@kindex g
@findex revert-buffer
Refresh the directory to display potential updates.

@item @kbd{s} (@code{hyperdrive-dir-sort})
@kindex s
@findex 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 (@code{C-u s}).

@item @kbd{d} (@code{hyperdrive-dir-download-file})
@kindex d
@findex hyperdrive-dir-download-file
Download the file at point to disk.

@item @kbd{D} (@code{hyperdrive-delete})
@kindex D
@findex hyperdrive-delete
Delete the file or directory (recursively) at point.

@item @kbd{F} (@code{hyperdrive-forget-file})
@kindex F
@findex hyperdrive-forget-file
Delete your local copy of the file at point.

@item @kbd{H} (@code{hyperdrive-dir-history})
@kindex H
@findex hyperdrive-dir-history
Open the version history (see @ref{View the hyperdrive version history})
of file at point.

@item @kbd{w} (@code{hyperdrive-dir-copy-url})
@kindex w
@findex hyperdrive-dir-copy-url
Copy the URL of the file or directory at point.

@item @kbd{j} (@code{imenu})
@kindex j
@findex imenu
Open @code{imenu} to quickly jump to a file in the current directory.

@item @kbd{?} (@code{hyperdrive-menu})
@kindex ?
@findex hyperdrive-menu
Open @code{hyperdrive-menu} (see @ref{Hyperdrive menu command}).

@item @kbd{+} (@code{hyperdrive-create-directory-no-op})
@kindex +
@findex hyperdrive-create-directory-no-op
This command signals an error, because you cannot create empty
directories (see @ref{No empty directories}).
@end table

You can customize the directory view with the following options:

@defopt hyperdrive-directory-display-buffer-action
Display buffer action for hyperdrive directories.  Passed to
@code{display-buffer}, which see.
@end defopt

@defopt 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 (@code{name}, @code{size}, or @code{mtime}) and
DIRECTION being one of @code{:ascending} or @code{:descending}.
@end defopt

@node File view
@subsection File view

@findex dired-jump

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

@table @asis
@item @kbd{C-x x g} (@code{hyperdrive-revert-buffer-quick})
@kindex C-x x g
@findex hyperdrive-revert-buffer-quick
Refresh the file to display potential updates.  This command remaps
the global @code{revert-buffer-quick} keybinding.

@item @kbd{C-x C-j} (@code{hyperdrive-up})
@kindex C-x C-j
@findex hyperdrive-up
Jump to the parent hyperdrive directory from a hyperdrive file or
directory buffer.  This command remaps the global @code{dired-jump} keybinding.
@end table

For security reasons, @code{hyperdrive.el} does not enable major modes based
on file extension unless the hyperdrive has been marked as ``safe'' with
@code{M-x hyperdrive-mark-as-safe} (see @ref{Mark a hyperdrive as safe}).

The following customization options affect how files are displayed:

@defopt hyperdrive-render-html
Control how HTML hyperdrive files are displayed.  By default, HTML
pages are rendered in Emacs with @ref{Top,EWW,,eww,}.  If @code{nil}, raw HTML will be
displayed.
@end defopt

@node Unknown paths
@subsection Unknown paths

When you attempt to load a file or folder that doesn't appear to
exist, @code{hyperdrive.el} will prompt you to take action:

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

If you attempt to load the root directory (@code{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, @code{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, @code{hyperdrive.el} should ask you to double-check the
URL@.

@node Create a hyperdrive
@section Create a hyperdrive

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

@deffn Command hyperdrive-new
Create a new hyperdrive from a seed string.
@end deffn

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

@node Write to a hyperdrive
@section Write to a hyperdrive

@vindex save-some-buffers-default-predicate

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

@table @asis
@item @kbd{C-x C-s} (@code{save-buffer})
@kindex C-x C-s
@findex save-buffer
Save the current hyperdrive file buffer to its location.

@item @kbd{C-x s} (@code{save-some-buffers})
@kindex C-x s
@findex save-some-buffers
Save all modified hyperdrive file buffers to their locations.  This
command's primary purpose is to save normal file buffers, and
@code{hyperdrive.el} has integrated with it.

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

@deffn 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.
@end deffn

@node Link to a hyperdrive
@section 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.

@deffn Command hyperdrive-copy-url
Copy the URL of the current hyperdrive file or directory.
@end deffn

In the directory view, you can copy the URL of the file or directory
at point by pressing @code{w} (see @ref{Directory view}).

@menu
* Org mode links::
* Markdown links::
@end menu

@node Org mode links
@subsection Org mode links

@findex org-store-link
@findex org-insert-link
@vindex org-link-file-path-type

If the current file is an org-mode file, @code{org-store-link} will store a
link to the hyperdrive file.  If point is inside a heading, a
URL-encoded search option containing its @code{CUSTOM_ID}, @code{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 @code{hyper://PUBLIC-KEY/foo.org}, links to @code{bar.org},
@code{./bar.org}, and @code{/bar.org} will all point to @code{hyper://PUBLIC-KEY/bar.org}.
Links within a hyperdrive may also begin with the explicit @code{file:}
prefix.  A version number can also be specified; @code{/$/version/42/bar.org}
will point to @code{hyper://PUBLIC-KEY/$/version/42/bar.org}.

Org-mode hyperdrive link completion allows you to interactively link
to a hyperdrive file/folder by running @code{M-x org-insert-link} (or @code{C-c C-l}
in org-mode), then typing @code{hyper:} and @code{RET}.  To change how
@code{org-insert-link} inserts links to files within the same hyperdrive,
adjust @code{hyperdrive-org-link-full-url} and @code{org-link-file-path-type}.

@defopt hyperdrive-org-link-full-url
This option controls whether relative links to hyperdrives are ever
inserted with @code{org-insert-link}.  Set it to @code{t} if you always want to
insert full @code{hyper://} links.
@end defopt

@node Markdown links
@subsection Markdown links

Relative links are supported; within @code{hyper://PUBLIC-KEY/foo.md}, the
links @code{[bar](<bar.md>)}, @code{[bar](<./bar.md>)}, and @code{[bar](</bar.md>)} all
point to @code{hyper://PUBLIC-KEY/bar.md}.

@node Delete a hyperdrive file
@section Delete a hyperdrive file

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

@deffn Command hyperdrive-delete
Delete the hyperdrive file in the current buffer.
@end deffn

This command also has a keybinding in the directory view (see
@ref{Directory view}).

@node Forget a hyperdrive file
@section Forget a hyperdrive file

@strong{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.

@deffn Command hyperdrive-forget-file
Delete your local copy of the file for the current buffer.
@end deffn

This command also has a keybinding in the directory view (see
@ref{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.

@node View the hyperdrive version history
@section View the hyperdrive version history

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

@deffn Command hyperdrive-open-previous-version
Open the previous version of the current hyperdrive file or directory.
@end deffn

@deffn Command hyperdrive-open-previous-version
Open the next version of the current hyperdrive file or directory.
@end deffn

@deffn 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.
@end deffn

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

@table @asis
@item @kbd{n} (@code{hyperdrive-open-next-version})
@itemx @kbd{p} (@code{hyperdrive-open-previous-version})
@kindex n
@kindex p
@findex hyperdrive-open-next-version
@findex hyperdrive-open-previous-version
Traverse version history for the current file.

@item @kbd{q} (@code{kill-current-buffer})
@kindex q
@findex kill-current-buffer
@end table

@menu
* History buffer::
@end menu

@node History buffer
@subsection History buffer

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

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

@deffn 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: @code{C-u M-x hyperdrive-history}.
@end deffn

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

@table @asis
@item @kbd{n} (@code{hyperdrive-ewoc-next})
@itemx @kbd{p} (@code{hyperdrive-ewoc-previous})
@kindex n
@kindex p
@findex hyperdrive-ewoc-next
@findex hyperdrive-ewoc-previous
Move between entries.

@item @kbd{+} (@code{hyperdrive-history-load})
@kindex +
@findex hyperdrive-history-load
Load all drive metadata, including version metadata, then reload the
history buffer.

@item @kbd{@key{RET}} (@code{hyperdrive-history-find-file})
@kindex RET
@findex hyperdrive-history-find-file
Open the file at the start of the version range at point.  When the
version range at point is @code{unknown}, run @code{hyperdrive-history-load}.

@item @kbd{o} (@code{hyperdrive-history-find-file-other-window})
@itemx @kbd{<mouse-1>}
@itemx @kbd{<mouse-2>}
@kindex o
@kindex <mouse-1>
@kindex <mouse-2>
@findex hyperdrive-history-find-file-other-window
Open the file at the start of the version range at point in a new
window.

@item @kbd{v} (@code{hyperdrive-history-view-file})
@kindex v
@findex hyperdrive-history-view-file
Open the file at the start of the version range at point in @ref{View Mode,view-mode,,emacs,}.  When the version range at point is @code{unknown}, run
@code{hyperdrive-history-load}.

@item @kbd{w} (@code{hyperdrive-history-copy-url})
@kindex w
@findex hyperdrive-history-copy-url
Copy the URL of the file at the start of the version range at point.

@item @kbd{d} (@code{hyperdrive-history-download-file})
@kindex d
@findex hyperdrive-history-download-file
Download the file at the start of the version range at point.

@item @kbd{=} (@code{hyperdrive-history-diff})
@kindex =
@findex hyperdrive-history-diff
Display the differences between the version at point and the prior
version.

@item @kbd{F} (@code{hyperdrive-history-forget-file})
@kindex F
@findex hyperdrive-history-forget-file
Delete your local copy of the file for the version range at point.
@end table

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:

@defopt hyperdrive-history-display-buffer-action
Display buffer action for hyperdrive history buffers.  Passed to
@code{display-buffer}, which see.
@end defopt

@node Describe a hyperdrive
@section 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 @code{hyperdrive-describe-hyperdrive}.  For more on what this
information means, see @ref{Naming}.

@deffn 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: @code{C-u M-x hyperdrive-describe-hyperdrive}.
@end deffn

@node Name a hyperdrive
@section Name a hyperdrive

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

@deffn Command hyperdrive-set-petname
Set the petname (see @ref{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: @code{C-u M-x hyperdrive-set-petname}.
@end deffn

@deffn Command hyperdrive-set-nickname
Set the nickname (see @ref{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:
@code{C-u M-x hyperdrive-set-nickname}.
@end deffn

@node Explore the peer graph
@section Explore the peer graph

@code{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:

@table @asis
@item Sources
Sources are peers whose content you want to see.  Sources
are also used to discover other sources.

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

@item Blocked
Blocked are peers whose content you do not want to see.
@end table

For a video demonstration and explanation of the peer graph, see
@uref{https://ushin.org/presentations.html#emacsconf2024, EmacsConf 2024: New in hyperdrive.el: quick install, peer graph, transclusion!}

@menu
* Customization::
@end menu

@node Customization
@subsection Customization

@defopt hyperdrive-peer-graph-sources-max-hops-default
Default maximum number of hops to go out when gathering source.
Defaults to @code{3}.
@end defopt

@defopt hyperdrive-peer-graph-blockers-max-hops-default
Default maximum number of hops to go out when gathering blockers.
Defaults to @code{3}.
@end defopt

@defopt hyperdrive-peer-graph-show-sources-p-default
Whether to show sources in peer graph and list views by default.
Defaults to @code{t}.
@end defopt

@defopt hyperdrive-peer-graph-show-blockers-p-default
Whether to show blockers in peer graph and list views by default.
Defaults to @code{t}.
@end defopt

@defopt hyperdrive-peer-graph-show-blocked-p-default
Whether to show blocked in peer graph and list views by default:

@table @asis
@item @code{all}
Show blocked sources and non-sources.
@item @code{sources}
Show only blocked sources. (default)
@item @code{non-sources}
Show only blocked non-sources.
@item @code{nil}
Hide blocked peers.
@end table
@end defopt

@defopt hyperdrive-peer-graph-shortest-paths-p-default
Whether to show only the shortest paths between peers by default.
Defaults to @code{t}.
@end defopt

@defopt hyperdrive-peer-graph-buffer-name
Buffer name to use for peer graph buffers.  Defaults to
@code{"*hyperdrive-peer-graph*"}.
@end defopt

@defopt hyperdrive-peer-graph-list-buffer-name
Buffer name to use for peer list buffers.  Defaults to
@code{"*hyperdrive-peer-graph-list*"}.
@end defopt

@defopt hyperdrive-peer-graph-list-apply-filters
Whether the filters applied to the peer graph should affect the peer
list as well. Defaults to @code{t}.

For example, if non-nil and @code{hyperdrive-peer-graph-show-sources-p}
is @code{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 @code{magit-section-toggle}, bound to @code{TAB}.
@end defopt

@defopt hyperdrive-peer-graph-display-buffer-action
Display buffer action for peer graph buffers.  Passed to
@code{display-buffer}, which see.
@end defopt

@defopt hyperdrive-peer-graph-list-display-buffer-action
Display buffer action for peer list buffers.  Passed to
@code{display-buffer}, which see.
@end defopt

@defopt 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
@code{image-auto-resize-on-window-resize}, defined in @code{image-mode.el}.
@end defopt

@defopt hyperdrive-peer-graph-menu-display-action
Display buffer action for transient peer graph menu.  See
@ref{Top,transient.el info manual,,transient,} for more information.
@end defopt

@defopt hyperdrive-sbb-view-layout
Name of the Graphviz layout engine to use.  See @uref{https://graphviz.org/docs/attrs/layout/, Graphviz
documentation on layout} for more information.  Defaults to @code{"dot"}.
@end defopt

@defopt hyperdrive-sbb-view-overlap
How to handle overlapping nodes.  See @uref{https://graphviz.org/docs/attrs/overlap/, GraphViz documentation on
overlap} for more information. Defaults to @code{"voronoi"}.

Only affects @code{fdp}, @code{neato}, @code{sfdp}, @code{circo}, @code{twopi} layouts.
@end defopt

@defopt hyperdrive-sbb-view-sources-color
Color used for sources in peer graph.  Defaults to foreground of
@code{hyperdrive-sbb-source} face.
@end defopt

@defopt hyperdrive-sbb-view-blockers-color
Color used for blockers in peer graph.  Defaults to foreground of
@code{hyperdrive-sbb-blocker} face.
@end defopt

@defopt hyperdrive-sbb-view-blocked-color
Color used for blocked in peer graph.  Defaults to foreground of
@code{hyperdrive-sbb-blocked} face.
@end defopt

@node Bookmark a hyperdrive
@section Bookmark a hyperdrive

@findex bookmark-set
@findex bookmark-jump
@findex bookmark-list

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

@deffn Command hyperdrive-bookmark-jump
Select a hyperdrive bookmark and jump to it.
@end deffn

@deffn Command hyperdrive-bookmark-list
View a list of hyperdrive bookmarks.
@end deffn

@node Stream audio and video
@section Stream audio and video

When you use @code{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.

@defopt hyperdrive-stream-player-command
Command used to play streamable URLs externally.  Default uses
@uref{https://mpv.io/, mpv}.  There also exists a preconfigured option for @uref{https://www.videolan.org/vlc/, VLC media player}.
@end defopt

@node Download hyperdrive files
@section Download hyperdrive files

You can ``download'' a hyperdrive file to your local filesystem, meaning
that @code{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.

@deffn Command hyperdrive-download
Download a hyperdrive file by selecting a hyperdrive and a path.
@end deffn

@deffn Command hyperdrive-download-url
Download a hyperdrive file by pasting in a @code{hyper://} URL@.
@end deffn

@defopt hyperdrive-download-directory
Location where @code{hyperdrive-download-url} will download files.  Defaults
to @code{eww-download-directory} or, if not bound, the home directory.
@end defopt

@node Upload files from your filesystem
@section Upload files from your filesystem

@findex yank-media

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.

@deffn 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.
@end deffn

@deffn Command hyperdrive-upload-files
Upload multiple files from your filesystem.  The selected files will
be uploaded into the same target directory in your hyperdrive.
@end deffn

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

@menu
* Mirror a whole directory::
@end menu

@node Mirror a whole directory
@subsection Mirror a whole directory

For uploading more than a few files, you can use @code{hyperdrive-mirror}.

@deffn 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 (@code{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 (@code{C-u C-u M-x hyperdrive-mirror}), matching
files will be uploaded without the confirmation step.
@end deffn

As a confirmation step, @code{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 @code{hyperdrive-mirror-mode}:

@table @asis
@item @kbd{C-c C-c} (@code{hyperdrive-mirror-do-upload})
@kindex C-c C-c
@findex hyperdrive-mirror-do-upload
Upload all of the files in the ``To Upload'' section.

@item @kbd{@key{TAB}} (@code{magit-section-toggle})
@kindex TAB
@findex magit-section-toggle
Fold or unfold the section at point.
@end table

@node Mark a hyperdrive as safe
@section Mark a hyperdrive as safe

For security reasons, @code{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), @code{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
@code{set-auto-mode}.  Files in hyperdrives which are marked as ``unsafe''
are opened in @code{fundamental-mode} (no major mode).

@deffn Command hyperdrive-mark-as-safe
Mark a hyperdrive as ``safe'', ``unsafe'', or ``unknown''.  This command
can also be invoked from @code{hyperdrive-menu-hyperdrive} and the menu bar.
@end deffn

@node Purge a hyperdrive
@section Purge a hyperdrive

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

@strong{Data which has been purged from your local machine may not be
recoverable.}

@deffn 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, @code{hyperdrive-purge} also
deletes relevant metadata persisted in the @code{hyperdrive-hyperdrives}
variable.
@end deffn

@node Non-interactive use
@section Non-interactive use

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

@defun hyperdrive-by-slot
This function accepts a hyperdrive seed, petname, or public key, and
returns the hyperdrive @code{struct}.
@end defun

@menu
* Non-interactive use example @code{hyperdrive-mirror}::
@end menu

@node Non-interactive use example @code{hyperdrive-mirror}
@subsection Non-interactive use example: @code{hyperdrive-mirror}

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

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

To upload the same files without confirmation, add @code{:no-confirm t}.

Now let's say that you want to upload only those files tagged as
``public'' using Protesilaos Stavrou's @uref{https://protesilaos.com/emacs/denote, Denote} file-naming scheme.  The
following snippet includes a @code{FILTER} key whose value is a regular
expression against which every expanded filename will be tested.

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

Alternatively, you could select files by tag with Karl Voit's
@uref{https://github.com/novoid/filetags/, filetags}. Either way allows for a ``non-splitting'' approach where
public and private files exist in the same directory.

@code{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 @code{~/blog/} which are smaller than 5MB:

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

@node Org-transclusion integration
@section Org-transclusion integration

The @uref{https://git.sr.ht/~ushin/hyperdrive-org-transclusion, hyperdrive-org-transclusion} package adds support for transcluding
hyperdrive files and parts of hyperdrive files with @uref{https://nobiot.github.io/org-transclusion/, org-transclusion}.

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

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

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

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

@node Miscellaneous features
@section Miscellaneous features

@menu
* Find file at point integration::
* Embark integration::
* Webjump integration::
@end menu

@node Find file at point integration
@subsection Find file at point integration

@findex find-file-at-point

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

@node Embark integration
@subsection Embark integration

@findex embark-act

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

@node Webjump integration
@subsection Webjump integration

@findex webjump
@vindex webjump-sites

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

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

@node Concepts
@chapter Concepts

@menu
* Hyperdrive::
* hyper-gateway-ushin::
* Naming::
@end menu

@node Hyperdrive
@section Hyperdrive

@uref{https://docs.holepunch.to/building-blocks/hyperdrive, Hyperdrive} is a virtual filesystem which you can use to share files on
the peer-to-peer (P2P) @code{hyper} network.  It's a folder with a globally
unique link starting with @code{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 @code{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 @ref{Versioning} for more information.

@menu
* Sparse replication::
* Versioning::
* Master key::
@end menu

@node Sparse replication
@subsection Sparse replication

@cindex 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.

@node Versioning
@subsection Versioning

@cindex 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, @code{hyper://PUBLIC-KEY/$/version/50/}
refers to the fiftieth version of the hyperdrive identified by
@code{PUBLIC-KEY}.  If you want to load the latest version, leave out the
@code{/$/version/N} part.  For example, if you run@dots{}

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

@dots{}then @code{hyperdrive.el} will attempt to find @code{/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 @code{hyper://PUBLIC-KEY/}
is 50.  If you add a new file at @code{hyper://PUBLIC-KEY/bar.org}, the latest
version of your hyperdrive will become 51.

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

Here's the mockup of the history view for @code{/bar.org} so far, the
hyperdrive's latest version being 53:

@multitable {aaaaaaaaaaaaa} {aaaaaa}
@headitem Version range
@tab exists
@item 53
@tab yes
@item 51-52
@tab yes
@item 1-50
@tab no
@end multitable

The table shows that @code{/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 @code{/bar.org} then try to load @code{hyper://PUBLIC-KEY/bar.org},
@code{hyperdrive.el} will open an empty buffer for you to author a new file.
If another peer attempts to load that URL, @code{hyperdrive.el} will warn
@code{"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,
@code{hyperdrive.el} sets the buffer to read-only whenever a version number
is specified in a hyper URL@.

@menu
* Partial version data::
@end menu

@node Partial version data
@subsubsection Partial version data

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

@node Master key
@subsection Master key

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

@node hyper-gateway-ushin
@section hyper-gateway-ushin

@cindex hyper-gateway-ushin

@uref{https://git.sr.ht/~ushin/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 @code{hyperdrive.el}, P2P interactions consist
mostly of, e.g., @code{GET} requests to download files and @code{PUT} requests
to write files to a hyperdrive.

@node Naming
@section Naming

@cindex Naming

Inspired by Marc Stiegler's @uref{http://www.skyhunter.com/marcs/petnames/IntroPetNames.html, An Introduction to Petname Systems},
@code{hyperdrive.el} names drives in a three different ways:

@table @asis
@item Public key
public, globally unique, not human-memorable
@item Nickname  
public, not necessarily unique, human-memorable
@item Petname   
private, locally unique, human-memorable
@end table

If @code{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:

@table @asis
@item Seed      
string used to generate public key
@item DNS domain
public, globally unique, human-memorable
@end table

@menu
* Public keys::
* Nicknames::
* Petnames::
* Seeds::
* DNS domains::
@end menu

@node Public keys
@subsection Public keys

@cindex Public keys

Public keys are globally unique identifiers for hyperdrives.  They
make up the first part of a @code{hyper://} URL@.  Public keys are
52-character-long @uref{https://en.wikipedia.org/wiki/Base32#z-base-32, z-base-32} encoded keys generated from your master
key (see @ref{Master key}) and a @ref{Seeds, , seed} string.  When you run @code{hyperdrive-new}
and type a new seed, the gateway automatically generates a new public
key.

@node Nicknames
@subsection Nicknames

@cindex 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
@code{/.well-known/host-meta.json} under the @code{name} key, as specified in
@uref{https://www.rfc-editor.org/rfc/rfc6415#section-6.1, RFC6415}.

@node Petnames
@subsection Petnames

@cindex Petnames

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

@node Seeds
@subsection Seeds

@cindex Seeds

Seeds are used in tandem with your secret master key (see @ref{Master key})
to generate public keys (see @ref{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 @ref{DNS domains}).

@node DNS domains
@subsection DNS domains

@cindex DNS domains

It is possible to use @uref{https://dnslink.io/, DNSLink} to link to a hyperdrive with a domain
name instead of a public key (see @ref{Public keys}), like
@code{hyper://example.org/path/to/file}. Create a TXT record at
@code{_dnslink.example.org} with the contents @code{/hyper/PUBLIC-KEY} (no trailing
slash). Note: relying on DNS adds another point of centralization,
reducing the durability of your link. @code{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
@ref{Suspicious Text,,,elisp,}).

@node Customization (1)
@chapter Customization

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

@defopt hyperdrive-gateway-program
Name of executable to run when starting the gateway with
@code{hyperdrive-gateway-start-function}.  @code{hyperdrive-install} will install
the gateway to this file in @code{hyperdrive-gateway-directory}.
@end defopt

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

@defopt hyperdrive-gateway-command-args
Command line arguments passed to the gateway when starting the
gateway with the default @code{hyperdrive-gateway-start-function}.
@end defopt

@defopt hyperdrive-gateway-port
@code{hyperdrive.el} will send HTTP requests to the gateway on this port.
Defaults to @code{4973}.  The default @code{hyperdrive-gateway-start-function}
will start the gateway on this port.
@end defopt

@defopt hyperdrive-persist-location
Location where @code{persist} will store @code{hyperdrive-hyperdrives} and
@code{hyperdrive-existent-versions}.  Defaults to @code{nil}, meaning that the
default @code{persist} location will be used.
@end defopt

@defopt hyperdrive-timestamp-format
Format string used for timestamps.  Passed to @code{format-time-string},
which see.
@end defopt

@defopt hyperdrive-queue-limit
Default number of request sent to the gateway at a time in a queue.
Defaults to @code{20}.
@end defopt

@defopt hyperdrive-preferred-formats
List of metadata types used to display hyperdrives.  Hyperdrives are
displayed using the first available metadata type.  See @ref{Naming}
section for what this means.
@end defopt

@defopt 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 @code{hyperdrive-preferred-formats}), followed by
the full entry path, followed by ``version: '' and version in
parentheses.
@end defopt

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

@defopt hyperdrive-formats
Alist mapping hyperdrive and hyperdrive entry metadata to a format
string, used in @code{hyperdrive-default-entry-format} and
@code{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 @code{foo} is displayed by default as
@code{petname:foo}.

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

@lisp
(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")))
@end lisp

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

@menu
* Additional customization::
@end menu

@node Additional customization
@section Additional customization

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

@menu
* Completion styles and cycling::
@end menu

@node Completion styles and cycling
@subsection Completion styles and cycling

@vindex completion-category-overrides
@findex completing-read

@code{hyperdrive.el} offers a @code{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 @code{hyperdrive}
category in @code{completion-category-overrides}.

@node Known limitations
@chapter Known limitations

@menu
* No empty directories::
* Files and folders can have the same name::
* Non-UTF-8 encoded text::
@end menu

@node No empty directories
@section 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:

@itemize
@item
it is not possible to create empty directories
@item
deleting the last file in a folder deletes the folder as well
@end itemize

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

@node Files and folders can have the same name
@section 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., @code{hyper://PUBLIC-KEY/foo/bar/} and @code{hyper://PUBLIC-KEY/foo/bar}. In
this case, the folder listing for @code{hyper://PUBLIC-KEY/foo/} would
display the @code{bar} entry but not the @code{bar/} entry prefix.

@node Non-UTF-8 encoded text
@section 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 @ref{Contributing/Getting help}).

@node Tips
@chapter Tips

@menu
* Quick documentation access::
@end menu

@node Quick documentation access
@section Quick documentation access

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

@deffn Command hyperdrive-info-manual
Open the hyperdrive.el info manual.
@end deffn

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

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

@node Troubleshooting
@chapter Troubleshooting

@menu
* Reinstall/upgrade the gateway::
@end menu

@node Reinstall/upgrade the gateway
@section Reinstall/upgrade the gateway

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

@node Contributing/Getting help
@chapter Contributing/Getting help

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

@itemize
@item
@code{xmpp:discuss@@conference.ushin.org} (@uref{https://anonymous.cheogram.com/discuss@@conference.ushin.org, Join anonymously from your browser})
@item
@code{#_bifrost_discuss_conference.ushin.org:aria-net.org} (Matrix bridge)
@end itemize

Bugs can be submitted to the @uref{https://todo.sr.ht/~ushin/ushin, ushin issue tracker}. Patches, comments or
questions can be submitted to the @uref{https://lists.sr.ht/~ushin/ushin, ushin public inbox}.

@node Uninstallation
@chapter Uninstallation

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

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

You can remove @code{hyperdrive.el} with @code{M-x package-delete hyperdrive}.

@node Acknowledgments
@chapter Acknowledgments

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

@uref{https://github.com/alphapapa/, Adam Porter} for rewriting @code{hyperdrive.el} and for his work on @code{plz.el}.

@uref{https://mauve.moe/, Mauve Signweaver} for their guidance into the
world of p2p as well as the development of @code{hyper-gateway}.

@uref{https://emacsair.me/, Jonas Bernoulli} for improving @code{hyperdrive-mirror} and for his work on
@code{transient.el}.

@uref{https://protesilaos.com, Protesilaos Stavrou} for design input and user-testing @code{hyperdrive.el}.

@uref{https://savannah.gnu.org/users/eliz, Eli Zaretskii} for guidance about text encoding systems.

@uref{https://emacs.ch/@@yantar92, Ihor Radchenko} for guidance about security and Org mode integration.

@uref{https://karl-voit.at/, Karl Voit} for his feedback which inspired the design of @code{hyperdrive-mirror}.

@uref{https://www.sanityinc.com/, Steve Purcell} and @uref{https://github.com/akirak, Akira Komamura} for suggestions to improve our CI
build manifests.

@uref{https://eshelyaron.com/, Eshel Yaron} for the suggestion to add @code{hyperdrive-menu-bar-mode}.

@uref{https://riscy.io/, Chris Rayner} for the suggestion to add @code{hyperdrive-org-transclusion-mode}.

@node Indices
@chapter Indices

@menu
* Keystroke index::
* Function index::
* Variable index::
* Concept index::
@end menu

@node Keystroke index
@section Keystroke index

@printindex ky

@node Function index
@section Function index

@printindex fn

@node Variable index
@section Variable index

@printindex vr

@node Concept index
@section Concept index

@printindex cp

@node GNU Free Documentation License
@chapter GNU Free Documentation License

@center Version 1.3, 3 November 2008

@display
Copyright @copyright{} 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
@uref{https://fsf.org/}

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

@enumerate 0
@item
PREAMBLE

The purpose of this License is to make a manual, textbook, or other
functional and useful document @dfn{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.

@item
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.

@item
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.

@item
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.

@item
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:

@enumerate A
@item
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.

@item
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.

@item
State on the Title page the name of the publisher of the
Modified Version, as the publisher.

@item
Preserve all the copyright notices of the Document.

@item
Add an appropriate copyright notice for your modifications
adjacent to the other copyright notices.

@item
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.

@item
Preserve in that license notice the full lists of Invariant
Sections and required Cover Texts given in the Document's
license notice.

@item
Include an unaltered copy of this License.

@item
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.

@item
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.

@item
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.

@item
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.

@item
Delete any section Entitled ``Endorsements''. Such a section may
not be included in the Modified Version.

@item
Do not retitle any existing section to be Entitled
``Endorsements'' or to conflict in title with any Invariant
Section.

@item
Preserve any Warranty Disclaimers.
@end enumerate

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.

@item
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.''

@item
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.

@item
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.

@item
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.

@item
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.

@item
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
@uref{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.

@item
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.
@end enumerate

@page

@anchor{ADDENDUM How to use this License for your documents}
@heading 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:

@example
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''.
@end example

If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
replace the ``with@dots{}Texts.''@tie{}line with this:

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

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.

@bye
