diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 0000000..6b8710a
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1 @@
+.git
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..d3883b7
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,17 @@
+FROM golang:1.16-alpine AS builder
+
+COPY . /meditime
+
+WORKDIR /meditime
+
+RUN go build
+
+FROM alpine:3.13
+
+RUN apk add --no-cache \
+	ca-certificates \
+	tzdata
+
+COPY --from=builder /meditime/meditime /usr/local/bin/meditime
+
+ENTRYPOINT ["/usr/local/bin/meditime"]
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..da8c366
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,10 @@
+IMAGE_REGISTRY = registry.0xdad.com/meditime
+IMAGE_TAG = latest
+
+.PHONY: build
+build:
+	docker build -t "${IMAGE_REGISTRY}:${IMAGE_TAG}" .
+
+.PHONY: deploy
+deploy: build
+	docker push "${IMAGE_REGISTRY}:${IMAGE_TAG}"
diff --git a/db/badger.go b/db/badger.go
index d30f987..57d5943 100644
--- a/db/badger.go
+++ b/db/badger.go
@@ -148,6 +148,13 @@ func (b *Badger) AddMedication(medication *Medication) error {
 	})
 }
 
+// RemoveMedication from the database
+func (b *Badger) RemoveMedication(medication *Medication) error {
+	return b.db.Update(func(tx *badger.Txn) error {
+		return tx.Delete(medication.badgerKey())
+	})
+}
+
 // ListMedicationsForUser from the database
 func (b *Badger) ListMedicationsForUser(user *User) (medications []*Medication, err error) {
 	err = b.db.View(func(tx *badger.Txn) error {
diff --git a/main.go b/main.go
index ae9e92c..00806bf 100644
--- a/main.go
+++ b/main.go
@@ -270,6 +270,36 @@ func main() {
 
 				log(medication)
 
+			case "remove":
+				fmt.Print("username: ")
+				inputScanner.Scan()
+
+				username := string(bytes.TrimSpace(inputScanner.Bytes()))
+				if username == "" {
+					return fmt.Errorf("failed to get username from STDIN prompt: %w", inputScanner.Err())
+				}
+
+				user, err := b.GetUser(username)
+				if err != nil {
+					return fmt.Errorf("failed to lookup username %s: %w", username, err)
+				}
+
+				if user == nil {
+					return fmt.Errorf("username %s doesn't exist", username)
+				}
+
+				fmt.Print("medication id: ")
+				inputScanner.Scan()
+
+				medicationID := uuid.MustParse(string(bytes.TrimSpace(inputScanner.Bytes())))
+				err = b.RemoveMedication(&db.Medication{
+					IDUser: user.ID,
+					ID:     medicationID,
+				})
+				if err != nil {
+					return err
+				}
+
 			case "list":
 				fmt.Print("username: ")
 				inputScanner.Scan()