diff --git a/accounts/accounts.go b/accounts/accounts.go
new file mode 100644
index 0000000000000000000000000000000000000000..32412dd489ffa0b5714fbae70a4f63c2f17d24ac
--- /dev/null
+++ b/accounts/accounts.go
@@ -0,0 +1,12 @@
+// Package accounts manages accounts.
+package accounts
+
+import "errors"
+
+// Verify verifies that an account exists.
+func Verify(acc string) error {
+	if acc == "" {
+		return errors.New("Empty account is invalid")
+	}
+	return nil
+}
diff --git a/go.mod b/go.mod
new file mode 100644
index 0000000000000000000000000000000000000000..a82526a6e502dfec887a738223b22fb03a5595ff
--- /dev/null
+++ b/go.mod
@@ -0,0 +1,5 @@
+module git.lyda.ie/kevin/bulletin
+
+go 1.24.2
+
+require github.com/urfave/cli/v3 v3.3.2 // indirect
diff --git a/go.sum b/go.sum
new file mode 100644
index 0000000000000000000000000000000000000000..80dc36d5fb7c9d6272c40569bcad852a0bb49e34
--- /dev/null
+++ b/go.sum
@@ -0,0 +1,2 @@
+github.com/urfave/cli/v3 v3.3.2 h1:BYFVnhhZ8RqT38DxEYVFPPmGFTEf7tJwySTXsVRrS/o=
+github.com/urfave/cli/v3 v3.3.2/go.mod h1:FJSKtM/9AiiTOJL4fJ6TbMUkxBXn7GO9guZqoZtpYpo=
diff --git a/main.go b/main.go
new file mode 100644
index 0000000000000000000000000000000000000000..6df8ee6c8e51616777344a7807dc47ed67e98369
--- /dev/null
+++ b/main.go
@@ -0,0 +1,44 @@
+// Package main is the main program for bulletin.
+// It is based off the 1989 version of bulletin.
+package main
+
+import (
+	"context"
+	"fmt"
+	"os"
+
+	"git.lyda.ie/kevin/bulletin/accounts"
+
+	"github.com/urfave/cli/v3"
+)
+
+func main() {
+	cmd := &cli.Command{
+		Name:        "bulletin",
+		Usage:       "a bulletin system",
+		Description: "An interpretation of the VMS BULLETIN program.",
+		Flags: []cli.Flag{
+			&cli.StringFlag{
+				Name:     "user",
+				Aliases:  []string{"u"},
+				Usage:    "user to run bulletin as",
+				Value:    "",
+				Required: true,
+			},
+		},
+		Action: func(_ context.Context, cmd *cli.Command) error {
+			user := cmd.String("user")
+			err := accounts.Verify(user)
+			if err != nil {
+				return err
+			}
+			fmt.Println("Running as", user)
+			return nil
+		},
+	}
+
+	err := cmd.Run(context.Background(), os.Args)
+	if err != nil {
+		fmt.Println(err)
+	}
+}