diff --git a/app.go b/app.go
index 08cd160f47566b06b44eeb44044e416c8263ad8d..2b73e58b465681b076946ca998736fef619c2021 100644
--- a/app.go
+++ b/app.go
@@ -4,6 +4,7 @@ import (
 	"fmt"
 	"log"
 	"os"
+	"sync/atomic"
 	"time"
 
 	"github.com/gofiber/contrib/hcaptcha"
@@ -54,8 +55,14 @@ func serve(sig chan os.Signal, db *leveldb.DB) error {
 			confEnv[hCaptchaSiteKey][0], confEnv[hCaptchaSecretKey][0])
 	}
 
+	count := new(atomic.Uint64)
+
 	routeHCaptchaSiteKey(app, "/api", !hCaptchaEnable, conf[hCaptchaSiteKey])
-	routeRegister(app, "/api/register", db, captcha)
+	routeRegister(app, "/api/register", db, count, captcha)
+
+	if err := routeCount(app, "/api/count", db, count); err != nil {
+		return err
+	}
 
 	// graceful shutdown
 	go func() {
diff --git a/count.go b/count.go
new file mode 100644
index 0000000000000000000000000000000000000000..bff029a534a796039a463b27db4dff040dce79c5
--- /dev/null
+++ b/count.go
@@ -0,0 +1,32 @@
+package main
+
+import (
+	"log"
+	"strconv"
+	"sync/atomic"
+
+	"github.com/gofiber/fiber/v3"
+	"github.com/syndtr/goleveldb/leveldb"
+)
+
+func routeCount(app *fiber.App, p string, db *leveldb.DB, count *atomic.Uint64) error {
+	var c uint64
+	iter := db.NewIterator(nil, nil)
+	for iter.Next() {
+		c++
+	}
+	iter.Release()
+	if err := iter.Error(); err != nil {
+		return err
+	}
+	count.Store(c)
+
+	log.Printf("registration count is %d on startup", c)
+
+	app.Get(p, func(c fiber.Ctx) error {
+		c.Set("Content-Type", "text/plain")
+		return c.SendString(strconv.FormatUint(count.Load(), 10))
+	})
+
+	return nil
+}
diff --git a/register.go b/register.go
index a27fb2497b8bc310a7adc18e48cc2a7fa4caac14..5ad3d002d419623a37b16f24b817a232088764c5 100644
--- a/register.go
+++ b/register.go
@@ -3,6 +3,7 @@ package main
 import (
 	"log"
 	"regexp"
+	"sync/atomic"
 
 	"github.com/gofiber/fiber/v3"
 	"github.com/syndtr/goleveldb/leveldb"
@@ -15,7 +16,7 @@ type registration struct {
 }
 
 // Waitlist registration route
-func routeRegister(app *fiber.App, p string, db *leveldb.DB, captcha fiber.Handler) {
+func routeRegister(app *fiber.App, p string, db *leveldb.DB, count *atomic.Uint64, captcha fiber.Handler) {
 	app.Post(p, func(c fiber.Ctx) error {
 		req := new(registration)
 
@@ -53,6 +54,7 @@ func routeRegister(app *fiber.App, p string, db *leveldb.DB, captcha fiber.Handl
 		}
 
 		log.Printf("registered email %q", req.Email)
+		count.Add(1)
 		return c.JSON(newMessage(true, "Email registered successfully"))
 	}, captcha)
 }