diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index 242bb8dbe70a7d7a5dd0e4517899698aab27d41a..a6734362d31d3d08a00f03782821d36895ceeee7 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -13,9 +13,9 @@ jobs:
       fail-fast: false
       matrix:
         go_version:
-          - '1.18'
-          - '1.19'
-          - '1.20'
+          - '1.21'
+          - '1.22'
+          - '1.23'
           - tip
     name: Test with ${{ matrix.go_version }}
     steps:
@@ -29,16 +29,20 @@ jobs:
       - name: Install Go ${{ matrix.go_version }}
         if: ${{ matrix.go_version == 'tip' }}
         run: |
-          curl -sL https://storage.googleapis.com/go-build-snap/go/linux-amd64/$(git ls-remote https://github.com/golang/go.git HEAD | awk '{print $1;}').tar.gz -o gotip.tar.gz
-          ls -lah gotip.tar.gz
-          mkdir -p ~/sdk/gotip
-          tar -C ~/sdk/gotip -xzf gotip.tar.gz
-          echo "PATH=$HOME/go/bin:$HOME/sdk/gotip/bin/:$PATH" >> $GITHUB_ENV
-      - name: Vet and test
+          go install golang.org/dl/gotip@latest
+          `go env GOPATH`/bin/gotip download
+      - name: Vet and test no tip
+        if: ${{ matrix.go_version != 'tip' }}
         run: |
           go version
           go vet ./...
           go test ./...
+      - name: Vet and test gotip
+        if: ${{ matrix.go_version == 'tip' }}
+        run: |
+          `go env GOPATH`/bin/gotip version
+          `go env GOPATH`/bin/gotip vet ./...
+          `go env GOPATH`/bin/gotip test ./...
   golangci:
     name: Linting
     runs-on: ubuntu-latest
@@ -46,7 +50,7 @@ jobs:
       - uses: actions/checkout@v2
       - uses: actions/setup-go@master
         with:
-          go-version: '1.20'
+          go-version: '1.23'
           check-latest: true
       - name: golangci-lint
         uses: golangci/golangci-lint-action@v2
diff --git a/server/handlers_test.go b/server/handlers_test.go
index 2c76ffdfbfbf5cb27cfb987e884cdafcbcfeeb62..f8f14ca1ee66a61122a3370462d6c8f033a6ba63 100644
--- a/server/handlers_test.go
+++ b/server/handlers_test.go
@@ -26,7 +26,7 @@ func (s *suiteRedirectWithForceHTTPS) SetUpTest(c *C) {
 	c.Assert(err, IsNil)
 
 	handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
-		fmt.Fprintln(w, "Hello, client")
+		_, _ = fmt.Fprintln(w, "Hello, client")
 	})
 
 	s.handler = srvr.RedirectHandler(handler)
@@ -83,7 +83,7 @@ func (s *suiteRedirectWithoutForceHTTPS) SetUpTest(c *C) {
 	c.Assert(err, IsNil)
 
 	handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
-		fmt.Fprintln(w, "Hello, client")
+		_, _ = fmt.Fprintln(w, "Hello, client")
 	})
 
 	s.handler = srvr.RedirectHandler(handler)
diff --git a/server/server.go b/server/server.go
index 23eb5c35047d516449cdc357813923fcfe43b501..b7a4e926dd1d2a80659e481c14aa0c3b7b8cb27c 100644
--- a/server/server.go
+++ b/server/server.go
@@ -402,12 +402,15 @@ func New(options ...OptionFn) (*Server, error) {
 	return s, nil
 }
 
+var theRand *rand.Rand
+
 func init() {
 	var seedBytes [8]byte
 	if _, err := cryptoRand.Read(seedBytes[:]); err != nil {
 		panic("cannot obtain cryptographically secure seed")
 	}
-	rand.Seed(int64(binary.LittleEndian.Uint64(seedBytes[:])))
+
+	theRand = rand.New(rand.NewSource(int64(binary.LittleEndian.Uint64(seedBytes[:]))))
 }
 
 // Run starts Server
diff --git a/server/token.go b/server/token.go
index f3aa012ede44e6e261902bd6afa1872a4cae80b4..d73403ebcc905e84363b9daf52a08cc265b1b41e 100644
--- a/server/token.go
+++ b/server/token.go
@@ -24,10 +24,6 @@ THE SOFTWARE.
 
 package server
 
-import (
-	"math/rand"
-)
-
 const (
 	// SYMBOLS characters used for short-urls
 	SYMBOLS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
@@ -37,7 +33,7 @@ const (
 func token(length int) string {
 	result := ""
 	for i := 0; i < length; i++ {
-		x := rand.Intn(len(SYMBOLS) - 1)
+		x := theRand.Intn(len(SYMBOLS) - 1)
 		result = string(SYMBOLS[x]) + result
 	}