diff --git a/contrib/codecs/websocket/wsjson/writer_test.go b/contrib/codecs/websocket/wsjson/writer_test.go
deleted file mode 100644
index 926abb24756646da686927cc2f518873144c039f..0000000000000000000000000000000000000000
--- a/contrib/codecs/websocket/wsjson/writer_test.go
+++ /dev/null
@@ -1,30 +0,0 @@
-package wsjson
-
-import (
-	"bytes"
-	"encoding/json"
-	"io"
-	"log"
-	"testing"
-)
-
-type noTrailingNewlineWriter struct {
-	w io.Writer
-}
-
-func (n *noTrailingNewlineWriter) Write(xs []byte) (int, error) {
-	if xs[len(xs)-1] == '\n' {
-		xs = xs[:len(xs)-1]
-	}
-	return n.w.Write(xs)
-}
-
-func TestNoTrailingNewlineWriter(t *testing.T) {
-	buf := new(bytes.Buffer)
-	wr := &noTrailingNewlineWriter{w: buf}
-	enc := json.NewEncoder(wr)
-	enc.Encode(map[string]any{"hi": "there", "how": "are", "you": "?"})
-	enc.Encode(map[string]any{"hi": "there", "how": "are", "you": "?"})
-	enc.Encode(map[string]any{"hi": "there", "how": "are", "you": "?"})
-	log.Println(string(buf.Bytes()))
-}
diff --git a/contrib/codecs/websocket/wsjson/wsjson.go b/contrib/codecs/websocket/wsjson/wsjson.go
deleted file mode 100644
index 43e16ec4267d9e5c6bbf4ad9ed7acd23f6901938..0000000000000000000000000000000000000000
--- a/contrib/codecs/websocket/wsjson/wsjson.go
+++ /dev/null
@@ -1,53 +0,0 @@
-package wsjson
-
-import (
-	"context"
-	"fmt"
-
-	"gfx.cafe/util/go/bufpool"
-	json "github.com/goccy/go-json"
-	"gfx.cafe/open/websocket"
-)
-
-// Read reads a JSON message from c into v.
-// It will reuse buffers in between calls to avoid allocations.
-func Read(ctx context.Context, c *websocket.Conn, v interface{}) error {
-	return read(ctx, c, v)
-}
-
-func read(ctx context.Context, c *websocket.Conn, v interface{}) (err error) {
-	_, r, err := c.Reader(ctx)
-	if err != nil {
-		return err
-	}
-	b := bufpool.GetStd()
-	defer bufpool.PutStd(b)
-	_, err = b.ReadFrom(r)
-	if err != nil {
-		return err
-	}
-	err = json.NewDecoder(b).Decode(v)
-	if err != nil {
-		return fmt.Errorf("failed to unmarshal JSON: %w", err)
-	}
-	return nil
-}
-
-// Write writes the JSON message v to c.
-// It will reuse buffers in between calls to avoid allocations.
-func Write(ctx context.Context, c *websocket.Conn, v interface{}) error {
-	return write(ctx, c, v)
-}
-
-func write(ctx context.Context, c *websocket.Conn, v interface{}) (err error) {
-	w, err := c.Writer(ctx, websocket.MessageText)
-	if err != nil {
-		return err
-	}
-	st := json.NewEncoder(w)
-	err = st.Encode(v)
-	if err != nil {
-		return fmt.Errorf("failed to marshal JSON: %w", err)
-	}
-	return w.Close()
-}