diff --git a/report.go b/report.go
new file mode 100644
index 0000000..861d4bb
--- /dev/null
+++ b/report.go
@@ -0,0 +1,47 @@
+package main
+
+import (
+ "context"
+ _ "embed"
+ "io"
+ "text/template"
+ "time"
+)
+
+//go:embed report.tmpl
+var reportTMPL string
+
+func ReportSince(ctx context.Context, w io.Writer, s Storage, t time.Time) error {
+ tmpl, err := template.New("report").Parse(reportTMPL)
+ if err != nil {
+ return err
+ }
+
+ messages, err := s.MessagesSince(ctx, t)
+ if err != nil {
+ return err
+ }
+
+ threads, err := s.ThreadsSince(ctx, t)
+ if err != nil {
+ return err
+ }
+
+ eventNames, err := s.EventNamesSince(ctx, t)
+ if err != nil {
+ return err
+ }
+
+ events, err := s.EventsSince(ctx, t)
+ if err != nil {
+ return err
+ }
+
+ return tmpl.Execute(w, map[string]any{
+ "since": t.Format("2006-01-02"),
+ "messages": messages,
+ "threads": threads,
+ "events": events,
+ "eventNames": eventNames,
+ })
+}
diff --git a/report.tmpl b/report.tmpl
new file mode 100644
index 0000000..928106d
--- /dev/null
+++ b/report.tmpl
@@ -0,0 +1,12 @@
+
+
+