diff --git a/CLAUDE.md b/CLAUDE.md
index b5e929f..ba3e31c 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -65,6 +65,11 @@ When building features, apply this order:
3. Simplicity of implementation, adhere to KISS
4. Performance
+## Date Formatting
+
+- General UI dates (file listings, metadata): ISO `YYYY-MM-DD`
+- Diary long-form dates: German locale, e.g. `Mittwoch, 1. April 2026` — use `formatGermanDate` in `diary.go`; Go's `time.Format` is English-only so locale names are kept in maps keyed by `time.Weekday` / `time.Month`
+
## What to Avoid
- Any parallel folder structure (e.g. a separate `media/` tree mirroring `pages/`)
diff --git a/assets/diary/diary-month.html b/assets/diary/diary-month.html
index 69fff0f..526d325 100644
--- a/assets/diary/diary-month.html
+++ b/assets/diary/diary-month.html
@@ -1,7 +1,8 @@
{{range .Days}}
-
+
{{if .URL}}{{.Heading}}{{else}}{{.Heading}}{{end}}
+ {{if .EditURL}}edit{{end}}
{{if .Content}}
{{.Content}}
{{end}}
{{if .Photos}}
diff --git a/assets/style.css b/assets/style.css
index 311c045..f673aa4 100644
--- a/assets/style.css
+++ b/assets/style.css
@@ -351,7 +351,7 @@ textarea:focus {
margin-top: 0;
}
-.diary-heading {
+.diary-section h2 {
font-size: 1.2rem;
color: white;
margin-bottom: 0.75rem;
diff --git a/diary.go b/diary.go
index 9958c66..9b22306 100644
--- a/diary.go
+++ b/diary.go
@@ -77,6 +77,7 @@ type diaryMonthSummary struct {
type diaryDaySection struct {
Heading string
URL string
+ EditURL string
Content template.HTML
Photos []diaryPhoto
}
@@ -89,6 +90,40 @@ var diaryYearTmpl = template.Must(template.ParseFS(assets, "assets/diary/diary-y
var diaryMonthTmpl = template.Must(template.ParseFS(assets, "assets/diary/diary-month.html"))
var diaryDayTmpl = template.Must(template.ParseFS(assets, "assets/diary/diary-day.html"))
+var germanWeekdays = map[time.Weekday]string{
+ time.Sunday: "Sonntag",
+ time.Monday: "Montag",
+ time.Tuesday: "Dienstag",
+ time.Wednesday: "Mittwoch",
+ time.Thursday: "Donnerstag",
+ time.Friday: "Freitag",
+ time.Saturday: "Samstag",
+}
+
+var germanMonths = map[time.Month]string{
+ time.January: "Januar",
+ time.February: "Februar",
+ time.March: "März",
+ time.April: "April",
+ time.May: "Mai",
+ time.June: "Juni",
+ time.July: "Juli",
+ time.August: "August",
+ time.September: "September",
+ time.October: "Oktober",
+ time.November: "November",
+ time.December: "Dezember",
+}
+
+func formatGermanDate(t time.Time) string {
+ return fmt.Sprintf("%s, %d. %s %d",
+ germanWeekdays[t.Weekday()],
+ t.Day(),
+ germanMonths[t.Month()],
+ t.Year(),
+ )
+}
+
var photoExts = map[string]bool{
".jpg": true, ".jpeg": true, ".png": true, ".gif": true, ".webp": true,
}
@@ -222,7 +257,7 @@ func renderDiaryMonth(fsPath, urlPath string) template.HTML {
for _, dayNum := range days {
date := time.Date(year, time.Month(monthNum), dayNum, 0, 0, 0, 0, time.UTC)
- heading := date.Format("Monday, January 2")
+ heading := formatGermanDate(date)
dayURL := path.Join(urlPath, fmt.Sprintf("%02d", dayNum)) + "/"
var content template.HTML
if dirName, ok := dayDirs[dayNum]; ok {
@@ -247,6 +282,7 @@ func renderDiaryMonth(fsPath, urlPath string) template.HTML {
sections = append(sections, diaryDaySection{
Heading: heading,
URL: dayURL,
+ EditURL: dayURL + "?edit",
Content: content,
Photos: photos,
})