User-visible changes in "magic-wormhole":

## Upcoming Release

* (add release-notes here when making PRs)


## Release 0.18.0 (11-Mar-2025)

* Improve the example to act more like send/receive (#558, @OndrewBot)
* Display a QR code by default for "wormhole send" (#555, @ferada + @meejah)
  This encodes "wormhole-transfer:M-word0-word1" per the spec:
  https://github.com/magic-wormhole/magic-wormhole-protocols/blob/main/uri-scheme.md
* Add sequence diagram
* Support Read the Docs pull-request builds
* Drop support for Python 3.8 (#556)
* Add broken-link checker (#588, https://github.com/Cycloctane)
* Preemptively fix Click 8.2 (#584, @cjwatson)
* Basic support for PEP518 (#579, @SnoopJ)
* Add WORMHOLE_ACCEPT_FILE (#570, @haatveit)


## Release 0.17.0 (23-Oct-2024)

* Bump magic-wormhole-transit-relay to 0.3.1 for testing, and fix (#543)
* Fix test regression under Twisted 24.10.0 (#553)

## Release 0.16.0 (3-Oct-2024)

* Updated to python-spake2 version 0.9
* Removed more Python2-isms


## Release 0.15.0 (7-Aug-2024)

* Incorporate attrs' zope-interface support (#492, #527, from https://github.com/meejah)
* Add "codespell" to correct spelling (#526, from https://github.com/yarikoptic)
* Fix bash completions (#525, from https://github.com/RobertoD91)
* run tests properly when Noise is not installed (#522, from https://github.com/anarcat)


## Release 0.14.0 (28-Mar-2024)

* Add completion files for bash, zsh and fish (#498)
* Python 3.12 added to CI, versioneer updated (#505)
* Support streaming compression of directories (#503, from https://github.com/pR0Ps/)
* Remove obsolete compatibility code (thanks https://github.com/a-detiste/)
* Add "ecosystem" document


## Release 0.13.0 (10-Aug-2023)

* Python 2.7 support is dropped (#457)
* Python 3.5 and 3.6 are past their EOL date and support is dropped (#448)
* SECURITY: Replace "weird" characters in receiver's display (#476)
* SECURITY: all past binary signatures are now in Git
* Use the HKDF primitive from "cryptography" (#462)
* `wormhole receive` now accepts `--allocate-code` so that a sender can
  use `--code` to send them a file (#450)
* Stream to disk after 10MB on directory receive (#447)
* Handle SSH keys with comments properly (#434)
* Properly parse IPv6 Transit address (#461)

Also of interest to developers in this release are a few changes to the experimental Dilation implementation and description; some documentation cleanups; dropping of dependencies; and some test cleanups.
The Dilation changes properly send `use-version` and split messages over Noise-sized chunks more seamlessly (allowing the specified 4-byte maximum message size at the application layer).

For packagers: PyPI has stopped serving detached signature files.
Going forward, all signatures will be committed to Git (in the signatures/ subdirectory).
All available signatures from PyPI for historic releases have been added here too.

Thanks to the many contributors of bug-fixes, patches, and other help with this
release:

* Jelle van der Waa https://github.com/jelly (#466)
* Matthias Riße https://github.com/matrss (#432, #434)
* meejah https://meejah.ca (#484, #481, #483, #455, #477, #464, #456, #460)
* Perseid https://github.com/Perseid (#476)
* FelisDiligens https://github.com/FelisDiligens (#461)
* Casey Link https://github.com/Ramblurr (#468)
* Kian-Meng Ang https://github.com/kianmeng (#452)
* sitiom https://github.com/sitiom (#436)
* Sagar Howal https://github.com/sagarhowal (#410)
* Adam Sroka https://github.com/adam-sroka (#403, #404)
* vu3rdd https://github.com/vu3rdd (reviews)


## Release 0.12.0 (04-Apr-2020)

* A command like `wormhole send /dev/fd0` can send the contents of the named
  block device (USB stick, SD card, floppy, etc), resulting in a plain file
  on the other side. (#323)
* Change "accept this file?" default answer from no to yes. (#327 #330 #331)
* Actually use tempfile for large directory transfers. This fixes a five-year
  old bug which prevents transfers of directories larger than available RAM
  by finally really building the temporary zipfile on disk. (#379)
* Accept 'wss' for TLS-protected relay connections, which default to port 443
  if no other port is accepted. A future release will change the public relay
  to use TLS. (#144)
* Drop support for python3.4
* Stall `--verify` long enough to send the verifier. This fixes a bug when
  both sides use `--verify`, the receiver uses tab-completion, the sender
  sees the verifier and waits for the user to confirm, but the receiver
  cannot show the verifier (enabling that confirmation) until the sender
  approves the transfer. (#349)

This release also includes an incomplete implementation of the new "Dilation"
API (see ticket #312 for details). In the future this will enable restarting
interrupted transfers, tolerating changes in network address, bidirectional
transfers in a long-running GUI/daemon process, and more. The protocol is not
finalized, nor is it backward compatible with the old "Transit" protocol yet,
so there is no CLI access so far. The code is present and tested to make sure
it doesn't regress and for ease of development, but intrepid folks who want
to try it out will need to write a client first (and be aware that the
protocol may change out from under them). A future release will add
compatibility negotiation with old clients and start using the new protocol.

PRs and tickets addressed in this release: #144 #312 #318 #321 #323 #327 #330
#331 #332 #339 #349 #361 #365 #368 #367 #378 #379.

Thanks to the many contributors of bugs, patches, and other help with this
release:

* Adam Spiers aka @aspiers
* Евгений Протозанов aka @WeirdCarrotMonster
* Edward Betts aka @EdwardBetts
* Jacek Politowski aka @jpolnetpl
* Julian Stecklina aka @blitz
* Jürgen Gmach aka @jugmac00
* Louis Wilson aka @louiswins
* Miro Hrončok aka @hroncok
* Moritz Schlichting aka @morrieinmaas
* Shea Polansky aka @Phyxius
* @sneakypete81


## Release 0.11.2 (13-Nov-2018)

Rerelease to fix the long description on PyPI. Thanks to Marius Gedminas for
tracking down the problem and providing the fix. (#316)


## Release 0.11.1 (13-Nov-2018)

* Fix `python -m wormhole` on py2. (#315)

Thanks to Marius Gedminas, FreddieHo, and Jakub Wilk for patches and bug
reports in this release.


## Release 0.11.0 (16-Oct-2018)

* Python-3.7 compatibility was fixed. (#306)
* Support for Python-3.4 on Windows has been dropped. py3.4 is still
  supported on unix-like operating systems.
* The client version is now sent to the mailbox server for each connection. I
  strive to have the client share as little information as possible, but I
  think this will help me improve the protocol by giving me a better idea of
  client-upgrade adoption rates. (#293)

Packaging changes:

* We removed the Rendezvous Server (now named the "Mailbox Server") out to a
  separate package and repository named `magic-wormhole-mailbox-server`. We
  still import it for tests. Use `pip install magic-wormhole-mailbox-server`
  to run your own server. (#240)
* The code is now formatted to be PEP8 compliant. (#296)
* The Dockerfile was removed: after the Mailbox Server was moved out, I don't
  think it was relevant. (#295)

Thanks to Andreas `Baeumla` Bäuml, Marius `mgedmin` Gedminas, Ofek `ofek`
Lev, Thomas `ThomasWaldmann` Waldmann, and Vasudev `copyninja` Kamath for
patches and bug reports in this release.


## Release 0.10.5 (14-Feb-2018)

* Upgrade to newer python-spake2, to improve startup speed by not computing
  blinding factors for unused parameter sets. On a Raspberry Pi 3, this
  reduces "wormhole --version" time from ~19s to 7s.
* Fix a concurrency bug that could cause a crash if the server responded too
  quickly. (#280)


## Release 0.10.4 (28-Jan-2018)

Minor client changes:

* accept `$WORMHOLE_RELAY_URL` and `$WORMHOLE_TRANSIT_HELPER` environment
  variables, in addition to command-line arguments (#256)
* fix --tor-control-port=, which was completely broken before. If you use
  --tor but not --tor-control-port=, we'll try the default control ports
  before falling back to the default SOCKS port (#252)
* fix more directory-separator pathname problems, especially for
  bash-on-windows (#251)
* change `send` output format to make copy-paste easier (#266, #267)

We also moved the docs to readthedocs
(https://magic-wormhole.readthedocs.io/), rather than pointing folks at the
GitHub rendered markdown files. This should encourage us to write more
instructional text in the future.

Finally, we removed the Transit Relay server code from the `magic-wormhole`
package and repository. It now lives in a separate repository named
`magic-wormhole-transit-relay`, and we only import it for tests. If you'd
like to run a transit relay, you'll want to use `pip install
magic-wormhole-transit-relay`.

Thanks to meejah, Jonathan "jml" Lange, Alex Gaynor, David "dharrigan"
Harrigan, and Jaye "jtdoepke" Doepke, for patches and bug reports in this
release.


## Release 0.10.3 (12-Sep-2017)

Minor client changes:

* `wormhole help` should behave like `wormhole --help` (#61)
* accept unicode pathnames (although bugs likely remain) (#223)
* reject invalid codes (with space, or non-numeric prefix) at entry (#212)
* docs improvements (#225, #249)

Server changes:

* `wormhole-server start` adds `--relay-database-path` and
  `--stats-json-path` (#186)
* accept `--websocket-protocol-option=` (#196, #197)
* increase RLIMIT_NOFILE to allow more simultaneous client connections (#238)
* "crowded" mailboxes now deliver an error to clients, so they should give up
  instead of reconnecting (#211)
* construct relay DB more safely (#189)

In addition, the snapcraft packaging was updated (#202), and `setup.py` now
properly marks the dependency on `attrs` (#248).

Thanks to cclauss, Buckaroo9, JP Calderone, Pablo Oliveira, Leo Arias, Johan
Lindskogen, lanzelot1989, CottonEaster, Chandan Rai, Jaakko Luttinen, Alex
Gaynor, and Quentin Hibon for patches and bug reports fixed in this release.


## Release 0.10.2 (26-Jun-2017)

WebSocket connection errors are now reported properly. Previous versions
crashed with an unhelpful `automat._core.NoTransition` exception when
the TCP connection was established but WebSocket negotiation could not
complete (e.g. the URL path was incorrect and the server reported a 404,
or we connected to an SMTP or other non-HTTP server). (#180)

The unit test suite should now pass: a CLI-version advertisement issue
caused the 0.10.1 release tests to fail.

Thanks to Fabien "fdev31" Devaux for bug reports addressed in this
release.


## Release 0.10.1 (26-Jun-2017)

Server-only: the rendezvous server no longer advertises a CLI version
unless specifically requested (by passing --advertise-version= to
`wormhole-server start`). The public server no longer does this, so e.g.
0.10.0 clients will not emit a warning about the server recommending the
0.9.2 release. This feature was useful when the only way to use
magic-wormhole was to install the CLI tool with pip, however now that
0.9.1 is in debian Stretch (and we hope to maintain compatibility with
it), the nag-you-to-upgrade messages probably do more harm than good.
(#179)

No user-visible client-side changes.

Thanks to ilovezfs and JP Calderone for bug reports addressed in this
release.


## Release 0.10.0 (24-Jun-2017)

The client-side code was completely rewritten, with proper Automat state
machines. The only immediately user-visible consequence is that
restarting the rendezvous server no longer terminates all waiting
clients, so server upgrades won't be quite so traumatic. In the future,
this will also support "Journaled Mode" (see docs/journal.md for
details). (#42, #68)

The programmatic API has changed (see docs/api.md). Stability is not
promised until we reach 1.0, but this should be close, at least for the
non-Transit portions.

`wormhole send DIRECTORY` can now handle larger (>2GB) directories.
However the entire zipfile is built in-RAM before transmission, so the
maximum size is still limited by available memory (follow #58 for
progress on fixing this). (#138)

`wormhole rx --output-file=` for a pre-existing file will now overwrite
the file (noisily), instead of terminating with an error. (#73)

We now test on py3.6. Support for py3.3 was dropped. Magic-wormhole
should now work on NetBSD. (#158)

Added a Dockerfile to build a rendezvous/transit-relay server. (#149)

`wormhole-server --disallow-list` instructs the rendezvous server to not
honor "list nameplates" requests, effectively disabling tab-completion
of the initial numeric portion of the wormhole code, but also making DoS
attacks slightly easier to detect. (#53, #150)

`wormhole send --ignore-unsendable-files` will skip things that cannot
be sent (mostly dangling symlinks and files for which you do not have
read permission, but possibly also unix-domain sockets, device nodes,
and pipes). (#112, #161)

`txtorcon` is now required by default, so the `magic-wormhole[tor]`
"extra" was removed, and a simple `pip install magic-wormhole` should
provide tor-based transport as long as Tor itself is available. Also,
Tor works on py3 now. (#136, #174)

`python -m wormhole` is an alternative way to run the CLI tool. (#159)

`wormhole send` might handle non-ascii (unicode) filenames better now.
(#157)

Thanks to Alex Gaynor, Atul Varma, dkg, JP Calderone, Kenneth Reitz,
Kurt Rose, maxalbert, meejah, midnightmagic, Robert Foss, Shannon
Mulloy, and Shirley Kotian, for patches and bug reports in this release
cycle. A special thanks to Glyph, Mark Williams, and the whole
#twisted crew at PyCon for help with the transition to Automat.


## Release 0.9.2 (16-Jan-2017)

Tor support was rewritten. `wormhole send`, `wormhole receive`,
`wormhole ssh invite`, and `wormhole ssh accept` all now accept three
Tor-related arguments:

* `--tor`: use Tor for all connections, and hide all IP addresses
* `--launch-tor`: launch a new Tor process instead of using an existing
  one
* `--tor-control-port=`: use a specific control port, instead of using
  the default

If Tor is already running on your system (either as an OS-installed
package, or because the
[TorBrowser](https://www.torproject.org/projects/torbrowser.html)
application is running), simply adding `--tor` should be sufficient. If
Tor is installed but not running, you may need to use both, e.g.
`wormhole send --tor --launch-tor`. See docs/tor.md for more details.
Note that Tor support must be requested at install time (with `pip
install magic-wormhole[tor]`), and only works on python2.7 (not py3).
(#64, #97)

The relay and transit URLs were changed to point at the project's
official domain name (magic-wormhole.io). The servers themselves are
identical (only the domain name changed, not the IP address), so this
release is fully compatible with previous releases.

A packaging file for "snapcraft.io" is now included. (#131)

`wormhole receive` now reminds you that tab-completion is available, if
you didn't use the Tab key while entering the code. (#15)

`wormhole receive` should work on cygwin now (a problem with the
readline-completion library caused a failure on previous releases).
(#111)

Thanks to Atul Varma, Leo Arias, Daniel Kahn Gillmor, Christopher Wood,
Kostin Anagnostopoulos, Martin Falatic, and Joey Hess for patches and
bug reports in this cycle.


## Release 0.9.1 (01-Jan-2017)

The `wormhole` client's `--transit-helper=` argument can now include a
"relay priority" via a numerical `priority=` field, e.g.
`--transit-helper tcp:example.org:12345:priority=2.5`. Clients exchange
transit relay suggestions, then try to use the highest-priority relay
first, falling back to others after a few seconds if necessary. Direct
connections are always preferred to a relay. Clients running 0.9.0 or
earlier will ignore priorities, and unmarked relay arguments have an
implicit priority of 0. (#103)

Other changes:

* clients now tolerate duplicate peer messages: in the future, this will
  help clients recover from intermittent rendezvous connections (#121)
* rendezvous server: ensure release() and close() are idempotent (from
  different connections), also for lost-connection recovery (#118)
* transit server: respect --blur-usage= by not logging connections
* README: note py3.6 compatibility

Thanks to xloem, kneufeld, and meejah for their help this cycle.


## Release 0.9.0 (24-Dec-2016)

This release fixes an important "Transit Relay" bug that would have
prevented future versions from using non-default relay servers. It is
now easier to run `wormhole` as a subprocess beneath some other program
(the long term goal is to provide a nice API, but even with one, there
will be programs written in languages without Wormhole bindings that may
find it most convenient to use a subprocess).

* fix `--transit-helper=`: Older versions had a bug that broke
  file/directory transfers when the two sides offered different
  transit-relay servers. This was fixed by deduplicating relay hints and
  adding a new kind of relay handshake. Clients running 0.9.0 or higher
  now require a transit-relay server running 0.9.0 or higher. (#115)
* `wormhole receive`: reject transfers when the target does not appear
  to have enough space (not available on windows) (#91)
* CLI: emit pacifier message when key-verification is slow (#29)
* add `--appid=` so wrapping scripts can use a distinct value (#113)
* `wormhole send`: flush output after displaying code, for use in
  scripts (#108)
* CLI: print progress messages to stderr, not stdout (#99)
* add basic man(1) pages (#69)

Many thanks to patch submitters for this release: Joey Hess, Jared
Anderson, Antoine Beaupré, and to everyone testing and filing issues on
Github.


## Release 0.8.2 (08-Dec-2016)

* CLI: add new "wormhole ssh invite" and "wormhole ssh accept" commands, to
  facilitate appending your `~/.ssh/id_*.pub` key into a
  suitably-permissioned remote `~/.ssh/authorized_keys` file. These commands
  are experimental: the syntax might be changed in the future, or they might
  be removed altogether.
* CLI: "wormhole recv" and "wormhole recieve" are now accepted as aliases for
  "wormhole receive", to help bad spelers :)
* CLI: improve display of abbreviated file sizes
* CLI: don't print traceback upon "normal" errors
* CLI: when target file already exists, don't reveal that fact to the sender,
  just say "transfer rejected"
* magic-wormhole now depends upon `Twisted[tls]`, which will cause pyOpenSSL
  and the `cryptography` package to be installed. This should prevent a
  warning about the "service_identity" module not being available.
* other smaller internal changes

Thanks to everyone who submitted patches in this release cycle: anarcat,
Ofekmeister, Tom Lowenthal, meejah, dreid, and dkg. And thanks to the many
bug reporters on Github!


## Release 0.8.1 (27-Jul-2016)

This release contains mostly minor changes.

The most noticeable is that long-lived wormholes should be more reliable now.
Previously, if you run `wormhole send` but your peer doesn't run their
`receive` for several hours, a NAT/firewall box on either side could stop
forwarding traffic for the idle connection (without sending a FIN or RST to
properly close the socket), causing both sides to hang forever and never
actually connect. Now both sides send periodic keep-alive messages to prevent
this.

In addition, by switching to "Click" for argument parsing, we now have short
command aliases: `wormhole tx` does the same thing as `wormhole send`, and
`wormhole rx` is an easier-to-spell equivalent of `wormhole receive`.

Other changes:

* CLI: move most arguments to be attached to the subcommand (new: `wormhole
  send --verify`) rather than on the "wormhole" command (old: `wormhole
  --verify send`). Four arguments remain on the "wormhole" command:
  `--relay-url=`, `--transit-helper=`, `--dump-timing=`, and `--version`.
* docs: add links to PyCon2016 presentation
* reject wormhole-codes with spaces with a better error message
* magic-wormhole ought to work on windows now
* code-input tab-completion should work on stock OS-X python (with libedit)
* sending a directory should restore file permissions correctly
* server changes:
  * expire channels after two hours, not 3 days
  * prune channels more accurately
  * improve munin plugins for server monitoring

Many thanks to the folks who contributed to this release, during the PyCon
sprints and afterwards: higs4281, laharah, Chris Wolfe, meejah, wsanchez,
Kurt Neufeld, and Francois Marier.


## Release 0.8.0 (28-May-2016)

This release is completely incompatible with the previous 0.7.6 release.
Clients using 0.7.6 or earlier will not even notice clients using 0.8.0
or later.

* Overhaul client-server websocket protocol, client-client PAKE
  messages, per-message encryption-key derivation, relay-server database
  schema, SPAKE2 key-derivation, and public relay URLs. Add version
  fields and unknown-message tolerance to most protocol steps.
* Hopefully this will provide forward-compatibility with future protocol
  changes. I have several on my list, and the version fields should make
  it possible to add these without a flag day (at worst a "flag month").
* User-visible changes are minimal, although some operations should be
  faster because we no longer need to wait for ACKs before proceeding.
* API changes: `.send_data()/.get_data()` became `.send()/.get()`,
  neither takes a phase= argument (the Wormhole is now a record pipe)
  `.get_verifier()` became `.verify()` (and waits to receive the
  key-confirmation message before firing its Deferred), wormholes are
  constructed with a function call instead of a class constructor,
  `close()` always waits for server ack of outbound messages. Note that
  the API remains unstable until 1.0.0 .
* misc/munin/ contains plugins for relay server operators


## Release 0.7.6 (08-May-2016)

* Switch to "tqdm" for nicer CLI progress bars.
* Fail better when input-code is interrupted (prompt user to hit Return,
  rather than hanging forever)
* Close channel upon error more reliably.
* Explain WrongPasswordError better.
* (internal): improve --dump-timing instrumentation and rendering.

Compatibility: this remains compatible with 0.7.x, and 0.8.x is still
expected to break compatibility.


## Release 0.7.5 (20-Apr-2016)

* The CLI tools now use the Twisted-based library exclusively.
* The blocking-flavor "Transit" library has been removed. Transit is the
  bulk-transfer protocol used by send-file/send-directory. Upcoming protocol
  improvements (performance and connectivity) proved too difficult to
  implement in a blocking fashion, so for now if you want Transit, use
  Twisted.
* The Twisted-flavor "Wormhole" library now uses WebSockets to connect,
  rather than HTTP. The blocking-flavor library continues to use HTTP.
  "Wormhole" is the one-message-at-a-time relay-based protocol, and is
  used to set up Transit for the send-file and send-directory modes of
  the CLI tool.
* Twisted-flavor input_code() now does readline-based code entry, with
  tab completion.
* The package now installs two executables: "wormhole" (for send and
  receive), and "wormhole-server" (to start and manage the relay
  servers). These may be re-merged in a future release.

Compatibility:

* This release remains compatible with the previous ones. The next major
  release (0.8.x) will probably break compatibility.

Packaging:

* magic-wormhole now depends upon "Twisted" and "autobahn" (for WebSockets).
  Autobahn pulls in txaio, but we don't support it yet (a future version of
  magic-wormhole might).
* To work around a bug in autobahn, we also (temporarily) depend upon
  "pytrie". This dependency will be removed when the next autobahn release is
  available.


## Release 0.7.0 (28-Mar-2016)

* `wormhole send DIRNAME/` used to deal very badly with the trailing slash
  (sending a directory with an empty name). This is now fixed.
* Preliminary Tor support was added. Install `magic-wormhole[tor]`, make sure
  you have a Tor executable on your $PATH, and run `wormhole --tor send`.
  This will launch a new Tor process. Do not use this in anger/fear until it
  has been tested more carefully. This feature is likely to be unstable for a
  while, and lacks tests.
* The relay now prunes unused channels properly.
* Added --dump-timing= to record timeline of events, for debugging and
  performance improvements. You can combine timing data from both sides to
  see where the delays are happening. The server now returns timestamps in
  its responses, to measure round-trip delays. A web-based visualization tool
  was added in `misc/dump-timing.py`.
* twisted.transit was not properly handling multiple records received in a
  single chunk. Some producer/consumer helper methods were added. You can now
  run e.g. `wormhole --twisted send` to force the use of the Twisted
  implementation.
* The Twisted wormhole now uses a persistent connection for all relay
  messages, which should be slightly faster.
* Add `--no-listen` to prevent Transit from listening for inbound connections
  (or advertising any addresses): this is only useful for testing.
* The tests now collect code coverage information, and upload them to
  https://codecov.io/github/warner/magic-wormhole?ref=master .

## Release 0.6.3 (29-Feb-2016)

Mostly internal changes:

* twisted.transit was added, so Twisted-based applications can use it now.
  This includes Producer/Consumer -based flow control. The Transit protocol
  and API are documented in docs/transit.md .
* The transit relay server can blur filesizes, rounding them to some
  roughly-logarithmic interval.
* Use --relay-helper="" to disable use of the transit relay entirely,
  limiting the file transfer to direct connections.
* The new --hide-progress option disables the progress bar.
* Made some windows-compatibility fixes, but all tests do not yet pass.

## Release 0.6.2 (12-Jan-2016)

* the server can now "blur" usage information: this turns off HTTP logging,
  and rounds timestamps to coarse intervals
* `wormhole server usage` now shows Transit usage too, not just Rendezvous

## Release 0.6.1 (03-Dec-2015)

* `wormhole` can now send/receive entire directories. They are zipped before
  transport.
* Python 3 is now supported for async (Twisted) library use, requiring at
  least Twisted-15.5.0.
* A bug was fixed which prevented py3-based clients from using the relay
  transit server (not used if the two sides can reach each other directly).
* The `--output-file=` argument was finally implemented, which allows the
  receiver to override the filename that it writes. This may help scripted
  usage.
* Support for Python-2.6 was removed, since the recent Twisted-15.5.0 removed
  it too. It might still work, but is no longer automatically tested.
* The transit relay now implements proper flow control (Producer/Consumer),
  so it won't buffer the entire file when the sender can push data faster
  than the receiver can accept it. The sender should now throttle down to the
  receiver's maximum rate.

## Release 0.6.0 (23-Nov-2015)

* Add key-confirmation message so "wormhole send" doesn't hang when the
  receiver mistypes the code.
* Fix `wormhole send --text -` to read the text message from stdin. `wormhole
  receive >outfile` works, but currently appends an extra newline, which may
  be removed in a future release.
* Arrange for 0.4.0 senders to print an error message when connecting to a
  current (0.5.0) server, instead of an ugly stack trace. Unfortunately 0.4.0
  receivers still display the traceback, since they don't check the welcome
  message before using a missing API. 0.5.0 and 0.6.0 will do better.
* Improve channel deallocation upon error.
* Inform the server of our "mood" when the connection closes, so it can track
  the rate of successful/unsuccessful transfers. The server DB now stores a
  summary of each transfer (waiting time and reported outcome).
* Rename (and deprecate) one server API (the non-EventSource form of "get"),
  leaving it in place until after the next release. 0.5.0 clients should
  interoperate with both the 0.6.0 server and 0.6.0 clients, but eventually
  they'll stop working.

## Release 0.5.0 (07-Oct-2015)

* Change the CLI to merge send-file with send-text, and receive-file with
  receive-text. Add confirmation before accepting a file.
* Change the remote server API significantly, breaking compatibility with
  0.4.0 peers. Fix EventSource to match W3C spec and real browser behavior.
* Add py3 (3.3, 3.4, 3.5) compatibility for blocking calls (but not Twisted).
* internals
 * Introduce Channel and ChannelManager to factor out the HTTP/EventSource
   technology in use (making room for WebSocket or Tor in the future).
 * Change app-visible API to allow multiple message phases.
 * Change most API arguments from bytes to unicode strings (appid, URLs,
   wormhole code, derive_key purpose string, message phase). Derived keys are
   bytes, of course.
* Add proper unit tests.

## Release 0.4.0 (22-Sep-2015)

This changes the protocol (to a symmetric form), breaking compatibility with
0.3.0 peers. Now both blocking-style and Twisted-style use a symmetric
protocol, and the two sides do not need to figure out (ahead of time) which
one goes first. The internal layout was rearranged, so applications that
import wormhole must be updated.

## Release 0.3.0 (24-Jun-2015)

Add preliminary Twisted support, only for symmetric endpoints (no
initiator/receiver distinction). Lacks code-entry tab-completion. May still
leave timers lingering. Add test suite (only for Twisted, so far).

Use a sqlite database for Relay server state, to survive reboots with less
data loss. Add "--advertise-version=" to "wormhole relay start", to override
the version we recommend to clients.

## Release 0.2.0 (10-Apr-2015)

Initial release: supports blocking/synchronous asymmetric endpoints
(Initiator on one side, Receiver on the other). Codes can be generated by
Initiator, or created externally and passed into both (as long as they start
with digits: NNN-anything).
