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)
+ }
+}