diff --git a/cmd/web/handlers_guestbook.go b/cmd/web/handlers_guestbook.go
index 30f97cd..00217b1 100644
--- a/cmd/web/handlers_guestbook.go
+++ b/cmd/web/handlers_guestbook.go
@@ -4,6 +4,7 @@ import (
 	"errors"
 	"fmt"
 	"net/http"
+	"strconv"
 	"time"
 
 	"git.32bit.cafe/32bitcafe/guestbook/internal/forms"
@@ -23,6 +24,26 @@ func (app *application) getGuestbook(w http.ResponseWriter, r *http.Request) {
 		}
 		return
 	}
+	website.Guestbook, err = app.guestbooks.Get(website.Guestbook.ShortId)
+	if err != nil {
+		if errors.Is(err, models.ErrNoRecord) {
+			http.NotFound(w, r)
+		} else {
+			app.serverError(w, r, err)
+		}
+		return
+	}
+	if !website.Guestbook.Settings.IsVisible {
+		u := app.getCurrentUser(r)
+		if u == nil {
+			app.clientError(w, http.StatusForbidden)
+			return
+		}
+		if u.ID != website.UserId {
+			app.clientError(w, http.StatusForbidden)
+			return
+		}
+	}
 	comments, err := app.guestbookComments.GetAll(website.Guestbook.ID)
 	if err != nil {
 		app.serverError(w, r, err)
@@ -42,10 +63,76 @@ func (app *application) getGuestbookSettings(w http.ResponseWriter, r *http.Requ
 			app.serverError(w, r, err)
 		}
 	}
+	website.Guestbook, err = app.guestbooks.Get(website.Guestbook.ShortId)
+	if err != nil {
+		if errors.Is(err, models.ErrNoRecord) {
+			http.NotFound(w, r)
+		} else {
+			app.serverError(w, r, err)
+		}
+	}
 	data := app.newCommonData(r)
 	views.GuestbookSettingsView(data, website).Render(r.Context(), w)
 }
 
+func (app *application) putGuestbookSettings(w http.ResponseWriter, r *http.Request) {
+	slug := r.PathValue("id")
+	website, err := app.websites.Get(slugToShortId(slug))
+	if err != nil {
+		if errors.Is(err, models.ErrNoRecord) {
+			http.NotFound(w, r)
+		} else {
+			app.serverError(w, r, err)
+		}
+	}
+
+	var form forms.GuestbookSettingsForm
+	err = app.decodePostForm(r, &form)
+	if err != nil {
+		app.clientError(w, http.StatusBadRequest)
+		app.serverError(w, r, err)
+		return
+	}
+	form.CheckField(validator.PermittedValue(form.Visibility, "true", "false"), "gb_visible", "Invalid value")
+	form.CheckField(validator.PermittedValue(form.CommentingEnabled, models.ValidDisableDurations...), "gb_visible", "Invalid value")
+	form.CheckField(validator.PermittedValue(form.WidgetsEnabled, "true", "false"), "gb_remote", "Invalid value")
+	if !form.Valid() {
+		// TODO: rerender template with errors
+		app.clientError(w, http.StatusUnprocessableEntity)
+	}
+
+	c, err := strconv.ParseBool(form.CommentingEnabled)
+	if err != nil {
+		website.Guestbook.Settings.IsCommentingEnabled = false
+		website.Guestbook.Settings.ReenableCommenting, err = app.durationToTime(form.CommentingEnabled)
+		if err != nil {
+			app.serverError(w, r, err)
+		}
+	} else {
+		website.Guestbook.Settings.IsCommentingEnabled = c
+	}
+
+	// can skip error checking for these two since we verify valid values above
+	website.Guestbook.Settings.IsVisible, err = strconv.ParseBool(form.Visibility)
+	if err != nil {
+		app.serverError(w, r, err)
+	}
+	website.Guestbook.Settings.AllowRemoteHostAccess, err = strconv.ParseBool(form.WidgetsEnabled)
+	if err != nil {
+		app.serverError(w, r, err)
+	}
+	err = app.guestbooks.UpdateGuestbookSettings(website.Guestbook.ID, website.Guestbook.Settings)
+	if err != nil {
+		app.serverError(w, r, err)
+		return
+	}
+	app.sessionManager.Put(r.Context(), "flash", "Settings changed successfully")
+	data := app.newCommonData(r)
+	w.Header().Add("HX-Refresh", "true")
+	views.GuestbookSettingsView(data, website).Render(r.Context(), w)
+
+}
+
 func (app *application) getGuestbookComments(w http.ResponseWriter, r *http.Request) {
 	slug := r.PathValue("id")
 	website, err := app.websites.Get(slugToShortId(slug))
@@ -57,6 +144,14 @@ func (app *application) getGuestbookComments(w http.ResponseWriter, r *http.Requ
 		}
 		return
 	}
+	website.Guestbook, err = app.guestbooks.Get(website.Guestbook.ShortId)
+	if err != nil {
+		if errors.Is(err, models.ErrNoRecord) {
+			http.NotFound(w, r)
+		} else {
+			app.serverError(w, r, err)
+		}
+	}
 	comments, err := app.guestbookComments.GetAll(website.Guestbook.ID)
 	if err != nil {
 		app.serverError(w, r, err)
@@ -78,6 +173,14 @@ func (app *application) getGuestbookCommentCreate(w http.ResponseWriter, r *http
 		}
 		return
 	}
+	website.Guestbook, err = app.guestbooks.Get(website.Guestbook.ShortId)
+	if err != nil {
+		if errors.Is(err, models.ErrNoRecord) {
+			http.NotFound(w, r)
+		} else {
+			app.serverError(w, r, err)
+		}
+	}
 
 	data := app.newCommonData(r)
 	form := forms.CommentCreateForm{}
@@ -95,6 +198,19 @@ func (app *application) postGuestbookCommentCreate(w http.ResponseWriter, r *htt
 		}
 		return
 	}
+	website.Guestbook, err = app.guestbooks.Get(website.Guestbook.ShortId)
+	if err != nil {
+		if errors.Is(err, models.ErrNoRecord) {
+			http.NotFound(w, r)
+		} else {
+			app.serverError(w, r, err)
+		}
+	}
+
+	if !website.Guestbook.CanComment() {
+		app.clientError(w, http.StatusForbidden)
+		return
+	}
 
 	var form forms.CommentCreateForm
 	err = app.decodePostForm(r, &form)
@@ -143,6 +259,14 @@ func (app *application) getCommentQueue(w http.ResponseWriter, r *http.Request)
 		}
 		return
 	}
+	website.Guestbook, err = app.guestbooks.Get(website.Guestbook.ShortId)
+	if err != nil {
+		if errors.Is(err, models.ErrNoRecord) {
+			http.NotFound(w, r)
+		} else {
+			app.serverError(w, r, err)
+		}
+	}
 
 	comments, err := app.guestbookComments.GetUnpublished(website.Guestbook.ID)
 	if err != nil {
@@ -169,6 +293,14 @@ func (app *application) getCommentTrash(w http.ResponseWriter, r *http.Request)
 		}
 		return
 	}
+	website.Guestbook, err = app.guestbooks.Get(website.Guestbook.ShortId)
+	if err != nil {
+		if errors.Is(err, models.ErrNoRecord) {
+			http.NotFound(w, r)
+		} else {
+			app.serverError(w, r, err)
+		}
+	}
 
 	comments, err := app.guestbookComments.GetDeleted(website.Guestbook.ID)
 	if err != nil {
@@ -200,6 +332,14 @@ func (app *application) putHideGuestbookComment(w http.ResponseWriter, r *http.R
 	if user.ID != website.UserId {
 		app.clientError(w, http.StatusUnauthorized)
 	}
+	website.Guestbook, err = app.guestbooks.Get(website.Guestbook.ShortId)
+	if err != nil {
+		if errors.Is(err, models.ErrNoRecord) {
+			http.NotFound(w, r)
+		} else {
+			app.serverError(w, r, err)
+		}
+	}
 	cSlug := r.PathValue("commentId")
 	comment, err := app.guestbookComments.Get(slugToShortId(cSlug))
 	if err != nil {
@@ -234,6 +374,14 @@ func (app *application) deleteGuestbookComment(w http.ResponseWriter, r *http.Re
 	if user.ID != website.UserId {
 		app.clientError(w, http.StatusUnauthorized)
 	}
+	website.Guestbook, err = app.guestbooks.Get(website.Guestbook.ShortId)
+	if err != nil {
+		if errors.Is(err, models.ErrNoRecord) {
+			http.NotFound(w, r)
+		} else {
+			app.serverError(w, r, err)
+		}
+	}
 	cSlug := r.PathValue("commentId")
 	comment, err := app.guestbookComments.Get(slugToShortId(cSlug))
 	if err != nil {
diff --git a/cmd/web/helpers.go b/cmd/web/helpers.go
index 43a6cc5..85959d6 100644
--- a/cmd/web/helpers.go
+++ b/cmd/web/helpers.go
@@ -118,3 +118,13 @@ func DefaultUserSettings() models.UserSettings {
 		LocalTimezone: time.Now().UTC().Location(),
 	}
 }
+
+func (app *application) durationToTime(duration string) (time.Time, error) {
+	var result time.Time
+	offset, err := time.ParseDuration(duration)
+	if err != nil {
+		return result, nil
+	}
+	result = time.Now().UTC().Add(offset)
+	return result, nil
+}
diff --git a/cmd/web/main.go b/cmd/web/main.go
index 7b678b6..89e2ff1 100644
--- a/cmd/web/main.go
+++ b/cmd/web/main.go
@@ -71,6 +71,11 @@ func main() {
 		logger.Error(err.Error())
 		os.Exit(1)
 	}
+	err = app.guestbooks.InitializeSettingsMap()
+	if err != nil {
+		logger.Error(err.Error())
+		os.Exit(1)
+	}
 
 	tlsConfig := &tls.Config{
 		CurvePreferences: []tls.CurveID{tls.X25519, tls.CurveP256},
diff --git a/cmd/web/routes.go b/cmd/web/routes.go
index 2a26790..c2fe48a 100644
--- a/cmd/web/routes.go
+++ b/cmd/web/routes.go
@@ -42,6 +42,7 @@ func (app *application) routes() http.Handler {
 	mux.Handle("DELETE /websites/{id}/dashboard/guestbook/comments/{commentId}", protected.ThenFunc(app.deleteGuestbookComment))
 	mux.Handle("PUT /websites/{id}/dashboard/guestbook/comments/{commentId}", protected.ThenFunc(app.putHideGuestbookComment))
 	mux.Handle("GET /websites/{id}/dashboard/guestbook/settings", protected.ThenFunc(app.getGuestbookSettings))
+	mux.Handle("PUT /websites/{id}/dashboard/guestbook/settings", protected.ThenFunc(app.putGuestbookSettings))
 	mux.Handle("GET /websites/{id}/dashboard/guestbook/comments/trash", protected.ThenFunc(app.getCommentTrash))
 	mux.Handle("GET /websites/{id}/dashboard/guestbook/themes", protected.ThenFunc(app.getComingSoon))
 	mux.Handle("GET /websites/{id}/dashboard/guestbook/customize", protected.ThenFunc(app.getComingSoon))
diff --git a/internal/forms/forms.go b/internal/forms/forms.go
index 8891f2b..2014c84 100644
--- a/internal/forms/forms.go
+++ b/internal/forms/forms.go
@@ -34,3 +34,10 @@ type UserSettingsForm struct {
 	LocalTimezone       string `schema:"timezones"`
 	validator.Validator `schema:"-"`
 }
+
+type GuestbookSettingsForm struct {
+	Visibility          string `schema:"gb_visible"`
+	CommentingEnabled   string `schema:"gb_commenting"`
+	WidgetsEnabled      string `schema:"gb_remote"`
+	validator.Validator `schema:"-"`
+}
diff --git a/internal/models/guestbook.go b/internal/models/guestbook.go
index a9e762a..42a8a9b 100644
--- a/internal/models/guestbook.go
+++ b/internal/models/guestbook.go
@@ -2,6 +2,7 @@ package models
 
 import (
 	"database/sql"
+	"errors"
 	"strconv"
 	"time"
 )
@@ -14,6 +15,8 @@ type GuestbookSettings struct {
 	AllowRemoteHostAccess bool
 }
 
+var ValidDisableDurations = []string{"true", "false", "1h", "4h", "8h", "24h", "72h", "168h"}
+
 const (
 	SettingGbCommentingEnabled = "commenting_enabled"
 	SettingGbReenableComments  = "reenable_comments"
@@ -33,6 +36,11 @@ type Guestbook struct {
 	Settings  GuestbookSettings
 }
 
+func (g Guestbook) CanComment() bool {
+	now := time.Now().UTC()
+	return g.Settings.IsCommentingEnabled && g.Settings.ReenableCommenting.Before(now)
+}
+
 type GuestbookModel struct {
 	DB       *sql.DB
 	Settings map[string]Setting
@@ -96,11 +104,19 @@ func (m *GuestbookModel) Get(shortId uint64) (Guestbook, error) {
 	var t sql.NullTime
 	err := row.Scan(&g.ID, &g.ShortId, &g.UserId, &g.WebsiteId, &g.Created, &t, &g.IsActive)
 	if err != nil {
+		if errors.Is(err, sql.ErrNoRows) {
+			return Guestbook{}, ErrNoRecord
+		}
 		return Guestbook{}, err
 	}
 	if t.Valid {
 		g.Deleted = t.Time
 	}
+	settings, err := m.GetSettings(g.ID)
+	if err != nil {
+		return g, err
+	}
+	g.Settings = settings
 	return g, nil
 }
 
@@ -126,6 +142,58 @@ func (m *GuestbookModel) GetAll(userId int64) ([]Guestbook, error) {
 	return guestbooks, nil
 }
 
+func (m *GuestbookModel) GetSettings(guestbookId int64) (GuestbookSettings, error) {
+	stmt := `SELECT g.SettingId, a.ItemValue, g.UnconstrainedValue FROM guestbook_settings AS g
+			LEFT JOIN allowed_setting_values AS a ON g.AllowedSettingValueId = a.Id
+			WHERE GuestbookId = ?`
+	var settings GuestbookSettings
+	rows, err := m.DB.Query(stmt, guestbookId)
+	if err != nil {
+		return settings, err
+	}
+	for rows.Next() {
+		var id int
+		var itemValue sql.NullString
+		var unconstrainedValue sql.NullString
+		err = rows.Scan(&id, &itemValue, &unconstrainedValue)
+		if err != nil {
+			return settings, err
+		}
+		switch id {
+		case m.Settings[SettingGbCommentingEnabled].id:
+			settings.IsCommentingEnabled, err = strconv.ParseBool(itemValue.String)
+			if err != nil {
+				return settings, err
+			}
+			break
+		case m.Settings[SettingGbReenableComments].id:
+			settings.ReenableCommenting, err = time.Parse(time.RFC3339, unconstrainedValue.String)
+			if err != nil {
+				return settings, err
+			}
+			break
+		case m.Settings[SettingGbVisible].id:
+			settings.IsVisible, err = strconv.ParseBool(itemValue.String)
+			if err != nil {
+				return settings, err
+			}
+			break
+		case m.Settings[SettingGbAllowRemote].id:
+			settings.AllowRemoteHostAccess, err = strconv.ParseBool(itemValue.String)
+			if err != nil {
+				return settings, err
+			}
+			break
+		}
+	}
+	// if comment disable setting has expired, enable commenting
+	if time.Now().UTC().After(settings.ReenableCommenting) {
+		settings.IsCommentingEnabled = true
+		m.UpdateSetting(guestbookId, m.Settings[SettingGbCommentingEnabled], "true")
+	}
+	return settings, nil
+}
+
 func (m *GuestbookModel) initializeGuestbookSettings(guestbookId int64, settings GuestbookSettings) error {
 	stmt := `INSERT INTO guestbook_settings (GuestbookId, SettingId, AllowedSettingValueId, UnconstrainedValue) VALUES 
 	(?, ?, ?, ?),
@@ -145,11 +213,40 @@ func (m *GuestbookModel) initializeGuestbookSettings(guestbookId int64, settings
 }
 
 func (m *GuestbookModel) UpdateGuestbookSettings(guestbookId int64, settings GuestbookSettings) error {
-	err := m.UpdateSetting(guestbookId, m.Settings[SettingGbCommentingEnabled], strconv.FormatBool(settings.IsCommentingEnabled))
+	err := m.UpdateSetting(guestbookId, m.Settings[SettingGbVisible], strconv.FormatBool(settings.IsVisible))
 	if err != nil {
 		return err
 	}
-	err = m.UpdateSetting(guestbookId, m.Settings[SettingGbReenableComments], settings.ReenableCommenting.String())
+	err = m.UpdateSetting(guestbookId, m.Settings[SettingGbAllowRemote], strconv.FormatBool(settings.AllowRemoteHostAccess))
+	if err != nil {
+		return err
+	}
+	err = m.UpdateSetting(guestbookId, m.Settings[SettingGbCommentingEnabled], strconv.FormatBool(settings.IsCommentingEnabled))
+	if err != nil {
+		return err
+	}
+	err = m.UpdateSetting(guestbookId, m.Settings[SettingGbReenableComments], settings.ReenableCommenting.Format(time.RFC3339))
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+func (m *GuestbookModel) InsertSetting(guestbookId int64, setting Setting, value string) error {
+	stmt := `
+INSERT INTO guestbook_settings (GuestbookId, SettingId, AllowedSettingValueId, UnconstrainedValue)
+SELECT  ?, 
+        settings.Id,
+        (SELECT Id FROM allowed_setting_values WHERE SettingId = settings.id AND ItemValue = ?),
+        CASE WHEN NOT EXISTS (SELECT 1 FROM settings AS s where s.Id = settings.Id AND s.Constrained = 1) THEN ? ELSE NULL END
+FROM settings
+WHERE settings.id = ?
+	`
+	result, err := m.DB.Exec(stmt, guestbookId, value, value, setting.id)
+	if err != nil {
+		return err
+	}
+	_, err = result.LastInsertId()
 	if err != nil {
 		return err
 	}
diff --git a/internal/models/settings.go b/internal/models/settings.go
index 3dfadc9..9ae8259 100644
--- a/internal/models/settings.go
+++ b/internal/models/settings.go
@@ -121,7 +121,7 @@ func (s *Setting) validateInt(value string) bool {
 }
 
 func (s *Setting) validateDatetime(value string) bool {
-	v, err := time.Parse(time.DateTime, value)
+	v, err := time.Parse(time.RFC3339, value)
 	if err != nil {
 		return false
 	}
@@ -129,7 +129,7 @@ func (s *Setting) validateDatetime(value string) bool {
 	var max time.Time
 
 	if len(s.minValue) > 0 {
-		min, err = time.Parse(time.DateTime, s.minValue)
+		min, err = time.Parse(time.RFC3339, s.minValue)
 		if err != nil {
 			return false
 		}
@@ -138,7 +138,7 @@ func (s *Setting) validateDatetime(value string) bool {
 		}
 	}
 	if len(s.maxValue) > 0 {
-		max, err = time.Parse(time.DateTime, s.maxValue)
+		max, err = time.Parse(time.RFC3339, s.maxValue)
 		if err != nil {
 			return false
 		}
diff --git a/internal/models/user.go b/internal/models/user.go
index 85f5b65..318202d 100644
--- a/internal/models/user.go
+++ b/internal/models/user.go
@@ -188,7 +188,7 @@ func (m *UserModel) Exists(id int64) (bool, error) {
 
 func (m *UserModel) GetSettings(userId int64) (UserSettings, error) {
 	stmt := `SELECT u.SettingId, a.ItemValue, u.UnconstrainedValue FROM user_settings AS u
-			LEFT JOIN allowed_setting_values AS a ON u.SettingId = a.SettingId
+			LEFT JOIN allowed_setting_values AS a ON u.AllowedSettingValueId = a.Id
 			WHERE UserId = ?`
 	var settings UserSettings
 	rows, err := m.DB.Query(stmt, userId)
diff --git a/internal/models/website.go b/internal/models/website.go
index 4142697..b753613 100644
--- a/internal/models/website.go
+++ b/internal/models/website.go
@@ -37,13 +37,13 @@ func (m *WebsiteModel) Insert(shortId uint64, userId int64, siteName, siteUrl, a
 
 func (m *WebsiteModel) Get(shortId uint64) (Website, error) {
 	stmt := `SELECT w.Id, w.ShortId, w.Name, w.SiteUrl, w.AuthorName, w.UserId, w.Created,
-	g.Id, g.ShortId, g.Created, g.IsActive
+	g.Id, g.ShortId
 	FROM websites AS w INNER JOIN guestbooks AS g ON w.Id = g.WebsiteId
 	WHERE w.ShortId = ? AND w.DELETED IS NULL`
 	row := m.DB.QueryRow(stmt, shortId)
 	var w Website
 	err := row.Scan(&w.ID, &w.ShortId, &w.Name, &w.SiteUrl, &w.AuthorName, &w.UserId, &w.Created,
-		&w.Guestbook.ID, &w.Guestbook.ShortId, &w.Guestbook.Created, &w.Guestbook.IsActive)
+		&w.Guestbook.ID, &w.Guestbook.ShortId)
 	if err != nil {
 		return Website{}, err
 	}
diff --git a/ui/views/guestbooks.templ b/ui/views/guestbooks.templ
index 99f9ea6..5ad5583 100644
--- a/ui/views/guestbooks.templ
+++ b/ui/views/guestbooks.templ
@@ -3,6 +3,7 @@ package views
 import "fmt"
 import "git.32bit.cafe/32bitcafe/guestbook/internal/models"
 import "git.32bit.cafe/32bitcafe/guestbook/internal/forms"
+import "time"
 
 templ GuestbookDashboardCommentsView(title string, data CommonData, website models.Website, guestbook models.Guestbook, comments []models.GuestbookComment) {
 	@base(title, data) {
@@ -150,8 +151,13 @@ templ CreateGuestbookComment(title string, data CommonData, website models.Websi
 	}
 }
 
+templ settingRadio(selected bool, name, id, value string) {
+	
+}
+
 templ GuestbookSettingsView(data CommonData, website models.Website) {
 	{{ putUrl := fmt.Sprintf("/websites/%s/dashboard/guestbook/settings", shortIdToSlug(website.ShortId)) }}
+	{{ gb := website.Guestbook }}
 	@base("Guestbook Settings", data) {
 		
 			@wSidebar(website)
@@ -162,36 +168,39 @@ templ GuestbookSettingsView(data CommonData, website models.Website) {
 					
 						
 						
 						
 					
 					
 						
 						
-						
+						if !website.Guestbook.CanComment() {
+							{{ localtime := gb.Settings.ReenableCommenting.In(data.CurrentUser.Settings.LocalTimezone) }}
+							
+						}
 					
 					
 						
 						
-						
diff --git a/ui/views/guestbooks_templ.go b/ui/views/guestbooks_templ.go
index 65416be..5a9bf27 100644
--- a/ui/views/guestbooks_templ.go
+++ b/ui/views/guestbooks_templ.go
@@ -11,6 +11,7 @@ import templruntime "github.com/a-h/templ/runtime"
 import "fmt"
 import "git.32bit.cafe/32bitcafe/guestbook/internal/models"
 import "git.32bit.cafe/32bitcafe/guestbook/internal/forms"
+import "time"
 
 func GuestbookDashboardCommentsView(title string, data CommonData, website models.Website, guestbook models.Guestbook, comments []models.GuestbookComment) templ.Component {
 	return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
@@ -60,7 +61,7 @@ func GuestbookDashboardCommentsView(title string, data CommonData, website model
 			var templ_7745c5c3_Var3 string
 			templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs(website.SiteUrl)
 			if templ_7745c5c3_Err != nil {
-				return templ.Error{Err: templ_7745c5c3_Err, FileName: `ui/views/guestbooks.templ`, Line: 12, Col: 37}
+				return templ.Error{Err: templ_7745c5c3_Err, FileName: `ui/views/guestbooks.templ`, Line: 13, Col: 37}
 			}
 			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3))
 			if templ_7745c5c3_Err != nil {
@@ -131,7 +132,7 @@ func GuestbookDashboardCommentView(data CommonData, w models.Website, c models.G
 			var templ_7745c5c3_Var5 string
 			templ_7745c5c3_Var5, templ_7745c5c3_Err = templ.JoinStringErrs(commentUrl)
 			if templ_7745c5c3_Err != nil {
-				return templ.Error{Err: templ_7745c5c3_Err, FileName: `ui/views/guestbooks.templ`, Line: 31, Col: 49}
+				return templ.Error{Err: templ_7745c5c3_Err, FileName: `ui/views/guestbooks.templ`, Line: 32, Col: 49}
 			}
 			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var5))
 			if templ_7745c5c3_Err != nil {
@@ -144,7 +145,7 @@ func GuestbookDashboardCommentView(data CommonData, w models.Website, c models.G
 			var templ_7745c5c3_Var6 string
 			templ_7745c5c3_Var6, templ_7745c5c3_Err = templ.JoinStringErrs(hxHeaders)
 			if templ_7745c5c3_Err != nil {
-				return templ.Error{Err: templ_7745c5c3_Err, FileName: `ui/views/guestbooks.templ`, Line: 31, Col: 106}
+				return templ.Error{Err: templ_7745c5c3_Err, FileName: `ui/views/guestbooks.templ`, Line: 32, Col: 106}
 			}
 			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var6))
 			if templ_7745c5c3_Err != nil {
@@ -157,7 +158,7 @@ func GuestbookDashboardCommentView(data CommonData, w models.Website, c models.G
 			var templ_7745c5c3_Var7 string
 			templ_7745c5c3_Var7, templ_7745c5c3_Err = templ.JoinStringErrs(commentUrl)
 			if templ_7745c5c3_Err != nil {
-				return templ.Error{Err: templ_7745c5c3_Err, FileName: `ui/views/guestbooks.templ`, Line: 32, Col: 47}
+				return templ.Error{Err: templ_7745c5c3_Err, FileName: `ui/views/guestbooks.templ`, Line: 33, Col: 47}
 			}
 			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var7))
 			if templ_7745c5c3_Err != nil {
@@ -170,7 +171,7 @@ func GuestbookDashboardCommentView(data CommonData, w models.Website, c models.G
 			var templ_7745c5c3_Var8 string
 			templ_7745c5c3_Var8, templ_7745c5c3_Err = templ.JoinStringErrs(hxHeaders)
 			if templ_7745c5c3_Err != nil {
-				return templ.Error{Err: templ_7745c5c3_Err, FileName: `ui/views/guestbooks.templ`, Line: 32, Col: 104}
+				return templ.Error{Err: templ_7745c5c3_Err, FileName: `ui/views/guestbooks.templ`, Line: 33, Col: 104}
 			}
 			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var8))
 			if templ_7745c5c3_Err != nil {
@@ -203,7 +204,7 @@ func GuestbookDashboardCommentView(data CommonData, w models.Website, c models.G
 		var templ_7745c5c3_Var9 string
 		templ_7745c5c3_Var9, templ_7745c5c3_Err = templ.JoinStringErrs(c.AuthorName)
 		if templ_7745c5c3_Err != nil {
-			return templ.Error{Err: templ_7745c5c3_Err, FileName: `ui/views/guestbooks.templ`, Line: 42, Col: 25}
+			return templ.Error{Err: templ_7745c5c3_Err, FileName: `ui/views/guestbooks.templ`, Line: 43, Col: 25}
 		}
 		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var9))
 		if templ_7745c5c3_Err != nil {
@@ -231,7 +232,7 @@ func GuestbookDashboardCommentView(data CommonData, w models.Website, c models.G
 			var templ_7745c5c3_Var11 string
 			templ_7745c5c3_Var11, templ_7745c5c3_Err = templ.JoinStringErrs(c.AuthorEmail)
 			if templ_7745c5c3_Err != nil {
-				return templ.Error{Err: templ_7745c5c3_Err, FileName: `ui/views/guestbooks.templ`, Line: 45, Col: 66}
+				return templ.Error{Err: templ_7745c5c3_Err, FileName: `ui/views/guestbooks.templ`, Line: 46, Col: 66}
 			}
 			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var11))
 			if templ_7745c5c3_Err != nil {
@@ -259,7 +260,7 @@ func GuestbookDashboardCommentView(data CommonData, w models.Website, c models.G
 			var templ_7745c5c3_Var13 string
 			templ_7745c5c3_Var13, templ_7745c5c3_Err = templ.JoinStringErrs(c.AuthorSite)
 			if templ_7745c5c3_Err != nil {
-				return templ.Error{Err: templ_7745c5c3_Err, FileName: `ui/views/guestbooks.templ`, Line: 48, Col: 85}
+				return templ.Error{Err: templ_7745c5c3_Err, FileName: `ui/views/guestbooks.templ`, Line: 49, Col: 85}
 			}
 			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var13))
 			if templ_7745c5c3_Err != nil {
@@ -277,7 +278,7 @@ func GuestbookDashboardCommentView(data CommonData, w models.Website, c models.G
 		var templ_7745c5c3_Var14 string
 		templ_7745c5c3_Var14, templ_7745c5c3_Err = templ.JoinStringErrs(c.Created.In(data.CurrentUser.Settings.LocalTimezone).Format("01-02-2006 03:04PM"))
 		if templ_7745c5c3_Err != nil {
-			return templ.Error{Err: templ_7745c5c3_Err, FileName: `ui/views/guestbooks.templ`, Line: 51, Col: 88}
+			return templ.Error{Err: templ_7745c5c3_Err, FileName: `ui/views/guestbooks.templ`, Line: 52, Col: 88}
 		}
 		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var14))
 		if templ_7745c5c3_Err != nil {
@@ -290,7 +291,7 @@ func GuestbookDashboardCommentView(data CommonData, w models.Website, c models.G
 		var templ_7745c5c3_Var15 string
 		templ_7745c5c3_Var15, templ_7745c5c3_Err = templ.JoinStringErrs(c.CommentText)
 		if templ_7745c5c3_Err != nil {
-			return templ.Error{Err: templ_7745c5c3_Err, FileName: `ui/views/guestbooks.templ`, Line: 55, Col: 18}
+			return templ.Error{Err: templ_7745c5c3_Err, FileName: `ui/views/guestbooks.templ`, Line: 56, Col: 18}
 		}
 		_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var15))
 		if templ_7745c5c3_Err != nil {
@@ -338,7 +339,7 @@ func commentForm(form forms.CommentCreateForm) templ.Component {
 			var templ_7745c5c3_Var17 string
 			templ_7745c5c3_Var17, templ_7745c5c3_Err = templ.JoinStringErrs(error)
 			if templ_7745c5c3_Err != nil {
-				return templ.Error{Err: templ_7745c5c3_Err, FileName: `ui/views/guestbooks.templ`, Line: 66, Col: 31}
+				return templ.Error{Err: templ_7745c5c3_Err, FileName: `ui/views/guestbooks.templ`, Line: 67, Col: 31}
 			}
 			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var17))
 			if templ_7745c5c3_Err != nil {
@@ -362,7 +363,7 @@ func commentForm(form forms.CommentCreateForm) templ.Component {
 			var templ_7745c5c3_Var18 string
 			templ_7745c5c3_Var18, templ_7745c5c3_Err = templ.JoinStringErrs(error)
 			if templ_7745c5c3_Err != nil {
-				return templ.Error{Err: templ_7745c5c3_Err, FileName: `ui/views/guestbooks.templ`, Line: 74, Col: 31}
+				return templ.Error{Err: templ_7745c5c3_Err, FileName: `ui/views/guestbooks.templ`, Line: 75, Col: 31}
 			}
 			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var18))
 			if templ_7745c5c3_Err != nil {
@@ -386,7 +387,7 @@ func commentForm(form forms.CommentCreateForm) templ.Component {
 			var templ_7745c5c3_Var19 string
 			templ_7745c5c3_Var19, templ_7745c5c3_Err = templ.JoinStringErrs(error)
 			if templ_7745c5c3_Err != nil {
-				return templ.Error{Err: templ_7745c5c3_Err, FileName: `ui/views/guestbooks.templ`, Line: 82, Col: 31}
+				return templ.Error{Err: templ_7745c5c3_Err, FileName: `ui/views/guestbooks.templ`, Line: 83, Col: 31}
 			}
 			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var19))
 			if templ_7745c5c3_Err != nil {
@@ -410,7 +411,7 @@ func commentForm(form forms.CommentCreateForm) templ.Component {
 			var templ_7745c5c3_Var20 string
 			templ_7745c5c3_Var20, templ_7745c5c3_Err = templ.JoinStringErrs(error)
 			if templ_7745c5c3_Err != nil {
-				return templ.Error{Err: templ_7745c5c3_Err, FileName: `ui/views/guestbooks.templ`, Line: 90, Col: 31}
+				return templ.Error{Err: templ_7745c5c3_Err, FileName: `ui/views/guestbooks.templ`, Line: 91, Col: 31}
 			}
 			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var20))
 			if templ_7745c5c3_Err != nil {
@@ -464,7 +465,7 @@ func GuestbookView(title string, data CommonData, website models.Website, guestb
 			var templ_7745c5c3_Var22 string
 			templ_7745c5c3_Var22, templ_7745c5c3_Err = templ.JoinStringErrs(title)
 			if templ_7745c5c3_Err != nil {
-				return templ.Error{Err: templ_7745c5c3_Err, FileName: `ui/views/guestbooks.templ`, Line: 106, Col: 18}
+				return templ.Error{Err: templ_7745c5c3_Err, FileName: `ui/views/guestbooks.templ`, Line: 107, Col: 18}
 			}
 			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var22))
 			if templ_7745c5c3_Err != nil {
@@ -477,7 +478,7 @@ func GuestbookView(title string, data CommonData, website models.Website, guestb
 			var templ_7745c5c3_Var23 string
 			templ_7745c5c3_Var23, templ_7745c5c3_Err = templ.JoinStringErrs(website.Name)
 			if templ_7745c5c3_Err != nil {
-				return templ.Error{Err: templ_7745c5c3_Err, FileName: `ui/views/guestbooks.templ`, Line: 112, Col: 38}
+				return templ.Error{Err: templ_7745c5c3_Err, FileName: `ui/views/guestbooks.templ`, Line: 113, Col: 38}
 			}
 			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var23))
 			if templ_7745c5c3_Err != nil {
@@ -499,7 +500,7 @@ func GuestbookView(title string, data CommonData, website models.Website, guestb
 			var templ_7745c5c3_Var25 string
 			templ_7745c5c3_Var25, templ_7745c5c3_Err = templ.JoinStringErrs(data.CSRFToken)
 			if templ_7745c5c3_Err != nil {
-				return templ.Error{Err: templ_7745c5c3_Err, FileName: `ui/views/guestbooks.templ`, Line: 114, Col: 68}
+				return templ.Error{Err: templ_7745c5c3_Err, FileName: `ui/views/guestbooks.templ`, Line: 115, Col: 68}
 			}
 			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var25))
 			if templ_7745c5c3_Err != nil {
@@ -531,7 +532,7 @@ func GuestbookView(title string, data CommonData, website models.Website, guestb
 				var templ_7745c5c3_Var26 string
 				templ_7745c5c3_Var26, templ_7745c5c3_Err = templ.JoinStringErrs(c.AuthorName)
 				if templ_7745c5c3_Err != nil {
-					return templ.Error{Err: templ_7745c5c3_Err, FileName: `ui/views/guestbooks.templ`, Line: 124, Col: 26}
+					return templ.Error{Err: templ_7745c5c3_Err, FileName: `ui/views/guestbooks.templ`, Line: 125, Col: 26}
 				}
 				_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var26))
 				if templ_7745c5c3_Err != nil {
@@ -544,7 +545,7 @@ func GuestbookView(title string, data CommonData, website models.Website, guestb
 				var templ_7745c5c3_Var27 string
 				templ_7745c5c3_Var27, templ_7745c5c3_Err = templ.JoinStringErrs(c.Created.Format("01-02-2006 03:04PM"))
 				if templ_7745c5c3_Err != nil {
-					return templ.Error{Err: templ_7745c5c3_Err, FileName: `ui/views/guestbooks.templ`, Line: 125, Col: 48}
+					return templ.Error{Err: templ_7745c5c3_Err, FileName: `ui/views/guestbooks.templ`, Line: 126, Col: 48}
 				}
 				_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var27))
 				if templ_7745c5c3_Err != nil {
@@ -557,7 +558,7 @@ func GuestbookView(title string, data CommonData, website models.Website, guestb
 				var templ_7745c5c3_Var28 string
 				templ_7745c5c3_Var28, templ_7745c5c3_Err = templ.JoinStringErrs(c.CommentText)
 				if templ_7745c5c3_Err != nil {
-					return templ.Error{Err: templ_7745c5c3_Err, FileName: `ui/views/guestbooks.templ`, Line: 127, Col: 24}
+					return templ.Error{Err: templ_7745c5c3_Err, FileName: `ui/views/guestbooks.templ`, Line: 128, Col: 24}
 				}
 				_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var28))
 				if templ_7745c5c3_Err != nil {
@@ -607,7 +608,7 @@ func CreateGuestbookComment(title string, data CommonData, website models.Websit
 			var templ_7745c5c3_Var30 string
 			templ_7745c5c3_Var30, templ_7745c5c3_Err = templ.JoinStringErrs(postUrl)
 			if templ_7745c5c3_Err != nil {
-				return templ.Error{Err: templ_7745c5c3_Err, FileName: `ui/views/guestbooks.templ`, Line: 141, Col: 25}
+				return templ.Error{Err: templ_7745c5c3_Err, FileName: `ui/views/guestbooks.templ`, Line: 142, Col: 25}
 			}
 			_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var30))
 			if templ_7745c5c3_Err != nil {
@@ -670,7 +671,7 @@ func CreateGuestbookComment(title string, data CommonData, website models.Websit
 	})
 }
 
-func GuestbookSettingsView(data CommonData, website models.Website) templ.Component {
+func settingRadio(selected bool, name, id, value string) templ.Component {
 	return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
 		templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
 		if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
@@ -691,8 +692,87 @@ func GuestbookSettingsView(data CommonData, website models.Website) templ.Compon
 			templ_7745c5c3_Var33 = templ.NopComponent
 		}
 		ctx = templ.ClearChildren(ctx)
+		templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 57, "
")
+		if templ_7745c5c3_Err != nil {
+			return templ_7745c5c3_Err
+		}
+		return nil
+	})
+}
+
+func GuestbookSettingsView(data CommonData, website models.Website) templ.Component {
+	return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
+		templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
+		if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
+			return templ_7745c5c3_CtxErr
+		}
+		templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
+		if !templ_7745c5c3_IsBuffer {
+			defer func() {
+				templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
+				if templ_7745c5c3_Err == nil {
+					templ_7745c5c3_Err = templ_7745c5c3_BufErr
+				}
+			}()
+		}
+		ctx = templ.InitializeContext(ctx)
+		templ_7745c5c3_Var37 := templ.GetChildren(ctx)
+		if templ_7745c5c3_Var37 == nil {
+			templ_7745c5c3_Var37 = templ.NopComponent
+		}
+		ctx = templ.ClearChildren(ctx)
 		putUrl := fmt.Sprintf("/websites/%s/dashboard/guestbook/settings", shortIdToSlug(website.ShortId))
-		templ_7745c5c3_Var34 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
+		gb := website.Guestbook
+		templ_7745c5c3_Var38 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
 			templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
 			templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
 			if !templ_7745c5c3_IsBuffer {
@@ -704,7 +784,7 @@ func GuestbookSettingsView(data CommonData, website models.Website) templ.Compon
 				}()
 			}
 			ctx = templ.InitializeContext(ctx)
-			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 57, "
")
+			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 63, "
")
 			if templ_7745c5c3_Err != nil {
 				return templ_7745c5c3_Err
 			}
@@ -712,39 +792,149 @@ func GuestbookSettingsView(data CommonData, website models.Website) templ.Compon
 			if templ_7745c5c3_Err != nil {
 				return templ_7745c5c3_Err
 			}
-			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 58, "
")
+			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 66, "\">
Guestbook Visibility  Public  Private
Guestbook Commenting  ")
+			if templ_7745c5c3_Err != nil {
+				return templ_7745c5c3_Err
+			}
+			if !website.Guestbook.CanComment() {
+				localtime := gb.Settings.ReenableCommenting.In(data.CurrentUser.Settings.LocalTimezone)
+				templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 75, "Commenting re-enabled on ")
+				if templ_7745c5c3_Err != nil {
+					return templ_7745c5c3_Err
+				}
+			}
+			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 79, "
Enable Widgets  Yes  No
 ")
 			if templ_7745c5c3_Err != nil {
 				return templ_7745c5c3_Err
 			}
 			return nil
 		})
-		templ_7745c5c3_Err = base("Guestbook Settings", data).Render(templ.WithChildren(ctx, templ_7745c5c3_Var34), templ_7745c5c3_Buffer)
+		templ_7745c5c3_Err = base("Guestbook Settings", data).Render(templ.WithChildren(ctx, templ_7745c5c3_Var38), templ_7745c5c3_Buffer)
 		if templ_7745c5c3_Err != nil {
 			return templ_7745c5c3_Err
 		}
@@ -768,12 +958,12 @@ func AllGuestbooksView(data CommonData, websites []models.Website) templ.Compone
 			}()
 		}
 		ctx = templ.InitializeContext(ctx)
-		templ_7745c5c3_Var37 := templ.GetChildren(ctx)
-		if templ_7745c5c3_Var37 == nil {
-			templ_7745c5c3_Var37 = templ.NopComponent
+		templ_7745c5c3_Var44 := templ.GetChildren(ctx)
+		if templ_7745c5c3_Var44 == nil {
+			templ_7745c5c3_Var44 = templ.NopComponent
 		}
 		ctx = templ.ClearChildren(ctx)
-		templ_7745c5c3_Var38 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
+		templ_7745c5c3_Var45 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
 			templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
 			templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
 			if !templ_7745c5c3_IsBuffer {
@@ -785,50 +975,50 @@ func AllGuestbooksView(data CommonData, websites []models.Website) templ.Compone
 				}()
 			}
 			ctx = templ.InitializeContext(ctx)
-			templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 61, "All Guestbooks
This page exists only for testing the service.
 ")
 			if templ_7745c5c3_Err != nil {
 				return templ_7745c5c3_Err
 			}
 			return nil
 		})
-		templ_7745c5c3_Err = base("All Guestbooks", data).Render(templ.WithChildren(ctx, templ_7745c5c3_Var38), templ_7745c5c3_Buffer)
+		templ_7745c5c3_Err = base("All Guestbooks", data).Render(templ.WithChildren(ctx, templ_7745c5c3_Var45), templ_7745c5c3_Buffer)
 		if templ_7745c5c3_Err != nil {
 			return templ_7745c5c3_Err
 		}