diff --git a/src/hmnurl/urls.go b/src/hmnurl/urls.go
index 40224356..0cfd4135 100644
--- a/src/hmnurl/urls.go
+++ b/src/hmnurl/urls.go
@@ -77,6 +77,13 @@ func BuildJamIndex2023_Visibility() string {
return Url("/jam/visibility-2023", nil)
}
+var RegexJamFeed2023_Visibility = regexp.MustCompile("^/jam/visibility-2023/feed$")
+
+func BuildJamFeed2023_Visibility() string {
+ defer CatchPanic()
+ return Url("/jam/visibility-2023/feed", nil)
+}
+
var RegexJamFeed2022 = regexp.MustCompile("^/jam/2022/feed$")
func BuildJamFeed2022() string {
diff --git a/src/templates/src/jam_2023_vj_feed.html b/src/templates/src/jam_2023_vj_feed.html
new file mode 100644
index 00000000..8838dfa9
--- /dev/null
+++ b/src/templates/src/jam_2023_vj_feed.html
@@ -0,0 +1,41 @@
+{{ template "jam_2023_visibility_base.html" . }} {{ define "content" }}
+
+
+
+
Visibility Jam
+
April 14 - 16, 2023
+
See things in a new way.
+
+
+
+
+
+ {{ if eq .DaysUntilEnd 0 }}
+
Project updates
+ {{ else }}
+
Recent updates
+ {{ end }}
+
+ {{ range .TimelineItems }} {{ template "timeline_item.html" . }} {{ end
+ }}
+
+
+
+
Projects
+
+ {{ range .JamProjects }} {{ template "project_card.html" projectcarddata
+ . "" }} {{ end }}
+
+
+
+
+{{ end }}
diff --git a/src/website/jam.go b/src/website/jam.go
index 97eee9e0..37a29355 100644
--- a/src/website/jam.go
+++ b/src/website/jam.go
@@ -111,6 +111,76 @@ func JamIndex2023_Visibility(c *RequestContext) ResponseData {
return res
}
+func JamFeed2023_Visibility(c *RequestContext) ResponseData {
+ jamProjects, err := hmndata.FetchProjects(c, c.Conn, c.CurrentUser, hmndata.ProjectsQuery{
+ JamSlugs: []string{hmndata.VJ2023.Slug},
+ })
+ if err != nil {
+ return c.ErrorResponse(http.StatusInternalServerError, oops.New(err, "failed to fetch jam projects for current user"))
+ }
+
+ projectIds := make([]int, 0, len(jamProjects))
+ for _, jp := range jamProjects {
+ projectIds = append(projectIds, jp.Project.ID)
+ }
+
+ var timelineItems []templates.TimelineItem
+ if len(projectIds) > 0 {
+ snippets, err := hmndata.FetchSnippets(c, c.Conn, c.CurrentUser, hmndata.SnippetQuery{
+ ProjectIDs: projectIds,
+ })
+ if err != nil {
+ return c.ErrorResponse(http.StatusInternalServerError, oops.New(err, "failed to fetch snippets for jam showcase"))
+ }
+
+ timelineItems = make([]templates.TimelineItem, 0, len(snippets))
+ for _, s := range snippets {
+ timelineItem := SnippetToTimelineItem(&s.Snippet, s.Asset, s.DiscordMessage, s.Projects, s.Owner, c.Theme, false)
+ timelineItem.SmallInfo = true
+ timelineItems = append(timelineItems, timelineItem)
+ }
+ }
+
+ pageProjects := make([]templates.Project, 0, len(jamProjects))
+ for _, p := range jamProjects {
+ pageProjects = append(pageProjects, templates.ProjectAndStuffToTemplate(&p, hmndata.UrlContextForProject(&p.Project).BuildHomepage(), c.Theme))
+ }
+
+ type JamFeedData struct {
+ templates.BaseData
+ DaysUntilStart, DaysUntilEnd int
+
+ JamProjects []templates.Project
+ TimelineItems []templates.TimelineItem
+ }
+
+ daysUntilStart := daysUntil(hmndata.VJ2023.StartTime)
+ daysUntilEnd := daysUntil(hmndata.VJ2023.EndTime)
+
+ baseData := getBaseDataAutocrumb(c, hmndata.VJ2023.Name)
+
+ baseData.OpenGraphItems = []templates.OpenGraphItem{
+ {Property: "og:title", Value: "Visibility Jam"},
+ {Property: "og:site_name", Value: "Handmade Network"},
+ {Property: "og:type", Value: "website"},
+ {Property: "og:image", Value: hmnurl.BuildPublic("visjam2023/opengraph.png", true)},
+ {Property: "og:description", Value: "See things in a new way. April 14 - 16."},
+ {Property: "og:url", Value: hmnurl.BuildJamIndex()},
+ {Name: "twitter:card", Value: "summary_large_image"},
+ {Name: "twitter:image", Value: hmnurl.BuildPublic("visjam2023/TwitterCard.png", true)},
+ }
+
+ var res ResponseData
+ res.MustWriteTemplate("jam_2023_vj_feed.html", JamFeedData{
+ BaseData: baseData,
+ DaysUntilStart: daysUntilStart,
+ DaysUntilEnd: daysUntilEnd,
+ JamProjects: pageProjects,
+ TimelineItems: timelineItems,
+ }, c.Perf)
+ return res
+}
+
func JamIndex2022(c *RequestContext) ResponseData {
var res ResponseData
diff --git a/src/website/routes.go b/src/website/routes.go
index 5502cf83..293c0c7c 100644
--- a/src/website/routes.go
+++ b/src/website/routes.go
@@ -60,6 +60,7 @@ func NewWebsiteRoutes(conn *pgxpool.Pool) http.Handler {
hmnOnly.GET(hmnurl.RegexJamIndex2022, JamIndex2022)
hmnOnly.GET(hmnurl.RegexJamFeed2022, JamFeed2022)
hmnOnly.GET(hmnurl.RegexJamIndex2023_Visibility, JamIndex2023_Visibility)
+ hmnOnly.GET(hmnurl.RegexJamFeed2023_Visibility, JamFeed2023_Visibility)
hmnOnly.GET(hmnurl.RegexStaffRolesIndex, StaffRolesIndex)
hmnOnly.GET(hmnurl.RegexStaffRole, StaffRole)