Basic implementation of client: render qa code and scan from mobile app
diff --git a/core/client/main.go b/core/client/main.go
new file mode 100644
index 0000000..44bc154
--- /dev/null
+++ b/core/client/main.go
@@ -0,0 +1,78 @@
+package main
+
+import (
+	"bytes"
+	"encoding/json"
+	"flag"
+	"image"
+	"image/png"
+
+	"gioui.org/app"
+	"gioui.org/io/system"
+	"gioui.org/op"
+	"gioui.org/op/paint"
+	"gioui.org/unit"
+	qrcode "github.com/skip2/go-qrcode"
+)
+
+var vpnApiAddr = flag.String("vpn-api-addr", "", "VPN API server address")
+
+type config struct {
+	VPNApiAddr string `json:"vpn_api_addr"`
+	Message    []byte `json:"message"`
+	Signature  []byte `json:"signature"`
+}
+
+func prepareConfigQRCode(vc *VPNApiClient) (*image.Image, error) {
+	message := []byte("Hello PCloud")
+	signature, err := vc.Sign(message)
+	if err != nil {
+		return nil, err
+	}
+	c := config{
+		*vpnApiAddr,
+		message,
+		signature,
+	}
+	var data bytes.Buffer
+	if err := json.NewEncoder(&data).Encode(c); err != nil {
+		return nil, err
+	}
+	qr, err := qrcode.Encode(data.String(), qrcode.Medium, 1024)
+	if err != nil {
+		return nil, err
+	}
+	img, err := png.Decode(bytes.NewReader(qr))
+	if err != nil {
+		return nil, err
+	}
+	return &img, nil
+}
+
+func main() {
+	flag.Parse()
+	go func() {
+		vc := &VPNApiClient{
+			*vpnApiAddr,
+		}
+		img, err := prepareConfigQRCode(vc)
+		if err != nil {
+			panic(err)
+		}
+		w := app.NewWindow(
+			app.Size(unit.Px(1024), unit.Px(1024)),
+			app.Title("PCloud"),
+		)
+		ops := new(op.Ops)
+		for e := range w.Events() {
+			switch e := e.(type) {
+			case system.FrameEvent:
+				ops.Reset()
+				paint.NewImageOp(*img).Add(ops)
+				paint.PaintOp{}.Add(ops)
+				e.Frame(ops)
+			}
+		}
+	}()
+	app.Main()
+}