🔀 Cross-platform Golang implementation of TapDance censorship circumvention system client.
Clone or download
sergeyfrolov protobuf: +stats, +covert init (#87)
protobuf: +stats, +covert init and all sorts of things the commit

* Adds SessionStats protobuf for client to report statistics about initial
session establishment.
* Adds X-Proto: header to initial message, which may contain arbitrary
extensible protobufs. Currently it may contain address of covert
hostname:port for station to connect client to (and skip 1+ RTT, 
cutting proxy latency overhead in half.)
* Generate new remote conn ID for each dial attempt
* cli: add connect_target
* Fresh ClientConf
Latest commit 3de25d2 Oct 16, 2018



TapDance Client

TapDance is a free-to-use anti-censorship technology, protected from enumeration attacks.


Download Golang and TapDance and dependencies

  1. Install Golang (currently tested against version 1.10 and latest).

  2. Get source code for Go TapDance and all dependencies:

go get -d -u -t github.com/sergeyfrolov/gotapdance/...

Ignore the "no buildable Go source files" warning.

If you have outdated versions of libraries used, you might want to do go get -u all.


There are 3 supported ways to use TapDance:

package main

import (

func main() {
    // first, copy ClientConf and roots files into assets directory
    // make sure assets directory is writable (only) by the td process

    tdConn, err := tapdance.Dial("tcp", "censoredsite.com:80")
    if err != nil {
        fmt.Printf("tapdance.Dial() failed: %+v\n", err)
    // tdConn implements standard net.Conn, allowing to use it like any other Golang conn with
    // Write(), Read(), Close() etc. It also allows to pass tdConn to functions that expect
    // net.Conn, such as tls.Client() making it easy to do tls handshake over TapDance conn.
    _, err = tdConn.Write([]byte("GET / HTTP/1.1\nHost: censoredsite.com\n\n"))
    if err != nil {
        fmt.Printf("tdConn.Write() failed: %+v\n", err)
    buf := make([]byte, 16384)
    _, err = tdConn.Read(buf)
    // ...


Refraction Networking is an umberlla term for the family of similarly working technnologies.

TapDance station code released for FOCI'17 on github: refraction-networking/tapdance

Original 2014 paper: "TapDance: End-to-Middle Anticensorship without Flow Blocking"

Newer(2017) paper that shows TapDance working at high-scale: "An ISP-Scale Deployment of TapDance"