diff --git a/cmd/tutter_cgol/cgol.go b/cmd/tutter_cgol/cgol.go
new file mode 100644
index 0000000000000000000000000000000000000000..dd25897886ccbbde9589b4856b6e48b3baaabcb1
--- /dev/null
+++ b/cmd/tutter_cgol/cgol.go
@@ -0,0 +1,68 @@
+package main
+
+import (
+	"github.com/samber/lo"
+	"pp/pkg/tutter"
+	"simonwaldherr.de/go/cgolGo/life"
+	"strings"
+	"time"
+)
+
+func main() {
+	field := life.GenerateFirstRound(8, 8)
+
+	prevF := ""
+
+	for {
+		cells := field.GetCells()
+
+		rows := lo.Map(cells, func(row []int, _ int) string {
+			strs := lo.Map(row, func(item int, _ int) string {
+				if item != 0 {
+					return "⬛"
+				} else {
+					return "⬜"
+				}
+			})
+
+			return strings.Join(strs, "")
+		})
+
+		f := strings.Join(rows, "\n")
+
+		f = "#cgol\n" + f
+
+		e := tutter.Send(f)
+		if e != nil {
+			panic(e)
+		}
+
+		if prevF == f {
+			e = tutter.Send(`#cgol
+Board is stable. I'll go grab a covfefe.`)
+			if e != nil {
+				panic(e)
+			}
+
+			field = life.GenerateFirstRound(8, 8)
+		}
+
+		prevF = f
+
+		time.Sleep(time.Second)
+
+		alive := strings.Contains(f, "⬛")
+
+		if !alive {
+			e = tutter.Send(`#cgol
+Board is dead!!! I go brrr.`)
+			if e != nil {
+				panic(e)
+			}
+
+			field = life.GenerateFirstRound(8, 8)
+		}
+
+		field = field.NextRound()
+	}
+}
diff --git a/go.mod b/go.mod
index fd498ac0edaad65b94fd8b49ee97d0c6b4a2bd28..46b86b171bcc4b18aa4dd3b06f0f3327929696c7 100644
--- a/go.mod
+++ b/go.mod
@@ -2,18 +2,23 @@ module pp
 
 go 1.20
 
+require (
+	github.com/funny/crypto v0.0.0-20161011085906-d0152d76d92a
+	github.com/gin-gonic/gin v1.9.1
+	github.com/gorilla/websocket v1.5.0
+	github.com/samber/lo v1.38.1
+	simonwaldherr.de/go/cgolGo v0.10.0
+)
+
 require (
 	github.com/bytedance/sonic v1.9.1 // indirect
 	github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect
-	github.com/funny/crypto v0.0.0-20161011085906-d0152d76d92a // indirect
 	github.com/gabriel-vasile/mimetype v1.4.2 // indirect
 	github.com/gin-contrib/sse v0.1.0 // indirect
-	github.com/gin-gonic/gin v1.9.1 // indirect
 	github.com/go-playground/locales v0.14.1 // indirect
 	github.com/go-playground/universal-translator v0.18.1 // indirect
 	github.com/go-playground/validator/v10 v10.14.0 // indirect
 	github.com/goccy/go-json v0.10.2 // indirect
-	github.com/gorilla/websocket v1.5.0 // indirect
 	github.com/json-iterator/go v1.1.12 // indirect
 	github.com/klauspost/cpuid/v2 v2.2.4 // indirect
 	github.com/leodido/go-urn v1.2.4 // indirect
@@ -21,7 +26,6 @@ require (
 	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
 	github.com/modern-go/reflect2 v1.0.2 // indirect
 	github.com/pelletier/go-toml/v2 v2.0.8 // indirect
-	github.com/samber/lo v1.38.1 // indirect
 	github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
 	github.com/ugorji/go/codec v1.2.11 // indirect
 	golang.org/x/arch v0.3.0 // indirect
@@ -32,4 +36,5 @@ require (
 	golang.org/x/text v0.9.0 // indirect
 	google.golang.org/protobuf v1.30.0 // indirect
 	gopkg.in/yaml.v3 v3.0.1 // indirect
+	simonwaldherr.de/go/golibs v0.15.0 // indirect
 )
diff --git a/go.sum b/go.sum
index 94849612c55020894c59090281ff270193992fbc..1c2aa97b4aa2c55419f3635bc70b89994015d8a6 100644
--- a/go.sum
+++ b/go.sum
@@ -5,6 +5,7 @@ github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F
 github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams=
 github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/funny/crypto v0.0.0-20161011085906-d0152d76d92a h1:R2xoAw1XG39E29rKtP9veb642O0/BldKquO0KehI3lo=
 github.com/funny/crypto v0.0.0-20161011085906-d0152d76d92a/go.mod h1:Yye2edoCeYVlm60tkTaws4eZvBn/vg2c7nyUrr+eAR8=
@@ -14,6 +15,7 @@ github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE
 github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
 github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg=
 github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU=
+github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
 github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
 github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
 github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
@@ -23,6 +25,7 @@ github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QX
 github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
 github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
 github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
+github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
 github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
@@ -43,6 +46,7 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G
 github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
 github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ=
 github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 github.com/samber/lo v1.38.1 h1:j2XEAqXKb09Am4ebOg31SpvzUTTs6EN3VfgeLUhPdXM=
 github.com/samber/lo v1.38.1/go.mod h1:+m/ZKRl6ClXCE2Lgf3MsQlWfh4bn1bz6CXEOxnEXnEA=
@@ -55,6 +59,7 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
 github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
 github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
 github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
+github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY=
 github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
 github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
 github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
@@ -76,11 +81,17 @@ golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE=
 golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
 google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
 google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng=
 google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
+simonwaldherr.de/go/cgolGo v0.10.0 h1:CfcjI8zr+6YHEoDBbq/XQFaH0lVXRR3p+l6wSeyq78s=
+simonwaldherr.de/go/cgolGo v0.10.0/go.mod h1:z/r2H6AxooDm201GgTaj/ABNWCihl6IxRUYe1o5kBBE=
+simonwaldherr.de/go/golibs v0.15.0 h1:SA3NYxUF/4+Pt3r6Pj97IUIlJ/NUm5i9ew9xbhXwyXs=
+simonwaldherr.de/go/golibs v0.15.0/go.mod h1:sW7x4PAds/r6rLt/THqsZhpFxoq2n6cBb5QtlZ44eVk=
diff --git a/pkg/grind/discovered.go b/pkg/grind/discovered.go
index 31b4987a83b55ded40f89071a8153bbd3e37ec08..be1a050ea80736eecf16bb8a5f6b87fce341d2af 100644
--- a/pkg/grind/discovered.go
+++ b/pkg/grind/discovered.go
@@ -6,6 +6,8 @@ import (
 	"log"
 	"math/rand"
 	"net/http"
+	"os"
+	"strconv"
 	"strings"
 	"time"
 )
@@ -28,11 +30,28 @@ type Details struct {
 	} `json:"properties"`
 }
 
+var discoverDropRatio = -1.0
+
+func init() {
+	ddr, e := strconv.ParseFloat(os.Getenv("DDR"), 64)
+	if e == nil {
+		discoverDropRatio = ddr
+	}
+}
+
+func randDropBool() bool {
+	r := rand.Float64()
+	return r < discoverDropRatio
+}
+
 func Discover(d Discovered) error {
 	for _, ip := range d.IPs {
-		go func(ip string) {
-			log.Println("Discover", ip)
+		if randDropBool() {
+			log.Println("Dropping", ip)
+			continue
+		}
 
+		go func(ip string) {
 			resp, e := http.Get(fmt.Sprintf("http://[%s]:8080/describe", ip))
 			if e != nil {
 				log.Println("host is ded", ip)
diff --git a/pkg/grind/sendMeme.go b/pkg/grind/sendMeme.go
index fe62f5cefa29a2cd35f0480475458c2fb7adc2fe..12c5a5eacd81672902d394acb3aa0cd4db338a76 100644
--- a/pkg/grind/sendMeme.go
+++ b/pkg/grind/sendMeme.go
@@ -18,7 +18,6 @@ func submit(ip, pass string) ([]string, error) {
 	isCache := cache[ip]
 	mut.Unlock()
 	if isCache {
-		log.Println("Cache hit, deny to", ip)
 		return nil, nil
 	}
 
@@ -41,8 +40,12 @@ func submit(ip, pass string) ([]string, error) {
 	case 204:
 		log.Printf("First submission to %s\n", ip)
 		mut.Lock()
+		isRace := cache[ip]
 		cache[ip] = true
 		mut.Unlock()
+		if isRace {
+			return nil, nil
+		}
 		e = comms.SendJSON(Submitted{
 			Id:       0,
 			IP:       ip,
@@ -60,6 +63,9 @@ func submit(ip, pass string) ([]string, error) {
 		}
 
 		log.Printf("Succesful solve of %s\n", ip)
+		mut.Lock()
+		cache[ip] = true
+		mut.Unlock()
 		defer resp.Body.Close()
 
 		e = comms.SendJSON(Discovered{
diff --git a/pkg/grind/submitted.go b/pkg/grind/submitted.go
index 5e93a281c76b90b211537f4283efb737639f6459..303d11616040ac09a3d270d8da009922db49a55c 100644
--- a/pkg/grind/submitted.go
+++ b/pkg/grind/submitted.go
@@ -2,7 +2,6 @@ package grind
 
 import (
 	"fmt"
-	"log"
 	"math/rand"
 	"time"
 )
@@ -14,8 +13,6 @@ func Submit(s Submitted) error {
 		time.Sleep(t)
 	}
 
-	log.Println("Submit", s.IP)
-
 	_, e := submit(s.IP, s.Text)
 
 	return e
diff --git a/pkg/tutter/tutter.go b/pkg/tutter/tutter.go
index 26f88ae9727a7bff602c875cdaaf4c6faab9e05d..774c10abaada338c44de3bed20b5c3eafaa17319 100644
--- a/pkg/tutter/tutter.go
+++ b/pkg/tutter/tutter.go
@@ -28,11 +28,11 @@ const url = "https://tutter.pproj.dev/api/poll"
 var last = 0
 
 func LongPoll() <-chan Message {
-	ch := make(chan Message)
+	ch := make(chan Message, 500)
 
 	go func() {
 		for {
-			murl := "https://tutter.pproj.dev/api/post?limit=25&order=desc"
+			murl := "https://tutter.pproj.dev/api/post?limit=1&order=desc"
 			if last != 0 {
 				murl = fmt.Sprintf("%s?last=%d", url, last)
 			}