Next: Freedom to copy [Contents][Index]
Hyperdrive is a P2P, real-time, local-first, versioned filesystem
designed for easy peer-to-peer file sharing. hyperdrive.el
is an
independent project built by USHIN which provides an Emacs interface
for managing hyperdrives.
hyperdrive.el
is in early development. If something breaks, please see
Troubleshooting.
This manual is for hyperdrive.el
version 0.4.2.
Next: Installation, Previous: Hyperdrive.el User Manual, Up: Hyperdrive.el User Manual [Contents][Index]
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.”
Next: Example configuration, Previous: Freedom to copy, Up: Hyperdrive.el User Manual [Contents][Index]
Next: Install curl, Up: Installation [Contents][Index]
hyperdrive.el
requires GNU Emacs version 28.1 or later.
Next: Install hyperdrive.el, Previous: Install Emacs, Up: Installation [Contents][Index]
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.
Next: Install hyper-gateway-ushin, Previous: Install curl, Up: Installation [Contents][Index]
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.
Previous: Install hyperdrive.el, Up: Installation [Contents][Index]
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.
Next: Usage, Previous: Installation, Up: Hyperdrive.el User Manual [Contents][Index]
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) (hyperdrive-menu-bar-mode 1))
With (use-package)use-package:
(use-package hyperdrive :bind ("C-c h" . hyperdrive-menu) :init (hyperdrive-menu-bar-mode 1))
Next: Concepts, Previous: Example configuration, Up: Hyperdrive.el User Manual [Contents][Index]
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.
Next: Menu bar support, Up: Usage [Contents][Index]
Run M-x hyperdrive-install
to download and install the gateway program
(see hyper-gateway-ushin):
Download and install the gateway. Prompts for confirmation before downloading.
Cancel installation in progress.
Next: Hyperdrive menu command, Previous: Install the gateway, Up: Usage [Contents][Index]
If you enabled 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.
Next: Open a hyperdrive, Previous: Hyperdrive menu command, Up: Usage [Contents][Index]
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).
Start the gateway.
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.
Stop the gateway.
Hook run when the gateway is no longer live after hyperdrive-stop
.
Restart the gateway.
Say the version of the gateway which is running.
Up: Start/stop the gateway [Contents][Index]
Function run to start the gateway. By default, hyperdrive.el
will
start the gateway as an Emacs subprocess.
Function run to stop the gateway.
Function run to check that the gateway process is live.
Next: Create a hyperdrive, Previous: Start/stop the gateway, Up: Usage [Contents][Index]
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/
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:
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.
Like hyperdrive-find-file
, but open the file in (emacs)view-mode.
Next: File view, Up: Open a hyperdrive [Contents][Index]
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:
fully downloaded (hyperdrive-size-fully-downloaded
)
partially downloaded (hyperdrive-size-partially-downloaded
)
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:
Move between entries.
Open the file or directory at point.
Open the file or directory at point in a new window.
Open the file or directory at point in (emacs)view-mode.
Go up to the parent directory.
Refresh the directory to display potential updates.
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
).
Download the file at point to disk.
Delete the file or directory (recursively) at point.
Delete your local copy of the file at point.
Open the version history (see View the hyperdrive version history) of file at point.
Copy the URL of the file or directory at point.
Open imenu
to quickly jump to a file in the current directory.
Open hyperdrive-menu
(see Hyperdrive menu command).
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:
Display buffer action for hyperdrive directories. Passed to
display-buffer
, which see.
Column by which directory entries are sorted by default.
Internally, a cons cell of (COLUMN . DIRECTION), the COLUMN being
one of the directory listing columns (name
, size
, or mtime
) and
DIRECTION being one of :ascending
or :descending
.
Next: Unknown paths, Previous: Directory view, Up: Open a hyperdrive [Contents][Index]
The following keybindings are available inside the file view by default:
Refresh the file to display potential updates. This command remaps
the global revert-buffer-quick
keybinding.
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:
Control how HTML hyperdrive files are displayed. By default, HTML
pages are rendered in Emacs with (eww)EWW. If nil
, raw HTML will be
displayed.
Previous: File view, Up: Open a hyperdrive [Contents][Index]
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. This only
works for files, not folders (see No directory version history)
u
(up) to open the parent directory containing that file or folder
r
(recurse) to go up the directory tree until a directory is found
or until you get to the root directory.
e
(explain) to open this section of the hyperdrive Info manual.
q
(exit) to exit,
?
(help) to show a help message.
If you attempt to load the root directory (hyper://PUBLIC-KEY/
) of a
hyperdrive with a valid-looking public key which you’ve never loaded
before and for which no peers are currently found, hyperdrive.el
should warn you that no peers were found for that drive. This might
mean that the drive doesn’t exist or just that you’re not connected to
anyone who knows about it.
If you attempt to load a file or directory for a hyperdrive with a
malformed public key, hyperdrive.el
should ask you to double-check the
URL.
Next: Write to a hyperdrive, Previous: Open a hyperdrive, Up: Usage [Contents][Index]
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.
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.
Next: Link to a hyperdrive, Previous: Create a hyperdrive, Up: Usage [Contents][Index]
After modifying a file in one of your hyperdrives, save-buffer
will
silently update the current hyperdrive file with the new content.
Save the current hyperdrive file buffer to its location.
Save all modified hyperdrive file buffers to their locations. This
command’s primary purpose is to save normal file buffers, and
hyperdrive.el
has integrated with it.
hyperdrive.el
will prompt to save modified hyperdrive files before
exiting Emacs. If you want the command save-some-buffers
to always
prompt to save hyperdrive files in addition to regular files, set
save-some-buffers-default-predicate
to t
.
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.
Next: Delete a hyperdrive file, Previous: Write to a hyperdrive, Up: Usage [Contents][Index]
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.
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).
Next: Markdown links, Up: Link to a hyperdrive [Contents][Index]
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
.
This option controls whether relative links to hyperdrives are ever
inserted with org-insert-link
. Set it to t
if you always want to
insert full hyper://
links.
Previous: Org mode links, Up: Link to a hyperdrive [Contents][Index]
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
.
Next: Forget a hyperdrive file, Previous: Link to a hyperdrive, Up: Usage [Contents][Index]
Please note that deleted files can be accessed by loading a prior version of the hyperdrive (see View the hyperdrive version history).
Delete the hyperdrive file in the current buffer.
This command also has a keybinding in the directory view (see Directory view).
Next: View the hyperdrive version history, Previous: Delete a hyperdrive file, Up: Usage [Contents][Index]
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.
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.
Next: Describe a hyperdrive, Previous: Forget a hyperdrive file, Up: Usage [Contents][Index]
Hyperdrives are versioned, meaning that you can explore the history of changes made to hyperdrive files (see Versioning).
Open the previous version of the current hyperdrive file or directory.
Open the next version of the current hyperdrive file or directory.
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
):
Traverse version history for the current file.
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.
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:
Move between entries.
Load version history for unknown version ranges.
Open the file at the start of the version range at point.
Open the file at the start of the version range at point in a new window.
Open the file at the start of the version range at point in (emacs)view-mode.
Copy the URL of the file at the start of the version range at point.
Download the file at the start of the version range at point.
Display the differences between the version at point and the prior version.
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:
Display buffer action for hyperdrive history buffers. Passed to
display-buffer
, which see.
Next: Name a hyperdrive, Previous: View the hyperdrive version history, Up: Usage [Contents][Index]
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.
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
.
Next: Bookmark a hyperdrive, Previous: Describe a hyperdrive, Up: Usage [Contents][Index]
hyperdrive.el
supports different ways to identify hyperdrives (see
Naming). The following commands can be used to name hyperdrives:
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
.
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
.
Next: Stream audio and video, Previous: Name a hyperdrive, Up: Usage [Contents][Index]
You can use the built-in bookmark-set
, bookmark-jump
, and
bookmark-list
functions to store and jump to a hyperdrive file or
directory.
Select a hyperdrive bookmark and jump to it.
View a list of hyperdrive bookmarks.
Next: Download hyperdrive files, Previous: Bookmark a hyperdrive, Up: Usage [Contents][Index]
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.
Command used to play streamable URLs externally. Default uses mpv. There also exists a preconfigured option for VLC media player.
Next: Upload files from your filesystem, Previous: Stream audio and video, Up: Usage [Contents][Index]
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.
Download a hyperdrive file by selecting a hyperdrive and a path.
Download a hyperdrive file by pasting in a hyper://
URL.
Location where hyperdrive-download-url
will download files. Defaults
to eww-download-directory
or, if not bound, the home directory.
Next: Mark a hyperdrive as safe, Previous: Download hyperdrive files, Up: Usage [Contents][Index]
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.
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.
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
.
For uploading more than a few files, you can use 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
:
Upload all of the files in the “To Upload” section.
Fold or unfold the section at point.
Next: Purge a hyperdrive, Previous: Upload files from your filesystem, Up: Usage [Contents][Index]
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).
Mark a hyperdrive as “safe”, “unsafe”, or “unknown”. This command
can also be invoked from hyperdrive-menu-hyperdrive
and the menu bar.
Next: Non-interactive use, Previous: Mark a hyperdrive as safe, Up: Usage [Contents][Index]
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.
Remove all data related to a hyperdrive. This command will prompt
for confirmation before deleting anything. In addition to the
hyperdrive’s file content and metadata, hyperdrive-purge
also
deletes relevant metadata persisted in the hyperdrive-hyperdrives
and hyperdrive-version-ranges
variables.
Next: Org-transclusion integration, Previous: Purge a hyperdrive, Up: Usage [Contents][Index]
In writing your own functions to extend hyperdrive.el
, you can use
hyperdrive-by-slot
to access a hyperdrive by its metadata:
This function accepts a hyperdrive seed, petname, or public key, and
returns the hyperdrive struct
.
Up: Non-interactive use [Contents][Index]
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)))))
Next: Miscellaneous features, Previous: Non-interactive use, Up: Usage [Contents][Index]
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 (add-to-list 'org-transclusion-extensions 'hyperdrive-org-transclusion) (require 'hyperdrive-org-transclusion))
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]]
Previous: Org-transclusion integration, Up: Usage [Contents][Index]
Next: Embark integration, Up: Miscellaneous features [Contents][Index]
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
.
Next: Webjump integration, Previous: Find file at point integration, Up: Miscellaneous features [Contents][Index]
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.
Previous: Embark integration, Up: Miscellaneous features [Contents][Index]
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/"))
Next: Customization, Previous: Usage, Up: Hyperdrive.el User Manual [Contents][Index]
Next: hyper-gateway-ushin, Up: Concepts [Contents][Index]
Hyperdrive is a virtual filesystem which you can use to share files on
the peer-to-peer (P2P) hyper
network. It’s a folder with a globally
unique link starting with hyper://
that you can put files into and
other peers can pull files out of (if they have the link).
Anyone with the link to your hyperdrive can download its contents
directly from your computer. There’s no need to make an account or
rely on a third party to pass the data along. Anyone who has a copy
of the content in your hyperdrive can serve it to others. This means
that your hyperdrive can circulate on the hyper
network even when
you’re offline.
Hyperdrive is single-writer, meaning that you are the only one who change a hyperdrive that you’ve created. Files in a hyperdrive are cryptographically signed to ensure that the files you share aren’t tampered with.
You can make as many hyperdrives as you like; the only limitation is your own disk space.
Hyperdrive is offline-first since you can view files which were previously downloaded even when your machine is disconnected from the rest of the network. It’s also local-first, since you can connect with peers on a local network even without an internet connection.
Unlike BitTorrent, another P2P protocol for sharing files, hyperdrives are mutable. If you share a link to your hyperdrive and then later add, update, or delete files inside it, peers will be able to access your latest changes at the same link. When you make revisions to a hyperdrive, the old versions of your files can still be accessed by peers on the network. See Versioning for more information.
Next: Versioning, Up: Hyperdrive [Contents][Index]
Hyperdrives are sparsely replicated, meaning that peers can download particular files from a hyperdrive without having to download the whole drive. This reduces both load times and disk usage.
Next: Master key, Previous: Sparse replication, Up: Hyperdrive [Contents][Index]
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.
Next: No directory version history, Up: Versioning [Contents][Index]
Because hyperdrives are sparsely replicated (see Sparse replication),
hyperdrive.el
might not know the full version history of a file. When
the gateway (see hyper-gateway-ushin) loads a file from the network, it
also loads some version metadata about that file. Specifically, it
loads the hyperdrive version number at which the file was modified.
For example, if I load the most recent version of /bar.org
from your
hyperdrive (see the prior section), my gateway would also load the
start of the version range containing the most recent version of
/bar.org
. My hyperdrive.el
knows the latest version number of your
drive, but with partial version history, the history of /bar.org
in
your drive looks like this for me:
Version range | exists |
---|---|
53 | yes |
1-52 | unknown |
If I run M-x hyperdrive-previous
while looking at the latest version
of /bar.org
, hyperdrive.el
will display /bar.org
at version 52. In
the background, the gateway will report that /bar.org
at version 52 of
your hyperdrive was actually created at version 51 of your hyperdrive:
Version range | exists |
---|---|
53 | yes |
51-52 | yes |
1-50 | unknown |
Running hyperdrive-previous
while looking at /bar.org
at version 51 or
52 will send a request for /bar.org
at version 50. The gateway will
report that /bar.org
does not exist at version 50, but it won’t report
whether /bar.org
ever existed before version 50. For example,
/bar.org
might have been created at version 6, deleted at 14, then
created again at version 51. hyperdrive.el
will keep sending requests
to the network (up to hyperdrive-fill-version-ranges-limit
) until the
history view looks like:
Version range | exists |
---|---|
53 | yes |
51-52 | yes |
1-50 | no |
Previous: Partial version data, Up: Versioning [Contents][Index]
Version history for directories is not implemented for a design reason and technical reason:
hyperdrive-version-ranges
,
which doesn’t optimally normalize version history data, or
Previous: Versioning, Up: Hyperdrive [Contents][Index]
The secret master key is combined with a seed (see Seeds) to generate
a new public key for a hyperdrive when you run hyperdrive-new
. Your
master key is generated automatically by the gateway.
Next: Naming, Previous: Hyperdrive, Up: Concepts [Contents][Index]
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.
Previous: hyper-gateway-ushin, Up: Concepts [Contents][Index]
Inspired by Marc Stiegler’s An Introduction to Petname Systems,
hyperdrive.el
names drives in a three different ways:
public, globally unique, not human-memorable
public, not necessarily unique, human-memorable
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:
string used to generate public key
public, globally unique, human-memorable
Public keys are globally unique identifiers for hyperdrives. They
make up the first part of a hyper://
URL. Public keys are
52-character-long z-base-32 encoded keys generated from your master
key (see Master key) and a seed string. When you run hyperdrive-new
and type a new seed, the gateway automatically generates a new public
key.
Next: Petnames, Previous: Public keys, Up: Naming [Contents][Index]
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.
Petnames are locally unique hyperdrive identifiers. You can give a petname to any hyperdrive you load, whether you created it or not.
Next: DNS domains, Previous: Petnames, Up: Naming [Contents][Index]
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).
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).
Next: Known limitations, Previous: Concepts, Up: Hyperdrive.el User Manual [Contents][Index]
You can adjust the following options in the customization interface by
running M-x customize-group RET hyperdrive RET
:
Name of executable to run when starting the gateway with
hyperdrive-gateway-start-function
. hyperdrive-install
will install
the gateway to this file in hyperdrive-gateway-directory
.
Filesystem directory in which the gateway is expected to be found.
hyperdrive-install
will install the gateway to this location. When
starting the gateway, if hyperdrive-gateway-program
is not found in
this directory, Emacs searches PATH
for hyperdrive-gateway-program
.
Command line arguments passed to the gateway when starting the
gateway with the default hyperdrive-gateway-start-function
.
hyperdrive.el
will send HTTP requests to the gateway on this port.
Defaults to 4973
. The default hyperdrive-gateway-start-function
will start the gateway on this port.
Location where persist
will store data, currently
hyperdrive-hyperdrives
and hyperdrive-version-ranges
. By default,
uses the default persist
location.
Format string used for timestamps. Passed to format-time-string
,
which see.
Default number of request sent to the gateway at a time in a queue.
Defaults to 20
.
Default maximum number of requests when filling version history.
Defaults to 100
.
List of metadata types used to display hyperdrives. Hyperdrives are displayed using the first available metadata type. See Naming section for what this means.
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.
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.
Alist mapping hyperdrive and hyperdrive entry metadata to a format
string, used in hyperdrive-default-entry-format
and
hyperdrive-buffer-name-format
as well as other places hyperdrives or
entries are displayed. By default, each metadatum is prefixed by
its type, e.g., the petname foo
is displayed by default as
petname:foo
.
Feel free to adjust the following example configuration for abbreviated labels:
(setq hyperdrive-formats '((name . "%s") (version . " (%s)") (path . "%s") (petname . "p:%s") (nickname . "n:%s") (public-key . "k:%s") (short-key . "k:%.8s…") (seed . "s:%s") (domains . "d:%s")))
With this snippet, the petname foo
now displays as p:foo
. For further
customization, run M-x customize-group RET hyperdrive-entry-format
.
Up: Customization [Contents][Index]
This section mentions ways to change the behavior of hyperdrive.el
besides its own customization options.
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
.
Next: Tips, Previous: Customization, Up: Hyperdrive.el User Manual [Contents][Index]
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:
When a hyperdrive file or folder is not found, hyperdrive.el
prompts
you for an action (see Unknown paths).
Next: Non-UTF-8 encoded text, Previous: No empty directories, Up: Known limitations [Contents][Index]
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.
Previous: Files and folders can have the same name, Up: Known limitations [Contents][Index]
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).
Next: Troubleshooting, Previous: Known limitations, Up: Hyperdrive.el User Manual [Contents][Index]
There are many ways to read this info manual within Emacs:
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.
Next: Contributing/Getting help, Previous: Tips, Up: Hyperdrive.el User Manual [Contents][Index]
Up: Troubleshooting [Contents][Index]
Please ensure that you have the expected version of the gateway by
running M-x hyperdrive-install
.
Next: Uninstallation, Previous: Troubleshooting, Up: Hyperdrive.el User Manual [Contents][Index]
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.
Next: Acknowledgments, Previous: Contributing/Getting help, Up: Hyperdrive.el User Manual [Contents][Index]
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
.
Next: Indices, Previous: Uninstallation, Up: Hyperdrive.el User Manual [Contents][Index]
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
.
Next: GNU Free Documentation License, Previous: Acknowledgments, Up: Hyperdrive.el User Manual [Contents][Index]
Next: Variable index, Previous: Keystroke index, Up: Indices [Contents][Index]
Jump to: | B C D E F M O W Y |
---|
Jump to: | B C D E F M O W Y |
---|
Next: Concept index, Previous: Function index, Up: Indices [Contents][Index]
Jump to: | C O S W |
---|
Jump to: | C O S W |
---|
Previous: Variable index, Up: Indices [Contents][Index]
Jump to: | D H N P S V |
---|
Index Entry | Section | ||
---|---|---|---|
| |||
D | |||
DNS domains: | DNS domains | ||
| |||
H | |||
hyper-gateway-ushin: | hyper-gateway-ushin | ||
| |||
N | |||
Naming: | Naming | ||
Nicknames: | Nicknames | ||
| |||
P | |||
Petnames: | Petnames | ||
Public keys: | Public keys | ||
| |||
S | |||
Seeds: | Seeds | ||
Sparse replication: | Sparse replication | ||
| |||
V | |||
Versioning: | Versioning | ||
|
Jump to: | D H N P S V |
---|
Previous: Indices, Up: Hyperdrive.el User Manual [Contents][Index]
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.
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.
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.
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.
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.
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:
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.
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.”
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.
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 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.
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.
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.
“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.
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.