diff --git a/public/wheeljam2023/TwitterCard.png b/public/wheeljam2023/TwitterCard.png new file mode 100644 index 00000000..51392abf Binary files /dev/null and b/public/wheeljam2023/TwitterCard.png differ diff --git a/public/wheeljam2023/databaseexplorer.png b/public/wheeljam2023/databaseexplorer.png new file mode 100644 index 00000000..2ac8f90d Binary files /dev/null and b/public/wheeljam2023/databaseexplorer.png differ diff --git a/public/wheeljam2023/favicon-16x16.png b/public/wheeljam2023/favicon-16x16.png new file mode 100644 index 00000000..41346afa Binary files /dev/null and b/public/wheeljam2023/favicon-16x16.png differ diff --git a/public/wheeljam2023/favicon-32x32.png b/public/wheeljam2023/favicon-32x32.png new file mode 100644 index 00000000..d3d57bf5 Binary files /dev/null and b/public/wheeljam2023/favicon-32x32.png differ diff --git a/public/wheeljam2023/logo.svg b/public/wheeljam2023/logo.svg new file mode 100644 index 00000000..73b96c14 --- /dev/null +++ b/public/wheeljam2023/logo.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/wheeljam2023/nearmanager.gif b/public/wheeljam2023/nearmanager.gif new file mode 100644 index 00000000..3eaa4587 Binary files /dev/null and b/public/wheeljam2023/nearmanager.gif differ diff --git a/public/wheeljam2023/opengraph.png b/public/wheeljam2023/opengraph.png new file mode 100644 index 00000000..bd158e94 Binary files /dev/null and b/public/wheeljam2023/opengraph.png differ diff --git a/public/wheeljam2023/scroll.png b/public/wheeljam2023/scroll.png new file mode 100644 index 00000000..f7efa911 Binary files /dev/null and b/public/wheeljam2023/scroll.png differ diff --git a/public/wheeljam2023/visaviz.png b/public/wheeljam2023/visaviz.png new file mode 100644 index 00000000..c5866d9c Binary files /dev/null and b/public/wheeljam2023/visaviz.png differ diff --git a/src/hmndata/jams.go b/src/hmndata/jams.go index c90a2102..181e3774 100644 --- a/src/hmndata/jams.go +++ b/src/hmndata/jams.go @@ -48,6 +48,15 @@ var VJ2023 = Jam{ Slug: "VJ2023", } +var WRJ2023 = Jam{ + Event: Event{ + StartTime: time.Date(2023, 9, 25, 10, 0, 0, 0, utils.Must1(time.LoadLocation("Europe/London"))), + EndTime: time.Date(2023, 10, 1, 20, 0, 0, 0, utils.Must1(time.LoadLocation("Europe/London"))), + }, + Name: "Wheel Reinvention Jam 2023", + Slug: "WRJ2023", +} + var HMS2022 = Event{ StartTime: time.Date(2022, 11, 16, 0, 0, 0, 0, utils.Must1(time.LoadLocation("America/Los_Angeles"))), EndTime: time.Date(2022, 11, 18, 0, 0, 0, 0, utils.Must1(time.LoadLocation("America/Los_Angeles"))), @@ -63,7 +72,7 @@ var HMBoston2023 = Event{ EndTime: time.Date(2023, 8, 4, 0, 0, 0, 0, utils.Must1(time.LoadLocation("America/Los_Angeles"))), } -var AllJams = []Jam{WRJ2021, WRJ2022, VJ2023} +var AllJams = []Jam{WRJ2021, WRJ2022, VJ2023, WRJ2023} func CurrentJam() *Jam { now := time.Now() diff --git a/src/hmnurl/urls.go b/src/hmnurl/urls.go index 04801585..af542536 100644 --- a/src/hmnurl/urls.go +++ b/src/hmnurl/urls.go @@ -84,6 +84,27 @@ func BuildJamIndex2022() string { return Url("/jam/2022", nil) } +var RegexJamFeed2022 = regexp.MustCompile("^/jam/2022/feed$") + +func BuildJamFeed2022() string { + defer CatchPanic() + return Url("/jam/2022/feed", nil) +} + +var RegexJamIndex2023 = regexp.MustCompile("^/jam/2023$") + +func BuildJamIndex2023() string { + defer CatchPanic() + return Url("/jam/2023", nil) +} + +var RegexJamFeed2023 = regexp.MustCompile("^/jam/2023/feed$") + +func BuildJamFeed2023() string { + defer CatchPanic() + return Url("/jam/2023/feed", nil) +} + var RegexJamIndex2023_Visibility = regexp.MustCompile("^/jam/visibility-2023$") func BuildJamIndex2023_Visibility() string { @@ -105,13 +126,6 @@ func BuildJamRecap2023_Visibility() string { return Url("/jam/visibility-2023/recap", nil) } -var RegexJamFeed2022 = regexp.MustCompile("^/jam/2022/feed$") - -func BuildJamFeed2022() string { - defer CatchPanic() - return Url("/jam/2022/feed", nil) -} - var RegexTimeMachine = regexp.MustCompile("^/timemachine$") func BuildTimeMachine() string { diff --git a/src/templates/src/jam_2023_wrj_feed.html b/src/templates/src/jam_2023_wrj_feed.html new file mode 100644 index 00000000..ab64f2d8 --- /dev/null +++ b/src/templates/src/jam_2023_wrj_feed.html @@ -0,0 +1,47 @@ +{{ template "wheeljam_2023_base.html" . }} + +{{ define "content" }} + + +
+

Wheel Reinvention Jam

+

September 25 - October 1, 2023

+
+ A one-week jam to change the status quo. +
+
+ +
+
+
+ {{ 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/templates/src/jam_2023_wrj_index.html b/src/templates/src/jam_2023_wrj_index.html new file mode 100644 index 00000000..e0afc88f --- /dev/null +++ b/src/templates/src/jam_2023_wrj_index.html @@ -0,0 +1,415 @@ +{{ template "wheeljam_2023_base.html" . }} + +{{ define "content" }} + {{ $discordInviteURL := "https://discord.gg/hmn" }} + + + +
+ +

Wheel Reinvention Jam

+

September 25 - October 1, 2023

+
+ A one-week jam to change the status quo. + {{ if gt .DaysUntilEnd 0 }} + {{ if eq .DaysUntilStart 0 }} + Happening now. + {{ else if eq .DaysUntilStart 1 }} + Starting tomorrow. + {{ else }} + In {{ .DaysUntilStart }} days. + {{ end }} + {{ end }} +
+
+ {{ if gt .DaysUntilStart 0 }} + Find a project + {{ else if gt .DaysUntilEnd 0 }} + {{ if .SubmittedProjectUrl }} + Share your progress + {{ else }} + Create your project + {{ end }} + {{ else }} + See the results + {{ end }} + Join the Discord +
+
+ +
+

+ The Wheel Reinvention Jam is a one-week-long jam where we turn a fresh eye to "solved problems". +

+

+ The tools we use every day are broken. Software is slow, unreliable, and bloated with thoughtless features. It disrespects the user and forces settings that no one wants. And yet, people defend the status quo, claiming that what we have is fine, and that trying to change software is "reinventing the wheel". +

+

+ Screw that. Progress is only made by inventing new things. It's not "reinventing" to break new ground. Nor is it "reinventing" to take a broken thing and design something better. +

+

+ This is your chance to reinvent something. +

+
+ + {{ if eq .DaysUntilEnd 0 }} +
+
+

Submitted projects

+
+ {{ range .JamProjects }} + {{ template "project_card.html" projectcarddata . "" }} + {{ end }} +
+ +
+
+ {{ else if and (eq .DaysUntilStart 0) (not (eq .ShowcaseJson "[]")) }} +
+
+ {{ if gt .DaysUntilEnd 0 }} +

Recent updates

+

+ These screenshots and videos were shared by jam participants in #project-showcase on our Discord. Join us and share what you're working on! See all ➜ +

+ {{ else }} +

Community showcase

+

+ These screenshots and videos were shared by jam participants in #project-showcase on our Discord during the jam. Join us and chat about your favorites! +

+ {{ end }} +
+
+ See all +
+
+
+ + {{ template "showcase_templates.html" }} + + + {{ else }} +
+
+

Last year's entries

+

+ We had many incredible entries last year. Here are a few of our favorites: +

+ + +
+
+ {{ end }} + +
+
+

How to participate

+

+ The jam takes place from Monday, September 25 through Sunday, October 1. Here's how you can participate: +

+ +
+

Pick a project and form a team.

+

+ Find a project idea that excites you! Join the conversation over on our Wishlist, brainstorm ideas in #jam on Discord, or just invite some friends to jam with you. +

+
+ +
+

Jam.

+

+ {{ if and (eq .DaysUntilStart 0) (not .SubmittedProjectUrl) }} + Create a Handmade Network project + {{ else }} + After the jam starts, create a Handmade Network project + {{ end }} + to track your work. Then, build your program! Share your work in progress in #project-showcase on Discord, or directly from your project page. +

+
+ +
+

Submit your work!

+

+ Your Handmade Network project is your submission. Fill out the project description, making sure to explain the goals of the project and how it improves on what came before. Also consider posting an update with video of your program in action! +

+ {{ if and (eq .DaysUntilStart 0) (gt .DaysUntilEnd 0) }} +

+ Submissions close . +

+ {{ else if eq .DaysUntilEnd 0 }} +

+ Submissions are now closed. +

+ {{ end }} +
+
+
+ +
+
+

Rules

+ +

There are no explicit winners, but we will be selecting a few of our favorite projects to highlight in a recap stream following the jam.

+ +

Submission rules

+

+ {{ with .SubmittedProjectUrl }} + Your Handmade Network project + {{ else }} + Your Handmade Network project + {{ end }} + is your submission. We will be looking at the project's description and any extra updates you share toward the end of the jam. +

+ +
+
+ +
+
+
+

Make it by hand.

+

+ The Handmade ethos and Handmade community are software development superpowers. Don't be afraid to question your foundations and rebuild what needs rebuilding. The community is here to help you take on those challenges and do what others might consider impossible. +

+

+ Of course, this is a jam, so focus on what matters to your project. There are many excellent libraries in the community that can save you time and help you focus on your core ideas. Don't be afraid to use them. But don't be afraid to do your own thing if they're holding you back. +

+
+
+

Don't just rebuild. Reinvent.

+

+ This is a chance to build something truly new. Learn from previous work, but don't settle for “the same, but better”. It would be a huge shame to spend a week building nothing more than a clone of the same broken software we use today. +

+

+ This is where working with a team can really help. Bounce ideas off each other, do some research, and brainstorm before the jam starts. The software you end up building might be pretty different from your original ideas. +

+

+ In the end, this is a jam. Get weird and try something different. +

+
+
+
+ + + + +{{ end }} diff --git a/src/templates/src/jams_index.html b/src/templates/src/jams_index.html index e1559c05..4ec8f3be 100644 --- a/src/templates/src/jams_index.html +++ b/src/templates/src/jams_index.html @@ -16,6 +16,11 @@

Since 2020, we have been running programming jams to encourage community members to explore new ideas and start projects. You can view all the past submissions and results here.

+ +
+ +
+
diff --git a/src/templates/src/landing.html b/src/templates/src/landing.html index 47b012f4..4cb54598 100644 --- a/src/templates/src/landing.html +++ b/src/templates/src/landing.html @@ -111,7 +111,6 @@
*/}} -{{/*
- + -*/}}
+ + + + + +
+
+ {{ template "header.html" . }} +
+ + {{ block "content" . }}{{ end }} + +
+ {{ template "footer.html" . }} +
+
+ + + diff --git a/src/website/jam.go b/src/website/jam.go index c538526a..83fdc5d3 100644 --- a/src/website/jam.go +++ b/src/website/jam.go @@ -22,6 +22,7 @@ func JamsIndex(c *RequestContext) ResponseData { WRJ2021Url string WRJ2022Url string VJ2023Url string + WRJ2023Url string } res.MustWriteTemplate("jams_index.html", TemplateData{ @@ -31,6 +32,170 @@ func JamsIndex(c *RequestContext) ResponseData { WRJ2021Url: hmnurl.BuildJamIndex2021(), WRJ2022Url: hmnurl.BuildJamIndex2022(), VJ2023Url: hmnurl.BuildJamIndex2023_Visibility(), + WRJ2023Url: hmnurl.BuildJamIndex2023(), + }, c.Perf) + return res +} + +func JamIndex2023(c *RequestContext) ResponseData { + var res ResponseData + + daysUntilStart := daysUntil(hmndata.WRJ2023.StartTime) + daysUntilEnd := daysUntil(hmndata.WRJ2023.EndTime) + + baseData := getBaseDataAutocrumb(c, hmndata.WRJ2023.Name) + baseData.OpenGraphItems = []templates.OpenGraphItem{ + {Property: "og:site_name", Value: "Handmade Network"}, + {Property: "og:type", Value: "website"}, + {Property: "og:image", Value: hmnurl.BuildPublic("wheeljam2023/opengraph.png", true)}, + {Property: "og:description", Value: "A one-week jam to change the status quo. September 25 - October 1 on Handmade Network."}, + {Property: "og:url", Value: hmnurl.BuildJamIndex2023()}, + } + + type JamPageData struct { + templates.BaseData + DaysUntilStart, DaysUntilEnd int + StartTimeUnix, EndTimeUnix int64 + + SubmittedProjectUrl string + ProjectSubmissionUrl string + ShowcaseFeedUrl string + ShowcaseJson string + + JamProjects []templates.Project + } + + var showcaseItems []templates.TimelineItem + submittedProjectUrl := "" + + if c.CurrentUser != nil { + projects, err := hmndata.FetchProjects(c, c.Conn, c.CurrentUser, hmndata.ProjectsQuery{ + OwnerIDs: []int{c.CurrentUser.ID}, + JamSlugs: []string{hmndata.WRJ2023.Slug}, + Limit: 1, + }) + if err != nil { + return c.ErrorResponse(http.StatusInternalServerError, oops.New(err, "failed to fetch jam projects for current user")) + } + if len(projects) > 0 { + urlContext := hmndata.UrlContextForProject(&projects[0].Project) + submittedProjectUrl = urlContext.BuildHomepage() + } + } + + jamProjects, err := hmndata.FetchProjects(c, c.Conn, c.CurrentUser, hmndata.ProjectsQuery{ + JamSlugs: []string{hmndata.WRJ2023.Slug}, + }) + if err != nil { + return c.ErrorResponse(http.StatusInternalServerError, oops.New(err, "failed to fetch jam projects for current user")) + } + + pageProjects := make([]templates.Project, 0, len(jamProjects)) + for _, p := range jamProjects { + pageProjects = append(pageProjects, templates.ProjectAndStuffToTemplate(&p, hmndata.UrlContextForProject(&p.Project).BuildHomepage(), c.Theme)) + } + + projectIds := make([]int, 0, len(jamProjects)) + for _, jp := range jamProjects { + projectIds = append(projectIds, jp.Project.ID) + } + + if len(projectIds) > 0 { + snippets, err := hmndata.FetchSnippets(c, c.Conn, c.CurrentUser, hmndata.SnippetQuery{ + ProjectIDs: projectIds, + Limit: 12, + }) + if err != nil { + return c.ErrorResponse(http.StatusInternalServerError, oops.New(err, "failed to fetch snippets for jam showcase")) + } + showcaseItems = 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) + if timelineItem.CanShowcase { + showcaseItems = append(showcaseItems, timelineItem) + } + } + } + + showcaseJson := templates.TimelineItemsToJSON(showcaseItems) + + res.MustWriteTemplate("jam_2023_wrj_index.html", JamPageData{ + BaseData: baseData, + DaysUntilStart: daysUntilStart, + DaysUntilEnd: daysUntilEnd, + StartTimeUnix: hmndata.WRJ2023.StartTime.Unix(), + EndTimeUnix: hmndata.WRJ2023.EndTime.Unix(), + ProjectSubmissionUrl: hmnurl.BuildProjectNewJam(), + SubmittedProjectUrl: submittedProjectUrl, + ShowcaseFeedUrl: hmnurl.BuildJamFeed2023(), + ShowcaseJson: showcaseJson, + JamProjects: pageProjects, + }, c.Perf) + return res +} + +func JamFeed2023(c *RequestContext) ResponseData { + jamProjects, err := hmndata.FetchProjects(c, c.Conn, c.CurrentUser, hmndata.ProjectsQuery{ + JamSlugs: []string{hmndata.WRJ2023.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.WRJ2023.StartTime) + daysUntilEnd := daysUntil(hmndata.WRJ2023.EndTime) + + baseData := getBaseDataAutocrumb(c, hmndata.WRJ2023.Name) + baseData.OpenGraphItems = []templates.OpenGraphItem{ + {Property: "og:site_name", Value: "Handmade Network"}, + {Property: "og:type", Value: "website"}, + {Property: "og:image", Value: hmnurl.BuildPublic("wheeljam2023/opengraph.png", true)}, + {Property: "og:description", Value: "A one-week jam to change the status quo. September 25 - October 1 on Handmade Network."}, + {Property: "og:url", Value: hmnurl.BuildJamFeed2023()}, + } + + var res ResponseData + res.MustWriteTemplate("jam_2023_wrj_feed.html", JamFeedData{ + BaseData: baseData, + DaysUntilStart: daysUntilStart, + DaysUntilEnd: daysUntilEnd, + JamProjects: pageProjects, + TimelineItems: timelineItems, }, c.Perf) return res } @@ -48,7 +213,7 @@ func JamIndex2023_Visibility(c *RequestContext) ResponseData { {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()}, + {Property: "og:url", Value: hmnurl.BuildJamIndex2023_Visibility()}, {Name: "twitter:card", Value: "summary_large_image"}, {Name: "twitter:image", Value: hmnurl.BuildPublic("visjam2023/TwitterCard.png", true)}, } @@ -192,7 +357,7 @@ func JamFeed2023_Visibility(c *RequestContext) ResponseData { {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()}, + {Property: "og:url", Value: hmnurl.BuildJamFeed2023_Visibility()}, {Name: "twitter:card", Value: "summary_large_image"}, {Name: "twitter:image", Value: hmnurl.BuildPublic("visjam2023/TwitterCard.png", true)}, } @@ -237,7 +402,7 @@ func JamRecap2023_Visibility(c *RequestContext) ResponseData { {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()}, + {Property: "og:url", Value: hmnurl.BuildJamRecap2023_Visibility()}, {Name: "twitter:card", Value: "summary_large_image"}, {Name: "twitter:image", Value: hmnurl.BuildPublic("visjam2023/TwitterCard.png", true)}, } @@ -265,7 +430,7 @@ func JamIndex2022(c *RequestContext) ResponseData { {Property: "og:type", Value: "website"}, {Property: "og:image", Value: hmnurl.BuildPublic("wheeljam2022/opengraph.png", true)}, {Property: "og:description", Value: "A one-week jam to change the status quo. August 15 - 21 on Handmade Network."}, - {Property: "og:url", Value: hmnurl.BuildJamIndex()}, + {Property: "og:url", Value: hmnurl.BuildJamIndex2022()}, } type JamPageData struct { @@ -402,7 +567,7 @@ func JamFeed2022(c *RequestContext) ResponseData { {Property: "og:type", Value: "website"}, {Property: "og:image", Value: hmnurl.BuildPublic("wheeljam2022/opengraph.png", true)}, {Property: "og:description", Value: "A one-week jam to change the status quo. August 15 - 21 on Handmade Network."}, - {Property: "og:url", Value: hmnurl.BuildJamIndex()}, + {Property: "og:url", Value: hmnurl.BuildJamFeed2022()}, } var res ResponseData @@ -459,7 +624,7 @@ func JamIndex2021(c *RequestContext) ResponseData { {Property: "og:type", Value: "website"}, {Property: "og:image", Value: hmnurl.BuildPublic("wheeljam2021/opengraph.png", true)}, {Property: "og:description", Value: "A one-week jam to bring a fresh perspective to old ideas. September 27 - October 3 on Handmade Network."}, - {Property: "og:url", Value: hmnurl.BuildJamIndex()}, + {Property: "og:url", Value: hmnurl.BuildJamIndex2021()}, } type JamPageData struct { diff --git a/src/website/landing.go b/src/website/landing.go index e05849a2..86e5854a 100644 --- a/src/website/landing.go +++ b/src/website/landing.go @@ -156,9 +156,9 @@ func Index(c *RequestContext) ResponseData { AtomFeedUrl: hmnurl.BuildAtomFeed(), MarkAllReadUrl: hmnurl.HMNProjectContext.BuildForumMarkRead(0), - JamUrl: hmnurl.BuildJamIndex2023_Visibility(), - JamDaysUntilStart: daysUntil(hmndata.VJ2023.StartTime), - JamDaysUntilEnd: daysUntil(hmndata.VJ2023.EndTime), + JamUrl: hmnurl.BuildJamIndex2023(), + JamDaysUntilStart: daysUntil(hmndata.WRJ2023.StartTime), + JamDaysUntilEnd: daysUntil(hmndata.WRJ2023.EndTime), HMSDaysUntilStart: daysUntil(hmndata.HMS2023.StartTime), HMSDaysUntilEnd: daysUntil(hmndata.HMS2023.EndTime), diff --git a/src/website/routes.go b/src/website/routes.go index 395e2e4e..ecc1f9c3 100644 --- a/src/website/routes.go +++ b/src/website/routes.go @@ -61,7 +61,7 @@ func NewWebsiteRoutes(conn *pgxpool.Pool) http.Handler { hmnOnly.GET(hmnurl.RegexJamsIndex, JamsIndex) hmnOnly.GET(hmnurl.RegexJamIndex, func(c *RequestContext) ResponseData { - return c.Redirect(hmnurl.BuildJamIndex2023_Visibility(), http.StatusFound) + return c.Redirect(hmnurl.BuildJamIndex2023(), http.StatusFound) }) hmnOnly.GET(hmnurl.RegexJamIndex2021, JamIndex2021) hmnOnly.GET(hmnurl.RegexJamIndex2022, JamIndex2022) @@ -69,6 +69,8 @@ func NewWebsiteRoutes(conn *pgxpool.Pool) http.Handler { hmnOnly.GET(hmnurl.RegexJamIndex2023_Visibility, JamIndex2023_Visibility) hmnOnly.GET(hmnurl.RegexJamFeed2023_Visibility, JamFeed2023_Visibility) hmnOnly.GET(hmnurl.RegexJamRecap2023_Visibility, JamRecap2023_Visibility) + hmnOnly.GET(hmnurl.RegexJamIndex2023, JamIndex2023) + hmnOnly.GET(hmnurl.RegexJamFeed2023, JamFeed2023) hmnOnly.GET(hmnurl.RegexTimeMachine, TimeMachine) hmnOnly.GET(hmnurl.RegexTimeMachineSubmissions, TimeMachineSubmissions)